defter 0.1.0

Self-hosted Zotero sync and file storage server, with metadata in SQLite and attachments in S3.
<script>
  import Dashboard from './Dashboard.svelte'

  let dark = $state(document.documentElement.classList.contains('dark'))

  function toggleDark() {
    dark = !dark
    document.documentElement.classList.toggle('dark', dark)
    localStorage.setItem('defter-dark', String(dark))
  }
</script>

<div class="min-h-screen flex flex-col">
  <header class="border-b">
    <div class="mx-auto max-w-4xl px-4 h-14 flex items-center justify-between">
      <a href="/" class="flex items-center gap-2 font-semibold tracking-tight">
        <span class="inline-block size-6 rounded-md bg-primary"></span>
        defter
      </a>
      <button
        type="button"
        onclick={toggleDark}
        class="rounded-md px-3 py-1.5 text-sm text-muted-foreground hover:bg-muted"
        aria-label="Toggle dark mode"
      >
        {dark ? 'Light' : 'Dark'}
      </button>
    </div>
  </header>

  <main class="flex-1 mx-auto w-full max-w-4xl px-4 py-8">
    <Dashboard />
  </main>

  <footer class="border-t">
    <div class="mx-auto max-w-4xl px-4 py-4 text-xs text-muted-foreground">
      Self-hosted Zotero sync and file storage
    </div>
  </footer>
</div>