md-status-dot spec card
Identity · when to use / when NOT · decision cues · behavioural contract · do/don't · anti-patterns · full API. Paste into your agent when you're implementing with this component.
A presence or health indicator. A small coloured dot with six states, three sizes and an optional pulse — typically anchored to the corner of an avatar, or sitting inline in a dense table row.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 24px; align-items: center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="busy" label="Busy"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot state="away" label="Away"></md-status-dot>
</span>
</div>import { MdAvatar, MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', gap: '24px', alignItems: 'center' }}>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Ada Lovelace" size="large"></MdAvatar>
<MdStatusDot state="online" label="Online"></MdStatusDot>
</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Grace Hopper" size="large"></MdAvatar>
<MdStatusDot state="busy" label="Busy"></MdStatusDot>
</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Alan Turing" size="large"></MdAvatar>
<MdStatusDot state="away" label="Away"></MdStatusDot>
</span>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 24px; align-items: center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="busy" label="Busy"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot state="away" label="Away"></md-status-dot>
</span>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; gap: 24px; align-items: center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="busy" label="Busy"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot state="away" label="Away"></md-status-dot>
</span>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 24px; align-items: center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="busy" label="Busy"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot state="away" label="Away"></md-status-dot>
</span>
</div>
Already installed? See the
Installation guide for one-time package setup
(core + tokens, fonts). Each tab below shows two patterns for using
md-status-dot in your project: Option A registers every AWC UI
component at once (simplest), Option B imports only this component for
tree-shake-friendly bundles.
<!-- ─── Option A: global registration (all components) ─── -->
<script type="module">
import '@awc-ui/core/define';
</script>
<!-- ─── Option B: single import (tree-shake only md-status-dot) ─── -->
<script type="module">
import '@awc-ui/core/components/md-status-dot';
</script>
<md-status-dot></md-status-dot>// ─── Option A: typed React wrapper (registers all components) ───
// Importing from '@awc-ui/react' calls defineCustomElements() as a
// side effect, so every md-* element becomes available in the browser.
import { MdStatusDot } from '@awc-ui/react';
export function Example() {
return <MdStatusDot></MdStatusDot>;
}
// ─── Option B: single import (tree-shake to only md-status-dot) ───
// Skip the wrapper and use the raw custom element. Smallest bundle,
// but you lose typed props/events on JSX.
import '@awc-ui/core/components/md-status-dot';
export function ExampleTreeShaken() {
return <md-status-dot></md-status-dot>;
}// ─── Option A: schema module (any md-* element accepted) ───
// Pair with `defineCustomElements(window)` in main.ts.
import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@Component({
standalone: true,
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
template: `<md-status-dot></md-status-dot>`,
})
export class ExampleComponent {}
// ─── Option B: typed directive (tree-shake friendly) ───
// Pair with `import '@awc-ui/core/components/md-status-dot'` in main.ts.
import { Component } from '@angular/core';
import { MdStatusDot } from '@awc-ui/angular';
@Component({
standalone: true,
imports: [MdStatusDot],
template: `<md-status-dot></md-status-dot>`,
})
export class ExampleTreeShakenComponent {}<!-- ─── Option A: typed Vue wrapper (registers all components) ─── -->
<script setup lang="ts">
import { MdStatusDot } from '@awc-ui/vue';
</script>
<template>
<MdStatusDot></MdStatusDot>
</template>
<!-- ─── Option B: single import (tree-shake to only md-status-dot) ─── -->
<script setup lang="ts">
import '@awc-ui/core/components/md-status-dot';
</script>
<template>
<md-status-dot></md-status-dot>
</template><!-- ─── Option A: global registration (done once in main entry) ─── -->
<!-- main.ts: -->
<!-- import { defineCustomElements } from '@awc-ui/svelte'; -->
<!-- defineCustomElements(window); -->
<md-status-dot></md-status-dot>
<!-- ─── Option B: single import (tree-shake to only md-status-dot) ─── -->
<script lang="ts">
import '@awc-ui/core/components/md-status-dot';
</script>
<md-status-dot></md-status-dot>| Situation | Use instead |
|---|---|
| A count of unread items | md-badge |
| An interactive filter or tag | md-chip |
| A status with a text label the user reads | md-chip |
| Progress or loading | md-progress-indicator / md-loading-indicator |
| A large, prominent state banner | md-card with a semantic colour |
| Something clickable | md-button / md-icon-button |
The dot positions itself absolutely at the bottom inline-end corner of its
containing block, using --md-status-dot-inset-end and
--md-status-dot-inset-block-end (both 0 at small and medium, -3px at
large so the bigger dot still kisses the tile edge).
<span style="position: relative; display: inline-flex;"> <md-avatar name="Ada Lovelace"></md-avatar> <md-status-dot state="online" label="Online"></md-status-dot></span><!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:5.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">relative</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online" size="large"></md-status-dot>
</span>
<span style="inline-size:5.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">static</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="online" label="Online" size="large" style="position: static;"></md-status-dot>
</span>
</div>import { MdAvatar, MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '14px 16px', alignItems: 'center' }}>
<span style={{ inlineSize: '5.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>relative</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Ada Lovelace" size="large"></MdAvatar>
<MdStatusDot state="online" label="Online" size="large"></MdStatusDot>
</span>
<span style={{ inlineSize: '5.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>static</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Grace Hopper" size="large"></MdAvatar>
<MdStatusDot state="online" label="Online" size="large" style={{ position: 'static' }}></MdStatusDot>
</span>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:5.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">relative</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online" size="large"></md-status-dot>
</span>
<span style="inline-size:5.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">static</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="online" label="Online" size="large" style="position: static;"></md-status-dot>
</span>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:5.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">relative</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online" size="large"></md-status-dot>
</span>
<span style="inline-size:5.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">static</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="online" label="Online" size="large" style="position: static;"></md-status-dot>
</span>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:5.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">relative</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online" size="large"></md-status-dot>
</span>
<span style="inline-size:5.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">static</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="online" label="Online" size="large" style="position: static;"></md-status-dot>
</span>
</div>The insets are logical, so the dot flips to the correct corner under
dir="rtl" with no extra CSS. A surface-coloured outline (2px at medium,
1.5px at small, 3px at large) keeps it visually detached from whatever
it sits on.
The default offset is tuned for a circular avatar, where the corner of the box sits outside the drawn shape. On a rounded or square tile the same offset puts the dot inside the silhouette, overlapping the radius — push it further out so it kisses the corner instead.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 32px; align-items: center;">
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 50%; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online" style="--md-status-dot-inset-end: -3px; --md-status-dot-inset-block-end: -3px;"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 4px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online" style="--md-status-dot-inset-end: -4px; --md-status-dot-inset-block-end: -4px;"></md-status-dot>
</span>
</div>import { MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', gap: '32px', alignItems: 'center' }}>
<span style={{ position: 'relative', display: 'inline-flex', inlineSize: '48px', blockSize: '48px', borderRadius: '50%', background: 'var(--md-sys-color-primary-container)' }}>
<MdStatusDot state="online" label="Online"></MdStatusDot>
</span>
<span style={{ position: 'relative', display: 'inline-flex', inlineSize: '48px', blockSize: '48px', borderRadius: '12px', background: 'var(--md-sys-color-primary-container)' }}>
<MdStatusDot state="online" label="Online" style={{ '--md-status-dot-inset-end': '-3px', '--md-status-dot-inset-block-end': '-3px' }}></MdStatusDot>
</span>
<span style={{ position: 'relative', display: 'inline-flex', inlineSize: '48px', blockSize: '48px', borderRadius: '4px', background: 'var(--md-sys-color-primary-container)' }}>
<MdStatusDot state="online" label="Online" style={{ '--md-status-dot-inset-end': '-4px', '--md-status-dot-inset-block-end': '-4px' }}></MdStatusDot>
</span>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 32px; align-items: center;">
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 50%; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online" style="--md-status-dot-inset-end: -3px; --md-status-dot-inset-block-end: -3px;"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 4px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online" style="--md-status-dot-inset-end: -4px; --md-status-dot-inset-block-end: -4px;"></md-status-dot>
</span>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; gap: 32px; align-items: center;">
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 50%; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online" style="--md-status-dot-inset-end: -3px; --md-status-dot-inset-block-end: -3px;"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 4px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online" style="--md-status-dot-inset-end: -4px; --md-status-dot-inset-block-end: -4px;"></md-status-dot>
</span>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 32px; align-items: center;">
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 50%; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online" style="--md-status-dot-inset-end: -3px; --md-status-dot-inset-block-end: -3px;"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 4px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="Online" style="--md-status-dot-inset-end: -4px; --md-status-dot-inset-block-end: -4px;"></md-status-dot>
</span>
</div>In a legend, a status menu or a dropdown row the dot is not decorating a tile —
it is content in its own right. Override position: static and it detaches from
corner-anchoring and flows like any inline element.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<ul style="list-style: none; padding: 0; margin: 0; display: grid; gap: 8px; font: 400 14px/20px system-ui, sans-serif; color: var(--md-sys-color-on-surface);">
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="online" style="position: static;"></md-status-dot>
Available now
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="away" style="position: static;"></md-status-dot>
Away from desk
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="busy" style="position: static;"></md-status-dot>
Do not disturb
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="offline" style="position: static;"></md-status-dot>
Signed out
</li>
</ul>import { MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<ul style={{ listStyle: 'none', padding: '0', margin: '0', display: 'grid', gap: '8px', font: '400 14px/20px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface)' }}>
<li style={{ display: 'inline-flex', alignItems: 'center', gap: '10px' }}>
<MdStatusDot state="online" style={{ position: 'static' }}></MdStatusDot>
Available now
</li>
<li style={{ display: 'inline-flex', alignItems: 'center', gap: '10px' }}>
<MdStatusDot state="away" style={{ position: 'static' }}></MdStatusDot>
Away from desk
</li>
<li style={{ display: 'inline-flex', alignItems: 'center', gap: '10px' }}>
<MdStatusDot state="busy" style={{ position: 'static' }}></MdStatusDot>
Do not disturb
</li>
<li style={{ display: 'inline-flex', alignItems: 'center', gap: '10px' }}>
<MdStatusDot state="offline" style={{ position: 'static' }}></MdStatusDot>
Signed out
</li>
</ul>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<ul style="list-style: none; padding: 0; margin: 0; display: grid; gap: 8px; font: 400 14px/20px system-ui, sans-serif; color: var(--md-sys-color-on-surface);">
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="online" style="position: static;"></md-status-dot>
Available now
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="away" style="position: static;"></md-status-dot>
Away from desk
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="busy" style="position: static;"></md-status-dot>
Do not disturb
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="offline" style="position: static;"></md-status-dot>
Signed out
</li>
</ul><script setup>
import '@awc-ui/core/define';
</script>
<template>
<ul style="list-style: none; padding: 0; margin: 0; display: grid; gap: 8px; font: 400 14px/20px system-ui, sans-serif; color: var(--md-sys-color-on-surface);">
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="online" style="position: static;"></md-status-dot>
Available now
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="away" style="position: static;"></md-status-dot>
Away from desk
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="busy" style="position: static;"></md-status-dot>
Do not disturb
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="offline" style="position: static;"></md-status-dot>
Signed out
</li>
</ul>
</template><script>
import '@awc-ui/core/define';
</script>
<ul style="list-style: none; padding: 0; margin: 0; display: grid; gap: 8px; font: 400 14px/20px system-ui, sans-serif; color: var(--md-sys-color-on-surface);">
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="online" style="position: static;"></md-status-dot>
Available now
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="away" style="position: static;"></md-status-dot>
Away from desk
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="busy" style="position: static;"></md-status-dot>
Do not disturb
</li>
<li style="display: inline-flex; align-items: center; gap: 10px;">
<md-status-dot state="offline" style="position: static;"></md-status-dot>
Signed out
</li>
</ul>Used this way the dot needs no position: relative parent, since it is no
longer looking for a corner to sit in.
Six presence states, each with its own fill and pulse colour.
state | Meaning |
|---|---|
online | Available |
away | Idle |
busy | Do not disturb / in a call |
offline | Not connected |
invisible | Connected but appearing offline — a hollow ring on a surface fill |
neutral | Default. No presence semantics |
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 28px; align-items: center; padding: 8px;">
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="online" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="away" label="Away"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="busy" label="Busy"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="offline" label="Offline"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="invisible" label="Invisible"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="neutral" label="Unknown"></md-status-dot></span>
</div>import { MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', gap: '28px', alignItems: 'center', padding: '8px' }}>
<span style={{ position: 'relative', display: 'inline-flex', width: '24px', height: '24px' }}><MdStatusDot state="online" label="Online"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex', width: '24px', height: '24px' }}><MdStatusDot state="away" label="Away"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex', width: '24px', height: '24px' }}><MdStatusDot state="busy" label="Busy"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex', width: '24px', height: '24px' }}><MdStatusDot state="offline" label="Offline"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex', width: '24px', height: '24px' }}><MdStatusDot state="invisible" label="Invisible"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex', width: '24px', height: '24px' }}><MdStatusDot state="neutral" label="Unknown"></MdStatusDot></span>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 28px; align-items: center; padding: 8px;">
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="online" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="away" label="Away"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="busy" label="Busy"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="offline" label="Offline"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="invisible" label="Invisible"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="neutral" label="Unknown"></md-status-dot></span>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; gap: 28px; align-items: center; padding: 8px;">
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="online" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="away" label="Away"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="busy" label="Busy"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="offline" label="Offline"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="invisible" label="Invisible"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="neutral" label="Unknown"></md-status-dot></span>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 28px; align-items: center; padding: 8px;">
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="online" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="away" label="Away"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="busy" label="Busy"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="offline" label="Offline"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="invisible" label="Invisible"></md-status-dot></span>
<span style="position: relative; display: inline-flex; width: 24px; height: 24px;"><md-status-dot state="neutral" label="Unknown"></md-status-dot></span>
</div>size | Diameter | Pairs with |
|---|---|---|
small | 8px | md-avatar size="small", dense tables |
medium | 12px | Default. md-avatar size="medium" |
large | 16px | md-avatar size="large", standalone use |
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 24px; align-items: center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="small"></md-avatar>
<md-status-dot size="small" state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="medium"></md-avatar>
<md-status-dot size="medium" state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot size="large" state="online" label="Online"></md-status-dot>
</span>
</div>import { MdAvatar, MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', gap: '24px', alignItems: 'center' }}>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Ada Lovelace" size="small"></MdAvatar>
<MdStatusDot size="small" state="online" label="Online"></MdStatusDot>
</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Ada Lovelace" size="medium"></MdAvatar>
<MdStatusDot size="medium" state="online" label="Online"></MdStatusDot>
</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Ada Lovelace" size="large"></MdAvatar>
<MdStatusDot size="large" state="online" label="Online"></MdStatusDot>
</span>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 24px; align-items: center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="small"></md-avatar>
<md-status-dot size="small" state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="medium"></md-avatar>
<md-status-dot size="medium" state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot size="large" state="online" label="Online"></md-status-dot>
</span>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; gap: 24px; align-items: center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="small"></md-avatar>
<md-status-dot size="small" state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="medium"></md-avatar>
<md-status-dot size="medium" state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot size="large" state="online" label="Online"></md-status-dot>
</span>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 24px; align-items: center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="small"></md-avatar>
<md-status-dot size="small" state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="medium"></md-avatar>
<md-status-dot size="medium" state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot size="large" state="online" label="Online"></md-status-dot>
</span>
</div>Set an arbitrary diameter with --md-status-dot-size.
live pulses the dot outward in its own colour — useful for “live now”, “in a
call” or “recording”.
States that pulse
Each size
States with no halo of their own
Tuned pulse
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">States that pulse</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="online" live label="online"></md-status-dot></span>online</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="away" live label="away"></md-status-dot></span>away</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="busy" live label="busy"></md-status-dot></span>busy</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">Each size</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="small" live label="Live, small"></md-status-dot></span>small</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="medium" live label="Live, medium"></md-status-dot></span>medium</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="large" live label="Live, large"></md-status-dot></span>large</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">States with no halo of their own</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="offline" live label="Offline"></md-status-dot></span>offline</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="invisible" live label="Invisible"></md-status-dot></span>invisible</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="neutral" live label="Neutral"></md-status-dot></span>neutral</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="neutral" live label="Neutral, halo set" style="--md-status-dot-pulse-color: rgba(103, 80, 164, 0.55);"></md-status-dot></span>neutral + halo</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">Tuned pulse</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Fast pulse" style="--md-status-dot-pulse-duration: 0.8s;"></md-status-dot></span>0.8s</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Recording"></md-status-dot></span>1.6s (default)</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Slow pulse" style="--md-status-dot-pulse-duration: 3s;"></md-status-dot></span>3s</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Custom halo" style="--md-status-dot-pulse-color: rgba(103, 80, 164, 0.55);"></md-status-dot></span>custom halo</span>
</div>import { MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<p style={{ margin: '0 0 10px', font: '500 12px/1.2 system-ui, sans-serif', letterSpacing: '.04em', textTransform: 'uppercase', color: 'var(--md-sys-color-on-surface-variant)' }}>States that pulse</p>
<div style={{ display: 'flex', gap: '24px', alignItems: 'flex-start', flexWrap: 'wrap', marginBlockEnd: '24px' }}>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '28px', blockSize: '28px' }}><MdStatusDot state="online" live label="online"></MdStatusDot></span>online</span>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '28px', blockSize: '28px' }}><MdStatusDot state="away" live label="away"></MdStatusDot></span>away</span>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '28px', blockSize: '28px' }}><MdStatusDot state="busy" live label="busy"></MdStatusDot></span>busy</span>
</div>
<p style={{ margin: '0 0 10px', font: '500 12px/1.2 system-ui, sans-serif', letterSpacing: '.04em', textTransform: 'uppercase', color: 'var(--md-sys-color-on-surface-variant)' }}>Each size</p>
<div style={{ display: 'flex', gap: '24px', alignItems: 'flex-start', flexWrap: 'wrap', marginBlockEnd: '24px' }}>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '30px', blockSize: '30px' }}><MdStatusDot state="online" size="small" live label="Live, small"></MdStatusDot></span>small</span>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '30px', blockSize: '30px' }}><MdStatusDot state="online" size="medium" live label="Live, medium"></MdStatusDot></span>medium</span>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '30px', blockSize: '30px' }}><MdStatusDot state="online" size="large" live label="Live, large"></MdStatusDot></span>large</span>
</div>
<p style={{ margin: '0 0 10px', font: '500 12px/1.2 system-ui, sans-serif', letterSpacing: '.04em', textTransform: 'uppercase', color: 'var(--md-sys-color-on-surface-variant)' }}>States with no halo of their own</p>
<div style={{ display: 'flex', gap: '24px', alignItems: 'flex-start', flexWrap: 'wrap', marginBlockEnd: '24px' }}>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '28px', blockSize: '28px' }}><MdStatusDot state="offline" live label="Offline"></MdStatusDot></span>offline</span>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '28px', blockSize: '28px' }}><MdStatusDot state="invisible" live label="Invisible"></MdStatusDot></span>invisible</span>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '28px', blockSize: '28px' }}><MdStatusDot state="neutral" live label="Neutral"></MdStatusDot></span>neutral</span>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '28px', blockSize: '28px' }}><MdStatusDot state="neutral" live label="Neutral, halo set" style={{ '--md-status-dot-pulse-color': 'rgba(103, 80, 164, 0.55)' }}></MdStatusDot></span>neutral + halo</span>
</div>
<p style={{ margin: '0 0 10px', font: '500 12px/1.2 system-ui, sans-serif', letterSpacing: '.04em', textTransform: 'uppercase', color: 'var(--md-sys-color-on-surface-variant)' }}>Tuned pulse</p>
<div style={{ display: 'flex', gap: '24px', alignItems: 'flex-start', flexWrap: 'wrap', marginBlockEnd: '24px' }}>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '30px', blockSize: '30px' }}><MdStatusDot state="busy" live label="Fast pulse" style={{ '--md-status-dot-pulse-duration': '0.8s' }}></MdStatusDot></span>0.8s</span>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '30px', blockSize: '30px' }}><MdStatusDot state="busy" live label="Recording"></MdStatusDot></span>1.6s (default)</span>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '30px', blockSize: '30px' }}><MdStatusDot state="busy" live label="Slow pulse" style={{ '--md-status-dot-pulse-duration': '3s' }}></MdStatusDot></span>3s</span>
<span style={{ display: 'inline-flex', flexDirection: 'column', alignItems: 'center', gap: '8px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><span style={{ position: 'relative', display: 'inline-flex', inlineSize: '30px', blockSize: '30px' }}><MdStatusDot state="busy" live label="Custom halo" style={{ '--md-status-dot-pulse-color': 'rgba(103, 80, 164, 0.55)' }}></MdStatusDot></span>custom halo</span>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">States that pulse</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="online" live label="online"></md-status-dot></span>online</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="away" live label="away"></md-status-dot></span>away</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="busy" live label="busy"></md-status-dot></span>busy</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">Each size</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="small" live label="Live, small"></md-status-dot></span>small</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="medium" live label="Live, medium"></md-status-dot></span>medium</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="large" live label="Live, large"></md-status-dot></span>large</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">States with no halo of their own</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="offline" live label="Offline"></md-status-dot></span>offline</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="invisible" live label="Invisible"></md-status-dot></span>invisible</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="neutral" live label="Neutral"></md-status-dot></span>neutral</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="neutral" live label="Neutral, halo set" style="--md-status-dot-pulse-color: rgba(103, 80, 164, 0.55);"></md-status-dot></span>neutral + halo</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">Tuned pulse</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Fast pulse" style="--md-status-dot-pulse-duration: 0.8s;"></md-status-dot></span>0.8s</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Recording"></md-status-dot></span>1.6s (default)</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Slow pulse" style="--md-status-dot-pulse-duration: 3s;"></md-status-dot></span>3s</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Custom halo" style="--md-status-dot-pulse-color: rgba(103, 80, 164, 0.55);"></md-status-dot></span>custom halo</span>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">States that pulse</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="online" live label="online"></md-status-dot></span>online</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="away" live label="away"></md-status-dot></span>away</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="busy" live label="busy"></md-status-dot></span>busy</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">Each size</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="small" live label="Live, small"></md-status-dot></span>small</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="medium" live label="Live, medium"></md-status-dot></span>medium</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="large" live label="Live, large"></md-status-dot></span>large</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">States with no halo of their own</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="offline" live label="Offline"></md-status-dot></span>offline</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="invisible" live label="Invisible"></md-status-dot></span>invisible</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="neutral" live label="Neutral"></md-status-dot></span>neutral</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="neutral" live label="Neutral, halo set" style="--md-status-dot-pulse-color: rgba(103, 80, 164, 0.55);"></md-status-dot></span>neutral + halo</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">Tuned pulse</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Fast pulse" style="--md-status-dot-pulse-duration: 0.8s;"></md-status-dot></span>0.8s</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Recording"></md-status-dot></span>1.6s (default)</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Slow pulse" style="--md-status-dot-pulse-duration: 3s;"></md-status-dot></span>3s</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Custom halo" style="--md-status-dot-pulse-color: rgba(103, 80, 164, 0.55);"></md-status-dot></span>custom halo</span>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">States that pulse</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="online" live label="online"></md-status-dot></span>online</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="away" live label="away"></md-status-dot></span>away</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="busy" live label="busy"></md-status-dot></span>busy</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">Each size</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="small" live label="Live, small"></md-status-dot></span>small</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="medium" live label="Live, medium"></md-status-dot></span>medium</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="online" size="large" live label="Live, large"></md-status-dot></span>large</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">States with no halo of their own</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="offline" live label="Offline"></md-status-dot></span>offline</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="invisible" live label="Invisible"></md-status-dot></span>invisible</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="neutral" live label="Neutral"></md-status-dot></span>neutral</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 28px; block-size: 28px;"><md-status-dot state="neutral" live label="Neutral, halo set" style="--md-status-dot-pulse-color: rgba(103, 80, 164, 0.55);"></md-status-dot></span>neutral + halo</span>
</div>
<p style="margin: 0 0 10px; font: 500 12px/1.2 system-ui, sans-serif; letter-spacing: .04em; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant);">Tuned pulse</p>
<div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-block-end: 24px;">
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Fast pulse" style="--md-status-dot-pulse-duration: 0.8s;"></md-status-dot></span>0.8s</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Recording"></md-status-dot></span>1.6s (default)</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Slow pulse" style="--md-status-dot-pulse-duration: 3s;"></md-status-dot></span>3s</span>
<span style="display: inline-flex; flex-direction: column; align-items: center; gap: 8px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><span style="position: relative; display: inline-flex; inline-size: 30px; block-size: 30px;"><md-status-dot state="busy" live label="Custom halo" style="--md-status-dot-pulse-color: rgba(103, 80, 164, 0.55);"></md-status-dot></span>custom halo</span>
</div>Each state pulses in its own colour — green pulses green, busy pulses red — so the halo never contradicts the dot.
Only online, away and busy ship a halo colour, though. The base
--_pulse-color is transparent, so live on offline, invisible or
neutral animates nothing you can see — the animation runs, but the halo it
interpolates is invisible. That is deliberate (a dot that is offline is not
“live”), and if you do want one, set --md-status-dot-pulse-color yourself, as
the fourth dot in that row does. invisible is the odd one out even then: its
inset ring is drawn over by the pulse keyframe, so the two conflict visually.
--md-status-dot-pulse-duration sets the period (default 1.6s).
The pulse is gated behind prefers-reduced-motion: no-preference, so users with
reduced motion enabled at the OS level see a static dot — no opt-out prop
needed, and nothing to configure.
Since the component will not announce for you, pair it with a live region that
you update alongside the dot. Switch presence below: the dot recolours, its
label follows, and the region — visible here, visually hidden in production —
is what a screen reader actually reads out.
Ada Lovelace is online
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot id="dot" state="online" label="Online" size="large"></md-status-dot>
</span>
<div style="display: flex; gap: 8px;">
<md-button variant="outlined" data-state="online">Online</md-button>
<md-button variant="outlined" data-state="away">Away</md-button>
<md-button variant="outlined" data-state="busy">Busy</md-button>
</div>
<!-- .sr-only = your own visually-hidden utility class -->
<div id="presence" class="sr-only" aria-live="polite">Ada Lovelace is online</div>
<script type="module">
const LABELS = { online: 'Online', away: 'Away', busy: 'Busy' };
const dot = document.getElementById('dot');
const region = document.getElementById('presence');
document.querySelectorAll('md-button[data-state]').forEach((btn) => {
btn.addEventListener('mdClick', () => {
const next = btn.dataset.state;
dot.state = next; // recolours the dot
dot.label = LABELS[next]; // keeps the dot labelled
region.textContent = 'Ada Lovelace is ' + next; // announces the change
});
});
</script>import { MdAvatar, MdButton, MdStatusDot } from '@awc-ui/react';
import { useState } from 'react';
const LABELS = { online: 'Online', away: 'Away', busy: 'Busy' } as const;
type Presence = keyof typeof LABELS;
export function PresenceCard({ name }: { name: string }) {
const [state, setState] = useState<Presence>('online');
return (
<>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name={name} size="large" />
<MdStatusDot state={state} label={LABELS[state]} size="large" />
</span>
<div style={{ display: 'flex', gap: 8 }}>
{(Object.keys(LABELS) as Presence[]).map((s) => (
<MdButton key={s} variant="outlined" onMdClick={() => setState(s)}>
{LABELS[s]}
</MdButton>
))}
</div>
<div className="sr-only" aria-live="polite">
{name} is {state}
</div>
</>
);
}@Component({
selector: 'app-presence',
template: `
<span style="position: relative; display: inline-flex;">
<md-avatar [name]="name" size="large"></md-avatar>
<md-status-dot [state]="state" [label]="label" size="large"></md-status-dot>
</span>
<div style="display: flex; gap: 8px;">
<md-button variant="outlined" (mdClick)="setPresence('online')">Online</md-button>
<md-button variant="outlined" (mdClick)="setPresence('away')">Away</md-button>
<md-button variant="outlined" (mdClick)="setPresence('busy')">Busy</md-button>
</div>
<div class="sr-only" aria-live="polite">{{ name }} is {{ state }}</div>
`,
})
export class PresenceComponent {
readonly labels = { online: 'Online', away: 'Away', busy: 'Busy' };
name = 'Ada Lovelace';
state: 'online' | 'away' | 'busy' = 'online';
get label() {
return this.labels[this.state];
}
setPresence(next: 'online' | 'away' | 'busy') {
this.state = next;
}
}<script setup lang="ts">
import { computed, ref } from 'vue';
const LABELS = { online: 'Online', away: 'Away', busy: 'Busy' } as const;
type Presence = keyof typeof LABELS;
const name = 'Ada Lovelace';
const state = ref<Presence>('online');
const label = computed(() => LABELS[state.value]);
</script>
<template>
<span style="position: relative; display: inline-flex;">
<md-avatar :name="name" size="large" />
<md-status-dot :state="state" :label="label" size="large" />
</span>
<div style="display: flex; gap: 8px;">
<md-button variant="outlined" @mdClick="state = 'online'">Online</md-button>
<md-button variant="outlined" @mdClick="state = 'away'">Away</md-button>
<md-button variant="outlined" @mdClick="state = 'busy'">Busy</md-button>
</div>
<div class="sr-only" aria-live="polite">{{ name }} is {{ state }}</div>
</template><script lang="ts">
const LABELS = { online: 'Online', away: 'Away', busy: 'Busy' } as const;
type Presence = keyof typeof LABELS;
const name = 'Ada Lovelace';
let state: Presence = 'online';
$: label = LABELS[state];
</script>
<span style="position: relative; display: inline-flex;">
<md-avatar {name} size="large" />
<md-status-dot {state} {label} size="large" />
</span>
<div style="display: flex; gap: 8px;">
<md-button variant="outlined" on:mdClick={() => (state = 'online')}>Online</md-button>
<md-button variant="outlined" on:mdClick={() => (state = 'away')}>Away</md-button>
<md-button variant="outlined" on:mdClick={() => (state = 'busy')}>Busy</md-button>
</div>
<div class="sr-only" aria-live="polite">{name} is {state}</div>size="small" plus adjacent text is the dense-row pattern. The text carries the
meaning; the dot is the scannable cue — never ship the dot alone in a status
column, since colour is the only thing distinguishing the states and that fails
for colour-blind readers and in a printed table alike.
Inside a cell the dot still anchors absolutely, so give it a small positioned
box of its own (position: relative) rather than letting it hunt for the
nearest positioned ancestor — the row.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-table-container variant="outlined">
<md-table column-template="2fr 1fr 1fr" label="Service health">
<md-table-head>
<md-table-row rowgroup="head">
<md-table-cell head scope="col">Service</md-table-cell>
<md-table-cell head scope="col">Region</md-table-cell>
<md-table-cell head scope="col">Status</md-table-cell>
</md-table-row>
</md-table-head>
<md-table-body>
<md-table-row value="api-gateway">
<md-table-cell head scope="row">api-gateway</md-table-cell>
<md-table-cell>eu-west-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="online" label="Healthy"></md-status-dot></span>
Healthy
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="billing-worker">
<md-table-cell head scope="row">billing-worker</md-table-cell>
<md-table-cell>eu-west-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="busy" label="Deploying"></md-status-dot></span>
Deploying
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="search-indexer">
<md-table-cell head scope="row">search-indexer</md-table-cell>
<md-table-cell>us-east-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="away" label="Degraded"></md-status-dot></span>
Degraded
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="legacy-cron">
<md-table-cell head scope="row">legacy-cron</md-table-cell>
<md-table-cell>us-east-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="offline" label="Stopped"></md-status-dot></span>
Stopped
</span>
</md-table-cell>
</md-table-row>
</md-table-body>
</md-table>
</md-table-container>import { MdStatusDot, MdTable, MdTableBody, MdTableCell, MdTableContainer, MdTableHead, MdTableRow } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdTableContainer variant="outlined">
<MdTable columnTemplate="2fr 1fr 1fr" label="Service health">
<MdTableHead>
<MdTableRow rowgroup="head">
<MdTableCell head scope="col">Service</MdTableCell>
<MdTableCell head scope="col">Region</MdTableCell>
<MdTableCell head scope="col">Status</MdTableCell>
</MdTableRow>
</MdTableHead>
<MdTableBody>
<MdTableRow value="api-gateway">
<MdTableCell head scope="row">api-gateway</MdTableCell>
<MdTableCell>eu-west-1</MdTableCell>
<MdTableCell>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}>
<span style={{ position: 'relative', display: 'inline-flex', inlineSize: '8px', blockSize: '8px' }}><MdStatusDot size="small" state="online" label="Healthy"></MdStatusDot></span>
Healthy
</span>
</MdTableCell>
</MdTableRow>
<MdTableRow value="billing-worker">
<MdTableCell head scope="row">billing-worker</MdTableCell>
<MdTableCell>eu-west-1</MdTableCell>
<MdTableCell>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}>
<span style={{ position: 'relative', display: 'inline-flex', inlineSize: '8px', blockSize: '8px' }}><MdStatusDot size="small" state="busy" label="Deploying"></MdStatusDot></span>
Deploying
</span>
</MdTableCell>
</MdTableRow>
<MdTableRow value="search-indexer">
<MdTableCell head scope="row">search-indexer</MdTableCell>
<MdTableCell>us-east-1</MdTableCell>
<MdTableCell>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}>
<span style={{ position: 'relative', display: 'inline-flex', inlineSize: '8px', blockSize: '8px' }}><MdStatusDot size="small" state="away" label="Degraded"></MdStatusDot></span>
Degraded
</span>
</MdTableCell>
</MdTableRow>
<MdTableRow value="legacy-cron">
<MdTableCell head scope="row">legacy-cron</MdTableCell>
<MdTableCell>us-east-1</MdTableCell>
<MdTableCell>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }}>
<span style={{ position: 'relative', display: 'inline-flex', inlineSize: '8px', blockSize: '8px' }}><MdStatusDot size="small" state="offline" label="Stopped"></MdStatusDot></span>
Stopped
</span>
</MdTableCell>
</MdTableRow>
</MdTableBody>
</MdTable>
</MdTableContainer>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-table-container variant="outlined">
<md-table column-template="2fr 1fr 1fr" label="Service health">
<md-table-head>
<md-table-row rowgroup="head">
<md-table-cell head scope="col">Service</md-table-cell>
<md-table-cell head scope="col">Region</md-table-cell>
<md-table-cell head scope="col">Status</md-table-cell>
</md-table-row>
</md-table-head>
<md-table-body>
<md-table-row value="api-gateway">
<md-table-cell head scope="row">api-gateway</md-table-cell>
<md-table-cell>eu-west-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="online" label="Healthy"></md-status-dot></span>
Healthy
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="billing-worker">
<md-table-cell head scope="row">billing-worker</md-table-cell>
<md-table-cell>eu-west-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="busy" label="Deploying"></md-status-dot></span>
Deploying
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="search-indexer">
<md-table-cell head scope="row">search-indexer</md-table-cell>
<md-table-cell>us-east-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="away" label="Degraded"></md-status-dot></span>
Degraded
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="legacy-cron">
<md-table-cell head scope="row">legacy-cron</md-table-cell>
<md-table-cell>us-east-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="offline" label="Stopped"></md-status-dot></span>
Stopped
</span>
</md-table-cell>
</md-table-row>
</md-table-body>
</md-table>
</md-table-container><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-table-container variant="outlined">
<md-table column-template="2fr 1fr 1fr" label="Service health">
<md-table-head>
<md-table-row rowgroup="head">
<md-table-cell head scope="col">Service</md-table-cell>
<md-table-cell head scope="col">Region</md-table-cell>
<md-table-cell head scope="col">Status</md-table-cell>
</md-table-row>
</md-table-head>
<md-table-body>
<md-table-row value="api-gateway">
<md-table-cell head scope="row">api-gateway</md-table-cell>
<md-table-cell>eu-west-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="online" label="Healthy"></md-status-dot></span>
Healthy
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="billing-worker">
<md-table-cell head scope="row">billing-worker</md-table-cell>
<md-table-cell>eu-west-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="busy" label="Deploying"></md-status-dot></span>
Deploying
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="search-indexer">
<md-table-cell head scope="row">search-indexer</md-table-cell>
<md-table-cell>us-east-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="away" label="Degraded"></md-status-dot></span>
Degraded
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="legacy-cron">
<md-table-cell head scope="row">legacy-cron</md-table-cell>
<md-table-cell>us-east-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="offline" label="Stopped"></md-status-dot></span>
Stopped
</span>
</md-table-cell>
</md-table-row>
</md-table-body>
</md-table>
</md-table-container>
</template><script>
import '@awc-ui/core/define';
</script>
<md-table-container variant="outlined">
<md-table column-template="2fr 1fr 1fr" label="Service health">
<md-table-head>
<md-table-row rowgroup="head">
<md-table-cell head scope="col">Service</md-table-cell>
<md-table-cell head scope="col">Region</md-table-cell>
<md-table-cell head scope="col">Status</md-table-cell>
</md-table-row>
</md-table-head>
<md-table-body>
<md-table-row value="api-gateway">
<md-table-cell head scope="row">api-gateway</md-table-cell>
<md-table-cell>eu-west-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="online" label="Healthy"></md-status-dot></span>
Healthy
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="billing-worker">
<md-table-cell head scope="row">billing-worker</md-table-cell>
<md-table-cell>eu-west-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="busy" label="Deploying"></md-status-dot></span>
Deploying
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="search-indexer">
<md-table-cell head scope="row">search-indexer</md-table-cell>
<md-table-cell>us-east-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="away" label="Degraded"></md-status-dot></span>
Degraded
</span>
</md-table-cell>
</md-table-row>
<md-table-row value="legacy-cron">
<md-table-cell head scope="row">legacy-cron</md-table-cell>
<md-table-cell>us-east-1</md-table-cell>
<md-table-cell>
<span style="display: inline-flex; align-items: center; gap: 8px;">
<span style="position: relative; display: inline-flex; inline-size: 8px; block-size: 8px;"><md-status-dot size="small" state="offline" label="Stopped"></md-status-dot></span>
Stopped
</span>
</md-table-cell>
</md-table-row>
</md-table-body>
</md-table>
</md-table-container>| Property | Attribute | Type | Default | Reflects |
|---|---|---|---|---|
state | state | MdStatusDotState | 'neutral' | Yes |
size | size | MdStatusDotSize | 'medium' | Yes |
inline | inline | boolean | false | Yes |
live | live | boolean | false | Yes |
label | label | string | '' | — |
density | density | 0 | -1 | -2 | -3 | -4 | 0 | Yes |
Override on the host element for per-instance theming:
| Property | Description |
|---|---|
--md-status-dot-size | Dot diameter (overrides preset) |
--md-status-dot-color | Dot fill color |
--md-status-dot-pulse-color | Halo color used by the live pulse |
--md-status-dot-outline-color | Halo outline (default surface) |
--md-status-dot-outline-width | Halo outline width (default 2px) |
--md-status-dot-inset-end | inline-end anchor offset (default -2px) |
--md-status-dot-inset-block-end | block-end anchor offset (default -2px) |
--md-status-dot-pulse-duration | Pulse animation period (default 1.6s) |
label is effectively required. Empty (the default) →
role="presentation" + aria-hidden="true", i.e. invisible to assistive
tech, with colour as the only cue. The one acceptable exception is a dot that
decorates an element whose own accessible name already carries the state
(<md-avatar label="Ada Lovelace, online">).label and live off, the dot becomes role="img" with that label —
a static, named status image.label and live on, it becomes role="status". That role does not
rescue you: the name comes from aria-label, not from text content, so
presence changes still need your own live region.md-icon-button if the indicator
must be actionable.prefers-reduced-motion, and you can drop live or override
--md-status-dot-pulse-duration.The three exposure modes side by side — the first is invisible to assistive tech, the other two are named:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">presentation</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large" label="Ada Lovelace, online"></md-avatar>
<md-status-dot state="online" size="large"></md-status-dot>
</span>
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">img</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="away" size="large" label="Away"></md-status-dot>
</span>
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">status</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot state="busy" size="large" label="Busy" live></md-status-dot>
</span>
</div>import { MdAvatar, MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '14px 16px', alignItems: 'center' }}>
<span style={{ inlineSize: '9rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>presentation</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Ada Lovelace" size="large" label="Ada Lovelace, online"></MdAvatar>
<MdStatusDot state="online" size="large"></MdStatusDot>
</span>
<span style={{ inlineSize: '9rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>img</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Grace Hopper" size="large"></MdAvatar>
<MdStatusDot state="away" size="large" label="Away"></MdStatusDot>
</span>
<span style={{ inlineSize: '9rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>status</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Alan Turing" size="large"></MdAvatar>
<MdStatusDot state="busy" size="large" label="Busy" live></MdStatusDot>
</span>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">presentation</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large" label="Ada Lovelace, online"></md-avatar>
<md-status-dot state="online" size="large"></md-status-dot>
</span>
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">img</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="away" size="large" label="Away"></md-status-dot>
</span>
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">status</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot state="busy" size="large" label="Busy" live></md-status-dot>
</span>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">presentation</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large" label="Ada Lovelace, online"></md-avatar>
<md-status-dot state="online" size="large"></md-status-dot>
</span>
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">img</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="away" size="large" label="Away"></md-status-dot>
</span>
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">status</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot state="busy" size="large" label="Busy" live></md-status-dot>
</span>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">presentation</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large" label="Ada Lovelace, online"></md-avatar>
<md-status-dot state="online" size="large"></md-status-dot>
</span>
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">img</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot state="away" size="large" label="Away"></md-status-dot>
</span>
<span style="inline-size:9rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">status</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot state="busy" size="large" label="Busy" live></md-status-dot>
</span>
</div>--md-status-dot-inset-end and --md-status-dot-inset-block-end are logical
insets, so the same markup anchors bottom-right in LTR and bottom-left in RTL
with no extra CSS. See RTL.
<span dir="rtl" style="position: relative; display: inline-flex;"> <md-avatar name="آدا لوفلايس"></md-avatar> <md-status-dot state="online" label="متصل"></md-status-dot></span><!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="busy" size="large" label="Busy"></md-status-dot></span>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="متصل"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="busy" size="large" label="مشغول"></md-status-dot></span>
</div>
</div>import { MdAvatar, MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '14px 16px', alignItems: 'center' }}>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>ltr</span>
<div dir="ltr" style={{ display: 'flex', gap: '20px', alignItems: 'center' }}>
<span style={{ position: 'relative', display: 'inline-flex' }}><MdAvatar name="Ada Lovelace" size="large"></MdAvatar><MdStatusDot state="online" size="large" label="Online"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex' }}><MdAvatar name="Grace Hopper" size="large"></MdAvatar><MdStatusDot state="busy" size="large" label="Busy"></MdStatusDot></span>
</div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>rtl</span>
<div dir="rtl" style={{ display: 'flex', gap: '20px', alignItems: 'center' }}>
<span style={{ position: 'relative', display: 'inline-flex' }}><MdAvatar name="Ada Lovelace" size="large"></MdAvatar><MdStatusDot state="online" size="large" label="متصل"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex' }}><MdAvatar name="Grace Hopper" size="large"></MdAvatar><MdStatusDot state="busy" size="large" label="مشغول"></MdStatusDot></span>
</div>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="busy" size="large" label="Busy"></md-status-dot></span>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="متصل"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="busy" size="large" label="مشغول"></md-status-dot></span>
</div>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="busy" size="large" label="Busy"></md-status-dot></span>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="متصل"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="busy" size="large" label="مشغول"></md-status-dot></span>
</div>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="busy" size="large" label="Busy"></md-status-dot></span>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="متصل"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="busy" size="large" label="مشغول"></md-status-dot></span>
</div>
</div>Retuning the anchor for a squarer tile is fine — do it through
--md-status-dot-inset-end / --md-status-dot-inset-block-end and the flip
survives. Reach for the physical right / bottom instead and the dot stays
pinned to the right-hand corner in RTL, drifting off the tile it belongs to.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div dir="rtl" style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">correct</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="متصل" style="--md-status-dot-inset-end: -3px; --md-status-dot-inset-block-end: -3px;"></md-status-dot>
</span>
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">wrong</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="متصل" style="right: -3px; bottom: -3px;"></md-status-dot>
</span>
</div>import { MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div dir="rtl" style={{ display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '14px 16px', alignItems: 'center' }}>
<span style={{ inlineSize: '4.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>correct</span>
<span style={{ position: 'relative', display: 'inline-flex', inlineSize: '48px', blockSize: '48px', borderRadius: '12px', background: 'var(--md-sys-color-primary-container)' }}>
<MdStatusDot state="online" label="متصل" style={{ '--md-status-dot-inset-end': '-3px', '--md-status-dot-inset-block-end': '-3px' }}></MdStatusDot>
</span>
<span style={{ inlineSize: '4.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>wrong</span>
<span style={{ position: 'relative', display: 'inline-flex', inlineSize: '48px', blockSize: '48px', borderRadius: '12px', background: 'var(--md-sys-color-primary-container)' }}>
<MdStatusDot state="online" label="متصل" style={{ right: '-3px', bottom: '-3px' }}></MdStatusDot>
</span>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div dir="rtl" style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">correct</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="متصل" style="--md-status-dot-inset-end: -3px; --md-status-dot-inset-block-end: -3px;"></md-status-dot>
</span>
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">wrong</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="متصل" style="right: -3px; bottom: -3px;"></md-status-dot>
</span>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div dir="rtl" style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">correct</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="متصل" style="--md-status-dot-inset-end: -3px; --md-status-dot-inset-block-end: -3px;"></md-status-dot>
</span>
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">wrong</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="متصل" style="right: -3px; bottom: -3px;"></md-status-dot>
</span>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div dir="rtl" style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">correct</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="متصل" style="--md-status-dot-inset-end: -3px; --md-status-dot-inset-block-end: -3px;"></md-status-dot>
</span>
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">wrong</span>
<span style="position: relative; display: inline-flex; inline-size: 48px; block-size: 48px; border-radius: 12px; background: var(--md-sys-color-primary-container);">
<md-status-dot state="online" label="متصل" style="right: -3px; bottom: -3px;"></md-status-dot>
</span>
</div>density="-1…-4" is a local override of the inherited data-density, and it
compounds with size. All five rungs at all three sizes, so the taper is
visible in one place. The 0 row carries no density attribute at all —
there is no [density="0"] rule to write, so the undensified default is the
absence of the prop:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">0</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" style="position: static;"></md-status-dot><md-status-dot state="online" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-1" style="position: static;"></md-status-dot><md-status-dot state="online" density="-1" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-1" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-2" style="position: static;"></md-status-dot><md-status-dot state="online" density="-2" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-2" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-3" style="position: static;"></md-status-dot><md-status-dot state="online" density="-3" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-3" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-4" style="position: static;"></md-status-dot><md-status-dot state="online" density="-4" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-4" style="position: static;"></md-status-dot></div>
</div>import { MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '14px 16px', alignItems: 'center' }}>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>0</span>
<div style={{ display: 'flex', gap: '20px', alignItems: 'center' }}><MdStatusDot state="online" size="small" style={{ position: 'static' }}></MdStatusDot><MdStatusDot state="online" style={{ position: 'static' }}></MdStatusDot><MdStatusDot state="online" size="large" style={{ position: 'static' }}></MdStatusDot></div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-1</span>
<div style={{ display: 'flex', gap: '20px', alignItems: 'center' }}><MdStatusDot state="online" size="small" density="-1" style={{ position: 'static' }}></MdStatusDot><MdStatusDot state="online" density="-1" style={{ position: 'static' }}></MdStatusDot><MdStatusDot state="online" size="large" density="-1" style={{ position: 'static' }}></MdStatusDot></div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-2</span>
<div style={{ display: 'flex', gap: '20px', alignItems: 'center' }}><MdStatusDot state="online" size="small" density="-2" style={{ position: 'static' }}></MdStatusDot><MdStatusDot state="online" density="-2" style={{ position: 'static' }}></MdStatusDot><MdStatusDot state="online" size="large" density="-2" style={{ position: 'static' }}></MdStatusDot></div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-3</span>
<div style={{ display: 'flex', gap: '20px', alignItems: 'center' }}><MdStatusDot state="online" size="small" density="-3" style={{ position: 'static' }}></MdStatusDot><MdStatusDot state="online" density="-3" style={{ position: 'static' }}></MdStatusDot><MdStatusDot state="online" size="large" density="-3" style={{ position: 'static' }}></MdStatusDot></div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-4</span>
<div style={{ display: 'flex', gap: '20px', alignItems: 'center' }}><MdStatusDot state="online" size="small" density="-4" style={{ position: 'static' }}></MdStatusDot><MdStatusDot state="online" density="-4" style={{ position: 'static' }}></MdStatusDot><MdStatusDot state="online" size="large" density="-4" style={{ position: 'static' }}></MdStatusDot></div>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">0</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" style="position: static;"></md-status-dot><md-status-dot state="online" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-1" style="position: static;"></md-status-dot><md-status-dot state="online" density="-1" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-1" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-2" style="position: static;"></md-status-dot><md-status-dot state="online" density="-2" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-2" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-3" style="position: static;"></md-status-dot><md-status-dot state="online" density="-3" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-3" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-4" style="position: static;"></md-status-dot><md-status-dot state="online" density="-4" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-4" style="position: static;"></md-status-dot></div>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">0</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" style="position: static;"></md-status-dot><md-status-dot state="online" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-1" style="position: static;"></md-status-dot><md-status-dot state="online" density="-1" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-1" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-2" style="position: static;"></md-status-dot><md-status-dot state="online" density="-2" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-2" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-3" style="position: static;"></md-status-dot><md-status-dot state="online" density="-3" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-3" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-4" style="position: static;"></md-status-dot><md-status-dot state="online" density="-4" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-4" style="position: static;"></md-status-dot></div>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">0</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" style="position: static;"></md-status-dot><md-status-dot state="online" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-1" style="position: static;"></md-status-dot><md-status-dot state="online" density="-1" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-1" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-2" style="position: static;"></md-status-dot><md-status-dot state="online" density="-2" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-2" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-3" style="position: static;"></md-status-dot><md-status-dot state="online" density="-3" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-3" style="position: static;"></md-status-dot></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;gap:20px;align-items:center;"><md-status-dot state="online" size="small" density="-4" style="position: static;"></md-status-dot><md-status-dot state="online" density="-4" style="position: static;"></md-status-dot><md-status-dot state="online" size="large" density="-4" style="position: static;"></md-status-dot></div>
</div>Every state stays legible at the rung you pick, since the outline tapers with it:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:flex; gap:20px; align-items:center; flex-wrap:wrap;">
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="online" density="-2" style="position: static;"></md-status-dot>online</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="away" density="-2" style="position: static;"></md-status-dot>away</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="busy" density="-2" style="position: static;"></md-status-dot>busy</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="offline" density="-2" style="position: static;"></md-status-dot>offline</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="invisible" density="-2" style="position: static;"></md-status-dot>invisible</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="neutral" density="-2" style="position: static;"></md-status-dot>neutral</span>
</div>import { MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', gap: '20px', alignItems: 'center', flexWrap: 'wrap' }}>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><MdStatusDot state="online" density="-2" style={{ position: 'static' }}></MdStatusDot>online</span>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><MdStatusDot state="away" density="-2" style={{ position: 'static' }}></MdStatusDot>away</span>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><MdStatusDot state="busy" density="-2" style={{ position: 'static' }}></MdStatusDot>busy</span>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><MdStatusDot state="offline" density="-2" style={{ position: 'static' }}></MdStatusDot>offline</span>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><MdStatusDot state="invisible" density="-2" style={{ position: 'static' }}></MdStatusDot>invisible</span>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px', font: '400 12px system-ui, sans-serif', color: 'var(--md-sys-color-on-surface-variant)' }}><MdStatusDot state="neutral" density="-2" style={{ position: 'static' }}></MdStatusDot>neutral</span>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:flex; gap:20px; align-items:center; flex-wrap:wrap;">
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="online" density="-2" style="position: static;"></md-status-dot>online</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="away" density="-2" style="position: static;"></md-status-dot>away</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="busy" density="-2" style="position: static;"></md-status-dot>busy</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="offline" density="-2" style="position: static;"></md-status-dot>offline</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="invisible" density="-2" style="position: static;"></md-status-dot>invisible</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="neutral" density="-2" style="position: static;"></md-status-dot>neutral</span>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display:flex; gap:20px; align-items:center; flex-wrap:wrap;">
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="online" density="-2" style="position: static;"></md-status-dot>online</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="away" density="-2" style="position: static;"></md-status-dot>away</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="busy" density="-2" style="position: static;"></md-status-dot>busy</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="offline" density="-2" style="position: static;"></md-status-dot>offline</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="invisible" density="-2" style="position: static;"></md-status-dot>invisible</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="neutral" density="-2" style="position: static;"></md-status-dot>neutral</span>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display:flex; gap:20px; align-items:center; flex-wrap:wrap;">
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="online" density="-2" style="position: static;"></md-status-dot>online</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="away" density="-2" style="position: static;"></md-status-dot>away</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="busy" density="-2" style="position: static;"></md-status-dot>busy</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="offline" density="-2" style="position: static;"></md-status-dot>offline</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="invisible" density="-2" style="position: static;"></md-status-dot>invisible</span>
<span style="display: inline-flex; align-items: center; gap: 6px; font: 400 12px system-ui, sans-serif; color: var(--md-sys-color-on-surface-variant);"><md-status-dot state="neutral" density="-2" style="position: static;"></md-status-dot>neutral</span>
</div>The two are independent signals, so they compose without any extra wiring — a
global data-density ancestor sets the rung, dir sets the corner. The second
dot in each row takes density="-4", tightening past the inherited -2; the
third resets to full size with an inline --md-sys-density-scale: 0, which is
the only thing that actually escapes the ambient rung:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" data-density="-2" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="away" size="large" label="Away" density="-4"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Alan Turing" size="large"></md-avatar><md-status-dot state="busy" size="large" label="Busy" style="--md-sys-density-scale: 0;"></md-status-dot></span>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" data-density="-2" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="متصل"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="away" size="large" label="غائب" density="-4"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="آلان تورينج" size="large"></md-avatar><md-status-dot state="busy" size="large" label="مشغول" style="--md-sys-density-scale: 0;"></md-status-dot></span>
</div>
</div>import { MdAvatar, MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '14px 16px', alignItems: 'center' }}>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>ltr</span>
<div dir="ltr" data-density="-2" style={{ display: 'flex', gap: '20px', alignItems: 'center' }}>
<span style={{ position: 'relative', display: 'inline-flex' }}><MdAvatar name="Ada Lovelace" size="large"></MdAvatar><MdStatusDot state="online" size="large" label="Online"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex' }}><MdAvatar name="Grace Hopper" size="large"></MdAvatar><MdStatusDot state="away" size="large" label="Away" density="-4"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex' }}><MdAvatar name="Alan Turing" size="large"></MdAvatar><MdStatusDot state="busy" size="large" label="Busy" style={{ '--md-sys-density-scale': '0' }}></MdStatusDot></span>
</div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>rtl</span>
<div dir="rtl" data-density="-2" style={{ display: 'flex', gap: '20px', alignItems: 'center' }}>
<span style={{ position: 'relative', display: 'inline-flex' }}><MdAvatar name="Ada Lovelace" size="large"></MdAvatar><MdStatusDot state="online" size="large" label="متصل"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex' }}><MdAvatar name="Grace Hopper" size="large"></MdAvatar><MdStatusDot state="away" size="large" label="غائب" density="-4"></MdStatusDot></span>
<span style={{ position: 'relative', display: 'inline-flex' }}><MdAvatar name="آلان تورينج" size="large"></MdAvatar><MdStatusDot state="busy" size="large" label="مشغول" style={{ '--md-sys-density-scale': '0' }}></MdStatusDot></span>
</div>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" data-density="-2" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="away" size="large" label="Away" density="-4"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Alan Turing" size="large"></md-avatar><md-status-dot state="busy" size="large" label="Busy" style="--md-sys-density-scale: 0;"></md-status-dot></span>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" data-density="-2" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="متصل"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="away" size="large" label="غائب" density="-4"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="آلان تورينج" size="large"></md-avatar><md-status-dot state="busy" size="large" label="مشغول" style="--md-sys-density-scale: 0;"></md-status-dot></span>
</div>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" data-density="-2" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="away" size="large" label="Away" density="-4"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Alan Turing" size="large"></md-avatar><md-status-dot state="busy" size="large" label="Busy" style="--md-sys-density-scale: 0;"></md-status-dot></span>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" data-density="-2" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="متصل"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="away" size="large" label="غائب" density="-4"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="آلان تورينج" size="large"></md-avatar><md-status-dot state="busy" size="large" label="مشغول" style="--md-sys-density-scale: 0;"></md-status-dot></span>
</div>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" data-density="-2" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="Online"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="away" size="large" label="Away" density="-4"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Alan Turing" size="large"></md-avatar><md-status-dot state="busy" size="large" label="Busy" style="--md-sys-density-scale: 0;"></md-status-dot></span>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" data-density="-2" style="display:flex;gap:20px;align-items:center;">
<span style="position: relative; display: inline-flex;"><md-avatar name="Ada Lovelace" size="large"></md-avatar><md-status-dot state="online" size="large" label="متصل"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="Grace Hopper" size="large"></md-avatar><md-status-dot state="away" size="large" label="غائب" density="-4"></md-status-dot></span>
<span style="position: relative; display: inline-flex;"><md-avatar name="آلان تورينج" size="large"></md-avatar><md-status-dot state="busy" size="large" label="مشغول" style="--md-sys-density-scale: 0;"></md-status-dot></span>
</div>
</div>Density — density="-1…-4" locally overrides the inherited data-density
rung, shrinking the dot and its outline together. See
Density.
i18n — label is user-facing text. Translate it, along with the state names
(“Away”, “Busy”) in your dictionary, and let dir come from the document rather
than hard-coding a corner.
| Custom property | Purpose | Default |
|---|---|---|
--md-status-dot-size | Diameter (overrides the size preset) | 12px (8px small, 16px large) |
--md-status-dot-color | Fill | Per state — --md-sys-color-on-surface-variant for neutral |
--md-status-dot-pulse-color | Halo colour used by the live pulse | Per state — transparent for offline, invisible, neutral |
--md-status-dot-pulse-duration | Pulse period | 1.6s |
--md-status-dot-outline-color | Ring separating the dot from its host | --md-sys-color-surface |
--md-status-dot-outline-width | Ring width | 2px (1.5px small, 3px large) |
--md-status-dot-inset-end | Inline-end anchor offset | 0 (-3px at large) |
--md-status-dot-inset-block-end | Block-end anchor offset | 0 (-3px at large) |
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:flex;gap:32px;align-items:center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot
state="online"
label="Online"
style="--md-status-dot-size: 14px; --md-status-dot-outline-width: 3px; --md-status-dot-inset-end: 0px; --md-status-dot-inset-block-end: 0px;"
></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot
state="neutral"
label="On brand"
live
style="--md-status-dot-color: var(--md-sys-color-primary); --md-status-dot-pulse-color: rgba(103, 80, 164, 0.55); --md-status-dot-outline-color: var(--md-sys-color-surface-container-high);"
></md-status-dot>
</span>
</div>import { MdAvatar, MdStatusDot } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', gap: '32px', alignItems: 'center' }}>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Ada Lovelace" size="large"></MdAvatar>
<MdStatusDot state="online" label="Online"></MdStatusDot>
</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Grace Hopper" size="large"></MdAvatar>
<MdStatusDot
state="online"
label="Online"
style={{ '--md-status-dot-size': '14px', '--md-status-dot-outline-width': '3px', '--md-status-dot-inset-end': '0px', '--md-status-dot-inset-block-end': '0px' }}
></MdStatusDot>
</span>
<span style={{ position: 'relative', display: 'inline-flex' }}>
<MdAvatar name="Alan Turing" size="large"></MdAvatar>
<MdStatusDot
state="neutral"
label="On brand"
live
style={{ '--md-status-dot-color': 'var(--md-sys-color-primary)', '--md-status-dot-pulse-color': 'rgba(103, 80, 164, 0.55)', '--md-status-dot-outline-color': 'var(--md-sys-color-surface-container-high)' }}
></MdStatusDot>
</span>
</div>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:flex;gap:32px;align-items:center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot
state="online"
label="Online"
style="--md-status-dot-size: 14px; --md-status-dot-outline-width: 3px; --md-status-dot-inset-end: 0px; --md-status-dot-inset-block-end: 0px;"
></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot
state="neutral"
label="On brand"
live
style="--md-status-dot-color: var(--md-sys-color-primary); --md-status-dot-pulse-color: rgba(103, 80, 164, 0.55); --md-status-dot-outline-color: var(--md-sys-color-surface-container-high);"
></md-status-dot>
</span>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display:flex;gap:32px;align-items:center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot
state="online"
label="Online"
style="--md-status-dot-size: 14px; --md-status-dot-outline-width: 3px; --md-status-dot-inset-end: 0px; --md-status-dot-inset-block-end: 0px;"
></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot
state="neutral"
label="On brand"
live
style="--md-status-dot-color: var(--md-sys-color-primary); --md-status-dot-pulse-color: rgba(103, 80, 164, 0.55); --md-status-dot-outline-color: var(--md-sys-color-surface-container-high);"
></md-status-dot>
</span>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display:flex;gap:32px;align-items:center;">
<span style="position: relative; display: inline-flex;">
<md-avatar name="Ada Lovelace" size="large"></md-avatar>
<md-status-dot state="online" label="Online"></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Grace Hopper" size="large"></md-avatar>
<md-status-dot
state="online"
label="Online"
style="--md-status-dot-size: 14px; --md-status-dot-outline-width: 3px; --md-status-dot-inset-end: 0px; --md-status-dot-inset-block-end: 0px;"
></md-status-dot>
</span>
<span style="position: relative; display: inline-flex;">
<md-avatar name="Alan Turing" size="large"></md-avatar>
<md-status-dot
state="neutral"
label="On brand"
live
style="--md-status-dot-color: var(--md-sys-color-primary); --md-status-dot-pulse-color: rgba(103, 80, 164, 0.55); --md-status-dot-outline-color: var(--md-sys-color-surface-container-high);"
></md-status-dot>
</span>
</div>Set them per instance, or once for every dot in a region:
md-status-dot { --md-status-dot-size: 14px; --md-status-dot-outline-width: 3px; --md-status-dot-outline-color: var(--md-sys-color-surface-container-high);}If you override --md-status-dot-color, check the contrast yourself — the six
built-in state colours are the verified set, and the outline is what keeps the
dot legible on whatever it sits on, so check any override in both the light and
the dark theme.
md-badge ·
md-avatar ·
md-chip ·
md-list ·
md-progress-indicator
md-status-dotTwo artefacts to give your AI agent so it generates correct UI with this component. The per-component spec answers "how do I use this exact tag?". The main-llm spec answers "which tag should I pick in the first place?".
md-status-dot spec card
Identity · when to use / when NOT · decision cues · behavioural contract · do/don't · anti-patterns · full API. Paste into your agent when you're implementing with this component.
System-prompt preamble · decision matrix · token reference · page recipes · anti-patterns. Paste into the system prompt at the start of a piece of work.