- Default language Spanish at root /, English moves to /en/ (eu unchanged):
getStaticPaths {lang:undefined}->es + LANG_*_PATH maps swapped in ui.ts.
- Section order: hero -> join -> status -> members -> mods -> features.
- Join flow 3 -> 2 steps (drop the Connect/IP step; launcher handles the
address). Remove the hero IP CopyChip. Header CTA renamed Play/Jugar/Jolastu
and gains Register + Login links on all four pages.
- Account page: hide the whole login block once authenticated (not just the
form), add an avatar Refresh button (cache-busted NMSR re-fetch), flatten the
avatar (no bevel). New i18n key account.refresh.
- Register page: new REGISTRATION_SHOW_INVITE env (default false/hidden) toggles
the invite-code field independently of the REGISTRATION_MODE backend gate.
- Members roster: drop the `admin` account, render full-body via a new
ROSTER_AVATAR_MODE (default fullbodyiso); portrait tiles.
- Style: flatten emboss on feature icons (.picon) + player tiles (.roster-tile).
PixelIcon gains optional image support (/icons/<name>.png|svg).
- Favicon now /favicon.png (committed) on all pages.
- Docs: plan/09-landing.md Assets section (logo/favicon/features-icons drop
points) + default-language note; .env.example documents the two new vars.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
28 lines
1.1 KiB
Plaintext
28 lines
1.1 KiB
Plaintext
---
|
|
// Feature icon. Default: a 7x7 procedural glyph (styled by .picon in main.css).
|
|
// Optional: pass `img` (an absolute path like "/icons/foo.png|svg" under
|
|
// landing/public/) to render a custom image instead of a glyph.
|
|
interface Props {
|
|
glyph: "shield" | "diamond" | "orb" | "heart";
|
|
gold?: boolean;
|
|
img?: string; // custom icon path in /public/icons/ — overrides the glyph
|
|
}
|
|
const { glyph, gold = false, img } = Astro.props;
|
|
|
|
const GLYPHS: Record<Props["glyph"], string[]> = {
|
|
shield: ["0111110", "1111111", "1111111", "1111111", "0111110", "0011100", "0001000"],
|
|
diamond: ["0001000", "0011100", "0111110", "1111111", "0111110", "0011100", "0001000"],
|
|
orb: ["0011100", "0111110", "1111111", "1111111", "1111111", "0111110", "0011100"],
|
|
heart: ["0110110", "1111111", "1111111", "1111111", "0111110", "0011100", "0001000"],
|
|
};
|
|
const cells = GLYPHS[glyph].join("").split("");
|
|
const onClass = gold ? "go" : "on";
|
|
---
|
|
{img ? (
|
|
<img class="picon-img" src={img} alt="" aria-hidden="true" width="52" height="52" />
|
|
) : (
|
|
<div class="picon" aria-hidden="true">
|
|
{cells.map((c) => <i class={c === "1" ? onClass : undefined} />)}
|
|
</div>
|
|
)}
|