Webinterface: Emojis durch Lucide-Icons ersetzt
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Emojis werden vom Betriebssystem gerendert — auf Windows, Mac und Android
sehen sie unterschiedlich aus, und sie sind bunt. Im streng zweifarbigen
D4RKST3R-Look stachen sie entsprechend heraus.

Jetzt kommen die Symbole aus einem einzigen Set (Lucide, dünne Outlines),
zentral in src/icons.jsx gebündelt: eine Größe, eine Strichstärke, überall
gleich — und sie erben die Textfarbe, sind also Teil der Marke statt
Fremdkörper. Betroffen sind Navigation, Startseite, Server, Roadmap,
Profil, Level, Galerie, Devlogs, Lightbox, Composer und alle Setup-Tabs.

Bewusst Emojis geblieben sind:
- die Spiel-Presets der Server (landen als Icon im Discord-Embed)
- Rollen-Menü-Emojis und Platzhalter für Discord-Inhalte
- beschreibende Hinweise wie „🔔-Button am Post" oder „🟢/🔴 im Embed",
  die zeigen, wie etwas in Discord aussehen wird
- die selbst gepflegten Dienst-Icons im Portal

Dazu Detailarbeit: Server-Status als farbiger Punkt statt Emoji, Platz 1–3
der Bestenliste als Pokal in Gold/Silber/Bronze, Pagination mit Chevrons.
Bundle wächst um 19 kB (Tree-Shaking greift, nur die ~70 genutzten Icons).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 14:37:25 +02:00
co-authored by Claude Fable 5
parent 6daa1f7d43
commit 1afbe9d238
20 changed files with 295 additions and 79 deletions
+10 -5
View File
@@ -3,6 +3,7 @@
import { useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { apiGet, apiPost, apiDelete } from '../api.js';
import { IconCheck, IconMagic } from '../icons.jsx';
function fmtDate(iso) {
if (!iso) return '—';
@@ -52,10 +53,10 @@ export default function Profil({ me }) {
try {
const res = await apiDelete('/api/profile');
const total = Object.values(res.deleted).reduce((a, b) => a + b, 0);
setWipeMsg(` ${total} Einträge gelöscht.`);
setWipeMsg(` ${total} Einträge gelöscht.`);
apiGet('/api/profile').then(setProfile).catch(() => {});
} catch {
setWipeMsg('⚠️ Löschen fehlgeschlagen — melde dich bitte beim Team.');
setWipeMsg(' Löschen fehlgeschlagen — melde dich bitte beim Team.');
}
}
@@ -96,7 +97,7 @@ export default function Profil({ me }) {
</section>
<section className="content">
{error && <p className="notice"> {error}</p>}
{error && <p className="notice"> {error}</p>}
{!profile && !error && <p className="notice">Lade </p>}
{profile && (
@@ -108,7 +109,9 @@ export default function Profil({ me }) {
<h2 className="profile-name">{profile.user.displayName}</h2>
<p className="profile-meta">
Dabei seit {fmtDate(profile.user.joinedAt)}
{profile.playtester && <span className="profile-badge">🧪 Playtester</span>}
{profile.playtester && (
<span className="profile-badge with-icon"><IconMagic size={14} /> Playtester</span>
)}
</p>
{profile.roles.length > 0 && (
<div className="profile-roles">
@@ -145,7 +148,9 @@ export default function Profil({ me }) {
<h2 className="settings-title">// Dein Alpha-Key</h2>
<div className="field-row">
<code className="alpha-key">{profile.alphaKey}</code>
<button className="btn btn-mini" onClick={copyKey}>{copied ? '✓ Kopiert' : 'Kopieren'}</button>
<button className="btn btn-mini" onClick={copyKey}>
{copied ? <span className="with-icon"><IconCheck size={13} /> Kopiert</span> : 'Kopieren'}
</button>
</div>
</div>
)}