ArcaneJaspr Codex
Documentation
ArcaneAvatar
User avatar with image or initials fallback
Live Demo
JD
AB

ArcaneAvatar#

A circular avatar component for displaying user profile images with fallback to initials.

Basic Usage#

ArcaneAvatar(
  imageUrl: '/user.jpg',
)

Properties#

PropertyTypeDefaultDescription
imageUrl String? null Image URL
name String? null Name for initials fallback
size AvatarSize medium Avatar size
borderRadius AvatarRadius circle Shape
status AvatarStatus? null Online status indicator
styles ArcaneStyleData? null Additional styling

Sizes#

// Extra small
ArcaneAvatar(imageUrl: url, size: AvatarSize.xs)

// Small
ArcaneAvatar(imageUrl: url, size: AvatarSize.small)

// Medium (default)
ArcaneAvatar(imageUrl: url, size: AvatarSize.medium)

// Large
ArcaneAvatar(imageUrl: url, size: AvatarSize.large)

// Extra large
ArcaneAvatar(imageUrl: url, size: AvatarSize.xlarge)

// 2XL
ArcaneAvatar(imageUrl: url, size: AvatarSize.xl2)

With Initials Fallback#

// Will display "JD" if image fails or is not provided
ArcaneAvatar(
  name: 'John Doe',
  size: AvatarSize.medium,
)

Status Indicator#

// Online
ArcaneAvatar(
  imageUrl: '/user.jpg',
  status: AvatarStatus.online,
)

// Away
ArcaneAvatar(
  imageUrl: '/user.jpg',
  status: AvatarStatus.away,
)

// Busy
ArcaneAvatar(
  imageUrl: '/user.jpg',
  status: AvatarStatus.busy,
)

// Offline
ArcaneAvatar(
  imageUrl: '/user.jpg',
  status: AvatarStatus.offline,
)

Shape#

// Circle (default)
ArcaneAvatar(
  imageUrl: '/user.jpg',
  borderRadius: AvatarRadius.circle,
)

// Rounded square
ArcaneAvatar(
  imageUrl: '/user.jpg',
  borderRadius: AvatarRadius.rounded,
)

Examples#

User List Item#

ArcaneRow(
  gap: Gap.md,
  crossAxisAlignment: AlignItems.center,
  children: [
    ArcaneAvatar(
      imageUrl: user.avatar,
      name: user.name,
      size: AvatarSize.medium,
      status: user.isOnline ? AvatarStatus.online : AvatarStatus.offline,
    ),
    ArcaneColumn(
      crossAxisAlignment: AlignItems.start,
      children: [
        ArcaneText(user.name),
        ArcaneText(
          user.email,
          styles: const ArcaneStyleData(
            fontSize: FontSize.sm,
            textColor: TextColor.muted,
          ),
        ),
      ],
    ),
  ],
)

Header Profile#

ArcaneDropdownMenu(
  trigger: ArcaneAvatar(
    imageUrl: currentUser.avatar,
    size: AvatarSize.small,
  ),
  children: [
    ArcaneDropdownItem(label: 'Profile', onPressed: goToProfile),
    ArcaneDropdownItem(label: 'Settings', onPressed: goToSettings),
    ArcaneDivider(),
    ArcaneDropdownItem(label: 'Sign Out', onPressed: signOut),
  ],
)

Profile Card#

ArcaneCard(
  child: ArcaneColumn(
    crossAxisAlignment: AlignItems.center,
    gap: Gap.md,
    children: [
      ArcaneAvatar(
        imageUrl: user.avatar,
        name: user.name,
        size: AvatarSize.xl2,
      ),
      ArcaneHeading(text: user.name),
      ArcaneText(user.role),
      ArcaneFlow(
        gap: Gap.sm,
        children: [
          for (var skill in user.skills)
            ArcaneBadge(label: skill),
        ],
      ),
    ],
  ),
)

Comment Author#

ArcaneRow(
  gap: Gap.sm,
  crossAxisAlignment: AlignItems.start,
  children: [
    ArcaneAvatar(
      imageUrl: comment.author.avatar,
      name: comment.author.name,
      size: AvatarSize.small,
    ),
    ArcaneExpanded(
      child: ArcaneCard(
        child: ArcaneColumn(
          crossAxisAlignment: AlignItems.start,
          gap: Gap.xs,
          children: [
            ArcaneRow(
              gap: Gap.sm,
              children: [
                ArcaneText(comment.author.name),
                ArcaneText(
                  formatDate(comment.date),
                  styles: const ArcaneStyleData(
                    fontSize: FontSize.sm,
                    textColor: TextColor.muted,
                  ),
                ),
              ],
            ),
            ArcaneText(comment.text),
          ],
        ),
      ),
    ),
  ],
)

Team Members#

ArcaneRow(
  gap: Gap.sm,
  children: [
    for (var member in team.members.take(5))
      ArcaneAvatar(
        imageUrl: member.avatar,
        name: member.name,
        size: AvatarSize.small,
      ),
    if (team.members.length > 5)
      ArcaneAvatar(
        name: '+${team.members.length - 5}',
        size: AvatarSize.small,
      ),
  ],
)