_includes/pageelements/ListingSection.11ty.tsx (86 lines of code) (raw):
import { Resource } from "../../src/ResourceModels";
import ResourceCard from "../resourcecard/ResourceCard.11ty";
import { Fragment } from "jsx-async-runtime/jsx-dev-runtime";
export type ListingSectionProps = {
title: string;
subtitle?: string;
anchor?: string;
moreLink?: string;
resources: Resource[];
separator?: boolean;
isSection?: boolean;
includeCardFooter?: boolean;
sectionExtraClass?: string;
includeContentType?: boolean;
};
function ListingSection({
title,
subtitle,
anchor,
moreLink,
resources,
separator,
isSection = true,
includeCardFooter = true,
sectionExtraClass,
includeContentType = false,
}: ListingSectionProps) {
/* A reusable component for section-style paginated ResourceCard listings */
const columnClassName = isSection
? undefined
: "is-half-tablet is-one-third-desktop";
const sectionClassName = sectionExtraClass ? sectionExtraClass : "";
const listing = (
<div class="columns is-multiline">
{resources.map((resource) => {
return (
<ResourceCard
resource={resource}
columnClassName={columnClassName}
includeCardFooter={includeCardFooter}
includeContentType={includeContentType}
></ResourceCard>
);
})}
</div>
);
const container = (
<div class="container" id={anchor}>
<div class="columns is-vcentered is-mobile">
<div class="column is-10 is-10-tablet is-10-desktop">
<h2 class="mt-2 mb-4 is-size-2 is-size-3-mobile has-text-weight-bold">
{title}
</h2>
{subtitle && (
<p class="subtitle is-size-3 is-size-4-mobile has-text-grey mb-5">
{subtitle}
</p>
)}
</div>
{moreLink && (
<div class="column has-text-right">
<a class="button is-rounded is-outlined" href={moreLink}>
More...
</a>
</div>
)}
</div>
<div class="container">{listing}</div>
</div>
);
const result = isSection ? (
<section class={`section ${sectionClassName}`}>{container}</section>
) : (
container
);
return (
<Fragment>
{separator && (
<section class="container">
<hr />
</section>
)}
{result}
</Fragment>
);
}
export default ListingSection;