Alpha V2.5.13

This commit is contained in:
Flatlogic Bot 2026-03-09 19:02:21 +00:00
parent b27feb7780
commit d8c3f10a6a
7 changed files with 294 additions and 64 deletions

View File

@ -10,3 +10,172 @@
50% { opacity: 0.5; }
100% { opacity: 1; }
}
/* Modal Public Profile - Nexus Design */
.modal-nexus {
background: radial-gradient(circle at top, #141e33 0%, #080c14 100%) !important;
border: 1px solid rgba(136, 192, 208, 0.2) !important;
border-radius: 8px !important;
color: #fff !important;
box-shadow: 0 0 40px rgba(0,0,0,0.8), inset 0 0 20px rgba(136, 192, 208, 0.05) !important;
max-height: none !important; /* Remove fixed height constraint */
overflow: visible !important; /* Prevent internal scrollbars */
height: auto !important;
}
.modal-nexus .modal-header {
background: rgba(15, 23, 42, 0.8) !important;
border-bottom: 1px solid rgba(136, 192, 208, 0.15) !important;
padding: 12px 20px !important;
}
.modal-nexus .modal-header h2 {
font-size: 14px !important;
text-transform: uppercase !important;
letter-spacing: 2px !important;
color: #88c0d0 !important;
margin: 0 !important;
}
.modal-nexus .modal-body {
padding: 0 !important;
overflow: visible !important; /* Ensure content isn't clipped */
}
.profile-top-section {
padding: 25px 20px;
text-align: center;
background: url('https://www.transparenttextures.com/patterns/stardust.png');
border-bottom: 1px solid rgba(136, 192, 208, 0.15);
}
.profile-grade-img {
width: 45px;
height: 45px;
object-fit: contain;
vertical-align: middle;
margin-right: 15px;
filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.2));
}
.profile-username {
font-size: 22px;
font-weight: bold;
color: #fff;
vertical-align: middle;
}
.profile-title-text {
font-size: 10px;
color: #ebcb8b;
text-transform: uppercase;
letter-spacing: 3px;
margin-top: 12px;
display: block;
}
.profile-level-text {
font-size: 12px;
color: #88c0d0;
opacity: 0.8;
margin-top: 8px;
display: block;
}
.profile-section-header {
font-size: 10px;
color: #ebcb8b;
text-transform: uppercase;
letter-spacing: 2px;
padding: 15px 20px 8px 20px;
display: flex;
align-items: center;
gap: 10px;
}
.profile-section-header::before {
content: '';
display: inline-block;
width: 10px;
height: 3px;
background: #ebcb8b;
}
.guild-info-box {
padding: 10px 20px 15px 20px;
border-bottom: 1px solid rgba(136, 192, 208, 0.15);
}
.guild-display {
display: flex;
align-items: center;
gap: 12px;
background: rgba(30, 41, 59, 0.4);
padding: 10px 15px;
border-radius: 4px;
border: 1px solid rgba(136, 192, 208, 0.1);
}
.guild-icon-placeholder {
width: 24px;
height: 24px;
background: #1e293b;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
color: #88c0d0;
font-size: 12px;
}
.guild-tag-display {
color: #ebcb8b;
font-weight: bold;
font-size: 14px;
}
.guild-name-display {
color: #fff;
font-size: 14px;
}
.profile-bottom-grid {
display: flex;
min-height: 150px; /* Reduced slightly to keep it compact */
}
.profile-left-col {
flex: 1;
border-right: 1px solid rgba(136, 192, 208, 0.15);
padding: 20px;
background: rgba(0,0,0,0.1);
}
.profile-right-col {
width: 200px;
padding: 0;
}
.badge-info-section {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: calc(100% - 40px);
padding-bottom: 20px;
}
.badge-img-display {
width: 70px;
height: 70px;
object-fit: contain;
filter: drop-shadow(0 0 15px rgba(136, 192, 208, 0.3));
margin-bottom: 12px;
}
.badge-name-display {
font-size: 11px;
color: #fff;
text-align: center;
padding: 0 10px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

View File

@ -18,11 +18,13 @@ $user_role = 'user';
$stmt = $db->prepare("SELECT u.role, u.display_name, u.username, u.guild_id, l.name as level_raw,
u.selected_title_id, u.selected_badge_id,
t.name as title_name,
b.name as badge_name, b.image_url as badge_image
b.name as badge_name, b.image_url as badge_image,
g.name as guild_name, g.tag as guild_tag
FROM users u
LEFT JOIN levels l ON u.level_id = l.id
LEFT JOIN titles t ON u.selected_title_id = t.id
LEFT JOIN badges b ON u.selected_badge_id = b.id
LEFT JOIN guilds g ON u.guild_id = g.id
WHERE u.id = ?");
$stmt->execute([$user_id]);
$u_data = $stmt->fetch();
@ -37,6 +39,8 @@ if ($u_data) {
$_SESSION['selected_title_name'] = $u_data['title_name'];
$_SESSION['selected_badge_name'] = $u_data['badge_name'];
$_SESSION['selected_badge_image'] = $u_data['badge_image'];
$_SESSION['guild_name'] = $u_data['guild_name'];
$_SESSION['guild_tag'] = $u_data['guild_tag'];
$grade_type = ($user_role === 'admin') ? 'admin' : 'utilisateur';
$g_stmt = $db->prepare("SELECT name, image_url FROM grades
@ -44,7 +48,7 @@ if ($u_data) {
AND (min_level <= ? OR min_level IS NULL)
AND (max_level >= ? OR max_level IS NULL)
LIMIT 1");
$g_stmt->execute([$grade_type, $level_num, $level_num]);
$g_stmt->execute([$grade_type, $level_num, $level_num]);
$grade_data = $g_stmt->fetch();
if ($grade_data) {
@ -329,7 +333,7 @@ if ($in_guild) {
.req-item img { width: 18px; height: 18px; }
.req-item.insufficient { border-color: #bf616a; color: #bf616a; }
/* MODAL STYLES (Copiés de index.php) */
/* MODAL STYLES (MATCHING index.php) */
.modal-overlay {
display: none;
position: fixed;
@ -338,7 +342,9 @@ if ($in_guild) {
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(5px);
z-index: 2000;
align-items: center;
align-items: flex-start;
padding: 40px 0;
overflow-y: auto;
justify-content: center;
}
.modal-container {
@ -346,10 +352,11 @@ if ($in_guild) {
border: 1px solid #1e293b;
border-radius: 12px;
width: 600px;
max-height: 90vh;
overflow-y: auto;
max-height: none;
overflow: visible;
position: relative;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
margin: 0 auto;
}
.modal-header {
padding: 20px;
@ -540,14 +547,14 @@ if ($in_guild) {
</main>
</div>
<!-- PROFILE MODAL (Structure identique à index.php) -->
<!-- PROFILE MODAL (Nexus Design) -->
<div id="profileModal" class="modal-overlay" onclick="if(event.target === this) this.style.display='none'">
<div class="modal-container">
<div class="modal-container modal-nexus">
<div class="modal-header">
<h2>Profil Public</h2>
<button class="modal-close" onclick="document.getElementById('profileModal').style.display='none'">&times;</button>
</div>
<div id="profileModalContent" class="modal-body" style="text-align: center; padding-top: 40px; padding-bottom: 40px;">
<div id="profileModalContent" class="modal-body">
<!-- Chargé via AJAX -->
</div>
</div>
@ -558,7 +565,7 @@ if ($in_guild) {
const modal = document.getElementById('profileModal');
const content = document.getElementById('profileModalContent');
content.innerHTML = '<div style="padding: 40px; color: #8c92a3;"><i class="fa-solid fa-spinner fa-spin fa-2x"></i><br><br>Chargement des données...</div>';
content.innerHTML = '<div style="padding: 40px; color: #8c92a3; text-align: center;"><i class="fa-solid fa-spinner fa-spin fa-2x"></i><br><br>Chargement des données...</div>';
modal.style.display = 'flex';
fetch(`profile.php?id=${userId}`, {
@ -569,7 +576,7 @@ if ($in_guild) {
content.innerHTML = html;
})
.catch(error => {
content.innerHTML = '<div style="color: #bf616a; padding: 40px;">Erreur de connexion au Nexus.</div>';
content.innerHTML = '<div style="color: #bf616a; padding: 40px; text-align: center;">Erreur de connexion au Nexus.</div>';
console.error('Error:', error);
});
}

View File

@ -9,11 +9,13 @@ if (isset($_SESSION['user_id'])) {
$stmt = $db->prepare("SELECT u.role, u.display_name, u.username, u.guild_id, l.name as level_raw,
u.selected_title_id, u.selected_badge_id,
t.name as title_name,
b.name as badge_name, b.image_url as badge_image
b.name as badge_name, b.image_url as badge_image,
g.name as guild_name, g.tag as guild_tag
FROM users u
LEFT JOIN levels l ON u.level_id = l.id
LEFT JOIN titles t ON u.selected_title_id = t.id
LEFT JOIN badges b ON u.selected_badge_id = b.id
LEFT JOIN guilds g ON u.guild_id = g.id
WHERE u.id = ?");
$stmt->execute([$_SESSION['user_id']]);
$u_data = $stmt->fetch();
@ -29,6 +31,8 @@ if (isset($_SESSION['user_id'])) {
$_SESSION['selected_title_name'] = $u_data['title_name'];
$_SESSION['selected_badge_name'] = $u_data['badge_name'];
$_SESSION['selected_badge_image'] = $u_data['badge_image'];
$_SESSION['guild_name'] = $u_data['guild_name'];
$_SESSION['guild_tag'] = $u_data['guild_tag'];
$grade_type = ($user_role === 'admin') ? 'admin' : 'utilisateur';
$g_stmt = $db->prepare("SELECT name, image_url FROM grades
@ -467,7 +471,9 @@ function getStatusColor($status, $statuses_map) {
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(5px);
z-index: 2000;
align-items: center;
align-items: flex-start;
padding: 40px 0;
overflow-y: auto;
justify-content: center;
}
.modal-container {
@ -475,10 +481,11 @@ function getStatusColor($status, $statuses_map) {
border: 1px solid #1e293b;
border-radius: 12px;
width: 600px;
max-height: 90vh;
overflow-y: auto;
max-height: none;
overflow: visible;
position: relative;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
margin: 0 auto;
}
.modal-header {
padding: 20px;
@ -1004,36 +1011,63 @@ function getStatusColor($status, $statuses_map) {
</script>
<!-- PROFILE MODAL -->
<div id="profileModal" class="modal-overlay" onclick="if(event.target === this) this.style.display='none'">
<div class="modal-container">
<div class="modal-container modal-nexus">
<div class="modal-header">
<h2>Profil Public</h2>
<button class="modal-close" onclick="document.getElementById('profileModal').style.display='none'">&times;</button>
</div>
<div class="modal-body" style="text-align: center; padding-top: 40px; padding-bottom: 40px;">
<div style="display: flex; align-items: center; justify-content: center; gap: 15px; margin-bottom: 10px;">
<img src="<?php echo htmlspecialchars($_SESSION["grade_image"] ?? "assets/images/placeholder_grade.png"); ?>" style="width: 60px; height: 60px; object-fit: contain;">
<span style="font-size: 28px; font-weight: bold; color: #fff;">
<?php echo htmlspecialchars($_SESSION["grade_name"] ?? "Recrue"); ?>
<?php echo htmlspecialchars($_SESSION["display_name"] ?? $_SESSION["username"]); ?>
</span>
</div>
<?php if (!empty($_SESSION['selected_title_name'])): ?>
<div style="font-size: 14px; font-weight: bold; color: #ebcb8b; text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 5px;">
« <?php echo htmlspecialchars($_SESSION['selected_title_name']); ?> »
<div class="modal-body">
<div class="profile-top-section">
<div style="display: flex; align-items: center; justify-content: center; margin-bottom: 5px;">
<img src="<?php echo htmlspecialchars($_SESSION["grade_image"] ?? "assets/images/placeholder_grade.png"); ?>" class="profile-grade-img">
<span class="profile-username">
<?php echo htmlspecialchars($_SESSION["grade_name"] ?? "Recrue"); ?>
<?php echo htmlspecialchars($_SESSION["display_name"] ?? $_SESSION["username"]); ?>
</span>
</div>
<?php endif; ?>
<?php if (!empty($_SESSION['selected_title_name'])): ?>
<span class="profile-title-text"> <?php echo htmlspecialchars($_SESSION['selected_title_name']); ?> —</span>
<?php endif; ?>
<div style="font-size: 16px; color: #88c0d0; opacity: 0.8; margin-bottom: 20px;">
Niveau <?php echo htmlspecialchars($_SESSION["level"] ?? "1"); ?>
<span class="profile-level-text">Niveau <?php echo htmlspecialchars($_SESSION["level"] ?? "1"); ?></span>
</div>
<?php if (!empty($_SESSION['selected_badge_image'])): ?>
<div style="margin-top: 20px; padding: 15px; background: rgba(30, 41, 59, 0.3); border-radius: 12px; display: inline-block;">
<img src="<?php echo htmlspecialchars($_SESSION['selected_badge_image']); ?>?v=<?php echo time(); ?>" style="width: 80px; height: 80px; object-fit: contain; filter: drop-shadow(0 0 10px rgba(136, 192, 208, 0.2));" title="<?php echo htmlspecialchars($_SESSION['selected_badge_name'] ?? ''); ?>">
<div style="font-size: 10px; color: #8c92a3; margin-top: 8px; text-transform: uppercase;">Badge Équipé</div>
<div class="profile-section-header">Guilde</div>
<div class="guild-info-box">
<?php if (!empty($_SESSION['guild_id'])): ?>
<div class="guild-display">
<div class="guild-icon-placeholder"><i class="fa-solid fa-building-shield"></i></div>
<span class="guild-tag-display">[<?php echo htmlspecialchars($_SESSION['guild_tag']); ?>]</span>
<span class="guild-name-display"><?php echo htmlspecialchars($_SESSION['guild_name']); ?></span>
</div>
<?php else: ?>
<div class="guild-display" style="opacity: 0.5;">
<div class="guild-icon-placeholder"><i class="fa-solid fa-user"></i></div>
<span class="guild-name-display" style="font-style: italic;">Aucune guilde</span>
</div>
<?php endif; ?>
</div>
<div class="profile-bottom-grid">
<div class="profile-left-col">
<div style="width: 100%; height: 100%; opacity: 0.1; background: url('https://www.transparenttextures.com/patterns/stardust.png');"></div>
</div>
<?php endif; ?>
<div class="profile-right-col">
<div class="profile-section-header">Insigne Équipé</div>
<div class="badge-info-section">
<?php if (!empty($_SESSION['selected_badge_image'])): ?>
<img src="<?php echo htmlspecialchars($_SESSION['selected_badge_image']); ?>?v=<?php echo time(); ?>" class="badge-img-display" title="<?php echo htmlspecialchars($_SESSION['selected_badge_name'] ?? ''); ?>">
<span class="badge-name-display"><?php echo htmlspecialchars($_SESSION['selected_badge_name'] ?? ''); ?></span>
<?php else: ?>
<div style="width: 80px; height: 80px; display: flex; align-items: center; justify-content: center; opacity: 0.2; margin-bottom: 15px;">
<i class="fa-solid fa-medal fa-3x"></i>
</div>
<span class="badge-name-display" style="opacity: 0.5; font-style: italic;">Aucun insigne</span>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -47,43 +47,63 @@ if ($id || !empty($username)) {
if ($is_ajax): ?>
<?php if ($user): ?>
<div style="display: flex; align-items: center; justify-content: center; gap: 15px; margin-bottom: 10px;">
<img src="<?php echo htmlspecialchars($user['grade_image']); ?>" style="width: 60px; height: 60px; object-fit: contain;">
<span style="font-size: 28px; font-weight: bold; color: #fff;">
<?php echo htmlspecialchars($user['grade_name']); ?>
<?php echo htmlspecialchars($user['display_name'] ?: $user['username']); ?>
</span>
</div>
<?php if (!empty($user['title_name'])): ?>
<div style="font-size: 14px; font-weight: bold; color: #ebcb8b; text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 5px;">
« <?php echo htmlspecialchars($user['title_name']); ?> »
<div class="profile-top-section">
<div style="display: flex; align-items: center; justify-content: center; margin-bottom: 5px;">
<img src="<?php echo htmlspecialchars($user['grade_image']); ?>" class="profile-grade-img">
<span class="profile-username">
<?php echo htmlspecialchars($user['grade_name']); ?>
<?php echo htmlspecialchars($user['display_name'] ?: $user['username']); ?>
</span>
</div>
<?php endif; ?>
<?php if (!empty($user['title_name'])): ?>
<span class="profile-title-text"> <?php echo htmlspecialchars($user['title_name']); ?> —</span>
<?php endif; ?>
<div style="font-size: 16px; color: #88c0d0; opacity: 0.8; margin-bottom: 20px;">
Niveau <?php echo $user['level_num']; ?>
<span class="profile-level-text">Niveau <?php echo $user['level_num']; ?></span>
</div>
<?php if (!empty($user['guild_id'])): ?>
<div style="background: rgba(30, 41, 59, 0.3); padding: 8px 15px; border-radius: 8px; border: 1px solid rgba(136, 192, 208, 0.1); display: inline-flex; align-items: center; gap: 8px; margin-bottom: 10px;">
<i class="fa-solid fa-building-shield" style="color: #88c0d0;"></i>
<span style="color: #ebcb8b; font-weight: bold;">[<?php echo htmlspecialchars($user['guild_tag']); ?>]</span>
<span style="color: #fff; font-size: 13px;"><?php echo htmlspecialchars($user['guild_name']); ?></span>
</div>
<?php endif; ?>
<div class="profile-section-header">Guilde</div>
<div class="guild-info-box">
<?php if (!empty($user['guild_id'])): ?>
<div class="guild-display">
<div class="guild-icon-placeholder"><i class="fa-solid fa-building-shield"></i></div>
<span class="guild-tag-display">[<?php echo htmlspecialchars($user['guild_tag']); ?>]</span>
<span class="guild-name-display"><?php echo htmlspecialchars($user['guild_name']); ?></span>
</div>
<?php else: ?>
<div class="guild-display" style="opacity: 0.5;">
<div class="guild-icon-placeholder"><i class="fa-solid fa-user"></i></div>
<span class="guild-name-display" style="font-style: italic;">Aucune guilde</span>
</div>
<?php endif; ?>
</div>
<?php if (!empty($user['badge_image'])): ?>
<div style="margin-top: 15px; padding: 15px; background: rgba(30, 41, 59, 0.3); border-radius: 12px; display: inline-block;">
<img src="<?php echo htmlspecialchars($user['badge_image']); ?>?v=<?php echo time(); ?>" style="width: 80px; height: 80px; object-fit: contain; filter: drop-shadow(0 0 10px rgba(136, 192, 208, 0.2));" title="<?php echo htmlspecialchars($user['badge_name']); ?>">
<div style="font-size: 10px; color: #8c92a3; margin-top: 8px; text-transform: uppercase;">Badge Équipé</div>
<div class="profile-bottom-grid">
<div class="profile-left-col">
<!-- Additional data could go here (stats, etc.) -->
<div style="width: 100%; height: 100%; opacity: 0.1; background: url('https://www.transparenttextures.com/patterns/stardust.png');"></div>
</div>
<?php endif; ?>
<div class="profile-right-col">
<div class="profile-section-header">Insigne Équipé</div>
<div class="badge-info-section">
<?php if (!empty($user['badge_image'])): ?>
<img src="<?php echo htmlspecialchars($user['badge_image']); ?>?v=<?php echo time(); ?>" class="badge-img-display" title="<?php echo htmlspecialchars($user['badge_name']); ?>">
<span class="badge-name-display"><?php echo htmlspecialchars($user['badge_name']); ?></span>
<?php else: ?>
<div style="width: 80px; height: 80px; display: flex; align-items: center; justify-content: center; opacity: 0.2; margin-bottom: 15px;">
<i class="fa-solid fa-medal fa-3x"></i>
</div>
<span class="badge-name-display" style="opacity: 0.5; font-style: italic;">Aucun insigne</span>
<?php endif; ?>
</div>
</div>
</div>
<?php else: ?>
<div style="text-align: center; padding: 20px;">
<div style="text-align: center; padding: 40px; background: rgba(0,0,0,0.5);">
<i class="fa-solid fa-user-slash" style="font-size: 48px; color: #bf616a; margin-bottom: 20px;"></i>
<h2 style="color: #fff;">Joueur introuvable</h2>
<h2 style="color: #fff; text-transform: uppercase;">Joueur introuvable</h2>
</div>
<?php endif; ?>
<?php exit; endif; ?>