menu ok graphiquement et page 404 ok

This commit is contained in:
2026-07-02 10:14:49 +00:00
parent 849d7f1350
commit dedf5f1964
10 changed files with 514 additions and 47 deletions
+135
View File
@@ -0,0 +1,135 @@
/* 404 page specific styles - Dark glitch / data terminal theme */
body.page-404 {
background: radial-gradient(circle at top, rgba(13, 117, 255, 0.12), transparent 32%),
linear-gradient(180deg, #06080f 0%, #050611 100%);
color: #e4f0ff;
font-family: 'Inter', 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
}
.error-shell {
min-height: calc(100vh - 84px);
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
}
.error-card {
width: min(900px, 100%);
padding: 48px 40px;
border-radius: 28px;
background: rgba(4, 8, 16, 0.94);
border: 1px solid rgba(88, 152, 255, 0.18);
box-shadow: 0 26px 80px rgba(0, 0, 0, 0.45);
overflow: hidden;
position: relative;
}
.error-card::before,
.error-card::after {
content: '';
position: absolute;
inset: 0;
pointer-events: none;
}
.error-card::before {
background: linear-gradient(90deg, rgba(255, 255, 255, 0.04), transparent 40%, rgba(255, 255, 255, 0.04));
transform: skewX(-12deg);
}
.error-card::after {
background-image: radial-gradient(circle at 10% 20%, rgba(3, 155, 255, 0.18), transparent 22%),
radial-gradient(circle at 80% 80%, rgba(63, 185, 255, 0.12), transparent 20%);
}
.error-headline {
margin: 0 0 16px;
font-size: clamp(3rem, 5vw, 6rem);
letter-spacing: -0.08em;
line-height: 0.9;
color: #7df0ff;
text-shadow: 0 0 18px rgba(125, 240, 255, 0.28);
animation: glowPulse 2.5s ease-in-out infinite alternate;
}
.error-subtitle {
margin: 0 0 24px;
color: #b8d3ff;
font-size: 1.05rem;
line-height: 1.8;
letter-spacing: 0.02em;
max-width: 720px;
}
.error-meta {
display: flex;
gap: 16px;
flex-wrap: wrap;
margin-bottom: 32px;
}
.meta-chip {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(34, 126, 255, 0.18);
border-radius: 999px;
padding: 10px 18px;
font-size: 0.95rem;
color: #c4d6ff;
}
.error-actions {
display: flex;
align-items: center;
gap: 16px;
flex-wrap: wrap;
}
.button-return {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 26px;
border-radius: 999px;
border: 1px solid rgba(125, 240, 255, 0.5);
background: rgba(26, 34, 60, 0.95);
color: #e5f4ff;
font-size: 0.98rem;
font-weight: 700;
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.08em;
box-shadow: 0 0 18px rgba(46, 213, 255, 0.12);
transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
}
.button-return:hover,
.button-return:focus-visible {
transform: translateY(-2px);
background: rgba(14, 24, 42, 0.98);
box-shadow: 0 0 28px rgba(45, 210, 255, 0.35);
}
@keyframes glowPulse {
0% {
text-shadow: 0 0 18px rgba(125, 240, 255, 0.28), 0 0 40px rgba(125, 240, 255, 0.18);
}
100% {
text-shadow: 0 0 24px rgba(125, 240, 255, 0.55), 0 0 64px rgba(125, 240, 255, 0.25);
}
}
@media (max-width: 720px) {
.error-card {
padding: 32px 22px;
}
.error-headline {
font-size: clamp(2.4rem, 10vw, 4rem);
}
.error-actions {
width: 100%;
}
}
+131
View File
@@ -0,0 +1,131 @@
/* Menu page specific styles - Dark mode modern UI */
body.menu-page {
background: #090b10;
color: #e8effa;
font-family: Inter, 'Segoe UI', sans-serif;
}
.menu-shell {
width: 100%;
display: flex;
justify-content: center;
align-items: stretch;
padding: 20px 8px 40px;
box-sizing: border-box;
}
.menu-card {
width: min(1080px, 100%);
background: rgba(15, 21, 35, 0.98);
border: 1px solid rgba(120, 140, 190, 0.18);
border-radius: 28px;
box-shadow: 0 22px 80px rgba(0, 0, 0, 0.4);
backdrop-filter: blur(18px);
padding: 40px;
}
.menu-card__header {
display: flex;
justify-content: space-between;
align-items: center;
gap: 20px;
margin-bottom: 32px;
}
.menu-card__title {
font-size: clamp(1.8rem, 2.5vw, 2.6rem);
margin: 0;
line-height: 1.05;
letter-spacing: -0.03em;
}
.menu-card__subtitle {
color: #97a3c0;
font-size: 0.95rem;
margin-top: 8px;
}
.menu-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20px;
}
.menu-button {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 22px 24px;
border-radius: 20px;
border: 1px solid rgba(110, 146, 255, 0.2);
background: linear-gradient(180deg, rgba(15, 23, 45, 0.95), rgba(18, 24, 42, 0.98));
color: #f5f9ff;
text-decoration: none;
transition: transform 0.22s ease, box-shadow 0.22s ease, border-color 0.22s ease;
min-height: 130px;
}
.menu-button:hover,
.menu-button:focus-visible {
transform: translateY(-3px);
border-color: rgba(91, 132, 255, 0.75);
box-shadow: 0 20px 60px rgba(45, 67, 122, 0.28);
}
.menu-button__content {
display: flex;
flex-direction: column;
gap: 6px;
}
.menu-button__title {
font-size: 1.2rem;
font-weight: 700;
margin: 0;
}
.menu-button__text {
color: #97a3c0;
font-size: 0.95rem;
}
.menu-button__icon {
width: 48px;
height: 48px;
display: grid;
place-items: center;
border-radius: 16px;
background: rgba(87, 132, 255, 0.14);
color: #7fa2ff;
font-size: 1.4rem;
}
.menu-note {
margin-top: 30px;
color: #8090b3;
font-size: 0.95rem;
text-align: center;
}
@media (max-width: 860px) {
.menu-grid {
grid-template-columns: 1fr;
}
.menu-card {
padding: 32px 22px;
}
}
@media (max-width: 520px) {
.menu-card {
padding: 24px 16px;
}
.menu-button {
min-height: 110px;
padding: 18px 18px;
}
}
+21 -6
View File
@@ -28,6 +28,8 @@
html {
scroll-behavior: smooth;
min-height: 100%;
height: 100%;
}
body {
@@ -41,6 +43,15 @@ body {
min-height: 100vh;
}
body > .main-content {
flex: 1 0 auto;
}
main {
flex: 1 0 auto;
width: 100%;
}
.container {
width: 100%;
margin: 0 auto;
@@ -147,14 +158,16 @@ body {
.footer {
position: relative;
padding: 2px 20px;
padding: 8px 20px;
text-align: center;
font-size: 0.85rem;
line-height: 1.1;
min-height: 28px;
line-height: 1.3;
min-height: 38px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(18, 24, 42, 0.98);
border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.footer-logout {
@@ -184,11 +197,13 @@ body {
============================================ */
.main-content {
flex: 1;
padding: 40px 20px;
flex: 1 0 auto;
min-height: 0;
padding: 40px 20px 20px;
display: flex;
justify-content: center;
align-items: center;
align-items: flex-start;
width: 100%;
}
.login-container {
+12
View File
@@ -0,0 +1,12 @@
document.addEventListener('DOMContentLoaded', function () {
const menuButtons = document.querySelectorAll('.menu-button[data-target]');
menuButtons.forEach((button) => {
button.addEventListener('click', () => {
const target = button.getAttribute('data-target');
if (target) {
window.location.href = target;
}
});
});
});
+24 -10
View File
@@ -1,16 +1,30 @@
<?php
// On envoie explicitement le code d'erreur 404 au navigateur
declare(strict_types=1);
http_response_code(404);
require_once('header.php');
$pageStylesheets = ['/css/404.css'];
$bodyClass = 'page-404';
require_once __DIR__ . '/header.php';
?>
<div style="text-align: center; padding: 50px; color: white;">
<h1>Erreur 404</h1>
<p>Désolé, la page que vous recherchez est introuvable.</p>
<a href="/index.php" style="color: #007bff;">Retour à l'accueil</a>
</div>
<section class="error-shell">
<article class="error-card">
<h1 class="error-headline">404</h1>
<p class="error-subtitle">La transaction est introuvable. Le cours de cette page a chuté et le marché nen veut plus.</p>
<?php
require_once('footer.php');
?>
<div class="error-meta">
<span class="meta-chip">Route : /404</span>
<span class="meta-chip">Status : Page non cotée</span>
<span class="meta-chip">Session : <?= htmlspecialchars((string) ($_SESSION['user_id'] ?? 'invité'), ENT_QUOTES, 'UTF-8') ?></span>
</div>
<div class="error-actions">
<a href="/index.php" class="button-return">Retour à la base</a>
</div>
</article>
</section>
<?php require_once __DIR__ . '/footer.php'; ?>
+1 -1
View File
@@ -1,7 +1,7 @@
</main>
<footer class="footer">
<?php if (isset($_SESSION['user_id'])): ?>
<a class="logout-button footer-logout" href="/php/menu.php?action=logout">Se déconnecter</a>
<a class="logout-button footer-logout" href="/php/logout.php">Se déconnecter</a>
<?php endif; ?>
<p>&copy; 2026 - Jean-François GIRAUD - Positions en bourse - Tous droits réservés</p>
</footer>
+6 -1
View File
@@ -5,9 +5,14 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bourse - Page d'Accueil</title>
<link rel="stylesheet" href="/css/style.css">
<?php if (!empty($pageStylesheets) && is_array($pageStylesheets)): ?>
<?php foreach ($pageStylesheets as $sheet): ?>
<link rel="stylesheet" href="<?= htmlspecialchars($sheet, ENT_QUOTES, 'UTF-8') ?>">
<?php endforeach; ?>
<?php endif; ?>
<link rel="shortcut icon" href="/assets/images/favicon.png" type="image/x-icon">
</head>
<body>
<body class="<?= !empty($bodyClass) ? htmlspecialchars($bodyClass, ENT_QUOTES, 'UTF-8') : '' ?>">
<header class="header">
<div class="container">
<div class="logo">
+14
View File
@@ -0,0 +1,14 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/session.php';
// Destroy the PHP session and clear the session cookie.
session_unset();
session_destroy();
setcookie(session_name(), '', time() - 42000, '/');
// Redirect to the public login/home page.
header('Location: https://giraud-finance.com');
exit;
+70 -26
View File
@@ -4,40 +4,84 @@ declare(strict_types=1);
require_once __DIR__ . '/session.php';
// Logout action
if (isset($_GET['action']) && $_GET['action'] === 'logout') {
session_unset();
session_destroy();
setcookie(session_name(), '', time() - 42000, '/');
header('Location: ../index.php');
exit;
// Si l'utilisateur n'est pas connecté, redirection vers l'accueil.
if (empty($_SESSION['user_id'])) {
header('Location: ../index.php');
exit;
}
// Require login
if (empty($_SESSION['user_id'])) {
header('Location: ../index.php');
exit;
}
// Ajoute le CSS spécifique à cette page et une classe body dédiée.
$pageStylesheets = ['/css/menu.css'];
$bodyClass = 'menu-page';
require_once __DIR__ . '/header.php';
?>
<div class="login-container">
<div class="login-box">
<h2 class="login-title">Espace utilisateur</h2>
<section class="menu-shell">
<article class="menu-card">
<header class="menu-card__header">
<div>
<h2 class="menu-card__title">Espace de gestion</h2>
<p class="menu-card__subtitle">Accédez aux fonctions clés de l'application financière.</p>
</div>
<span class="menu-card__badge">v1.0</span>
</header>
<p>Session ID : <?php echo htmlspecialchars(session_id(), ENT_QUOTES, 'UTF-8'); ?></p>
<p>User ID : <?php echo htmlspecialchars((string)($_SESSION['user_id'] ?? ''), ENT_QUOTES, 'UTF-8'); ?></p>
<p>Login : <?php echo htmlspecialchars((string)($_SESSION['user_login'] ?? ''), ENT_QUOTES, 'UTF-8'); ?></p>
<p>Nom : <?php echo htmlspecialchars((string)($_SESSION['user_name'] ?? ''), ENT_QUOTES, 'UTF-8'); ?></p>
<p>Dernière activité (timestamp) : <?php echo htmlspecialchars((string)time(), ENT_QUOTES, 'UTF-8'); ?></p>
<p>Adresse IP : <?php echo htmlspecialchars($_SERVER['REMOTE_ADDR'] ?? '', ENT_QUOTES, 'UTF-8'); ?></p>
<form name="menu" class="menu-grid" action="#" method="post" autocomplete="off" novalidate>
<button type="button" class="menu-button" data-target="/php/order_gf.php">
<div class="menu-button__content">
<span class="menu-button__title">Ordre GF</span>
<span class="menu-button__text">Envoyer un ordre GF</span>
</div>
<span class="menu-button__icon">⇄</span>
</button>
<div style="margin-top:16px;">
<a class="btn-submit" href="menu.php?action=logout" style="display:inline-block;text-decoration:none;">Se déconnecter</a>
</div>
</div>
</div>
<button type="button" class="menu-button" data-target="/php/order_jfg.php">
<div class="menu-button__content">
<span class="menu-button__title">Ordre JFG</span>
<span class="menu-button__text">Envoyer un ordre JFG</span>
</div>
<span class="menu-button__icon">↻</span>
</button>
<button type="button" class="menu-button" data-target="/php/account_gf.php">
<div class="menu-button__content">
<span class="menu-button__title">Compte GF</span>
<span class="menu-button__text">Consulter le compte GF</span>
</div>
<span class="menu-button__icon">💼</span>
</button>
<button type="button" class="menu-button" data-target="/php/account_jfg.php">
<div class="menu-button__content">
<span class="menu-button__title">Compte JFG</span>
<span class="menu-button__text">Consulter le compte JFG</span>
</div>
<span class="menu-button__icon">📊</span>
</button>
<button type="button" class="menu-button" data-target="/php/actions.php">
<div class="menu-button__content">
<span class="menu-button__title">Actions</span>
<span class="menu-button__text">Voir les actions et transactions</span>
</div>
<span class="menu-button__icon">⚡</span>
</button>
<button type="button" class="menu-button" data-target="/php/csv.php">
<div class="menu-button__content">
<span class="menu-button__title">CSV</span>
<span class="menu-button__text">Importer / exporter les données</span>
</div>
<span class="menu-button__icon">📁</span>
</button>
</form>
<p class="menu-note">Giraud Finance : Accès sécurisé. Veillez à fermer votre session après chaque utilisation.</p>
</article>
</section>
<script src="/js/menu.js" defer></script>
<?php require_once __DIR__ . '/footer.php'; ?>
+100 -3
View File
@@ -9,18 +9,115 @@
│   └── images
│   ├── favicon.png
│   └── GFBlancLogo.png
├── composer.json
├── composer.lock
├── css
│   └── style.css
├── .htaccess
├── index.php
├── js
├── php
│   ├── 404.php
│   ├── db.php
│   ├── footer.php
│   ├── forgot_password.php
│   ├── header.php
│   ├── login_process.php
│   ├── menu.php
│   ├── register.php
│   ├── reset_password.php
│   └── session.php
├── structure.txt
└── structur.txt
└── vendor
├── autoload.php
├── composer
│   ├── autoload_classmap.php
│   ├── autoload_namespaces.php
│   ├── autoload_psr4.php
│   ├── autoload_real.php
│   ├── autoload_static.php
│   ├── ClassLoader.php
│   ├── installed.json
│   ├── installed.php
│   ├── InstalledVersions.php
│   ├── LICENSE
│   └── platform_check.php
└── phpmailer
└── phpmailer
├── COMMITMENT
├── composer.json
├── get_oauth_token.php
├── language
│   ├── phpmailer.lang-af.php
│   ├── phpmailer.lang-ar.php
│   ├── phpmailer.lang-as.php
│   ├── phpmailer.lang-az.php
│   ├── phpmailer.lang-ba.php
│   ├── phpmailer.lang-be.php
│   ├── phpmailer.lang-bg.php
│   ├── phpmailer.lang-bn.php
│   ├── phpmailer.lang-ca.php
│   ├── phpmailer.lang-cs.php
│   ├── phpmailer.lang-da.php
│   ├── phpmailer.lang-de.php
│   ├── phpmailer.lang-el.php
│   ├── phpmailer.lang-eo.php
│   ├── phpmailer.lang-es.php
│   ├── phpmailer.lang-et.php
│   ├── phpmailer.lang-fa.php
│   ├── phpmailer.lang-fi.php
│   ├── phpmailer.lang-fo.php
│   ├── phpmailer.lang-fr.php
│   ├── phpmailer.lang-gl.php
│   ├── phpmailer.lang-he.php
│   ├── phpmailer.lang-hi.php
│   ├── phpmailer.lang-hr.php
│   ├── phpmailer.lang-hu.php
│   ├── phpmailer.lang-hy.php
│   ├── phpmailer.lang-id.php
│   ├── phpmailer.lang-it.php
│   ├── phpmailer.lang-ja.php
│   ├── phpmailer.lang-ka.php
│   ├── phpmailer.lang-ko.php
│   ├── phpmailer.lang-ku.php
│   ├── phpmailer.lang-lt.php
│   ├── phpmailer.lang-lv.php
│   ├── phpmailer.lang-mg.php
│   ├── phpmailer.lang-mn.php
│   ├── phpmailer.lang-ms.php
│   ├── phpmailer.lang-nb.php
│   ├── phpmailer.lang-nl.php
│   ├── phpmailer.lang-pl.php
│   ├── phpmailer.lang-pt_br.php
│   ├── phpmailer.lang-pt.php
│   ├── phpmailer.lang-ro.php
│   ├── phpmailer.lang-ru.php
│   ├── phpmailer.lang-si.php
│   ├── phpmailer.lang-sk.php
│   ├── phpmailer.lang-sl.php
│   ├── phpmailer.lang-sr_latn.php
│   ├── phpmailer.lang-sr.php
│   ├── phpmailer.lang-sv.php
│   ├── phpmailer.lang-tl.php
│   ├── phpmailer.lang-tr.php
│   ├── phpmailer.lang-uk.php
│   ├── phpmailer.lang-ur.php
│   ├── phpmailer.lang-vi.php
│   ├── phpmailer.lang-zh_cn.php
│   └── phpmailer.lang-zh.php
├── LICENSE
├── README.md
├── SECURITY.md
├── SMTPUTF8.md
├── src
│   ├── DSNConfigurator.php
│   ├── Exception.php
│   ├── OAuth.php
│   ├── OAuthTokenProvider.php
│   ├── PHPMailer.php
│   ├── POP3.php
│   └── SMTP.php
└── VERSION
7 directories, 17 files
13 directories, 106 files
tree > structure.txt