Avatar
An identity chip: a photo when one loads, a tinted initials-or-icon fallback when it doesn't.
Live demo
Avatar presents a person or entity as a compact square or circle. Given a src, it shows the image, cover-cropped to fill; if the image is absent or fails to load, it falls back to the slotted content (initials as text, or an icon via the icon slot) on a soft, hue-tinted background.
The fallback tint follows tone, which accepts any of the six semantic roles or the twelve named hues, so a deterministic per-user color is a one-attribute choice. Four sizes (sm, md, lg, xl), two shapes (circle, square), and an optional corner status dot in any semantic tone round out the surface. alt names the image; the fallback text stays in the accessibility tree so the avatar is announced either way.
When to use
How this component composes with the rest of the set.
Props
7 props, straight from the manifest.
| Prop | Type | Default | Bindings | Description |
|---|---|---|---|---|
Appearance
Variants
circle
Fully rounded, the default identity shape.
square
A rounded square, for entities and projects rather than people.
Sizes
sm
Compact, for dense lists.
md
Default.
lg
Large, for headers.
xl
Extra large, for profile hero.
States
fallback
No image: the tinted initials-or-icon stand-in fills the chip.
status
A corner dot conveys presence; its color is the chosen status tone, ringed in the surface.
Anatomy
The named parts that make up the component, with their selectors.
avatar
The root chip carrying the size, shape, and tone classes; sizes the image and fallback and anchors the status dot.
image
The portrait image, cover-cropped to fill the chip and clipped to the chip's shape.
fallback
The initials-or-icon stand-in shown when no image is present, painted with the tone's soft tint.
status-dot
The optional corner indicator, ringed in the surface color so it reads against any background.
Tokens & coverage
What the component consumes, checked live against what the algorithm produces.
Live coverage check against the xoji-default register
(derive(xojiDefault, { anchors }) →
coverComponent(manifest, register)). Every token this component
consumes must be a key the algorithm produces.
--accent
--accent-2-bg
--accent-2-text
--accent-3-bg
--accent-3-text
--accent-4-bg
--accent-4-text
--accent-bg
--accent-text
--bg-1
--black-bg
--black-text
--blue-bg
--blue-text
--border-thick
--brown-bg
--brown-text
--cyan-bg
--cyan-text
--danger
--danger-bg
--danger-text
--font-sans
--gray-bg
--gray-text
--green-bg
--green-text
--info
--info-bg
--info-text
--leading-tight
--neutral
--neutral-bg
--neutral-text
--orange-bg
--orange-text
--pink-bg
--pink-text
--purple-bg
--purple-text
--radius-full
--radius-lg
--radius-md
--radius-sm
--red-bg
--red-text
--space-0
--space-2
--space-4
--space-6
--space-7
--space-8
--success
--success-bg
--success-text
--text-body
--text-lg
--text-sm
--text-xs
--warn
--warn-bg
--warn-text
--weight-semibold
--white-bg
--white-text
--yellow-bg
--yellow-text
Slots
Fallback initials shown when no image loads.
An icon fallback, used in place of initials when no image loads.
Accessibility
Code
Image, fallback, and status
A photo when one loads, tinted initials or an icon when it doesn't, with an optional presence dot.
<xoji-avatar alt="Ada Lovelace" src="/avatars/ada.jpg"></xoji-avatar>
<xoji-avatar alt="Grace Hopper" tone="info" size="lg">GH</xoji-avatar>
<xoji-avatar alt="Project Apollo" tone="purple" shape="square" status="success"></xoji-avatar>
<xoji-avatar alt="Unknown user" size="xl">
<svg slot="icon" viewBox="0 0 24 24" aria-hidden="true">
<path fill="currentColor" d="M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10Zm0 2c-5 0-9 2.5-9 6v2h18v-2c0-3.5-4-6-9-6Z" />
</svg>
</xoji-avatar>
<script lang="ts">
import { Avatar } from "@xoji/svelte";
</script>
<Avatar alt="Ada Lovelace" src="/avatars/ada.jpg" />
<Avatar alt="Grace Hopper" tone="info" size="lg">GH</Avatar>
<Avatar alt="Project Apollo" tone="purple" shape="square" status="success" />
<Avatar alt="Unknown user" size="xl">
{#snippet icon()}
<svg viewBox="0 0 24 24" aria-hidden="true">
<path fill="currentColor" d="M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10Zm0 2c-5 0-9 2.5-9 6v2h18v-2c0-3.5-4-6-9-6Z" />
</svg>
{/snippet}
</Avatar>
---
import { Avatar } from "@xoji/astro";
---
<Avatar alt="Ada Lovelace" src="/avatars/ada.jpg" />
<Avatar alt="Grace Hopper" tone="info" size="lg">GH</Avatar>
<Avatar alt="Project Apollo" tone="purple" shape="square" status="success" />
<Avatar alt="Unknown user" size="xl">
<svg slot="icon" viewBox="0 0 24 24" aria-hidden="true">
<path fill="currentColor" d="M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10Zm0 2c-5 0-9 2.5-9 6v2h18v-2c0-3.5-4-6-9-6Z" />
</svg>
</Avatar>