Skip to content

@vibe-labs/design-components-avatars

Avatar component tokens, styles, and TypeScript types for the Vibe Design System.

Installation

bash
npm install @vibe-labs/design-components-avatars
css
@import "@vibe-labs/design-components-avatars";
ts
import { AvatarSizes, AvatarStatuses } from "@vibe-labs/design-components-avatars/types";
import type { AvatarSize, AvatarStatus, AvatarStyleProps } from "@vibe-labs/design-components-avatars/types";

Contents

Tokens

CSS custom properties defined in @layer vibe.tokens (file: avatar.css).

Sizes

TokenValue
--avatar-size-xs1.5rem
--avatar-size-sm2rem
--avatar-size-md2.5rem
--avatar-size-lg3.5rem
--avatar-size-xl5rem

Initials Font Sizes

--avatar-font-size-xs · --avatar-font-size-sm · --avatar-font-size-md · --avatar-font-size-lg · --avatar-font-size-xl — mapped to the typography scale.

Appearance

TokenDefaultDescription
--avatar-font-weight--font-semiboldInitials weight
--avatar-bg--surface-elevatedFallback background
--avatar-color--text-primaryFallback text color
--avatar-border-width2pxRing / group border width
--avatar-border-color--surface-baseRing / group border color
--avatar-group-overlap-0.5remNegative margin for stacked groups

Generated Styles

Component classes generated into @layer vibe.components using attribute-based selectors (file: avatar.g.css).

Elements

ClassDescription
.avatarCircular container supporting image or initials
.avatar-initialsUppercase text fallback displayed inside the circle
.avatar-statusPositioned indicator dot (bottom-right, 25% of size)
.avatar-groupHorizontal stack with overlap and border separation
.avatar-overflow"+N" count badge appended at the end of a group

Variants

Size (data-size): xs · sm · md (default) · lg · xl

Status (data-status on .avatar-status): online · offline · busy · away

StatusColor
onlinesuccess
offlineneutral
busydanger
awaywarning

Modifiers

data-ring on .avatar — adds outer ring via box-shadow.

TypeScript Types

ts
AvatarSizes    // ["xs", "sm", "md", "lg", "xl"]
AvatarStatuses // ["online", "offline", "busy", "away"]

type AvatarSize
type AvatarStatus

interface AvatarStyleProps { size?: AvatarSize; ring?: boolean }
interface AvatarStatusStyleProps { status?: AvatarStatus }
interface AvatarGroupStyleProps { label?: string }

Dist Structure

FileDescription
index.cssBarrel — imports tokens + generated styles
avatar.cssToken definitions
avatar.g.cssGenerated component styles
index.js / index.d.tsTypeScript types + runtime constants

Dependencies

Requires tokens from @vibe-labs/design (surfaces, typography, colors, borders, radii).

Build

bash
npm run build

Usage Guide

Import

css
@import "@vibe-labs/design-components-avatars";
ts
import type { AvatarStyleProps } from "@vibe-labs/design-components-avatars/types";

Variants

Size

Set data-size on .avatar: xs · sm · md (default) · lg · xl

Status

Set data-status on .avatar-status: online · offline · busy · away

Modifiers

  • data-ring on .avatar — adds an outer ring via box-shadow

Examples

Basic avatar with image

html
<!-- Image avatar at medium size (default) -->
<div class="avatar">
  <img src="/avatar.jpg" alt="Jane Doe" />
</div>

Avatar with initials fallback

html
<!-- Initials shown when no image is available -->
<div class="avatar" data-size="lg">
  <span class="avatar-initials">JD</span>
</div>

Avatar with status indicator

html
<!-- Online status dot shown bottom-right -->
<div class="avatar" data-size="md">
  <img src="/avatar.jpg" alt="Jane Doe" />
  <span class="avatar-status" data-status="online"></span>
</div>

<!-- All status variants -->
<div class="avatar"><span class="avatar-status" data-status="online"></span></div>
<div class="avatar"><span class="avatar-status" data-status="offline"></span></div>
<div class="avatar"><span class="avatar-status" data-status="busy"></span></div>
<div class="avatar"><span class="avatar-status" data-status="away"></span></div>

Avatar with ring

html
<!-- Ring variant — useful for selected/active states -->
<div class="avatar" data-ring>
  <img src="/avatar.jpg" alt="Selected user" />
</div>

Avatar group (stacked)

html
<!-- Stacked group of avatars with overlap -->
<div class="avatar-group" aria-label="Team members">
  <div class="avatar" data-size="sm"><img src="/a.jpg" alt="Alice" /></div>
  <div class="avatar" data-size="sm"><img src="/b.jpg" alt="Bob" /></div>
  <div class="avatar" data-size="sm"><img src="/c.jpg" alt="Carol" /></div>
  <!-- Overflow count badge -->
  <div class="avatar avatar-overflow" data-size="sm">+4</div>
</div>

With Vue

Use @vibe-labs/design-vue-avatars for <SbAvatar>, <SbAvatarStatus>, and <SbAvatarGroup> components that bind AvatarStyleProps to the underlying HTML attributes automatically.

Vibe