# Shared Component Library This directory contains reusable UI components, layouts, and templates that can be shared across multiple frontend applications in the IGNY8 platform. ## Overview The shared component library provides: - **Blocks**: Reusable content blocks (hero sections, feature grids, stats panels) - **Layouts**: Page layout wrappers (default, minimal) - **Templates**: Complete page templates (marketing, landing pages) These components are designed to be framework-agnostic where possible, but currently implemented in React/TypeScript. ## Directory Structure ``` shared/ ├── blocks/ # Content blocks (12 total) │ ├── HeroBlock.tsx │ ├── FeatureGridBlock.tsx │ ├── StatsPanel.tsx │ ├── ServicesBlock.tsx │ ├── ProductsBlock.tsx │ ├── TestimonialsBlock.tsx │ ├── ContactFormBlock.tsx │ ├── CTABlock.tsx │ ├── ImageGalleryBlock.tsx │ ├── VideoBlock.tsx │ ├── TextBlock.tsx │ ├── QuoteBlock.tsx │ ├── blocks.css │ └── index.ts ├── layouts/ # Page layouts (7 total) │ ├── DefaultLayout.tsx │ ├── MinimalLayout.tsx │ ├── MagazineLayout.tsx │ ├── EcommerceLayout.tsx │ ├── PortfolioLayout.tsx │ ├── BlogLayout.tsx │ ├── CorporateLayout.tsx │ ├── layouts.css │ └── index.ts ├── templates/ # Full page templates (6 total) │ ├── MarketingTemplate.tsx │ ├── LandingTemplate.tsx │ ├── BlogTemplate.tsx │ ├── BusinessTemplate.tsx │ ├── PortfolioTemplate.tsx │ ├── EcommerceTemplate.tsx │ └── index.ts ├── index.ts # Barrel exports └── README.md # This file ``` ## Usage ### In Site Builder (`site-builder/`) The Site Builder application imports shared components via the `@shared` alias configured in `vite.config.ts`: ```typescript import { HeroBlock, MarketingTemplate } from '@shared'; ``` ### In Main Frontend (`frontend/`) Import directly from the shared directory: ```typescript import { HeroBlock } from '@/components/shared/blocks'; import { DefaultLayout } from '@/components/shared/layouts'; ``` ## Components ### Blocks #### `HeroBlock` Hero section component for landing pages and marketing sites. **Props:** - `heading: string` - Main headline - `subheading?: string` - Supporting text - `ctaText?: string` - Call-to-action button text - `ctaLink?: string` - Call-to-action link URL - `imageUrl?: string` - Hero image URL - `variant?: 'default' | 'centered' | 'split'` - Layout variant **Example:** ```tsx ``` #### `FeatureGridBlock` Grid layout for displaying features or benefits. **Props:** - `title?: string` - Section title - `features: Array<{ title: string; description: string; icon?: ReactNode }>` - Feature items - `columns?: 2 | 3 | 4` - Number of columns **Example:** ```tsx ``` #### `StatsPanel` Statistics display component. **Props:** - `stats: Array<{ label: string; value: string | number }>` - Statistics to display - `variant?: 'default' | 'compact'` - Display variant **Example:** ```tsx ``` #### `ServicesBlock` Display services or offerings in a grid layout. **Props:** - `title?: string` - Section title - `subtitle?: string` - Section subtitle - `services: Array<{ title: string; description: string; icon?: ReactNode; imageUrl?: string }>` - Service items - `columns?: 2 | 3 | 4` - Number of columns - `variant?: 'default' | 'card' | 'minimal'` - Display variant #### `ProductsBlock` Display products in a grid or list layout. **Props:** - `title?: string` - Section title - `subtitle?: string` - Section subtitle - `products: Array<{ name: string; description?: string; price?: string; imageUrl?: string; ctaLabel?: string }>` - Product items - `columns?: 2 | 3 | 4` - Number of columns - `variant?: 'grid' | 'list' | 'carousel'` - Display variant #### `TestimonialsBlock` Display customer testimonials with ratings and author info. **Props:** - `title?: string` - Section title - `subtitle?: string` - Section subtitle - `testimonials: Array<{ quote: string; author: string; role?: string; company?: string; avatarUrl?: string; rating?: number }>` - Testimonial items - `columns?: 1 | 2 | 3` - Number of columns - `variant?: 'default' | 'card' | 'minimal'` - Display variant #### `ContactFormBlock` Contact form with customizable fields. **Props:** - `title?: string` - Form title - `subtitle?: string` - Form subtitle - `fields?: Array<{ name: string; label: string; type: 'text' | 'email' | 'tel' | 'textarea'; required?: boolean; placeholder?: string }>` - Form fields - `submitLabel?: string` - Submit button label - `onSubmit?: (data: Record) => void` - Submit handler #### `CTABlock` Call-to-action section with primary and secondary actions. **Props:** - `title: string` - CTA title - `subtitle?: string` - CTA subtitle - `primaryCtaLabel?: string` - Primary button label - `primaryCtaLink?: string` - Primary button link - `onPrimaryCtaClick?: () => void` - Primary button click handler - `secondaryCtaLabel?: string` - Secondary button label - `secondaryCtaLink?: string` - Secondary button link - `onSecondaryCtaClick?: () => void` - Secondary button click handler - `backgroundImage?: string` - Background image URL - `variant?: 'default' | 'centered' | 'split'` - Layout variant #### `ImageGalleryBlock` Image gallery with grid, masonry, or carousel layout. **Props:** - `title?: string` - Gallery title - `subtitle?: string` - Gallery subtitle - `images: Array<{ url: string; alt?: string; caption?: string; thumbnailUrl?: string }>` - Image items - `columns?: 2 | 3 | 4` - Number of columns - `variant?: 'grid' | 'masonry' | 'carousel'` - Display variant - `lightbox?: boolean` - Enable lightbox on click #### `VideoBlock` Video player component supporting both video URLs and embed codes. **Props:** - `title?: string` - Video title - `subtitle?: string` - Video subtitle - `videoUrl?: string` - Video file URL - `embedCode?: string` - HTML embed code (e.g., YouTube iframe) - `thumbnailUrl?: string` - Video thumbnail/poster - `autoplay?: boolean` - Autoplay video - `controls?: boolean` - Show video controls - `loop?: boolean` - Loop video - `muted?: boolean` - Mute video - `variant?: 'default' | 'fullwidth' | 'centered'` - Layout variant #### `TextBlock` Simple text content block with customizable alignment and width. **Props:** - `title?: string` - Block title - `content: string | ReactNode` - Text content (HTML string or React nodes) - `align?: 'left' | 'center' | 'right' | 'justify'` - Text alignment - `variant?: 'default' | 'narrow' | 'wide' | 'fullwidth'` - Width variant #### `QuoteBlock` Quote/testimonial block with author information. **Props:** - `quote: string` - Quote text - `author?: string` - Author name - `role?: string` - Author role - `company?: string` - Author company - `avatarUrl?: string` - Author avatar image - `variant?: 'default' | 'large' | 'minimal' | 'card'` - Display variant - `align?: 'left' | 'center' | 'right'` - Text alignment ### Layouts #### `DefaultLayout` Standard page layout with header, main content area, and footer. **Props:** - `children: ReactNode` - Page content - `header?: ReactNode` - Custom header component - `footer?: ReactNode` - Custom footer component - `sidebar?: ReactNode` - Optional sidebar **Example:** ```tsx ``` #### `MinimalLayout` Minimal layout for focused content pages. **Props:** - `children: ReactNode` - Page content - `background?: 'light' | 'dark'` - Background color **Example:** ```tsx ``` #### `MagazineLayout` Magazine-style layout with featured section and sidebar. **Props:** - `header?: ReactNode` - Page header - `featured?: ReactNode` - Featured content section - `sidebar?: ReactNode` - Sidebar content - `mainContent: ReactNode` - Main content area - `footer?: ReactNode` - Page footer #### `EcommerceLayout` E-commerce layout with navigation and product sidebar. **Props:** - `header?: ReactNode` - Page header - `navigation?: ReactNode` - Navigation menu - `sidebar?: ReactNode` - Sidebar (filters, categories) - `mainContent: ReactNode` - Main content (products) - `footer?: ReactNode` - Page footer #### `PortfolioLayout` Portfolio layout optimized for showcasing work. **Props:** - `header?: ReactNode` - Page header - `mainContent: ReactNode` - Main content (gallery, projects) - `footer?: ReactNode` - Page footer - `fullWidth?: boolean` - Full-width layout option #### `BlogLayout` Blog layout with optional sidebar (left or right). **Props:** - `header?: ReactNode` - Page header - `sidebar?: ReactNode` - Sidebar content - `mainContent: ReactNode` - Main content (blog posts) - `footer?: ReactNode` - Page footer - `sidebarPosition?: 'left' | 'right'` - Sidebar position #### `CorporateLayout` Corporate/business layout with navigation and structured sections. **Props:** - `header?: ReactNode` - Page header - `navigation?: ReactNode` - Navigation menu - `mainContent: ReactNode` - Main content - `footer?: ReactNode` - Page footer - `sidebar?: ReactNode` - Optional sidebar ### Templates #### `MarketingTemplate` Complete marketing page template with hero, features, and CTA sections. **Props:** - `hero: HeroBlockProps` - Hero section configuration - `features?: FeatureGridBlockProps` - Features section - `stats?: StatsPanelProps` - Statistics section - `cta?: { text: string; link: string }` - Call-to-action **Example:** ```tsx ``` #### `LandingTemplate` Landing page template optimized for conversions. **Props:** - Similar to `MarketingTemplate` with additional conversion-focused sections #### `BlogTemplate` Blog page template with posts and sidebar. **Props:** - `header?: ReactNode` - Page header - `sidebar?: ReactNode` - Sidebar content - `posts: ReactNode` - Blog posts content - `footer?: ReactNode` - Page footer - `sidebarPosition?: 'left' | 'right'` - Sidebar position #### `BusinessTemplate` Business/corporate page template. **Props:** - `header?: ReactNode` - Page header - `navigation?: ReactNode` - Navigation menu - `hero?: ReactNode` - Hero section - `features?: ReactNode` - Features section - `services?: ReactNode` - Services section - `testimonials?: ReactNode` - Testimonials section - `cta?: ReactNode` - Call-to-action section - `footer?: ReactNode` - Page footer #### `PortfolioTemplate` Portfolio showcase template. **Props:** - `header?: ReactNode` - Page header - `gallery?: ReactNode` - Portfolio gallery - `about?: ReactNode` - About section - `contact?: ReactNode` - Contact section - `footer?: ReactNode` - Page footer - `fullWidth?: boolean` - Full-width layout #### `EcommerceTemplate` E-commerce store template. **Props:** - `header?: ReactNode` - Page header - `navigation?: ReactNode` - Navigation menu - `sidebar?: ReactNode` - Sidebar (filters) - `products?: ReactNode` - Products grid - `featured?: ReactNode` - Featured products - `footer?: ReactNode` - Page footer ## Styling Components use CSS modules and shared CSS files: - `blocks/blocks.css` - Block component styles - `layouts/layouts.css` - Layout component styles Styles are scoped to prevent conflicts. When using in different applications, ensure CSS is imported: ```typescript import '@shared/blocks/blocks.css'; import '@shared/layouts/layouts.css'; ``` ## TypeScript Types All components are fully typed. Import types from the component files: ```typescript import type { HeroBlockProps } from '@shared/blocks/HeroBlock'; ``` ## Best Practices 1. **Composition over Configuration**: Prefer composing blocks into templates rather than creating monolithic components. 2. **Props Validation**: All components validate required props. Use TypeScript for compile-time safety. 3. **Accessibility**: Components follow WCAG guidelines. Include ARIA labels where appropriate. 4. **Responsive Design**: All components are mobile-first and responsive. 5. **Performance**: Use React.memo for expensive components, lazy loading for templates. ## Contributing When adding new shared components: 1. Create the component in the appropriate directory (`blocks/`, `layouts/`, or `templates/`) 2. Export from the directory's `index.ts` 3. Add to the main `shared/index.ts` barrel export 4. Document props and usage in this README 5. Add TypeScript types 6. Include CSS in the appropriate stylesheet 7. Write tests (if applicable) ## Testing Shared components should be tested in the consuming applications. The Site Builder includes tests for components used in the preview canvas. ## Future Enhancements - [ ] Storybook integration for component documentation - [ ] Design tokens/theming system - [ ] Animation utilities - [ ] Form components library - [ ] Icon library integration