/** * Template Engine * Phase 5: Sites Renderer & Publishing * * Renders blocks using shared components from the component library. */ import React from 'react'; import type { Block } from '../types'; /** * Render a block using the template engine. * Imports shared components dynamically. */ export function renderTemplate(block: Block): React.ReactElement { const { type, data } = block; try { // Try to import shared component // This will be replaced with actual component imports once shared components are available switch (type) { case 'hero': return renderHeroBlock(data); case 'text': return renderTextBlock(data); case 'image': return renderImageBlock(data); case 'button': return renderButtonBlock(data); case 'section': return renderSectionBlock(data); case 'grid': return renderGridBlock(data); case 'card': return renderCardBlock(data); case 'list': return renderListBlock(data); case 'quote': return renderQuoteBlock(data); case 'video': return renderVideoBlock(data); case 'form': return renderFormBlock(data); case 'accordion': return renderAccordionBlock(data); default: return
Unknown block type: {type}
; } } catch (error) { console.error(`Error rendering block type ${type}:`, error); return
Error rendering block: {type}
; } } /** * Render hero block. */ function renderHeroBlock(data: Record): React.ReactElement { return (

{data.title || 'Hero Title'}

{data.subtitle &&

{data.subtitle}

} {data.buttonText && ( {data.buttonText} )}
); } /** * Render text block. */ function renderTextBlock(data: Record): React.ReactElement { return (
{data.content &&
}
); } /** * Render image block. */ function renderImageBlock(data: Record): React.ReactElement { return (
{data.src && ( {data.alt )} {data.caption &&

{data.caption}

}
); } /** * Render button block. */ function renderButtonBlock(data: Record): React.ReactElement { return ( ); } /** * Render section block. */ function renderSectionBlock(data: Record): React.ReactElement { return (
{data.title &&

{data.title}

} {data.content &&
}
); } /** * Render grid block. */ function renderGridBlock(data: Record): React.ReactElement { const columns = data.columns || 3; return (
{data.items?.map((item: any, index: number) => (
{item.content &&
}
))}
); } /** * Render card block. */ function renderCardBlock(data: Record): React.ReactElement { return (
{data.title &&

{data.title}

} {data.content &&
}
); } /** * Render list block. */ function renderListBlock(data: Record): React.ReactElement { const listType = data.ordered ? 'ol' : 'ul'; return React.createElement( listType, { className: 'block-list', style: { padding: '1rem 2rem' } }, data.items?.map((item: string, index: number) => (
  • {item}
  • )) ); } /** * Render quote block. */ function renderQuoteBlock(data: Record): React.ReactElement { return (
    {data.quote &&

    {data.quote}

    } {data.author && — {data.author}}
    ); } /** * Render video block. */ function renderVideoBlock(data: Record): React.ReactElement { return (
    {data.src && ( )} {data.embed &&
    }
    ); } /** * Render form block. */ function renderFormBlock(data: Record): React.ReactElement { return (
    {data.fields?.map((field: any, index: number) => (
    ))}
    ); } /** * Render accordion block. */ function renderAccordionBlock(data: Record): React.ReactElement { return (
    {data.items?.map((item: any, index: number) => (
    {item.title}
    {item.content}
    ))}
    ); }