This commit adds the complete CHORUS Services brand system and documentation: BRAND ASSETS: - Complete CHORUS brand guide with visual identity standards - Comprehensive typography system with Exo font family - Color system documentation (Carbon Black, Walnut Brown, Brushed Aluminum) - Brand usage guidelines and logo specifications - Website mockup concepts and design assets - Texture assets for brand consistency WEBSITE SUBMODULE UPDATE: - Update to latest commit (7774d7e) with full brand system implementation - Includes typography system, design tokens, and component updates - Production-ready brand application across all website components DOCUMENTATION: - Website Architecture Strategy: Next.js 13+ with Ant Design 5+ technical specs - UX Design Strategy: User experience and interface design principles - Website Functionality Audit: Feature requirements and technical specifications - Network Validation Report: Infrastructure and deployment validation ASSETS STRUCTURE: - /brand-assets/fonts/ - Complete Exo font family with licensing - /brand-assets/colors/ - Color system documentation - /brand-assets/typography/ - Typography hierarchy specifications - /brand-assets/guidelines/ - Brand usage and implementation guidelines - /brand-assets/mockups/ - Website design concepts and layouts - /brand-assets/textures/ - Visual texture assets for brand consistency This establishes the complete foundation for CHORUS Services brand identity and provides comprehensive documentation for consistent implementation across all marketing and product materials. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
968 lines
29 KiB
Markdown
968 lines
29 KiB
Markdown
# CHORUS Services Website Architecture Strategy
|
|
|
|
## Executive Summary
|
|
|
|
This document outlines a comprehensive website architecture strategy for CHORUS Services, a distributed AI orchestration platform. The strategy leverages Next.js 13+ App Router with Ant Design 5+ and Framer Motion to create an enterprise-grade marketing website that showcases the platform's technical capabilities while remaining accessible to both technical and business audiences.
|
|
|
|
## 1. Architecture Overview
|
|
|
|
### Core Technology Stack
|
|
- **Framework**: Next.js 13+ with App Router for optimal performance and SEO
|
|
- **UI Library**: Ant Design 5+ with custom dark theme and CSS-in-JS theming
|
|
- **Animation**: Framer Motion for parallax effects and sophisticated animations
|
|
- **Styling**: CSS-in-JS with @ant-design/cssinjs and antd-style for advanced theming
|
|
- **Deployment**: Docker containerization with Traefik integration on existing infrastructure
|
|
|
|
### Design Philosophy
|
|
- **Apple-inspired aesthetics**: Clean, sophisticated, technology-focused design
|
|
- **Dark theme primary**: Technology-forward appearance with electric blue (#007aff) and emerald green (#30d158)
|
|
- **Performance-first**: Enterprise-grade loading speeds and accessibility
|
|
- **Responsive-native**: Mobile-first design with desktop enhancement
|
|
|
|
## 2. Folder Structure & Component Hierarchy
|
|
|
|
```
|
|
chorus-website/
|
|
├── src/
|
|
│ ├── app/ # Next.js 13+ App Router
|
|
│ │ ├── (marketing)/ # Route group for marketing pages
|
|
│ │ │ ├── page.tsx # Home page (/)
|
|
│ │ │ ├── ecosystem/ # Platform overview (/ecosystem)
|
|
│ │ │ │ └── page.tsx
|
|
│ │ │ ├── scenarios/ # Use cases and demos (/scenarios)
|
|
│ │ │ │ └── page.tsx
|
|
│ │ │ ├── modules/ # Component breakdown (/modules)
|
|
│ │ │ │ └── page.tsx
|
|
│ │ │ ├── how-it-works/ # Process explanation (/how-it-works)
|
|
│ │ │ │ └── page.tsx
|
|
│ │ │ └── about/ # Team and company (/about)
|
|
│ │ │ └── page.tsx
|
|
│ │ ├── investors/ # Investor relations (protected)
|
|
│ │ │ └── page.tsx
|
|
│ │ ├── api/ # API routes for contact forms, etc.
|
|
│ │ │ └── contact/
|
|
│ │ │ └── route.ts
|
|
│ │ ├── globals.css # Global styles and CSS variables
|
|
│ │ ├── layout.tsx # Root layout with Ant Design ConfigProvider
|
|
│ │ └── loading.tsx # Global loading component
|
|
│ ├── components/ # Reusable components
|
|
│ │ ├── ui/ # Core UI components
|
|
│ │ │ ├── PerformanceCard.tsx # Metrics display cards
|
|
│ │ │ ├── ModuleCard.tsx # CHORUS component showcases
|
|
│ │ │ ├── AnimatedCounter.tsx # Metric counters with animation
|
|
│ │ │ ├── ParallaxSection.tsx # Scroll-based parallax container
|
|
│ │ │ ├── GradientText.tsx # Styled gradient typography
|
|
│ │ │ └── LoadingSpinner.tsx # Consistent loading states
|
|
│ │ ├── sections/ # Page-specific sections
|
|
│ │ │ ├── HeroSection.tsx # Homepage hero with animation
|
|
│ │ │ ├── FeaturesSection.tsx # Platform capabilities
|
|
│ │ │ ├── MetricsSection.tsx # Performance statistics
|
|
│ │ │ ├── ModulesSection.tsx # Component breakdown
|
|
│ │ │ ├── ScenariosSection.tsx # Use case demonstrations
|
|
│ │ │ ├── TestimonialsSection.tsx # Customer validation
|
|
│ │ │ └── CTASection.tsx # Call-to-action sections
|
|
│ │ ├── navigation/ # Navigation components
|
|
│ │ │ ├── Header.tsx # Main navigation with sticky behavior
|
|
│ │ │ ├── Footer.tsx # Footer with links and company info
|
|
│ │ │ ├── MobileMenu.tsx # Mobile-responsive navigation
|
|
│ │ │ └── NavigationDots.tsx # Page section navigation
|
|
│ │ └── forms/ # Contact and interaction forms
|
|
│ │ ├── ContactForm.tsx # General contact form
|
|
│ │ ├── InvestorForm.tsx # Investor qualification form
|
|
│ │ └── DemoRequestForm.tsx # Technical demo requests
|
|
│ ├── lib/ # Utilities and configurations
|
|
│ │ ├── theme/ # Ant Design theme customization
|
|
│ │ │ ├── chorusTheme.ts # Main theme configuration
|
|
│ │ │ ├── darkTheme.ts # Dark mode specifications
|
|
│ │ │ └── animations.ts # Framer Motion variants
|
|
│ │ ├── utils/ # Helper functions
|
|
│ │ │ ├── animations.ts # Animation utilities
|
|
│ │ │ ├── metrics.ts # Performance data formatting
|
|
│ │ │ └── validation.ts # Form validation schemas
|
|
│ │ └── constants/ # Application constants
|
|
│ │ ├── colors.ts # Brand color system
|
|
│ │ ├── typography.ts # Font and text specifications
|
|
│ │ └── content.ts # Static content and copy
|
|
│ ├── styles/ # Global and component styles
|
|
│ │ ├── globals.css # Reset and global styles
|
|
│ │ ├── components.css # Component-specific styles
|
|
│ │ └── animations.css # CSS animations and transitions
|
|
│ └── assets/ # Static assets
|
|
│ ├── images/ # Optimized images and graphics
|
|
│ ├── icons/ # SVG icons and logos
|
|
└── public/ # Public static files
|
|
├── favicon.ico
|
|
├── robots.txt
|
|
├── sitemap.xml
|
|
└── images/ # Public images for SEO
|
|
```
|
|
|
|
## 3. Component Architecture Strategy
|
|
|
|
### 3.1 Design System Foundation
|
|
|
|
#### Color System
|
|
```typescript
|
|
// lib/constants/colors.ts
|
|
export const colors = {
|
|
primary: {
|
|
blue: '#007aff', // Electric blue - primary actions
|
|
green: '#30d158', // Emerald green - success states
|
|
amber: '#ff9f0a', // Amber orange - warnings
|
|
red: '#ff453a', // System red - errors
|
|
},
|
|
neutral: {
|
|
black: '#000000', // Pure black - backgrounds
|
|
charcoal: '#1a1a1a', // Deep charcoal - containers
|
|
gray: '#2d2d30', // Cool gray - elevated surfaces
|
|
lightGray: '#a1a1a6', // Light gray - secondary text
|
|
white: '#f2f2f7', // Off-white - primary text
|
|
},
|
|
gradients: {
|
|
hero: 'linear-gradient(135deg, #000000 0%, #1a1a1a 100%)',
|
|
text: 'linear-gradient(135deg, #f2f2f7 0%, #007aff 100%)',
|
|
card: 'linear-gradient(135deg, #1a1a1a 0%, #2d2d30 100%)',
|
|
}
|
|
};
|
|
```
|
|
|
|
#### Typography System
|
|
```typescript
|
|
// lib/constants/typography.ts
|
|
export const typography = {
|
|
fonts: {
|
|
primary: `-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', sans-serif`,
|
|
mono: `'SF Mono', 'Monaco', 'Inconsolata', monospace`,
|
|
},
|
|
sizes: {
|
|
hero: '84px', // Large headlines
|
|
h1: '48px', // Section headers
|
|
h2: '36px', // Subsection headers
|
|
h3: '24px', // Component titles
|
|
body: '16px', // Default body text
|
|
small: '14px', // Secondary information
|
|
},
|
|
weights: {
|
|
light: 300,
|
|
regular: 400,
|
|
medium: 500,
|
|
semibold: 600,
|
|
bold: 700,
|
|
}
|
|
};
|
|
```
|
|
|
|
### 3.2 Key Component Specifications
|
|
|
|
#### HeroSection Component
|
|
```typescript
|
|
// components/sections/HeroSection.tsx
|
|
interface HeroSectionProps {
|
|
title: string;
|
|
subtitle: string;
|
|
ctaButtons: Array<{
|
|
text: string;
|
|
type: 'primary' | 'secondary';
|
|
href: string;
|
|
}>;
|
|
backgroundAnimation?: boolean;
|
|
}
|
|
|
|
// Features:
|
|
// - Parallax background with subtle particle animation
|
|
// - Staggered text animations using Framer Motion
|
|
// - Responsive typography scaling
|
|
// - Accessibility-compliant contrast ratios
|
|
// - Integration with Ant Design Button components
|
|
```
|
|
|
|
#### ModuleCard Component
|
|
```typescript
|
|
// components/ui/ModuleCard.tsx
|
|
interface ModuleCardProps {
|
|
title: string;
|
|
description: string;
|
|
icon: ReactNode;
|
|
metrics: Array<{
|
|
label: string;
|
|
value: string;
|
|
trend?: 'up' | 'down' | 'stable';
|
|
}>;
|
|
delay?: number;
|
|
link?: string;
|
|
}
|
|
|
|
// Features:
|
|
// - Hover animations with smooth transitions
|
|
// - Metric counters with animation on scroll
|
|
// - Consistent spacing using Ant Design tokens
|
|
// - Dark mode optimized styling
|
|
// - Performance-optimized rendering
|
|
```
|
|
|
|
#### ParallaxSection Component
|
|
```typescript
|
|
// components/ui/ParallaxSection.tsx
|
|
interface ParallaxSectionProps {
|
|
children: ReactNode;
|
|
speed?: number;
|
|
offset?: [string, string];
|
|
className?: string;
|
|
}
|
|
|
|
// Features:
|
|
// - Smooth scroll parallax using Framer Motion
|
|
// - Configurable speed and offset parameters
|
|
// - Intersection Observer for performance
|
|
// - Reduced motion support for accessibility
|
|
// - Compatible with Ant Design Layout components
|
|
```
|
|
|
|
## 4. Technology Integration Approach
|
|
|
|
### 4.1 Next.js 13+ Configuration
|
|
|
|
#### App Router Setup
|
|
```typescript
|
|
// app/layout.tsx
|
|
import { ConfigProvider } from 'antd';
|
|
import { chorusTheme } from '@/lib/theme/chorusTheme';
|
|
import type { Metadata } from 'next';
|
|
|
|
export const metadata: Metadata = {
|
|
title: 'CHORUS Services - Distributed AI Orchestration',
|
|
description: 'Enterprise-ready distributed AI orchestration platform that eliminates context loss, reduces hallucinations, and enables true multi-agent coordination.',
|
|
keywords: ['AI orchestration', 'distributed systems', 'context management', 'enterprise AI'],
|
|
openGraph: {
|
|
title: 'CHORUS Services',
|
|
description: 'Distributed AI Orchestration Without the Hallucinations',
|
|
url: 'https://www.chorus.services',
|
|
siteName: 'CHORUS Services',
|
|
images: [
|
|
{
|
|
url: '/images/og-image.jpg',
|
|
width: 1200,
|
|
height: 630,
|
|
alt: 'CHORUS Services Platform'
|
|
}
|
|
]
|
|
}
|
|
};
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode;
|
|
}) {
|
|
return (
|
|
<html lang="en">
|
|
<body>
|
|
<ConfigProvider theme={chorusTheme}>
|
|
{children}
|
|
</ConfigProvider>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|
|
```
|
|
|
|
#### Performance Optimizations
|
|
```javascript
|
|
// next.config.js
|
|
/** @type {import('next').NextConfig} */
|
|
const nextConfig = {
|
|
experimental: {
|
|
appDir: true,
|
|
},
|
|
transpilePackages: ['antd'],
|
|
webpack: (config) => {
|
|
// Ant Design tree shaking optimization
|
|
config.optimization.splitChunks.cacheGroups.antd = {
|
|
name: 'antd',
|
|
test: /[\\/]node_modules[\\/]antd[\\/]/,
|
|
chunks: 'all',
|
|
priority: 10,
|
|
};
|
|
|
|
// Framer Motion code splitting
|
|
config.optimization.splitChunks.cacheGroups.framerMotion = {
|
|
name: 'framer-motion',
|
|
test: /[\\/]node_modules[\\/]framer-motion[\\/]/,
|
|
chunks: 'all',
|
|
priority: 10,
|
|
};
|
|
|
|
return config;
|
|
},
|
|
images: {
|
|
formats: ['image/webp', 'image/avif'],
|
|
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
|
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
|
|
},
|
|
compress: true,
|
|
poweredByHeader: false,
|
|
};
|
|
|
|
module.exports = nextConfig;
|
|
```
|
|
|
|
### 4.2 Ant Design 5+ Integration
|
|
|
|
#### Custom Theme Configuration
|
|
```typescript
|
|
// lib/theme/chorusTheme.ts
|
|
import { theme } from 'antd';
|
|
import type { ThemeConfig } from 'antd';
|
|
|
|
export const chorusTheme: ThemeConfig = {
|
|
algorithm: theme.darkAlgorithm,
|
|
token: {
|
|
// Color System
|
|
colorPrimary: '#007aff', // Electric blue
|
|
colorSuccess: '#30d158', // Emerald green
|
|
colorWarning: '#ff9f0a', // Amber orange
|
|
colorError: '#ff453a', // System red
|
|
colorInfo: '#007aff', // Electric blue
|
|
|
|
// Background Colors
|
|
colorBgContainer: '#1a1a1a', // Deep charcoal
|
|
colorBgElevated: '#2d2d30', // Cool gray
|
|
colorBgLayout: '#000000', // Pure black
|
|
|
|
// Typography
|
|
fontFamily: `-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', sans-serif`,
|
|
fontSize: 16,
|
|
fontSizeHeading1: 84, // Large headlines
|
|
fontSizeHeading2: 48, // Section headers
|
|
fontSizeHeading3: 36, // Subsection headers
|
|
|
|
// Spacing & Layout
|
|
borderRadius: 8, // Consistent 8px radius
|
|
wireframe: false, // Enable modern styling
|
|
|
|
// Motion & Animation
|
|
motionDurationSlow: '0.3s', // Apple-style timing
|
|
motionDurationMid: '0.2s',
|
|
motionDurationFast: '0.1s',
|
|
},
|
|
|
|
components: {
|
|
Button: {
|
|
primaryShadow: '0 12px 24px rgba(0, 122, 255, 0.3)',
|
|
controlHeight: 48, // Larger touch targets
|
|
fontWeight: 600,
|
|
borderRadius: 8,
|
|
},
|
|
|
|
Card: {
|
|
borderRadiusLG: 12, // Slightly larger for cards
|
|
paddingLG: 32,
|
|
boxShadowTertiary: '0 8px 32px rgba(0, 0, 0, 0.4)',
|
|
},
|
|
|
|
Layout: {
|
|
headerBg: 'rgba(26, 26, 26, 0.8)', // Semi-transparent header
|
|
headerHeight: 72,
|
|
bodyBg: '#000000',
|
|
},
|
|
|
|
Typography: {
|
|
titleMarginTop: 0,
|
|
titleMarginBottom: 24,
|
|
colorText: '#f2f2f7',
|
|
colorTextSecondary: '#a1a1a6',
|
|
}
|
|
}
|
|
};
|
|
```
|
|
|
|
### 4.3 Framer Motion Integration
|
|
|
|
#### Animation Variants Library
|
|
```typescript
|
|
// lib/theme/animations.ts
|
|
export const fadeInUp = {
|
|
initial: { opacity: 0, y: 40 },
|
|
animate: { opacity: 1, y: 0 },
|
|
transition: { duration: 0.6 }
|
|
};
|
|
|
|
export const staggerChildren = {
|
|
animate: {
|
|
transition: {
|
|
staggerChildren: 0.1
|
|
}
|
|
}
|
|
};
|
|
|
|
export const parallaxVariants = {
|
|
initial: { y: 0 },
|
|
animate: (custom: number) => ({
|
|
y: custom,
|
|
transition: {
|
|
type: "spring",
|
|
stiffness: 100,
|
|
damping: 30
|
|
}
|
|
})
|
|
};
|
|
|
|
export const counterAnimation = {
|
|
initial: { scale: 0.8, opacity: 0 },
|
|
animate: { scale: 1, opacity: 1 },
|
|
transition: {
|
|
type: "spring",
|
|
stiffness: 200,
|
|
damping: 25
|
|
}
|
|
};
|
|
|
|
export const cardHover = {
|
|
hover: {
|
|
y: -8,
|
|
boxShadow: "0 20px 40px rgba(0, 122, 255, 0.2)",
|
|
transition: { duration: 0.3 }
|
|
}
|
|
};
|
|
```
|
|
|
|
#### Parallax Implementation
|
|
```typescript
|
|
// components/ui/ParallaxSection.tsx
|
|
import { motion, useScroll, useTransform } from 'framer-motion';
|
|
import { useRef } from 'react';
|
|
import { Layout } from 'antd';
|
|
|
|
const { Content } = Layout;
|
|
|
|
interface ParallaxSectionProps {
|
|
children: React.ReactNode;
|
|
speed?: number;
|
|
offset?: [string, string];
|
|
className?: string;
|
|
}
|
|
|
|
export const ParallaxSection: React.FC<ParallaxSectionProps> = ({
|
|
children,
|
|
speed = 0.5,
|
|
offset = ["start end", "end start"],
|
|
className
|
|
}) => {
|
|
const ref = useRef(null);
|
|
const { scrollYProgress } = useScroll({
|
|
target: ref,
|
|
offset
|
|
});
|
|
|
|
const y = useTransform(scrollYProgress, [0, 1], [0, -200 * speed]);
|
|
|
|
return (
|
|
<Content ref={ref} className={className}>
|
|
<motion.div style={{ y }}>
|
|
{children}
|
|
</motion.div>
|
|
</Content>
|
|
);
|
|
};
|
|
```
|
|
|
|
## 5. Performance Optimization Strategy
|
|
|
|
### 5.1 Bundle Optimization
|
|
|
|
#### Tree Shaking Configuration
|
|
```typescript
|
|
// lib/antd/index.ts - Centralized component imports
|
|
export { default as Button } from 'antd/es/button';
|
|
export { default as Card } from 'antd/es/card';
|
|
export { default as Layout } from 'antd/es/layout';
|
|
export { default as Typography } from 'antd/es/typography';
|
|
export { default as Space } from 'antd/es/space';
|
|
export { default as Row } from 'antd/es/row';
|
|
export { default as Col } from 'antd/es/col';
|
|
export { default as Form } from 'antd/es/form';
|
|
export { default as Input } from 'antd/es/input';
|
|
export { default as Progress } from 'antd/es/progress';
|
|
export { default as Statistic } from 'antd/es/statistic';
|
|
|
|
// Usage in components
|
|
import { Button, Card, Typography } from '@/lib/antd';
|
|
```
|
|
|
|
#### Code Splitting Strategy
|
|
```typescript
|
|
// Dynamic imports for non-critical components
|
|
const InvestorForm = dynamic(() => import('@/components/forms/InvestorForm'), {
|
|
loading: () => <LoadingSpinner />,
|
|
ssr: false
|
|
});
|
|
|
|
const InteractiveDemo = dynamic(() => import('@/components/sections/InteractiveDemo'), {
|
|
loading: () => <div>Loading demo...</div>
|
|
});
|
|
```
|
|
|
|
### 5.2 Image Optimization
|
|
|
|
#### Next.js Image Component Usage
|
|
```typescript
|
|
// components/ui/OptimizedImage.tsx
|
|
import Image from 'next/image';
|
|
import { useState } from 'react';
|
|
|
|
interface OptimizedImageProps {
|
|
src: string;
|
|
alt: string;
|
|
width: number;
|
|
height: number;
|
|
priority?: boolean;
|
|
className?: string;
|
|
}
|
|
|
|
export const OptimizedImage: React.FC<OptimizedImageProps> = ({
|
|
src,
|
|
alt,
|
|
width,
|
|
height,
|
|
priority = false,
|
|
className
|
|
}) => {
|
|
const [isLoaded, setIsLoaded] = useState(false);
|
|
|
|
return (
|
|
<div className={`image-container ${className}`}>
|
|
<Image
|
|
src={src}
|
|
alt={alt}
|
|
width={width}
|
|
height={height}
|
|
priority={priority}
|
|
placeholder="blur"
|
|
blurDataURL="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAv/xAAhEAACAQMDBQAAAAAAAAAAAAABAgMABAUGIWGRkqGx0f/EABUBAQEAAAAAAAAAAAAAAAAAAAMF/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAECEgMRkf/aAAwDAQACEQMRAD8AltJagyeH0AthI5xdrLcNM91BF5pX2HaH9bcfaSennjdEBAABAAcAMgsGdCcIK+f"
|
|
onLoad={() => setIsLoaded(true)}
|
|
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
|
|
style={{
|
|
transition: 'opacity 0.3s',
|
|
opacity: isLoaded ? 1 : 0
|
|
}}
|
|
/>
|
|
</div>
|
|
);
|
|
};
|
|
```
|
|
|
|
### 5.3 Loading Performance
|
|
|
|
#### Metrics and Monitoring
|
|
```typescript
|
|
// lib/utils/performance.ts
|
|
export const trackWebVitals = (metric: any) => {
|
|
switch (metric.name) {
|
|
case 'FCP':
|
|
// First Contentful Paint
|
|
console.log('FCP:', metric.value);
|
|
break;
|
|
case 'LCP':
|
|
// Largest Contentful Paint
|
|
console.log('LCP:', metric.value);
|
|
break;
|
|
case 'CLS':
|
|
// Cumulative Layout Shift
|
|
console.log('CLS:', metric.value);
|
|
break;
|
|
case 'FID':
|
|
// First Input Delay
|
|
console.log('FID:', metric.value);
|
|
break;
|
|
case 'TTFB':
|
|
// Time to First Byte
|
|
console.log('TTFB:', metric.value);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
};
|
|
|
|
// Usage in _app.tsx or layout.tsx
|
|
export function reportWebVitals(metric: any) {
|
|
trackWebVitals(metric);
|
|
}
|
|
```
|
|
|
|
## 6. SEO and Accessibility Strategy
|
|
|
|
### 6.1 SEO Optimization
|
|
|
|
#### Metadata Configuration
|
|
```typescript
|
|
// app/page.tsx
|
|
import type { Metadata } from 'next';
|
|
|
|
export const metadata: Metadata = {
|
|
title: 'CHORUS Services - Distributed AI Orchestration Without the Hallucinations',
|
|
description: 'Enterprise-ready distributed AI orchestration platform that eliminates context loss, reduces hallucinations, and enables true multi-agent coordination through intelligent context management.',
|
|
keywords: [
|
|
'AI orchestration',
|
|
'distributed AI systems',
|
|
'context management',
|
|
'multi-agent coordination',
|
|
'enterprise AI platform',
|
|
'AI hallucination prevention',
|
|
'collaborative AI reasoning',
|
|
'persistent AI memory'
|
|
],
|
|
authors: [{ name: 'Deep Black Cloud Development' }],
|
|
creator: 'Deep Black Cloud Development',
|
|
publisher: 'CHORUS Services',
|
|
formatDetection: {
|
|
email: false,
|
|
address: false,
|
|
telephone: false,
|
|
},
|
|
robots: {
|
|
index: true,
|
|
follow: true,
|
|
googleBot: {
|
|
index: true,
|
|
follow: true,
|
|
'max-video-preview': -1,
|
|
'max-image-preview': 'large',
|
|
'max-snippet': -1,
|
|
},
|
|
},
|
|
openGraph: {
|
|
title: 'CHORUS Services - Distributed AI Orchestration',
|
|
description: 'Distributed AI Orchestration Without the Hallucinations',
|
|
url: 'https://www.chorus.services',
|
|
siteName: 'CHORUS Services',
|
|
type: 'website',
|
|
images: [
|
|
{
|
|
url: '/images/og-chorus-platform.jpg',
|
|
width: 1200,
|
|
height: 630,
|
|
alt: 'CHORUS Services Platform Architecture',
|
|
}
|
|
],
|
|
locale: 'en_US',
|
|
},
|
|
twitter: {
|
|
card: 'summary_large_image',
|
|
title: 'CHORUS Services - Distributed AI Orchestration',
|
|
description: 'Enterprise-ready AI orchestration platform that eliminates context loss and enables true multi-agent coordination.',
|
|
images: ['/images/twitter-chorus-card.jpg'],
|
|
creator: '@chorusservices',
|
|
},
|
|
verification: {
|
|
google: 'google-site-verification-code',
|
|
},
|
|
};
|
|
```
|
|
|
|
#### Structured Data Implementation
|
|
```typescript
|
|
// components/seo/StructuredData.tsx
|
|
export const OrganizationStructuredData = () => {
|
|
const structuredData = {
|
|
"@context": "https://schema.org",
|
|
"@type": "Organization",
|
|
"name": "CHORUS Services",
|
|
"description": "Enterprise-ready distributed AI orchestration platform",
|
|
"url": "https://www.chorus.services",
|
|
"logo": "https://www.chorus.services/images/chorus-logo.png",
|
|
"sameAs": [
|
|
"https://github.com/chorus-services",
|
|
"https://linkedin.com/company/chorus-services"
|
|
],
|
|
"contactPoint": {
|
|
"@type": "ContactPoint",
|
|
"telephone": "+1-XXX-XXX-XXXX",
|
|
"contactType": "customer service",
|
|
"availableLanguage": "English"
|
|
}
|
|
};
|
|
|
|
return (
|
|
<script
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{
|
|
__html: JSON.stringify(structuredData)
|
|
}}
|
|
/>
|
|
);
|
|
};
|
|
```
|
|
|
|
### 6.2 Accessibility Implementation
|
|
|
|
#### ARIA Labels and Semantic HTML
|
|
```typescript
|
|
// components/sections/HeroSection.tsx
|
|
export const HeroSection: React.FC = () => {
|
|
return (
|
|
<section
|
|
role="banner"
|
|
aria-label="CHORUS Services introduction"
|
|
className="hero-section"
|
|
>
|
|
<header>
|
|
<h1
|
|
className="hero-title"
|
|
aria-describedby="hero-subtitle"
|
|
>
|
|
CHORUS Services
|
|
</h1>
|
|
<p
|
|
id="hero-subtitle"
|
|
className="hero-subtitle"
|
|
>
|
|
Distributed AI Orchestration Without the Hallucinations
|
|
</p>
|
|
</header>
|
|
|
|
<nav aria-label="Primary actions">
|
|
<Button
|
|
type="primary"
|
|
size="large"
|
|
aria-describedby="platform-exploration-desc"
|
|
onClick={() => router.push('/ecosystem')}
|
|
>
|
|
Explore the Platform
|
|
</Button>
|
|
<span
|
|
id="platform-exploration-desc"
|
|
className="sr-only"
|
|
>
|
|
Navigate to detailed platform overview and capabilities
|
|
</span>
|
|
</nav>
|
|
</section>
|
|
);
|
|
};
|
|
```
|
|
|
|
#### Keyboard Navigation Support
|
|
```typescript
|
|
// components/navigation/Header.tsx
|
|
import { useState, useRef, useEffect } from 'react';
|
|
|
|
export const Header: React.FC = () => {
|
|
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
|
|
const mobileMenuRef = useRef<HTMLDivElement>(null);
|
|
|
|
useEffect(() => {
|
|
const handleKeyDown = (event: KeyboardEvent) => {
|
|
if (event.key === 'Escape' && isMobileMenuOpen) {
|
|
setIsMobileMenuOpen(false);
|
|
}
|
|
};
|
|
|
|
document.addEventListener('keydown', handleKeyDown);
|
|
return () => document.removeEventListener('keydown', handleKeyDown);
|
|
}, [isMobileMenuOpen]);
|
|
|
|
return (
|
|
<header role="banner" className="main-header">
|
|
<nav aria-label="Main navigation">
|
|
{/* Navigation implementation with focus management */}
|
|
</nav>
|
|
</header>
|
|
);
|
|
};
|
|
```
|
|
|
|
## 7. Docker Integration Plan
|
|
|
|
### 7.1 Dockerfile Configuration
|
|
|
|
#### Multi-stage Production Build
|
|
```dockerfile
|
|
# Dockerfile
|
|
FROM node:18-alpine AS base
|
|
|
|
# Install dependencies only when needed
|
|
FROM base AS deps
|
|
RUN apk add --no-cache libc6-compat
|
|
WORKDIR /app
|
|
|
|
# Install dependencies based on the preferred package manager
|
|
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
|
|
RUN \
|
|
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
|
|
elif [ -f package-lock.json ]; then npm ci; \
|
|
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \
|
|
else echo "Lockfile not found." && exit 1; \
|
|
fi
|
|
|
|
# Rebuild the source code only when needed
|
|
FROM base AS builder
|
|
WORKDIR /app
|
|
COPY --from=deps /app/node_modules ./node_modules
|
|
COPY . .
|
|
|
|
# Build application
|
|
ENV NEXT_TELEMETRY_DISABLED 1
|
|
RUN yarn build
|
|
|
|
# Production image, copy all the files and run next
|
|
FROM base AS runner
|
|
WORKDIR /app
|
|
|
|
ENV NODE_ENV production
|
|
ENV NEXT_TELEMETRY_DISABLED 1
|
|
|
|
RUN addgroup --system --gid 1001 nodejs
|
|
RUN adduser --system --uid 1001 nextjs
|
|
|
|
COPY --from=builder /app/public ./public
|
|
|
|
# Set the correct permission for prerender cache
|
|
RUN mkdir .next
|
|
RUN chown nextjs:nodejs .next
|
|
|
|
# Automatically leverage output traces to reduce image size
|
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
|
|
USER nextjs
|
|
|
|
EXPOSE 3000
|
|
|
|
ENV PORT 3000
|
|
ENV HOSTNAME "0.0.0.0"
|
|
|
|
CMD ["node", "server.js"]
|
|
```
|
|
|
|
### 7.2 Docker Compose Integration
|
|
|
|
#### Development Configuration
|
|
```yaml
|
|
# docker-compose.dev.yml
|
|
version: '3.8'
|
|
|
|
services:
|
|
chorus-website-dev:
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile.dev
|
|
ports:
|
|
- "3000:3000"
|
|
volumes:
|
|
- .:/app
|
|
- /app/node_modules
|
|
- /app/.next
|
|
environment:
|
|
- NODE_ENV=development
|
|
- NEXT_TELEMETRY_DISABLED=1
|
|
- WATCHPACK_POLLING=true
|
|
command: yarn dev
|
|
networks:
|
|
- chorus_network
|
|
|
|
networks:
|
|
chorus_network:
|
|
external: true
|
|
```
|
|
|
|
### 7.3 Production Deployment Integration
|
|
|
|
#### Traefik Labels for Docker Swarm
|
|
The website service is already configured in the existing `docker-compose.swarm.yml`:
|
|
|
|
```yaml
|
|
# From docker-compose.swarm.yml (lines 70-97)
|
|
chorus-website:
|
|
image: registry.home.deepblack.cloud/tony/chorus-website:latest
|
|
deploy:
|
|
replicas: 2
|
|
placement:
|
|
constraints:
|
|
- node.role == worker
|
|
resources:
|
|
limits:
|
|
memory: 128M
|
|
reservations:
|
|
memory: 64M
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.docker.network=tengig"
|
|
- "traefik.http.routers.chorus-website.rule=Host(`www.chorus.services`) || Host(`chorus.services`)"
|
|
- "traefik.http.routers.chorus-website.entrypoints=web-secured"
|
|
- "traefik.http.routers.chorus-website.tls.certresolver=letsencryptresolver"
|
|
- "traefik.http.services.chorus-website.loadbalancer.server.port=80"
|
|
- "traefik.http.services.chorus-website.loadbalancer.passhostheader=true"
|
|
# Redirect naked domain to www
|
|
- "traefik.http.middlewares.chorus-redirect.redirectregex.regex=^https://chorus.services/(.*)"
|
|
- "traefik.http.middlewares.chorus-redirect.redirectregex.replacement=https://www.chorus.services/$${1}"
|
|
- "traefik.http.routers.chorus-website.middlewares=chorus-redirect"
|
|
networks:
|
|
- tengig
|
|
```
|
|
|
|
## 8. Implementation Roadmap
|
|
|
|
### Phase 1: Foundation (Week 1-2)
|
|
- Set up Next.js 13+ project with App Router
|
|
- Configure Ant Design 5+ with custom CHORUS theme
|
|
- Implement basic folder structure and component hierarchy
|
|
- Set up Docker development environment
|
|
- Create core UI components (buttons, cards, typography)
|
|
|
|
### Phase 2: Core Pages (Week 3-4)
|
|
- Implement homepage with hero section and animations
|
|
- Build ecosystem overview page with module showcases
|
|
- Create scenarios page with interactive demonstrations
|
|
- Develop modules detail page with technical specifications
|
|
- Set up basic navigation and footer components
|
|
|
|
### Phase 3: Advanced Features (Week 5-6)
|
|
- Integrate Framer Motion for parallax and advanced animations
|
|
- Implement performance metrics displays with counters
|
|
- Add contact forms and investor relations section
|
|
- Optimize bundle size and implement code splitting
|
|
- Set up comprehensive SEO and structured data
|
|
|
|
### Phase 4: Production Ready (Week 7-8)
|
|
- Complete Docker production configuration
|
|
- Implement comprehensive accessibility features
|
|
- Set up analytics and performance monitoring
|
|
- Complete testing across devices and browsers
|
|
- Deploy to production environment with SSL/TLS
|
|
|
|
### Phase 5: Optimization (Week 9-10)
|
|
- Performance optimization and Core Web Vitals improvement
|
|
- A/B testing for conversion optimization
|
|
- Content management system integration (if needed)
|
|
- Advanced monitoring and error tracking
|
|
- Documentation and handover
|
|
|
|
## 9. Success Metrics
|
|
|
|
### Technical Metrics
|
|
- **Core Web Vitals**: LCP < 2.5s, FID < 100ms, CLS < 0.1
|
|
- **Lighthouse Score**: 95+ for Performance, Accessibility, Best Practices, SEO
|
|
- **Bundle Size**: < 500KB initial bundle, < 1MB total
|
|
- **Load Time**: < 3s on 3G, < 1s on broadband
|
|
|
|
### Business Metrics
|
|
- **Conversion Rate**: Track demo requests and investor inquiries
|
|
- **Engagement**: Time on site, pages per session, scroll depth
|
|
- **SEO Performance**: Organic traffic growth, keyword rankings
|
|
- **Accessibility Score**: WCAG 2.1 AA compliance
|
|
|
|
## 10. Maintenance and Evolution Strategy
|
|
|
|
### Content Management
|
|
- Implement headless CMS for non-technical team members to update content
|
|
- Create component library documentation for developers
|
|
- Set up automated testing for critical user journeys
|
|
- Establish design system governance for consistent updates
|
|
|
|
### Performance Monitoring
|
|
- Continuous monitoring of Core Web Vitals
|
|
- Regular bundle size analysis and optimization
|
|
- A/B testing infrastructure for conversion optimization
|
|
- User feedback collection and implementation system
|
|
|
|
This comprehensive architecture strategy provides a solid foundation for creating an enterprise-grade website that effectively showcases CHORUS Services' technical capabilities while maintaining excellent performance, accessibility, and user experience standards. |