Bug Fixes und Icons Refactioring

This commit is contained in:
2026-03-24 08:02:57 +01:00
parent b63af50786
commit b85245717c
17 changed files with 2277 additions and 1936 deletions

View File

@@ -1,32 +1,49 @@
/**
* Zentrale Icon-Verwaltung XXX The Game
* Alle Emojis und Symbole der App werden hier definiert.
* Typen: emoji (Standard-Emoji), symbol (Unicode-Symbol), image (Pfad zu Bilddatei)
*
* Typen:
* emoji Standard-Emoji oder Unicode-Zeichen (value: string)
* symbol Unicode-Symbol (value: string)
* image Pfad zu einer Bilddatei (value: string)
* compound Doppel-Icon: base-Icon + kleines Overlay-Icon (bottom-right)
* Felder: base { type, value }, overlay { type, value }
* base kann emoji, symbol oder image sein.
*/
window.ICONS = {
// ── Navigation / Sidebar ──
HOME: { type: 'emoji', value: '' },
VANILLA: { type: 'symbol', value: '' },
BDSM: { type: 'symbol', value: '' },
CHASTITY: { type: 'symbol', value: '' },
// ── Navigation / Sidebar ──────────────────────────────────────────────
HOME: { type: 'emoji', value: '🏠' },
VANILLA: { type: 'emoji', value: '' },
BDSM: { type: 'emoji', value: '⛓️' },
CHASTITY: { type: 'emoji', value: '🔒' },
// ── Aktionen ──
PLAY_NEW: { type: 'symbol', value: '' },
PLAY_ACTIVE: { type: 'symbol', value: '▶' },
// ── Aktionen ──────────────────────────────────────────────────────────
PLAY_NEW: { type: 'emoji', value: '🆕' },
PLAY_ACTIVE: { type: 'emoji', value: '▶' },
ACTIVE_LOCK: { type: 'emoji', value: '▶️' },
WAITING: { type: 'emoji', value: '⏳' },
CHECK: { type: 'symbol', value: '' },
DISCOVER: { type: 'symbol', value: '' },
ARROW: { type: 'symbol', value: '' },
CHECK: { type: 'emoji', value: '' },
DISCOVER: { type: 'emoji', value: '🗺️' },
ARROW: { type: 'emoji', value: '▶️' },
// ── Chastity Game ──
// ── UI-Symbole ────────────────────────────────────────────────────────
CLOSE: { type: 'symbol', value: '✕' }, // Schließen / Ablehnen / Löschen
CONFIRM: { type: 'symbol', value: '✓' }, // Bestätigen / Abschließen / Annehmen
LIKE: { type: 'symbol', value: '♥' }, // Like-Button
AVATAR: { type: 'symbol', value: '◉' }, // Avatar-Platzhalter (kein Bild)
ERROR: { type: 'emoji', value: '❌' }, // Fehlerzustand
TIMER: { type: 'emoji', value: '⏱️' }, // Zeitanzeige / Stoppuhr
LIGHTNING: { type: 'emoji', value: '⚡' }, // Aktion (z. B. Zeit entfernen)
EMOJI_PICKER: { type: 'emoji', value: '😊' }, // Emoji-Picker öffnen
REMOVE: { type: 'symbol', value: '⊗' }, // Eintrag/Spiel entfernen
// ── Chastity Game ─────────────────────────────────────────────────────
NEW_LOCK: { type: 'emoji', value: '🆕' },
LOCK: { type: 'emoji', value: '🔒' },
KEY: { type: 'emoji', value: '🔑' },
HISTORY: { type: 'emoji', value: '🔙' },
VOTES: { type: 'emoji', value: '🗳️' },
// ── Social ──
// ── Social ────────────────────────────────────────────────────────────
FEED: { type: 'emoji', value: '📰' },
SEARCH: { type: 'emoji', value: '🔍' },
FRIENDS: { type: 'emoji', value: '❤️' },
@@ -35,14 +52,79 @@ window.ICONS = {
GROUPS: { type: 'emoji', value: '👥' },
INVITATIONS: { type: 'emoji', value: '✨' },
SETTINGS: { type: 'emoji', value: '⚙️' },
LOGOUT: { type: 'symbol', value: '⏏' },
PROFILE: { type: 'symbol', value: '' },
LOGOUT: { type: 'emoji', value: '⏏' },
PROFILE: { type: 'emoji', value: '👤' },
// ── Aufgaben / Items ──
TOYS: { type: 'symbol', value: '' },
// ── Aufgaben / Items ──────────────────────────────────────────────────
TOYS: { type: 'emoji', value: '' },
// ── Spielhistorie Spieltypen ────────────────────────────────────────
// Einfache Spieltypen
GAME_BDSM: { type: 'emoji', value: '⛓️' },
GAME_VANILLA: { type: 'emoji', value: '❤️' },
// Doppel-Icons: großes Basis-Icon + kleines 🔒-Overlay
GAME_CARDLOCK: {
type: 'compound',
base: { type: 'image', value: '/img/card.png' },
overlay: { type: 'emoji', value: '🔒' }
},
GAME_TIMELOCK: {
type: 'compound',
base: { type: 'emoji', value: '⏰' },
overlay: { type: 'emoji', value: '🔒' }
},
// ── Spielhistorie Rollen-Badges ─────────────────────────────────────
ROLE_KEYHOLDER: { type: 'emoji', value: '🔑' },
ROLE_LOCKEE: { type: 'emoji', value: '🔒' },
};
/** Gibt nur den Wert (String) zurück für einfache Einbindung in Templates */
// ── Hilfsfunktionen ───────────────────────────────────────────────────────────
/** Gibt den rohen Wert-String zurück (nur für einfache Icons; '' für compound). */
window.IC = function(key) {
return (window.ICONS[key] || {}).value || '';
const icon = window.ICONS[key];
return (icon && icon.type !== 'compound') ? (icon.value || '') : '';
};
/**
* Gibt ein fertiges HTML-Fragment zurück, das das Icon darstellt.
*
* @param {string} key Schlüssel aus window.ICONS
* @param {number} [size] Basisgröße in rem (Standard: 2.7)
* @returns {string} HTML-String
*/
window.IChtml = function(key, size) {
const icon = window.ICONS[key];
if (!icon) return '';
return _iconToHtml(icon, size != null ? size : 2.7);
};
function _iconToHtml(icon, size) {
switch (icon.type) {
case 'emoji':
case 'symbol':
return `<span style="font-size:${size}rem;line-height:1;">${icon.value}</span>`;
case 'image':
return `<img src="${icon.value}" style="width:${size}rem;height:${size}rem;object-fit:contain;display:block;" alt="">`;
case 'compound': {
const baseHtml = _compoundBase(icon.base, size);
const overlayHtml = _compoundOverlay(icon.overlay, size * 0.48);
return `<span style="position:relative;display:inline-block;line-height:1;">${baseHtml}${overlayHtml}</span>`;
}
default:
return '';
}
}
function _compoundBase(base, size) {
if (base.type === 'image') {
return `<img src="${base.value}" style="width:${size}rem;height:${size}rem;object-fit:contain;display:block;" alt="">`;
}
return `<span style="font-size:${size}rem;line-height:1;">${base.value}</span>`;
}
function _compoundOverlay(overlay, size) {
return `<span style="position:absolute;bottom:-2px;right:-4px;font-size:${size.toFixed(2)}rem;line-height:1;">${overlay.value}</span>`;
}