feat(zitare): rename quote project to zitare and add global search

- Rename entire quote project to zitare (German name)
- Add global search page with quote and author search
- Add search to navigation with Cmd/Ctrl+K shortcut
- Add missing icons to PillNavigation (heart, list, compass)
- Update all package names from @quote/* to @zitare/*
- Update env variables from QUOTE_* to ZITARE_*
- Update CLAUDE.md documentation
- Fix layout with flex container structure

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Till-JS 2025-11-28 20:14:19 +01:00
parent 23f8950318
commit 75a2527b60
292 changed files with 841 additions and 224 deletions

View file

@ -122,11 +122,11 @@ PICTURE_GOOGLE_CLIENT_ID=
PICTURE_APPLE_CLIENT_ID=
# ============================================
# QUOTE PROJECT
# ZITARE PROJECT
# ============================================
QUOTE_BACKEND_PORT=3007
QUOTE_DATABASE_URL=postgresql://manacore:devpassword@localhost:5432/quote
ZITARE_BACKEND_PORT=3007
ZITARE_DATABASE_URL=postgresql://manacore:devpassword@localhost:5432/zitare
# ============================================
# PRESI PROJECT
@ -142,3 +142,25 @@ PRESI_DATABASE_URL=postgresql://manacore:devpassword@localhost:5432/presi
VOXEL_LAVA_BACKEND_PORT=3010
VOXEL_LAVA_DATABASE_URL=postgresql://manacore:devpassword@localhost:5432/voxel_lava
VOXEL_LAVA_API_URL=http://localhost:3010
# ============================================
# MANA-GAMES PROJECT
# ============================================
MANA_GAMES_BACKEND_PORT=3011
# Google Gemini API (primary, fast)
MANA_GAMES_GOOGLE_GENAI_API_KEY=your_google_genai_key_here
# Anthropic Claude API (best code quality)
MANA_GAMES_ANTHROPIC_API_KEY=your_anthropic_key_here
# Azure OpenAI API (alternative)
MANA_GAMES_AZURE_OPENAI_ENDPOINT=https://your-endpoint.openai.azure.com
MANA_GAMES_AZURE_OPENAI_API_KEY=your_azure_openai_key_here
MANA_GAMES_AZURE_OPENAI_DEPLOYMENT=gpt-4o
# GitHub (for community submissions)
MANA_GAMES_GITHUB_TOKEN=your_github_token_here
MANA_GAMES_GITHUB_OWNER=tillschneider
MANA_GAMES_GITHUB_REPO=mana-games

View file

@ -22,7 +22,7 @@ This is a pnpm workspace monorepo containing multiple product applications with
| **uload** | URL shortener | SvelteKit web, PocketBase/Drizzle |
| **chat** | AI chat application | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
| **wisekeep** | AI wisdom extraction from video | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
| **quote** | Daily inspiration quotes | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
| **zitare** | Daily inspiration quotes | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
| **bauntown** | Community website for developers | Astro landing |
## Development Commands
@ -37,7 +37,7 @@ pnpm run memoro:dev
pnpm run picture:dev
pnpm run chat:dev
pnpm run wisekeep:dev
pnpm run quote:dev
pnpm run zitare:dev
pnpm run bauntown:dev
# Start specific app within project

View file

@ -1,85 +0,0 @@
<script lang="ts">
import { quotesDE, authorsDE, type EnhancedQuote, type Author } from '@quote/shared';
import { onMount } from 'svelte';
import { theme } from '$lib/stores/theme';
import { isSidebarCollapsed } from '$lib/stores/sidebar';
import Sidebar from '$lib/components/Sidebar.svelte';
import ToastContainer from '$lib/components/ToastContainer.svelte';
import { page } from '$app/stores';
import '../app.css';
// Make data available to all child routes
export let data: any;
onMount(() => {
theme.init();
});
// Check if we're on the homepage
$: isHomePage = $page.url.pathname === '/';
</script>
<Sidebar />
<ToastContainer />
<div class="app" class:sidebar-open={!$isSidebarCollapsed} class:home-page={isHomePage}>
<main class="main-content" class:home-content={isHomePage}>
<slot />
</main>
{#if !isHomePage}
<footer>
<p>&copy; 2025 Zitare App</p>
</footer>
{/if}
</div>
<style>
.app {
display: flex;
flex-direction: column;
min-height: 100vh;
transition: margin-left 0.3s ease;
}
/* Desktop: Add margin when sidebar is open */
@media (min-width: 1024px) {
.app.sidebar-open {
margin-left: 272px; /* 256px sidebar + 16px gap */
}
}
/* Mobile: Add top and bottom padding */
@media (max-width: 1023px) {
.app {
padding-top: 64px; /* Header height */
padding-bottom: 72px; /* Bottom nav height */
}
}
.main-content {
flex: 1;
padding: var(--spacing-xl);
max-width: 1400px;
width: 100%;
margin: 0 auto;
}
/* Homepage specific styles - no padding, full height */
.home-content {
padding: 0;
max-width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
footer {
padding: var(--spacing-md) var(--spacing-xl);
background: rgb(var(--color-surface));
text-align: center;
color: rgb(var(--color-text-secondary));
border-top: 1px solid rgb(var(--color-border));
margin-top: auto;
}
</style>

View file

@ -1,6 +0,0 @@
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [sveltekit()],
});

View file

@ -1,25 +0,0 @@
{
"name": "quote",
"version": "1.0.0",
"private": true,
"description": "Quote App - Daily Inspiration",
"scripts": {
"dev": "turbo run dev",
"dev:backend": "pnpm --filter @quote/backend dev",
"dev:web": "pnpm --filter @quote/web dev",
"dev:landing": "pnpm --filter @quote/landing dev",
"dev:mobile": "pnpm --filter @quote/mobile dev",
"build": "turbo run build",
"lint": "turbo run lint",
"type-check": "turbo run type-check",
"clean": "turbo run clean",
"db:push": "pnpm --filter @quote/backend db:push",
"db:studio": "pnpm --filter @quote/backend db:studio",
"db:seed": "pnpm --filter @quote/backend db:seed"
},
"devDependencies": {
"turbo": "^2.3.0",
"typescript": "^5.9.3"
},
"packageManager": "pnpm@9.15.0"
}

View file

@ -1,18 +1,18 @@
# Quote Project Guide
# Zitare Project Guide
## Project Structure
```
apps/quote/
apps/zitare/
├── apps/
│ ├── backend/ # NestJS API server (@quote/backend)
│ ├── landing/ # Astro marketing landing page (@quote/landing)
│ ├── web/ # SvelteKit web application (@quote/web)
│ └── mobile/ # Expo/React Native mobile app (@quote/mobile)
│ ├── backend/ # NestJS API server (@zitare/backend)
│ ├── landing/ # Astro marketing landing page (@zitare/landing)
│ ├── web/ # SvelteKit web application (@zitare/web)
│ └── mobile/ # Expo/React Native mobile app (@zitare/mobile)
├── packages/
│ ├── shared/ # Shared types, utils, configs (@quote/shared)
│ ├── content/ # Quote data and content (@quote/content)
│ └── web-ui/ # Shared Svelte components (@quote/web-ui)
│ ├── shared/ # Shared types, utils, configs (@zitare/shared)
│ ├── content/ # Quote data and content (@zitare/content)
│ └── web-ui/ # Shared Svelte components (@zitare/web-ui)
└── package.json
```
@ -21,15 +21,15 @@ apps/quote/
### Root Level (from monorepo root)
```bash
pnpm quote:dev # Run all quote apps
pnpm dev:quote:mobile # Start mobile app
pnpm dev:quote:web # Start web app
pnpm dev:quote:landing # Start landing page
pnpm dev:quote:backend # Start backend server
pnpm dev:quote:app # Start web + backend together
pnpm zitare:dev # Run all zitare apps
pnpm dev:zitare:mobile # Start mobile app
pnpm dev:zitare:web # Start web app
pnpm dev:zitare:landing # Start landing page
pnpm dev:zitare:backend # Start backend server
pnpm dev:zitare:app # Start web + backend together
```
### Mobile App (apps/quote/apps/mobile)
### Mobile App (apps/zitare/apps/mobile)
```bash
pnpm dev # Start Expo dev server
@ -37,7 +37,7 @@ pnpm ios # Run on iOS simulator
pnpm android # Run on Android emulator
```
### Backend (apps/quote/apps/backend)
### Backend (apps/zitare/apps/backend)
```bash
pnpm dev # Start with hot reload
@ -47,7 +47,7 @@ pnpm db:push # Push schema to database
pnpm db:studio # Open Drizzle Studio
```
### Web App (apps/quote/apps/web)
### Web App (apps/zitare/apps/web)
```bash
pnpm dev # Start dev server
@ -55,7 +55,7 @@ pnpm build # Build for production
pnpm preview # Preview production build
```
### Landing Page (apps/quote/apps/landing)
### Landing Page (apps/zitare/apps/landing)
```bash
pnpm dev # Start dev server
@ -74,7 +74,7 @@ pnpm build # Build for production
### Content Delivery (Hybrid)
- **Static Content**: Quotes and authors are bundled in `@quote/content` package for offline access
- **Static Content**: Quotes and authors are bundled in `@zitare/content` package for offline access
- **Backend API**: User-specific data (favorites, lists) are stored in PostgreSQL via backend API
### Backend API Endpoints
@ -119,7 +119,7 @@ pnpm build # Build for production
```
NODE_ENV=development
PORT=3007
DATABASE_URL=postgresql://manacore:devpassword@localhost:5432/quote
DATABASE_URL=postgresql://manacore:devpassword@localhost:5432/zitare
MANA_CORE_AUTH_URL=http://localhost:3001
CORS_ORIGINS=http://localhost:5173,http://localhost:5177,http://localhost:8081
```
@ -140,19 +140,19 @@ PUBLIC_MANA_CORE_AUTH_URL=http://localhost:3001
## Shared Packages
### @quote/shared
### @zitare/shared
- Types: `ContentItem`, `ContentAuthor`, `Quote`, `QuoteMetadata`
- Utils: Search, filter, random selection functions
- Configs: App configuration
### @quote/content
### @zitare/content
- Static quote data (German and English)
- Author information with biographies
- Export functions for data access
### @quote/web-ui
### @zitare/web-ui
- Shared Svelte 5 components
- Styling utilities

View file

@ -3,7 +3,7 @@
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"deleteOutDir": true,
"deleteOutDir": false,
"assets": [],
"watchAssets": false
}

View file

@ -1,5 +1,5 @@
{
"name": "@quote/backend",
"name": "@zitare/backend",
"version": "1.0.0",
"private": true,
"scripts": {

View file

@ -1,5 +1,5 @@
{
"name": "@quote/landing",
"name": "@zitare/landing",
"version": "1.0.0",
"private": true,
"scripts": {

View file

@ -25,7 +25,7 @@ import Animated, {
withSpring,
} from 'react-native-reanimated';
import { useTranslation } from 'react-i18next';
import type { Author } from '@quote/shared';
import type { Author } from '@zitare/shared';
import { LIST_ITEM_CLASSES, LIST_CONTAINER_PADDING } from '~/constants/layout';
import AuthorCard from '~/components/AuthorCard';
import { useTheme } from '~/hooks/useTheme';

View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 297 KiB

After

Width:  |  Height:  |  Size: 297 KiB

Before After
Before After

View file

@ -6,7 +6,7 @@ import { Icon } from '~/components/Icon';
import { useRouter } from 'expo-router';
import * as Haptics from 'expo-haptics';
import * as Clipboard from 'expo-clipboard';
import type { Author } from '@quote/shared';
import type { Author } from '@zitare/shared';
import { useThemeStore, useIsDarkMode } from '~/store/settingsStore';
import { useTheme } from '~/hooks/useTheme';
import { AuthorAvatar } from '~/components/authors/AuthorAvatar';

View file

@ -14,7 +14,7 @@ import Animated, {
Extrapolate,
SharedValue,
} from 'react-native-reanimated';
import type { EnhancedQuote } from '@quote/shared';
import type { EnhancedQuote } from '@zitare/shared';
import { useTheme } from '~/hooks/useTheme';
import { useTranslation } from 'react-i18next';
import { useShare } from '~/hooks/useShare';

View file

@ -7,7 +7,7 @@ import { Share, Alert, Platform } from 'react-native';
import * as Clipboard from 'expo-clipboard';
import * as Haptics from 'expo-haptics';
import { useTranslation } from 'react-i18next';
import type { EnhancedQuote, Author } from '@quote/shared';
import type { EnhancedQuote, Author } from '@zitare/shared';
export function useShare() {
const { t } = useTranslation();

View file

@ -1,5 +1,5 @@
{
"name": "@quote/mobile",
"name": "@zitare/mobile",
"version": "1.0.0",
"main": "expo-router/entry",
"scripts": {
@ -20,7 +20,7 @@
"web": "pnpm run build:biographies && expo start --web"
},
"dependencies": {
"@quote/shared": "workspace:*",
"@zitare/shared": "workspace:*",
"@anthropic-ai/sdk": "^0.65.0",
"@bacons/apple-targets": "^3.0.2",
"@expo/metro-runtime": "~6.1.2",

Some files were not shown because too many files have changed in this diff Show more