Improve featured servers layout with Discord integration

- Add Discord button to server cards when discord link is present in API data
- Remove HF2P Servers section to use full width for featured servers
- Increase server card size (300x180px banner, larger fonts and spacing)
- Simplify layout from 2-column grid to single full-width container
- Discord button opens external browser with server invite link
This commit is contained in:
AMIAY
2026-02-01 18:01:58 +01:00
parent b1d01a2f34
commit d5da9ecb6d
3 changed files with 92 additions and 63 deletions

View File

@@ -217,8 +217,7 @@
</div> </div>
<div id="featured-page" class="page"> <div id="featured-page" class="page">
<div class="featured-layout"> <div class="featured-container">
<div class="featured-left">
<div class="featured-header"> <div class="featured-header">
<h2 class="featured-title"> <h2 class="featured-title">
<i class="fas fa-star mr-2"></i> <i class="fas fa-star mr-2"></i>
@@ -231,21 +230,6 @@
</div> </div>
</div> </div>
</div> </div>
<div class="featured-right">
<div class="featured-header">
<h2 class="featured-title">
<i class="fas fa-server mr-2"></i>
<span>HF2P SERVERS</span>
</h2>
</div>
<div id="myServersList" class="featured-list">
<div class="loading-spinner">
<i class="fas fa-spinner fa-spin fa-2x"></i>
</div>
</div>
</div>
</div>
</div> </div>
<div id="mods-page" class="page"> <div id="mods-page" class="page">

View File

@@ -15,7 +15,6 @@ function escapeHtml(text) {
*/ */
async function loadFeaturedServers() { async function loadFeaturedServers() {
const featuredContainer = document.getElementById('featuredServersList'); const featuredContainer = document.getElementById('featuredServersList');
const myServersContainer = document.getElementById('myServersList');
try { try {
console.log('[FeaturedServers] Fetching from', FEATURED_SERVERS_API); console.log('[FeaturedServers] Fetching from', FEATURED_SERVERS_API);
@@ -54,6 +53,15 @@ async function loadFeaturedServers() {
const escapedName = escapeHtml(server.Name || 'Unknown Server'); const escapedName = escapeHtml(server.Name || 'Unknown Server');
const escapedAddress = escapeHtml(server.Address || ''); const escapedAddress = escapeHtml(server.Address || '');
const bannerUrl = server.img_Banner || 'https://via.placeholder.com/400x240/1e293b/ffffff?text=Server+Banner'; const bannerUrl = server.img_Banner || 'https://via.placeholder.com/400x240/1e293b/ffffff?text=Server+Banner';
const discordUrl = server.discord || '';
// Build Discord button HTML if discord link exists
const discordButton = discordUrl ? `
<button class="server-discord-btn" onclick="openServerDiscord('${discordUrl}')">
<i class="fab fa-discord"></i>
<span>Discord</span>
</button>
` : '';
return ` return `
<div class="featured-server-card"> <div class="featured-server-card">
@@ -67,10 +75,13 @@ async function loadFeaturedServers() {
<h3 class="featured-server-name">${escapedName}</h3> <h3 class="featured-server-name">${escapedName}</h3>
<div class="featured-server-address"> <div class="featured-server-address">
<span class="server-address-text">${escapedAddress}</span> <span class="server-address-text">${escapedAddress}</span>
<div class="server-action-buttons">
<button class="copy-address-btn" onclick="copyServerAddress('${escapedAddress}', this)"> <button class="copy-address-btn" onclick="copyServerAddress('${escapedAddress}', this)">
<i class="fas fa-copy"></i> <i class="fas fa-copy"></i>
<span>Copy</span> <span>Copy</span>
</button> </button>
${discordButton}
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -80,13 +91,6 @@ async function loadFeaturedServers() {
featuredContainer.innerHTML = featuredHTML; featuredContainer.innerHTML = featuredHTML;
} }
// Show "Coming Soon" for my servers
myServersContainer.innerHTML = `
<div style="display: flex; align-items: center; justify-content: center; height: 100%; color: #94a3b8; font-size: 1.2rem;">
<p>Coming Soon</p>
</div>
`;
} catch (error) { } catch (error) {
console.error('[FeaturedServers] Error loading servers:', error); console.error('[FeaturedServers] Error loading servers:', error);
featuredContainer.innerHTML = ` featuredContainer.innerHTML = `
@@ -96,11 +100,6 @@ async function loadFeaturedServers() {
<p style="font-size: 0.9rem; color: #64748b;">${error.message}</p> <p style="font-size: 0.9rem; color: #64748b;">${error.message}</p>
</div> </div>
`; `;
myServersContainer.innerHTML = `
<div style="display: flex; align-items: center; justify-content: center; height: 100%; color: #94a3b8; font-size: 1.2rem;">
<p>Coming Soon</p>
</div>
`;
} }
} }
@@ -151,6 +150,22 @@ async function copyServerAddress(address, button) {
} }
} }
/**
* Open server Discord in external browser
*/
function openServerDiscord(discordUrl) {
try {
console.log('[FeaturedServers] Opening Discord:', discordUrl);
if (window.electronAPI && window.electronAPI.openExternal) {
window.electronAPI.openExternal(discordUrl);
} else {
window.open(discordUrl, '_blank');
}
} catch (error) {
console.error('[FeaturedServers] Failed to open Discord link:', error);
}
}
// Load featured servers when the featured page becomes visible // Load featured servers when the featured page becomes visible
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const observer = new MutationObserver((mutations) => { const observer = new MutationObserver((mutations) => {

View File

@@ -1005,20 +1005,12 @@ body {
} }
/* Featured Servers Styles */ /* Featured Servers Styles */
.featured-layout { .featured-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
height: calc(100vh - 180px);
overflow: hidden;
}
.featured-left,
.featured-right {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: calc(100vh - 180px);
overflow: hidden; overflow: hidden;
min-height: 0; padding: 0 2rem;
} }
.featured-header { .featured-header {
@@ -1074,8 +1066,8 @@ body {
transition: all 0.3s ease; transition: all 0.3s ease;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
display: grid; display: grid;
grid-template-columns: 200px 1fr; grid-template-columns: 300px 1fr;
min-height: 120px; min-height: 180px;
flex-shrink: 0; flex-shrink: 0;
} }
@@ -1086,24 +1078,24 @@ body {
} }
.featured-server-banner { .featured-server-banner {
width: 200px; width: 300px;
height: 100%; height: 100%;
min-height: 120px; min-height: 180px;
object-fit: cover; object-fit: cover;
background: linear-gradient(135deg, #1e293b, #334155); background: linear-gradient(135deg, #1e293b, #334155);
flex-shrink: 0; flex-shrink: 0;
} }
.featured-server-content { .featured-server-content {
padding: 1.25rem; padding: 1.5rem 2rem;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
gap: 0.75rem; gap: 1rem;
} }
.featured-server-name { .featured-server-name {
font-size: 1.15rem; font-size: 1.35rem;
font-weight: 600; font-weight: 600;
color: white; color: white;
line-height: 1.4; line-height: 1.4;
@@ -1118,27 +1110,40 @@ body {
padding: 0.625rem 1rem; padding: 0.625rem 1rem;
border-radius: 6px; border-radius: 6px;
border: 1px solid rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.1);
gap: 1rem;
} }
.server-address-text { .server-address-text {
font-family: 'JetBrains Mono', monospace; font-family: 'JetBrains Mono', monospace;
color: #94a3b8; color: #94a3b8;
font-size: 0.9rem; font-size: 0.9rem;
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.server-action-buttons {
display: flex;
align-items: center;
gap: 0.5rem;
flex-shrink: 0;
} }
.copy-address-btn { .copy-address-btn {
background: linear-gradient(135deg, #9333ea, #7c3aed); background: linear-gradient(135deg, #9333ea, #7c3aed);
color: white; color: white;
border: none; border: none;
padding: 0.5rem 1rem; padding: 0.5rem 0.875rem;
border-radius: 6px; border-radius: 6px;
cursor: pointer; cursor: pointer;
font-size: 0.875rem; font-size: 0.8125rem;
font-weight: 500; font-weight: 500;
transition: all 0.2s ease; transition: all 0.2s ease;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 0.5rem; gap: 0.375rem;
white-space: nowrap; white-space: nowrap;
} }
@@ -1155,6 +1160,31 @@ body {
background: linear-gradient(135deg, #10b981, #059669); background: linear-gradient(135deg, #10b981, #059669);
} }
.server-discord-btn {
background: linear-gradient(135deg, #5865F2, #4752C4);
color: white;
border: none;
padding: 0.5rem 0.875rem;
border-radius: 6px;
cursor: pointer;
font-size: 0.8125rem;
font-weight: 500;
transition: all 0.2s ease;
display: flex;
align-items: center;
gap: 0.375rem;
white-space: nowrap;
}
.server-discord-btn:hover {
background: linear-gradient(135deg, #4752C4, #3c45a5);
transform: scale(1.05);
}
.server-discord-btn:active {
transform: scale(0.95);
}
.loading-spinner { .loading-spinner {
display: flex; display: flex;
flex-direction: column; flex-direction: column;