feat: randomize community clans section

This commit is contained in:
devRaGonSa
2026-03-21 00:32:37 +01:00
parent 566a5d0296
commit 0917a0be1f
10 changed files with 287 additions and 56 deletions

View File

@@ -790,6 +790,14 @@ h2 {
background: linear-gradient(180deg, rgba(19, 24, 16, 0.82), rgba(10, 13, 9, 0.66));
}
.clan-card__logo--wide {
padding-inline: 8px;
}
.clan-card__logo--shield {
padding-inline: 18px;
}
.clan-card__logo img {
width: auto;
height: auto;
@@ -798,6 +806,29 @@ h2 {
object-fit: contain;
}
.clan-card__logo-placeholder {
width: 100%;
min-height: 84px;
display: grid;
place-items: center;
border: 1px dashed rgba(210, 182, 118, 0.22);
border-radius: 14px;
background:
linear-gradient(180deg, rgba(28, 32, 24, 0.88), rgba(12, 15, 11, 0.7)),
repeating-linear-gradient(
135deg,
rgba(255, 255, 255, 0.02) 0,
rgba(255, 255, 255, 0.02) 10px,
transparent 10px,
transparent 20px
);
color: var(--accent-warm);
font-size: 0.88rem;
font-weight: 700;
letter-spacing: 0.18em;
text-transform: uppercase;
}
.clan-card__copy {
display: grid;
gap: 8px;
@@ -831,6 +862,14 @@ h2 {
min-width: 180px;
}
.server-action-link--disabled {
border-color: rgba(159, 168, 141, 0.18);
background: linear-gradient(180deg, rgba(42, 46, 39, 0.5), rgba(19, 22, 17, 0.7));
color: var(--muted);
cursor: default;
pointer-events: none;
}
@media (max-width: 1120px) {
.hero__brand {
grid-template-columns: 1fr;
@@ -947,6 +986,10 @@ h2 {
justify-items: start;
}
.clan-card__logo {
width: 100%;
}
.clan-card__link {
width: 100%;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 MiB

View File

@@ -6,13 +6,70 @@ const SERVER_HISTORY_URLS = Object.freeze({
});
const COMMUNITY_CLANS = Object.freeze([
{
name: "Comunidad Hispana HLL Vietnam",
badge: "Comunidad anfitriona",
name: "LCM",
badge: "Comunidad aliada",
description:
"Punto principal de reunion para escuadras, anuncios y acceso directo al Discord del proyecto.",
logoSrc: "./assets/img/logo.png",
logoAlt: "Logo de Comunidad Hispana HLL Vietnam",
discordUrl: "https://discord.com/invite/PedEqZ2Xsa",
"Clan visible dentro de la red comunitaria hispana con acceso confirmado a Discord.",
logoSrc: "./assets/img/clans/lcm.png",
logoAlt: "Logo de LCM",
logoClassName: "",
discordUrl: "https://discord.gg/9F9S353QZv",
discordLabel: "Abrir Discord",
},
{
name: "La 129",
badge: "Discord pendiente",
description:
"Presencia confirmada para la seccion comunitaria mientras se publica su acceso definitivo.",
logoSrc: "./assets/img/clans/la129.png",
logoAlt: "Logo de La 129",
logoClassName: "clan-card__logo--wide",
discordUrl: "",
discordLabel: "Proximamente",
},
{
name: "250 Hispania",
badge: "Comunidad aliada",
description:
"Entrada mostrada con su emblema principal y acceso confirmado al Discord compartido.",
logoSrc: "./assets/img/clans/250hispania-shield.png",
logoAlt: "Escudo de 250 Hispania",
logoClassName: "clan-card__logo--shield",
discordUrl: "https://discord.gg/3E62Yb6Aw3",
discordLabel: "Abrir Discord",
},
{
name: "H9H",
badge: "Logo pendiente",
description:
"Comunidad incluida en la rotacion mientras se incorpora su identidad visual final.",
logoSrc: "",
logoAlt: "",
logoClassName: "",
discordUrl: "https://discord.gg/tYnXK7MQjB",
discordLabel: "Abrir Discord",
placeholderLabel: "H9H",
},
{
name: "BxB",
badge: "Discord pendiente",
description:
"Clan incorporado a la red visible con su emblema actual y enlace aun por confirmar.",
logoSrc: "./assets/img/clans/bxb.png",
logoAlt: "Logo de BxB",
logoClassName: "",
discordUrl: "",
discordLabel: "Proximamente",
},
{
name: "7dv",
badge: "Comunidad aliada",
description:
"Entrada activa dentro de la seccion con acceso disponible a su Discord comunitario.",
logoSrc: "./assets/img/clans/7dv.png",
logoAlt: "Logo de 7dv",
logoClassName: "",
discordUrl: "https://discord.gg/3sxNQZwrg6",
discordLabel: "Abrir Discord",
},
]);
@@ -246,37 +303,78 @@ function hydrateCommunityClans(listNode) {
return;
}
listNode.innerHTML = COMMUNITY_CLANS.map((clan) => renderCommunityClanCard(clan)).join("");
listNode.innerHTML = shuffleItems(COMMUNITY_CLANS)
.map((clan) => renderCommunityClanCard(clan))
.join("");
}
function renderCommunityClanCard(clan) {
const logoMarkup = renderClanLogo(clan);
const discordMarkup = renderClanDiscordLink(clan);
return `
<article class="clan-card">
<div class="clan-card__brand">
<div class="clan-card__logo">
<img
src="${escapeHtml(clan.logoSrc)}"
alt="${escapeHtml(clan.logoAlt)}"
width="1024"
height="1044"
decoding="async"
/>
</div>
${logoMarkup}
<div class="clan-card__copy">
<p class="clan-card__eyebrow">${escapeHtml(clan.badge)}</p>
<h3>${escapeHtml(clan.name)}</h3>
<p>${escapeHtml(clan.description)}</p>
</div>
</div>
<a
class="server-action-link clan-card__link"
href="${escapeHtml(clan.discordUrl)}"
target="_blank"
rel="noreferrer"
${discordMarkup}
</article>
`;
}
function renderClanLogo(clan) {
const logoClassNames = ["clan-card__logo"];
if (clan.logoClassName) {
logoClassNames.push(clan.logoClassName);
}
if (clan.logoSrc) {
return `
<div class="${escapeHtml(logoClassNames.join(" "))}">
<img
src="${escapeHtml(clan.logoSrc)}"
alt="${escapeHtml(clan.logoAlt)}"
decoding="async"
/>
</div>
`;
}
return `
<div class="${escapeHtml(logoClassNames.join(" "))}">
<div class="clan-card__logo-placeholder" aria-label="Logo pendiente de ${escapeHtml(clan.name)}">
${escapeHtml(clan.placeholderLabel || clan.name)}
</div>
</div>
`;
}
function renderClanDiscordLink(clan) {
if (!clan.discordUrl) {
return `
<span
class="server-action-link server-action-link--disabled clan-card__link"
aria-disabled="true"
>
${escapeHtml(clan.discordLabel)}
</a>
</article>
</span>
`;
}
return `
<a
class="server-action-link clan-card__link"
href="${escapeHtml(clan.discordUrl)}"
target="_blank"
rel="noreferrer"
>
${escapeHtml(clan.discordLabel)}
</a>
`;
}
@@ -384,6 +482,19 @@ async function fetchJson(url) {
return response.json();
}
function shuffleItems(items) {
const shuffledItems = [...items];
for (let currentIndex = shuffledItems.length - 1; currentIndex > 0; currentIndex -= 1) {
const randomIndex = Math.floor(Math.random() * (currentIndex + 1));
[shuffledItems[currentIndex], shuffledItems[randomIndex]] = [
shuffledItems[randomIndex],
shuffledItems[currentIndex],
];
}
return shuffledItems;
}
function escapeHtml(value) {
return String(value)
.replaceAll("&", "&amp;")

View File

@@ -172,40 +172,10 @@
<h2 id="clans-title">Red de comunidad</h2>
</div>
<p class="panel__intro">
Espacio para mantener visibles las comunidades y clanes con los que
compartimos actividad, eventos o coordinacion en Discord.
Clanes y comunidades activas de la escena hispana con presencia
confirmada o en preparacion para esta red compartida.
</p>
<div class="clans-grid" id="community-clans-list">
<article class="clan-card">
<div class="clan-card__brand">
<div class="clan-card__logo">
<img
src="./assets/img/logo.png"
alt="Logo de Comunidad Hispana HLL Vietnam"
width="1024"
height="1044"
decoding="async"
/>
</div>
<div class="clan-card__copy">
<p class="clan-card__eyebrow">Comunidad anfitriona</p>
<h3>Comunidad Hispana HLL Vietnam</h3>
<p>
Punto principal de reunion para escuadras, anuncios y acceso
directo al Discord del proyecto.
</p>
</div>
</div>
<a
class="server-action-link clan-card__link"
href="https://discord.com/invite/PedEqZ2Xsa"
target="_blank"
rel="noreferrer"
>
Abrir Discord
</a>
</article>
</div>
<div class="clans-grid" id="community-clans-list"></div>
</div>
</section>
</main>