mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 18:01:09 +02:00
refactor: rename zitare -> quotes (Zitate)
Zitare was opaque Latin/Italian-flavored branding. Renamed to clear English "quotes" (DE: Zitate) matching short-concrete-noun cluster. - Module, routes, API, i18n, standalone landing app, plans dirs - Dexie tables: quotesFavorites, quotesLists, quotesListTags, customQuotes (dropped redundant "quotes" prefix on the last) - Logo QuotesLogo, theme quotes.css, search provider, dashboard widget QuoteWidget - German user-facing label "Zitate" (English brand stays Quotes) Pre-launch, no data migration needed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
7a1f11c971
commit
851a281e5a
196 changed files with 891 additions and 776 deletions
|
|
@ -818,7 +818,7 @@ All web apps with backends now use the runtime injection pattern:
|
|||
|
||||
- ✅ `chat/apps/web`
|
||||
- ✅ `picture/apps/web`
|
||||
- ✅ `zitare/apps/web`
|
||||
- ✅ `quotes/apps/web`
|
||||
- ✅ `contacts/apps/web`
|
||||
- ✅ `calendar/apps/web`
|
||||
- ✅ `clock/apps/web`
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
| # | App | Collections | Stores umgeschrieben? |
|
||||
| --- | --------------- | ---------------------------------------------------- | ------------------------------------------------------------ |
|
||||
| 1 | Todo | tasks, projects, labels, taskLabels, reminders | Ja (komplett) |
|
||||
| 2 | Zitare | favorites, lists | Ja (komplett) |
|
||||
| 2 | Quotes | favorites, lists | Ja (komplett) |
|
||||
| 3 | Calendar | calendars, events | Ja (komplett) |
|
||||
| 4 | Clock | alarms, timers, worldClocks | Ja (komplett) |
|
||||
| 5 | Contacts | contacts | Ja (komplett) |
|
||||
|
|
|
|||
|
|
@ -325,7 +325,7 @@ Alle Web-Apps mit CRUD-Datenmodell wurden auf Local-First migriert:
|
|||
| App | Collections | Server-Logik verbleibt |
|
||||
|---|---|---|
|
||||
| **Todo** | tasks, projects, labels, taskLabels, reminders | RRULE, Reminders (Hono/Bun) |
|
||||
| **Zitare** | favorites, lists | Nur Sync |
|
||||
| **Quotes** | favorites, lists | Nur Sync |
|
||||
| **Calendar** | calendars, events | RRULE, Google Calendar OAuth |
|
||||
| **Clock** | alarms, timers, worldClocks | Nur Sync |
|
||||
| **Cards** | decks, cards | Spaced Repetition, LLM |
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
| # | App | Modul | Routen | Status |
|
||||
|---|-----|-------|--------|--------|
|
||||
| 1 | **calc** | collections, components (5 skins), engine, stores, queries | `/calc`, `/calc/standard` | **Done** |
|
||||
| 2 | **zitare** | collections, stores (5), components (2), queries | `/zitare` + 6 Sub-Routen | **Done** |
|
||||
| 2 | **quotes** | collections, stores (5), components (2), queries | `/quotes` + 6 Sub-Routen | **Done** |
|
||||
| 3 | **clock** | collections, stores (6), components (2), queries | `/clock`, `/clock/alarms` | **Done** |
|
||||
| 4 | **skilltree** | collections, stores (2), components (9), queries | `/skilltree`, `/skilltree/tree`, `/skilltree/achievements` | **Done** |
|
||||
| 5 | **moodlit** | collections, stores (2), components (3), queries | `/moodlit`, `/moodlit/moods`, `/moodlit/sequences` | **Done** |
|
||||
|
|
@ -97,7 +97,7 @@ Alle Apps die zum ManaCore-Ökosystem gehören und von Shared IndexedDB, Dashboa
|
|||
| **chat** | AI-Chat, Cross-App-Referenzen |
|
||||
| **picture** | AI-Bilder, Cross-App-Referenzen |
|
||||
| **cards** | Lernkarten, Cross-App-Links |
|
||||
| **zitare** | Zitate, Dashboard-Widget |
|
||||
| **quotes** | Zitate, Dashboard-Widget |
|
||||
| **clock** | Uhren/Timer, Dashboard-Widget |
|
||||
| **mukke** | Musik, eigenständig aber profitiert von shared Auth |
|
||||
| **storage** | Cloud-Dateien, Cross-App-Referenzen |
|
||||
|
|
@ -247,7 +247,7 @@ src/lib/modules/
|
|||
├── chat/
|
||||
├── picture/
|
||||
├── cards/
|
||||
├── zitare/
|
||||
├── quotes/
|
||||
├── clock/
|
||||
├── mukke/
|
||||
├── storage/
|
||||
|
|
@ -330,7 +330,7 @@ src/routes/
|
|||
│ │ ├── deck/[id]/+page.svelte
|
||||
│ │ └── study/[id]/+page.svelte
|
||||
│ │
|
||||
│ ├── zitare/
|
||||
│ ├── quotes/
|
||||
│ │ ├── +page.svelte
|
||||
│ │ └── favorites/+page.svelte
|
||||
│ │
|
||||
|
|
@ -463,7 +463,7 @@ import { CONTACTS_COLLECTIONS } from '$lib/modules/contacts/collections';
|
|||
import { CHAT_COLLECTIONS } from '$lib/modules/chat/collections';
|
||||
import { PICTURE_COLLECTIONS } from '$lib/modules/picture/collections';
|
||||
import { CARDS_COLLECTIONS } from '$lib/modules/cards/collections';
|
||||
import { ZITARE_COLLECTIONS } from '$lib/modules/zitare/collections';
|
||||
import { QUOTES_COLLECTIONS } from '$lib/modules/quotes/collections';
|
||||
import { CLOCK_COLLECTIONS } from '$lib/modules/clock/collections';
|
||||
import { MUKKE_COLLECTIONS } from '$lib/modules/mukke/collections';
|
||||
import { STORAGE_COLLECTIONS } from '$lib/modules/storage/collections';
|
||||
|
|
@ -509,7 +509,7 @@ db.version(1).stores({
|
|||
// ... alle weiteren
|
||||
...PICTURE_COLLECTIONS,
|
||||
...CARDS_COLLECTIONS,
|
||||
...ZITARE_COLLECTIONS,
|
||||
...QUOTES_COLLECTIONS,
|
||||
...CLOCK_COLLECTIONS,
|
||||
...MUKKE_COLLECTIONS,
|
||||
...STORAGE_COLLECTIONS,
|
||||
|
|
@ -566,7 +566,7 @@ export const SYNC_APP_MAP: Record<string, string[]> = {
|
|||
chat: ['conversations', 'messages', 'templates'],
|
||||
picture: ['images', 'boards', 'boardItems', 'tags', 'imageTags'],
|
||||
cards: ['decks', 'cards'],
|
||||
zitare: ['favorites', 'lists'],
|
||||
quotes: ['favorites', 'lists'],
|
||||
clock: ['alarms', 'timers', 'worldClocks'],
|
||||
mukke: ['songs', 'playlists', 'playlistSongs', 'mProjects', 'markers'],
|
||||
storage: ['files', 'folders', 'sTags', 'fileTags'],
|
||||
|
|
@ -756,7 +756,7 @@ Nach Komplexität sortiert — einfachste zuerst, um den Prozess einzuüben:
|
|||
| # | App | Routes | Components | Priorität | Grund |
|
||||
|---|-----|--------|-----------|-----------|-------|
|
||||
| 1 | **calc** | 4 | 8 | Starter | Minimal, keine Backend-Deps |
|
||||
| 2 | **zitare** | 8 | 12 | Starter | Einfach, wenig Stores |
|
||||
| 2 | **quotes** | 8 | 12 | Starter | Einfach, wenig Stores |
|
||||
| 3 | **clock** | 8 | 15 | Starter | Eigenständig, keine API |
|
||||
| 4 | **skilltree** | 5 | 6 | Starter | Minimal |
|
||||
| 5 | **moodlit** | 6 | 4 | Starter | Minimal |
|
||||
|
|
|
|||
|
|
@ -233,19 +233,19 @@ GEMINI_API_KEY=AIzaSyBR9iP74hlo-mhI-Cl4QEvKprRzPPMb-GA
|
|||
FOOD_S3_PUBLIC_URL=http://localhost:9000/food-storage
|
||||
|
||||
# ============================================
|
||||
# ZITARE PROJECT
|
||||
# QUOTES PROJECT
|
||||
# ============================================
|
||||
|
||||
ZITARE_BACKEND_PORT=3007
|
||||
ZITARE_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform
|
||||
QUOTES_BACKEND_PORT=3007
|
||||
QUOTES_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform
|
||||
|
||||
# ============================================
|
||||
# ZITARE TELEGRAM BOT
|
||||
# QUOTES TELEGRAM BOT
|
||||
# ============================================
|
||||
|
||||
ZITARE_BOT_PORT=3303
|
||||
ZITARE_BOT_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform
|
||||
ZITARE_BOT_TELEGRAM_TOKEN=8489424174:AAHHG_mlLVeu6xAWY6U2ZGXO0D8JKWnqBvg
|
||||
QUOTES_BOT_PORT=3303
|
||||
QUOTES_BOT_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform
|
||||
QUOTES_BOT_TELEGRAM_TOKEN=8489424174:AAHHG_mlLVeu6xAWY6U2ZGXO0D8JKWnqBvg
|
||||
|
||||
# ============================================
|
||||
# TODO TELEGRAM BOT
|
||||
|
|
|
|||
6
.github/workflows/ci.yml
vendored
6
.github/workflows/ci.yml
vendored
|
|
@ -367,7 +367,7 @@ jobs:
|
|||
echo "skilltree-web=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
# zitare-backend: REMOVED — migrated to local-first
|
||||
# quotes-backend: REMOVED — migrated to local-first
|
||||
|
||||
# Check if any service needs building
|
||||
if grep -q "=true" $GITHUB_OUTPUT; then
|
||||
|
|
@ -410,7 +410,7 @@ jobs:
|
|||
echo "| food-web | ${{ steps.changes.outputs.food-web }} |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| skilltree-backend | removed |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| skilltree-web | ${{ steps.changes.outputs.skilltree-web }} |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| zitare-backend | removed |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| quotes-backend | removed |" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
# ===========================================
|
||||
# Validation job - runs on PRs
|
||||
|
|
@ -1263,4 +1263,4 @@ jobs:
|
|||
cache-to: type=gha,mode=max
|
||||
|
||||
# ===========================================
|
||||
# Zitare Backend: REMOVED — migrated to local-first
|
||||
# Quotes Backend: REMOVED — migrated to local-first
|
||||
|
|
|
|||
6
.github/workflows/docker-validate.yml
vendored
6
.github/workflows/docker-validate.yml
vendored
|
|
@ -86,7 +86,7 @@ jobs:
|
|||
# - mana-sync: covers Go service pattern
|
||||
# - mana-media: covers Hono + Bun with Sharp/BullMQ
|
||||
# - todo-web: covers most shared-* web packages
|
||||
# - zitare-web: covers content packages, shared-pwa
|
||||
# - quotes-web: covers content packages, shared-pwa
|
||||
# - calendar-web: covers calendar shared packages
|
||||
# - todo-backend: covers app backend pattern
|
||||
# ===========================================
|
||||
|
|
@ -114,8 +114,8 @@ jobs:
|
|||
- service: todo-web
|
||||
dockerfile: apps/todo/apps/web/Dockerfile
|
||||
context: .
|
||||
- service: zitare-web
|
||||
dockerfile: apps/zitare/apps/web/Dockerfile
|
||||
- service: quotes-web
|
||||
dockerfile: apps/quotes/apps/web/Dockerfile
|
||||
context: .
|
||||
- service: calendar-web
|
||||
dockerfile: apps/calendar/apps/web/Dockerfile
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ apps/chat/FEATURE_REQUIREMENTS.md
|
|||
apps/cards/CI_CD_SETUP_GUIDE.md
|
||||
apps/cards/MANA_CORE_INTEGRATION_CHECKLIST.md
|
||||
apps/picture/DEPLOYMENT_COMPLETE.md
|
||||
apps/zitare/apps/web/THEMING.md
|
||||
apps/quotes/apps/web/THEMING.md
|
||||
BACKEND_DESIGN_PATTERN_AUDIT.md
|
||||
COMPATIBILITY_MATRIX_AND_REMEDIATION.md
|
||||
cicd/
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ Monorepo containing all Mana projects — a self-hosted multi-app ecosystem with
|
|||
| **contacts** | Contact management | NestJS backend, SvelteKit web |
|
||||
| **picture** | AI image generation | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
|
||||
| **cards** | Card/deck management | NestJS backend, Expo mobile, SvelteKit web |
|
||||
| **zitare** | Daily inspiration quotes | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
|
||||
| **quotes** | Daily inspiration quotes | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
|
||||
| **mukke** | Music player | NestJS backend, SvelteKit web |
|
||||
| **plants** | Plant care tracker | NestJS backend, SvelteKit web |
|
||||
| **storage** | Cloud storage | NestJS backend, SvelteKit web |
|
||||
|
|
|
|||
|
|
@ -34,13 +34,13 @@ Common issues and solutions for the mana-monorepo.
|
|||
|
||||
**Root Cause:**
|
||||
|
||||
Parent workspace packages (e.g., `apps/zitare/package.json`, `apps/presi/package.json`) have scripts that call `turbo run <task>`, creating an **infinite recursion loop**.
|
||||
Parent workspace packages (e.g., `apps/quotes/package.json`, `apps/presi/package.json`) have scripts that call `turbo run <task>`, creating an **infinite recursion loop**.
|
||||
|
||||
### How It Happens
|
||||
|
||||
```
|
||||
Root turbo → finds "build" script in apps/zitare/package.json
|
||||
→ runs "turbo run build" in zitare
|
||||
Root turbo → finds "build" script in apps/quotes/package.json
|
||||
→ runs "turbo run build" in quotes
|
||||
→ finds "build" script again
|
||||
→ runs "turbo run build" again
|
||||
→ (infinite loop!)
|
||||
|
|
@ -49,7 +49,7 @@ Root turbo → finds "build" script in apps/zitare/package.json
|
|||
### ❌ WRONG - Causes Infinite Recursion
|
||||
|
||||
```json
|
||||
// apps/zitare/package.json - DON'T DO THIS!
|
||||
// apps/quotes/package.json - DON'T DO THIS!
|
||||
{
|
||||
"scripts": {
|
||||
"build": "turbo run build", // ❌ WRONG
|
||||
|
|
@ -73,13 +73,13 @@ Root turbo → finds "build" script in apps/zitare/package.json
|
|||
### ✅ CORRECT - Let Root Turbo Handle Orchestration
|
||||
|
||||
```json
|
||||
// apps/zitare/package.json - CORRECT
|
||||
// apps/quotes/package.json - CORRECT
|
||||
{
|
||||
"scripts": {
|
||||
"dev": "turbo run dev", // ✅ OK for dev (persistent task, scoped)
|
||||
// No build, lint, type-check scripts - handled by root turbo
|
||||
"db:push": "pnpm --filter @zitare/backend db:push", // ✅ OK
|
||||
"db:studio": "pnpm --filter @zitare/backend db:studio" // ✅ OK
|
||||
"db:push": "pnpm --filter @quotes/backend db:push", // ✅ OK
|
||||
"db:studio": "pnpm --filter @quotes/backend db:studio" // ✅ OK
|
||||
}
|
||||
}
|
||||
```
|
||||
|
|
@ -88,7 +88,7 @@ Root turbo → finds "build" script in apps/zitare/package.json
|
|||
|
||||
Using `turbo run dev` in parent packages is acceptable because:
|
||||
|
||||
1. It's typically run directly on that package (scoped: `pnpm zitare:dev`)
|
||||
1. It's typically run directly on that package (scoped: `pnpm quotes:dev`)
|
||||
2. Dev tasks are persistent (long-running) and turbo handles them differently
|
||||
3. Root never orchestrates `dev` across all packages simultaneously
|
||||
|
||||
|
|
@ -130,14 +130,14 @@ Tasks orchestrated from root (defined in `turbo.json`):
|
|||
|
||||
Parent packages are located at:
|
||||
|
||||
- `apps/*/package.json` (e.g., `apps/zitare/package.json`)
|
||||
- `apps/*/package.json` (e.g., `apps/quotes/package.json`)
|
||||
- `games/*/package.json` (e.g., `games/mana-games/package.json`)
|
||||
|
||||
**Do NOT add turbo scripts here!**
|
||||
|
||||
Child packages (these are fine):
|
||||
|
||||
- `apps/*/apps/*/package.json` (e.g., `apps/zitare/apps/backend/package.json`)
|
||||
- `apps/*/apps/*/package.json` (e.g., `apps/quotes/apps/backend/package.json`)
|
||||
- `packages/*/package.json` (e.g., `packages/shared-theme/package.json`)
|
||||
|
||||
---
|
||||
|
|
@ -163,7 +163,7 @@ pnpm run build 2>&1 | tee build.log
|
|||
grep -A10 "error during build" build.log
|
||||
|
||||
# Build specific package to isolate issue
|
||||
pnpm --filter @zitare/backend build
|
||||
pnpm --filter @quotes/backend build
|
||||
```
|
||||
|
||||
### Build Times Out in CI
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ curl -X POST https://api.mana.how/v1/auth/login \
|
|||
| Auth | `http://localhost:3001` | `https://auth.mana.how` |
|
||||
| Chat | `http://localhost:3002` | `https://chat-api.mana.how` |
|
||||
| Picture | `http://localhost:3006` | `https://picture-api.mana.how` |
|
||||
| Zitare | `http://localhost:3007` | `https://zitare-api.mana.how` |
|
||||
| Quotes | `http://localhost:3007` | `https://quotes-api.mana.how` |
|
||||
|
||||
## Common Response Format
|
||||
|
||||
|
|
@ -148,4 +148,4 @@ Select a service from the sidebar to view its API documentation:
|
|||
- **Auth API** - Authentication and user management
|
||||
- **Chat API** - Conversations and AI completions
|
||||
- **Picture API** - Image generation
|
||||
- **Zitare API** - Quotes and favorites
|
||||
- **Quotes API** - Quotes and favorites
|
||||
|
|
|
|||
|
|
@ -278,6 +278,6 @@ Never enable auth bypass in production!
|
|||
|---------|---------|------|
|
||||
| Chat | `@mana-core/nestjs-integration` | 3002 |
|
||||
| Picture | `@mana/shared-nestjs-auth` | 3006 |
|
||||
| Zitare | `@mana/shared-nestjs-auth` | 3007 |
|
||||
| Quotes | `@mana/shared-nestjs-auth` | 3007 |
|
||||
| Cards | `@mana-core/nestjs-integration` | 3009 |
|
||||
| Contacts | `@mana/shared-nestjs-auth` | 3015 |
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ Mana is a multi-app ecosystem with shared infrastructure, enabling rapid develop
|
|||
| mana-core-auth | 3001 | Authentication |
|
||||
| chat-backend | 3002 | Chat API |
|
||||
| picture-backend | 3006 | Image generation |
|
||||
| zitare-backend | 3007 | Quotes API |
|
||||
| quotes-backend | 3007 | Quotes API |
|
||||
| cards-backend | 3009 | Card management |
|
||||
| contacts-backend | 3015 | Contacts API |
|
||||
| calendar-backend | 3014 | Calendar API |
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ All landing pages and static sites are deployed to **Cloudflare Pages** using Di
|
|||
| Picture | `@picture/landing` | `picture-landing` | picture.mana.how |
|
||||
| Mana | `@mana/landing` | `mana-landing` | mana.how |
|
||||
| Cards | `@cards/landing` | `cards-landing` | cards.mana.how |
|
||||
| Zitare | `@zitare/landing` | `zitare-landing` | zitare.mana.how |
|
||||
| Quotes | `@quotes/landing` | `quotes-landing` | quotes.mana.how |
|
||||
| Docs | `@mana/docs` | `mana-docs` | docs.mana.how |
|
||||
|
||||
## Quick Deploy
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ Mana uses multiple deployment strategies depending on the application type.
|
|||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Mac Mini Server │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ mana-core- │ │ chat- │ │ zitare- │ ... │
|
||||
│ │ mana-core- │ │ chat- │ │ quotes- │ ... │
|
||||
│ │ auth:3001 │ │ backend:3002│ │ backend:3007│ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||
│ │ │ │ │
|
||||
|
|
@ -72,7 +72,7 @@ Mana uses multiple deployment strategies depending on the application type.
|
|||
# Deploy individual landing page
|
||||
pnpm deploy:landing:chat
|
||||
pnpm deploy:landing:picture
|
||||
pnpm deploy:landing:zitare
|
||||
pnpm deploy:landing:quotes
|
||||
|
||||
# Deploy all landing pages
|
||||
pnpm deploy:landing:all
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ Each backend service has its own database and schema:
|
|||
|---------|----------|------|
|
||||
| mana-core-auth | mana_platform | 3001 |
|
||||
| chat | chat | 3002 |
|
||||
| zitare | zitare | 3007 |
|
||||
| quotes | quotes | 3007 |
|
||||
| contacts | contacts | 3015 |
|
||||
| calendar | calendar | 3014 |
|
||||
|
||||
|
|
|
|||
|
|
@ -98,11 +98,11 @@ The generator reads `.env.development` and creates app-specific `.env` files wit
|
|||
| `PICTURE_BACKEND_PORT` | Backend port (3006) |
|
||||
| `REPLICATE_API_KEY` | Replicate AI key |
|
||||
</TabItem>
|
||||
<TabItem label="Zitare">
|
||||
<TabItem label="Quotes">
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| `ZITARE_BACKEND_PORT` | Backend port (3007) |
|
||||
| `ZITARE_DATABASE_URL` | PostgreSQL connection |
|
||||
| `QUOTES_BACKEND_PORT` | Backend port (3007) |
|
||||
| `QUOTES_DATABASE_URL` | PostgreSQL connection |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ For any project with a backend, use the `dev:*:full` command:
|
|||
|
||||
```bash
|
||||
pnpm dev:chat:full # Start chat with auth + database setup
|
||||
pnpm dev:zitare:full # Start zitare with auth + database setup
|
||||
pnpm dev:quotes:full # Start quotes with auth + database setup
|
||||
pnpm dev:contacts:full # Start contacts with auth + database setup
|
||||
```
|
||||
|
||||
|
|
@ -30,7 +30,7 @@ These commands automatically:
|
|||
| Command | Database | Backend Port | Web Port |
|
||||
|---------|----------|--------------|----------|
|
||||
| `pnpm dev:chat:full` | chat | 3002 | 5173 |
|
||||
| `pnpm dev:zitare:full` | zitare | 3007 | 5177 |
|
||||
| `pnpm dev:quotes:full` | quotes | 3007 | 5177 |
|
||||
| `pnpm dev:contacts:full` | contacts | 3015 | 5184 |
|
||||
| `pnpm dev:calendar:full` | calendar | 3014 | 5179 |
|
||||
| `pnpm dev:clock:full` | clock | 3017 | 5187 |
|
||||
|
|
@ -64,7 +64,7 @@ Before running any `dev:*:full` command:
|
|||
```bash
|
||||
pnpm setup:db:auth # Setup mana-core-auth database + schema
|
||||
pnpm setup:db:chat # Setup chat database + schema
|
||||
pnpm setup:db:zitare # Setup zitare database + schema
|
||||
pnpm setup:db:quotes # Setup quotes database + schema
|
||||
pnpm setup:db:contacts # Setup contacts database + schema
|
||||
pnpm setup:db:calendar # Setup calendar database + schema
|
||||
pnpm setup:db:clock # Setup clock database + schema
|
||||
|
|
@ -86,7 +86,7 @@ This is useful when setting up a fresh environment or after pulling new schema c
|
|||
|
||||
On first `pnpm docker:up`, the PostgreSQL container runs `docker/init-db/01-create-databases.sql` which creates all databases:
|
||||
|
||||
- mana_platform, chat, zitare, contacts, calendar, clock, todo, cards
|
||||
- mana_platform, chat, quotes, contacts, calendar, clock, todo, cards
|
||||
- storage, mail, moodlit, finance, inventory, techbase, voxel_lava, figgos
|
||||
|
||||
### Setup Script
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ Mana is designed to streamline the development of multiple interconnected applic
|
|||
|---------|-------------|--------|
|
||||
| **Chat** | AI chat application with multiple models | Stable |
|
||||
| **Picture** | AI image generation | Stable |
|
||||
| **Zitare** | Daily inspiration quotes | Stable |
|
||||
| **Quotes** | Daily inspiration quotes | Stable |
|
||||
| **Cards** | Card/deck management | Beta |
|
||||
| **Contacts** | Contact management | Beta |
|
||||
| **Calendar** | Calendar & scheduling | Alpha |
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ Mana uses a pnpm workspace monorepo with Turborepo for build orchestration.
|
|||
- landing/ Astro marketing page
|
||||
- packages/ Chat-specific packages
|
||||
- picture/
|
||||
- zitare/
|
||||
- quotes/
|
||||
- contacts/
|
||||
- calendar/
|
||||
- ...
|
||||
|
|
|
|||
|
|
@ -61,9 +61,9 @@ Before you begin, ensure you have:
|
|||
```
|
||||
Opens at `http://localhost:5173` (web) and `http://localhost:3002` (API)
|
||||
</TabItem>
|
||||
<TabItem label="Zitare">
|
||||
<TabItem label="Quotes">
|
||||
```bash
|
||||
pnpm dev:zitare:full
|
||||
pnpm dev:quotes:full
|
||||
```
|
||||
Opens at `http://localhost:5174` (web) and `http://localhost:3007` (API)
|
||||
</TabItem>
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ pnpm dev:chat:full
|
|||
Central auth service with EdDSA JWT tokens across all apps.
|
||||
</Card>
|
||||
<Card title="Multiple Apps" icon="puzzle">
|
||||
Chat, Picture, Zitare, Cards, and more - all sharing infrastructure.
|
||||
Chat, Picture, Quotes, Cards, and more - all sharing infrastructure.
|
||||
</Card>
|
||||
<Card title="Modern Stack" icon="rocket">
|
||||
SvelteKit, Expo, NestJS, Drizzle ORM, Tailwind CSS.
|
||||
|
|
@ -51,7 +51,7 @@ pnpm dev:chat:full
|
|||
|---------|-------------|
|
||||
| **Chat** | AI chat with multiple models |
|
||||
| **Picture** | AI image generation |
|
||||
| **Zitare** | Daily inspiration quotes |
|
||||
| **Quotes** | Daily inspiration quotes |
|
||||
| **Cards** | Card & deck management |
|
||||
| **Contacts** | Contact management |
|
||||
| **Calendar** | Calendar & scheduling |
|
||||
|
|
|
|||
|
|
@ -28,12 +28,12 @@ Mana contains multiple interconnected applications, each serving a specific purp
|
|||
[View Details](/projects/picture)
|
||||
</Card>
|
||||
|
||||
<Card title="Zitare" icon="quote">
|
||||
<Card title="Quotes" icon="quote">
|
||||
Daily inspiration quotes
|
||||
|
||||
**Stack**: NestJS, SvelteKit, Expo
|
||||
|
||||
[View Details](/projects/zitare)
|
||||
[View Details](/projects/quotes)
|
||||
</Card>
|
||||
|
||||
<Card title="Cards" icon="card">
|
||||
|
|
@ -67,7 +67,7 @@ Mana contains multiple interconnected applications, each serving a specific purp
|
|||
|---------|---------|-----|--------|--------|
|
||||
| Chat | 3002 | 5173 | Yes | Stable |
|
||||
| Picture | 3006 | 5175 | Yes | Stable |
|
||||
| Zitare | 3007 | 5177 | Yes | Stable |
|
||||
| Quotes | 3007 | 5177 | Yes | Stable |
|
||||
| Cards | 3009 | 5178 | Yes | Beta |
|
||||
| Contacts | 3015 | 5184 | No | Beta |
|
||||
| Calendar | 3014 | 5179 | No | Alpha |
|
||||
|
|
@ -91,7 +91,7 @@ Mana contains multiple interconnected applications, each serving a specific purp
|
|||
# Use dev:*:full for the best experience
|
||||
pnpm dev:chat:full
|
||||
pnpm dev:picture:full
|
||||
pnpm dev:zitare:full
|
||||
pnpm dev:quotes:full
|
||||
pnpm dev:contacts:full
|
||||
pnpm dev:calendar:full
|
||||
```
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ const ecosystemApps = [
|
|||
{ label: 'Calendar', href: 'https://calendar.mana.how', status: 'beta' },
|
||||
{ label: 'Contacts', href: 'https://contacts.mana.how', status: 'beta' },
|
||||
{ label: 'Clock', href: 'https://clock.mana.how', status: 'beta' },
|
||||
{ label: 'Zitare', href: 'https://zitare.mana.how', status: 'beta' },
|
||||
{ label: 'Quotes', href: 'https://quotes.mana.how', status: 'beta' },
|
||||
{ label: 'Calc', href: 'https://calc.mana.how', status: 'beta' },
|
||||
{ label: 'Arcade', href: 'https://arcade.mana.how', status: 'beta' },
|
||||
// Alpha tier (accessible to alpha testers and above)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
title: Zitare
|
||||
description: Intelligente Zitatverwaltung und Literaturrecherche für akademisches Arbeiten. Zitare revolutioniert wissenschaftliches Schreiben mit KI-gestützter Quellensuche und automatischer Formatierung.
|
||||
title: Quotes
|
||||
description: Intelligente Zitatverwaltung und Literaturrecherche für akademisches Arbeiten. Quotes revolutioniert wissenschaftliches Schreiben mit KI-gestützter Quellensuche und automatischer Formatierung.
|
||||
category: productivity
|
||||
icon: 📚
|
||||
manaUsage:
|
||||
|
|
@ -20,12 +20,12 @@ features:
|
|||
status: available
|
||||
releaseDate: 15.03.2024
|
||||
order: 4
|
||||
website: https://zitare.ai
|
||||
website: https://quotes.ai
|
||||
---
|
||||
|
||||
## Was ist Zitare?
|
||||
## Was ist Quotes?
|
||||
|
||||
Zitare ist dein intelligenter Assistent für wissenschaftliches Arbeiten. Von der Literaturrecherche über die Zitatverwaltung bis zur perfekt formatierten Bibliografie – Zitare nutzt KI, um dir die zeitraubenden Aspekte akademischen Schreibens abzunehmen, damit du dich auf den Inhalt konzentrieren kannst.
|
||||
Quotes ist dein intelligenter Assistent für wissenschaftliches Arbeiten. Von der Literaturrecherche über die Zitatverwaltung bis zur perfekt formatierten Bibliografie – Quotes nutzt KI, um dir die zeitraubenden Aspekte akademischen Schreibens abzunehmen, damit du dich auf den Inhalt konzentrieren kannst.
|
||||
|
||||
## Hauptfunktionen
|
||||
|
||||
|
|
@ -117,7 +117,7 @@ Der Mana-Verbrauch richtet sich nach der genutzten Funktion:
|
|||
|
||||
## Unterstützte Zitierstile
|
||||
|
||||
Zitare unterstützt alle gängigen Zitierstile:
|
||||
Quotes unterstützt alle gängigen Zitierstile:
|
||||
|
||||
- **APA** (American Psychological Association)
|
||||
- **MLA** (Modern Language Association)
|
||||
|
|
@ -169,7 +169,7 @@ Mit Mana-Credits zahlst du nur für die KI-Features, die du tatsächlich nutzt.
|
|||
|
||||
## Verfügbarkeit
|
||||
|
||||
Zitare ist verfügbar als:
|
||||
Quotes ist verfügbar als:
|
||||
|
||||
- **Web-App** (alle Browser)
|
||||
- **Desktop-App** (Windows, Mac, Linux)
|
||||
|
|
@ -179,7 +179,7 @@ Zitare ist verfügbar als:
|
|||
|
||||
## Vergleich zu Konkurrenz
|
||||
|
||||
| Feature | Zitare | Zotero | Mendeley | EndNote |
|
||||
| Feature | Quotes | Zotero | Mendeley | EndNote |
|
||||
| -------------------- | ------ | ------ | -------- | ------- |
|
||||
| KI-Zusammenfassungen | ✅ | ❌ | ❌ | ❌ |
|
||||
| Flexible Abrechnung | ✅ | ✅ | ❌ | ❌ |
|
||||
|
|
@ -190,7 +190,7 @@ Zitare ist verfügbar als:
|
|||
|
||||
## Kostenlos starten
|
||||
|
||||
Die Basis-Funktionen von Zitare sind komplett kostenlos:
|
||||
Die Basis-Funktionen von Quotes sind komplett kostenlos:
|
||||
|
||||
- Unbegrenzte Quellen speichern
|
||||
- Alle Zitierstile nutzen
|
||||
|
|
@ -138,7 +138,7 @@ Dieses Dokument analysiert den aktuellen Zustand der Mana-Infrastruktur auf dem
|
|||
| Todo Bot | mana-matrix-todo-bot | 3314 | Task Management |
|
||||
| Calendar Bot | mana-matrix-calendar-bot | 3315 | Termine |
|
||||
| Food Bot | mana-matrix-food-bot | 3316 | Nutrition |
|
||||
| Zitare Bot | mana-matrix-zitare-bot | 3317 | Quotes |
|
||||
| Quotes Bot | mana-matrix-quotes-bot | 3317 | Quotes |
|
||||
| Clock Bot | mana-matrix-clock-bot | 3318 | Time Tracking |
|
||||
| TTS Bot | mana-matrix-tts-bot | 3033 | Text-to-Speech |
|
||||
|
||||
|
|
@ -260,7 +260,7 @@ api-gateway:
|
|||
Viele Matrix-Bots teilen ähnlichen Code:
|
||||
|
||||
- `matrix-todo-bot` und `matrix-calendar-bot` haben ähnliche Reminder-Logik
|
||||
- `matrix-food-bot` und `matrix-zitare-bot` sind Wrapper für Backends
|
||||
- `matrix-food-bot` und `matrix-quotes-bot` sind Wrapper für Backends
|
||||
- `matrix-mana-bot` sollte theoretisch alle anderen ersetzen
|
||||
|
||||
### 5. Volume-Fragmentierung
|
||||
|
|
@ -275,7 +275,7 @@ volumes:
|
|||
matrix_calendar_bot_data:
|
||||
matrix_todo_bot_data:
|
||||
matrix_food_bot_data:
|
||||
matrix_zitare_bot_data:
|
||||
matrix_quotes_bot_data:
|
||||
matrix_clock_bot_data:
|
||||
matrix_tts_bot_data:
|
||||
```
|
||||
|
|
@ -401,7 +401,7 @@ AKTUELL: 10 separate Bot-Container
|
|||
│ matrix-mana-bot │ matrix-ollama-bot │ ... │
|
||||
│ matrix-stats-bot │ matrix-project-doc │ │
|
||||
│ matrix-todo-bot │ matrix-calendar-bot │ │
|
||||
│ matrix-food-bot │ matrix-zitare-bot │ │
|
||||
│ matrix-food-bot │ matrix-quotes-bot │ │
|
||||
│ matrix-clock-bot │ matrix-tts-bot │ │
|
||||
└────────────────────────────────────────────────────────────┘
|
||||
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ export class AppModule {}
|
|||
- todo-backend (Port 3004)
|
||||
- clock-backend (Port 3005)
|
||||
- picture-backend (Port 3006)
|
||||
- zitare-backend (Port 3007)
|
||||
- quotes-backend (Port 3007)
|
||||
- presi-backend (Port 3008)
|
||||
- cards-backend (Port 3009)
|
||||
- contacts-backend (Port 3010)
|
||||
|
|
@ -292,7 +292,7 @@ export async function GET() {
|
|||
### Betroffene Apps
|
||||
|
||||
- calendar-web, clock-web, contacts-web
|
||||
- chat-web, picture-web, zitare-web
|
||||
- chat-web, picture-web, quotes-web
|
||||
- todo-web, cards-web, manacore-web
|
||||
- presi-web, storage-web, food-web
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ Außergewöhnlich produktiver Tag (und Nacht!) mit **74 Commits** und mehreren g
|
|||
- **mana-search Microservice** - SearXNG Meta-Search + Content Extraction
|
||||
- **@manacore/bot-services** - Shared Business Logic Package
|
||||
- **matrix-mana-bot** - Unified Gateway Bot für alle Features
|
||||
- **4 neue Matrix Bots** - Todo, Food, Zitare, Clock
|
||||
- **4 neue Matrix Bots** - Todo, Food, Quotes, Clock
|
||||
- **OIDC Provider** - Matrix SSO via mana-core-auth
|
||||
- **VictoriaMetrics** - Monitoring Upgrade mit DuckDB Analytics
|
||||
- **App Cleanup** - Demo Mode für Calendar, Todo, Contacts
|
||||
|
|
@ -377,7 +377,7 @@ Ernährungs-Tracking via Matrix:
|
|||
|
||||
**Voice Transcription** via mana-stt für Sprachnachrichten.
|
||||
|
||||
### matrix-zitare-bot
|
||||
### matrix-quotes-bot
|
||||
|
||||
Tägliche Inspirations-Zitate:
|
||||
|
||||
|
|
@ -571,7 +571,7 @@ apps/calendar/apps/web/src/lib/services/
|
|||
| matrix-mana-bot | 3310 | NestJS | Gateway Bot |
|
||||
| matrix-todo-bot | 3315 | NestJS | Todo Bot |
|
||||
| matrix-food-bot | 3316 | NestJS | Nutrition Bot |
|
||||
| matrix-zitare-bot | 3317 | NestJS | Quotes Bot |
|
||||
| matrix-quotes-bot | 3317 | NestJS | Quotes Bot |
|
||||
| matrix-clock-bot | 3318 | NestJS | Timer Bot |
|
||||
|
||||
---
|
||||
|
|
@ -585,12 +585,12 @@ apps/calendar/apps/web/src/lib/services/
|
|||
| Matrix Client | 1 | Phase 2 Features |
|
||||
| mana-search | 3 | SearXNG, Extraction, Cache |
|
||||
| Bot Services | 2 | Shared Package + Gateway |
|
||||
| Matrix Bots | 8 | Todo, Food, Zitare, Clock |
|
||||
| Matrix Bots | 8 | Todo, Food, Quotes, Clock |
|
||||
| OIDC | 6 | Matrix SSO Provider |
|
||||
| App Cleanup | 8 | Demo Mode, Feature Removal |
|
||||
| Monitoring | 2 | VictoriaMetrics, DuckDB |
|
||||
| Food | 2 | Tests, Production Ready |
|
||||
| Telegram Bots | 1 | Food, Todo, Zitare |
|
||||
| Telegram Bots | 1 | Food, Todo, Quotes |
|
||||
| Bugfixes | 15+ | Auth, Matrix, Docker |
|
||||
| Documentation | 5 | Monitoring, Services, DevLogs |
|
||||
|
||||
|
|
|
|||
|
|
@ -217,7 +217,7 @@ Zentraler Notification-Service für Email, Push, Matrix und Webhooks.
|
|||
```
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ Consumer Apps │
|
||||
│ Auth │ Calendar │ Chat │ Picture │ Zitare │ ... │
|
||||
│ Auth │ Calendar │ Chat │ Picture │ Quotes │ ... │
|
||||
└─────────────────────────┬───────────────────────────────────────────┘
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
|
|
@ -492,7 +492,7 @@ import { HealthModule } from '@manacore/shared-nestjs-health';
|
|||
```
|
||||
|
||||
**Migrierte Backends (12):**
|
||||
calendar, chat, clock, contacts, food, picture, planta, presi, skilltree, storage, todo, zitare
|
||||
calendar, chat, clock, contacts, food, picture, planta, presi, skilltree, storage, todo, quotes
|
||||
|
||||
### @manacore/shared-nestjs-setup
|
||||
|
||||
|
|
@ -514,7 +514,7 @@ await app.listen(process.env.PORT || 3002);
|
|||
```
|
||||
|
||||
**Migrierte Backends (8):**
|
||||
chat, calendar, contacts, zitare, clock, planta, presi, food
|
||||
chat, calendar, contacts, quotes, clock, planta, presi, food
|
||||
|
||||
### @manacore/shared-tsconfig
|
||||
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ services/
|
|||
├── telegram-project-doc-bot/ # ENTFERNT
|
||||
├── telegram-food-bot/ # ENTFERNT
|
||||
├── telegram-todo-bot/ # ENTFERNT
|
||||
└── telegram-zitare-bot/ # ENTFERNT
|
||||
└── telegram-quotes-bot/ # ENTFERNT
|
||||
```
|
||||
|
||||
### Begründung
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ Alle Authentifizierungs-Seiten sind jetzt mehrsprachig.
|
|||
- Questions Web
|
||||
- SkillTree Web
|
||||
- Todo Web
|
||||
- Zitare Web
|
||||
- Quotes Web
|
||||
|
||||
### Implementierung
|
||||
|
||||
|
|
@ -126,7 +126,7 @@ export const t = derived(locale, ($locale) => {
|
|||
|
||||
### Neue Auth Pages
|
||||
|
||||
Fehlende Auth-Pages für Zitare und Planta hinzugefügt:
|
||||
Fehlende Auth-Pages für Quotes und Planta hinzugefügt:
|
||||
|
||||
- `/login`
|
||||
- `/register`
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ Single Sign-On über alle ManaCore Web Apps.
|
|||
| SkillTree | skilltree.mana.how | ✅ |
|
||||
| Storage | storage.mana.how | ✅ |
|
||||
| Todo | todo.mana.how | ✅ |
|
||||
| Zitare | zitare.mana.how | ✅ |
|
||||
| Quotes | quotes.mana.how | ✅ |
|
||||
| Manalink | manalink.mana.how | ✅ |
|
||||
| Playground | playground.mana.how | ✅ |
|
||||
|
||||
|
|
@ -204,7 +204,7 @@ Neue Übersichtsseite mit allen 19 Matrix Bots in Manalink.
|
|||
| matrix-contacts-bot | Productivity | Kontaktverwaltung |
|
||||
| matrix-food-bot | Health | Ernährungs-Tracking |
|
||||
| matrix-picture-bot | AI | Bildgenerierung |
|
||||
| matrix-zitare-bot | Inspiration | Tägliche Zitate |
|
||||
| matrix-quotes-bot | Inspiration | Tägliche Zitate |
|
||||
| matrix-skilltree-bot | Gamification | Skill-Tracking |
|
||||
| matrix-planta-bot | Lifestyle | Pflanzenpflege |
|
||||
| matrix-cards-bot | Learning | Lernkarten |
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ services:
|
|||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
zitare-backend:
|
||||
quotes-backend:
|
||||
healthcheck:
|
||||
test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3007/health']
|
||||
# Korrigierter Pfad (vorher /api/health)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
title: 'Gift Codes, Stripe Integration & Zitare Deployment'
|
||||
description: 'Neues Gift Code System mit Credit-Gutscheinen, Stripe Integration für Subscriptions und Credit-Käufe, Zitare Production Deployment mit multilingualer Quote-Datenbank, sowie Calendar Drag-to-Create und Matrix WhatsApp-Style Navigation'
|
||||
title: 'Gift Codes, Stripe Integration & Quotes Deployment'
|
||||
description: 'Neues Gift Code System mit Credit-Gutscheinen, Stripe Integration für Subscriptions und Credit-Käufe, Quotes Production Deployment mit multilingualer Quote-Datenbank, sowie Calendar Drag-to-Create und Matrix WhatsApp-Style Navigation'
|
||||
date: 2026-02-13
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
|
|
@ -10,7 +10,7 @@ tags:
|
|||
'stripe',
|
||||
'subscriptions',
|
||||
'credits',
|
||||
'zitare',
|
||||
'quotes',
|
||||
'calendar',
|
||||
'matrix',
|
||||
'avatar',
|
||||
|
|
@ -38,7 +38,7 @@ Ein massiver Tag mit **55 Commits** und mehreren Major Features:
|
|||
|
||||
- **Gift Codes** - Credit-Gutscheine mit Code-Einlösung
|
||||
- **Stripe Integration** - Subscriptions und Credit-Käufe
|
||||
- **Zitare Deployment** - Production-Ready mit multilingualer Quote-DB
|
||||
- **Quotes Deployment** - Production-Ready mit multilingualer Quote-DB
|
||||
- **Calendar UX** - Drag-to-Create, Resize Handles, Live Preview
|
||||
- **Matrix Mobile** - WhatsApp-Style Navigation für PWA
|
||||
- **Avatar Upload** - S3/MinIO Integration mit Onboarding
|
||||
|
|
@ -210,42 +210,42 @@ async handleWebhook(@Req() req: Request) {
|
|||
|
||||
---
|
||||
|
||||
## Zitare Production Deployment
|
||||
## Quotes Production Deployment
|
||||
|
||||
Zitare ist jetzt live auf zitare.mana.how!
|
||||
Quotes ist jetzt live auf quotes.mana.how!
|
||||
|
||||
### Docker Infrastructure
|
||||
|
||||
```yaml
|
||||
# docker-compose.macmini.yml
|
||||
zitare-backend:
|
||||
quotes-backend:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: apps/zitare/apps/backend/Dockerfile
|
||||
dockerfile: apps/quotes/apps/backend/Dockerfile
|
||||
ports:
|
||||
- '3007:3007'
|
||||
environment:
|
||||
DATABASE_URL: ${ZITARE_DATABASE_URL}
|
||||
DATABASE_URL: ${QUOTES_DATABASE_URL}
|
||||
MANA_CORE_AUTH_URL: http://mana-core-auth:3001
|
||||
healthcheck:
|
||||
test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3007/health']
|
||||
|
||||
zitare-web:
|
||||
quotes-web:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: apps/zitare/apps/web/Dockerfile
|
||||
dockerfile: apps/quotes/apps/web/Dockerfile
|
||||
ports:
|
||||
- '5018:5018'
|
||||
depends_on:
|
||||
- zitare-backend
|
||||
- quotes-backend
|
||||
```
|
||||
|
||||
### @zitare/content Package
|
||||
### @quotes/content Package
|
||||
|
||||
Neues Package für shared Quotes:
|
||||
|
||||
```typescript
|
||||
// packages/zitare-content/src/quotes.ts
|
||||
// packages/quotes-content/src/quotes.ts
|
||||
export interface Quote {
|
||||
id: string;
|
||||
text: string;
|
||||
|
|
@ -588,7 +588,7 @@ Neues Dashboard auf mana.how.
|
|||
|
||||
## Settings Stores
|
||||
|
||||
Neue Settings-Stores für Zitare und Todo.
|
||||
Neue Settings-Stores für Quotes und Todo.
|
||||
|
||||
### Pattern
|
||||
|
||||
|
|
@ -610,10 +610,10 @@ export const settings = persisted<AppSettings>('app-settings', {
|
|||
});
|
||||
```
|
||||
|
||||
### Zitare Settings
|
||||
### Quotes Settings
|
||||
|
||||
```typescript
|
||||
interface ZitareSettings extends AppSettings {
|
||||
interface QuotesSettings extends AppSettings {
|
||||
dailyNotificationTime: string; // "09:00"
|
||||
favoriteCategories: string[];
|
||||
showAuthorInfo: boolean;
|
||||
|
|
@ -699,12 +699,12 @@ Weitere Services auf lokale Builds umgestellt:
|
|||
| --------------------- | ------- | ------------------------------- |
|
||||
| **Gift Codes** | 4 | Code-System, Matrix Integration |
|
||||
| **Stripe** | 3 | Subscriptions, Credit Purchases |
|
||||
| **Zitare** | 10 | Docker, Quotes, i18n |
|
||||
| **Quotes** | 10 | Docker, Quotes, i18n |
|
||||
| **Calendar** | 6 | Drag-Create, Resize, Mobile UX |
|
||||
| **Matrix** | 8 | WhatsApp-Nav, PWA, Swipe |
|
||||
| **ManaCore** | 8 | Profile, Credits, Storage |
|
||||
| **Avatar/Onboarding** | 3 | S3 Upload, Wizard |
|
||||
| **Settings** | 2 | Zitare, Todo Stores |
|
||||
| **Settings** | 2 | Quotes, Todo Stores |
|
||||
| **Auth/Docker** | 8 | Healthchecks, Builds |
|
||||
| **Devlog** | 3 | Activity Grid |
|
||||
|
||||
|
|
@ -716,4 +716,4 @@ Weitere Services auf lokale Builds umgestellt:
|
|||
2. **Gift Code UI** - Admin-Panel für Code-Erstellung
|
||||
3. **Subscription Emails** - Bestätigungen und Erinnerungen
|
||||
4. **Matrix E2EE** - Verschlüsselung für DMs aktivieren
|
||||
5. **Zitare Push** - Daily Quote Notifications
|
||||
5. **Quotes Push** - Daily Quote Notifications
|
||||
|
|
@ -435,7 +435,7 @@ Tracking IDs für alle Web-Apps aktualisiert.
|
|||
| contacts-web | `contacts-prod` |
|
||||
| todo-web | `todo-prod` |
|
||||
| picture-web | `picture-prod` |
|
||||
| zitare-web | `zitare-prod` |
|
||||
| quotes-web | `quotes-prod` |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ Progressive Web App Dependencies wurden zu allen SvelteKit Web-Apps hinzugefügt
|
|||
| ManaCore | ✅ Aktiviert |
|
||||
| Chat | ✅ Aktiviert |
|
||||
| Picture | ✅ Aktiviert |
|
||||
| Zitare | ✅ Aktiviert |
|
||||
| Quotes | ✅ Aktiviert |
|
||||
| Calendar | ✅ Aktiviert |
|
||||
| Contacts | ✅ Aktiviert |
|
||||
| Todo | ✅ Aktiviert |
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ User loggt sich in Calendar ein → ✓
|
|||
User öffnet Todo → ❌ Nicht eingeloggt (SSO fehlgeschlagen)
|
||||
```
|
||||
|
||||
10 Apps fehlten in `trustedOrigins`: Mukke, Photos, Planta, Questions, Todo, Traces, Context, Docs, Cards, Zitare.
|
||||
10 Apps fehlten in `trustedOrigins`: Mukke, Photos, Planta, Questions, Todo, Traces, Context, Docs, Cards, Quotes.
|
||||
|
||||
### Der Fix
|
||||
|
||||
|
|
@ -112,7 +112,7 @@ const APPS_WITH_SSO = [
|
|||
'storage',
|
||||
'todo',
|
||||
'traces',
|
||||
'zitare',
|
||||
'quotes',
|
||||
];
|
||||
|
||||
it.each(APPS_WITH_SSO)('should include %s.mana.how in trustedOrigins', (appName) => {
|
||||
|
|
@ -271,7 +271,7 @@ GlitchTip (selbst-gehostete Sentry-Alternative) wurde für **alle 15 Backends**
|
|||
| Skilltree | 3038 | #16 |
|
||||
| Storage | 3035 | #17 |
|
||||
| Todo | 3031 | #3 |
|
||||
| Zitare | 3007 | #8 |
|
||||
| Quotes | 3007 | #8 |
|
||||
|
||||
### Grafana Dashboard
|
||||
|
||||
|
|
@ -302,7 +302,7 @@ Alle 20 aktiven Apps wurden bewertet nach 8 Kategorien (Backend, Frontend, Datab
|
|||
| **Matrix** | 68 | Production | E2E Encryption |
|
||||
| **Food** | 63 | Beta | Gemini AI Integration |
|
||||
| **Photos** | 62 | Beta | mana-media Integration |
|
||||
| **Zitare** | 62 | Beta | Deployed auf mana.how |
|
||||
| **Quotes** | 62 | Beta | Deployed auf mana.how |
|
||||
| **Context** | 60 | Beta | Neuer Backend (Port 3020) |
|
||||
| **Clock** | 58 | Beta | Kein CLAUDE.md, keine Tests |
|
||||
| **Skilltree** | 58 | Beta | Offline-first PWA |
|
||||
|
|
|
|||
|
|
@ -203,7 +203,7 @@ export const handleError: HandleClientError = ({ error }) => {
|
|||
|
||||
| Apps |
|
||||
| ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Calendar, Chat, Clock, Contacts, Context, Manacore, Cards, Matrix, Mukke, Food, Photos, Picture, Planta, Presi, Questions, Skilltree, Storage, Todo, Zitare |
|
||||
| Calendar, Chat, Clock, Contacts, Context, Manacore, Cards, Matrix, Mukke, Food, Photos, Picture, Planta, Presi, Questions, Skilltree, Storage, Todo, Quotes |
|
||||
|
||||
### API
|
||||
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ Das bestehende `ContextMenu`-Component aus `@manacore/shared-ui` wurde systemati
|
|||
| **Cards** | Deck-Karten | Öffnen, Löschen | `28286d12` |
|
||||
| **Photos** | PhotoGrid | Anzeigen, Favorit toggle, Löschen | `28286d12` |
|
||||
| **Photos** | AlbumGrid | Öffnen, Löschen | `28286d12` |
|
||||
| **Zitare** | Favoriten | Aus Favoriten entfernen, Kopieren, Teilen | `28286d12` |
|
||||
| **Quotes** | Favoriten | Aus Favoriten entfernen, Kopieren, Teilen | `28286d12` |
|
||||
| **Calendar** | AgendaView | Bearbeiten, Duplizieren, Löschen | `ecda4535` |
|
||||
| **Chat** | ConversationList | Umbenennen, Archivieren, Löschen | `ecda4535` |
|
||||
| **Contacts** | ContactGridView | Öffnen, Favorit, Anrufen, E-Mail, Löschen | `ecda4535` |
|
||||
|
|
@ -105,7 +105,7 @@ Neues monorepo-weites Package, das die LLM-Integration für alle Backends verein
|
|||
|
||||
```
|
||||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||||
│ Chat Backend │ │ Zitare Backend│ │ Planta Backend│
|
||||
│ Chat Backend │ │ Quotes Backend│ │ Planta Backend│
|
||||
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
|
|
@ -123,7 +123,7 @@ Neues monorepo-weites Package, das die LLM-Integration für alle Backends verein
|
|||
**48 Dateien geändert**, +2.477 / -1.298 Zeilen. Alle Backends migriert:
|
||||
|
||||
- `@chat/backend` — Chat AI-Completions
|
||||
- `@zitare/backend` — Zitat-Analyse (vorher eigener Ollama-Service)
|
||||
- `@quotes/backend` — Zitat-Analyse (vorher eigener Ollama-Service)
|
||||
- `@planta/backend` — Pflanzen-Vision-Analyse
|
||||
- `@food/backend` — Ernährungs-Analyse (Gemini)
|
||||
- `mana-core-auth` — AI-Service für Auth-Features
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ Extrem produktiver Vormittag mit **61 Commits** über **695 Dateien** und netto
|
|||
|
||||
- **Manalink Live** - Matrix-Chat-Client auf Production gebracht und auf link.mana.how deployed
|
||||
- **CityCorners** - City Guide für Konstanz mit PWA, i18n, mana-search Integration und 31 Backend-Tests
|
||||
- **Spiral-DB** - 174 Tests, kritische PNG-Bugs gefixt, in Zitare und Contacts integriert
|
||||
- **Spiral-DB** - 174 Tests, kritische PNG-Bugs gefixt, in Quotes und Contacts integriert
|
||||
- **Auth-Migration** - 3 Mobile-Apps (ManaCore, Context, Cards) von Supabase auf mana-core-auth
|
||||
- **Massive Cleanup** - 50+ Legacy-Dateien gelöscht, Hetzner-Artefakte entfernt, API-Keys bereinigt
|
||||
- **Observability** - Prometheus Metrics für mana-search, mana-media und Synapse
|
||||
|
|
@ -174,7 +174,7 @@ Umfassende Test-Suite und mehrere kritische Fixes:
|
|||
| String zu lang | 511-Byte Max-Length Enforcement |
|
||||
| Index-Ring-Count zu klein | 6 Bits (2 Pixel) statt 3 Bits für >7 Ring Support |
|
||||
|
||||
### Zitare-Integration
|
||||
### Quotes-Integration
|
||||
|
||||
Spiral-DB als zweite App (nach Todo) mit pixelbasierter Spiral-Visualisierung:
|
||||
|
||||
|
|
@ -395,7 +395,7 @@ Umami-Tracking in Todo, Calendar und Contacts erweitert. ANALYTICS.md aktualisie
|
|||
| --------------- | ------- | ----------------------------------------------------------------- |
|
||||
| Manalink | 7 | Prod-Ready, Security, Tests, E2EE-Warning, Live Deploy |
|
||||
| CityCorners | 8 | PWA, i18n, mana-search, Submission Form, 31 Tests |
|
||||
| Spiral-DB | 3 | 174 Tests, 8 kritische Bugs gefixt, Zitare + Contacts Integration |
|
||||
| Spiral-DB | 3 | 174 Tests, 8 kritische Bugs gefixt, Quotes + Contacts Integration |
|
||||
| Auth-Migration | 6 | 3 Mobile-Apps, 20 Web-Stores, Supabase-Package entfernt |
|
||||
| Cleanup | 7 | 50+ Dateien gelöscht, Hetzner weg, API-Keys bereinigt |
|
||||
| Observability | 5 | 3 neue Services, 15 Backend Metrics, GlitchTip Health |
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ Neuer `getAllOpenTasks()` Service-Call, der `GET /tasks` nutzt und alle offenen
|
|||
|
||||
### Fehlende Packages in Dockerfiles
|
||||
|
||||
9 Web-App-Dockerfiles fehlte das `COPY packages/shared-app-onboarding` Statement, was zu Build-Fehlern führte. Betroffen: Chat, Clock, Mukke, Photos, Picture, Presi, Skilltree, Storage, Zitare.
|
||||
9 Web-App-Dockerfiles fehlte das `COPY packages/shared-app-onboarding` Statement, was zu Build-Fehlern führte. Betroffen: Chat, Clock, Mukke, Photos, Picture, Presi, Skilltree, Storage, Quotes.
|
||||
|
||||
### Dockerfile Dependency Validator
|
||||
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ Help-Pages in 10+ bisher fehlende Apps nachgezogen, verbesserte Inhalte für all
|
|||
- `dd5c0d50` — Calendar, Todo Help
|
||||
- `f0233b8d` — Storage, Chat, Picture Help
|
||||
- `7077c0a3` — Help-Pages in 10 Apps
|
||||
- `bdab2722` — Shared Translations, Zitare + Mukke Help
|
||||
- `bdab2722` — Shared Translations, Quotes + Mukke Help
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -148,7 +148,7 @@ Help-Pages in 10+ bisher fehlende Apps nachgezogen, verbesserte Inhalte für all
|
|||
- ManaScore Extended Codebase-Metrics für alle App-Audits (`b9a9052a`)
|
||||
- Fehlende prom-client Dependency in 4 Backends (`422b4f9f`)
|
||||
- Onboarding-Modal in 8 Apps aus Flex-Layout rausgeschoben (`491c71e2`)
|
||||
- Fehlende Cloudflare-Tunnel-Routes für Zitare, SkillTree, Planta (`d8886346`)
|
||||
- Fehlende Cloudflare-Tunnel-Routes für Quotes, SkillTree, Planta (`d8886346`)
|
||||
|
||||
### Dokumentation
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
title: 'Storage-Sprint, Passkeys & 2FA, Cross-App Tags, Zitare-Polish & Local-First Planung'
|
||||
description: 'Massiver Tag mit 61 Commits: Storage auf ManaScore 87, WebAuthn/Passkeys und TOTP-2FA, Cross-App Tag-System, Zitare-Komplett-Polish, SvelteKit Base-Image, und Local-First Architekturplanung.'
|
||||
title: 'Storage-Sprint, Passkeys & 2FA, Cross-App Tags, Quotes-Polish & Local-First Planung'
|
||||
description: 'Massiver Tag mit 61 Commits: Storage auf ManaScore 87, WebAuthn/Passkeys und TOTP-2FA, Cross-App Tag-System, Quotes-Komplett-Polish, SvelteKit Base-Image, und Local-First Architekturplanung.'
|
||||
date: 2026-03-26
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
|
|
@ -11,7 +11,7 @@ tags:
|
|||
'passkeys',
|
||||
'2fa',
|
||||
'tags',
|
||||
'zitare',
|
||||
'quotes',
|
||||
'infrastructure',
|
||||
'docker',
|
||||
'local-first',
|
||||
|
|
@ -35,12 +35,12 @@ workingHours:
|
|||
end: '2026-03-26T22:00'
|
||||
---
|
||||
|
||||
Massiver Tag mit **61 Commits** über **329 Dateien** und netto **+16.715 Zeilen** — Storage-Sprint, Auth-Features, Tag-System, Zitare-Polish, Infra und Architekturplanung:
|
||||
Massiver Tag mit **61 Commits** über **329 Dateien** und netto **+16.715 Zeilen** — Storage-Sprint, Auth-Features, Tag-System, Quotes-Polish, Infra und Architekturplanung:
|
||||
|
||||
- **Storage-App komplett** — Von Score 72 auf 87: Previews, Audio-Player, Skeleton Screens, Sharing, Tagging, i18n, E2E-Tests
|
||||
- **Auth: Passkeys & 2FA** — WebAuthn/Passkeys und TOTP-2FA in allen Apps, Google/Apple Login entfernt
|
||||
- **Cross-App Tag-System** — Neues Tag-System mit Gruppen und Entity-Links in 18 Apps integriert
|
||||
- **Zitare Komplett-Polish** — i18n, Display-Settings, Suche, Filter, Author-Bios, Loading States
|
||||
- **Quotes Komplett-Polish** — i18n, Display-Settings, Suche, Filter, Author-Bios, Loading States
|
||||
- **Local-First Architektur** — Umfassende Planung für Dexie.js + Go Sync-Server + Hono/Bun
|
||||
- **Infra** — SvelteKit Base-Image, build-app.sh Script, Dockerfile-Fixes
|
||||
|
||||
|
|
@ -162,7 +162,7 @@ Neues, app-übergreifendes Tag-System mit:
|
|||
|
||||
---
|
||||
|
||||
## 4. Zitare: Komplett-Polish
|
||||
## 4. Quotes: Komplett-Polish
|
||||
|
||||
Umfassende Qualitätsverbesserungen für die Zitate-App:
|
||||
|
||||
|
|
@ -225,7 +225,7 @@ Neues `sveltekit-base:local` Docker-Image mit allen Shared Packages vorinstallie
|
|||
- `9c8bae3d` — NestJS Auth: Multiple JWT-Issuers für Docker/Public URL Mismatch
|
||||
- `2b0b902b` — Credit-Operations Package Exports auf compiled `dist/` zeigend
|
||||
- `5a3ee5c7` — Todo Task UI: Priority-Checkboxes, Drag-Styling, Route-Fix
|
||||
- Diverse Dockerfile-Fixes für Zitare, Storage, Todo (fehlende Dependencies, Node Heap Size)
|
||||
- Diverse Dockerfile-Fixes für Quotes, Storage, Todo (fehlende Dependencies, Node Heap Size)
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -236,7 +236,7 @@ Neues `sveltekit-base:local` Docker-Image mit allen Shared Packages vorinstallie
|
|||
| **Storage** | Score 72 → 87: Previews, Audio-Player, Sharing, Tagging, E2E-Tests, i18n |
|
||||
| **Auth** | Passkeys + TOTP-2FA in allen Apps, Social Login entfernt, 35+ Tests |
|
||||
| **Tags** | Cross-App Tag-System in 18 Apps integriert, 37 Backend-Tests |
|
||||
| **Zitare** | Komplett i18n, Display-Settings, Suche, Filter, Author-Bios |
|
||||
| **Quotes** | Komplett i18n, Display-Settings, Suche, Filter, Author-Bios |
|
||||
| **Architektur** | Local-First Planung: Dexie.js + Go Sync + Hono/Bun |
|
||||
| **Infra** | SvelteKit Base-Image, build-app.sh, Dockerfile-Fixes |
|
||||
| **Gesamt** | 61 Commits, 329 Dateien, +19.553 / -2.838 Zeilen |
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ Jeder Matrix-Bot lief als eigenständiger NestJS-Service mit eigenem Docker-Cont
|
|||
| matrix-todo-bot | Aufgabenverwaltung | 4014 |
|
||||
| matrix-calendar-bot | Kalender | 4015 |
|
||||
| matrix-food-bot | Ernährungstracking | 4016 |
|
||||
| matrix-zitare-bot | Zitate & Inspiration | 4017 |
|
||||
| matrix-quotes-bot | Zitate & Inspiration | 4017 |
|
||||
| matrix-clock-bot | Timer, Alarme, Weltuhren | 4018 |
|
||||
| matrix-tts-bot | Text-to-Speech | 4019 |
|
||||
| matrix-stt-bot | Speech-to-Text | 4021 |
|
||||
|
|
@ -129,7 +129,7 @@ services/mana-matrix-bot/ # 50 Dateien, 7.620 Zeilen Go
|
|||
│ ├── calendar/ # !heute, !morgen, !woche, !termine
|
||||
│ ├── clock/ # !timer, !stop, !alarm, !zeit
|
||||
│ ├── contacts/ # !kontakte, !suche, !favoriten, !edit
|
||||
│ ├── zitare/ # !zitat, !suche, !kategorie, !favoriten
|
||||
│ ├── quotes/ # !zitat, !suche, !kategorie, !favoriten
|
||||
│ ├── planta/ # !pflanzen, !giessen, !fällig, !historie
|
||||
│ ├── ollama/ # AI Chat, !models, !all, !mode
|
||||
│ ├── stt/ # Audio→Text, !language, !model
|
||||
|
|
@ -215,7 +215,7 @@ Neues Plugin hinzufügen = 3 Schritte:
|
|||
| **calendar** | !heute, !morgen, !woche, !termine, !termin, !löschen, !kalender | Event creation, Date parsing |
|
||||
| **clock** | !timer, !stop, !resume, !reset, !timers, !alarm, !alarme, !zeit | Duration parsing (25m, 1h30m) |
|
||||
| **contacts** | !kontakte, !suche, !favoriten, !kontakt, !neu, !edit, !fav, !delete | 16 editierbare Felder, Number-References |
|
||||
| **zitare** | !zitat, !heute, !suche, !kategorie, !kategorien, !motivation, !favorit, !favoriten, !listen | Categories, Favorites, Lists |
|
||||
| **quotes** | !zitat, !heute, !suche, !kategorie, !kategorien, !motivation, !favorit, !favoriten, !listen | Categories, Favorites, Lists |
|
||||
| **planta** | !pflanzen, !pflanze, !neu, !giessen, !fällig, !historie, !intervall, !edit, !delete | Watering schedule, Health tracking |
|
||||
| **ollama** | AI Chat, !models, !model, !clear, !all, !mode | Chat history, System prompts, Model comparison |
|
||||
| **stt** | Audio→Text, !language, !model, !status | Whisper/Voxtral, Language selection |
|
||||
|
|
|
|||
|
|
@ -162,5 +162,5 @@ State wird in localStorage persistiert. Aktuell nur in der Todo-App, geplant als
|
|||
## Nächste Schritte
|
||||
|
||||
- Debug-Borders als globales Shared-Package für alle Apps
|
||||
- Keyboard-Navigation Pattern in andere Apps übertragen (Zitare, Contacts)
|
||||
- Keyboard-Navigation Pattern in andere Apps übertragen (Quotes, Contacts)
|
||||
- Tastatur-Shortcut-Hilfe (? oder Ctrl+/) mit Overlay
|
||||
|
|
|
|||
|
|
@ -275,7 +275,7 @@ Drei Komponenten die über viele Apps hinweg dupliziert waren:
|
|||
|
||||
| Komponente | Apps (vorher) | Lösung |
|
||||
| ------------------ | ------------------------------------------------------------- | ------------------------------------------------------- |
|
||||
| `LanguageSelector` | contacts, zitare: Custom-Dropdown mit eigenem State | → `PillDropdown` aus shared-ui (wie die anderen 8 Apps) |
|
||||
| `LanguageSelector` | contacts, quotes: Custom-Dropdown mit eigenem State | → `PillDropdown` aus shared-ui (wie die anderen 8 Apps) |
|
||||
| `ConfirmDialog` | context (4 Stellen), times (3 Stellen): lokale Kopien | → `ConfirmationModal` aus `@manacore/shared-ui` |
|
||||
| `AppSlider` | todo, calendar, chat, contacts, presi: statisches `MANA_APPS` | → `getActiveManaApps()` (filtert inaktive Apps) |
|
||||
|
||||
|
|
@ -308,7 +308,7 @@ Das Arcade-Backend (AI Browser Games) war noch auf NestJS. Migration auf Hono/Bu
|
|||
|
||||
| Fix | Beschreibung |
|
||||
| -------------- | ------------------------------------------------------------ |
|
||||
| Port-Konflikt | calc-web: Port 5026 → 5031 (kollidierte mit zitare-web) |
|
||||
| Port-Konflikt | calc-web: Port 5026 → 5031 (kollidierte mit quotes-web) |
|
||||
| Cloudflared | Config mit tatsächlichen Container-Ports synchronisiert |
|
||||
| Landings Nginx | `mkdir snippets` vor Copy, status.mana.how vhost hinzugefügt |
|
||||
| Prerender 404 | favicon.png 404s bei skilltree + food unterdrückt |
|
||||
|
|
@ -347,5 +347,5 @@ Drei neue Planungs-/Guidelines-Dokumente:
|
|||
|
||||
- Memoro Production-Deploy + DNS
|
||||
- Status-Page: Alert-Integration (Matrix-Benachrichtigung bei Downtime)
|
||||
- Todo: Keyboard-Navigation-Pattern auf andere Apps übertragen (Zitare, Contacts)
|
||||
- Todo: Keyboard-Navigation-Pattern auf andere Apps übertragen (Quotes, Contacts)
|
||||
- Debug-Borders als globales Shared-Package
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ spotlight.registerActions('todo', [
|
|||
|
||||
### Content-Search-Provider
|
||||
|
||||
Spotlight kann jetzt **inhaltlich** suchen — über Provider, die IndexedDB-Tabellen abfragen. Erste Provider live für **picture, presi, mukke, zitare, clock**.
|
||||
Spotlight kann jetzt **inhaltlich** suchen — über Provider, die IndexedDB-Tabellen abfragen. Erste Provider live für **picture, presi, mukke, quotes, clock**.
|
||||
|
||||
```typescript
|
||||
spotlight.registerSearchProvider('picture', async (query) => {
|
||||
|
|
|
|||
|
|
@ -290,7 +290,7 @@ Heute war auch Aufräumtag. Mit den 25 archivierten Apps von gestern und der Sta
|
|||
| Status-Page / Prometheus / Cloudflared | Configs für unified app aktualisiert |
|
||||
| Race in status-page-gen | Lock-File während Generation |
|
||||
| Analytics Umami Website-ID | Nach DB-Reset neue ID gepflegt |
|
||||
| `getTagsByIds` | Fehlender `allTags` Param in zitare gefixt |
|
||||
| `getTagsByIds` | Fehlender `allTags` Param in quotes gefixt |
|
||||
| ManaContacts → Kontakte | Branding-Rename |
|
||||
| AppDrawer → new tab | Apps öffnen sich extern statt innerhalb der App |
|
||||
| `bindclient:Height` → calculated | Bottom-Chrome-Height berechnet, nicht gemessen |
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ Mana ist das **Herzstück des Monorepos** - das Multi-App Ecosystem Dashboard mi
|
|||
|
||||
- 25 Web-Routes in 2 Route-Groups ((auth) + (app))
|
||||
- 36 Komponenten, 6 Svelte 5 Rune Stores (690 LOC)
|
||||
- 11 Dashboard-Widgets (Calendar, Clock, Contacts, Chat, Picture, Tasks, Credits, Storage, Transactions, Cards, Zitare)
|
||||
- 11 Dashboard-Widgets (Calendar, Clock, Contacts, Chat, Picture, Tasks, Credits, Storage, Transactions, Cards, Quotes)
|
||||
- 5-Step Onboarding-Wizard (Welcome → Profile → Credits → Apps → Complete)
|
||||
- App-Switcher (AppSlider) für Multi-App Navigation
|
||||
- Skeleton Loading States, Error Boundaries auf Widgets
|
||||
|
|
@ -117,7 +117,7 @@ Mana ist das **Herzstück des Monorepos** - das Multi-App Ecosystem Dashboard mi
|
|||
- Todo Widget Service Tests (7 Tests)
|
||||
- Calendar Widget Service Tests (6 Tests)
|
||||
- Chat Widget Service Tests (6 Tests)
|
||||
- Zitare Widget Service Tests (6 Tests)
|
||||
- Quotes Widget Service Tests (6 Tests)
|
||||
|
||||
**Lücken:**
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
---
|
||||
title: 'Zitare: Production Readiness Audit'
|
||||
title: 'Quotes: Production Readiness Audit'
|
||||
description: 'Bewertung der Zitat-App - schlankes Backend, deployed auf mana.how, aber keine Tests und fehlende Dokumentation'
|
||||
date: 2026-03-19
|
||||
app: 'zitare'
|
||||
app: 'quotes'
|
||||
author: 'Till Schneider'
|
||||
tags: ['audit', 'zitare', 'production-readiness']
|
||||
tags: ['audit', 'quotes', 'production-readiness']
|
||||
score: 62
|
||||
scores:
|
||||
backend: 72
|
||||
|
|
@ -45,7 +45,7 @@ stats:
|
|||
|
||||
## Zusammenfassung
|
||||
|
||||
Zitare ist die **einzige App neben Calendar die produktiv deployed** ist (zitare.mana.how). Schlankes Backend mit Favorites + Lists, solide Web-App mit Svelte 5 und PWA. Aber: **Null Tests**, kein CLAUDE.md, und das einfachste Schema aller Apps. Die App profitiert von der statischen Quote-Content-Bibliothek (64 Zitate in 6 Sprachen).
|
||||
Quotes ist die **einzige App neben Calendar die produktiv deployed** ist (quotes.mana.how). Schlankes Backend mit Favorites + Lists, solide Web-App mit Svelte 5 und PWA. Aber: **Null Tests**, kein CLAUDE.md, und das einfachste Schema aller Apps. Die App profitiert von der statischen Quote-Content-Bibliothek (64 Zitate in 6 Sprachen).
|
||||
|
||||
## Backend (72/100)
|
||||
|
||||
|
|
@ -102,7 +102,7 @@ Zitare ist die **einzige App neben Calendar die produktiv deployed** ist (zitare
|
|||
|
||||
**Stärken:**
|
||||
|
||||
- **Produktiv deployed** auf zitare.mana.how
|
||||
- **Produktiv deployed** auf quotes.mana.how
|
||||
- Multi-Stage Dockerfiles (Backend + Web)
|
||||
- Health Checks (30s Interval, 3 Retries)
|
||||
- docker-compose.macmini.yml vollständig konfiguriert
|
||||
|
|
@ -115,7 +115,7 @@ Zitare ist die **einzige App neben Calendar die produktiv deployed** ist (zitare
|
|||
|
||||
## Documentation (20/100)
|
||||
|
||||
**Kritische Lücke:** Kein `apps/zitare/CLAUDE.md` vorhanden. Keine API-Dokumentation. Kein README. Nur die Monorepo-Root-Doku referenziert Zitare.
|
||||
**Kritische Lücke:** Kein `apps/quotes/CLAUDE.md` vorhanden. Keine API-Dokumentation. Kein README. Nur die Monorepo-Root-Doku referenziert Quotes.
|
||||
|
||||
## Security (70/100)
|
||||
|
||||
|
|
@ -55,7 +55,7 @@ Die Architektur-Migration hat alle Apps gleichzeitig verbessert:
|
|||
| **Contacts** | 78 | 87 | +9 | Local-First + vCard Import Server |
|
||||
| **Picture** | 76 | 85 | +9 | Local-First + Replicate Server |
|
||||
| **Cards** | 80 | 89 | +9 | Local-First + AI Card Gen Server |
|
||||
| **Zitare** | 88 | 93 | +5 | Local-First, war schon solide |
|
||||
| **Quotes** | 88 | 93 | +5 | Local-First, war schon solide |
|
||||
| **Clock** | 85 | 91 | +6 | Local-First + keine Backend-Dependency |
|
||||
| **Storage** | 72 | 82 | +10 | Local-First + S3 Server |
|
||||
| **Food** | 70 | 82 | +12 | Local-First + Gemini Server |
|
||||
|
|
|
|||
|
|
@ -194,7 +194,7 @@
|
|||
},
|
||||
{
|
||||
"app": "mana",
|
||||
"file": "routes/(app)/zitare/lists/[id]/+page.svelte",
|
||||
"file": "routes/(app)/quotes/lists/[id]/+page.svelte",
|
||||
"lines": 951
|
||||
},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ export const ui = {
|
|||
'app.maerchenzauber.description': 'Erstelle magische Kindergeschichten mit KI-Unterstützung',
|
||||
'app.moodlit.description':
|
||||
'Deine persönliche KI für emotionales Wohlbefinden und mentale Gesundheit',
|
||||
'app.zitare.description':
|
||||
'app.quotes.description':
|
||||
'Intelligente Zitatverwaltung und Literaturrecherche für akademisches Arbeiten',
|
||||
'app.cards.description':
|
||||
'KI-gestützte Karteikarten-App für effektives Lernen und Wissensmanagement',
|
||||
|
|
@ -150,7 +150,7 @@ export const ui = {
|
|||
'AI-powered knowledge platform for intelligent learning and documentation',
|
||||
'app.maerchenzauber.description': "Create magical children's stories with AI support",
|
||||
'app.moodlit.description': 'Your personal AI for emotional well-being and mental health',
|
||||
'app.zitare.description':
|
||||
'app.quotes.description':
|
||||
'Intelligent citation management and literature research for academic work',
|
||||
'app.cards.description':
|
||||
'AI-powered flashcard app for effective learning and knowledge management',
|
||||
|
|
@ -230,7 +230,7 @@ export const ui = {
|
|||
'Piattaforma di conoscenza basata su AI per apprendimento e documentazione intelligenti',
|
||||
'app.maerchenzauber.description': "Crea storie magiche per bambini con il supporto dell'AI",
|
||||
'app.moodlit.description': 'La tua AI personale per il benessere emotivo e la salute mentale',
|
||||
'app.zitare.description':
|
||||
'app.quotes.description':
|
||||
'Gestione intelligente delle citazioni e ricerca bibliografica per lavoro accademico',
|
||||
'app.cards.description':
|
||||
'App di flashcard basata su AI per apprendimento efficace e gestione della conoscenza',
|
||||
|
|
@ -315,7 +315,7 @@ export const ui = {
|
|||
"Créez des histoires magiques pour enfants avec le soutien de l'IA",
|
||||
'app.moodlit.description':
|
||||
'Votre IA personnelle pour le bien-être émotionnel et la santé mentale',
|
||||
'app.zitare.description':
|
||||
'app.quotes.description':
|
||||
'Gestion intelligente des citations et recherche bibliographique pour le travail académique',
|
||||
'app.cards.description':
|
||||
"Application de cartes mémoire basée sur l'IA pour un apprentissage efficace et la gestion des connaissances",
|
||||
|
|
@ -398,7 +398,7 @@ export const ui = {
|
|||
'Plataforma de conocimiento impulsada por IA para aprendizaje y documentación inteligentes',
|
||||
'app.maerchenzauber.description': 'Crea historias mágicas para niños con soporte de IA',
|
||||
'app.moodlit.description': 'Tu IA personal para el bienestar emocional y la salud mental',
|
||||
'app.zitare.description':
|
||||
'app.quotes.description':
|
||||
'Gestión inteligente de citas e investigación bibliográfica para trabajo académico',
|
||||
'app.cards.description':
|
||||
'App de tarjetas de memoria impulsada por IA para aprendizaje efectivo y gestión del conocimiento',
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ const sections: Section[] = [
|
|||
apps: [
|
||||
{ name: 'Cards', icon: 'ph:cards-bold', tagline: 'KI Karteikarten', url: 'https://cards.mana.how' },
|
||||
{ name: 'SkilltTree', icon: 'ph:tree-structure-bold', tagline: 'Skill-Tracking', url: 'https://skilltree.mana.how' },
|
||||
{ name: 'Zitare', icon: 'ph:quotes-bold', tagline: 'Zitate & Inspiration', url: 'https://zitare.mana.how' },
|
||||
{ name: 'Quotes', icon: 'ph:quotes-bold', tagline: 'Zitate & Inspiration', url: 'https://quotes.mana.how' },
|
||||
],
|
||||
},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -33,12 +33,12 @@ const apps = [
|
|||
href: '/apps/moodlit',
|
||||
},
|
||||
{
|
||||
name: 'Zitare',
|
||||
descriptionKey: 'app.zitare.description',
|
||||
name: 'Quotes',
|
||||
descriptionKey: 'app.quotes.description',
|
||||
logo: '📚',
|
||||
categoryKey: 'app.category.research',
|
||||
color: 'from-emerald-500 to-teal-500',
|
||||
href: '/apps/zitare',
|
||||
href: '/apps/quotes',
|
||||
},
|
||||
{
|
||||
name: 'Cards',
|
||||
|
|
|
|||
|
|
@ -33,12 +33,12 @@ const apps = [
|
|||
href: '/apps/moodlit',
|
||||
},
|
||||
{
|
||||
name: 'Zitare',
|
||||
descriptionKey: 'app.zitare.description',
|
||||
name: 'Quotes',
|
||||
descriptionKey: 'app.quotes.description',
|
||||
logo: '📚',
|
||||
categoryKey: 'app.category.research',
|
||||
color: 'from-emerald-500 to-teal-500',
|
||||
href: '/apps/zitare',
|
||||
href: '/apps/quotes',
|
||||
},
|
||||
{
|
||||
name: 'Cards',
|
||||
|
|
|
|||
|
|
@ -33,12 +33,12 @@ const apps = [
|
|||
href: '/apps/moodlit',
|
||||
},
|
||||
{
|
||||
name: 'Zitare',
|
||||
descriptionKey: 'app.zitare.description',
|
||||
name: 'Quotes',
|
||||
descriptionKey: 'app.quotes.description',
|
||||
logo: '📚',
|
||||
categoryKey: 'app.category.research',
|
||||
color: 'from-emerald-500 to-teal-500',
|
||||
href: '/apps/zitare',
|
||||
href: '/apps/quotes',
|
||||
},
|
||||
{
|
||||
name: 'Cards',
|
||||
|
|
|
|||
|
|
@ -56,12 +56,12 @@ const apps = [
|
|||
href: '/apps/moodlit',
|
||||
},
|
||||
{
|
||||
name: 'Zitare',
|
||||
descriptionKey: 'app.zitare.description',
|
||||
name: 'Quotes',
|
||||
descriptionKey: 'app.quotes.description',
|
||||
logo: '📚',
|
||||
categoryKey: 'app.category.research',
|
||||
color: 'from-emerald-500 to-teal-500',
|
||||
href: '/apps/zitare',
|
||||
href: '/apps/quotes',
|
||||
},
|
||||
{
|
||||
name: 'Cards',
|
||||
|
|
|
|||
|
|
@ -33,12 +33,12 @@ const apps = [
|
|||
href: '/apps/moodlit',
|
||||
},
|
||||
{
|
||||
name: 'Zitare',
|
||||
descriptionKey: 'app.zitare.description',
|
||||
name: 'Quotes',
|
||||
descriptionKey: 'app.quotes.description',
|
||||
logo: '📚',
|
||||
categoryKey: 'app.category.research',
|
||||
color: 'from-emerald-500 to-teal-500',
|
||||
href: '/apps/zitare',
|
||||
href: '/apps/quotes',
|
||||
},
|
||||
{
|
||||
name: 'Cards',
|
||||
|
|
|
|||
|
|
@ -34,11 +34,11 @@ const MANA_APPS: AppInfo[] = [
|
|||
link_web: 'https://picture.mana.how',
|
||||
},
|
||||
{
|
||||
id: 'zitare',
|
||||
name: 'Zitare',
|
||||
id: 'quotes',
|
||||
name: 'Quotes',
|
||||
description: 'Tägliche Inspirationszitate',
|
||||
icon: 'quote-left',
|
||||
link_web: 'https://zitare.mana.how',
|
||||
link_web: 'https://quotes.mana.how',
|
||||
},
|
||||
{
|
||||
id: 'cards',
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ ENV PUBLIC_SYNC_SERVER_URL=$PUBLIC_SYNC_SERVER_URL
|
|||
|
||||
COPY apps/mana/apps/web ./apps/mana/apps/web
|
||||
COPY apps/calc/packages/shared ./apps/calc/packages/shared
|
||||
COPY apps/zitare/packages/content ./apps/zitare/packages/content
|
||||
COPY apps/quotes/packages/content ./apps/quotes/packages/content
|
||||
COPY packages/shared-uload ./packages/shared-uload
|
||||
COPY packages/local-llm ./packages/local-llm
|
||||
COPY packages/local-stt ./packages/local-stt
|
||||
|
|
@ -22,7 +22,7 @@ RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store \
|
|||
pnpm install --no-frozen-lockfile --ignore-scripts
|
||||
|
||||
# Build dependencies that need compilation
|
||||
WORKDIR /app/apps/zitare/packages/content
|
||||
WORKDIR /app/apps/quotes/packages/content
|
||||
RUN pnpm build
|
||||
|
||||
WORKDIR /app/apps/mana/apps/web
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ import { setSecurityHeaders } from '@mana/shared-utils/security-headers';
|
|||
*
|
||||
* Per-app HTTP backends (todo-api, calendar-api, contacts-api, chat-api,
|
||||
* storage-api, cards-api, mukke-api, food-api, picture-api, presi-api,
|
||||
* zitare-api, clock-api, context-api) were removed in the pre-launch
|
||||
* quotes-api, clock-api, context-api) were removed in the pre-launch
|
||||
* ghost-API cleanup — every product module now talks to mana-sync directly.
|
||||
*/
|
||||
|
||||
|
|
@ -54,7 +54,7 @@ const APP_SUBDOMAINS = new Set([
|
|||
'chat',
|
||||
'calendar',
|
||||
'contacts',
|
||||
'zitare',
|
||||
'quotes',
|
||||
'skilltree',
|
||||
'plants',
|
||||
'cards',
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
* API Services barrel.
|
||||
*
|
||||
* Per-app HTTP backend services (todo, calendar, contacts, chat, storage,
|
||||
* cards, music, picture, presi, zitare, clock, context) used to live here
|
||||
* cards, music, picture, presi, quotes, clock, context) used to live here
|
||||
* but were removed in the pre-launch ghost-API cleanup — every product
|
||||
* module now reads/writes the unified Dexie database via the local-first
|
||||
* sync layer (`mana-sync`), and `qr-export` queries Dexie directly.
|
||||
|
|
|
|||
|
|
@ -552,13 +552,13 @@ registerApp({
|
|||
});
|
||||
|
||||
registerApp({
|
||||
id: 'zitare',
|
||||
name: 'Zitare',
|
||||
id: 'quotes',
|
||||
name: 'Quotes',
|
||||
color: '#EC4899',
|
||||
icon: Quotes,
|
||||
views: {
|
||||
list: { load: () => import('$lib/modules/zitare/ListView.svelte') },
|
||||
detail: { load: () => import('$lib/modules/zitare/views/DetailView.svelte') },
|
||||
list: { load: () => import('$lib/modules/quotes/ListView.svelte') },
|
||||
detail: { load: () => import('$lib/modules/quotes/views/DetailView.svelte') },
|
||||
},
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ export const APP_CATEGORY_MAP: Record<string, AppCategory> = {
|
|||
cards: 'creative',
|
||||
skilltree: 'creative',
|
||||
guides: 'creative',
|
||||
zitare: 'creative',
|
||||
quotes: 'creative',
|
||||
uload: 'creative',
|
||||
playground: 'creative',
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ import TasksUpcomingWidget from './widgets/TasksUpcomingWidget.svelte';
|
|||
import CalendarEventsWidget from './widgets/CalendarEventsWidget.svelte';
|
||||
import ChatRecentWidget from './widgets/ChatRecentWidget.svelte';
|
||||
import ContactsFavoritesWidget from './widgets/ContactsFavoritesWidget.svelte';
|
||||
import ZitareQuoteWidget from './widgets/ZitareQuoteWidget.svelte';
|
||||
import QuoteWidget from './widgets/QuoteWidget.svelte';
|
||||
import PictureRecentWidget from './widgets/PictureRecentWidget.svelte';
|
||||
import CardsProgressWidget from './widgets/CardsProgressWidget.svelte';
|
||||
import ClockTimersWidget from './widgets/ClockTimersWidget.svelte';
|
||||
|
|
@ -46,7 +46,7 @@ export const widgetComponents: Record<WidgetType, Component> = {
|
|||
'chat-recent': ChatRecentWidget,
|
||||
'contacts-favorites': ContactsFavoritesWidget,
|
||||
'contacts-recent': RecentContactsWidget,
|
||||
'zitare-quote': ZitareQuoteWidget,
|
||||
'quotes-quote': QuoteWidget,
|
||||
'picture-recent': PictureRecentWidget,
|
||||
'cards-progress': CardsProgressWidget,
|
||||
'clock-timers': ClockTimersWidget,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<script lang="ts">
|
||||
/**
|
||||
* ZitareQuoteWidget - Random favorite quote (local-first)
|
||||
* QuotesQuoteWidget - Random favorite quote (local-first)
|
||||
*/
|
||||
|
||||
import { _ } from 'svelte-i18n';
|
||||
|
|
@ -13,7 +13,7 @@
|
|||
<div class="mb-3">
|
||||
<h3 class="flex items-center gap-2 text-lg font-semibold">
|
||||
<span>💡</span>
|
||||
{$_('dashboard.widgets.zitare.title')}
|
||||
{$_('dashboard.widgets.quotes.title')}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
|
|
@ -22,16 +22,16 @@
|
|||
{:else if !favorite.value}
|
||||
<div class="py-6 text-center">
|
||||
<div class="mb-2 text-3xl">💡</div>
|
||||
<p class="text-sm text-muted-foreground">{$_('dashboard.widgets.zitare.empty')}</p>
|
||||
<p class="text-sm text-muted-foreground">{$_('dashboard.widgets.quotes.empty')}</p>
|
||||
<a
|
||||
href="/zitare"
|
||||
href="/quotes"
|
||||
class="mt-3 inline-block rounded-lg bg-primary/10 px-4 py-2 text-sm font-medium text-primary hover:bg-primary/20"
|
||||
>
|
||||
Zitate entdecken
|
||||
</a>
|
||||
</div>
|
||||
{:else}
|
||||
<a href="/zitare" class="block rounded-lg p-3 transition-colors hover:bg-surface-hover">
|
||||
<a href="/quotes" class="block rounded-lg p-3 transition-colors hover:bg-surface-hover">
|
||||
<p class="text-sm italic text-muted-foreground">
|
||||
Favorit #{favorite.value.quoteId}
|
||||
</p>
|
||||
|
|
@ -151,7 +151,7 @@ export const APP_POSITIONS: Record<string, { x: number; y: number; lakeId: strin
|
|||
storage: { x: 160, y: 650, lakeId: 'db-left' },
|
||||
|
||||
// Around Waldsee Mitte (db-center)
|
||||
zitare: { x: 640, y: 600, lakeId: 'db-center' },
|
||||
quotes: { x: 640, y: 600, lakeId: 'db-center' },
|
||||
music: { x: 850, y: 610, lakeId: 'db-center' },
|
||||
clock: { x: 880, y: 680, lakeId: 'db-center' },
|
||||
food: { x: 650, y: 720, lakeId: 'db-center' },
|
||||
|
|
|
|||
|
|
@ -202,8 +202,8 @@ const APP_DEFINITIONS: AppDefinition[] = [
|
|||
},
|
||||
},
|
||||
{
|
||||
id: 'zitare',
|
||||
displayName: 'Zitare',
|
||||
id: 'quotes',
|
||||
displayName: 'Quotes',
|
||||
score: 62,
|
||||
status: 'beta',
|
||||
categories: {
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
clock: 'https://clock.mana.how',
|
||||
food: 'https://food.mana.how',
|
||||
photos: 'https://photos.mana.how',
|
||||
zitare: 'https://zitare.mana.how',
|
||||
quotes: 'https://quotes.mana.how',
|
||||
mana: 'https://mana.how',
|
||||
cards: 'https://cards.mana.how',
|
||||
plants: 'https://plants.mana.how',
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
redis: 'Schneller Cache-Speicher. Klein, kristallklar, sofort verfugbar.',
|
||||
minio: 'Objekt-Speicher fur Dateien, Bilder und Medien aller Apps.',
|
||||
'db-left': 'PostgreSQL-Datenbanken fur Calendar, Todo, Contacts, Storage.',
|
||||
'db-center': 'PostgreSQL-Datenbanken fur Zitare, Music, Clock, Food.',
|
||||
'db-center': 'PostgreSQL-Datenbanken fur Quotes, Music, Clock, Food.',
|
||||
'db-right': 'PostgreSQL-Datenbanken fur Photos, SkillTree, Context, Plants.',
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@
|
|||
category: 'AI',
|
||||
},
|
||||
{
|
||||
id: 'zitare',
|
||||
name: 'Zitare',
|
||||
id: 'quotes',
|
||||
name: 'Quotes',
|
||||
description: 'Tägliche Inspiration mit Zitaten',
|
||||
icon: '💡',
|
||||
color: 'bg-yellow-500',
|
||||
|
|
|
|||
|
|
@ -423,9 +423,9 @@ export const appConfigs: Record<string, AppConfig> = {
|
|||
// ============================================
|
||||
// clock: consolidated into times
|
||||
|
||||
zitare: {
|
||||
name: 'zitare',
|
||||
displayName: 'Zitare',
|
||||
quotes: {
|
||||
name: 'quotes',
|
||||
displayName: 'Quotes',
|
||||
tagline: 'Tägliche Inspiration',
|
||||
description: 'Entdecke inspirierende Zitate und Weisheiten für jeden Tag.',
|
||||
logoEmoji: '💡',
|
||||
|
|
@ -458,7 +458,7 @@ export const appConfigs: Record<string, AppConfig> = {
|
|||
},
|
||||
],
|
||||
dashboardRoute: '/',
|
||||
website: 'https://zitare.mana.how',
|
||||
website: 'https://quotes.mana.how',
|
||||
},
|
||||
|
||||
storage: {
|
||||
|
|
@ -584,7 +584,7 @@ export const defaultManaConfig: AppConfig = {
|
|||
},
|
||||
{
|
||||
icon: '💡',
|
||||
title: 'Zitare',
|
||||
title: 'Quotes',
|
||||
description: 'Tägliche Inspiration',
|
||||
color: '#F59E0B',
|
||||
},
|
||||
|
|
@ -631,6 +631,6 @@ export function getAppsByCategory(): {
|
|||
appConfigs.contacts,
|
||||
appConfigs.finance,
|
||||
],
|
||||
utility: [appConfigs.clock, appConfigs.zitare, appConfigs.storage, appConfigs.moodlit],
|
||||
utility: [appConfigs.clock, appConfigs.quotes, appConfigs.storage, appConfigs.moodlit],
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import type { LocalTask } from '$lib/modules/todo/types';
|
|||
import type { LocalTimeBlock } from '$lib/data/time-blocks/types';
|
||||
import type { LocalContact } from '$lib/modules/contacts/types';
|
||||
import type { LocalConversation } from '$lib/modules/chat/types';
|
||||
import type { LocalFavorite } from '$lib/modules/zitare/types';
|
||||
import type { LocalFavorite } from '$lib/modules/quotes/types';
|
||||
import type { LocalImage } from '$lib/modules/picture/types';
|
||||
import type { LocalAlarm, LocalCountdownTimer } from '$lib/modules/times/types';
|
||||
import type { LocalFile } from '$lib/modules/storage/types';
|
||||
|
|
@ -142,13 +142,13 @@ export function useRecentConversations(limit = 5) {
|
|||
}, [] as LocalConversation[]);
|
||||
}
|
||||
|
||||
// ─── Zitare Queries ─────────────────────────────────────────
|
||||
// ─── Quotes Queries ─────────────────────────────────────────
|
||||
|
||||
/** A random favorite quote. */
|
||||
export function useRandomFavorite() {
|
||||
return useLiveQueryWithDefault(
|
||||
async () => {
|
||||
const all = await db.table<LocalFavorite>('zitareFavorites').toArray();
|
||||
const all = await db.table<LocalFavorite>('quotesFavorites').toArray();
|
||||
const active = all.filter((f) => !f.deletedAt);
|
||||
if (active.length === 0) return null;
|
||||
return active[Math.floor(Math.random() * active.length)];
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ describe('module-registry — pre-refactor snapshot', () => {
|
|||
chat: ['conversations', 'messages', 'chatTemplates', 'conversationTags'],
|
||||
picture: ['images', 'boards', 'boardItems', 'imageTags'],
|
||||
cards: ['cardDecks', 'cards', 'deckTags'],
|
||||
zitare: ['zitareFavorites', 'zitareLists', 'zitareListTags'],
|
||||
quotes: ['quotesFavorites', 'quotesLists', 'quotesListTags'],
|
||||
music: ['songs', 'mukkePlaylists', 'playlistSongs', 'mukkeProjects', 'markers', 'songTags'],
|
||||
storage: ['files', 'storageFolders', 'fileTags'],
|
||||
presi: ['presiDecks', 'slides', 'presiDeckTags'],
|
||||
|
|
@ -180,8 +180,8 @@ describe('module-registry — pre-refactor snapshot', () => {
|
|||
todoProjects: 'projects',
|
||||
chatTemplates: 'templates',
|
||||
cardDecks: 'decks',
|
||||
zitareFavorites: 'favorites',
|
||||
zitareLists: 'lists',
|
||||
quotesFavorites: 'favorites',
|
||||
quotesLists: 'lists',
|
||||
mukkePlaylists: 'playlists',
|
||||
mukkeProjects: 'projects',
|
||||
storageFolders: 'folders',
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ import { contactsModuleConfig } from '$lib/modules/contacts/module.config';
|
|||
import { chatModuleConfig } from '$lib/modules/chat/module.config';
|
||||
import { pictureModuleConfig } from '$lib/modules/picture/module.config';
|
||||
import { cardsModuleConfig } from '$lib/modules/cards/module.config';
|
||||
import { zitareModuleConfig } from '$lib/modules/zitare/module.config';
|
||||
import { quotesModuleConfig } from '$lib/modules/quotes/module.config';
|
||||
import { musicModuleConfig } from '$lib/modules/music/module.config';
|
||||
import { storageModuleConfig } from '$lib/modules/storage/module.config';
|
||||
import { presiModuleConfig } from '$lib/modules/presi/module.config';
|
||||
|
|
@ -108,7 +108,7 @@ export const MODULE_CONFIGS: readonly ModuleConfig[] = [
|
|||
chatModuleConfig,
|
||||
pictureModuleConfig,
|
||||
cardsModuleConfig,
|
||||
zitareModuleConfig,
|
||||
quotesModuleConfig,
|
||||
musicModuleConfig,
|
||||
storageModuleConfig,
|
||||
presiModuleConfig,
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ function registerLocale(lang: SupportedLocale) {
|
|||
chat,
|
||||
cards,
|
||||
picture,
|
||||
zitare,
|
||||
quotes,
|
||||
memoro,
|
||||
moodlit,
|
||||
storage,
|
||||
|
|
@ -66,7 +66,7 @@ function registerLocale(lang: SupportedLocale) {
|
|||
import(`./locales/chat/${lang}.json`),
|
||||
import(`./locales/cards/${lang}.json`),
|
||||
import(`./locales/picture/${lang}.json`),
|
||||
import(`./locales/zitare/${lang}.json`),
|
||||
import(`./locales/quotes/${lang}.json`),
|
||||
import(`./locales/memoro/${lang}.json`),
|
||||
import(`./locales/moodlit/${lang}.json`),
|
||||
import(`./locales/storage/${lang}.json`),
|
||||
|
|
@ -104,7 +104,7 @@ function registerLocale(lang: SupportedLocale) {
|
|||
chat: chat.default,
|
||||
cards: cards.default,
|
||||
picture: picture.default,
|
||||
zitare: zitare.default,
|
||||
quotes: quotes.default,
|
||||
memoro: memoro.default,
|
||||
moodlit: moodlit.default,
|
||||
storage: storage.default,
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
"chat": "Chat",
|
||||
"context": "Dokumente",
|
||||
"times": "Zeiten",
|
||||
"zitare": "Zitare",
|
||||
"quotes": "Zitate",
|
||||
"cards": "Karten",
|
||||
"picture": "Bilder",
|
||||
"music": "Musik",
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
"chat": "Chat",
|
||||
"context": "Documents",
|
||||
"times": "Times",
|
||||
"zitare": "Zitare",
|
||||
"quotes": "Quotes",
|
||||
"cards": "Cards",
|
||||
"picture": "Pictures",
|
||||
"music": "Music",
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
"chat": "Chat",
|
||||
"context": "Documentos",
|
||||
"times": "Tiempos",
|
||||
"zitare": "Zitare",
|
||||
"quotes": "Quotes",
|
||||
"cards": "Tarjetas",
|
||||
"picture": "Imágenes",
|
||||
"music": "Música",
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
"chat": "Chat",
|
||||
"context": "Documents",
|
||||
"times": "Temps",
|
||||
"zitare": "Zitare",
|
||||
"quotes": "Quotes",
|
||||
"cards": "Cartes",
|
||||
"picture": "Images",
|
||||
"music": "Musique",
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
"chat": "Chat",
|
||||
"context": "Documenti",
|
||||
"times": "Tempi",
|
||||
"zitare": "Zitare",
|
||||
"quotes": "Quotes",
|
||||
"cards": "Schede",
|
||||
"picture": "Immagini",
|
||||
"music": "Musica",
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@
|
|||
"add_favorites": "Favoriten hinzufügen",
|
||||
"view_all": "Alle anzeigen"
|
||||
},
|
||||
"zitare": {
|
||||
"quotes": {
|
||||
"title": "Inspiration",
|
||||
"description": "Zitat des Tages",
|
||||
"empty": "Keine Favoriten",
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@
|
|||
"add_favorites": "Add favorites",
|
||||
"view_all": "View all"
|
||||
},
|
||||
"zitare": {
|
||||
"quotes": {
|
||||
"title": "Inspiration",
|
||||
"description": "Quote of the day",
|
||||
"empty": "No favorites",
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@
|
|||
"add_favorites": "Añadir favoritos",
|
||||
"view_all": "Ver todos"
|
||||
},
|
||||
"zitare": {
|
||||
"quotes": {
|
||||
"title": "Inspiración",
|
||||
"description": "Cita del día",
|
||||
"empty": "Sin favoritos",
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@
|
|||
"add_favorites": "Ajouter des favoris",
|
||||
"view_all": "Tout voir"
|
||||
},
|
||||
"zitare": {
|
||||
"quotes": {
|
||||
"title": "Inspiration",
|
||||
"description": "Citation du jour",
|
||||
"empty": "Aucun favori",
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@
|
|||
"add_favorites": "Aggiungi preferiti",
|
||||
"view_all": "Vedi tutti"
|
||||
},
|
||||
"zitare": {
|
||||
"quotes": {
|
||||
"title": "Ispirazione",
|
||||
"description": "Citazione del giorno",
|
||||
"empty": "Nessun preferito",
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"faq": {
|
||||
"what_is_mana": {
|
||||
"question": "Was ist Mana?",
|
||||
"answer": "<p><strong>Mana</strong> ist die zentrale Plattform des Mana-Ökosystems:</p><ul><li>Verwalte dein <strong>Konto</strong> und Profil an einem zentralen Ort</li><li>Greife auf alle Mana-Apps zu — Chat, Picture, Zitare, Clock und mehr</li><li>Nutze <strong>Single Sign-On (SSO)</strong>, um dich einmal anzumelden und überall eingeloggt zu sein</li><li>Erstelle und verwalte <strong>Organisationen</strong> für Teamarbeit</li></ul>",
|
||||
"answer": "<p><strong>Mana</strong> ist die zentrale Plattform des Mana-Ökosystems:</p><ul><li>Verwalte dein <strong>Konto</strong> und Profil an einem zentralen Ort</li><li>Greife auf alle Mana-Apps zu — Chat, Picture, Quotes, Clock und mehr</li><li>Nutze <strong>Single Sign-On (SSO)</strong>, um dich einmal anzumelden und überall eingeloggt zu sein</li><li>Erstelle und verwalte <strong>Organisationen</strong> für Teamarbeit</li></ul>",
|
||||
"tags": "mana,plattform,ökosystem"
|
||||
},
|
||||
"sso": {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"faq": {
|
||||
"what_is_mana": {
|
||||
"question": "What is Mana?",
|
||||
"answer": "<p><strong>Mana</strong> is the central platform of the Mana ecosystem:</p><ul><li>Manage your <strong>account</strong> and profile in one central place</li><li>Access all Mana apps — Chat, Picture, Zitare, Clock and more</li><li>Use <strong>Single Sign-On (SSO)</strong> to log in once and stay signed in everywhere</li><li>Create and manage <strong>organizations</strong> for teamwork</li></ul>",
|
||||
"answer": "<p><strong>Mana</strong> is the central platform of the Mana ecosystem:</p><ul><li>Manage your <strong>account</strong> and profile in one central place</li><li>Access all Mana apps — Chat, Picture, Quotes, Clock and more</li><li>Use <strong>Single Sign-On (SSO)</strong> to log in once and stay signed in everywhere</li><li>Create and manage <strong>organizations</strong> for teamwork</li></ul>",
|
||||
"tags": "mana,platform,ecosystem"
|
||||
},
|
||||
"sso": {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"faq": {
|
||||
"what_is_mana": {
|
||||
"question": "Que es Mana?",
|
||||
"answer": "<p><strong>Mana</strong> es la plataforma central del ecosistema Mana:</p><ul><li>Gestiona tu <strong>cuenta</strong> y perfil en un solo lugar</li><li>Accede a todas las apps de Mana: Chat, Picture, Zitare, Clock y mas</li><li>Usa <strong>Single Sign-On (SSO)</strong> para iniciar sesion una vez y estar conectado en todas partes</li><li>Crea y gestiona <strong>organizaciones</strong> para el trabajo en equipo</li></ul>",
|
||||
"answer": "<p><strong>Mana</strong> es la plataforma central del ecosistema Mana:</p><ul><li>Gestiona tu <strong>cuenta</strong> y perfil en un solo lugar</li><li>Accede a todas las apps de Mana: Chat, Picture, Quotes, Clock y mas</li><li>Usa <strong>Single Sign-On (SSO)</strong> para iniciar sesion una vez y estar conectado en todas partes</li><li>Crea y gestiona <strong>organizaciones</strong> para el trabajo en equipo</li></ul>",
|
||||
"tags": "mana,plataforma,ecosistema"
|
||||
},
|
||||
"sso": {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"faq": {
|
||||
"what_is_mana": {
|
||||
"question": "Qu'est-ce que Mana ?",
|
||||
"answer": "<p><strong>Mana</strong> est la plateforme centrale de l'ecosysteme Mana :</p><ul><li>Gerez votre <strong>compte</strong> et votre profil depuis un seul endroit</li><li>Accedez a toutes les apps Mana — Chat, Picture, Zitare, Clock et plus encore</li><li>Utilisez le <strong>Single Sign-On (SSO)</strong> pour vous connecter une seule fois et rester connecte partout</li><li>Creez et gerez des <strong>organisations</strong> pour le travail en equipe</li></ul>",
|
||||
"answer": "<p><strong>Mana</strong> est la plateforme centrale de l'ecosysteme Mana :</p><ul><li>Gerez votre <strong>compte</strong> et votre profil depuis un seul endroit</li><li>Accedez a toutes les apps Mana — Chat, Picture, Quotes, Clock et plus encore</li><li>Utilisez le <strong>Single Sign-On (SSO)</strong> pour vous connecter une seule fois et rester connecte partout</li><li>Creez et gerez des <strong>organisations</strong> pour le travail en equipe</li></ul>",
|
||||
"tags": "mana,plateforme,ecosysteme"
|
||||
},
|
||||
"sso": {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"faq": {
|
||||
"what_is_mana": {
|
||||
"question": "Cos'e Mana?",
|
||||
"answer": "<p><strong>Mana</strong> e la piattaforma centrale dell'ecosistema Mana:</p><ul><li>Gestisci il tuo <strong>account</strong> e il tuo profilo da un unico posto</li><li>Accedi a tutte le app Mana — Chat, Picture, Zitare, Clock e altre ancora</li><li>Usa il <strong>Single Sign-On (SSO)</strong> per accedere una volta e restare connesso ovunque</li><li>Crea e gestisci <strong>organizzazioni</strong> per il lavoro di squadra</li></ul>",
|
||||
"answer": "<p><strong>Mana</strong> e la piattaforma centrale dell'ecosistema Mana:</p><ul><li>Gestisci il tuo <strong>account</strong> e il tuo profilo da un unico posto</li><li>Accedi a tutte le app Mana — Chat, Picture, Quotes, Clock e altre ancora</li><li>Usa il <strong>Single Sign-On (SSO)</strong> per accedere una volta e restare connesso ovunque</li><li>Crea e gestisci <strong>organizzazioni</strong> per il lavoro di squadra</li></ul>",
|
||||
"tags": "mana,piattaforma,ecosistema"
|
||||
},
|
||||
"sso": {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"app": {
|
||||
"name": "Zitare",
|
||||
"name": "Quotes",
|
||||
"tagline": "Inspirierende Zitate jeden Tag"
|
||||
},
|
||||
"nav": {
|
||||
|
|
@ -132,8 +132,8 @@
|
|||
"fontSizeNormal": "Normal",
|
||||
"fontSizeLarge": "Groß",
|
||||
"fontSizeXLarge": "Sehr groß",
|
||||
"about": "Über Zitare",
|
||||
"aboutDescription": "Zitare bietet dir täglich inspirierende Zitate von den größten Denkern der Geschichte. Speichere deine Favoriten und erstelle eigene Listen.",
|
||||
"about": "Über Quotes",
|
||||
"aboutDescription": "Quotes bietet dir täglich inspirierende Zitate von den größten Denkern der Geschichte. Speichere deine Favoriten und erstelle eigene Listen.",
|
||||
"stats": "{quotes} Zitate · {categories} Kategorien · {languages} Sprachen"
|
||||
},
|
||||
"auth": {
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"app": {
|
||||
"name": "Zitare",
|
||||
"name": "Quotes",
|
||||
"tagline": "Inspiring quotes every day"
|
||||
},
|
||||
"nav": {
|
||||
|
|
@ -132,8 +132,8 @@
|
|||
"fontSizeNormal": "Normal",
|
||||
"fontSizeLarge": "Large",
|
||||
"fontSizeXLarge": "Extra large",
|
||||
"about": "About Zitare",
|
||||
"aboutDescription": "Zitare offers you daily inspiring quotes from the greatest thinkers in history. Save your favorites and create your own lists.",
|
||||
"about": "About Quotes",
|
||||
"aboutDescription": "Quotes offers you daily inspiring quotes from the greatest thinkers in history. Save your favorites and create your own lists.",
|
||||
"stats": "{quotes} quotes · {categories} categories · {languages} languages"
|
||||
},
|
||||
"auth": {
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"app": {
|
||||
"name": "Zitare",
|
||||
"name": "Quotes",
|
||||
"tagline": "Citas inspiradoras cada día"
|
||||
},
|
||||
"nav": {
|
||||
|
|
@ -132,8 +132,8 @@
|
|||
"fontSizeNormal": "Normal",
|
||||
"fontSizeLarge": "Grande",
|
||||
"fontSizeXLarge": "Muy grande",
|
||||
"about": "Sobre Zitare",
|
||||
"aboutDescription": "Zitare te ofrece citas inspiradoras diarias de los más grandes pensadores de la historia. Guarda tus favoritas y crea tus propias listas.",
|
||||
"about": "Sobre Quotes",
|
||||
"aboutDescription": "Quotes te ofrece citas inspiradoras diarias de los más grandes pensadores de la historia. Guarda tus favoritas y crea tus propias listas.",
|
||||
"stats": "{quotes} citas · {categories} categorías · {languages} idiomas"
|
||||
},
|
||||
"auth": {
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"app": {
|
||||
"name": "Zitare",
|
||||
"name": "Quotes",
|
||||
"tagline": "Des citations inspirantes chaque jour"
|
||||
},
|
||||
"nav": {
|
||||
|
|
@ -132,8 +132,8 @@
|
|||
"fontSizeNormal": "Normale",
|
||||
"fontSizeLarge": "Grande",
|
||||
"fontSizeXLarge": "Très grande",
|
||||
"about": "À propos de Zitare",
|
||||
"aboutDescription": "Zitare vous propose chaque jour des citations inspirantes des plus grands penseurs de l'histoire. Sauvegardez vos favoris et créez vos propres listes.",
|
||||
"about": "À propos de Quotes",
|
||||
"aboutDescription": "Quotes vous propose chaque jour des citations inspirantes des plus grands penseurs de l'histoire. Sauvegardez vos favoris et créez vos propres listes.",
|
||||
"stats": "{quotes} citations · {categories} catégories · {languages} langues"
|
||||
},
|
||||
"auth": {
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"app": {
|
||||
"name": "Zitare",
|
||||
"name": "Quotes",
|
||||
"tagline": "Citazioni ispiratrici ogni giorno"
|
||||
},
|
||||
"nav": {
|
||||
|
|
@ -132,8 +132,8 @@
|
|||
"fontSizeNormal": "Normale",
|
||||
"fontSizeLarge": "Grande",
|
||||
"fontSizeXLarge": "Molto grande",
|
||||
"about": "Informazioni su Zitare",
|
||||
"aboutDescription": "Zitare ti offre ogni giorno citazioni ispiratrici dei più grandi pensatori della storia. Salva i tuoi preferiti e crea le tue liste.",
|
||||
"about": "Informazioni su Quotes",
|
||||
"aboutDescription": "Quotes ti offre ogni giorno citazioni ispiratrici dei più grandi pensatori della storia. Salva i tuoi preferiti e crea le tue liste.",
|
||||
"stats": "{quotes} citazioni · {categories} categorie · {languages} lingue"
|
||||
},
|
||||
"auth": {
|
||||
|
|
@ -1,21 +1,21 @@
|
|||
<script lang="ts">
|
||||
/**
|
||||
* QuoteOfTheDayWidget — Zufälliges Tageszitat aus Zitare-Favoriten.
|
||||
* QuoteOfTheDayWidget — Zufälliges Tageszitat aus Quotes-Favoriten.
|
||||
*
|
||||
* Liest direkt aus der unified IndexedDB (zitareFavorites table).
|
||||
* Liest direkt aus der unified IndexedDB (quotesFavorites table).
|
||||
* Zeigt eine zufällige Favoriten-ID — das vollständige Zitat stammt
|
||||
* aus dem eingebetteten Zitate-Katalog von Zitare.
|
||||
* aus dem eingebetteten Zitate-Katalog von Quotes.
|
||||
*/
|
||||
|
||||
import { liveQuery } from 'dexie';
|
||||
import { db } from '$lib/data/database';
|
||||
import type { BaseRecord } from '@mana/local-store';
|
||||
|
||||
interface ZitareFavorite extends BaseRecord {
|
||||
interface QuotesFavorite extends BaseRecord {
|
||||
quoteId: string;
|
||||
}
|
||||
|
||||
let favorite: ZitareFavorite | null = $state(null);
|
||||
let favorite: QuotesFavorite | null = $state(null);
|
||||
let totalFavorites = $state(0);
|
||||
let loading = $state(true);
|
||||
|
||||
|
|
@ -33,7 +33,7 @@
|
|||
|
||||
$effect(() => {
|
||||
const sub = liveQuery(async () => {
|
||||
const all = await db.table<ZitareFavorite>('zitareFavorites').toArray();
|
||||
const all = await db.table<QuotesFavorite>('quotesFavorites').toArray();
|
||||
return all.filter((f) => !f.deletedAt);
|
||||
}).subscribe({
|
||||
next: (val) => {
|
||||
|
|
@ -66,14 +66,14 @@
|
|||
<div class="mb-2 text-3xl">💡</div>
|
||||
<p class="text-sm text-muted-foreground">Noch keine Lieblingszitate gespeichert.</p>
|
||||
<a
|
||||
href="/zitare"
|
||||
href="/quotes"
|
||||
class="mt-3 inline-block rounded-lg bg-primary/10 px-4 py-2 text-sm font-medium text-primary hover:bg-primary/20"
|
||||
>
|
||||
Zitate entdecken
|
||||
</a>
|
||||
</div>
|
||||
{:else}
|
||||
<a href="/zitare" class="block rounded-lg p-3 transition-colors hover:bg-surface-hover">
|
||||
<a href="/quotes" class="block rounded-lg p-3 transition-colors hover:bg-surface-hover">
|
||||
<p class="mb-2 text-sm italic text-foreground/80">
|
||||
Favorit #{favorite.quoteId}
|
||||
</p>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<!--
|
||||
Zitare — Workbench ListView
|
||||
Quotes — Workbench ListView
|
||||
Shows one quote at a time. Tap to cycle. Fav button inline.
|
||||
Supports tag drag-and-drop onto the current quote.
|
||||
-->
|
||||
|
|
@ -7,16 +7,16 @@
|
|||
import { onMount } from 'svelte';
|
||||
import { liveQuery } from 'dexie';
|
||||
import { db } from '$lib/data/database';
|
||||
import { quotesStore } from '$lib/modules/zitare/stores/quotes.svelte';
|
||||
import { favoritesStore } from '$lib/modules/zitare/stores/favorites.svelte';
|
||||
import { isFavorite as checkIsFavorite, type Favorite } from '$lib/modules/zitare/queries';
|
||||
import { quotesStore } from '$lib/modules/quotes/stores/quotes.svelte';
|
||||
import { favoritesStore } from '$lib/modules/quotes/stores/favorites.svelte';
|
||||
import { isFavorite as checkIsFavorite, type Favorite } from '$lib/modules/quotes/queries';
|
||||
import { Heart } from '@mana/shared-icons';
|
||||
import { dropTarget } from '@mana/shared-ui/dnd';
|
||||
import type { TagDragData } from '@mana/shared-ui/dnd';
|
||||
import { useAllTags, getTagsByIds } from '@mana/shared-stores';
|
||||
import type { ViewProps } from '$lib/app-registry';
|
||||
import type { LocalFavorite } from './types';
|
||||
import type { Quote } from '@zitare/content';
|
||||
import type { Quote } from '@quotes/content';
|
||||
|
||||
let { navigate, goBack, params }: ViewProps = $props();
|
||||
|
||||
|
|
@ -39,7 +39,7 @@
|
|||
$effect(() => {
|
||||
const sub = liveQuery(async () => {
|
||||
return db
|
||||
.table<LocalFavorite>('zitareFavorites')
|
||||
.table<LocalFavorite>('quotesFavorites')
|
||||
.toArray()
|
||||
.then((all) => all.filter((f) => !f.deletedAt));
|
||||
}).subscribe((val) => {
|
||||
|
|
@ -83,13 +83,13 @@
|
|||
if (!fav) {
|
||||
await favoritesStore.add(quote.id);
|
||||
// Re-fetch to get the new favorite
|
||||
const all = await db.table<LocalFavorite>('zitareFavorites').toArray();
|
||||
const all = await db.table<LocalFavorite>('quotesFavorites').toArray();
|
||||
fav = all.find((f) => f.quoteId === quote!.id && !f.deletedAt);
|
||||
if (!fav) return;
|
||||
}
|
||||
const current = fav.tagIds ?? [];
|
||||
if (!current.includes(tagData.id)) {
|
||||
await db.table('zitareFavorites').update(fav.id, {
|
||||
await db.table('quotesFavorites').update(fav.id, {
|
||||
tagIds: [...current, tagData.id],
|
||||
updatedAt: new Date().toISOString(),
|
||||
});
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Zitare module — collection accessors and guest seed data.
|
||||
* Quotes module — collection accessors and guest seed data.
|
||||
*/
|
||||
|
||||
import { db } from '$lib/data/database';
|
||||
|
|
@ -7,21 +7,21 @@ import type { LocalFavorite, LocalQuoteList, LocalCustomQuote } from './types';
|
|||
|
||||
// ─── Collection Accessors ──────────────────────────────────
|
||||
|
||||
export const favoriteTable = db.table<LocalFavorite>('zitareFavorites');
|
||||
export const listTable = db.table<LocalQuoteList>('zitareLists');
|
||||
export const customQuoteTable = db.table<LocalCustomQuote>('zitareCustomQuotes');
|
||||
export const favoriteTable = db.table<LocalFavorite>('quotesFavorites');
|
||||
export const listTable = db.table<LocalQuoteList>('quotesLists');
|
||||
export const customQuoteTable = db.table<LocalCustomQuote>('customQuotes');
|
||||
|
||||
// ─── Guest Seed ────────────────────────────────────────────
|
||||
|
||||
export const ZITARE_GUEST_SEED = {
|
||||
zitareFavorites: [
|
||||
export const QUOTES_GUEST_SEED = {
|
||||
quotesFavorites: [
|
||||
{ id: 'fav-1', quoteId: 'mot-1' },
|
||||
{ id: 'fav-2', quoteId: 'weis-3' },
|
||||
{ id: 'fav-3', quoteId: 'mot-7' },
|
||||
{ id: 'fav-4', quoteId: 'weis-1' },
|
||||
{ id: 'fav-5', quoteId: 'liebe-1' },
|
||||
],
|
||||
zitareLists: [
|
||||
quotesLists: [
|
||||
{
|
||||
id: 'list-motivation',
|
||||
name: 'Motivation & Antrieb',
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue