diff --git a/src/blocks/KanbanColor/Component.tsx b/src/blocks/KanbanColor/Component.tsx index 24de526..a0675c7 100644 --- a/src/blocks/KanbanColor/Component.tsx +++ b/src/blocks/KanbanColor/Component.tsx @@ -31,9 +31,6 @@ export function KanbanColorBlock({ columns }: Props) {
{col.title} - - {col.cards?.length ?? 0} -
{Array.isArray(col.cards) && col.cards.map((card, j) => ( diff --git a/src/blocks/RenderBlocks.tsx b/src/blocks/RenderBlocks.tsx index 1618440..7d2d3e2 100644 --- a/src/blocks/RenderBlocks.tsx +++ b/src/blocks/RenderBlocks.tsx @@ -11,6 +11,7 @@ import { SkillsBlock } from '@/blocks/Skills/Component' import { SkillsMarqueeBlock } from '@/blocks/SkillsMarquee/Component' import { KanbanColorBlock } from '@/blocks/KanbanColor/Component' import { KanbanHoriBlock } from '@/blocks/KanbanHori/Component' +import { ShowcaseBlock } from '@/blocks/Showcase/Component' const blockComponents = { archive: ArchiveBlock, @@ -22,6 +23,7 @@ const blockComponents = { skillsMarquee: SkillsMarqueeBlock, kanbanColor: KanbanColorBlock, kanbanHori: KanbanHoriBlock, + showcase: ShowcaseBlock, } export const RenderBlocks: React.FC<{ diff --git a/src/blocks/Showcase/Component.tsx b/src/blocks/Showcase/Component.tsx new file mode 100644 index 0000000..18ba07f --- /dev/null +++ b/src/blocks/Showcase/Component.tsx @@ -0,0 +1,136 @@ +import React from 'react' +import Image from 'next/image' + +type MediaObject = { + url?: string + alt?: string + width?: number + height?: number +} + +type ShowcaseItem = { + image?: MediaObject | null + imageUrl?: string + title: string + description?: string + tags?: { tag: string }[] + links?: { label: string; url: string; newTab?: boolean }[] +} + +type ShowcaseBlockProps = { + heading?: string + subheading?: string + items?: ShowcaseItem[] +} + +const COMING_SOON_BG = 'bg-muted/50' + +export function ShowcaseBlock({ heading, subheading, items }: ShowcaseBlockProps) { + if (!Array.isArray(items) || items.length === 0) return null + + return ( +
+ {(heading || subheading) && ( +
+ {heading && ( +

+ {heading} +

+ )} + {subheading && ( +

{subheading}

+ )} +
+ )} + +
+ {items.map((item, i) => { + const imageUrl = + item.image && typeof item.image === 'object' ? item.image.url : null + const imageAlt = + item.image && typeof item.image === 'object' ? item.image.alt : item.title + + const imageContent = imageUrl ? ( + {imageAlt + ) : ( +
+