Team Member Card Components & Design System Documentation
Extracted TeamMemberCard and TeamMemberCard--Wide components with comprehensive design system documentation.
Changelog - 2025-12-18 (#2)
Dark Matter Site: Team Member Card Components & Design System Documentation
Overview
Extracted reusable team member card components from page variants and created a comprehensive design system index page documenting component usage, props, and styling.
Key deliverables:
TeamMemberCard: Compact card with avatar, name, role, bio, and social links for grid layouts
TeamMemberCard--Wide: Horizontal card with larger photo, pillar badges, and alternating layout for narrative-style pages
Design System Index: New
/design-systempage documenting both components with live examples and code samplesTeam Page Refactor: Promoted variant-3 to the main team page using the new component
Changes by Area
1. TeamMemberCard Component (src/components/team/TeamMemberCard.astro)
Created a compact, centered card component for team grids:
Props:
| Prop | Type | Required | Description |
name | string | Yes | Person's display name |
role | string | Yes | Job title or role |
bio | string | Yes | Short biography text |
image | string | Yes | Path to avatar image |
socialLinks | SocialLink[] | No | Array of social links |
class | string | No | Additional CSS classes |
Styling:
Avatar: 96px circle (
w-24 h-24) with colored borderName:
text-lgbold, centeredRole:
text-xsuppercase tracking, green accent colorBio:
text-smwith 60% opacitySocial links: Separated by border-top with margin/padding
Hover: Subtle lift (
translateY(-4px)) with glow
Theme Support: Dark, light, and vibrant modes via :global([data-mode="..."]) selectors.
2. TeamMemberCard--Wide Component (src/components/team/TeamMemberCard--Wide.astro)
Created a horizontal card for narrative team pages with alternating layouts:
Props:
| Prop | Type | Required | Description |
name | string | Yes | Person's display name |
role | string | Yes | Job title or role |
bio | string | Yes | Biography text |
image | string | Yes | Path to photo |
socialLinks | SocialLink[] | No | Array of social links |
pillar | PillarBadge | No | Badge with label and color |
reversed | boolean | No | Photo on right instead of left |
showDivider | boolean | No | Show top border separator |
Pillar Badge Colors:
purple— Leadership, Strategyblue— Analysiscyan— Operationsgreen— Founding, Scaleamber— Growth, Commercialization
Styling:
Photo: 192-224px square (
w-48 h-48 sm:w-56 sm:h-56) with rounded corners and accent shadowName:
text-2xl sm:text-3xlboldRole:
text-baseuppercase tracking, lilac accentLayout: Flexbox with
lg:flex-row, stacks on mobileAlignment: Text aligns left/right based on
reversedprop
3. Design System Index (src/pages/design-system/index.astro)
Created a comprehensive documentation page at /design-system:
TeamMemberCard Documentation:
Component description and file path
Props table with types and required/optional indicators
Theme support badges (Dark/Light/Vibrant)
Styling notes with Tailwind classes
Live examples using Mark Moline and Anthony Borquez
Usage code snippets
Layout integration tips
TeamMemberCard--Wide Documentation:
Full props table including
pillar,reversed,showDividerVisual demo of all 5 pillar badge colors
Styling notes for photo size, typography, and layout
Live examples using Skinner Layne and Michael Staton
Usage code showing alternating pattern with
index % 2
4. Team Page Refactor (src/pages/team/)
Reorganized team page files:
index.astro: Now uses the side-by-side layout withTeamMemberCardcomponent (previously variant-3)archive-1.astro: Original index page preserved for referencevariant-1.astro: Preserved (different layout with larger managing partner cards)variant-2.astro: Preserved (narrative alternating layout, source for Wide component)
Layout improvements to index.astro:
Responsive padding:
px-6 md:px-12 lg:px-16 xl:px-24Reduced max container:
max-w-6xl(frommax-w-7xl)Leadership column constraint:
max-w-smfor managing partner
Files Changed Summary
New
Components:
src/components/team/TeamMemberCard.astro— Compact centered card for team gridssrc/components/team/TeamMemberCard--Wide.astro— Horizontal card with pillar badges and alternating layout
Design System:
src/pages/design-system/index.astro— Component documentation with live examples
Modified
src/pages/team/index.astro— Refactored to use TeamMemberCard component (was variant-3)
Renamed
src/pages/team/index.astro→src/pages/team/archive-1.astro(original page preserved)src/pages/team/variant-3.astro→src/pages/team/index.astro(promoted to main)
Technical Details
Component Architecture
Both card components follow the same patterns:
Props interface with TypeScript types
SocialLink mapping to normalize input for SocialIcons component
Tailwind utility classes for layout and sizing
Scoped
<style>block with theme-aware selectors
---
interface Props {
name: string;
role: string;
// ...
}
const { name, role, ... } = Astro.props;
const mappedSocialLinks = socialLinks.map(link => ({
name: link.name,
href: link.href,
icon: link.icon || link.name.toLowerCase(),
}));
---
<article class:list={['team-card', className]}>
<!-- Markup with Tailwind classes -->
</article>
<style>
/* Dark mode (default) */
.team-card .card-inner { ... }
/* Light mode */
:global([data-mode="light"]) .team-card .card-inner { ... }
/* Vibrant mode */
:global([data-mode="vibrant"]) .team-card .card-inner { ... }
</style>Parent Container Sizing Strategy
Cards fill their container width, allowing parent elements to control sizing:
<!-- Leadership: constrained width -->
<div class="max-w-sm">
<TeamMemberCard ... />
</div>
<!-- Team grid: responsive columns -->
<div class="grid gap-6 sm:grid-cols-2">
{members.map(m => <TeamMemberCard {...m} />)}
</div>
<!-- Wide cards: alternating layout -->
{members.map((m, i) => (
<TeamMemberCardWide
reversed={i % 2 !== 0}
showDivider={i > 0}
...
/>
))}Design System Page Structure
The design system page follows a consistent documentation pattern for each component:
Component badge + title + file path
Description prose block
Props table (grid layout)
Theme support badges
Styling notes (bulleted list)
Live examples with labels
Usage code block
Layout integration notes
Notes / Follow-Ups
Existing PersonCard: There's an existing
PersonCard.astroin the team components directory that was not modified. Consider consolidating or documenting the difference between components.Design System Navigation: The design system now has multiple pages (
/design-system,/design-system/messages,/design-system/vibrant, etc.). Consider adding a navigation component.Team Data Bios: Sample bios in
team.jsonstill have placeholder text. Update with real content.Photo Resolution: Mark Moline's photo was noted as low resolution, which informed the
max-w-smconstraint on the leadership column.Component Library: These team card components could be candidates for extraction to
@knots/astropackage for use in other sites.