mirror of
https://github.com/amiayweb/Hytale-F2P.git
synced 2026-02-26 13:51:46 -03:00
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:
@@ -217,32 +217,16 @@
|
|||||||
</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>
|
<span>FEATURED SERVERS</span>
|
||||||
<span>FEATURED SERVERS</span>
|
</h2>
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div id="featuredServersList" class="featured-list">
|
|
||||||
<div class="loading-spinner">
|
|
||||||
<i class="fas fa-spinner fa-spin fa-2x"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div id="featuredServersList" class="featured-list">
|
||||||
<div class="featured-right">
|
<div class="loading-spinner">
|
||||||
<div class="featured-header">
|
<i class="fas fa-spinner fa-spin fa-2x"></i>
|
||||||
<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>
|
||||||
|
|||||||
@@ -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>
|
||||||
<button class="copy-address-btn" onclick="copyServerAddress('${escapedAddress}', this)">
|
<div class="server-action-buttons">
|
||||||
<i class="fas fa-copy"></i>
|
<button class="copy-address-btn" onclick="copyServerAddress('${escapedAddress}', this)">
|
||||||
<span>Copy</span>
|
<i class="fas fa-copy"></i>
|
||||||
</button>
|
<span>Copy</span>
|
||||||
|
</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) => {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user