Skip to content

Commit 57fcf00

Browse files
docs: add team section (#201)
Add team members to documentation
1 parent dd9f381 commit 57fcf00

File tree

9 files changed

+198
-0
lines changed

9 files changed

+198
-0
lines changed

docs/docs/team.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
title: Team
3+
description: Meet the NgRx Toolkit team
4+
---
5+
6+
# Meet the Team
7+
8+
The NgRx Toolkit is developed and maintained by a dedicated team of Angular enthusiasts who are passionate about the NgRx SignalStore and developer experience.
9+
10+
## Team Members (randomized order)
11+
12+
import Team from '@site/src/components/Team';
13+
14+
<Team />
15+
16+
## Contribute
17+
18+
We welcome contributions from the community! If you're interested in contributing to NgRx Toolkit, check out our [GitHub repository](https://github.com/angular-architects/ngrx-toolkit) and our [contribution guidelines](https://github.com/angular-architects/ngrx-toolkit/blob/main/CONTRIBUTING.md).

docs/docusaurus.config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ const config: Config = {
8888
label: 'API',
8989
position: 'left',
9090
},
91+
{
92+
type: 'docSidebar',
93+
sidebarId: 'teamSidebar',
94+
position: 'left',
95+
label: 'Team',
96+
},
9197
{
9298
href: 'https://github.com/angular-architects/ngrx-toolkit',
9399
label: 'GitHub',

docs/sidebars.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const sidebars: SidebarsConfig = {
3434
items: ['create-redux-state'],
3535
},
3636
],
37+
teamSidebar: ['team'],
3738

3839
// But you can create a sidebar manually
3940
/*

docs/src/components/Team/index.tsx

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import React from 'react';
2+
import styles from './styles.module.css';
3+
4+
interface TeamMember {
5+
name: string;
6+
image: string;
7+
description: string;
8+
}
9+
10+
const teamMembers: TeamMember[] = [
11+
{
12+
name: 'Manfred Steyer',
13+
image: '/img/team/manfred-steyer.jpg',
14+
description: 'Trainer, consultant, and programming architect with a focus on Angular, Google Developer Expert (GDE) who writes for O\'Reilly, the German Java Magazine, and windows.developer. Regularly speaks at conferences.'
15+
},
16+
{
17+
name: 'Rainer Hahnekamp',
18+
image: '/img/team/rainer-hahnekamp.jpg',
19+
description: 'Google Developer Expert (GDE) and a trusted collaborator on the NgRx team. Trainer and consultant in the Angular Architects expert network and runs ng-news, a weekly Angular newsletter.'
20+
},
21+
{
22+
name: 'Michael Small',
23+
image: '/img/team/michael-small.jpg',
24+
description: 'Angular nerd. Answers questions on both of the Angular subreddits. Dabbling in open source discussions and contributions. Looking to get more involved in the community than before.'
25+
},
26+
];
27+
28+
function shuffleArray<T>(array: T[]): T[] {
29+
const shuffled = [...array];
30+
for (let i = shuffled.length - 1; i > 0; i--) {
31+
const j = Math.floor(Math.random() * (i + 1));
32+
[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
33+
}
34+
return shuffled;
35+
}
36+
37+
export default function Team(): React.JSX.Element {
38+
const [shuffledTeam, setShuffledTeam] = React.useState<TeamMember[]>(() =>
39+
shuffleArray(teamMembers)
40+
);
41+
const [expandedMember, setExpandedMember] = React.useState<string | null>(null);
42+
43+
React.useEffect(() => {
44+
// Re-shuffle when component mounts
45+
setShuffledTeam(shuffleArray(teamMembers));
46+
}, []);
47+
48+
const handleMemberClick = (memberName: string) => {
49+
setExpandedMember(expandedMember === memberName ? null : memberName);
50+
};
51+
52+
return (
53+
<section className={styles.teamSection}>
54+
<div className={styles.teamGrid}>
55+
{shuffledTeam.map((member) => (
56+
<div
57+
key={member.name}
58+
className={`${styles.teamMember} ${expandedMember === member.name ? styles.expanded : ''}`}
59+
onClick={() => handleMemberClick(member.name)}
60+
>
61+
<div className={styles.memberAvatar}>
62+
<img
63+
src={member.image}
64+
alt={`${member.name} profile photo`}
65+
className={styles.profileImage}
66+
/>
67+
</div>
68+
<h3 className={styles.memberName}>{member.name}</h3>
69+
{expandedMember === member.name && (
70+
<p className={styles.memberDescription}>{member.description}</p>
71+
)}
72+
<div className={styles.expandIndicator}>
73+
{expandedMember === member.name ? '−' : '+'}
74+
</div>
75+
</div>
76+
))}
77+
</div>
78+
</section>
79+
);
80+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
.teamSection {
2+
padding: 2rem 0;
3+
}
4+
5+
.teamGrid {
6+
display: grid;
7+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
8+
gap: 2rem;
9+
max-width: 1200px;
10+
margin: 0 auto;
11+
padding: 0 1rem;
12+
}
13+
14+
.teamMember {
15+
text-align: center;
16+
padding: 1.5rem;
17+
border-radius: 8px;
18+
background: var(--ifm-card-background-color);
19+
box-shadow: var(--ifm-global-shadow-lw);
20+
transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
21+
cursor: pointer;
22+
position: relative;
23+
}
24+
25+
.teamMember:hover {
26+
transform: translateY(-5px);
27+
box-shadow: var(--ifm-global-shadow-md);
28+
}
29+
30+
.teamMember.expanded {
31+
box-shadow: var(--ifm-global-shadow-md);
32+
}
33+
34+
.memberAvatar {
35+
margin-bottom: 1rem;
36+
position: relative;
37+
}
38+
39+
.profileImage {
40+
width: 120px;
41+
height: 120px;
42+
border-radius: 60px;
43+
object-fit: cover;
44+
margin: 0 auto;
45+
display: block;
46+
}
47+
48+
.memberName {
49+
margin: 0;
50+
font-size: 1.2rem;
51+
color: var(--ifm-heading-color);
52+
}
53+
54+
.memberDescription {
55+
margin: 0.5rem 0 0;
56+
font-size: 0.9rem;
57+
color: var(--ifm-color-emphasis-600);
58+
line-height: 1.4;
59+
text-align: center;
60+
animation: fadeIn 0.3s ease-in-out;
61+
}
62+
63+
.expandIndicator {
64+
position: absolute;
65+
top: 1rem;
66+
right: 1rem;
67+
width: 24px;
68+
height: 24px;
69+
border-radius: 50%;
70+
background: var(--ifm-color-primary);
71+
color: white;
72+
display: flex;
73+
align-items: center;
74+
justify-content: center;
75+
font-weight: bold;
76+
font-size: 1.2rem;
77+
transition: background-color 0.2s ease-in-out;
78+
}
79+
80+
.teamMember:hover .expandIndicator {
81+
background: var(--ifm-color-primary-darker);
82+
}
83+
84+
@keyframes fadeIn {
85+
from {
86+
opacity: 0;
87+
transform: translateY(-10px);
88+
}
89+
to {
90+
opacity: 1;
91+
transform: translateY(0);
92+
}
93+
}
27.1 KB
Loading
27.8 KB
Loading
29.2 KB
Loading
27.5 KB
Loading

0 commit comments

Comments
 (0)