feat: Sprint 14 — Marketing & Monetization
Deploy to TrueNAS / deploy (push) Failing after 33s

- Landing page with hero, feature grid, trust signals
- Split-layout login redesign (admin + portal)
- Pricing page with storage tiers (5GB/50GB/unlimited)
- StorageQuotaService backend (V36 migration, 402 on exceeded)
- Frontend storage integration + 402 error handling
- StorageController uses TenantContext for tenant isolation
- onTierChange() hook for subscription tier updates
This commit is contained in:
Patrick Plate
2026-06-18 20:27:54 +02:00
parent 52d23053e7
commit dad798a904
24 changed files with 2485 additions and 212 deletions
@@ -1,10 +1,10 @@
import Link from "next/link"
import { NextIntlClientProvider } from "next-intl"
import { getMessages } from "next-intl/server"
import { Cannabis } from "lucide-react"
import type { ReactNode } from "react"
import MarketingLayoutClient from "./marketing-layout-client"
// Force dynamic rendering — prevents NextAuth from being called at build time
// (AUTH_URL is not available during Docker image build)
export const dynamic = "force-dynamic"
@@ -18,108 +18,7 @@ export default async function MarketingLayout({
return (
<NextIntlClientProvider messages={messages}>
<div className="min-h-screen flex flex-col bg-background text-foreground overflow-x-hidden">
{/* Header */}
<header className="sticky top-0 z-40 border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
<div className="container mx-auto flex h-16 items-center justify-between px-4">
<Link href="/" className="flex items-center gap-2">
<div className="flex h-9 w-9 items-center justify-center rounded-lg bg-primary/10">
<Cannabis className="h-5 w-5 text-primary" />
</div>
<span className="text-lg font-bold">CannaManage</span>
</Link>
<nav className="flex items-center gap-4">
<Link
href="/pricing"
className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors"
>
Preise
</Link>
<Link
href="/login"
className="inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors"
>
Anmelden
</Link>
</nav>
</div>
</header>
{/* Main content */}
<main className="flex-1">{children}</main>
{/* Footer */}
<footer className="border-t bg-muted/50">
<div className="container mx-auto px-4 py-8">
<div className="grid grid-cols-1 gap-8 md:grid-cols-3">
<div>
<div className="flex items-center gap-2 mb-3">
<Cannabis className="h-5 w-5 text-primary" />
<span className="font-semibold">CannaManage</span>
</div>
<p className="text-sm text-muted-foreground">
Die sichere Verwaltungssoftware für Cannabis-Anbauvereine in
Deutschland.
</p>
</div>
<div>
<h4 className="font-semibold text-sm mb-3">Produkt</h4>
<ul className="space-y-2 text-sm text-muted-foreground">
<li>
<Link
href="/pricing"
className="hover:text-foreground transition-colors"
>
Preise
</Link>
</li>
<li>
<Link
href="/login"
className="hover:text-foreground transition-colors"
>
Anmelden
</Link>
</li>
</ul>
</div>
<div>
<h4 className="font-semibold text-sm mb-3">Rechtliches</h4>
<ul className="space-y-2 text-sm text-muted-foreground">
<li>
<Link
href="/impressum"
className="hover:text-foreground transition-colors"
>
Impressum
</Link>
</li>
<li>
<Link
href="/datenschutz"
className="hover:text-foreground transition-colors"
>
Datenschutz
</Link>
</li>
<li>
<Link
href="/agb"
className="hover:text-foreground transition-colors"
>
AGB
</Link>
</li>
</ul>
</div>
</div>
<div className="mt-8 border-t pt-6 text-center text-xs text-muted-foreground">
© {new Date().getFullYear()} CannaManage Plate Software. Alle
Rechte vorbehalten.
</div>
</div>
</footer>
</div>
<MarketingLayoutClient>{children}</MarketingLayoutClient>
</NextIntlClientProvider>
)
}