Skip to content

Commit d971c48

Browse files
moredipclaude
andcommitted
feat: add Linux Foundation training course to support page
- Add LFS140 course with custom CourseCard component - Create reusable CourseCard component with responsive design - Remove unused training.ts dataset file - Update OpenFeature Fundamentals to use CourseCard - Implement mobile-responsive layout with proper image scaling - Support multiple paragraphs in course descriptions The CourseCard component features: - Horizontal layout on desktop (image left, content right) - Vertical stacking on mobile (image above content) - Full-width image scaling on mobile devices - Support for both single strings and arrays of paragraphs - Pure Tailwind CSS styling (no inline styles) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> Signed-off-by: Pete Hodgson <[email protected]>
1 parent 8568ee8 commit d971c48

File tree

4 files changed

+67
-33
lines changed

4 files changed

+67
-33
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import React from 'react';
2+
import Link from '@docusaurus/Link';
3+
4+
type CourseCardProps = {
5+
href: string;
6+
imageUrl: string;
7+
imageAlt: string;
8+
title: string;
9+
subtitle: string;
10+
description: string | string[];
11+
};
12+
13+
export const CourseCard: React.FC<CourseCardProps> = ({ href, imageUrl, imageAlt, title, subtitle, description }) => {
14+
const paragraphs = Array.isArray(description) ? description : [description];
15+
16+
return (
17+
<Link to={href} className="card padding--lg card-container relative">
18+
<div className="flex flex-col sm:flex-row sm:items-center gap-6">
19+
<img
20+
src={imageUrl}
21+
alt={imageAlt}
22+
className="w-full max-w-xs sm:w-32 h-48 sm:h-32 object-contain flex-shrink-0 self-center sm:self-auto"
23+
/>
24+
<div className="flex flex-col">
25+
<h1 className="text-xl font-bold mb-1">{title}</h1>
26+
<h2 className="text-base font-medium mb-2 text-gray-600 dark:text-gray-400">{subtitle}</h2>
27+
<div className="flex flex-col gap-2">
28+
{paragraphs.map((paragraph, index) => (
29+
<p key={index} className="text-sm text-gray-700 dark:text-gray-300">
30+
{paragraph}
31+
</p>
32+
))}
33+
</div>
34+
</div>
35+
</div>
36+
</Link>
37+
);
38+
};

src/components/custom/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from './OpenFeatureComponentCard';
22
export * from './OpenFeatureComponentTable';
33
export * from './OpenFeatureTechnologiesPage';
4-
export * from './CopyChecklist';
4+
export * from './CopyChecklist';
5+
export * from './CourseCard';

src/datasets/support/training.ts

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/pages/support-training.tsx

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import React from 'react';
2-
import { OpenFeatureComponentCard } from '../components/custom/OpenFeatureComponentCard';
2+
import { CourseCard } from '../components/custom/CourseCard';
33
import Layout from '@theme/Layout';
44
import { CommercialSupportList } from '../datasets/support/commercial-support';
5-
import { TrainingResources } from '../datasets/support/training';
65
import Link from '@docusaurus/Link';
76

87
export default function Support(): JSX.Element {
@@ -14,15 +13,31 @@ export default function Support(): JSX.Element {
1413
</div>
1514
<div className="mb-16">
1615
<h3>Courses</h3>
17-
<div className="flex flex-wrap gap-8 justify-center md:justify-start">
18-
{TrainingResources.map((resource) => (
19-
<OpenFeatureComponentCard
20-
title={resource.title}
21-
href={resource.href}
22-
description={resource.description}
23-
iconDefinition={resource.iconDefinition}
24-
/>
25-
))}
16+
<div className="flex flex-col gap-8">
17+
<CourseCard
18+
href="https://training.linuxfoundation.org/training/feature-flagging-with-openfeature-lfs140/"
19+
imageUrl={
20+
require('@site/static/img/blog/2025-11-18-kubecon-na-recap-and-new-cncf-training/lfs140.png').default
21+
}
22+
imageAlt="LFS140 Course"
23+
title="Feature Flagging with OpenFeature (LFS140)"
24+
subtitle="Linux Foundation Training Course"
25+
description={[
26+
"10 hours of self-paced content, including hands-on labs.",
27+
"Learn how to apply feature flagging in real-world projects using OpenFeature. Integrate with any flag management system, support canary and dark launches, run experiments, instrument flags with observability, and maintain clean, testable code."
28+
]}
29+
/>
30+
<CourseCard
31+
href="https://www.youtube.com/watch?v=heQ83k15ZE4&list=PLiQt8D1ofl8zs2zoiMNI8WRdNQ8GUy84I"
32+
imageUrl="https://i.ytimg.com/vi/heQ83k15ZE4/maxresdefault.jpg"
33+
imageAlt="OpenFeature Fundamentals"
34+
title="OpenFeature Fundamentals"
35+
subtitle="YouTube Video Series"
36+
description={[
37+
"A series of short videos introducing the core concepts of OpenFeature.",
38+
"Learn about the evaluation API, providers, context, hooks, and how to integrate OpenFeature into your code."
39+
]}
40+
/>
2641
</div>
2742
</div>
2843
<div className="mb-16">
@@ -34,7 +49,7 @@ export default function Support(): JSX.Element {
3449
title={name}
3550
className="card card-container padding--lg dark:bg-white w-[362px] h-44 relative"
3651
>
37-
<div style={{ height: 0, position: 'absolute', right: 10, top: 10 }}>{'🔗'}</div>
52+
<div className="h-0 absolute right-2.5 top-2.5">{'🔗'}</div>
3853
<div className="flex justify-center items-center h-full">
3954
<Svg className="w-full h-full" />
4055
</div>
@@ -61,4 +76,3 @@ export default function Support(): JSX.Element {
6176
</Layout>
6277
);
6378
}
64-

0 commit comments

Comments
 (0)