191 lines
12 KiB
JavaScript
191 lines
12 KiB
JavaScript
/**
|
||
* Zentrale Icon-Verwaltung – XXX The Game
|
||
*
|
||
* 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: 'emoji', value: '⚪' },
|
||
BDSM: { type: 'emoji', value: '⛓️' },
|
||
CHASTITY: { type: 'emoji', value: '🔒' },
|
||
|
||
// ── Aktionen ──────────────────────────────────────────────────────────
|
||
PLAY_NEW: { type: 'emoji', value: '🆕' },
|
||
PLAY_ACTIVE: { type: 'emoji', value: '▶️' },
|
||
ACTIVE_LOCK: { type: 'emoji', value: '▶️' },
|
||
WAITING: { type: 'emoji', value: '⏳' },
|
||
CHECK: { type: 'emoji', value: '✅' },
|
||
DISCOVER: { type: 'emoji', value: '🗺️' },
|
||
ARROW: { type: 'emoji', value: '▶️' },
|
||
REFRESH: { type: 'emoji', value: '🔄' }, // Erneuern / Neu laden
|
||
START: { type: 'emoji', value: '🚀' }, // Starten / Los
|
||
CELEBRATE: { type: 'emoji', value: '🎉' }, // Erfolg / Abschluss
|
||
|
||
// ── 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
|
||
EDIT: { type: 'symbol', value: '✎' }, // Bearbeiten-Button
|
||
TRASH: { type: 'emoji', value: '🗑' }, // Löschen-Button
|
||
WARNING: { type: 'emoji', value: '⚠️' }, // Warnung / Hinweis
|
||
REPORT: { type: 'symbol', value: '⚑' }, // Melden-Button (Flag)
|
||
VISIBILITY: { type: 'emoji', value: '👁' }, // Sichtbar / Details sichtbar
|
||
THUMBS_UP: { type: 'emoji', value: '👍' }, // Upvote / Zustimmung
|
||
THUMBS_DOWN: { type: 'emoji', value: '👎' }, // Downvote / Ablehnung
|
||
ARROW_UP: { type: 'symbol', value: '⬆' }, // Sortierung aufsteigend
|
||
ARROW_DOWN: { type: 'symbol', value: '⬇' }, // Sortierung absteigend
|
||
NAV_PREV: { type: 'symbol', value: '←' }, // Zurück / Vorheriges Bild
|
||
NAV_NEXT: { type: 'symbol', value: '→' }, // Weiter / Nächstes Bild
|
||
CAROUSEL_PREV: { type: 'symbol', value: '‹' }, // Karussell zurück
|
||
CAROUSEL_NEXT: { type: 'symbol', value: '›' }, // Karussell weiter
|
||
TIP: { type: 'emoji', value: '💡' }, // Hinweis / Tipp
|
||
DOT_RED: { type: 'emoji', value: '🔴' }, // Status-Indikator rot
|
||
COMING_SOON: { type: 'emoji', value: '🚧' }, // In Entwicklung / Demnächst
|
||
|
||
// ── Chastity Game ─────────────────────────────────────────────────────
|
||
NEW_LOCK: { type: 'emoji', value: '🆕' },
|
||
LOCK: { type: 'emoji', value: '🔒' },
|
||
UNLOCK: { type: 'emoji', value: '🔓' }, // Entsperren
|
||
LOCKED_SECURE: { type: 'emoji', value: '🔐' }, // Sicher gesperrt (mit Schlüssel)
|
||
KEY: { type: 'emoji', value: '🔑' },
|
||
HISTORY: { type: 'emoji', value: '🔙' },
|
||
VOTES: { type: 'emoji', value: '🗳️' },
|
||
TRUST: { type: 'emoji', value: '🤝' }, // Trust-Lock
|
||
EMERGENCY: { type: 'emoji', value: '🆘' }, // Notfall-Entsperrung
|
||
HYGIENE: { type: 'emoji', value: '🚿' }, // Hygiene-Öffnung
|
||
FROZEN: { type: 'emoji', value: '❄️' }, // Eingefroren (zeitlich)
|
||
FROZEN_HARD: { type: 'emoji', value: '🧊' }, // Eingefroren (unlimitiert)
|
||
UNFREEZE: { type: 'emoji', value: '🌊' }, // Aufgetaut / Unfreeze
|
||
CODE_DIGITS: { type: 'emoji', value: '🔢' }, // Zahlenkombination / PIN-Länge
|
||
|
||
// ── CardLock ──────────────────────────────────────────────────────────
|
||
CARD: { type: 'emoji', value: '🃏' }, // Karte (standalone)
|
||
DICE: { type: 'emoji', value: '🎲' }, // Zufällig / Würfeln
|
||
|
||
// ── TimeLock / Spinning Wheel ──────────────────────────────────────────
|
||
SPINNING_WHEEL: { type: 'emoji', value: '🎡' }, // Glücksrad drehen
|
||
TASK_ACTIVE: { type: 'emoji', value: '🎯' }, // Aktuelle Aufgabe
|
||
CLOCK: { type: 'emoji', value: '🕐' }, // Uhr / Zeitpunkt
|
||
|
||
// ── Social ────────────────────────────────────────────────────────────
|
||
FEED: { type: 'emoji', value: '📰' },
|
||
SEARCH: { type: 'emoji', value: '🔍' },
|
||
FRIENDS: { type: 'emoji', value: '❤️' },
|
||
MESSAGES: { type: 'emoji', value: '💬' },
|
||
NOTIFICATIONS: { type: 'emoji', value: '🔔' },
|
||
GROUPS: { type: 'emoji', value: '👥' },
|
||
INVITATIONS: { type: 'emoji', value: '✨' },
|
||
SETTINGS: { type: 'emoji', value: '⚙️' },
|
||
LOGOUT: { type: 'emoji', value: '⏏️' },
|
||
PROFILE: { type: 'emoji', value: '👤' },
|
||
HELP: { type: 'emoji', value: '❓' },
|
||
CONTACT: { type: 'emoji', value: '✉️' }, // Kontakt / E-Mail
|
||
|
||
// ── Medien / Dateien ──────────────────────────────────────────────────
|
||
PHOTO: { type: 'emoji', value: '📷' }, // Foto / Kamera
|
||
FILE_UPLOAD: { type: 'emoji', value: '📁' }, // Datei auswählen / Upload
|
||
TEMPLATE: { type: 'emoji', value: '📋' }, // Vorlage / Template
|
||
DOCUMENT: { type: 'emoji', value: '📄' }, // Dokument / Impressum
|
||
GUIDE: { type: 'emoji', value: '📖' }, // Anleitung / Hilfeseite
|
||
STATS: { type: 'emoji', value: '📊' }, // Statistik / Umfrage-Ergebnis
|
||
PACKAGE: { type: 'emoji', value: '📦' }, // Paket / Einladung
|
||
MAILBOX: { type: 'emoji', value: '📬' }, // Posteingang (Admin)
|
||
|
||
// ── Abo / Premium ─────────────────────────────────────────────────────
|
||
PREMIUM: { type: 'emoji', value: '⭐' }, // Abonnement / Premium
|
||
TROPHY: { type: 'emoji', value: '🏆' }, // Auszeichnung / Erfolg
|
||
PAYMENT: { type: 'emoji', value: '💳' }, // Zahlung / Abonnement
|
||
|
||
// ── TTLock / Technik ──────────────────────────────────────────────────
|
||
MOBILE: { type: 'emoji', value: '📱' }, // TTLock-App / Mobilgerät
|
||
CONNECTION: { type: 'emoji', value: '🔌' }, // Verbindung / Integration
|
||
GAMEPAD: { type: 'emoji', value: '🕹️' }, // Spielsteuerung
|
||
SHIELD: { type: 'emoji', value: '🛡️' }, // Sicherheit / Datenschutz
|
||
ADMIN_TOOLS: { type: 'emoji', value: '🔧' }, // Admin / Werkzeuge
|
||
|
||
// ── Aufgaben / Items ──────────────────────────────────────────────────
|
||
TOYS: { type: 'emoji', value: '➰' },
|
||
|
||
// ── Spielhistorie – 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: '🔒' },
|
||
};
|
||
|
||
// ── Hilfsfunktionen ───────────────────────────────────────────────────────────
|
||
|
||
/** Gibt den rohen Wert-String zurück (nur für einfache Icons; '' für compound). */
|
||
window.IC = function(key) {
|
||
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>`;
|
||
}
|