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/ItemGrid2.astro | |
Initial template
Diffstat (limited to 'src/components/ui/ItemGrid2.astro')
| -rw-r--r-- | src/components/ui/ItemGrid2.astro | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/components/ui/ItemGrid2.astro b/src/components/ui/ItemGrid2.astro new file mode 100644 index 0000000..81faadf --- /dev/null +++ b/src/components/ui/ItemGrid2.astro @@ -0,0 +1,59 @@ +--- +import type { ItemGrid as Props } from '~/types'; +import { Icon } from 'astro-icon/components'; +import { twMerge } from 'tailwind-merge'; +import Button from './Button.astro'; + +const { items = [], columns, defaultIcon = '', classes = {} } = Astro.props; + +const { + container: containerClass = '', + // container: containerClass = "sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3", + panel: panelClass = '', + title: titleClass = '', + description: descriptionClass = '', + icon: defaultIconClass = 'text-primary', +} = classes; +--- + +{ + items && items.length > 0 && ( + <div + class={twMerge( + `grid gap-8 gap-x-12 sm:gap-y-8 ${ + 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={twMerge( + 'relative flex flex-col intersect-once intersect-quarter intercept-no-queue motion-safe:md:opacity-0 motion-safe:md:intersect:animate-fade', + panelClass, + itemClasses?.panel + )} + > + {(icon || defaultIcon) && ( + <Icon name={icon || defaultIcon} class={twMerge('mb-2 w-10 h-10', defaultIconClass, itemClasses?.icon)} /> + )} + <div class={twMerge('text-xl font-bold', titleClass, itemClasses?.title)}>{title}</div> + {description && ( + <p class={twMerge('text-muted mt-2', descriptionClass, itemClasses?.description)} set:html={description} /> + )} + {callToAction && ( + <div class="mt-2"> + <Button {...callToAction} /> + </div> + )} + </div> + ))} + </div> + ) +} |
