--- /dev/null
+@use "variables" as *;
+@use "theme" as *;
+@use "mixins/border-radius" as *;
+
+// scss-docs-start avatar-variables
+$avatar-size: 2.5rem !default;
+$avatar-size-xs: 1.5rem !default;
+$avatar-size-sm: 2rem !default;
+$avatar-size-lg: 3rem !default;
+$avatar-size-xl: 4rem !default;
+$avatar-border-radius: 50% !default;
+$avatar-border-width: 2px !default;
+$avatar-border-color: var(--bg-body) !default;
+$avatar-bg: var(--bg-2) !default;
+$avatar-color: var(--color-body) !default;
+
+$avatar-status-size: .75rem !default;
+$avatar-status-border-width: 2px !default;
+$avatar-status-border-color: var(--bg-body) !default;
+
+$avatar-stack-spacing: -.3 !default; // Percentage of avatar size (negative for overlap)
+// scss-docs-end avatar-variables
+
+@layer components {
+ .avatar {
+ // scss-docs-start avatar-css-vars
+ --avatar-border-radius: #{$avatar-border-radius};
+ --avatar-border-width: #{$avatar-border-width};
+ --avatar-border-color: #{$avatar-border-color};
+ --avatar-bg: #{$avatar-bg};
+ --avatar-color: #{$avatar-color};
+ --avatar-status-size: #{$avatar-status-size};
+ --avatar-status-border-width: #{$avatar-status-border-width};
+ --avatar-status-border-color: #{$avatar-status-border-color};
+ // scss-docs-end avatar-css-vars
+
+ position: relative;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--avatar-size, #{$avatar-size});
+ height: var(--avatar-size, #{$avatar-size});
+ font-size: calc(var(--avatar-size) * .4);
+ font-weight: $font-weight-medium;
+ line-height: 1;
+ color: var(--theme-contrast, var(--avatar-color));
+ text-transform: uppercase;
+ vertical-align: middle;
+ background-color: var(--theme-bg, var(--avatar-bg));
+ @include border-radius(var(--avatar-border-radius));
+ }
+
+ .avatar-subtle {
+ color: var(--theme-text, var(--avatar-color));
+ background-color: var(--theme-bg-subtle, var(--avatar-bg));
+ }
+
+ .avatar-img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ @include border-radius(inherit);
+ }
+
+ .avatar-status {
+ position: absolute;
+ right: calc(var(--avatar-status-border-width) * -1);
+ bottom: calc(var(--avatar-status-border-width) * -1);
+ width: var(--avatar-status-size);
+ height: var(--avatar-status-size);
+ background-color: var(--gray-400);
+ border: var(--avatar-status-border-width) solid var(--avatar-status-border-color);
+ @include border-radius(50%);
+
+ &.status-online {
+ background-color: var(--green-500);
+ }
+
+ &.status-offline {
+ background-color: var(--gray-400);
+ @include border-radius(20%);
+ }
+
+ &.status-busy {
+ background-color: var(--red-500);
+ @include border-radius(20%);
+ }
+
+ &.status-away {
+ background-color: var(--yellow-500);
+ }
+ }
+
+ .avatar-stack {
+ display: inline-flex;
+ flex-direction: row-reverse;
+
+ .avatar {
+ // Stack spacing is calculated as a percentage of avatar size
+ margin-left: calc(var(--avatar-size, #{$avatar-size}) * #{$avatar-stack-spacing});
+ border: var(--avatar-border-width) solid var(--avatar-border-color);
+ mask-image: none;
+
+ &:last-child {
+ margin-left: 0;
+ }
+
+ &:hover {
+ z-index: 1;
+ transform: translateY(-2px);
+ }
+ }
+ }
+
+ .avatar-xs,
+ .avatar-stack-xs {
+ --avatar-size: #{$avatar-size-xs};
+ --avatar-status-size: .625rem;
+ }
+
+ .avatar-sm,
+ .avatar-stack-sm {
+ --avatar-size: #{$avatar-size-sm};
+ }
+
+ .avatar-lg,
+ .avatar-stack-lg {
+ --avatar-size: #{$avatar-size-lg};
+ --avatar-status-size: 1rem;
+ }
+
+ .avatar-xl,
+ .avatar-stack-xl {
+ --avatar-size: #{$avatar-size-xl};
+ --avatar-status-size: 1.25rem;
+ }
+}
--- /dev/null
+---
+title: Avatar
+description: Documentation and examples for avatars, including image avatars, initials, status indicators, and avatar stacks.
+toc: true
+---
+
+## Examples
+
+Avatars are used to represent users or entities. They can display an image or initials as a fallback.
+
+### Image
+
+Use `.avatar` with an `.avatar-img` for image-based avatars. The parent `.avatar` element provides an easy wrapper for additional avatar features like status indicators and stacks. You're welcome to use the `.avatar-img` class on its own if you only need a single HTML element.
+
+<Example code={`<span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>`} />
+
+### Initials
+
+Use text content inside `.avatar` for initials-based avatars.
+
+<Example code={`<span class="avatar">AB</span>
+<span class="avatar theme-primary">CD</span>
+<span class="avatar theme-accent">EF</span>
+<span class="avatar theme-success">GG</span>
+<span class="avatar theme-danger">GH</span>
+<span class="avatar theme-warning">IJ</span>
+<span class="avatar theme-info">KL</span>
+<span class="avatar theme-inverse">MN</span>
+<span class="avatar theme-secondary">OP</span>`} />
+
+Use `.avatar-subtle` to create a subtle avatar.
+
+<Example code={`<span class="avatar">AB</span>
+<span class="avatar avatar-subtle theme-primary">CD</span>
+<span class="avatar avatar-subtle theme-accent">EF</span>
+<span class="avatar avatar-subtle theme-success">GG</span>
+<span class="avatar avatar-subtle theme-danger">GH</span>
+<span class="avatar avatar-subtle theme-warning">IJ</span>
+<span class="avatar avatar-subtle theme-info">KL</span>
+<span class="avatar avatar-subtle theme-inverse">MN</span>
+<span class="avatar avatar-subtle theme-secondary">OP</span>`} />
+
+## Sizes
+
+Avatars come in multiple sizes: extra small, small, default, large, and extra large.
+
+<Example code={`<span class="avatar avatar-xs">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar avatar-sm">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar avatar-lg">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar avatar-xl">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>`} />
+
+## Status indicator
+
+Add a `.avatar-status` element inside the avatar to show a status indicator. Each status has a distinct shape and color:
+
+- `.status-online` — green circle
+- `.status-offline` — gray rounded square
+- `.status-busy` — red rounded square
+- `.status-away` — yellow circle
+
+<Example code={`<span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ <span class="avatar-status status-online"></span>
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ <span class="avatar-status status-offline"></span>
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ <span class="avatar-status status-busy"></span>
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ <span class="avatar-status status-away"></span>
+ </span>`} />
+
+### Status with sizes
+
+The status indicator scales with the avatar size.
+
+<Example code={`<span class="avatar avatar-xs">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ <span class="avatar-status status-online"></span>
+ </span>
+ <span class="avatar avatar-sm">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ <span class="avatar-status status-online"></span>
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ <span class="avatar-status status-online"></span>
+ </span>
+ <span class="avatar avatar-lg">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ <span class="avatar-status status-online"></span>
+ </span>
+ <span class="avatar avatar-xl">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ <span class="avatar-status status-online"></span>
+ </span>`} />
+
+## Avatar stack
+
+Use `.avatar-stack` to group multiple avatars together with overlapping effect. Avatars are rendered in reverse order so the first avatar appears on top. Stacks use a percentage of the avatar size to determine how much to overlap stacked avatars.
+
+<Example code={`<div class="avatar-stack">
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ </div>`} />
+
+### Stack with sizes
+
+As a shorthand, size classes are available for `.avatar-stack` and `.avatar`.
+
+<Example class="vstack align-items-start gap-3" code={`<div class="avatar-stack avatar-stack-xs">
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ </div>
+
+ <div class="avatar-stack avatar-stack-sm">
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ </div>
+
+ <div class="avatar-stack">
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ </div>
+
+ <div class="avatar-stack avatar-stack-lg">
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ </div>
+
+ <div class="avatar-stack avatar-stack-xl">
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ </div>`} />
+
+### Stack with count
+
+Combine with initials to show a count of additional users.
+
+<Example code={`<div class="avatar-stack">
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://github.com/mdo.png" alt="mdo">
+ </span>
+ <span class="avatar">
+ <img class="avatar-img" src="https://i.pravatar.cc/150?img=34" alt="User avatar">
+ </span>
+ <span class="avatar theme-secondary">+5</span>
+ </div>`} />
+
+## CSS
+
+### Variables
+
+<CSSVariables component="Avatar" className="avatar" />
+
+<ScssDocs name="avatar-css-vars" file="scss/_avatar.scss" />
+
+### Sass variables
+
+<ScssDocs name="avatar-variables" file="scss/_avatar.scss" />