_includes/pageelements/GettingStartedSection.11ty.tsx (146 lines of code) (raw):
import { Resource } from "../../src/ResourceModels";
import ResourceCard from "../resourcecard/ResourceCard.11ty";
import { Fragment } from "jsx-async-runtime/jsx-dev-runtime";
import VideoPlayer from "../video/VideoPlayer.11ty";
export type GettingStartedSectionProps = {
title: string;
subtitle?: string;
anchor?: string;
description: string;
whyVideoUrl: string;
howToResources: Resource[];
howToResourcesSubtitle?: string;
howToResourcesSubtitleTip?: string;
learnMoreResources?: Resource[];
learnMoreResourcesSubtitle?: string;
learnMoreResourcesSubtitleTip?: string;
learnMoreLink?: string;
separator?: boolean;
isSection?: boolean;
includeCardFooter?: boolean;
sectionExtraClass?: string;
includeContentType?: boolean;
};
function GettingStartedSection({
title,
subtitle,
anchor,
description,
whyVideoUrl,
howToResources,
howToResourcesSubtitle,
howToResourcesSubtitleTip,
learnMoreResources,
learnMoreResourcesSubtitle,
learnMoreResourcesSubtitleTip,
learnMoreLink,
separator,
isSection = true,
includeCardFooter = true,
sectionExtraClass,
includeContentType = false,
}: GettingStartedSectionProps) {
/* 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 sectionHowToResources = (
<div class="columns is-multiline">
{howToResources.map((resource) => {
return (
<ResourceCard
compactMode={true}
resource={resource}
columnClassName={
howToResources.length == 5
? "is-one-fifth-desktop"
: columnClassName
}
includeCardFooter={includeCardFooter}
includeContentType={includeContentType}
hideTitle={true}
></ResourceCard>
);
})}
</div>
);
const sectionLearnMoreResources = (
<div class="columns is-multiline">
{learnMoreResources &&
learnMoreResources.slice(0, 4).map((resource) => {
return (
<ResourceCard
compactMode={true}
resource={resource}
columnClassName={columnClassName}
includeCardFooter={includeCardFooter}
includeContentType={includeContentType}
></ResourceCard>
);
})}
</div>
);
const whyVideo = <VideoPlayer source={whyVideoUrl} />;
const container = (
<div class="container" id={anchor}>
<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 class="columns">
<div class="column is-two-thirds content">{description}</div>
<div class="column is-one-third">{whyVideo}</div>
</div>
<div class="container">
{howToResourcesSubtitle && (
<div
title={howToResourcesSubtitleTip}
class="is-size-3"
style="margin-bottom: 1em"
>
{howToResourcesSubtitle}
</div>
)}
{sectionHowToResources}
</div>
{learnMoreResources && (
<div class="container">
<div class="columns is-vcentered is-mobile">
<div class="column is-10 is-10-tablet is-10-desktop">
{learnMoreResourcesSubtitle && (
<div title={learnMoreResourcesSubtitleTip} class="is-size-3">
{learnMoreResourcesSubtitle}
</div>
)}
</div>
{learnMoreLink && learnMoreResources?.length > 4 && (
<div class="column is-2 has-text-right">
<a class="button is-rounded is-outlined" href={learnMoreLink}>
More...
</a>
</div>
)}
</div>
{sectionLearnMoreResources}
</div>
)}
</div>
);
const result = isSection ? (
<section class={`section ${sectionClassName}`}>{container}</section>
) : (
container
);
return (
<Fragment>
{separator && (
<section class="container">
<hr />
</section>
)}
{result}
</Fragment>
);
}
export default GettingStartedSection;