From 79953671abb3777419c8740c6349037fc80fba91 Mon Sep 17 00:00:00 2001 From: LathanDevers Date: Tue, 28 Jul 2026 23:56:28 +0200 Subject: [PATCH] first step cleaning --- .env.example | 2 + .gitea/workflows/deploy-test.yml | 2 + .gitea/workflows/deploy.yml | 2 + .gitignore | 3 + package-lock.json | 288 +++++++- package.json | 4 +- src/App.tsx | 31 +- src/components/common/CookieBanner.tsx | 60 ++ src/components/layout/Footer.tsx | 42 ++ src/components/layout/LegalNavbar.tsx | 41 ++ src/components/layout/Navbar.tsx | 44 ++ src/components/layout/SimpleFooter.tsx | 7 + src/features/landing/AegisSection.tsx | 116 ++++ src/features/landing/ComparativeSection.tsx | 57 ++ src/features/landing/ContactSection.tsx | 174 +++++ src/features/landing/EngagementsSection.tsx | 74 ++ src/features/landing/HeroSection.tsx | 64 ++ src/features/landing/SectorsSection.tsx | 67 ++ src/layouts/LegalLayout.tsx | 17 + src/pages/ConditionsGenerales.tsx | 220 +++--- src/pages/GiseLandingPage.tsx | 723 +------------------- src/pages/MentionsLegales.tsx | 203 +++--- src/pages/PolitiqueConfidentialite.tsx | 344 ++++------ src/pages/PolitiqueCookies.tsx | 255 +++---- vite.config.ts | 12 +- 25 files changed, 1504 insertions(+), 1348 deletions(-) create mode 100644 .env.example create mode 100644 src/components/common/CookieBanner.tsx create mode 100644 src/components/layout/Footer.tsx create mode 100644 src/components/layout/LegalNavbar.tsx create mode 100644 src/components/layout/Navbar.tsx create mode 100644 src/components/layout/SimpleFooter.tsx create mode 100644 src/features/landing/AegisSection.tsx create mode 100644 src/features/landing/ComparativeSection.tsx create mode 100644 src/features/landing/ContactSection.tsx create mode 100644 src/features/landing/EngagementsSection.tsx create mode 100644 src/features/landing/HeroSection.tsx create mode 100644 src/features/landing/SectorsSection.tsx create mode 100644 src/layouts/LegalLayout.tsx diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..c983d26 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +VITE_WEB3FORMS_KEY= +VITE_URL_API_WEB3FORMS= \ No newline at end of file diff --git a/.gitea/workflows/deploy-test.yml b/.gitea/workflows/deploy-test.yml index 1f14e48..fb195ee 100644 --- a/.gitea/workflows/deploy-test.yml +++ b/.gitea/workflows/deploy-test.yml @@ -44,6 +44,8 @@ jobs: FTP_USER: ${{ secrets.FTP_USER_TEST }} FTP_PASSWORD: ${{ secrets.FTP_PASSWORD_TEST }} FTP_SERVER: ${{ secrets.FTP_SERVER }} # Doit contenir : 10.10.40.12 + VITE_WEB3FORMS_KEY: ${{ secrets.WEB3FORMS_KEY }} + VITE_URL_API_WEB3FORMS : ${{ secrets.URL_API_WEB3FORMS }} run: | cat << EOF > script.lftp set ftp:passive-mode true diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 546f7aa..46d600a 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -44,6 +44,8 @@ jobs: FTP_USER: ${{ secrets.FTP_USER }} FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }} FTP_SERVER: ${{ secrets.FTP_SERVER }} # Doit contenir : 10.10.40.12 + VITE_WEB3FORMS_KEY: ${{ secrets.WEB3FORMS_KEY }} + VITE_URL_API_WEB3FORMS : ${{ secrets.URL_API_WEB3FORMS }} run: | cat << EOF > script.lftp set ftp:passive-mode true diff --git a/.gitignore b/.gitignore index a547bf3..34d1322 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ node_modules dist dist-ssr *.local +.env +.env.local +.env.development # Editor directories and files .vscode/* diff --git a/package-lock.json b/package-lock.json index b360c4b..2d303e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@tailwindcss/vite": "^4.3.3", "lucide-react": "^1.27.0", + "plugin-react-swc": "^0.0.1-security", "react": "^19.2.7", "react-dom": "^19.2.7", "react-router-dom": "^7.11.0", @@ -17,10 +18,11 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", - "@types/node": "^24.13.2", + "@types/node": "^24.13.3", "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.3", + "@vitejs/plugin-react-swc": "^4.3.2", "eslint": "^10.6.0", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.3", @@ -815,6 +817,268 @@ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "license": "MIT" }, + "node_modules/@swc/core": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.46.tgz", + "integrity": "sha512-Ri3em2mBpq3h2zSPliCYl63otDGqek8PPEfv2nWgRQEbZ/VBCNyypVTVQ6cEbTCXBhy+WE2T3fQb08moIyuYaw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.27" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.46", + "@swc/core-darwin-x64": "1.15.46", + "@swc/core-linux-arm-gnueabihf": "1.15.46", + "@swc/core-linux-arm64-gnu": "1.15.46", + "@swc/core-linux-arm64-musl": "1.15.46", + "@swc/core-linux-ppc64-gnu": "1.15.46", + "@swc/core-linux-s390x-gnu": "1.15.46", + "@swc/core-linux-x64-gnu": "1.15.46", + "@swc/core-linux-x64-musl": "1.15.46", + "@swc/core-win32-arm64-msvc": "1.15.46", + "@swc/core-win32-ia32-msvc": "1.15.46", + "@swc/core-win32-x64-msvc": "1.15.46" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.46.tgz", + "integrity": "sha512-IsISIT22EfktVJrlvIpnAxG2u/A9aob9l99HMlx80x72WlFmFPk1V3UhkEzx86eJP8hw049KTFv/RISho2cq2Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.46.tgz", + "integrity": "sha512-4Tj4ppVIPCmUMpmGFiGtyEriwLyJ+yi/US4WfBrP/ok8COGddDZXLEzQETnKyK46mjvr1v0jevrS23zjoff7vA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.46.tgz", + "integrity": "sha512-i8tUGnNjyOgMmfmgFSg4aeJLQoFyfpIHK5FjpQAwpRyQIqEUB2w1e8zIDQzY1WhOxx8NoS1S5iUL813Un4Sf5A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.46.tgz", + "integrity": "sha512-c0OnhqzdhfOvv6qhNCcByepB+sNYOGZyhtr2Qa6ZCHvAWTYhSRw4j/u92Stue9PbZ/6q74b9nHzi76+kVzqQHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.46.tgz", + "integrity": "sha512-imyRpNEcUzFQFV2LE4jL68ErvmKEuZCbvZru77iQREunJ+bR4i658cupTgtG1mLYM3F1Tzy3Sb9xYb02KghWTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-ppc64-gnu": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.46.tgz", + "integrity": "sha512-ctEfcl/HcUeomK33cbySiHZm98GEDIxTm1EkpBsYCiHxElYBzvTXVeuQT2YwbUXn9XCrjiw4ipyUNk33k26qRg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-s390x-gnu": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.46.tgz", + "integrity": "sha512-DxlMdnt84TtRVTv7WL/thWyz9+QU8QZNNoAP9rrk0P68LziuhfePp8MjQ44zIprpTHTsEwyziIuGUUN5iSC1bQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.46.tgz", + "integrity": "sha512-SKxI7J6t90XPl8hRUqtJi9NfGdunN/E/vZMc7Bc0figeRdOPDBT+Tm8g7cx9xM0T0mewh2l+8dewa3Am27/P+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.46.tgz", + "integrity": "sha512-qj9T6B7bosI0VEsrWOVXZN1OXxS8Tp63ywyrLxNdOycnUtLdkgYcoBsN5y8ImnDDsnwrEWZOy1e+J4xSe7mA3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.46.tgz", + "integrity": "sha512-8p7l4c3LU+eA5g9Et1JPhNeMC1oQwXTGU+uah8DPIBX7YXzqswvaBtyKVmXefVGi/DJU1x3YJsc3mbAp9aWzSQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.46.tgz", + "integrity": "sha512-tUEnfr3Bn9u6FOjUb3PN9p+09qZC2j+wNDLKHzXXZn22rqGcUqR/ohCRSS+nG9B9+X+U+3FewNEHJkTmdIvMjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.46", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.46.tgz", + "integrity": "sha512-Vux7UDzBJYQggSuPfcl2w9iu+IJpgpRCxHzgCaVkELnAXAE4XZMOTX9HNcaNiwfeIDqdu2rkr69RuDm6wY8neA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.27.tgz", + "integrity": "sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@tailwindcss/node": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", @@ -1651,6 +1915,23 @@ } } }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-4.3.2.tgz", + "integrity": "sha512-MlSlmSAYbYwPjGa+CjOAqwij09iPYAQDHwx8osVkwoDamCxXlg+avpkC65Ysv+L/uqUWvRTsnJCKPjVhZih/sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1", + "@swc/core": "^1.15.46" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7 || ^8" + } + }, "node_modules/acorn": { "version": "8.17.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", @@ -2824,6 +3105,11 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/plugin-react-swc": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/plugin-react-swc/-/plugin-react-swc-0.0.1-security.tgz", + "integrity": "sha512-4jyIfp5tCL5CC1tZ9N25k5djEijGu++FrISjJRGNzAuYYNBYfAnDzhVOiRHOiZfEPmq5Q8j5tJGAn4KDLAQ22A==" + }, "node_modules/postcss": { "version": "8.5.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", diff --git a/package.json b/package.json index db02715..ed65ba8 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "@tailwindcss/vite": "^4.3.3", "lucide-react": "^1.27.0", + "plugin-react-swc": "^0.0.1-security", "react": "^19.2.7", "react-dom": "^19.2.7", "react-router-dom": "^7.11.0", @@ -19,10 +20,11 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", - "@types/node": "^24.13.2", + "@types/node": "^24.13.3", "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.3", + "@vitejs/plugin-react-swc": "^4.3.2", "eslint": "^10.6.0", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.3", diff --git a/src/App.tsx b/src/App.tsx index 49370ce..e526eb6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,23 +1,26 @@ +import { Suspense, lazy } from 'react'; import { BrowserRouter, Routes, Route } from 'react-router-dom'; -import GiseLandingPage from './pages/GiseLandingPage'; -import MentionsLegales from './pages/MentionsLegales'; -import PolitiqueConfidentialite from './pages/PolitiqueConfidentialite'; -import PolitiqueCookies from './pages/PolitiqueCookies'; -import ConditionsGenerales from './pages/ConditionsGenerales'; -import ScrollToTop from './components/ScrollToTop'; + +const GiseLandingPage = lazy(() => import('@pages/GiseLandingPage')); +const MentionsLegales = lazy(() => import('@pages/MentionsLegales')); +const PolitiqueConfidentialite = lazy(() => import('@pages/PolitiqueConfidentialite')); +const PolitiqueCookies = lazy(() => import('@pages/PolitiqueCookies')); +const ConditionsGenerales = lazy(() => import('@pages/ConditionsGenerales')); +const ScrollToTop = lazy(() => import('@components/ScrollToTop')); export default function App() { return ( - - - } /> - } /> - } /> - } /> - } /> - + GISE}> + + } /> + } /> + } /> + } /> + } /> + + ); } \ No newline at end of file diff --git a/src/components/common/CookieBanner.tsx b/src/components/common/CookieBanner.tsx new file mode 100644 index 0000000..aa62e8c --- /dev/null +++ b/src/components/common/CookieBanner.tsx @@ -0,0 +1,60 @@ +import { useState, useEffect } from 'react'; + +export default function CookieBanner() { + const [cookieConsent, setCookieConsent] = useState(null); + + useEffect(() => { + // Lecture au chargement + const getCookie = (name: string) => { + const value = `; ${document.cookie}`; + const parts = value.split(`; ${name}=`); + if (parts.length === 2) return parts.pop()?.split(';').shift(); + return null; + }; + const existingConsent = getCookie('gise_cookie_consent'); + if (existingConsent === 'true') setCookieConsent(true); + else if (existingConsent === 'false') setCookieConsent(false); + + // Écoute de l'événement venant du Footer pour réinitialiser + const handleShowBanner = () => setCookieConsent(null); + window.addEventListener('reset-cookies', handleShowBanner); + return () => window.removeEventListener('reset-cookies', handleShowBanner); + }, []); + + const handleAcceptCookies = () => { + const date = new Date(); + date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)); + document.cookie = `gise_cookie_consent=true;expires=${date.toUTCString()};path=/;Secure;SameSite=Strict`; + setCookieConsent(true); + }; + + const handleRefuseCookies = () => { + const date = new Date(); + date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)); + document.cookie = `gise_cookie_consent=false;expires=${date.toUTCString()};path=/;Secure;SameSite=Strict`; + setCookieConsent(false); + }; + + if (cookieConsent !== null) return null; + + return ( +
+
+
+

Respect de votre vie privée

+

+ GISE utilise uniquement des cookies strictement nécessaires au fonctionnement du site et à la sécurité. Aucun traceur publicitaire n'est déployé. +

+
+
+ + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx new file mode 100644 index 0000000..ef376d5 --- /dev/null +++ b/src/components/layout/Footer.tsx @@ -0,0 +1,42 @@ +import { Shield, Server } from 'lucide-react'; +import { Link } from 'react-router-dom'; + +export default function Footer() { + const handleResetCookies = () => { + // Efface le cookie + document.cookie = "gise_cookie_consent=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; + // Prévient le composant CookieBanner de s'afficher via un événement global + window.dispatchEvent(new Event('reset-cookies')); + }; + + return ( +
+
+
+
+
+ +
+ GISE +
+ +
+ Mentions Légales + Confidentialité + Cookies + + CGS +
+
+ +
+

+ + Infrastructure souveraine 100% hébergée en Belgique. +

+

© {new Date().getFullYear()} GISE Cybersecurity. Tous droits réservés.

+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/layout/LegalNavbar.tsx b/src/components/layout/LegalNavbar.tsx new file mode 100644 index 0000000..cba18c6 --- /dev/null +++ b/src/components/layout/LegalNavbar.tsx @@ -0,0 +1,41 @@ +import { Shield, ArrowLeft, Moon, Sun } from 'lucide-react'; +import { Link } from 'react-router-dom'; +import { useTheme } from '@hooks/useTheme'; + +export default function LegalNavbar() { + const { isDark, toggleTheme } = useTheme(); + + return ( +
+
+ + + + Retour à l'accueil + + +
+ + +
+
+ +
+ + GISE + +
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/layout/Navbar.tsx b/src/components/layout/Navbar.tsx new file mode 100644 index 0000000..b3750f7 --- /dev/null +++ b/src/components/layout/Navbar.tsx @@ -0,0 +1,44 @@ +import { Shield, Moon, Sun, ArrowUpRight } from 'lucide-react'; +import { useTheme } from '@hooks/useTheme'; + +export default function Navbar() { + const { isDark, toggleTheme } = useTheme(); + + return ( +
+
+ {/* Brand Logo */} +
+
+ +
+
+ GISE + + Cloud Souverain + +
+
+ + {/* Nav Links */} + + + {/* Action buttons */} +
+ + + Demander un audit + + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/layout/SimpleFooter.tsx b/src/components/layout/SimpleFooter.tsx new file mode 100644 index 0000000..5abdd34 --- /dev/null +++ b/src/components/layout/SimpleFooter.tsx @@ -0,0 +1,7 @@ +export default function SimpleFooter() { + return ( +
+

© {new Date().getFullYear()} GISE SRL. Tous droits réservés.

+
+ ); +} \ No newline at end of file diff --git a/src/features/landing/AegisSection.tsx b/src/features/landing/AegisSection.tsx new file mode 100644 index 0000000..cdae0ae --- /dev/null +++ b/src/features/landing/AegisSection.tsx @@ -0,0 +1,116 @@ +import { Activity, HardDrive, Server, Shield, ShieldCheck, Lock, Zap } from "lucide-react"; + +export default function AegisSection() { + return( +
+
+ + Transparence Totale + +

+ Le Portail AEGIS : Votre tableau de bord en temps réel +

+

+ En tant que dirigeant, vous disposez d'un espace privé réassurant qui vous prouve chaque jour que votre entreprise est protégée. +

+
+ +
+ + {/* Feature List Left (5 cols) */} +
+
+
+
+ +
+

Suivi de Santé & Disponibilité

+
+

+ Visualisez l'état de marche de vos serveurs et de vos accès avec des indicateurs vert émeraude simples à lire. +

+
+ +
+
+
+ +
+

Sauvegardes & Menaces Neutralisées

+
+

+ Consultez la date exacte de votre dernière sauvegarde et le nombre d'intrusions bloquées ce mois-ci. +

+
+ +
+
+
+ +
+

Coffre-Fort & Canal Direct

+
+

+ Stockez vos documents importants et contactez directement votre spécialiste d'un simple clic. +

+
+
+ + {/* UI Box Preview (Style Google Admin Console) (7 cols) */} +
+ + {/* App Header Bar */} +
+
+
+ AEGIS Command Center +
+ + ● Système Protégé + +
+ + {/* Metric Rows */} +
+
+
+ + Serveurs Cloud Privé (Belgique) +
+ + 100% Opérationnel + +
+ +
+
+ + Sauvegarde Automatique Hors-Site +
+ + Dernier check : Aujourd'hui à 04h00 + +
+ +
+
+ + Tentatives d'Intrusion Bloquées (30j) +
+ + 1 420 Attaques Neutralisées + +
+
+ +
+ + Demande d'évolution : demandez un nouvel accès ou une extension en 1 clic depuis votre espace. +
+ +
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/features/landing/ComparativeSection.tsx b/src/features/landing/ComparativeSection.tsx new file mode 100644 index 0000000..744059e --- /dev/null +++ b/src/features/landing/ComparativeSection.tsx @@ -0,0 +1,57 @@ +import { Check, X } from "lucide-react"; + +export default function ComparativeSection(){ + return( +
+
+

+ Pourquoi choisir GISE plutôt qu'un prestataire classique ? +

+

+ Les dépanneurs traditionnels interviennent quand la panne est là. GISE prend un engagement de responsabilité. +

+
+ +
+ {/* Classique */} +
+

Prestataire Classique

+
    +
  • + + Intervention réactive (dépanne une fois la panne survenue) +
  • +
  • + + Données hébergées à l'étranger sans garantie de confidentialité +
  • +
  • + + Facture mensuelle floue sans vision sur les menaces bloquées +
  • +
+
+ + {/* GISE */} +
+ +

Offre GISE & AEGIS

+
    +
  • + + Gestion proactive et surveillance 24h/24 pour éviter les pannes +
  • +
  • + + Serveurs et sauvegardes 100% situés physiquement en Belgique +
  • +
  • + + Tableau de bord AEGIS en temps réel pour une transparence totale +
  • +
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/features/landing/ContactSection.tsx b/src/features/landing/ContactSection.tsx new file mode 100644 index 0000000..3d818bf --- /dev/null +++ b/src/features/landing/ContactSection.tsx @@ -0,0 +1,174 @@ +import { useState } from 'react'; +import { CheckCircle, User, Building, Mail, MessageSquare } from 'lucide-react'; + +export default function ContactSection() { + const [formStatus, setFormStatus] = useState<'idle' | 'submitting' | 'success'>('idle'); + + return ( +
+
+ +
+

+ Demandez votre diagnostic +

+

+ Un premier bilan rapide de votre infrastructure, sans engagement. +

+
+ + {formStatus === 'success' ? ( +
+ +

Demande bien reçue !

+

+ Merci. Un spécialiste GISE étudiera vos besoins et vous recontactera très rapidement. +

+ +
+ ) : ( +
{ + event.preventDefault(); + setFormStatus('submitting'); + + const formData = new FormData(event.currentTarget); + // Remplacement de la clé par la variable d'environnement + formData.append("access_key", import.meta.env.VITE_WEB3FORMS_KEY); + formData.append("subject", "Demande de diagnostic (Site GISE)"); + + try { + const response = await fetch(import.meta.env.VITE_URL_API_WEB3FORMS, { + method: "POST", + body: formData + }); + + const data = await response.json(); + + if (data.success) { + setFormStatus('success'); + } else { + setFormStatus('idle'); + alert("Erreur lors de l'envoi : " + data.message); + } + } catch (error) { + setFormStatus('idle'); + alert("Erreur de connexion. Veuillez réessayer."); + } + }} + className="space-y-5 bg-[#f0f4f9] dark:bg-slate-950 p-8 sm:p-10 rounded-[28px] shadow-sm" + > +
+ {/* CHAMP NOM */} +
+ +
+ + +
+
+ + {/* CHAMP SOCIÉTÉ */} +
+ +
+ + +
+
+
+ +
+ {/* CHAMP EMAIL */} +
+ +
+ + +
+
+ + {/* CHAMP SELECT */} +
+ + +
+
+ + {/* CHAMP MESSAGE */} +
+ +
+