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>
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>© 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>
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
import { sveltekit } from '@sveltejs/kit/vite';
|
||||
import { defineConfig } from 'vite';
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [sveltekit()],
|
||||
});
|
||||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
"collection": "@nestjs/schematics",
|
||||
"sourceRoot": "src",
|
||||
"compilerOptions": {
|
||||
"deleteOutDir": true,
|
||||
"deleteOutDir": false,
|
||||
"assets": [],
|
||||
"watchAssets": false
|
||||
}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "@quote/backend",
|
||||
"name": "@zitare/backend",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "@quote/landing",
|
||||
"name": "@zitare/landing",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
@ -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';
|
||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 297 KiB After Width: | Height: | Size: 297 KiB |
|
Before Width: | Height: | Size: 871 B After Width: | Height: | Size: 871 B |
|
|
@ -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';
|
||||
|
|
@ -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';
|
||||
|
|
@ -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();
|
||||
|
|
@ -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",
|
||||