Ban Yaro Blues — Hymne in der WELT-Welt

Eigener Song (KI-Demo via Suno) als Marken-Hymne. Dezente Player-Karte unter
dem Tageszitat; preload=none → 6 MB MP3 lädt erst bei Play, der SW cacht sie
danach für offline. Der Banner ist einmalige Einladung und verschwindet nach
erstem Hören (durchgehört oder >30s + Pause); danach dezenter runder Play-Button
unten links als Gegenspieler zum FAB, nur in WELT. Audio-Element zentral in
index.html → übersteht Welt-Wechsel & Re-Renders.

„Gehört" wird hybrid gemerkt: localStorage (sofort/offline) + DB-Flag
anthem_heard am User (neue Spalte, über /auth/me, gesetzt via
POST /api/profile/anthem-heard) — geräte- und deploy-übergreifend, damit der
Banner nicht erneut nervt.
This commit is contained in:
rene 2026-06-14 21:33:23 +02:00
parent f7370028da
commit d0a76e1b54
11 changed files with 149 additions and 18 deletions

View file

@ -86,14 +86,14 @@
<title>Ban Yaro</title>
<!-- Theme + theme-color Statusleiste vor CSS setzen -->
<script src="/js/boot-early.js?v=1292"></script>
<script src="/js/boot-early.js?v=1295"></script>
<!-- CSS: Reihenfolge ist wichtig — ?v= zwingt Browser zur Neuladung -->
<link rel="stylesheet" href="/css/design-system.css?v=1292">
<link rel="stylesheet" href="/css/layout.css?v=1292">
<link rel="stylesheet" href="/css/components.css?v=1292">
<link rel="stylesheet" href="/css/utilities.css?v=1292">
<link rel="stylesheet" href="/css/lists.css?v=1292">
<link rel="stylesheet" href="/css/design-system.css?v=1295">
<link rel="stylesheet" href="/css/layout.css?v=1295">
<link rel="stylesheet" href="/css/components.css?v=1295">
<link rel="stylesheet" href="/css/utilities.css?v=1295">
<link rel="stylesheet" href="/css/lists.css?v=1295">
</head>
<body>
@ -596,6 +596,10 @@
<div class="world-panel" id="wp-hund"><div id="wh-content"></div></div>
<div class="world-panel" id="wp-welt"><div id="ww-content"></div></div>
</div>
<button id="worlds-anthem" class="hidden" aria-label="Hymne abspielen" title="Ban Yaro Blues — unsere Hymne">
<svg class="ph-icon" aria-hidden="true" style="width:22px;height:22px"><use href="/icons/phosphor.svg#play"></use></svg>
</button>
<audio id="anthem-audio" src="/sounds/ban-yaro-blues.mp3" preload="none"></audio>
<button id="worlds-fab" aria-label="Hinzufügen">
<svg class="offline-paw" viewBox="0 0 256 256" aria-hidden="true" style="width:24px;height:24px">
<!-- 5 Sub-Pfade einzeln einfärbbar via .paw-elem; Default: weiß auf orange -->
@ -620,12 +624,12 @@
<div id="modal-container"></div>
<!-- JS: Reihenfolge ist wichtig — erst Basis, dann Features -->
<script src="/js/api.js?v=1292"></script>
<script src="/js/ui.js?v=1292"></script>
<script src="/js/app.js?v=1292"></script>
<script src="/js/worlds.js?v=1292"></script>
<script src="/js/offline-indicator.js?v=1292"></script>
<script src="/js/contact-form.js?v=1292"></script>
<script src="/js/api.js?v=1295"></script>
<script src="/js/ui.js?v=1295"></script>
<script src="/js/app.js?v=1295"></script>
<script src="/js/worlds.js?v=1295"></script>
<script src="/js/offline-indicator.js?v=1295"></script>
<script src="/js/contact-form.js?v=1295"></script>
<!-- Feature-Seiten werden lazy geladen -->
@ -635,7 +639,7 @@
<!-- Boot: Offline-Banner + SW-Registration (extrahiert für CSP) -->
<script src="/js/boot.js?v=1292"></script>
<script src="/js/boot.js?v=1295"></script>
</body>