From a21bd6a6710d123ef3bfc3c9aab37fc0c276f9c5 Mon Sep 17 00:00:00 2001 From: ertopogo Date: Thu, 19 Feb 2026 11:34:16 +0100 Subject: feat: initial project setup - Next.js 16, Payload CMS v3, palette Mapuche Next.js 16 App Router + TypeScript + Tailwind CSS v4. Payload CMS v3 with PostgreSQL adapter. Mapuche Corporate palette. Public pages, Docker Compose + Caddy, security middleware. Co-authored-by: Cursor --- src/app/(public)/about/page.tsx | 153 ++++++++++++++++++++++++++++++++ src/app/(public)/articles/page.tsx | 38 ++++++++ src/app/(public)/demos/page.tsx | 94 ++++++++++++++++++++ src/app/(public)/layout.tsx | 16 ++++ src/app/(public)/page.tsx | 174 +++++++++++++++++++++++++++++++++++++ src/app/(public)/services/page.tsx | 148 +++++++++++++++++++++++++++++++ 6 files changed, 623 insertions(+) create mode 100644 src/app/(public)/about/page.tsx create mode 100644 src/app/(public)/articles/page.tsx create mode 100644 src/app/(public)/demos/page.tsx create mode 100644 src/app/(public)/layout.tsx create mode 100644 src/app/(public)/page.tsx create mode 100644 src/app/(public)/services/page.tsx (limited to 'src/app/(public)') diff --git a/src/app/(public)/about/page.tsx b/src/app/(public)/about/page.tsx new file mode 100644 index 0000000..7e76cbe --- /dev/null +++ b/src/app/(public)/about/page.tsx @@ -0,0 +1,153 @@ +import { Code, Server, Shield, Award } from "lucide-react"; + +const timeline = [ + { + icon: Code, + period: "Début de carrière", + title: "Développeur", + description: + "Développement logiciel, compréhension profonde du code et des architectures applicatives. Base solide pour comprendre les enjeux de sécurité au niveau applicatif.", + }, + { + icon: Server, + period: "Évolution", + title: "Administrateur Systèmes", + description: + "Administration Linux et Windows Server. Gestion d'infrastructures, scripting, automatisation. Vision complète de la chaîne technique.", + }, + { + icon: Shield, + period: "Spécialisation", + title: "Expert IAM & Sécurité", + description: + "Spécialisation en Identity & Access Management. Administration AD et Entra ID, implémentation OIDC/OAuth, stratégies Zero Trust.", + }, +]; + +const skills = { + "Identity & Access Management": [ + "OIDC / OAuth 2.0 / SAML", + "Keycloak", + "Active Directory", + "Microsoft Entra ID (Azure AD)", + "PIM / PAM", + "RBAC / ABAC", + "Conditional Access", + "SSO / Federation", + ], + "Sécurité": [ + "Zero Trust Architecture", + "Durcissement AD (Tiering Model)", + "Sécurité des endpoints", + "PKI & Certificats", + "Audit de sécurité", + "Conformité & Gouvernance", + ], + "Systèmes & Infra": [ + "Windows Server / AD DS", + "Linux (Debian, RHEL, Ubuntu)", + "Docker & Conteneurisation", + "PowerShell / Bash", + "Automatisation & CI/CD", + "Monitoring & Logging", + ], +}; + +export default function AboutPage() { + return ( + <> +
+
+
+

+ À propos +

+

+ Un parcours du développement à la sécurité, pour une vision + complète et pragmatique de l'IAM. +

+
+
+
+ + {/* Timeline */} +
+
+

+ Parcours professionnel +

+
+
+
+ {timeline.map((item, index) => { + const Icon = item.icon; + const isLeft = index % 2 === 0; + return ( +
+
+

+ {item.period} +

+

+ {item.title} +

+

+ {item.description} +

+
+
+ +
+
+
+ ); + })} +
+
+
+
+ + {/* Compétences */} +
+
+

+ Compétences techniques +

+
+ {Object.entries(skills).map(([category, items]) => ( +
+
+ +

+ {category} +

+
+
    + {items.map((skill) => ( +
  • + + {skill} +
  • + ))} +
+
+ ))} +
+
+
+ + ); +} diff --git a/src/app/(public)/articles/page.tsx b/src/app/(public)/articles/page.tsx new file mode 100644 index 0000000..5dd7a01 --- /dev/null +++ b/src/app/(public)/articles/page.tsx @@ -0,0 +1,38 @@ +import { FileText } from "lucide-react"; + +export default function ArticlesPage() { + return ( + <> +
+
+
+

+ Articles & Guides +

+

+ Concepts de sécurité, guides d'implémentation OIDC/OAuth, + best practices Zero Trust. +

+
+
+
+ +
+
+
+
+ +
+

+ Articles à venir +

+

+ Les premiers articles techniques sur OIDC, OAuth2 et le Zero Trust + sont en cours de rédaction. Revenez bientôt ! +

+
+
+
+ + ); +} diff --git a/src/app/(public)/demos/page.tsx b/src/app/(public)/demos/page.tsx new file mode 100644 index 0000000..7afee2a --- /dev/null +++ b/src/app/(public)/demos/page.tsx @@ -0,0 +1,94 @@ +import Link from "next/link"; +import { Workflow, Terminal, KeyRound, ShieldCheck } from "lucide-react"; + +const demos = [ + { + icon: Workflow, + title: "Visualiseur OIDC", + description: + "Animation pas-à-pas des flux OIDC : Authorization Code, PKCE, Client Credentials. Comprenez chaque échange entre le client, l'IdP et le resource server.", + href: "/demos/oidc-flow", + status: "Bientôt disponible", + }, + { + icon: Terminal, + title: "Playground OAuth2", + description: + "Testez interactivement les requêtes OAuth2. Explorez les scopes, tokens, refresh tokens. Connecté à un vrai serveur Keycloak.", + href: "/demos/oauth-playground", + status: "Bientôt disponible", + }, + { + icon: KeyRound, + title: "Décodeur JWT", + description: + "Décodez et inspectez vos tokens JWT en temps réel. Visualisez le header, le payload et validez la signature.", + href: "/demos/token-decoder", + status: "Bientôt disponible", + }, + { + icon: ShieldCheck, + title: "Simulateur Zero Trust", + description: + "Visualisation interactive des couches de sécurité Zero Trust. Explorez les différentes stratégies d'implémentation.", + href: "/demos/zero-trust", + status: "Bientôt disponible", + }, +]; + +export default function DemosPage() { + return ( + <> +
+
+
+

+ Démos interactives +

+

+ Explorez les concepts de sécurité et d'IAM à travers des + outils interactifs. Apprenez en pratiquant. +

+
+
+
+ +
+
+
+ {demos.map((demo) => { + const Icon = demo.icon; + return ( +
+
+
+ +
+ + {demo.status} + +
+

+ {demo.title} +

+

+ {demo.description} +

+ + Explorer la démo → + +
+ ); + })} +
+
+
+ + ); +} diff --git a/src/app/(public)/layout.tsx b/src/app/(public)/layout.tsx new file mode 100644 index 0000000..5b71246 --- /dev/null +++ b/src/app/(public)/layout.tsx @@ -0,0 +1,16 @@ +import { Header } from "@/components/layout/Header"; +import { Footer } from "@/components/layout/Footer"; + +export default function PublicLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + <> +
+
{children}
+