mirror of
https://github.com/vercel/commerce.git
synced 2025-05-13 13:17:51 +00:00
96 lines
3.3 KiB
TypeScript
96 lines
3.3 KiB
TypeScript
import clsx from 'clsx';
|
|
import { GridTileImage } from 'components/grid/tile';
|
|
import { getCollectionProducts } from 'lib/shopify';
|
|
import type { Product } from 'lib/shopify/types';
|
|
import Link from 'next/link';
|
|
|
|
export function ShirtGridItem({
|
|
item,
|
|
size,
|
|
priority
|
|
}: {
|
|
item: Product;
|
|
size: 'full' | 'half' | 'third' | 'quarter';
|
|
priority?: boolean;
|
|
}) {
|
|
return (
|
|
<div
|
|
className={clsx('cursor-pointer', {
|
|
'md:col-span-4 md:row-span-2': size === 'full',
|
|
'md:col-span-1 md:row-span-1': size != 'full'
|
|
})}
|
|
>
|
|
<Link className="relative block aspect-square h-full w-full" href={`/product/${item.handle}`}>
|
|
<GridTileImage
|
|
src={item.featuredImage.url}
|
|
fill
|
|
sizes={
|
|
size === 'full' ? '(min-width: 768px) 66vw, 100vw' : '(min-width: 768px) 33vw, 100vw'
|
|
}
|
|
priority={priority}
|
|
alt={item.title}
|
|
label={{
|
|
position: size === 'full' ? 'center' : 'bottom',
|
|
title: item.title as string,
|
|
amount: item.priceRange.maxVariantPrice.amount,
|
|
currencyCode: item.priceRange.maxVariantPrice.currencyCode
|
|
}}
|
|
sparkles={true}
|
|
available={item.availableForSale}
|
|
/>
|
|
<div className="absolute -bottom-12 z-10 h-fit w-full select-none opacity-100 lg:hidden ">
|
|
{item.title && (
|
|
<h3 className="line-clamp-2 text-center text-4xl tracking-tight">{item.title}</h3>
|
|
)}
|
|
</div>
|
|
</Link>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export async function HomepageShirts() {
|
|
// Collections that start with `hidden-*` are hidden from the search page.
|
|
const homepageItems = await getCollectionProducts({
|
|
collection: 'shirts'
|
|
});
|
|
|
|
if (!homepageItems[0] || homepageItems.length <= 0) return null;
|
|
|
|
const [firstProduct, secondProduct, thirdProduct, fourthProduct] = homepageItems;
|
|
|
|
return (
|
|
<>
|
|
<section className="mx-auto max-w-screen-2xl justify-center pb-12">
|
|
<div className="space-y-4 p-6 py-4 lg:p-12">
|
|
<h3 className="text-center text-lg lg:text-2xl">
|
|
Presenting the latest season of extra-large garments from Okay XL...
|
|
</h3>
|
|
<p className="text-center text-4xl lg:text-5xl">
|
|
“ Fake Anime Shows Your Friends Have Never Heard Of ”
|
|
</p>
|
|
</div>
|
|
</section>
|
|
<section className="mx-auto grid max-w-screen-2xl gap-4 gap-y-32 px-4 pb-24 md:grid-cols-3 md:grid-rows-2 md:gap-y-16">
|
|
{homepageItems.map((product) => (
|
|
<ShirtGridItem key={product.id} size="third" item={product} priority={true} />
|
|
))}
|
|
</section>
|
|
<section className="mx-auto max-w-screen-2xl justify-center p-6 py-4 lg:p-12">
|
|
<h3 className="text-3xl lg:text-left lg:text-5xl">
|
|
Okay XL only offers t-shirt sizes XL and up....
|
|
</h3>
|
|
<p className="max-w-3xl font-sans">
|
|
I made the decision to exclusively stock sizes XL & up because, I can.
|
|
</p>
|
|
<p className="max-w-3xl font-sans">
|
|
You won't find any t-shirts listed for sale on this site smaller than XL but, if you want
|
|
to request a smaller size{' '}
|
|
<Link className="cursor-pointer underline" href={'/small-sizes'}>
|
|
you can find more information here.
|
|
</Link>
|
|
</p>
|
|
</section>
|
|
</>
|
|
);
|
|
}
|