Files
AeroMc-Launcher/src/index.html
T

1249 lines
60 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; img-src 'self' data: https:; connect-src 'self';" />
<title>AeroMC</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<!-- Obere Werkzeugleiste (MultiMC-Stil: Icon + Text) -->
<header class="toolbar">
<button id="btn-new" class="tbtn" data-ic="plus" title="Neue Instanz (Strg+N)">Instanz hinzufügen</button>
<button id="btn-import" class="tbtn" data-ic="import" title="Instanzen importieren">Importieren</button>
<button id="btn-open-dir" class="tbtn" data-ic="folder" title="Ordner öffnen">Ordner</button>
<span class="tbsep"></span>
<button id="btn-bedrock" class="tbtn" data-ic="blocks" title="Minecraft Bedrock (Windows-Ausgabe)">Bedrock</button>
<button id="btn-console" class="tbtn" data-ic="terminal" title="Konsole / Log">Konsole</button>
<button id="btn-skin" class="tbtn" data-ic="user" title="Skin-Hintergrund ein/aus">Skin</button>
<span class="tbgrow"></span>
<div class="search-wrap">
<input id="search" type="text" placeholder="Suchen… (Strg+F)" autocomplete="off" title="Strg+F fokussiert die Suche" />
</div>
<button id="btn-account" class="tbtn acct-btn" title="Microsoft-Konto"><span id="account-av" class="acct-av"></span><span id="account-name">Konten</span></button>
<button id="btn-settings" class="tbtn" data-ic="settings" title="Einstellungen">Optionen</button>
</header>
<!-- Arbeitsbereich: Instanzliste + rechte Aktionsleiste -->
<main class="workspace">
<div class="list-area">
<div id="grid" class="list"></div>
<section id="empty" class="empty hidden">
<h2>Noch keine Instanzen</h2>
<p>Lege deine erste Minecraft-Instanz an eigene Version, eigene Mods.</p>
<button id="btn-new-2" class="btn btn-primary btn-lg" data-ic="plus">Erste Instanz anlegen</button>
</section>
</div>
<aside id="inst-panel" class="side">
<div id="p-empty" class="side-empty">Keine Instanz ausgewählt</div>
<div id="p-content" class="hidden">
<div id="p-icon" class="side-ico">🌱</div>
<div id="p-name" class="side-title">Instanz</div>
<div id="p-groupline" class="side-grp">Gruppe ändern</div>
<div class="hr"></div>
<button id="p-play" class="sbtn play">Starten</button>
<button id="p-offline" class="sbtn">Offline starten</button>
<div class="hr"></div>
<button id="p-edit" class="sbtn">Instanz bearbeiten</button>
<button id="p-notes" class="sbtn">Notizen bearbeiten</button>
<button id="p-mods" class="sbtn">Mods anzeigen</button>
<button id="p-worlds" class="sbtn">Welten verwalten</button>
<button id="p-screens" class="sbtn">Bildschirmfotos verwalten</button>
<button id="p-modpack" class="sbtn hidden">Modpack aktualisieren</button>
<button id="p-logs" class="sbtn">Logdateien ansehen</button>
<button id="p-servers" class="sbtn">Server verwalten</button>
<div class="hr"></div>
<button id="p-mcfolder" class="sbtn">Minecraft-Ordner</button>
<button id="p-configfolder" class="sbtn">Konfigurations-Ordner</button>
<button id="p-instfolder" class="sbtn">Instanz-Ordner</button>
<div class="hr"></div>
<button id="p-shortcut" class="sbtn">Verknüpfung erstellen</button>
<button id="p-export" class="sbtn">Instanz exportieren</button>
<button id="p-delete" class="sbtn del" title="Entf">Löschen</button>
<button id="p-copy" class="sbtn">Instanz kopieren</button>
</div>
</aside>
</main>
<!-- Statusleiste (zwei Zeilen, MultiMC-Stil) -->
<footer class="statusbar">
<div class="st-row"><span id="status-left">Bereit</span><span id="status-right"></span></div>
<div class="st-row st-row2">
<span id="status-play">Keine Instanz ausgewählt</span>
<span id="status-auth" class="auth-warn hidden" title="Erneut prüfen"></span>
<span id="status-total"></span>
</div>
</footer>
<!-- ===================== Dialog: Neue/Bearbeiten Instanz ===================== -->
<div id="modal-instance" class="modal hidden">
<div class="modal-card">
<div class="modal-head">
<h3 id="instance-modal-title">Neue Instanz</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<label class="field">
<span>Name</span>
<input id="f-name" type="text" placeholder="z. B. Survival 1.21" />
</label>
<label class="field">
<span>Gruppe <small class="opt">(optional)</small></span>
<input id="f-group" type="text" list="group-list" placeholder="z. B. Modpacks, Server, Tests" autocomplete="off" />
<datalist id="group-list"></datalist>
</label>
<div class="field-row">
<label class="field">
<span>Minecraft-Version</span>
<div class="version-row">
<select id="f-version-type">
<option value="release">Releases</option>
<option value="snapshot">Snapshots</option>
<option value="all">Alle</option>
</select>
<select id="f-version"></select>
</div>
<small id="f-version-hint" class="hint">Lade Versionsliste …</small>
</label>
<label class="field field-icon">
<span>Icon</span>
<select id="f-icon"></select>
<div id="f-icon-grid" class="icon-grid"></div>
<div class="icon-custom">
<span id="f-icon-preview" class="icon-preview hidden"></span>
<button type="button" id="f-pick-image" class="btn btn-mini">🖼 Bild…</button>
<button type="button" id="f-clear-image" class="btn btn-mini hidden"></button>
</div>
</label>
</div>
<div class="field-row">
<label class="field">
<span>Mod-Loader</span>
<select id="f-loader">
<option value="vanilla">Vanilla (ohne Loader)</option>
<option value="fabric">Fabric</option>
<option value="forge">Forge</option>
<option value="neoforge">NeoForge</option>
<option value="quilt">Quilt</option>
</select>
</label>
<label class="field">
<span>Loader-Version <small class="opt">(optional)</small></span>
<select id="f-loader-version"><option value="">neueste (empfohlen)</option></select>
<small id="f-loader-hint" class="hint"></small>
</label>
</div>
<label class="field">
<span>Notizen <small class="opt">(optional)</small></span>
<textarea id="f-notes" rows="2" placeholder="Modliste, Server-IP, To-dos …"></textarea>
</label>
<!-- erweiterte Java-Einstellungen nur im Bearbeiten-Modus sichtbar -->
<fieldset id="f-advanced" class="advanced hidden">
<legend>Java (nur diese Instanz leer = globale Einstellung)</legend>
<div class="field-row">
<label class="field">
<span>RAM min. (MB)</span>
<input id="f-min-mem" type="number" min="512" step="256" placeholder="global" />
</label>
<label class="field">
<span>RAM max. (MB)</span>
<input id="f-max-mem" type="number" min="512" step="256" placeholder="global" />
</label>
</div>
<small id="f-mem-hint" class="hint"></small>
<label class="field">
<span>Java (java.exe)</span>
<div class="path-row">
<input id="f-java" type="text" placeholder="leer = globale Einstellung bzw. automatisch" />
<button id="f-java-pick" class="btn" type="button">Wählen…</button>
</div>
<div class="path-row">
<select id="f-java-detected"><option value=""> gefundene Java-Installationen </option></select>
</div>
<small id="f-java-hint" class="hint"></small>
</label>
<label class="field">
<span>Zusätzliche JVM-Argumente</span>
<div class="path-row">
<input id="f-extra-args" type="text" placeholder="z. B. -XX:+UseG1GC" />
<button id="f-extra-args-aikar" class="btn btn-mini" type="button"
title="Fügt eine bewährte Sammlung von Garbage-Collector-Flags ein (bekannt als „Aikar's Flags"), die bei größeren Modpacks Ruckler durch Garbage Collection reduzieren kann.">GC-Flags einfügen</button>
</div>
</label>
<label class="field">
<span>Pre-Launch-Befehl <small class="opt">(läuft vor dem Start)</small></span>
<input id="f-prelaunch" type="text" placeholder="z. B. echo Start >> spielstart.log" />
</label>
<label class="field">
<span>Post-Exit-Befehl <small class="opt">(nach dem Beenden)</small></span>
<input id="f-postexit" type="text" placeholder="optional" />
</label>
</fieldset>
</div>
<div class="modal-foot">
<button class="btn" data-close>Abbrechen</button>
<button id="btn-save-instance" class="btn btn-primary">Speichern</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Einstellungen ===================== -->
<div id="modal-settings" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<h3>Einstellungen</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body settings-body">
<nav class="settings-nav" aria-label="Einstellungsbereiche">
<div class="settings-nav-label">Bereiche</div>
<button class="snav on" data-pane="pane-general">Allgemein</button>
<button class="snav" data-pane="pane-appearance">Darstellung</button>
<button class="snav" data-pane="pane-minecraft">Spiel</button>
<button class="snav" data-pane="pane-start">Start &amp; Java</button>
<button class="snav" data-pane="pane-network">Netzwerk</button>
<button class="snav" data-pane="pane-accounts">Konten</button>
<button class="snav" data-pane="pane-backup">Backup</button>
<button class="snav" data-pane="pane-info">Info</button>
</nav>
<div class="settings-content">
<div id="pane-general" class="spane">
<div class="settings-hero">
<h4>Allgemein</h4>
<p>Globale Launcher-Optionen, Instanzverwaltung und sichtbare Bereiche.</p>
</div>
<div class="settings-grid">
<section class="settings-card">
<h5>Oberfläche</h5>
<label class="field">
<span>Design</span>
<select id="s-theme">
<option value="dark">Dunkel</option>
<option value="light">Hell</option>
</select>
</label>
<label class="field">
<span>Instanzen sortieren</span>
<select id="s-sortby">
<option value="lastPlayed">Nach letztem Start</option>
<option value="name">Nach Name</option>
</select>
</label>
</section>
<section class="settings-card settings-card-wide">
<h5>Instanzen</h5>
<label class="field">
<span>Instanz-Verzeichnis</span>
<div class="path-row">
<input id="s-instances-dir" type="text" readonly />
<button id="s-pick-dir" class="btn">Wählen…</button>
</div>
<small class="hint">Hier werden alle Instanzen als Unterordner mit ihrem Namen gespeichert.</small>
</label>
</section>
<section class="settings-card">
<h5>Bereiche</h5>
<label class="checkbox-field">
<input id="s-bedrock" type="checkbox" /> <span>Bedrock-Bereich anzeigen</span>
</label>
<small id="s-bedrock-hint" class="hint">Wird automatisch ausgeblendet, wenn Bedrock nicht installiert ist.</small>
</section>
<section class="settings-card">
<h5>Benachrichtigungen</h5>
<label class="checkbox-field">
<input id="s-notify" type="checkbox" /> <span>Windows-Benachrichtigung, wenn ein großer Download oder ein Backup im Hintergrund fertig wird</span>
</label>
<small class="hint">Erscheint nur, während das Launcher-Fenster nicht im Vordergrund ist.</small>
</section>
</div>
</div>
<div id="pane-appearance" class="spane hidden">
<div class="settings-hero">
<h4>Darstellung</h4>
<p>Optik der Oberfläche und visuelle Extras für die Instanzansicht.</p>
</div>
<div class="settings-grid">
<section class="settings-card">
<h5>Icons</h5>
<label class="checkbox-field">
<input id="s-iso3d" type="checkbox" /> <span>Block-Symbole räumlich darstellen (3D)</span>
</label>
</section>
<section class="settings-card settings-card-wide">
<h5>Skin-Hintergrund</h5>
<label class="field">
<span>Quelle <small class="opt">(optional)</small></span>
<select id="s-bgskin"><option value="">Aus</option></select>
<small class="hint">Zeigt den Minecraft-Skin des gewählten Kontos als Hintergrund im Instanzbereich.</small>
</label>
<div class="field-row">
<label class="field">
<span>Pose</span>
<select id="s-bgskin-pose">
<option value="walking">Laufend</option>
<option value="standing">Stehend</option>
<option value="legends">Heldenhaft</option>
<option value="bedwars">Kampfhaltung</option>
<option value="hoverboard">Schwebend</option>
<option value="sitting">Sitzend</option>
<option value="spooky">Unheimlich</option>
</select>
</label>
<label class="field">
<span>Deckkraft: <span id="s-bgskin-val">55</span> %</span>
<input id="s-bgskin-opacity" type="range" min="10" max="100" step="5" />
</label>
</div>
<label class="checkbox-field">
<input id="s-bgskin-cycle" type="checkbox" /> <span>Bei mehreren angemeldeten Konten automatisch durchwechseln</span>
</label>
<label class="field">
<span>Wechsel alle <small class="opt">(Sekunden)</small></span>
<input id="s-bgskin-cycle-seconds" type="number" min="5" step="5" />
<small class="hint">Läuft nur, wenn 2 oder mehr Konten angemeldet sind, und beginnt nach dem letzten Konto wieder von vorn.</small>
</label>
</section>
</div>
</div>
<div id="pane-minecraft" class="spane hidden">
<div class="settings-hero">
<h4>Spiel</h4>
<p>Standardwerte für neue und bestehende Instanzen ohne eigene Überschreibung.</p>
</div>
<div class="settings-grid">
<section class="settings-card">
<h5>Speicher</h5>
<div class="field-row">
<label class="field">
<span>Standard-RAM min. (MB)</span>
<input id="s-min-mem" type="number" min="512" step="256" />
</label>
<label class="field">
<span>Standard-RAM max. (MB)</span>
<input id="s-max-mem" type="number" min="512" step="256" />
</label>
</div>
<small class="hint">Gilt für alle Instanzen ohne eigene RAM-Einstellung.</small>
</section>
<section class="settings-card">
<h5>Fenster</h5>
<label class="checkbox-field">
<input id="s-mc-max" type="checkbox" /> <span>Minecraft maximiert starten</span>
</label>
<div class="field-row">
<label class="field"><span>Fensterbreite</span><input id="s-mc-width" type="number" min="320" step="10" /></label>
<label class="field"><span>Fensterhöhe</span><input id="s-mc-height" type="number" min="240" step="10" /></label>
</div>
</section>
</div>
</div>
<div id="pane-start" class="spane hidden">
<div class="settings-hero">
<h4>Start &amp; Java</h4>
<p>Runtime-Auswahl, Startverhalten und globale Befehle für alle Instanzen.</p>
</div>
<div class="settings-grid settings-grid-stack">
<section class="settings-card settings-card-wide">
<h5>Java</h5>
<label class="field">
<span>Java (java.exe)</span>
<div class="path-row">
<input id="s-java" type="text" placeholder="leer = java aus PATH" />
<button id="s-pick-java" class="btn">Wählen…</button>
</div>
<div class="path-row">
<select id="s-java-detected"><option value=""> gefundene Java-Installationen </option></select>
<button id="s-scan-java" class="btn">Erkennen</button>
</div>
<small id="s-java-status" class="hint"></small>
</label>
<label class="checkbox-field">
<input id="s-auto-java" type="checkbox" /> <span>Fehlende Java-Version automatisch herunterladen</span>
</label>
<small class="hint">Holt beim Spielstart die passende Fassung von Eclipse Temurin, wenn keine geeignete Java-Installation gefunden wird. Ablage im Launcher-Ordner, rund 45 MB je Version.</small>
</section>
<section class="settings-card">
<h5>Konsole</h5>
<label class="checkbox-field">
<input id="s-console-launch" type="checkbox" /> <span>Konsole anzeigen, während das Spiel läuft</span>
</label>
<label class="checkbox-field">
<input id="s-console-autoclose" type="checkbox" /> <span>Konsole automatisch schließen, nachdem das Spiel beendet wurde</span>
</label>
<label class="checkbox-field">
<input id="s-console-crash" type="checkbox" /> <span>Konsole anzeigen, wenn das Spiel abstürzt</span>
</label>
<label class="field">
<span>Historie-Limit (Zeilen)</span>
<input id="s-console-lines" type="number" min="1000" step="1000" />
</label>
</section>
<section class="settings-card">
<h5>Globale Befehle</h5>
<label class="field">
<span>Pre-Launch-Befehl</span>
<input id="s-global-pre" type="text" placeholder="läuft vor jedem Spielstart" />
</label>
<label class="field">
<span>Post-Exit-Befehl</span>
<input id="s-global-post" type="text" placeholder="läuft nach jedem Beenden" />
</label>
<small class="hint">Instanzspezifische Befehle aus dem Bearbeiten-Dialog haben Vorrang.</small>
</section>
<section class="settings-card settings-card-wide">
<h5>Externe Programme</h5>
<label class="field">
<span>Wrapper-Befehl</span>
<input id="s-wrapper" type="text" placeholder="z. B. prime-run (leer = kein Wrapper)" />
</label>
<small class="hint">Startet Java über dieses Programm. Java-Pfad und Argumente werden automatisch angehängt.</small>
</section>
</div>
</div>
<div id="pane-network" class="spane hidden">
<div class="settings-hero">
<h4>Netzwerk</h4>
<p>Verbindungsoptionen für Downloads und externe Dienste.</p>
</div>
<div class="settings-grid">
<section class="settings-card settings-card-wide">
<h5>Proxy</h5>
<label class="checkbox-field">
<input id="s-proxy-enabled" type="checkbox" /> <span>HTTP-Proxy für Downloads verwenden</span>
</label>
<div class="field-row">
<label class="field"><span>Host</span><input id="s-proxy-host" type="text" placeholder="proxy.firma.de" /></label>
<label class="field field-port"><span>Port</span><input id="s-proxy-port" type="text" placeholder="8080" /></label>
</div>
<div class="field-row">
<label class="field"><span>Benutzer <small class="opt">(optional)</small></span><input id="s-proxy-user" type="text" /></label>
<label class="field"><span>Passwort <small class="opt">(optional)</small></span><input id="s-proxy-pass" type="password" /></label>
</div>
</section>
<section class="settings-card settings-card-wide">
<h5>CurseForge</h5>
<label class="field">
<span>Eigener API-Key <small class="opt">(optional)</small></span>
<div class="path-row">
<input id="s-cf-key" type="password" placeholder="leer lassen, um die Weiterleitung unten zu nutzen" />
<button type="button" id="s-cf-test" class="btn">Prüfen</button>
</div>
<small class="hint">Schlüssel von CurseForge for Studios (Profil → Schlüssel erstellen, beginnt mit cfc_pat_…) oder klassischer Organisationsschlüssel. Nach dem Eintragen speichern. „Prüfen“ testet den Key bei CurseForge.</small>
<small id="s-cf-test-status" class="hint"></small>
</label>
<div class="field-row">
<label class="field">
<span>Weiterleitung <small class="opt">(optional)</small></span>
<input id="s-cf-proxy" type="text" placeholder="https://cf.example.de" />
</label>
<label class="field">
<span>Token <small class="opt">(falls verlangt)</small></span>
<input id="s-cf-proxy-token" type="password" />
</label>
</div>
<small class="hint">Ein Server, der den Schlüssel für dich hält. Ohne beides funktionieren Modrinth-Modpacks (.mrpack) weiterhin.</small>
</section>
</div>
</div>
<div id="pane-accounts" class="spane hidden">
<div class="settings-hero">
<h4>Konten</h4>
<p>Microsoft-Konten verwalten und das aktive Spielkonto wechseln.</p>
</div>
<div class="settings-grid">
<section class="settings-card settings-card-wide">
<h5>Verknüpfte Konten</h5>
<div id="s-accounts" class="account-list"></div>
<div class="path-row">
<button id="s-add-account" class="btn btn-primary"> Konto hinzufügen</button>
<button id="s-open-accounts" class="btn">Verwaltung öffnen</button>
</div>
</section>
</div>
</div>
<div id="pane-backup" class="spane hidden">
<div class="settings-hero">
<h4>Backup</h4>
<p>Alle Instanzen gesammelt als ZIP sichern, bevor größere Änderungen anstehen.</p>
</div>
<div class="settings-grid">
<section class="settings-card settings-card-wide">
<h5>Globales Backup</h5>
<small class="hint">Backups werden automatisch unter Dokumente/AeroMC Launcher/Backups gespeichert. Instanzen und Launcher-Einstellungen werden gesichert. Konten und Tokens werden nicht mitgesichert.</small>
<div class="path-row" style="margin-top:14px">
<button id="s-backup-global" class="btn btn-primary">Backup erstellen</button>
<span id="s-backup-status" class="hint">Noch kein Backup erstellt.</span>
</div>
<div id="s-backup-progress" class="backup-progress hidden" aria-hidden="true">
<div class="backup-progress-bar"><div id="s-backup-progress-fill" class="backup-progress-fill"></div></div>
<div id="s-backup-progress-text" class="backup-progress-text hint">0 %</div>
</div>
</section>
<section class="settings-card settings-card-wide">
<h5>Automatisch sichern</h5>
<label class="checkbox-field">
<input id="s-autobackup" type="checkbox" /> <span>Sicherungen nach Zeitplan erstellen</span>
</label>
<div class="field-row">
<label class="field">
<span>Wie oft</span>
<select id="s-autobackup-every">
<option value="daily">Täglich</option>
<option value="weekly">Wöchentlich</option>
</select>
</label>
<label class="field">
<span>Wie viele behalten</span>
<input id="s-autobackup-keep" type="number" min="1" max="50" />
</label>
</div>
<label class="checkbox-field">
<input id="s-autobackup-launch" type="checkbox" /> <span>Zusätzlich vor jedem Spielstart sichern</span>
</label>
<small class="hint">Eine Sicherung umfasst <em>alle</em> Instanzen und kann je nach Umfang einige Minuten dauern. Vor dem Spielstart wird sie abgewartet der Start verzögert sich entsprechend. Ältere automatische Sicherungen werden gelöscht, sobald die eingestellte Anzahl überschritten ist.</small>
<small id="s-autobackup-last" class="hint">Noch keine automatische Sicherung.</small>
</section>
<section class="settings-card settings-card-wide">
<h5>Wiederherstellen</h5>
<small class="hint">Wähle ein Backup aus Dokumente/AeroMC Launcher/Backups aus. Achtung: Alle vorhandenen Instanzen werden beim Wiederherstellen mit dem Inhalt des Backups überschrieben. Launcher-Einstellungen werden ebenfalls wiederhergestellt. Konten und Tokens bleiben unverändert.</small>
<label class="field backup-select-field">
<span>Verfügbares Backup</span>
<select id="s-restore-backup"></select>
</label>
<div class="path-row" style="margin-top:14px">
<button id="s-restore-global" class="btn">Backup wiederherstellen</button>
<span id="s-restore-status" class="hint">Noch kein Backup wiederhergestellt.</span>
</div>
<div id="s-restore-progress" class="backup-progress hidden" aria-hidden="true">
<div class="backup-progress-bar"><div id="s-restore-progress-fill" class="backup-progress-fill"></div></div>
<div id="s-restore-progress-text" class="backup-progress-text hint">0 %</div>
</div>
</section>
</div>
</div>
<div id="pane-info" class="spane hidden">
<div class="settings-hero">
<h4>Info</h4>
</div>
<div class="settings-grid">
<section class="settings-card settings-card-wide info-card">
<div class="about-brand">
<img src="assets/logo.png" alt="" class="about-logo" />
<div>
<div class="about-name">AeroMC</div>
</div>
</div>
<div id="s-appinfo" class="settings-kv info-meta"></div>
<div class="info-actions">
<button id="s-check-update" class="btn">Nach Updates suchen</button>
<span id="s-update-status" class="info-status">Kein Update-Check ausgeführt.</span>
</div>
</section>
</div>
</div>
</div>
</div>
<div class="modal-foot">
<button class="btn" data-close>Schließen</button>
<button id="btn-save-settings" class="btn btn-primary">Speichern</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Bestätigung ===================== -->
<div id="modal-confirm" class="modal hidden">
<div class="modal-card modal-sm">
<div class="modal-head">
<h3 id="confirm-title">Sicher?</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<p id="confirm-text"></p>
</div>
<div class="modal-foot">
<button class="btn" data-close>Abbrechen</button>
<button id="confirm-ok" class="btn btn-danger">Löschen</button>
</div>
</div>
</div>
<!-- Eingabe-Dialog (ersetzt window.prompt, das in Electron nicht geht) -->
<div id="modal-prompt" class="modal hidden">
<div class="modal-card modal-sm">
<div class="modal-head">
<h3 id="prompt-title">Eingabe</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<p id="prompt-text" class="hint"></p>
<label class="field" style="margin-top:10px">
<span id="prompt-label">Name</span>
<input id="prompt-input" type="text" autocomplete="off" />
</label>
</div>
<div class="modal-foot">
<button class="btn" data-close>Abbrechen</button>
<button id="prompt-ok" class="btn btn-primary">OK</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Mods (Modrinth) ===================== -->
<div id="modal-mods" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<div class="detail-head">
<span class="detail-icon">🧩</span>
<div>
<h3 id="m-title">Mods</h3>
<div id="m-sub" class="detail-sub"></div>
</div>
</div>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body mods-body">
<div id="m-warn" class="mods-warn hidden"></div>
<div class="mods-search">
<select id="m-art" title="Was soll gesucht werden?">
<option value="mod">Mods</option>
<option value="resourcepack">Ressourcenpakete</option>
<option value="shader">Shader</option>
</select>
<input id="m-query" type="text" placeholder="Mods durchsuchen … (z. B. Sodium, JEI, Create)" />
<button id="m-search-btn" class="btn btn-primary">Suchen</button>
</div>
<div class="mods-filters">
<select id="m-source" title="Quelle">
<option value="modrinth">Modrinth</option>
<option value="curseforge">CurseForge</option>
</select>
<select id="m-sort" title="Sortierung">
<option value="downloads">Beliebt</option>
<option value="relevance">Relevanz</option>
<option value="follows">Follower</option>
<option value="newest">Neu</option>
<option value="updated">Aktualisiert</option>
</select>
<select id="m-category" title="Kategorie">
<option value="">Alle Kategorien</option>
<option value="optimization">Optimierung</option>
<option value="utility">Werkzeuge</option>
<option value="adventure">Adventure</option>
<option value="technology">Technik</option>
<option value="magic">Magie</option>
<option value="worldgen">Weltgenerierung</option>
<option value="decoration">Dekoration</option>
<option value="storage">Lagerung</option>
<option value="food">Essen</option>
<option value="mobs">Kreaturen</option>
<option value="equipment">Ausrüstung</option>
<option value="library">Bibliothek</option>
</select>
</div>
<div class="mods-tabs">
<button id="m-tab-catalog" class="mtab on">Katalog</button>
<button id="m-tab-installed" class="mtab">Installiert (<span id="m-installed-count">0</span>)</button>
</div>
<div id="m-pane-catalog">
<div id="m-results" class="mods-list"><div class="mods-empty">Lade beliebte Mods …</div></div>
<button id="m-more" class="btn btn-mini hidden">Mehr laden</button>
</div>
<div id="m-pane-installed" class="hidden">
<div class="mmc-bar">
<button id="m-add-file" class="btn btn-mini" data-ic="plus">Datei hinzufügen…</button>
<button id="m-check-updates" class="btn btn-mini">Nach Updates suchen</button>
<button id="m-apply-updates" class="btn btn-primary btn-mini hidden">Alle aktualisieren</button>
<span id="m-update-status" class="hint"></span>
</div>
<div id="m-installed" class="mods-list"><div class="mods-empty">Noch keine Mods.</div></div>
</div>
</div>
<div class="modal-foot">
<button id="m-open-folder" class="btn" data-ic="folder">mods-Ordner</button>
<div class="spacer"></div>
<button class="btn" data-close>Schließen</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Microsoft-Login ===================== -->
<div id="modal-login" class="modal hidden">
<div class="modal-card modal-sm">
<div class="modal-head">
<h3>Microsoft-Login</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<div id="login-accounts" class="account-list"></div>
<div id="login-code" class="hidden login-code">
<p>Öffne diese Seite und gib den Code ein:</p>
<a id="login-url" class="login-link" href="#">microsoft.com/link</a>
<div id="login-usercode" class="login-usercode"> </div>
<button id="login-copy" class="btn btn-mini" data-ic="copy">Code kopieren</button>
<p id="login-status" class="hint">Warte auf Bestätigung …</p>
</div>
<p id="login-hint" class="hint">Melde dich mit deinem Microsoft-Konto an (Minecraft Java Edition nötig). Das aktive Konto wird beim nächsten Start verwendet. Für zwei Konten gleichzeitig: eine Instanz starten, hier das zweite Konto aktivieren und eine weitere Instanz starten laufende Spiele behalten ihr Konto.</p>
</div>
<div class="modal-foot">
<button id="login-skin" class="btn">Skin ändern…</button>
<div class="spacer"></div>
<button id="login-add" class="btn btn-primary" data-ic="plus">Konto hinzufügen</button>
<button class="btn" data-close>Schließen</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Konsole / Log ===================== -->
<div id="modal-console" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<h3>Konsole / Log</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<pre id="console-out" class="console-out"></pre>
</div>
<div class="modal-foot">
<button id="console-clear" class="btn">Leeren</button>
<button id="console-copy" class="btn">Kopieren</button>
<div class="spacer"></div>
<button class="btn" data-close>Schließen</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Welten & Ressourcenpakete ===================== -->
<div id="modal-content" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<h3 id="content-title">Welten & Ressourcenpakete</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<div class="mods-columns">
<div class="mods-col">
<h4>Welten <button id="content-open-worlds" class="btn btn-mini" data-ic="folder"></button></h4>
<div id="content-worlds" class="mods-list"></div>
</div>
<div class="mods-col">
<h4>Ressourcenpakete <button id="content-open-rp" class="btn btn-mini" data-ic="folder"></button></h4>
<div id="content-rp" class="mods-list"></div>
</div>
<div class="mods-col">
<h4>Datenpakete <button id="content-open-dp" class="btn btn-mini" data-ic="folder"></button></h4>
<div id="content-dp" class="mods-list"></div>
</div>
</div>
</div>
<div class="modal-foot">
<div class="spacer"></div>
<button class="btn" data-close>Schließen</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Screenshots ===================== -->
<div id="modal-screens" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<h3 id="screens-title">Screenshots</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<div class="screens-toolbar">
<button id="screens-select-all" class="btn btn-mini">Alle auswählen</button>
<button id="screens-select-none" class="btn btn-mini">Auswahl aufheben</button>
<button id="screens-delete-sel" class="btn btn-danger btn-mini" disabled>Auswahl löschen</button>
<span id="screens-sel-hint" class="hint">Klick auf Vorschaubild zum Auswählen</span>
</div>
<div id="screens-grid" class="screens-grid"></div>
</div>
<div class="modal-foot">
<button id="screens-open" class="btn" data-ic="folder">Ordner</button>
<div class="spacer"></div>
<button class="btn" data-close>Schließen</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Modpack aktualisieren ===================== -->
<div id="modal-modpack" class="modal hidden">
<div class="modal-card modal-sm">
<div class="modal-head">
<h3>Modpack aktualisieren</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<p id="mp-status" class="hint">Suche …</p>
<div id="mp-kern" class="crash-kern hidden"></div>
<p class="hint">Welten, Bildschirmfotos und deine Optionen bleiben unangetastet. Mods und Konfigurationsdateien des Pakets werden ersetzt; was die neue Fassung nicht mehr enthält, wird entfernt.</p>
</div>
<div class="modal-foot">
<div class="spacer"></div>
<button class="btn" data-close>Schließen</button>
<button id="mp-do" class="btn btn-primary hidden">Jetzt aktualisieren</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Serverliste ===================== -->
<div id="modal-servers" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<h3 id="servers-title">Server</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<p class="hint">Diese Liste steht in der Datei servers.dat der Instanz und erscheint im Spiel unter „Mehrspieler". Änderungen wirken erst beim nächsten Start.</p>
<div class="field-row" style="margin-top:12px">
<label class="field"><span>Name</span><input id="srv-name" type="text" placeholder="z. B. Mein Server" /></label>
<label class="field"><span>Adresse</span><input id="srv-ip" type="text" placeholder="mc.example.de oder 192.168.1.50:25566" /></label>
<button id="srv-add" class="btn btn-primary" style="align-self:flex-end">Hinzufügen</button>
</div>
<div id="srv-list" class="mods-list" style="margin-top:12px"></div>
</div>
<div class="modal-foot">
<div class="spacer"></div>
<button class="btn" data-close>Schließen</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Server übertragen ===================== -->
<div id="modal-srv-copy" class="modal hidden">
<div class="modal-card modal-sm">
<div class="modal-head">
<h3>Server übertragen</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<p id="srv-copy-sub" class="hint"></p>
<div id="srv-copy-list" class="mods-list"></div>
</div>
<div class="modal-foot">
<div class="spacer"></div>
<button class="btn" data-close>Abbrechen</button>
<button id="srv-copy-do" class="btn btn-primary">Übertragen</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Skin ===================== -->
<div id="modal-skin" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<h3>Skin ändern</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<p id="skin-konto" class="hint"></p>
<div class="skin-vorschau">
<div class="skin-spalte">
<div class="skin-label">Aktuell</div>
<div class="skin-bild">
<img id="skin-aktuell" alt="" class="hidden" />
<span id="skin-aktuell-leer" class="hint">wird geladen …</span>
</div>
</div>
<div class="skin-spalte">
<div class="skin-label">Neu</div>
<div class="skin-bild">
<img id="skin-neu" alt="" class="hidden" />
<span id="skin-neu-leer" class="hint">noch keine Datei gewählt</span>
</div>
</div>
</div>
<small class="hint">Die Vorschau zeigt die Figur so, wie sie im Spiel aussieht. Die Armform wirkt sich auf die Darstellung aus.</small>
<div class="path-row" style="margin-top:12px">
<input id="skin-pfad" type="text" readonly placeholder="PNG mit 64×64 Pixeln" />
<button id="skin-pick" class="btn">Datei wählen…</button>
</div>
<label class="field" style="margin-top:10px">
<span>Armform</span>
<select id="skin-variante">
<option value="classic">Klassisch (breite Arme, Steve)</option>
<option value="slim">Schmal (Alex)</option>
</select>
</label>
<p id="skin-status" class="hint"></p>
</div>
<div class="modal-foot">
<button id="skin-reset" class="btn btn-danger">Auf Standard zurücksetzen</button>
<div class="spacer"></div>
<button class="btn" data-close>Schließen</button>
<button id="skin-apply" class="btn btn-primary" disabled>Skin setzen</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Logdateien ===================== -->
<div id="modal-logs" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<h3 id="logs-title">Logdateien</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<div class="mmc-bar">
<label class="field" style="margin:0;flex:1">
<span>Datei</span>
<select id="logs-select"></select>
</label>
<span id="logs-info" class="hint"></span>
</div>
<pre id="logs-text" class="crash-voll">Wähle eine Datei …</pre>
</div>
<div class="modal-foot">
<button id="logs-folder" class="btn" data-ic="folder">Ordner öffnen</button>
<div class="spacer"></div>
<button class="btn" data-close>Schließen</button>
<button id="logs-copy" class="btn btn-primary">Log kopieren</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Absturzbericht ===================== -->
<div id="modal-crash" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<h3>Minecraft ist abgestürzt</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<p id="crash-sub" class="hint"></p>
<div id="crash-kern" class="crash-kern"></div>
<details class="crash-details">
<summary>Vollständigen Bericht anzeigen</summary>
<pre id="crash-voll" class="crash-voll"></pre>
</details>
</div>
<div class="modal-foot">
<button id="crash-folder" class="btn" data-ic="folder">Ordner öffnen</button>
<button id="crash-console" class="btn">Konsole</button>
<div class="spacer"></div>
<button class="btn" data-close>Schließen</button>
<button id="crash-copy" class="btn btn-primary">Bericht kopieren</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Update ===================== -->
<div id="modal-update" class="modal hidden">
<div class="modal-card modal-sm">
<div class="modal-head">
<h3>Update verfügbar</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<p class="upd-version">
<span id="upd-current" class="upd-old"></span>
<span class="upd-arrow"></span>
<span id="upd-new" class="upd-newv"></span>
</p>
<p id="upd-channel" class="upd-channel hint">Update-Kanal: </p>
<div id="upd-notes" class="upd-notes"></div>
<div id="upd-progress" class="upd-progress hidden">
<div class="upd-bar"><div id="upd-bar-fill" class="upd-bar-fill"></div></div>
<div id="upd-status" class="hint">Wird heruntergeladen …</div>
</div>
<p id="upd-hint" class="hint">Der Launcher lädt das Update herunter und startet die Installation automatisch.</p>
</div>
<div class="modal-foot">
<button class="btn" data-close>Später</button>
<button id="upd-open" class="btn btn-primary hidden">Release öffnen</button>
<button id="upd-install" class="btn btn-primary">Installieren</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Import ===================== -->
<div id="modal-import" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<h3>Importieren</h3>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<div class="mods-tabs import-tabs">
<button id="import-tab-zip" class="mtab on" data-kind="zip">ZIP-Archiv</button>
<button id="import-tab-modpack" class="mtab" data-kind="modpack">Modpack</button>
<button id="import-tab-mc" class="mtab" data-kind="mc">Minecraft Launcher</button>
<button id="import-tab-cf" class="mtab" data-kind="cf">CurseForge</button>
<button id="import-tab-mmc" class="mtab" data-kind="mmc">MultiMC / Prism</button>
<button id="import-tab-technic" class="mtab" data-kind="technic">Technic</button>
</div>
<div id="import-pane-zip" class="import-pane">
<p class="import-copy">Importiert eine einzelne Instanz aus einem ZIP-Archiv.</p>
<p class="hint">Erkannt werden AeroMC-Exporte (instance.json) und einzelne MultiMC- oder Prism-Instanzen (instance.cfg) letztere auch als gezippter Instanzordner. Der Launcher legt daraus automatisch eine neue Instanz an, samt Mods, Welten und Konfiguration.</p>
</div>
<div id="import-pane-modpack" class="import-pane hidden">
<p class="import-copy">Modpack aus dem Katalog installieren oder als Datei importieren.</p>
<p class="hint">Suche läuft über Modrinth. Datei-Import unterstützt zusätzlich CurseForge-ZIP (manifest.json) dafür ist ein API-Key oder eine Weiterleitung in den Netzwerk-Einstellungen nötig.</p>
<div class="field-row" style="margin-top:12px;align-items:flex-end">
<label class="field" style="flex:1">
<span>Suche (Modrinth)</span>
<input id="mp-query" type="text" placeholder="z. B. Fabulously Optimized, Create …" autocomplete="off" />
</label>
<label class="field" style="width:140px">
<span>MC-Version <small class="opt">(opt.)</small></span>
<input id="mp-mc" type="text" placeholder="1.21.1" autocomplete="off" />
</label>
<button id="mp-search-btn" class="btn btn-primary">Suchen</button>
</div>
<div class="field-row" style="margin-top:8px">
<label class="field">
<span>Sortierung</span>
<select id="mp-sort">
<option value="relevance">Relevanz</option>
<option value="downloads">Downloads</option>
<option value="follows">Follower</option>
<option value="newest">Neu</option>
<option value="updated">Aktualisiert</option>
</select>
</label>
</div>
<div id="mp-status" class="hint" style="margin-top:8px">Gib einen Suchbegriff ein oder lasse das Feld leer für beliebte Packs.</div>
<div id="mp-results" class="mods-list" style="margin-top:10px;max-height:280px;overflow:auto"></div>
</div>
<div id="import-pane-mc" class="import-pane hidden">
<label class="field">
<span>Minecraft-Launcher-Ordner</span>
<div class="path-row">
<input id="mc-path" type="text" placeholder="z. B. C:\Users\DeinName\AppData\Roaming\.minecraft" />
<button id="mc-pick" class="btn">Wählen…</button>
<button id="mc-scan" class="btn btn-primary">Suchen</button>
</div>
<small id="mc-status" class="hint">Leer lassen nutzt automatisch den Standardpfad unter Windows.</small>
</label>
<div id="mc-result" class="hidden">
<div class="mmc-bar">
<label class="checkbox-field" style="margin:0">
<input id="mc-all" type="checkbox" checked /> <span>Alle auswählen</span>
</label>
<label class="checkbox-field" style="margin:0">
<input id="mc-copy" type="checkbox" checked /> <span>Spieldaten mitkopieren (Mods, Welten, Konfiguration)</span>
</label>
</div>
<div id="mc-list" class="mods-list"></div>
</div>
</div>
<div id="import-pane-cf" class="import-pane hidden">
<label class="field">
<span>CurseForge-Instanzen</span>
<div class="path-row">
<input id="cf-path" type="text" placeholder="z. B. C:\Users\DeinName\curseforge\minecraft\Instances" />
<button id="cf-pick" class="btn">Wählen…</button>
<button id="cf-scan" class="btn btn-primary">Suchen</button>
</div>
<small id="cf-status" class="hint">Standardpfad unter Windows: C:\Users\DeinName\curseforge\minecraft\Instances</small>
</label>
<div id="cf-result" class="hidden">
<div class="mmc-bar">
<label class="checkbox-field" style="margin:0">
<input id="cf-all" type="checkbox" checked /> <span>Alle auswählen</span>
</label>
<label class="checkbox-field" style="margin:0">
<input id="cf-copy" type="checkbox" checked /> <span>Spieldaten mitkopieren (Welten, Mods, Konfiguration)</span>
</label>
</div>
<div id="cf-list" class="mods-list"></div>
</div>
</div>
<div id="import-pane-mmc" class="import-pane hidden">
<label class="field">
<span>MultiMC- oder Prism-Ordner</span>
<div class="path-row">
<input id="mmc-path" type="text" placeholder="z. B. E:\Minecraft\MultiMC" />
<button id="mmc-pick" class="btn">Wählen…</button>
<button id="mmc-scan" class="btn btn-primary">Suchen</button>
</div>
<small id="mmc-status" class="hint">Gib den Ordner an, in dem MultiMC.exe oder PrismLauncher.exe liegt.</small>
</label>
<div id="mmc-result" class="hidden">
<div class="mmc-bar">
<label class="checkbox-field" style="margin:0">
<input id="mmc-all" type="checkbox" checked /> <span>Alle auswählen</span>
</label>
<label class="checkbox-field" style="margin:0">
<input id="mmc-copy" type="checkbox" checked /> <span>Spieldaten mitkopieren (Welten, Mods, Konfiguration)</span>
</label>
</div>
<div id="mmc-list" class="mods-list"></div>
</div>
</div>
<div id="import-pane-technic" class="import-pane hidden">
<p class="import-copy">Modpack direkt von der Technic-Plattform installieren oder eine bereits vorhandene Technic-Installation importieren.</p>
<div class="field-row" style="align-items:flex-end">
<label class="field" style="flex:1">
<span>Technic-Katalog durchsuchen</span>
<input id="tp-query" type="text" placeholder="z. B. Hexxit, Tekxit …" autocomplete="off" />
</label>
<button id="tp-search-btn" class="btn btn-primary">Suchen</button>
</div>
<div id="tp-status" class="hint" style="margin-top:8px">Gib einen Suchbegriff ein oder lasse das Feld leer für beliebte Packs.</div>
<div id="tp-results" class="mods-list" style="margin-top:10px;max-height:220px;overflow:auto"></div>
<div class="modal-sep" style="margin:16px 0"></div>
<label class="field">
<span>Oder: vorhandenen Technic-Ordner importieren</span>
<div class="path-row">
<input id="technic-path" type="text" placeholder="z. B. C:\Users\DeinName\AppData\Roaming\.technic" />
<button id="technic-pick" class="btn">Wählen…</button>
<button id="technic-scan" class="btn btn-primary">Suchen</button>
</div>
<small id="technic-status" class="hint">Leer lassen nutzt automatisch den Standardpfad unter Windows (%APPDATA%\.technic).</small>
</label>
<div id="technic-result" class="hidden">
<div class="mmc-bar">
<label class="checkbox-field" style="margin:0">
<input id="technic-all" type="checkbox" checked /> <span>Alle auswählen</span>
</label>
<label class="checkbox-field" style="margin:0">
<input id="technic-copy" type="checkbox" checked /> <span>Spieldaten mitkopieren (Mods, Welten, Konfiguration)</span>
</label>
</div>
<div id="technic-list" class="mods-list"></div>
<p class="hint" style="margin-top:8px">Minecraft-Version und Mod-Loader werden nach bestem Wissen aus dem Pack erkannt bitte nach dem Import kurz prüfen, falls ein Pack ungewöhnlich aufgebaut ist.</p>
</div>
</div>
</div>
<div class="modal-foot">
<div id="mc-progress" class="hint hidden"></div>
<div id="mmc-progress" class="hint hidden"></div>
<div id="cf-progress" class="hint hidden"></div>
<div id="technic-progress" class="hint hidden"></div>
<div class="spacer"></div>
<button class="btn" data-close>Abbrechen</button>
<button id="import-zip-do" class="btn btn-primary">ZIP wählen…</button>
<button id="import-modpack-do" class="btn btn-primary hidden">Modpack wählen…</button>
<button id="mc-do" class="btn btn-primary hidden" disabled>Übernehmen</button>
<button id="cf-do" class="btn btn-primary hidden" disabled>Übernehmen</button>
<button id="mmc-do" class="btn btn-primary hidden" disabled>Übernehmen</button>
<button id="technic-do" class="btn btn-primary hidden" disabled>Übernehmen</button>
</div>
</div>
</div>
<!-- ===================== Dialog: Bedrock ===================== -->
<div id="modal-bedrock" class="modal hidden">
<div class="modal-card modal-lg">
<div class="modal-head">
<div class="detail-head">
<span class="detail-icon">🧱</span>
<div>
<h3>Minecraft Bedrock</h3>
<div id="bd-sub" class="detail-sub">Wird geprüft …</div>
</div>
</div>
<button class="modal-close" data-close></button>
</div>
<div class="modal-body">
<div id="bd-missing" class="mods-warn hidden">
⚠ Bedrock ist nicht installiert. Es wird über den Microsoft Store bezogen der Launcher kann es nicht selbst installieren.
</div>
<div id="bd-content">
<div class="bd-actions">
<button id="bd-play" class="btn btn-primary btn-lg">▶ Bedrock starten</button>
<button id="bd-import" class="btn">Add-on / Welt importieren…</button>
</div>
<div class="mods-tabs">
<button class="mtab btab on" data-kind="worlds">Welten</button>
<button class="mtab btab" data-kind="resource_packs">Ressourcenpakete</button>
<button class="mtab btab" data-kind="behavior_packs">Verhaltenspakete</button>
<button class="mtab btab" data-kind="skin_packs">Skin-Pakete</button>
<button class="mtab btab" data-kind="screenshots">Bildschirmfotos</button>
</div>
<div id="bd-list" class="mods-list"></div>
</div>
</div>
<div class="modal-foot">
<button id="bd-folder" class="btn" data-ic="folder">Ordner öffnen</button>
<div class="spacer"></div>
<button class="btn" data-close>Schließen</button>
</div>
</div>
</div>
<!-- ===================== Kontextmenü (Rechtsklick auf Instanz) ===================== -->
<div id="ctx-menu" class="ctx hidden">
<button class="ctx-item" data-act="p-edit">Symbol ändern</button>
<button class="ctx-item" data-act="p-edit">Umbenennen</button>
<button class="ctx-item" data-act="p-groupline">Gruppe ändern</button>
<div class="ctx-sep"></div>
<button class="ctx-item ctx-strong" data-act="p-play">Starten</button>
<button class="ctx-item" data-act="p-offline">Offline starten</button>
<div class="ctx-sep"></div>
<button class="ctx-item" data-act="p-edit">Instanz bearbeiten</button>
<button class="ctx-item" data-act="p-notes">Notizen bearbeiten</button>
<button class="ctx-item" data-act="p-mods">Mods anzeigen</button>
<button class="ctx-item" data-act="p-worlds">Welten verwalten</button>
<button class="ctx-item" data-act="p-screens">Bildschirmfotos verwalten</button>
<button class="ctx-item" data-act="p-logs">Logdateien ansehen</button>
<button class="ctx-item" data-act="p-servers">Server verwalten</button>
<div class="ctx-sep"></div>
<button class="ctx-item" data-act="p-mcfolder">Minecraft-Ordner</button>
<button class="ctx-item" data-act="p-configfolder">Konfigurations-Ordner</button>
<button class="ctx-item" data-act="p-instfolder">Instanz-Ordner</button>
<div class="ctx-sep"></div>
<button class="ctx-item" data-act="p-shortcut">Verknüpfung erstellen</button>
<button class="ctx-item" data-act="p-export">Instanz exportieren</button>
<button class="ctx-item ctx-danger" data-act="p-delete">Löschen</button>
<button class="ctx-item" data-act="p-copy">Instanz kopieren</button>
</div>
<!-- Toast -->
<div id="toast" class="toast hidden"></div>
<canvas id="skin-canvas" width="420" height="700" style="display:none"></canvas>
<script src="vendor/skinview3d.js"></script>
<script src="renderer.js"></script>
</body>
</html>