This component documentation is currently being developed. Some features may be incomplete.
Facepile
View in Pattern LabHTML Markup
<div class="hoo-facepile">
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/astronaut-mugshot-001.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/dog-mugshot-001.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/female-mugshot-001.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/male-mugshot-001.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/female-mugshot-002.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/male-mugshot-002.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/female-mugshot-003.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/male-mugshot-003.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/female-mugshot-004.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/male-mugshot-004.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/female-mugshot-005.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
<div class="hoo-avatar-pres-24">
<div class="hoo-avatar-24">
<img src="/htwoo-core/images/mug-shots/male-mugshot-005.jpg" alt="" class="hoo-avatar-img" height="24" width="24" loading="lazy">
</div>
<div class="hoo-presence is-online" title="Online">
</div>
</div>
</div>
Facepile
The facepile component is an organism-level layout that displays multiple user avatars with presence indicators in a horizontal arrangement. It’s commonly used to show team members, collaborators, or participants in a compact, visually appealing format.
Overview
Facepile provides a space-efficient way to display multiple users by showing their avatars in a row with flexible wrapping. It leverages the avatar-with-presence molecular component to maintain consistency with other persona representations throughout the application while supporting various layout contexts and user interaction patterns.
Features
Layout and Display
- Horizontal Arrangement: Displays avatars in left-to-right flow with intelligent wrapping
- Flexible Spacing: Maintains consistent 1.118rem margins between avatars
- Responsive Design: Adapts to container width with automatic line wrapping
- Smooth Transitions: 1-second ease-in-out transitions for dynamic updates
User Representation
- Avatar Integration: Each user represented by avatar with optional image or initials
- Presence Status: Real-time presence indicators (online, away, busy, offline)
- User Information: Support for display names, roles, and additional metadata
- Interactive Elements: Optional click handlers for user selection or profile viewing
Size Variants
The component supports multiple avatar sizes for different contexts:
- 24px: Ultra-compact for dense layouts and minimal space
- 32px: Compact for navigation elements and sidebar displays
- 40px: Standard size for most application contexts
- 48px: Prominent display for featured content areas
- 64px: Large display for hero sections and main content
Structure
The facepile consists of:
- Container:
.hoo-facepile- Main flexbox container - Avatar-Presence Items: Individual avatar-with-presence components
- Optional Overflow: Overflow indicator for large user sets
Data Structure
Standard Data Format
{
"items": [
{
"avatar": {
"mugshot": "../../images/mug-shots/user1.jpg",
"status": "online",
"size": 32,
"initials": "JD",
"displayName": "John Doe",
"title": "Software Engineer"
},
"size": 32
},
{
"avatar": {
"mugshot": "../../images/mug-shots/user2.jpg",
"status": "away",
"size": 32,
"initials": "JS",
"displayName": "Jane Smith",
"title": "Product Manager"
},
"size": 32
}
]
}
With Metadata
{
"items": [
{
"avatar": {
"mugshot": "user1.jpg",
"status": "online",
"size": 40,
"initials": "AB",
"displayName": "Alice Brown",
"title": "Team Lead",
"department": "Engineering",
"email": "alice.brown@company.com"
},
"size": 40,
"role": "owner",
"lastActive": "2024-01-15T10:30:00Z"
}
]
}
CSS Classes
Container Classes
.hoo-facepile: Main flexbox container with wrapping and spacing
Avatar-Presence Classes
.hoo-avatar-pres-{size}: Individual avatar-presence containers.hoo-avatar-{size}: Avatar image containers.hoo-presence-{size}: Presence indicator elements
Size-Specific Classes
.hoo-avatar-pres-24: 24px avatar-presence container.hoo-avatar-pres-32: 32px avatar-presence container.hoo-avatar-pres-40: 40px avatar-presence container.hoo-avatar-pres-48: 48px avatar-presence container.hoo-avatar-pres-64: 64px avatar-presence container
Styling
Layout Properties
Visual Design
- Background: Transparent, relies on individual avatar styling
- Spacing: 1.118rem margins between avatars (accounts for presence indicator positioning)
- Alignment: Flex-start alignment for consistent left-to-right flow
- Transitions: Smooth 1-second transitions for dynamic content changes
Responsive Behavior
- Flexible Width: Adapts to container width constraints
- Intelligent Wrapping: Automatically wraps to new lines when needed
- Consistent Spacing: Maintains uniform gaps regardless of line breaks
- Smooth Updates: Animated transitions for adding/removing users
Use Cases
Team and Collaboration
- Project Teams: Display team members in project management interfaces
- Document Collaboration: Show active editors and reviewers
- Meeting Participants: Display attendees in video conference interfaces
- Workspace Members: Show team members in shared workspaces
Social and Community
- Group Membership: Display members of groups or communities
- Event Attendance: Show event attendees or RSVP lists
- Social Connections: Display mutual friends or followers
- Discussion Participants: Show contributors to conversations
Content and Media
- Content Contributors: Display authors, editors, and reviewers
- Media Collaborators: Show people with access to shared media
- Version History: Display contributors to document versions
- Approval Workflows: Show approvers and reviewers in workflows
System and Administration
- User Management: Display system users and administrators
- Permission Groups: Show members of permission or security groups
- Department Views: Display organizational structure and reporting
- Activity Logs: Show users involved in recent activities
Accessibility
Screen Reader Support
- Individual Focus: Each avatar is individually focusable and navigable
- Descriptive Labels: Clear names and status descriptions for each user
- Group Context: Container provides context for the collection of users
- Live Updates: Presence changes announced appropriately via ARIA live regions
Keyboard Navigation
- Tab Order: Logical tab sequence through interactive avatars
- Focus Management: Clear focus indicators and consistent focus states
- Interactive Elements: Keyboard access to clickable avatars and actions
- Skip Navigation: Ability to skip large facepiles for efficient navigation
Visual Accessibility
- High Contrast: Strong color contrast for all text and status indicators
- Color Independence: Status communicated through multiple visual methods
- Size Flexibility: Scales appropriately with user font size preferences
- Focus Indicators: Clear visual focus states for keyboard users
Performance Considerations
Image Loading
- Lazy Loading: Implement lazy loading for avatar images in large collections
- Progressive Loading: Load visible avatars first, then off-screen ones
- Image Optimization: Use appropriate formats (WebP, AVIF) and sizes
- Fallback Handling: Graceful fallback to initials when images fail to load
Large Collections
- Virtualization: Use virtual scrolling for very large user sets (100+ users)
- Pagination: Implement pagination or “load more” for extensive lists
- Overflow Indicators: Show limited avatars with overflow count for space efficiency
- Search and Filter: Provide search capabilities for large user collections
Dynamic Updates
- Efficient Re-renders: Minimize DOM manipulation for presence updates
- Batch Updates: Group multiple changes to reduce layout thrashing
- Memory Management: Properly clean up event listeners and image references
- Caching: Implement effective caching for user data and avatar images
Integration with Overflow
For large user collections, combine with overflow indicators:
<div class="user-collection">
<div class="hoo-facepile">
{{#each visibleUsers}}
{{> molecules-avatar-presence }}
{{/each}}
</div>
{{#if hasOverflow}}
{{> molecules-persona-overflow number="+{{overflowCount}}" }}
{{/if}}
</div>
JavaScript Overflow Management
React Integration
For React applications, use the @n8d/htwoo-react package which provides facepile components with the same design system styling. Facepile components are available in Storybook for interactive examples and documentation.
Integration Examples
SharePoint Framework (SPFx)
Best Practices
Design Guidelines
- Consistent Sizing: Use the same avatar size throughout a single facepile
- Logical Ordering: Order users by relevance, status, activity, or alphabetically
- Visual Hierarchy: Use size and positioning to indicate importance or roles
- Overflow Management: Implement clear overflow indicators for large user sets
User Experience
- Performance: Optimize for quick loading and smooth interactions
- Responsiveness: Ensure facepiles work well across all device sizes
- Context: Provide clear context for who the users are and their relationship
- Interactivity: Consider tooltips or click actions for additional user information