feat(landing): link files. share from nav + hero

Read-only file browse was only reachable by typing the URL. Add
site.filesUrl (files.${BASE_DOMAIN}) plus nav/hero labels in en/es/eu,
and surface it as a nav link and a secondary hero CTA beside "Cómo entrar".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
oierandClaude Opus 5 committed 2026-07-24 21:01:32 +02:00
1 parent 16523e4f62
commit 6b317d179a
3 files changed
+14 -4

No files matched your search

+4
View File
@@ -161,6 +161,10 @@ export const site = {
// Uptime Kuma status page (external link in footer).
statusUrl: `https://status.${BASE_DOMAIN}`,
// Public read-only file share (caddy file_server browse of FILES_DATA_DIR).
// Linked from the nav + hero. Uploads live at upload.${BASE_DOMAIN} (auth'd).
filesUrl: `https://files.${BASE_DOMAIN}`,
// Live server card (ServerCard.astro). `slots` is the SSG fallback cap shown
// before/without JS; live data comes from our SELF-HOSTED mc-status service
// (docker/mc-status, mcutil wrapper) reverse-proxied same-origin at the apex
+8 -4
View File
@@ -35,13 +35,14 @@ export const LANG_ACCOUNT_PATH: Record<Lang, string> = {
export interface UI {
htmlLang: string;
copied: string; // transient copy-button feedback
nav: { status: string; members: string; features: string; mods: string; join: string; play: string; register: string; login: string };
nav: { status: string; members: string; features: string; mods: string; join: string; files: string; play: string; register: string; login: string };
hero: {
eyebrow: string; // "Modded LAN · NeoForge" — version appended at render
tagline: string;
sub: string;
copyIp: string;
howToJoin: string;
files: string;
metaModpack: string;
};
status: {
@@ -182,7 +183,7 @@ export const ui: Record<Lang, UI> = {
en: {
htmlLang: "en",
copied: "Copied!",
nav: { status: "Status", members: "Members", features: "Features", mods: "Mods", join: "How to Join", play: "Play", register: "Register", login: "Account" },
nav: { status: "Status", members: "Members", features: "Features", mods: "Mods", join: "How to Join", files: "Files", play: "Play", register: "Register", login: "Account" },
hero: {
eyebrow: "Modded LAN · NeoForge",
tagline: "Kitchen-sink survival, built to outlast the weekend.",
@@ -192,6 +193,7 @@ export const ui: Record<Lang, UI> = {
"import the pack, dig in.",
copyIp: "Copy IP",
howToJoin: "How to Join",
files: "Files",
metaModpack: "NeoForge modpack",
},
status: {
@@ -363,7 +365,7 @@ export const ui: Record<Lang, UI> = {
es: {
htmlLang: "es",
copied: "¡Copiado!",
nav: { status: "Estado", members: "Miembros", features: "Características", mods: "Mods", join: "Cómo entrar", play: "Jugar", register: "Registro", login: "Cuenta" },
nav: { status: "Estado", members: "Miembros", features: "Características", mods: "Mods", join: "Cómo entrar", files: "Archivos", play: "Jugar", register: "Registro", login: "Cuenta" },
hero: {
eyebrow: "LAN con mods · NeoForge",
tagline: "Supervivencia todo incluido, para durar más que el finde.",
@@ -373,6 +375,7 @@ export const ui: Record<Lang, UI> = {
"clic. Copia la dirección, importa el pack y a cavar.",
copyIp: "Copiar IP",
howToJoin: "Cómo entrar",
files: "Archivos",
metaModpack: "Pack NeoForge",
},
status: {
@@ -544,7 +547,7 @@ export const ui: Record<Lang, UI> = {
eu: {
htmlLang: "eu",
copied: "Kopiatuta!",
nav: { status: "Egoera", members: "Kideak", features: "Ezaugarriak", mods: "Mods", join: "Nola sartu", play: "Jolastu", register: "Erregistroa", login: "Kontua" },
nav: { status: "Egoera", members: "Kideak", features: "Ezaugarriak", mods: "Mods", join: "Nola sartu", files: "Fitxategiak", play: "Jolastu", register: "Erregistroa", login: "Kontua" },
hero: {
eyebrow: "Mod-dun LANa · NeoForge",
tagline: "Mod ugariko biziraupena, irauteko egina.",
@@ -554,6 +557,7 @@ export const ui: Record<Lang, UI> = {
"Hartu helbidea, inportatu packa eta hasi zulatzen.",
copyIp: "Kopiatu IPa",
howToJoin: "Nola sartu",
files: "Fitxategiak",
metaModpack: "NeoForge packa",
},
status: {
+2
View File
@@ -70,6 +70,7 @@ const dustBits = Array.from({ length: 16 }, (_, i) => {
</a>
<nav class="nav-links">
<a href="#join">{t.nav.join}</a>
<a href={site.filesUrl} target="_blank" rel="noopener">{t.nav.files}</a>
<a href="#status">{t.nav.status}</a>
</nav>
<span class="nav-spacer"></span>
@@ -106,6 +107,7 @@ const dustBits = Array.from({ length: 16 }, (_, i) => {
<p class="hero-sub">{t.hero.sub}</p>
<div class="hero-ip-row">
<a class="mc-btn primary" href="#join">{t.hero.howToJoin}</a>
<a class="mc-btn" href={site.filesUrl} target="_blank" rel="noopener">{t.hero.files}</a>
</div>
<div class="hero-meta">
<span>Java {site.mcVersion}</span>