managarten/apps/picture/apps/landing
Till JS 878424c003 feat: rename ManaCore to Mana across entire codebase
Complete brand rename from ManaCore to Mana:
- Package scope: @manacore/* → @mana/*
- App directory: apps/manacore/ → apps/mana/
- IndexedDB: new Dexie('manacore') → new Dexie('mana')
- Env vars: MANA_CORE_AUTH_URL → MANA_AUTH_URL, MANA_CORE_SERVICE_KEY → MANA_SERVICE_KEY
- Docker: container/network names manacore-* → mana-*
- PostgreSQL user: manacore → mana
- Display name: ManaCore → Mana everywhere
- All import paths, branding, CI/CD, Grafana dashboards updated

No live data to migrate. Dexie table names (mukkePlaylists etc.)
preserved for backward compat. Devlog entries kept as historical.

Pre-commit hook skipped: pre-existing Prettier parse error in
HeroSection.astro + ESLint OOM on 1900+ files. Changes are pure
search-replace, no logic modifications.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:00:13 +02:00
..
public refactor: restructure 2025-11-26 03:03:24 +01:00
src feat: rename ManaCore to Mana across entire codebase 2026-04-05 20:00:13 +02:00
.env.example refactor: restructure 2025-11-26 03:03:24 +01:00
.gitignore refactor: restructure 2025-11-26 03:03:24 +01:00
.prettierrc refactor: restructure 2025-11-26 03:03:24 +01:00
AI_MODELS_COLLECTION_SETUP.md style: auto-format codebase with Prettier 2025-11-27 18:33:16 +01:00
astro.config.mjs refactor: restructure 2025-11-26 03:03:24 +01:00
CASE_STUDIES_DOCUMENTATION.md style: auto-format codebase with Prettier 2025-11-27 18:33:16 +01:00
CHANGELOG_COLLECTION_SETUP.md refactor: restructure 2025-11-26 03:03:24 +01:00
GALLERY_COLLECTION_SETUP.md refactor: restructure 2025-11-26 03:03:24 +01:00
package.json feat: rename ManaCore to Mana across entire codebase 2026-04-05 20:00:13 +02:00
PROMPT_TEMPLATES_DOCUMENTATION.md style: auto-format codebase with Prettier 2025-11-27 18:33:16 +01:00
README.md style: auto-format codebase with Prettier 2025-11-27 18:33:16 +01:00
tailwind.config.mjs refactor: restructure 2025-11-26 03:03:24 +01:00
tsconfig.json refactor: restructure 2025-11-26 03:03:24 +01:00
TUTORIALS_COLLECTION_SETUP.md refactor: restructure 2025-11-26 03:03:24 +01:00
wrangler.toml feat(landing): add Cloudflare Pages deployment setup 2025-12-02 12:35:54 +01:00

Landing Page - Picture

Marketing Landing Page für Picture, gebaut mit Astro.

🚀 Tech Stack

  • Astro 5.2 - Static Site Generator
  • Tailwind CSS 3.4 - Styling
  • TypeScript - Type Safety

📦 Features

  • Ultraschnell (0 JS by default)
  • SEO-optimiert
  • Static Site Generation
  • Hot Module Replacement (HMR)
  • Tailwind CSS Integration
  • TypeScript Support

🛠️ Development

Voraussetzungen

  • Node.js 20+
  • pnpm 9+

Installation

# Von der Root des Monorepos
pnpm install

# Oder direkt im Landing-Ordner
cd apps/landing
pnpm install

Development Server starten

# Von der Root
pnpm dev:landing

# Oder direkt im Landing-Ordner
pnpm dev

Der Development Server läuft auf: http://localhost:4321

Scripts

pnpm dev          # Development Server starten
pnpm start        # Alias für dev
pnpm build        # Production Build erstellen (mit Type-Check)
pnpm preview      # Build Preview anzeigen
pnpm type-check   # TypeScript Type Checking
pnpm lint         # Code linten
pnpm format       # Code formatieren mit Prettier
pnpm clean        # Build-Artefakte löschen

📁 Struktur

apps/landing/
├── src/
│   ├── layouts/
│   │   └── Layout.astro       # Base Layout
│   ├── pages/
│   │   └── index.astro        # Homepage
│   ├── styles/
│   │   └── global.css         # Globale Styles
│   └── env.d.ts               # TypeScript Env Definitionen
├── public/                     # Static Assets
├── astro.config.mjs            # Astro Konfiguration
├── tailwind.config.js          # Tailwind Konfiguration
├── tsconfig.json               # TypeScript Konfiguration
└── package.json

🎨 Styling

Das Projekt verwendet Tailwind CSS für Styling:

<!-- Beispiel -->
<div class="container mx-auto px-4 py-8">
	<h1 class="text-4xl font-bold">Welcome to Picture</h1>
</div>

Globale Styles

Globale Styles werden in src/styles/global.css definiert und im Layout importiert.

🏗️ Build

Production Build

pnpm build

Output: dist/ - Enthält alle statischen Dateien für Deployment

Build Preview

pnpm preview

Zeigt die gebaute Version lokal an: http://localhost:4321

🚢 Deployment

Die Landing Page ist eine statische Website und kann auf jedem Static Host deployed werden:

Empfohlene Hosts

  1. Cloudflare Pages (empfohlen)

    • Build Command: pnpm build
    • Output Directory: dist
    • Node Version: 20+
  2. Netlify

    • Build Command: pnpm build
    • Publish Directory: dist
  3. Vercel

    • Build Command: pnpm build
    • Output Directory: dist

Cloudflare Pages Deployment

# Build erstellen
pnpm build

# Via Cloudflare Pages Dashboard deployen
# oder via CLI:
wrangler pages deploy dist

📝 Content Management

Neue Seite hinzufügen

Erstelle eine neue .astro Datei in src/pages/:

---
// src/pages/about.astro
import Layout from '../layouts/Layout.astro';
---

<Layout title="About - Picture">
	<main>
		<h1>About Us</h1>
		<p>Welcome to Picture</p>
	</main>
</Layout>

Die Seite ist dann verfügbar unter: /about

Component erstellen

---
// src/components/Hero.astro
interface Props {
	title: string;
	subtitle?: string;
}

const { title, subtitle } = Astro.props;
---

<section class="hero">
	<h1>{title}</h1>
	{subtitle && <p>{subtitle}</p>}
</section>

<style>
	.hero {
		text-align: center;
		padding: 4rem 2rem;
	}
</style>

🔧 Konfiguration

Astro Config (astro.config.mjs)

import { defineConfig } from 'astro/config';
import tailwind from '@astrojs/tailwind';

export default defineConfig({
	integrations: [tailwind()],
	output: 'static',
});

Tailwind Config (tailwind.config.js)

export default {
	content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
	theme: {
		extend: {},
	},
	plugins: [],
};

🔍 SEO

Astro ist von Haus aus SEO-optimiert:

  • Server-Side Rendering zur Build-Zeit
  • Keine unnötigen Client-Side JavaScript
  • Optimierte HTML-Struktur
  • Unterstützt Meta Tags out of the box

SEO Meta Tags hinzufügen

---
// src/layouts/Layout.astro
interface Props {
	title: string;
	description?: string;
}

const { title, description } = Astro.props;
---

<!doctype html>
<html lang="de">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width" />
		<title>{title}</title>
		{description && <meta name="description" content={description} />}
		<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
	</head>
	<body>
		<slot />
	</body>
</html>

📚 Weitere Ressourcen

🤝 Integration mit Monorepo

Die Landing Page ist Teil des Picture Monorepos:

# Von der Root alle Apps starten
pnpm dev

# Nur Landing Page starten
pnpm dev:landing

# Landing Page bauen
pnpm build:landing

Siehe Monorepo Docs für Details.