forked from BRETT/BRETT
2.5 KiB
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 buildnur 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(Containernuxt-shadcn-demo-db), URL inDATABASE_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 unterapp/components/ui/. - Theme-Farben über semantische Tokens (
bg-primary,border-primary, …), nie hardcoden. Themes werden inapp/assets/css/tailwind.css,app/composables/useTheme.tsundapp/components/ThemeSelector.vuegepflegt —--primaryist die Signaturfarbe,--accentder Kontrast;neohat--radius: 0(eckig), daher dortrounded-md/rounded-smstattrounded-2xl/rounded-xlverwenden. - Tailwind:
size-*stattw-* h-*,gap-*stattspace-x/y-*,cn()für Konditionales. - Live-Updates laufen über
server/routes/_ws.ts+broadcastToAll; Client-Verarbeitung inapp/plugins/notifications.client.ts. - Kommentar-Reactions:
useCommentReactions(State-Map pro Comment-Id), Emoji-ListeREACTION_EMOJIS. - Thread-Benachrichtigungen:
threadSubscriptionsspeichert Abos und explizite Deaktivierungen. Erstellen, Kommentieren, Favorisieren und Post-Reactions rufenensureThreadSubscription()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 perrequirePermission(event, key)inserver/utils/auth.ts—admin-Rolle ist implizit wildcard. Client-seitigcan(key)aususeAuth. Seeding viaseedPermissions()im Migrations-Plugin/Script. - i18n:
@nuxtjs/i18n, Localesde(Default) +enini18n/locales/*.json— beide Dateien immer gleiche Key-Struktur halten. Alle UI-Strings über$t()/t(), nie hardcoden.strategy: 'no_prefix', Locale-Cookiei18n_locale. Permission-Labels im Admin überadmin.perms.<key>; Effekt-/Theme-Namen bleiben Eigennamen.