Add admin panel web UI (Svelte 5)

Dashboard with launch stats, instance manager with Modrinth/CurseForge
search and zip import, player and group management, launcher design
editor with live preview, and sign-in settings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ARcGWxLx21FwXJ3yfGriS
This commit is contained in:
Claude committed 2026-09-28 04:32:15 +00:00
1 parent 8cdf616a94
commit af9147ec75
32 files changed
+4084

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
<script lang="ts">
import { CircleCheck, CircleAlert, Info, X } from '@lucide/svelte';
import { dismiss, toasts } from '../lib/toast.svelte';
</script>
<div class="toasts" aria-live="polite">
{#each toasts as t (t.id)}
<div class="toast {t.kind}">
{#if t.kind === 'ok'}<CircleCheck size={18} />{:else if t.kind === 'error'}<CircleAlert size={18} />{:else}<Info size={18} />{/if}
<span>{t.text}</span>
<button class="ghost icon" onclick={() => dismiss(t.id)} aria-label="Dismiss"><X size={14} /></button>
</div>
{/each}
</div>
<style>
.toasts { position: fixed; right: 20px; bottom: 20px; display: flex; flex-direction: column; gap: 10px; z-index: 100; max-width: 420px; }
.toast {
display: flex; align-items: center; gap: 10px; padding: 10px 10px 10px 14px; border-radius: 12px;
background: rgba(24, 27, 41, 0.92); backdrop-filter: blur(12px); border: 1px solid var(--line-strong);
box-shadow: var(--shadow); animation: pop 0.2s ease; font-size: 0.9rem;
}
.toast span { flex: 1; }
.ok :global(svg:first-child) { color: var(--good); }
.error :global(svg:first-child) { color: var(--bad); }
.info :global(svg:first-child) { color: var(--accent-2); }
@keyframes pop { from { opacity: 0; transform: translateY(8px) scale(0.98); } }
</style>