feat(brand-system): Implement comprehensive CHORUS brand system with typography and design tokens

This commit implements a complete brand system overhaul including:

TYPOGRAPHY SYSTEM:
- Add Exo font family (Thin, Light, Regular, ExtraLight) as primary brand font
- Implement SF Pro Display/Text hierarchy for UI components
- Create comprehensive Typography component with all brand variants
- Update all components to use new typography tokens

DESIGN TOKEN SYSTEM:
- Create complete design token system in theme/designTokens.ts
- Define Carbon Black (#1a1a1a), Walnut Brown (#8B4513), Brushed Aluminum (#A8A8A8) palette
- Implement CSS custom properties for consistent theming
- Update Ant Design theme integration

COMPONENT UPDATES:
- Enhance Hero section with Exo Thin typography and improved layout
- Update navigation with SF Pro font hierarchy
- Redesign Button component with new variants and accessibility
- Apply brand colors and typography across all showcase sections
- Improve Footer with consistent brand application

PERFORMANCE & ACCESSIBILITY:
- Self-host Exo fonts for optimal loading performance
- Implement proper font-display strategies
- Add comprehensive accessibility audit documentation
- Include responsive testing verification

DOCUMENTATION:
- Add brand system demo and implementation guides
- Include QA testing reports and accessibility audits
- Document design token usage and component patterns

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
anthonyrawlins
2025-08-02 22:12:42 +10:00
parent c33c46f8ac
commit 7774d7ec98
27 changed files with 5433 additions and 763 deletions

View File

@@ -97,7 +97,7 @@ export const Footer: React.FC = () => {
<span className="text-white font-bold text-xl">C</span>
</div>
<Title level={3} className="text-white mb-0">
CHORUS Services
<span className="exo-logotype">CHORUS</span> Services
</Title>
</div>

View File

@@ -4,8 +4,11 @@ import React, { useState, useEffect } from 'react';
import { Layout, Drawer } from 'antd';
import { motion, AnimatePresence } from 'framer-motion';
import { MenuIcon, XIcon, ArrowRightIcon } from 'lucide-react';
import Link from 'next/link';
import { usePathname } from 'next/navigation';
import { cn } from '@/utils/cn';
import { Button } from '@/components/ui/Button';
import { Typography } from '@/components/ui/Typography';
const { Header: AntHeader } = Layout;
@@ -17,18 +20,13 @@ interface NavigationItem {
const navigationItems: NavigationItem[] = [
{ key: 'home', label: 'Home', href: '/' },
{ key: 'services', label: 'Services', href: '/services' },
{ key: 'components', label: 'Components', href: '/components' },
{ key: 'technical-specs', label: 'Technical Specs', href: '/technical-specs' },
{ key: 'pricing', label: 'Pricing', href: '/pricing' },
{ key: 'docs', label: 'Documentation', href: '/docs' },
{ key: 'about', label: 'About', href: '/about' },
];
export const Header: React.FC = () => {
const [isScrolled, setIsScrolled] = useState(false);
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
const [activeKey, setActiveKey] = useState('home');
const pathname = usePathname();
// Handle scroll effect
useEffect(() => {
@@ -40,12 +38,15 @@ export const Header: React.FC = () => {
return () => window.removeEventListener('scroll', handleScroll);
}, []);
// Handle navigation click
const handleNavClick = (href: string, key: string) => {
setActiveKey(key);
// Handle mobile menu close
const handleMobileMenuClose = () => {
setIsMobileMenuOpen(false);
// In a real app, you'd use Next.js router here
// router.push(href);
};
// Get active key based on current pathname
const getActiveKey = () => {
const item = navigationItems.find(item => item.href === pathname);
return item?.key || 'home';
};
// Mobile menu animation variants
@@ -85,28 +86,38 @@ export const Header: React.FC = () => {
<div className="w-10 h-10 bg-gradient-chorus rounded-lg flex items-center justify-center">
<span className="text-white font-bold text-xl">C</span>
</div>
<span className="text-white text-xl font-bold">CHORUS</span>
<Typography.Display level={3} style={{ fontSize: '1.25rem', fontWeight: 100 }}>
CHORUS
</Typography.Display>
</motion.div>
{/* Desktop Navigation */}
<div className="hidden lg:flex items-center space-x-8">
{navigationItems.map((item, index) => (
<motion.button
<motion.div
key={item.key}
initial={{ opacity: 0, y: -10 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: index * 0.1 }}
onClick={() => handleNavClick(item.href, item.key)}
className={cn(
'px-4 py-2 rounded-lg font-medium transition-all duration-200',
'hover:bg-white/10 hover:text-chorus-blue',
activeKey === item.key
? 'text-chorus-blue'
: 'text-gray-300'
)}
>
{item.label}
</motion.button>
<Link
href={item.href}
className={cn(
'px-4 py-2 rounded-lg transition-all duration-200',
'hover:bg-white/10',
getActiveKey() === item.key
? 'text-white'
: 'text-gray-300 hover:text-white'
)}
>
<Typography.Interface
weight="medium"
color={getActiveKey() === item.key ? 'primary' : 'secondary'}
>
{item.label}
</Typography.Interface>
</Link>
</motion.div>
))}
</div>
@@ -178,7 +189,9 @@ export const Header: React.FC = () => {
<div className="w-8 h-8 bg-gradient-chorus rounded-lg flex items-center justify-center">
<span className="text-white font-bold text-sm">C</span>
</div>
<span className="text-white text-lg font-bold">CHORUS</span>
<Typography.Display level={4} style={{ fontSize: '1.125rem', fontWeight: 100 }}>
CHORUS
</Typography.Display>
</div>
<button
onClick={() => setIsMobileMenuOpen(false)}
@@ -192,21 +205,25 @@ export const Header: React.FC = () => {
<div className="p-6">
<nav className="space-y-2">
{navigationItems.map((item, index) => (
<motion.button
<motion.div
key={item.key}
custom={index}
variants={menuItemVariants}
onClick={() => handleNavClick(item.href, item.key)}
className={cn(
'w-full text-left p-4 rounded-lg font-medium transition-all duration-200',
'hover:bg-white/10 hover:text-chorus-blue',
activeKey === item.key
? 'text-chorus-blue bg-chorus-blue/10'
: 'text-gray-300'
)}
>
{item.label}
</motion.button>
<Link
href={item.href}
onClick={handleMobileMenuClose}
className={cn(
'block w-full text-left p-4 rounded-lg font-medium transition-all duration-200',
'hover:bg-white/10 hover:text-slate-400',
getActiveKey() === item.key
? 'text-slate-400 bg-slate-400/10'
: 'text-gray-300'
)}
>
{item.label}
</Link>
</motion.div>
))}
</nav>