diff options
| author | Dawid Rycerz <dawid@rycerz.xyz> | 2025-07-22 15:08:37 +0300 |
|---|---|---|
| committer | Dawid Rycerz <dawid@rycerz.xyz> | 2025-07-22 15:08:37 +0300 |
| commit | fcc2f4704e39b0e69b377cc138f75027721dac22 (patch) | |
| tree | 732fc94b354a26c08fba9cc9059f9c6c900182be /src/components/ui/ItemGrid.astro | |
Initial template
Diffstat (limited to 'src/components/ui/ItemGrid.astro')
| -rw-r--r-- | src/components/ui/ItemGrid.astro | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/components/ui/ItemGrid.astro b/src/components/ui/ItemGrid.astro new file mode 100644 index 0000000..79931b9 --- /dev/null +++ b/src/components/ui/ItemGrid.astro @@ -0,0 +1,65 @@ +--- +import type { ItemGrid as Props } from '~/types'; +import { twMerge } from 'tailwind-merge'; +import Button from './Button.astro'; +import { Icon } from 'astro-icon/components'; + +const { items = [], columns, defaultIcon = '', classes = {} } = Astro.props; + +const { + container: containerClass = '', + panel: panelClass = '', + title: titleClass = '', + description: descriptionClass = '', + icon: defaultIconClass = 'text-primary', + action: actionClass = '', +} = classes; +--- + +{ + items && items.length > 0 && ( + <div + class={twMerge( + `grid mx-auto gap-8 md:gap-y-12 ${ + columns === 4 + ? 'lg:grid-cols-4 md:grid-cols-3 sm:grid-cols-2' + : columns === 3 + ? 'lg:grid-cols-3 sm:grid-cols-2' + : columns === 2 + ? 'sm:grid-cols-2 ' + : '' + }`, + containerClass + )} + > + {items.map(({ title, description, icon, callToAction, classes: itemClasses = {} }) => ( + <div class="intersect-once motion-safe:md:opacity-0 motion-safe:md:intersect:animate-fade"> + <div class={twMerge('flex flex-row max-w-md', panelClass, itemClasses?.panel)}> + <div class="flex justify-center"> + {(icon || defaultIcon) && ( + <Icon + name={icon || defaultIcon} + class={twMerge('w-7 h-7 mr-2 rtl:mr-0 rtl:ml-2', defaultIconClass, itemClasses?.icon)} + /> + )} + </div> + <div class="mt-0.5"> + {title && <h3 class={twMerge('text-xl font-bold', titleClass, itemClasses?.title)}>{title}</h3>} + {description && ( + <p + class={twMerge(`${title ? 'mt-3' : ''} text-muted`, descriptionClass, itemClasses?.description)} + set:html={description} + /> + )} + {callToAction && ( + <div class={twMerge(`${title || description ? 'mt-3' : ''}`, actionClass, itemClasses?.actionClass)}> + <Button variant="link" {...callToAction} /> + </div> + )} + </div> + </div> + </div> + ))} + </div> + ) +} |
