feat: add org landing page builder service

New service that generates static Astro landing pages for organizations
and deploys them to Cloudflare Pages at {slug}.mana.how.

Components:
- Landing Builder Service (NestJS, port 3030) with Astro template
- Admin UI in Manacore web dashboard at /organizations/[id]/landing
- TeamSection + ContactSection for shared-landing-ui
- Two org themes (classic dark, warm light)
- LandingPageConfig types in shared-types
- Docker + CI/CD integration for Mac Mini deployment

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-23 13:20:10 +01:00
parent da6dd4ecb8
commit df0b849408
39 changed files with 2171 additions and 4 deletions

View file

@ -19,6 +19,9 @@ export * from './common';
// Contact types for cross-app integration
export * from './contact';
// Landing page configuration types
export * from './landing-config';
// API types
export interface User {
id: string;

View file

@ -0,0 +1,90 @@
/**
* Landing Page Configuration Types
*
* Used by the Admin UI (Manacore Web) and the Landing Builder Service
* to configure and generate static Astro landing pages for organizations.
*/
// --- Section Configs ---
export interface LandingHeroConfig {
title: string;
subtitle: string;
variant?: 'default' | 'centered' | 'fullwidth';
primaryCta?: { text: string; href: string };
secondaryCta?: { text: string; href: string };
image?: { src: string; alt: string };
}
export interface LandingAboutFeature {
icon: string;
title: string;
description: string;
}
export interface LandingAboutConfig {
title: string;
subtitle?: string;
features: LandingAboutFeature[];
columns?: 2 | 3;
}
export interface LandingTeamMember {
name: string;
role: string;
image?: string;
bio?: string;
}
export interface LandingTeamConfig {
title: string;
subtitle?: string;
members: LandingTeamMember[];
}
export interface LandingContactConfig {
title: string;
subtitle?: string;
email?: string;
phone?: string;
address?: string;
}
export interface LandingFooterLink {
label: string;
href: string;
}
export interface LandingFooterConfig {
copyright?: string;
links?: LandingFooterLink[];
socialLinks?: Array<{ platform: string; href: string }>;
}
// --- Main Config ---
export type LandingTheme = 'classic' | 'warm';
export type LandingBuildStatus = 'success' | 'failed' | 'building';
export interface LandingCustomColors {
primary?: string;
primaryHover?: string;
primaryGlow?: string;
}
export interface LandingPageConfig {
enabled: boolean;
theme: LandingTheme;
customColors?: LandingCustomColors;
sections: {
hero: LandingHeroConfig;
about: LandingAboutConfig;
team: LandingTeamConfig;
contact: LandingContactConfig;
footer: LandingFooterConfig;
};
lastBuiltAt?: string;
lastBuildStatus?: LandingBuildStatus;
publishedUrl?: string;
}