Files
BRETT/AGENTS.md
T
2026-10-03 23:45:04 +02:00

2.5 KiB

Nuxt shadcn Demo

Workflow

  • Keine Headless-Browser-Verifizierung nach UI-Änderungen — der User testet selbst. Nur bei wiederholten Fehlern nachfragen/debuggen. Syntax-Checks sind okay; npm run build nur ausführen, wenn der User es ausdrücklich will.
  • Dev-Server: npm run dev (Port 3000). Der User lässt ihn meist selbst laufen — nicht blind starten, erst prüfen ob bereits aktiv.
  • DB: MariaDB via docker-compose.yml (Container nuxt-shadcn-demo-db), URL in DATABASE_URL. Migrationen: npm run db:generate (Schema → SQL), npm run db:migrate (anwenden; im Dev-Modus auch automatisch per Nitro-Plugin).

Conventions

  • Vue 3 <script setup lang="ts">, Composition API, shadcn-vue-Komponenten unter app/components/ui/.
  • Theme-Farben über semantische Tokens (bg-primary, border-primary, …), nie hardcoden. Themes werden in app/assets/css/tailwind.css, app/composables/useTheme.ts und app/components/ThemeSelector.vue gepflegt — --primary ist die Signaturfarbe, --accent der Kontrast; neo hat --radius: 0 (eckig), daher dort rounded-md/rounded-sm statt rounded-2xl/rounded-xl verwenden.
  • Tailwind: size-* statt w-* h-*, gap-* statt space-x/y-*, cn() für Konditionales.
  • Live-Updates laufen über server/routes/_ws.ts + broadcastToAll; Client-Verarbeitung in app/plugins/notifications.client.ts.
  • Kommentar-Reactions: useCommentReactions (State-Map pro Comment-Id), Emoji-Liste REACTION_EMOJIS.
  • Thread-Benachrichtigungen: threadSubscriptions speichert Abos und explizite Deaktivierungen. Erstellen, Kommentieren, Favorisieren und Post-Reactions rufen ensureThreadSubscription() auf; ein deaktiviertes Abo darf dadurch nicht reaktiviert werden. notifyComment() benachrichtigt aktive Abonnenten und erwähnte Nutzer, respektiert Deaktivierungen auch bei Erwähnungen und fasst Meldungen pro Nutzer/Thread zusammen.
  • Berechtigungen: Katalog in shared/utils/permissions.ts (PERMISSIONS), Server-Check per requirePermission(event, key) in server/utils/auth.ts — admin-Rolle ist implizit wildcard. Client-seitig can(key) aus useAuth. Seeding via seedPermissions() im Migrations-Plugin/Script.
  • i18n: @nuxtjs/i18n, Locales de (Default) + en in i18n/locales/*.json — beide Dateien immer gleiche Key-Struktur halten. Alle UI-Strings über $t()/t(), nie hardcoden. strategy: 'no_prefix', Locale-Cookie i18n_locale. Permission-Labels im Admin über admin.perms.<key>; Effekt-/Theme-Namen bleiben Eigennamen.