md-meter 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 read-only graphical display of a numeric value within a known range.
Storage used, quota consumed, password strength, battery level. The host
carries full role="meter" ARIA semantics, the value is clamped into
[min, max], and the value text is real Intl.NumberFormat output — a
locale-aware percentage by default, or units/currency/plain numbers via
formatOptions.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="Quota used" show-label show-value></md-meter>
<md-meter value="3" max="10" color="success" label="Seats taken" value-text="3 of 10 seats" show-label show-value></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px', inlineSize: '100%', maxInlineSize: '360px' }}>
<MdMeter value="65" label="Storage used" showLabel show-value></MdMeter>
<MdMeter value="82" color="warning" label="Quota used" showLabel show-value></MdMeter>
<MdMeter value="3" max="10" color="success" label="Seats taken" valueText="3 of 10 seats" showLabel show-value></MdMeter>
</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; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="Quota used" show-label show-value></md-meter>
<md-meter value="3" max="10" color="success" label="Seats taken" value-text="3 of 10 seats" show-label show-value></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="Quota used" show-label show-value></md-meter>
<md-meter value="3" max="10" color="success" label="Seats taken" value-text="3 of 10 seats" show-label show-value></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="Quota used" show-label show-value></md-meter>
<md-meter value="3" max="10" color="success" label="Seats taken" value-text="3 of 10 seats" show-label show-value></md-meter>
</div>
Already installed? See the
Installation guide for one-time package setup
(core + tokens, fonts). Each tab below shows two patterns for using
md-meter 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-meter) ─── -->
<script type="module">
import '@awc-ui/core/components/md-meter';
</script>
<md-meter></md-meter>// ─── 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 { MdMeter } from '@awc-ui/react';
export function Example() {
return <MdMeter></MdMeter>;
}
// ─── Option B: single import (tree-shake to only md-meter) ───
// 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-meter';
export function ExampleTreeShaken() {
return <md-meter></md-meter>;
}// ─── 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-meter></md-meter>`,
})
export class ExampleComponent {}
// ─── Option B: typed directive (tree-shake friendly) ───
// Pair with `import '@awc-ui/core/components/md-meter'` in main.ts.
import { Component } from '@angular/core';
import { MdMeter } from '@awc-ui/angular';
@Component({
standalone: true,
imports: [MdMeter],
template: `<md-meter></md-meter>`,
})
export class ExampleTreeShakenComponent {}<!-- ─── Option A: typed Vue wrapper (registers all components) ─── -->
<script setup lang="ts">
import { MdMeter } from '@awc-ui/vue';
</script>
<template>
<MdMeter></MdMeter>
</template>
<!-- ─── Option B: single import (tree-shake to only md-meter) ─── -->
<script setup lang="ts">
import '@awc-ui/core/components/md-meter';
</script>
<template>
<md-meter></md-meter>
</template><!-- ─── Option A: global registration (done once in main entry) ─── -->
<!-- main.ts: -->
<!-- import { defineCustomElements } from '@awc-ui/svelte'; -->
<!-- defineCustomElements(window); -->
<md-meter></md-meter>
<!-- ─── Option B: single import (tree-shake to only md-meter) ─── -->
<script lang="ts">
import '@awc-ui/core/components/md-meter';
</script>
<md-meter></md-meter><meter> semantics fit but you want MD3 visuals, theming and
density.| Situation | Use instead |
|---|---|
| How far along an activity is (upload, install, load) | md-progress-indicator |
| An unknown-length wait | md-loading-indicator |
| The user should change the value | md-slider |
| A score the user assigns | md-rating |
| A tiny binary/status signal | md-status-dot or md-badge |
value is clamped into [min, max] before ARIA, geometry and formatting —
value="150" in a 0–100 range renders and announces 100%. An inverted range
(max < min) collapses to an empty one instead of emitting invalid ARIA.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="0" label="Empty" show-label show-value></md-meter>
<md-meter value="50" label="Half" show-label show-value></md-meter>
<md-meter value="100" label="Full" show-label show-value></md-meter>
<md-meter value="150" label="Clamped from 150" show-label show-value></md-meter>
<md-meter min="100" max="200" value="150" label="Range 100–200" show-label show-value></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px', inlineSize: '100%', maxInlineSize: '360px' }}>
<MdMeter value="0" label="Empty" showLabel show-value></MdMeter>
<MdMeter value="50" label="Half" showLabel show-value></MdMeter>
<MdMeter value="100" label="Full" showLabel show-value></MdMeter>
<MdMeter value="150" label="Clamped from 150" showLabel show-value></MdMeter>
<MdMeter min="100" max="200" value="150" label="Range 100–200" showLabel show-value></MdMeter>
</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; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="0" label="Empty" show-label show-value></md-meter>
<md-meter value="50" label="Half" show-label show-value></md-meter>
<md-meter value="100" label="Full" show-label show-value></md-meter>
<md-meter value="150" label="Clamped from 150" show-label show-value></md-meter>
<md-meter min="100" max="200" value="150" label="Range 100–200" show-label show-value></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="0" label="Empty" show-label show-value></md-meter>
<md-meter value="50" label="Half" show-label show-value></md-meter>
<md-meter value="100" label="Full" show-label show-value></md-meter>
<md-meter value="150" label="Clamped from 150" show-label show-value></md-meter>
<md-meter min="100" max="200" value="150" label="Range 100–200" show-label show-value></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="0" label="Empty" show-label show-value></md-meter>
<md-meter value="50" label="Half" show-label show-value></md-meter>
<md-meter value="100" label="Full" show-label show-value></md-meter>
<md-meter value="150" label="Clamped from 150" show-label show-value></md-meter>
<md-meter min="100" max="200" value="150" label="Range 100–200" show-label show-value></md-meter>
</div>The last example shows the default value text is the value’s position in the range, not the raw number: 150 in 100–200 reads “50%”.
show-label and show-value render an optional header row above the track —
label start-aligned, formatted value end-aligned. The visible value span is
aria-hidden; screen readers get the exact same string once, via
aria-valuetext on the host.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="40" label="Bare track (label is ARIA-only)"></md-meter>
<md-meter value="40" label="Label only" show-label></md-meter>
<md-meter value="40" label="Value only" show-value></md-meter>
<md-meter value="40" label="Label and value" show-label show-value></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px', inlineSize: '100%', maxInlineSize: '360px' }}>
<MdMeter value="40" label="Bare track (label is ARIA-only)"></MdMeter>
<MdMeter value="40" label="Label only" show-label></MdMeter>
<MdMeter value="40" label="Value only" show-value></MdMeter>
<MdMeter value="40" label="Label and value" showLabel show-value></MdMeter>
</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; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="40" label="Bare track (label is ARIA-only)"></md-meter>
<md-meter value="40" label="Label only" show-label></md-meter>
<md-meter value="40" label="Value only" show-value></md-meter>
<md-meter value="40" label="Label and value" show-label show-value></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="40" label="Bare track (label is ARIA-only)"></md-meter>
<md-meter value="40" label="Label only" show-label></md-meter>
<md-meter value="40" label="Value only" show-value></md-meter>
<md-meter value="40" label="Label and value" show-label show-value></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="40" label="Bare track (label is ARIA-only)"></md-meter>
<md-meter value="40" label="Label only" show-label></md-meter>
<md-meter value="40" label="Value only" show-value></md-meter>
<md-meter value="40" label="Label and value" show-label show-value></md-meter>
</div>Three tiers, most specific wins:
| Tier | What is formatted | Example output |
|---|---|---|
| default | percentage of the range, Intl percent style | 24%, 24 %, ٢٤٪ |
formatOptions | the clamped raw value, any Intl.NumberFormatOptions | 256 GB, €750.00, 7.4 |
value-text | nothing — your literal string wins | 3 of 10 seats |
formatOptions is a JS-only object prop — set it as a property, not an
attribute. locale (BCP-47) picks the Intl locale; leave it empty to follow
the runtime’s default.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-meter id="meter-gb" value="256" max="512" label="Gigabytes" show-label show-value></md-meter>
<md-meter id="meter-eur" value="750" max="1000" locale="de-DE" label="Budget spent" show-label show-value></md-meter>
<script type="module">
const gb = document.getElementById('meter-gb');
const eur = document.getElementById('meter-eur');
gb.formatOptions = { style: 'unit', unit: 'gigabyte' };
eur.formatOptions = { style: 'currency', currency: 'EUR' };
</script>import { MdMeter } from '@awc-ui/react';
const formatOptions = { style: 'unit', unit: 'gigabyte' };
const eurFormatOptions = { style: 'currency', currency: 'EUR' };
export function Demo() {
return (
<>
<MdMeter id="meter-gb"
formatOptions={formatOptions} value="256" max="512" label="Gigabytes" showLabel show-value></MdMeter>
<MdMeter id="meter-eur"
formatOptions={eurFormatOptions} value="750" max="1000" locale="de-DE" label="Budget spent" showLabel show-value></MdMeter>
</>
);
}import { Component } from '@angular/core';
// Bind the CAMELCASE name. [format-options]="…" would set a
// "format-options" property that md-meter never reads, and the
// meter would silently fall back to the default percent output.
@Component({
selector: 'app-formatted-meters',
template: `
<md-meter
[formatOptions]="gbFormat"
value="256"
max="512"
label="Gigabytes"
show-label
show-value
></md-meter>
<md-meter
[formatOptions]="eurFormat"
locale="de-DE"
value="750"
max="1000"
label="Budget spent"
show-label
show-value
></md-meter>
`,
})
export class FormattedMetersComponent {
gbFormat: Intl.NumberFormatOptions = { style: 'unit', unit: 'gigabyte' };
eurFormat: Intl.NumberFormatOptions = { style: 'currency', currency: 'EUR' };
}<script setup lang="ts">
import '@awc-ui/core/define';
const gbFormat: Intl.NumberFormatOptions = { style: 'unit', unit: 'gigabyte' };
const eurFormat: Intl.NumberFormatOptions = { style: 'currency', currency: 'EUR' };
</script>
<template>
<!-- :formatOptions, not :format-options — Vue only sets a binding as a DOM
property when the name exists on the element. -->
<md-meter
:formatOptions="gbFormat"
value="256"
max="512"
label="Gigabytes"
show-label
show-value
/>
<md-meter
:formatOptions="eurFormat"
locale="de-DE"
value="750"
max="1000"
label="Budget spent"
show-label
show-value
/>
</template><script>
import '@awc-ui/core/define';
const formatOptions = { style: 'unit', unit: 'gigabyte' };
const eurFormatOptions = { style: 'currency', currency: 'EUR' };
</script>
<md-meter id="meter-gb"
{formatOptions} value="256" max="512" label="Gigabytes" show-label show-value></md-meter>
<md-meter id="meter-eur"
formatOptions={eurFormatOptions} value="750" max="1000" locale="de-DE" label="Budget spent" show-label show-value></md-meter>color takes a theme role name, resolved at runtime to the
--md-sys-color-<role> / -<role>-container pair — fill on container. Any
role a theme defines works (color="brand"), not just the seven baseline ones.
The default (primary) keeps the progress-indicator’s neutral look: primary
fill on a secondary-container track.
| Reading | color |
|---|---|
| Neutral measurement | primary (default) |
| Healthy / plenty left | success |
| Approaching the limit | warning |
| Critical / exceeded | error |
| Informational level | info |
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" color="primary" label="primary" show-label show-value></md-meter>
<md-meter value="65" color="secondary" label="secondary" show-label show-value></md-meter>
<md-meter value="65" color="tertiary" label="tertiary" show-label show-value></md-meter>
<md-meter value="65" color="success" label="success" show-label show-value></md-meter>
<md-meter value="65" color="warning" label="warning" show-label show-value></md-meter>
<md-meter value="65" color="error" label="error" show-label show-value></md-meter>
<md-meter value="65" color="info" label="info" show-label show-value></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px', inlineSize: '100%', maxInlineSize: '360px' }}>
<MdMeter value="65" color="primary" label="primary" showLabel show-value></MdMeter>
<MdMeter value="65" color="secondary" label="secondary" showLabel show-value></MdMeter>
<MdMeter value="65" color="tertiary" label="tertiary" showLabel show-value></MdMeter>
<MdMeter value="65" color="success" label="success" showLabel show-value></MdMeter>
<MdMeter value="65" color="warning" label="warning" showLabel show-value></MdMeter>
<MdMeter value="65" color="error" label="error" showLabel show-value></MdMeter>
<MdMeter value="65" color="info" label="info" showLabel show-value></MdMeter>
</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; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" color="primary" label="primary" show-label show-value></md-meter>
<md-meter value="65" color="secondary" label="secondary" show-label show-value></md-meter>
<md-meter value="65" color="tertiary" label="tertiary" show-label show-value></md-meter>
<md-meter value="65" color="success" label="success" show-label show-value></md-meter>
<md-meter value="65" color="warning" label="warning" show-label show-value></md-meter>
<md-meter value="65" color="error" label="error" show-label show-value></md-meter>
<md-meter value="65" color="info" label="info" show-label show-value></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" color="primary" label="primary" show-label show-value></md-meter>
<md-meter value="65" color="secondary" label="secondary" show-label show-value></md-meter>
<md-meter value="65" color="tertiary" label="tertiary" show-label show-value></md-meter>
<md-meter value="65" color="success" label="success" show-label show-value></md-meter>
<md-meter value="65" color="warning" label="warning" show-label show-value></md-meter>
<md-meter value="65" color="error" label="error" show-label show-value></md-meter>
<md-meter value="65" color="info" label="info" show-label show-value></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" color="primary" label="primary" show-label show-value></md-meter>
<md-meter value="65" color="secondary" label="secondary" show-label show-value></md-meter>
<md-meter value="65" color="tertiary" label="tertiary" show-label show-value></md-meter>
<md-meter value="65" color="success" label="success" show-label show-value></md-meter>
<md-meter value="65" color="warning" label="warning" show-label show-value></md-meter>
<md-meter value="65" color="error" label="error" show-label show-value></md-meter>
<md-meter value="65" color="info" label="info" show-label show-value></md-meter>
</div>The canonical quota recipe switches the role as thresholds are crossed:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="45" color="success" label="Storage used" value-text="45 GB of 100 GB" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="Storage used" value-text="82 GB of 100 GB" show-label show-value></md-meter>
<md-meter value="96" color="error" label="Storage used" value-text="96 GB of 100 GB" show-label show-value></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px', inlineSize: '100%', maxInlineSize: '360px' }}>
<MdMeter value="45" color="success" label="Storage used" valueText="45 GB of 100 GB" showLabel show-value></MdMeter>
<MdMeter value="82" color="warning" label="Storage used" valueText="82 GB of 100 GB" showLabel show-value></MdMeter>
<MdMeter value="96" color="error" label="Storage used" valueText="96 GB of 100 GB" showLabel show-value></MdMeter>
</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; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="45" color="success" label="Storage used" value-text="45 GB of 100 GB" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="Storage used" value-text="82 GB of 100 GB" show-label show-value></md-meter>
<md-meter value="96" color="error" label="Storage used" value-text="96 GB of 100 GB" show-label show-value></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="45" color="success" label="Storage used" value-text="45 GB of 100 GB" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="Storage used" value-text="82 GB of 100 GB" show-label show-value></md-meter>
<md-meter value="96" color="error" label="Storage used" value-text="96 GB of 100 GB" show-label show-value></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="45" color="success" label="Storage used" value-text="45 GB of 100 GB" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="Storage used" value-text="82 GB of 100 GB" show-label show-value></md-meter>
<md-meter value="96" color="error" label="Storage used" value-text="96 GB of 100 GB" show-label show-value></md-meter>
</div>thickness is the track height in dp (default 4). It is density-scaled
(0.5px per rung) and floored at 2px; --md-meter-height overrides it entirely.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" thickness="2" label="2px"></md-meter>
<md-meter value="65" label="4px (default)"></md-meter>
<md-meter value="65" thickness="8" label="8px"></md-meter>
<md-meter value="65" thickness="12" label="12px"></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px', inlineSize: '100%', maxInlineSize: '360px' }}>
<MdMeter value="65" thickness="2" label="2px"></MdMeter>
<MdMeter value="65" label="4px (default)"></MdMeter>
<MdMeter value="65" thickness="8" label="8px"></MdMeter>
<MdMeter value="65" thickness="12" label="12px"></MdMeter>
</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; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" thickness="2" label="2px"></md-meter>
<md-meter value="65" label="4px (default)"></md-meter>
<md-meter value="65" thickness="8" label="8px"></md-meter>
<md-meter value="65" thickness="12" label="12px"></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" thickness="2" label="2px"></md-meter>
<md-meter value="65" label="4px (default)"></md-meter>
<md-meter value="65" thickness="8" label="8px"></md-meter>
<md-meter value="65" thickness="12" label="12px"></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" thickness="2" label="2px"></md-meter>
<md-meter value="65" label="4px (default)"></md-meter>
<md-meter value="65" thickness="8" label="8px"></md-meter>
<md-meter value="65" thickness="12" label="12px"></md-meter>
</div>variant="circular" draws the same reading as a ring. show-value puts the
value in the middle of it and show-label captions it underneath — the bar’s
header row doesn’t apply. size is the diameter in dp (default 48, clamped to
24–240); everything else — color, thickness, formatOptions, the ARIA
contract — behaves exactly as it does on the bar.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; align-items: flex-start; gap: 32px; flex-wrap: wrap;">
<md-meter variant="circular" value="72" show-value></md-meter>
<md-meter variant="circular" value="72" size="72" thickness="6" show-value show-label label="Storage"></md-meter>
<md-meter variant="circular" value="41" size="96" thickness="8" color="tertiary" show-value show-label label="Quota used"></md-meter>
<md-meter variant="circular" value="92" size="96" thickness="8" color="error" show-value show-label label="Almost full"></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', alignItems: 'flex-start', gap: '32px', flexWrap: 'wrap' }}>
<MdMeter variant="circular" value="72" show-value></MdMeter>
<MdMeter variant="circular" value="72" size="72" thickness="6" showValue showLabel label="Storage"></MdMeter>
<MdMeter variant="circular" value="41" size="96" thickness="8" color="tertiary" showValue showLabel label="Quota used"></MdMeter>
<MdMeter variant="circular" value="92" size="96" thickness="8" color="error" showValue showLabel label="Almost full"></MdMeter>
</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; align-items: flex-start; gap: 32px; flex-wrap: wrap;">
<md-meter variant="circular" value="72" show-value></md-meter>
<md-meter variant="circular" value="72" size="72" thickness="6" show-value show-label label="Storage"></md-meter>
<md-meter variant="circular" value="41" size="96" thickness="8" color="tertiary" show-value show-label label="Quota used"></md-meter>
<md-meter variant="circular" value="92" size="96" thickness="8" color="error" show-value show-label label="Almost full"></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; align-items: flex-start; gap: 32px; flex-wrap: wrap;">
<md-meter variant="circular" value="72" show-value></md-meter>
<md-meter variant="circular" value="72" size="72" thickness="6" show-value show-label label="Storage"></md-meter>
<md-meter variant="circular" value="41" size="96" thickness="8" color="tertiary" show-value show-label label="Quota used"></md-meter>
<md-meter variant="circular" value="92" size="96" thickness="8" color="error" show-value show-label label="Almost full"></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; align-items: flex-start; gap: 32px; flex-wrap: wrap;">
<md-meter variant="circular" value="72" show-value></md-meter>
<md-meter variant="circular" value="72" size="72" thickness="6" show-value show-label label="Storage"></md-meter>
<md-meter variant="circular" value="41" size="96" thickness="8" color="tertiary" show-value show-label label="Quota used"></md-meter>
<md-meter variant="circular" value="92" size="96" thickness="8" color="error" show-value show-label label="Almost full"></md-meter>
</div>The ring fills clockwise from twelve o’clock in every locale — it is not
mirrored under dir="rtl", matching Material’s circular progress indicator (and
a clock face). Only the caption text direction flips; see
The ring does not mirror below for the side-by-side.
md-meter emits no events — it is a pure read-only display, so there is
nothing to listen to and nothing to cancel.
| Event | Cancelable | Detail | Fires |
|---|---|---|---|
| none | — | — | A meter is a reading, not a control — drive it by setting value |
Drive it from your state layer instead: set value (and color, value-text)
and the fill animates to its new position over 300ms, zeroed under
prefers-reduced-motion. Press a threshold below — only value, value-text
and color change:
<md-meter id="quota" max="100" label="Storage used" show-label show-value></md-meter>
<script type="module">
const quota = document.getElementById('quota');
function setUsage(usedGb, totalGb) {
const ratio = usedGb / totalGb;
quota.max = totalGb;
quota.value = usedGb;
quota.valueText = usedGb + ' GB of ' + totalGb + ' GB';
quota.color = ratio >= 0.95 ? 'error' : ratio >= 0.8 ? 'warning' : 'success';
}
setUsage(45, 100);
</script>import { MdMeter } from '@awc-ui/react';
export function QuotaMeter({ usedGb, totalGb }: { usedGb: number; totalGb: number }) {
const ratio = usedGb / totalGb;
const color = ratio >= 0.95 ? 'error' : ratio >= 0.8 ? 'warning' : 'success';
return (
<MdMeter
value={usedGb}
max={totalGb}
color={color}
label="Storage used"
valueText={`${usedGb} GB of ${totalGb} GB`}
showLabel
showValue
/>
);
}import { Component, Input } from '@angular/core';
@Component({
selector: 'app-quota-meter',
template: `
<md-meter
[value]="usedGb"
[max]="totalGb"
[color]="color"
label="Storage used"
[valueText]="usedGb + ' GB of ' + totalGb + ' GB'"
show-label
show-value
></md-meter>
`,
})
export class QuotaMeterComponent {
@Input() usedGb = 0;
@Input() totalGb = 100;
get color() {
const ratio = this.usedGb / this.totalGb;
return ratio >= 0.95 ? 'error' : ratio >= 0.8 ? 'warning' : 'success';
}
}<script setup lang="ts">
import { computed } from 'vue';
const props = defineProps<{ usedGb: number; totalGb: number }>();
const color = computed(() => {
const ratio = props.usedGb / props.totalGb;
return ratio >= 0.95 ? 'error' : ratio >= 0.8 ? 'warning' : 'success';
});
</script>
<template>
<md-meter
:value="usedGb"
:max="totalGb"
:color="color"
label="Storage used"
:value-text="usedGb + ' GB of ' + totalGb + ' GB'"
show-label
show-value
/>
</template><script lang="ts">
export let usedGb = 0;
export let totalGb = 100;
$: ratio = usedGb / totalGb;
$: color = ratio >= 0.95 ? 'error' : ratio >= 0.8 ? 'warning' : 'success';
</script>
<md-meter
value={usedGb}
max={totalGb}
{color}
label="Storage used"
value-text="{usedGb} GB of {totalGb} GB"
show-label
show-value
/>| Property | Attribute | Type | Default | Reflects |
|---|---|---|---|---|
value | value | number | 0 | — |
min | min | number | 0 | — |
max | max | number | 100 | — |
label | label | string | '' | — |
showLabel | show-label | boolean | false | — |
showValue | show-value | boolean | false | — |
valueText | value-text | string | '' | — |
locale | locale | string | '' | — |
formatOptions | JS only | Intl.NumberFormatOptions | — | — |
color | color | | 'primary' | 'secondary' | 'tertiary' | 'error' | 'success' | 'warning' | 'info' | (string & {}) | 'primary' | Yes |
variant | variant | 'linear' | 'circular' | 'linear' | Yes |
size | size | number | 48 | — |
thickness | thickness | number | 4 | — |
density | density | 0 | -1 | -2 | -3 | -4 | 0 | Yes |
Override on the host element for per-instance theming:
| Property | Description |
|---|---|
--md-meter-indicator-color | Fill colour (defaults to the `color` role) |
--md-meter-track-color | Track background (defaults to the role's container) |
--md-meter-track-shape | Track + fill corner radius (default corner-full pill) |
--md-meter-height | Track thickness (overrides the `thickness` prop) |
--md-meter-label-color | Header label text colour |
--md-meter-value-color | Header value text colour |
--md-meter-size | Ring diameter (circular variant) |
Style internal elements through shadow DOM with ::part():
| Part | Description |
|---|---|
circular | The ring's box (circular variant only) |
track | Background track / ring (the full range) |
indicator | Value fill inside the track / the value arc |
value | Header value text (rendered when `show-value`) |
label | Header label text (rendered when `show-label`) |
role="meter",
aria-valuemin/aria-valuemax/aria-valuenow (clamped and sanitized), and
aria-valuetext carrying the human-readable formatted reading.label becomes aria-label — always set it; role="meter" needs an
accessible name.aria-hidden, so the visible header value is never
announced in addition to aria-valuetext.Inspect these three in the accessibility panel: the bar and the ring expose an
identical host contract — role="meter", the same aria-valuenow and the same
aria-valuetext — because the shape is presentational and the semantics never
move into the shadow root. Tab through them and nothing takes focus.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
<md-meter value="3" max="10" label="Seats taken" value-text="3 of 10 seats" show-label show-value></md-meter>
<md-meter variant="circular" value="65" size="72" label="Storage used" show-value show-label></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px', inlineSize: '100%', maxInlineSize: '360px' }}>
<MdMeter value="65" label="Storage used" showLabel show-value></MdMeter>
<MdMeter value="3" max="10" label="Seats taken" valueText="3 of 10 seats" showLabel show-value></MdMeter>
<MdMeter variant="circular" value="65" size="72" label="Storage used" showValue show-label></MdMeter>
</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; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
<md-meter value="3" max="10" label="Seats taken" value-text="3 of 10 seats" show-label show-value></md-meter>
<md-meter variant="circular" value="65" size="72" label="Storage used" show-value show-label></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
<md-meter value="3" max="10" label="Seats taken" value-text="3 of 10 seats" show-label show-value></md-meter>
<md-meter variant="circular" value="65" size="72" label="Storage used" show-value show-label></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
<md-meter value="3" max="10" label="Seats taken" value-text="3 of 10 seats" show-label show-value></md-meter>
<md-meter variant="circular" value="65" size="72" label="Storage used" show-value show-label></md-meter>
</div>The accessibility story scripts these assertions against the live component.
RTL — the bar’s geometry is 100% CSS logical properties: the fill anchors to
the inline start and grows toward the inline end, so under dir="rtl" the whole
meter mirrors with no configuration. The header row swaps with it — label to the
right, value to the left. See RTL and the
RTL story.
<div dir="rtl"> <md-meter value="65" label="التخزين المستخدم" locale="ar" show-label show-value></md-meter></div>The same meter in both directions. Nothing is re-authored between the two
rows — only dir (and the already-localized label/locale) changes:
<!-- 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="max-inline-size:360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="max-inline-size:360px;">
<md-meter value="65" label="التخزين المستخدم" locale="ar" show-label show-value></md-meter>
</div>
</div>import { MdMeter } 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={{ maxInlineSize: '360px' }}>
<MdMeter value="65" label="Storage used" showLabel show-value></MdMeter>
</div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>rtl</span>
<div dir="rtl" style={{ maxInlineSize: '360px' }}>
<MdMeter value="65" label="التخزين المستخدم" locale="ar" showLabel show-value></MdMeter>
</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="max-inline-size:360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="max-inline-size:360px;">
<md-meter value="65" label="التخزين المستخدم" locale="ar" show-label show-value></md-meter>
</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="max-inline-size:360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="max-inline-size:360px;">
<md-meter value="65" label="التخزين المستخدم" locale="ar" show-label show-value></md-meter>
</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="max-inline-size:360px;">
<md-meter value="65" label="Storage used" show-label show-value></md-meter>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="max-inline-size:360px;">
<md-meter value="65" label="التخزين المستخدم" locale="ar" show-label show-value></md-meter>
</div>
</div>The bar flips because it is a box on the inline axis. The ring is a clock face:
it fills clockwise from twelve o’clock in every locale, matching Material’s
circular progress indicator. Only the centred value and the caption follow the
text direction — never add your own scaleX(-1).
<!-- 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:24px;flex-wrap:wrap;align-items:flex-start;">
<md-meter variant="circular" value="65" size="72" label="Storage" show-value show-label></md-meter>
<md-meter variant="circular" value="92" size="72" color="error" label="Almost full" show-value show-label></md-meter>
</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:24px;flex-wrap:wrap;align-items:flex-start;">
<md-meter variant="circular" value="65" size="72" label="التخزين" locale="ar" show-value show-label></md-meter>
<md-meter variant="circular" value="92" size="72" color="error" label="ممتلئ تقريبا" locale="ar" show-value show-label></md-meter>
</div>
</div>import { MdMeter } 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: '24px', flexWrap: 'wrap', alignItems: 'flex-start' }}>
<MdMeter variant="circular" value="65" size="72" label="Storage" showValue show-label></MdMeter>
<MdMeter variant="circular" value="92" size="72" color="error" label="Almost full" showValue show-label></MdMeter>
</div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>rtl</span>
<div dir="rtl" style={{ display: 'flex', gap: '24px', flexWrap: 'wrap', alignItems: 'flex-start' }}>
<MdMeter variant="circular" value="65" size="72" label="التخزين" locale="ar" showValue show-label></MdMeter>
<MdMeter variant="circular" value="92" size="72" color="error" label="ممتلئ تقريبا" locale="ar" showValue show-label></MdMeter>
</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:24px;flex-wrap:wrap;align-items:flex-start;">
<md-meter variant="circular" value="65" size="72" label="Storage" show-value show-label></md-meter>
<md-meter variant="circular" value="92" size="72" color="error" label="Almost full" show-value show-label></md-meter>
</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:24px;flex-wrap:wrap;align-items:flex-start;">
<md-meter variant="circular" value="65" size="72" label="التخزين" locale="ar" show-value show-label></md-meter>
<md-meter variant="circular" value="92" size="72" color="error" label="ممتلئ تقريبا" locale="ar" show-value show-label></md-meter>
</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:24px;flex-wrap:wrap;align-items:flex-start;">
<md-meter variant="circular" value="65" size="72" label="Storage" show-value show-label></md-meter>
<md-meter variant="circular" value="92" size="72" color="error" label="Almost full" show-value show-label></md-meter>
</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:24px;flex-wrap:wrap;align-items:flex-start;">
<md-meter variant="circular" value="65" size="72" label="التخزين" locale="ar" show-value show-label></md-meter>
<md-meter variant="circular" value="92" size="72" color="error" label="ممتلئ تقريبا" locale="ar" show-value show-label></md-meter>
</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:24px;flex-wrap:wrap;align-items:flex-start;">
<md-meter variant="circular" value="65" size="72" label="Storage" show-value show-label></md-meter>
<md-meter variant="circular" value="92" size="72" color="error" label="Almost full" show-value show-label></md-meter>
</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:24px;flex-wrap:wrap;align-items:flex-start;">
<md-meter variant="circular" value="65" size="72" label="التخزين" locale="ar" show-value show-label></md-meter>
<md-meter variant="circular" value="92" size="72" color="error" label="ممتلئ تقريبا" locale="ar" show-value show-label></md-meter>
</div>
</div>density="-1…-4" thins the track (4px down to the 2px floor at -4) and
tightens the header spacing and type. Those four rungs locally override an
inherited global data-density; density="0" is the default and means
“inherit whatever the ancestor says”. All five rungs, both shapes, same meter:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 24px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" density="0" label="Density 0 — default" show-label show-value></md-meter>
<md-meter value="65" density="-1" label="Density -1" show-label show-value></md-meter>
<md-meter value="65" density="-2" label="Density -2" show-label show-value></md-meter>
<md-meter value="65" density="-3" label="Density -3" show-label show-value></md-meter>
<md-meter value="65" density="-4" label="Density -4 — 2px floor" show-label show-value></md-meter>
</div>
<div style="display: flex; align-items: flex-start; gap: 28px; flex-wrap: wrap; margin-block-start: 32px;">
<md-meter variant="circular" value="65" size="72" thickness="6" density="0" label="0" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-1" label="-1" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-2" label="-2" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-3" label="-3" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-4" label="-4" show-value show-label></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', flexDirection: 'column', gap: '24px', inlineSize: '100%', maxInlineSize: '360px' }}>
<MdMeter value="65" density="0" label="Density 0 — default" showLabel show-value></MdMeter>
<MdMeter value="65" density="-1" label="Density -1" showLabel show-value></MdMeter>
<MdMeter value="65" density="-2" label="Density -2" showLabel show-value></MdMeter>
<MdMeter value="65" density="-3" label="Density -3" showLabel show-value></MdMeter>
<MdMeter value="65" density="-4" label="Density -4 — 2px floor" showLabel show-value></MdMeter>
</div>
<div style={{ display: 'flex', alignItems: 'flex-start', gap: '28px', flexWrap: 'wrap', marginBlockStart: '32px' }}>
<MdMeter variant="circular" value="65" size="72" thickness="6" density="0" label="0" showValue show-label></MdMeter>
<MdMeter variant="circular" value="65" size="72" thickness="6" density="-1" label="-1" showValue show-label></MdMeter>
<MdMeter variant="circular" value="65" size="72" thickness="6" density="-2" label="-2" showValue show-label></MdMeter>
<MdMeter variant="circular" value="65" size="72" thickness="6" density="-3" label="-3" showValue show-label></MdMeter>
<MdMeter variant="circular" value="65" size="72" thickness="6" density="-4" label="-4" showValue show-label></MdMeter>
</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; flex-direction: column; gap: 24px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" density="0" label="Density 0 — default" show-label show-value></md-meter>
<md-meter value="65" density="-1" label="Density -1" show-label show-value></md-meter>
<md-meter value="65" density="-2" label="Density -2" show-label show-value></md-meter>
<md-meter value="65" density="-3" label="Density -3" show-label show-value></md-meter>
<md-meter value="65" density="-4" label="Density -4 — 2px floor" show-label show-value></md-meter>
</div>
<div style="display: flex; align-items: flex-start; gap: 28px; flex-wrap: wrap; margin-block-start: 32px;">
<md-meter variant="circular" value="65" size="72" thickness="6" density="0" label="0" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-1" label="-1" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-2" label="-2" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-3" label="-3" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-4" label="-4" show-value show-label></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; flex-direction: column; gap: 24px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" density="0" label="Density 0 — default" show-label show-value></md-meter>
<md-meter value="65" density="-1" label="Density -1" show-label show-value></md-meter>
<md-meter value="65" density="-2" label="Density -2" show-label show-value></md-meter>
<md-meter value="65" density="-3" label="Density -3" show-label show-value></md-meter>
<md-meter value="65" density="-4" label="Density -4 — 2px floor" show-label show-value></md-meter>
</div>
<div style="display: flex; align-items: flex-start; gap: 28px; flex-wrap: wrap; margin-block-start: 32px;">
<md-meter variant="circular" value="65" size="72" thickness="6" density="0" label="0" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-1" label="-1" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-2" label="-2" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-3" label="-3" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-4" label="-4" show-value show-label></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 24px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" density="0" label="Density 0 — default" show-label show-value></md-meter>
<md-meter value="65" density="-1" label="Density -1" show-label show-value></md-meter>
<md-meter value="65" density="-2" label="Density -2" show-label show-value></md-meter>
<md-meter value="65" density="-3" label="Density -3" show-label show-value></md-meter>
<md-meter value="65" density="-4" label="Density -4 — 2px floor" show-label show-value></md-meter>
</div>
<div style="display: flex; align-items: flex-start; gap: 28px; flex-wrap: wrap; margin-block-start: 32px;">
<md-meter variant="circular" value="65" size="72" thickness="6" density="0" label="0" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-1" label="-1" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-2" label="-2" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-3" label="-3" show-value show-label></md-meter>
<md-meter variant="circular" value="65" size="72" thickness="6" density="-4" label="-4" show-value show-label></md-meter>
</div>The two are independent signals, so they compose without any extra wiring — and
a local density="-1…-4" still wins over the inherited rung. Going the other
way — back out of an inherited rung — needs the custom property rather than
density="0", so the last meter below sets --md-sys-density-scale: 0 inline:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div dir="rtl" data-density="-2" style="display:flex;flex-direction:column;gap:20px;max-inline-size:360px;">
<md-meter value="45" color="success" label="التخزين المستخدم" locale="ar" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="الحصة المستخدمة" locale="ar" show-label show-value></md-meter>
<md-meter value="96" color="error" density="-4" label="كثافة -4 محليا" locale="ar" show-label show-value></md-meter>
<md-meter value="30" label="إعادة الضبط إلى الرقم صفر" locale="ar" style="--md-sys-density-scale: 0;" show-label show-value></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div dir="rtl" data-density="-2" style={{ display: 'flex', flexDirection: 'column', gap: '20px', maxInlineSize: '360px' }}>
<MdMeter value="45" color="success" label="التخزين المستخدم" locale="ar" showLabel show-value></MdMeter>
<MdMeter value="82" color="warning" label="الحصة المستخدمة" locale="ar" showLabel show-value></MdMeter>
<MdMeter value="96" color="error" density="-4" label="كثافة -4 محليا" locale="ar" showLabel show-value></MdMeter>
<MdMeter value="30" label="إعادة الضبط إلى الرقم صفر" locale="ar" style={{ '--md-sys-density-scale': '0' }} showLabel show-value></MdMeter>
</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" data-density="-2" style="display:flex;flex-direction:column;gap:20px;max-inline-size:360px;">
<md-meter value="45" color="success" label="التخزين المستخدم" locale="ar" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="الحصة المستخدمة" locale="ar" show-label show-value></md-meter>
<md-meter value="96" color="error" density="-4" label="كثافة -4 محليا" locale="ar" show-label show-value></md-meter>
<md-meter value="30" label="إعادة الضبط إلى الرقم صفر" locale="ar" style="--md-sys-density-scale: 0;" show-label show-value></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div dir="rtl" data-density="-2" style="display:flex;flex-direction:column;gap:20px;max-inline-size:360px;">
<md-meter value="45" color="success" label="التخزين المستخدم" locale="ar" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="الحصة المستخدمة" locale="ar" show-label show-value></md-meter>
<md-meter value="96" color="error" density="-4" label="كثافة -4 محليا" locale="ar" show-label show-value></md-meter>
<md-meter value="30" label="إعادة الضبط إلى الرقم صفر" locale="ar" style="--md-sys-density-scale: 0;" show-label show-value></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div dir="rtl" data-density="-2" style="display:flex;flex-direction:column;gap:20px;max-inline-size:360px;">
<md-meter value="45" color="success" label="التخزين المستخدم" locale="ar" show-label show-value></md-meter>
<md-meter value="82" color="warning" label="الحصة المستخدمة" locale="ar" show-label show-value></md-meter>
<md-meter value="96" color="error" density="-4" label="كثافة -4 محليا" locale="ar" show-label show-value></md-meter>
<md-meter value="30" label="إعادة الضبط إلى الرقم صفر" locale="ar" style="--md-sys-density-scale: 0;" show-label show-value></md-meter>
</div>Density — density="-1…-4" locally overrides the inherited data-density
rung (0 inherits it); on the ring it shrinks the whole circle 2px per rung
(floored at 24px) so radius and stroke stay in proportion. See the
Density story and
Density.
i18n — label and value-text are plain text props: resolve them in your
i18n layer. locale + formatOptions cover the Intl side — digits,
separators, percent signs, units and currencies all follow the locale. See the
Localization story.
| Custom property | Purpose | Default |
|---|---|---|
--md-meter-indicator-color | Fill colour | The color role (primary) |
--md-meter-track-color | Track background | The role’s container (secondary-container) |
--md-meter-track-shape | Track + fill corner radius | --md-sys-shape-corner-full |
--md-meter-height | Track thickness | thickness prop (4px, density-scaled) |
--md-meter-size | Ring diameter (circular only) | size prop (48px, density-scaled) |
--md-meter-label-color | Header label text | --md-sys-color-on-surface |
--md-meter-value-color | Header value text | --md-sys-color-on-surface-variant |
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Brand colours" style="--md-meter-indicator-color: #6200ee; --md-meter-track-color: #e0d4f5;"></md-meter>
<md-meter value="65" label="Square corners" style="--md-meter-track-shape: 2px;"></md-meter>
<md-meter value="65" label="Tall track" style="--md-meter-height: 12px;"></md-meter>
<md-meter variant="circular" value="65" label="Bigger ring" show-value style="--md-meter-size: 96px;"></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px', inlineSize: '100%', maxInlineSize: '360px' }}>
<MdMeter value="65" label="Brand colours" style={{ '--md-meter-indicator-color': '#6200ee', '--md-meter-track-color': '#e0d4f5' }}></MdMeter>
<MdMeter value="65" label="Square corners" style={{ '--md-meter-track-shape': '2px' }}></MdMeter>
<MdMeter value="65" label="Tall track" style={{ '--md-meter-height': '12px' }}></MdMeter>
<MdMeter variant="circular" value="65" label="Bigger ring" showValue style={{ '--md-meter-size': '96px' }}></MdMeter>
</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; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Brand colours" style="--md-meter-indicator-color: #6200ee; --md-meter-track-color: #e0d4f5;"></md-meter>
<md-meter value="65" label="Square corners" style="--md-meter-track-shape: 2px;"></md-meter>
<md-meter value="65" label="Tall track" style="--md-meter-height: 12px;"></md-meter>
<md-meter variant="circular" value="65" label="Bigger ring" show-value style="--md-meter-size: 96px;"></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Brand colours" style="--md-meter-indicator-color: #6200ee; --md-meter-track-color: #e0d4f5;"></md-meter>
<md-meter value="65" label="Square corners" style="--md-meter-track-shape: 2px;"></md-meter>
<md-meter value="65" label="Tall track" style="--md-meter-height: 12px;"></md-meter>
<md-meter variant="circular" value="65" label="Bigger ring" show-value style="--md-meter-size: 96px;"></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter value="65" label="Brand colours" style="--md-meter-indicator-color: #6200ee; --md-meter-track-color: #e0d4f5;"></md-meter>
<md-meter value="65" label="Square corners" style="--md-meter-track-shape: 2px;"></md-meter>
<md-meter value="65" label="Tall track" style="--md-meter-height: 12px;"></md-meter>
<md-meter variant="circular" value="65" label="Bigger ring" show-value style="--md-meter-size: 96px;"></md-meter>
</div>CSS parts — track, indicator, label, value, and circular (the
ring’s box). track and indicator name the bar’s two divs on the linear
variant and the two SVG circles on the circular one, so one ::part() rule
survives a variant swap. Use them for what a colour token cannot express —
gradients, opacity, filters:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<style>
.meter-gradient::part(indicator) { background: linear-gradient(to right, #1a237e, #7c4dff, #ce93d8); }
.meter-subtle::part(track) { opacity: 0.35; }
.meter-strong::part(label) { font-weight: 700; text-transform: uppercase; letter-spacing: .08em; }
.meter-boxed::part(value) {
padding: 1px 6px;
border-radius: 6px;
background: var(--md-sys-color-secondary-container);
color: var(--md-sys-color-on-secondary-container);
}
</style>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter class="meter-gradient" value="65" label="Gradient indicator" show-label show-value></md-meter>
<md-meter class="meter-subtle" value="40" label="Faded track" show-label show-value></md-meter>
<md-meter class="meter-strong meter-boxed" value="65" label="Styled label and value" show-label show-value></md-meter>
</div>import { MdMeter } from '@awc-ui/react';
export function Demo() {
return (
<>
<style>
.meter-gradient::part(indicator) { background: linear-gradient(to right, #1a237e, #7c4dff, #ce93d8); }
.meter-subtle::part(track) { opacity: 0.35; }
.meter-strong::part(label) { font-weight: 700; text-transform: uppercase; letter-spacing: .08em; }
.meter-boxed::part(value) {
padding: 1px 6px;
border-radius: 6px;
background: var(--md-sys-color-secondary-container);
color: var(--md-sys-color-on-secondary-container);
}
</style>
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px', inlineSize: '100%', maxInlineSize: '360px' }}>
<MdMeter className="meter-gradient" value="65" label="Gradient indicator" showLabel show-value></MdMeter>
<MdMeter className="meter-subtle" value="40" label="Faded track" showLabel show-value></MdMeter>
<MdMeter className="meter-strong meter-boxed" value="65" label="Styled label and value" showLabel show-value></MdMeter>
</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 -->
<style>
.meter-gradient::part(indicator) { background: linear-gradient(to right, #1a237e, #7c4dff, #ce93d8); }
.meter-subtle::part(track) { opacity: 0.35; }
.meter-strong::part(label) { font-weight: 700; text-transform: uppercase; letter-spacing: .08em; }
.meter-boxed::part(value) {
padding: 1px 6px;
border-radius: 6px;
background: var(--md-sys-color-secondary-container);
color: var(--md-sys-color-on-secondary-container);
}
</style>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter class="meter-gradient" value="65" label="Gradient indicator" show-label show-value></md-meter>
<md-meter class="meter-subtle" value="40" label="Faded track" show-label show-value></md-meter>
<md-meter class="meter-strong meter-boxed" value="65" label="Styled label and value" show-label show-value></md-meter>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<style>
.meter-gradient::part(indicator) { background: linear-gradient(to right, #1a237e, #7c4dff, #ce93d8); }
.meter-subtle::part(track) { opacity: 0.35; }
.meter-strong::part(label) { font-weight: 700; text-transform: uppercase; letter-spacing: .08em; }
.meter-boxed::part(value) {
padding: 1px 6px;
border-radius: 6px;
background: var(--md-sys-color-secondary-container);
color: var(--md-sys-color-on-secondary-container);
}
</style>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter class="meter-gradient" value="65" label="Gradient indicator" show-label show-value></md-meter>
<md-meter class="meter-subtle" value="40" label="Faded track" show-label show-value></md-meter>
<md-meter class="meter-strong meter-boxed" value="65" label="Styled label and value" show-label show-value></md-meter>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<style>
.meter-gradient::part(indicator) { background: linear-gradient(to right, #1a237e, #7c4dff, #ce93d8); }
.meter-subtle::part(track) { opacity: 0.35; }
.meter-strong::part(label) { font-weight: 700; text-transform: uppercase; letter-spacing: .08em; }
.meter-boxed::part(value) {
padding: 1px 6px;
border-radius: 6px;
background: var(--md-sys-color-secondary-container);
color: var(--md-sys-color-on-secondary-container);
}
</style>
<div style="display: flex; flex-direction: column; gap: 20px; inline-size: 100%; max-inline-size: 360px;">
<md-meter class="meter-gradient" value="65" label="Gradient indicator" show-label show-value></md-meter>
<md-meter class="meter-subtle" value="40" label="Faded track" show-label show-value></md-meter>
<md-meter class="meter-strong meter-boxed" value="65" label="Styled label and value" show-label show-value></md-meter>
</div>Check any override in both themes — the dark-theme story is the counterpart to the stories above.
md-progress-indicator ·
md-loading-indicator ·
md-slider ·
md-rating ·
md-status-dot ·
md-badge
md-meterTwo 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-meter 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.