md-button 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 discrete, committed action — Save, Confirm, Next. Five emphasis levels,
five sizes, round or square with M3-Expressive shape morphing, optional toggle
mode, and native form participation via ElementInternals.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled">Filled</md-button>
<md-button variant="tonal">Tonal</md-button>
<md-button variant="elevated">Elevated</md-button>
<md-button variant="outlined">Outlined</md-button>
<md-button variant="text">Text</md-button>import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled">Filled</MdButton>
<MdButton variant="tonal">Tonal</MdButton>
<MdButton variant="elevated">Elevated</MdButton>
<MdButton variant="outlined">Outlined</MdButton>
<MdButton variant="text">Text</MdButton>
</>
);
}// 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-button variant="filled">Filled</md-button>
<md-button variant="tonal">Tonal</md-button>
<md-button variant="elevated">Elevated</md-button>
<md-button variant="outlined">Outlined</md-button>
<md-button variant="text">Text</md-button><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled">Filled</md-button>
<md-button variant="tonal">Tonal</md-button>
<md-button variant="elevated">Elevated</md-button>
<md-button variant="outlined">Outlined</md-button>
<md-button variant="text">Text</md-button>
</template><script>
import '@awc-ui/core/define';
</script>
<md-button variant="filled">Filled</md-button>
<md-button variant="tonal">Tonal</md-button>
<md-button variant="elevated">Elevated</md-button>
<md-button variant="outlined">Outlined</md-button>
<md-button variant="text">Text</md-button>
Already installed? See the
Installation guide for one-time package setup
(core + tokens, fonts). Each tab below shows two patterns for using
md-button 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-button) ─── -->
<script type="module">
import '@awc-ui/core/components/md-button';
</script>
<md-button>Save</md-button>// ─── 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 { MdButton } from '@awc-ui/react';
export function Example() {
return <MdButton>Save</MdButton>;
}
// ─── Option B: single import (tree-shake to only md-button) ───
// 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-button';
export function ExampleTreeShaken() {
return <md-button>Save</md-button>;
}// ─── 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-button>Save</md-button>`,
})
export class ExampleComponent {}
// ─── Option B: typed directive (tree-shake friendly) ───
// Pair with `import '@awc-ui/core/components/md-button'` in main.ts.
import { Component } from '@angular/core';
import { MdButton } from '@awc-ui/angular';
@Component({
standalone: true,
imports: [MdButton],
template: `<md-button>Save</md-button>`,
})
export class ExampleTreeShakenComponent {}<!-- ─── Option A: typed Vue wrapper (registers all components) ─── -->
<script setup lang="ts">
import { MdButton } from '@awc-ui/vue';
</script>
<template>
<MdButton>Save</MdButton>
</template>
<!-- ─── Option B: single import (tree-shake to only md-button) ─── -->
<script setup lang="ts">
import '@awc-ui/core/components/md-button';
</script>
<template>
<md-button>Save</md-button>
</template><!-- ─── Option A: global registration (done once in main entry) ─── -->
<!-- main.ts: -->
<!-- import { defineCustomElements } from '@awc-ui/svelte'; -->
<!-- defineCustomElements(window); -->
<md-button>Save</md-button>
<!-- ─── Option B: single import (tree-shake to only md-button) ─── -->
<script lang="ts">
import '@awc-ui/core/components/md-button';
</script>
<md-button>Save</md-button>Save, Confirm, Join now.<form>.| Situation | Use instead |
|---|---|
| Icon-only affordance, no label | md-icon-button |
| Navigating between app destinations | md-navigation-bar, md-navigation-rail, or a text link |
| The single most prominent action (mobile) | md-fab |
| 3+ related actions acting as one unit | md-button-group |
| One primary action plus variations of it | md-split-button |
| Filtering, attributes, removable entries | md-chip |
| Low-priority actions crowding the UI | Overflow md-menu |
Pick by emphasis, highest first. M3: use the strongest style sparingly —
ideally one filled button per screen.
| Variant | Emphasis | Use for |
|---|---|---|
filled | Highest | The one flow-completing action |
tonal | High-ish | Lower priority, more weight than an outline |
elevated | Medium | Needs separation from a busy background |
outlined | Medium | Important, but not primary |
text | Lowest | Several options side by side; dialogs, cards |
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled">Filled</md-button>
<md-button variant="tonal">Tonal</md-button>
<md-button variant="elevated">Elevated</md-button>
<md-button variant="outlined">Outlined</md-button>
<md-button variant="text">Text</md-button>import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled">Filled</MdButton>
<MdButton variant="tonal">Tonal</MdButton>
<MdButton variant="elevated">Elevated</MdButton>
<MdButton variant="outlined">Outlined</MdButton>
<MdButton variant="text">Text</MdButton>
</>
);
}// 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-button variant="filled">Filled</md-button>
<md-button variant="tonal">Tonal</md-button>
<md-button variant="elevated">Elevated</md-button>
<md-button variant="outlined">Outlined</md-button>
<md-button variant="text">Text</md-button><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled">Filled</md-button>
<md-button variant="tonal">Tonal</md-button>
<md-button variant="elevated">Elevated</md-button>
<md-button variant="outlined">Outlined</md-button>
<md-button variant="text">Text</md-button>
</template><script>
import '@awc-ui/core/define';
</script>
<md-button variant="filled">Filled</md-button>
<md-button variant="tonal">Tonal</md-button>
<md-button variant="elevated">Elevated</md-button>
<md-button variant="outlined">Outlined</md-button>
<md-button variant="text">Text</md-button>| Size | Height | Typical use |
|---|---|---|
xs | 32px | Dense tables, toolbars, inline row actions |
sm | 40px | Default. Standard UI density |
md | 48px | Comfortable / touch-first forms |
lg | 56px | Primary CTA on a landing surface |
xl | 96px | Hero / marketing CTA |
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button size="xs">Extra small</md-button>
<md-button size="sm">Small</md-button>
<md-button size="md">Medium</md-button>
<md-button size="lg">Large</md-button>import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton size="xs">Extra small</MdButton>
<MdButton size="sm">Small</MdButton>
<MdButton size="md">Medium</MdButton>
<MdButton size="lg">Large</MdButton>
</>
);
}// 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-button size="xs">Extra small</md-button>
<md-button size="sm">Small</md-button>
<md-button size="md">Medium</md-button>
<md-button size="lg">Large</md-button><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-button size="xs">Extra small</md-button>
<md-button size="sm">Small</md-button>
<md-button size="md">Medium</md-button>
<md-button size="lg">Large</md-button>
</template><script>
import '@awc-ui/core/define';
</script>
<md-button size="xs">Extra small</md-button>
<md-button size="sm">Small</md-button>
<md-button size="md">Medium</md-button>
<md-button size="lg">Large</md-button>Every variant is available at every size. The full matrix, so you can see how weight and scale interact:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">filled</span>
<md-button variant="filled" size="xs">XS</md-button>
<md-button variant="filled" size="sm">SM</md-button>
<md-button variant="filled" size="md">MD</md-button>
<md-button variant="filled" size="lg">LG</md-button>
<md-button variant="filled" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">tonal</span>
<md-button variant="tonal" size="xs">XS</md-button>
<md-button variant="tonal" size="sm">SM</md-button>
<md-button variant="tonal" size="md">MD</md-button>
<md-button variant="tonal" size="lg">LG</md-button>
<md-button variant="tonal" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">elevated</span>
<md-button variant="elevated" size="xs">XS</md-button>
<md-button variant="elevated" size="sm">SM</md-button>
<md-button variant="elevated" size="md">MD</md-button>
<md-button variant="elevated" size="lg">LG</md-button>
<md-button variant="elevated" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">outlined</span>
<md-button variant="outlined" size="xs">XS</md-button>
<md-button variant="outlined" size="sm">SM</md-button>
<md-button variant="outlined" size="md">MD</md-button>
<md-button variant="outlined" size="lg">LG</md-button>
<md-button variant="outlined" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">text</span>
<md-button variant="text" size="xs">XS</md-button>
<md-button variant="text" size="sm">SM</md-button>
<md-button variant="text" size="md">MD</md-button>
<md-button variant="text" size="lg">LG</md-button>
<md-button variant="text" size="xl">XL</md-button>
</div>import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', gap: '12px', alignItems: 'center', marginBlockEnd: '12px' }}>
<span style={{ inlineSize: '4.5rem', opacity: '.7', fontSize: '.8rem' }}>filled</span>
<MdButton variant="filled" size="xs">XS</MdButton>
<MdButton variant="filled" size="sm">SM</MdButton>
<MdButton variant="filled" size="md">MD</MdButton>
<MdButton variant="filled" size="lg">LG</MdButton>
<MdButton variant="filled" size="xl">XL</MdButton>
</div>
<div style={{ display: 'flex', gap: '12px', alignItems: 'center', marginBlockEnd: '12px' }}>
<span style={{ inlineSize: '4.5rem', opacity: '.7', fontSize: '.8rem' }}>tonal</span>
<MdButton variant="tonal" size="xs">XS</MdButton>
<MdButton variant="tonal" size="sm">SM</MdButton>
<MdButton variant="tonal" size="md">MD</MdButton>
<MdButton variant="tonal" size="lg">LG</MdButton>
<MdButton variant="tonal" size="xl">XL</MdButton>
</div>
<div style={{ display: 'flex', gap: '12px', alignItems: 'center', marginBlockEnd: '12px' }}>
<span style={{ inlineSize: '4.5rem', opacity: '.7', fontSize: '.8rem' }}>elevated</span>
<MdButton variant="elevated" size="xs">XS</MdButton>
<MdButton variant="elevated" size="sm">SM</MdButton>
<MdButton variant="elevated" size="md">MD</MdButton>
<MdButton variant="elevated" size="lg">LG</MdButton>
<MdButton variant="elevated" size="xl">XL</MdButton>
</div>
<div style={{ display: 'flex', gap: '12px', alignItems: 'center', marginBlockEnd: '12px' }}>
<span style={{ inlineSize: '4.5rem', opacity: '.7', fontSize: '.8rem' }}>outlined</span>
<MdButton variant="outlined" size="xs">XS</MdButton>
<MdButton variant="outlined" size="sm">SM</MdButton>
<MdButton variant="outlined" size="md">MD</MdButton>
<MdButton variant="outlined" size="lg">LG</MdButton>
<MdButton variant="outlined" size="xl">XL</MdButton>
</div>
<div style={{ display: 'flex', gap: '12px', alignItems: 'center', marginBlockEnd: '12px' }}>
<span style={{ inlineSize: '4.5rem', opacity: '.7', fontSize: '.8rem' }}>text</span>
<MdButton variant="text" size="xs">XS</MdButton>
<MdButton variant="text" size="sm">SM</MdButton>
<MdButton variant="text" size="md">MD</MdButton>
<MdButton variant="text" size="lg">LG</MdButton>
<MdButton variant="text" size="xl">XL</MdButton>
</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:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">filled</span>
<md-button variant="filled" size="xs">XS</md-button>
<md-button variant="filled" size="sm">SM</md-button>
<md-button variant="filled" size="md">MD</md-button>
<md-button variant="filled" size="lg">LG</md-button>
<md-button variant="filled" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">tonal</span>
<md-button variant="tonal" size="xs">XS</md-button>
<md-button variant="tonal" size="sm">SM</md-button>
<md-button variant="tonal" size="md">MD</md-button>
<md-button variant="tonal" size="lg">LG</md-button>
<md-button variant="tonal" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">elevated</span>
<md-button variant="elevated" size="xs">XS</md-button>
<md-button variant="elevated" size="sm">SM</md-button>
<md-button variant="elevated" size="md">MD</md-button>
<md-button variant="elevated" size="lg">LG</md-button>
<md-button variant="elevated" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">outlined</span>
<md-button variant="outlined" size="xs">XS</md-button>
<md-button variant="outlined" size="sm">SM</md-button>
<md-button variant="outlined" size="md">MD</md-button>
<md-button variant="outlined" size="lg">LG</md-button>
<md-button variant="outlined" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">text</span>
<md-button variant="text" size="xs">XS</md-button>
<md-button variant="text" size="sm">SM</md-button>
<md-button variant="text" size="md">MD</md-button>
<md-button variant="text" size="lg">LG</md-button>
<md-button variant="text" size="xl">XL</md-button>
</div><script setup>
import '@awc-ui/core/define';
</script>
<template>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">filled</span>
<md-button variant="filled" size="xs">XS</md-button>
<md-button variant="filled" size="sm">SM</md-button>
<md-button variant="filled" size="md">MD</md-button>
<md-button variant="filled" size="lg">LG</md-button>
<md-button variant="filled" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">tonal</span>
<md-button variant="tonal" size="xs">XS</md-button>
<md-button variant="tonal" size="sm">SM</md-button>
<md-button variant="tonal" size="md">MD</md-button>
<md-button variant="tonal" size="lg">LG</md-button>
<md-button variant="tonal" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">elevated</span>
<md-button variant="elevated" size="xs">XS</md-button>
<md-button variant="elevated" size="sm">SM</md-button>
<md-button variant="elevated" size="md">MD</md-button>
<md-button variant="elevated" size="lg">LG</md-button>
<md-button variant="elevated" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">outlined</span>
<md-button variant="outlined" size="xs">XS</md-button>
<md-button variant="outlined" size="sm">SM</md-button>
<md-button variant="outlined" size="md">MD</md-button>
<md-button variant="outlined" size="lg">LG</md-button>
<md-button variant="outlined" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">text</span>
<md-button variant="text" size="xs">XS</md-button>
<md-button variant="text" size="sm">SM</md-button>
<md-button variant="text" size="md">MD</md-button>
<md-button variant="text" size="lg">LG</md-button>
<md-button variant="text" size="xl">XL</md-button>
</div>
</template><script>
import '@awc-ui/core/define';
</script>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">filled</span>
<md-button variant="filled" size="xs">XS</md-button>
<md-button variant="filled" size="sm">SM</md-button>
<md-button variant="filled" size="md">MD</md-button>
<md-button variant="filled" size="lg">LG</md-button>
<md-button variant="filled" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">tonal</span>
<md-button variant="tonal" size="xs">XS</md-button>
<md-button variant="tonal" size="sm">SM</md-button>
<md-button variant="tonal" size="md">MD</md-button>
<md-button variant="tonal" size="lg">LG</md-button>
<md-button variant="tonal" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">elevated</span>
<md-button variant="elevated" size="xs">XS</md-button>
<md-button variant="elevated" size="sm">SM</md-button>
<md-button variant="elevated" size="md">MD</md-button>
<md-button variant="elevated" size="lg">LG</md-button>
<md-button variant="elevated" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">outlined</span>
<md-button variant="outlined" size="xs">XS</md-button>
<md-button variant="outlined" size="sm">SM</md-button>
<md-button variant="outlined" size="md">MD</md-button>
<md-button variant="outlined" size="lg">LG</md-button>
<md-button variant="outlined" size="xl">XL</md-button>
</div>
<div style="display:flex;gap:12px;align-items:center;margin-block-end:12px;">
<span style="inline-size:4.5rem;opacity:.7;font-size:.8rem;">text</span>
<md-button variant="text" size="xs">XS</md-button>
<md-button variant="text" size="sm">SM</md-button>
<md-button variant="text" size="md">MD</md-button>
<md-button variant="text" size="lg">LG</md-button>
<md-button variant="text" size="xl">XL</md-button>
</div>shape sets the resting geometry. shape-morph (default true) animates
the radius on press and on toggle — pressed buttons square off by one step;
round toggles morph to square when selected, and square toggles morph to
round.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled" shape="round">Round</md-button>
<md-button variant="filled" shape="square">Square</md-button>
<md-button variant="tonal" shape="round" shape-morph="false">Morph disabled</md-button>import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled" shape="round">Round</MdButton>
<MdButton variant="filled" shape="square">Square</MdButton>
<MdButton variant="tonal" shape="round" shapeMorph="false">Morph disabled</MdButton>
</>
);
}// 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-button variant="filled" shape="round">Round</md-button>
<md-button variant="filled" shape="square">Square</md-button>
<md-button variant="tonal" shape="round" shape-morph="false">Morph disabled</md-button><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled" shape="round">Round</md-button>
<md-button variant="filled" shape="square">Square</md-button>
<md-button variant="tonal" shape="round" shape-morph="false">Morph disabled</md-button>
</template><script>
import '@awc-ui/core/define';
</script>
<md-button variant="filled" shape="round">Round</md-button>
<md-button variant="filled" shape="square">Square</md-button>
<md-button variant="tonal" shape="round" shape-morph="false">Morph disabled</md-button>Disable morphing app-wide with data-shape-morph="off" on <html>. See
Shape Morph.
A leading icon is the M3 default. Icons come from the icon /
trailing-icon props, or the matching named slots for custom glyphs
(SVG, icon font, emoji) — a slot replaces the corresponding prop.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled" icon="add">Add item</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward">Next</md-button>
<md-button variant="tonal">
<svg slot="leading-icon" viewBox="0 0 24 24" width="18" height="18" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
Starred
</md-button>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled" icon="add">Add item</MdButton>
<MdButton variant="outlined" trailingIcon="arrow_forward">Next</MdButton>
<MdButton variant="tonal">
<svg slot="leading-icon" viewBox="0 0 24 24" width="18" height="18" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
Starred
</MdButton>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// 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-button variant="filled" icon="add">Add item</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward">Next</md-button>
<md-button variant="tonal">
<svg slot="leading-icon" viewBox="0 0 24 24" width="18" height="18" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
Starred
</md-button><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled" icon="add">Add item</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward">Next</md-button>
<md-button variant="tonal">
<svg slot="leading-icon" viewBox="0 0 24 24" width="18" height="18" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
Starred
</md-button>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<md-button variant="filled" icon="add">Add item</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward">Next</md-button>
<md-button variant="tonal">
<svg slot="leading-icon" viewBox="0 0 24 24" width="18" height="18" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
Starred
</md-button>disabled, soft-disabled and loading all make the button inert —
loading is not merely cosmetic.
| State | Focusable | Use when |
|---|---|---|
disabled | No (tabindex="-1") | The action is unavailable and undiscoverable |
soft-disabled | Yes | Contextually unavailable but worth discovering — M3’s preference |
loading | No | An async operation is in flight |
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled">Enabled</md-button>
<md-button variant="filled" disabled>Disabled</md-button>
<md-button variant="filled" soft-disabled>Soft-disabled</md-button>
<md-button variant="filled" loading>Saving…</md-button>import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled">Enabled</MdButton>
<MdButton variant="filled" disabled>Disabled</MdButton>
<MdButton variant="filled" soft-disabled>Soft-disabled</MdButton>
<MdButton variant="filled" loading>Saving…</MdButton>
</>
);
}// 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-button variant="filled">Enabled</md-button>
<md-button variant="filled" disabled>Disabled</md-button>
<md-button variant="filled" soft-disabled>Soft-disabled</md-button>
<md-button variant="filled" loading>Saving…</md-button><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled">Enabled</md-button>
<md-button variant="filled" disabled>Disabled</md-button>
<md-button variant="filled" soft-disabled>Soft-disabled</md-button>
<md-button variant="filled" loading>Saving…</md-button>
</template><script>
import '@awc-ui/core/define';
</script>
<md-button variant="filled">Enabled</md-button>
<md-button variant="filled" disabled>Disabled</md-button>
<md-button variant="filled" soft-disabled>Soft-disabled</md-button>
<md-button variant="filled" loading>Saving…</md-button>loading swaps the leading icon for a spinner — an
md-loading-indicator, not a bespoke ring —
and it inherits the label colour, so it reads correctly on every variant:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled" loading>filled</md-button>
<md-button variant="outlined" loading>outlined</md-button>
<md-button variant="text" loading>text</md-button>
<md-button variant="elevated" loading>elevated</md-button>
<md-button variant="tonal" loading>tonal</md-button>import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled" loading>filled</MdButton>
<MdButton variant="outlined" loading>outlined</MdButton>
<MdButton variant="text" loading>text</MdButton>
<MdButton variant="elevated" loading>elevated</MdButton>
<MdButton variant="tonal" loading>tonal</MdButton>
</>
);
}// 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-button variant="filled" loading>filled</md-button>
<md-button variant="outlined" loading>outlined</md-button>
<md-button variant="text" loading>text</md-button>
<md-button variant="elevated" loading>elevated</md-button>
<md-button variant="tonal" loading>tonal</md-button><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled" loading>filled</md-button>
<md-button variant="outlined" loading>outlined</md-button>
<md-button variant="text" loading>text</md-button>
<md-button variant="elevated" loading>elevated</md-button>
<md-button variant="tonal" loading>tonal</md-button>
</template><script>
import '@awc-ui/core/define';
</script>
<md-button variant="filled" loading>filled</md-button>
<md-button variant="outlined" loading>outlined</md-button>
<md-button variant="text" loading>text</md-button>
<md-button variant="elevated" loading>elevated</md-button>
<md-button variant="tonal" loading>tonal</md-button>Slot your own into loader when the default isn’t the right affordance — a
circular md-progress-indicator, a branded
mark, anything. The slot replaces the whole spinner; everything else about the
loading state (inert, aria-busy, the label staying put) is unchanged.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled" loading>Default</md-button>
<md-button variant="filled" loading>
Swapped
<md-progress-indicator slot="loader" variant="circular" indeterminate size="18" label="Saving"></md-progress-indicator>
</md-button>import { MdButton, MdProgressIndicator } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled" loading>Default</MdButton>
<MdButton variant="filled" loading>
Swapped
<MdProgressIndicator slot="loader" variant="circular" indeterminate size="18" label="Saving"></MdProgressIndicator>
</MdButton>
</>
);
}// 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-button variant="filled" loading>Default</md-button>
<md-button variant="filled" loading>
Swapped
<md-progress-indicator slot="loader" variant="circular" indeterminate size="18" label="Saving"></md-progress-indicator>
</md-button><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled" loading>Default</md-button>
<md-button variant="filled" loading>
Swapped
<md-progress-indicator slot="loader" variant="circular" indeterminate size="18" label="Saving"></md-progress-indicator>
</md-button>
</template><script>
import '@awc-ui/core/define';
</script>
<md-button variant="filled" loading>Default</md-button>
<md-button variant="filled" loading>
Swapped
<md-progress-indicator slot="loader" variant="circular" indeterminate size="18" label="Saving"></md-progress-indicator>
</md-button>The spinner tracks the size tier and the density rung, because it is derived from the icon box rather than a fixed pixel value:
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled" size="xs" loading>XS</md-button>
<md-button variant="filled" size="sm" loading>SM</md-button>
<md-button variant="filled" size="md" loading>MD</md-button>
<md-button variant="filled" size="lg" loading>LG</md-button>
<md-button variant="filled" size="xl" loading>XL</md-button>import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled" size="xs" loading>XS</MdButton>
<MdButton variant="filled" size="sm" loading>SM</MdButton>
<MdButton variant="filled" size="md" loading>MD</MdButton>
<MdButton variant="filled" size="lg" loading>LG</MdButton>
<MdButton variant="filled" size="xl" loading>XL</MdButton>
</>
);
}// 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-button variant="filled" size="xs" loading>XS</md-button>
<md-button variant="filled" size="sm" loading>SM</md-button>
<md-button variant="filled" size="md" loading>MD</md-button>
<md-button variant="filled" size="lg" loading>LG</md-button>
<md-button variant="filled" size="xl" loading>XL</md-button><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled" size="xs" loading>XS</md-button>
<md-button variant="filled" size="sm" loading>SM</md-button>
<md-button variant="filled" size="md" loading>MD</md-button>
<md-button variant="filled" size="lg" loading>LG</md-button>
<md-button variant="filled" size="xl" loading>XL</md-button>
</template><script>
import '@awc-ui/core/define';
</script>
<md-button variant="filled" size="xs" loading>XS</md-button>
<md-button variant="filled" size="sm" loading>SM</md-button>
<md-button variant="filled" size="md" loading>MD</md-button>
<md-button variant="filled" size="lg" loading>LG</md-button>
<md-button variant="filled" size="xl" loading>XL</md-button>loading is the built-in path. When you need the progress API instead —
determinate values, a wavy indicator, four-colour — slot an
md-progress-indicator into leading-icon
or trailing-icon. Leading reads as the spinner being the subject of the
action, trailing as its outcome:
<!-- 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:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">leading</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" indeterminate label="Saving"></md-progress-indicator>
Saving
</md-button>
<md-button variant="outlined" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" indeterminate label="Syncing"></md-progress-indicator>
Syncing
</md-button>
<md-button variant="tonal" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" value="65" label="65 percent"></md-progress-indicator>
65% done
</md-button>
</div>
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">trailing</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" size="md" soft-disabled>
Continue
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate label="Working"></md-progress-indicator>
</md-button>
<md-button variant="outlined" size="md" soft-disabled>
Uploading
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate label="Uploading"></md-progress-indicator>
</md-button>
<md-button variant="tonal" size="md" soft-disabled>
Exporting
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate wave four-color label="Exporting"></md-progress-indicator>
</md-button>
</div>
</div>import { MdButton, MdProgressIndicator } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '14px 16px', alignItems: 'center' }}>
<span style={{ inlineSize: '4.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>leading</span>
<div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}>
<MdButton variant="filled" size="md" soft-disabled>
<MdProgressIndicator slot="leading-icon" variant="circular" indeterminate label="Saving"></MdProgressIndicator>
Saving
</MdButton>
<MdButton variant="outlined" size="md" soft-disabled>
<MdProgressIndicator slot="leading-icon" variant="circular" indeterminate label="Syncing"></MdProgressIndicator>
Syncing
</MdButton>
<MdButton variant="tonal" size="md" soft-disabled>
<MdProgressIndicator slot="leading-icon" variant="circular" value="65" label="65 percent"></MdProgressIndicator>
65% done
</MdButton>
</div>
<span style={{ inlineSize: '4.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>trailing</span>
<div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}>
<MdButton variant="filled" size="md" soft-disabled>
Continue
<MdProgressIndicator slot="trailing-icon" variant="circular" indeterminate label="Working"></MdProgressIndicator>
</MdButton>
<MdButton variant="outlined" size="md" soft-disabled>
Uploading
<MdProgressIndicator slot="trailing-icon" variant="circular" indeterminate label="Uploading"></MdProgressIndicator>
</MdButton>
<MdButton variant="tonal" size="md" soft-disabled>
Exporting
<MdProgressIndicator slot="trailing-icon" variant="circular" indeterminate wave fourColor label="Exporting"></MdProgressIndicator>
</MdButton>
</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:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">leading</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" indeterminate label="Saving"></md-progress-indicator>
Saving
</md-button>
<md-button variant="outlined" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" indeterminate label="Syncing"></md-progress-indicator>
Syncing
</md-button>
<md-button variant="tonal" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" value="65" label="65 percent"></md-progress-indicator>
65% done
</md-button>
</div>
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">trailing</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" size="md" soft-disabled>
Continue
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate label="Working"></md-progress-indicator>
</md-button>
<md-button variant="outlined" size="md" soft-disabled>
Uploading
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate label="Uploading"></md-progress-indicator>
</md-button>
<md-button variant="tonal" size="md" soft-disabled>
Exporting
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate wave four-color label="Exporting"></md-progress-indicator>
</md-button>
</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:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">leading</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" indeterminate label="Saving"></md-progress-indicator>
Saving
</md-button>
<md-button variant="outlined" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" indeterminate label="Syncing"></md-progress-indicator>
Syncing
</md-button>
<md-button variant="tonal" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" value="65" label="65 percent"></md-progress-indicator>
65% done
</md-button>
</div>
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">trailing</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" size="md" soft-disabled>
Continue
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate label="Working"></md-progress-indicator>
</md-button>
<md-button variant="outlined" size="md" soft-disabled>
Uploading
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate label="Uploading"></md-progress-indicator>
</md-button>
<md-button variant="tonal" size="md" soft-disabled>
Exporting
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate wave four-color label="Exporting"></md-progress-indicator>
</md-button>
</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:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">leading</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" indeterminate label="Saving"></md-progress-indicator>
Saving
</md-button>
<md-button variant="outlined" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" indeterminate label="Syncing"></md-progress-indicator>
Syncing
</md-button>
<md-button variant="tonal" size="md" soft-disabled>
<md-progress-indicator slot="leading-icon" variant="circular" value="65" label="65 percent"></md-progress-indicator>
65% done
</md-button>
</div>
<span style="inline-size:4.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">trailing</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" size="md" soft-disabled>
Continue
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate label="Working"></md-progress-indicator>
</md-button>
<md-button variant="outlined" size="md" soft-disabled>
Uploading
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate label="Uploading"></md-progress-indicator>
</md-button>
<md-button variant="tonal" size="md" soft-disabled>
Exporting
<md-progress-indicator slot="trailing-icon" variant="circular" indeterminate wave four-color label="Exporting"></md-progress-indicator>
</md-button>
</div>
</div>toggle turns the button into a two-state control and emits aria-pressed
automatically.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="tonal" toggle icon="favorite" value="fav">Follow</md-button>
<md-button variant="filled" toggle selected value="sub">Subscribed</md-button>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="tonal" toggle icon="favorite" value="fav">Follow</MdButton>
<MdButton variant="filled" toggle selected value="sub">Subscribed</MdButton>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// 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-button variant="tonal" toggle icon="favorite" value="fav">Follow</md-button>
<md-button variant="filled" toggle selected value="sub">Subscribed</md-button><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="tonal" toggle icon="favorite" value="fav">Follow</md-button>
<md-button variant="filled" toggle selected value="sub">Subscribed</md-button>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<md-button variant="tonal" toggle icon="favorite" value="fav">Follow</md-button>
<md-button variant="filled" toggle selected value="sub">Subscribed</md-button>Keep the label length stable between states — M3 warns that a label swinging from “Follow” to “You are now following” disrupts the layout.
Content-sized by default. full-width stretches to the container; cap it so
it never becomes a long flat bar.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled" full-width icon="check">Confirm and continue</md-button>
<md-button variant="outlined" full-width style="--md-button-max-width: 360px;">Capped at 360px</md-button>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled" fullWidth icon="check">Confirm and continue</MdButton>
<MdButton variant="outlined" fullWidth style={{ '--md-button-max-width': '360px' }}>Capped at 360px</MdButton>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// 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-button variant="filled" full-width icon="check">Confirm and continue</md-button>
<md-button variant="outlined" full-width style="--md-button-max-width: 360px;">Capped at 360px</md-button><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled" full-width icon="check">Confirm and continue</md-button>
<md-button variant="outlined" full-width style="--md-button-max-width: 360px;">Capped at 360px</md-button>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<md-button variant="filled" full-width icon="check">Confirm and continue</md-button>
<md-button variant="outlined" full-width style="--md-button-max-width: 360px;">Capped at 360px</md-button>For arbitrary sizing use --md-button-width, --md-button-min-width,
--md-button-max-width, --md-button-height, --md-button-min-height.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled" style="--md-button-width: 260px;">Fixed 260px</md-button>
<md-button variant="outlined" style="--md-button-min-width: 200px;">Min 200px</md-button>
<md-button variant="tonal" style="--md-button-height: 64px;">Tall 64px</md-button>
<md-button variant="filled" style="--md-button-width: 180px; --md-button-height: 56px;">180 x 56</md-button>import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled" style={{ '--md-button-width': '260px' }}>Fixed 260px</MdButton>
<MdButton variant="outlined" style={{ '--md-button-min-width': '200px' }}>Min 200px</MdButton>
<MdButton variant="tonal" style={{ '--md-button-height': '64px' }}>Tall 64px</MdButton>
<MdButton variant="filled" style={{ '--md-button-width': '180px', '--md-button-height': '56px' }}>180 x 56</MdButton>
</>
);
}// 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-button variant="filled" style="--md-button-width: 260px;">Fixed 260px</md-button>
<md-button variant="outlined" style="--md-button-min-width: 200px;">Min 200px</md-button>
<md-button variant="tonal" style="--md-button-height: 64px;">Tall 64px</md-button>
<md-button variant="filled" style="--md-button-width: 180px; --md-button-height: 56px;">180 x 56</md-button><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled" style="--md-button-width: 260px;">Fixed 260px</md-button>
<md-button variant="outlined" style="--md-button-min-width: 200px;">Min 200px</md-button>
<md-button variant="tonal" style="--md-button-height: 64px;">Tall 64px</md-button>
<md-button variant="filled" style="--md-button-width: 180px; --md-button-height: 56px;">180 x 56</md-button>
</template><script>
import '@awc-ui/core/define';
</script>
<md-button variant="filled" style="--md-button-width: 260px;">Fixed 260px</md-button>
<md-button variant="outlined" style="--md-button-min-width: 200px;">Min 200px</md-button>
<md-button variant="tonal" style="--md-button-height: 64px;">Tall 64px</md-button>
<md-button variant="filled" style="--md-button-width: 180px; --md-button-height: 56px;">180 x 56</md-button>Set href and the button navigates instead of acting.
<md-button variant="text" href="/settings">Settings</md-button><md-button variant="text" href="https://example.com" target="_blank">External</md-button><!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled" href="https://m3.material.io" target="_blank" trailing-icon="open_in_new">M3 guidelines</md-button>
<md-button variant="outlined" href="https://github.com" target="_blank" trailing-icon="open_in_new">GitHub</md-button>
<md-button variant="text" href="/components/" icon="link">Browse components</md-button>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled" href="https://m3.material.io" target="_blank" trailingIcon="open_in_new">M3 guidelines</MdButton>
<MdButton variant="outlined" href="https://github.com" target="_blank" trailingIcon="open_in_new">GitHub</MdButton>
<MdButton variant="text" href="/components/" icon="link">Browse components</MdButton>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// 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-button variant="filled" href="https://m3.material.io" target="_blank" trailing-icon="open_in_new">M3 guidelines</md-button>
<md-button variant="outlined" href="https://github.com" target="_blank" trailing-icon="open_in_new">GitHub</md-button>
<md-button variant="text" href="/components/" icon="link">Browse components</md-button><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled" href="https://m3.material.io" target="_blank" trailing-icon="open_in_new">M3 guidelines</md-button>
<md-button variant="outlined" href="https://github.com" target="_blank" trailing-icon="open_in_new">GitHub</md-button>
<md-button variant="text" href="/components/" icon="link">Browse components</md-button>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<md-button variant="filled" href="https://m3.material.io" target="_blank" trailing-icon="open_in_new">M3 guidelines</md-button>
<md-button variant="outlined" href="https://github.com" target="_blank" trailing-icon="open_in_new">GitHub</md-button>
<md-button variant="text" href="/components/" icon="link">Browse components</md-button>For SPA routing, cancel mdClick and route yourself:
<md-button variant="text" href="/settings" id="nav">Settings</md-button>
<script type="module">
document.getElementById('nav').addEventListener('mdClick', (e) => {
const { href } = e.detail;
if (href?.startsWith('/')) {
e.preventDefault(); // cancels navigation AND the toggle flip
router.push(href);
}
});
</script>import { MdButton } from '@awc-ui/react';
import { useNavigate } from 'react-router-dom';
export function NavButton() {
const navigate = useNavigate();
return (
<MdButton
variant="text"
href="/settings"
onMdClick={(e) => {
const { href } = e.detail;
if (href?.startsWith('/')) {
e.preventDefault();
navigate(href);
}
}}
>
Settings
</MdButton>
);
}import { Component } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-nav-button',
template: `
<md-button variant="text" href="/settings" (mdClick)="onClick($event)">
Settings
</md-button>
`,
})
export class NavButtonComponent {
constructor(private router: Router) {}
onClick(e: CustomEvent) {
const { href } = e.detail;
if (href?.startsWith('/')) {
e.preventDefault();
this.router.navigateByUrl(href);
}
}
}<script setup lang="ts">
import { useRouter } from 'vue-router';
const router = useRouter();
function onClick(e: CustomEvent) {
const { href } = e.detail;
if (href?.startsWith('/')) {
e.preventDefault();
router.push(href);
}
}
</script>
<template>
<md-button variant="text" href="/settings" @mdClick="onClick">
Settings
</md-button>
</template><script lang="ts">
import { goto } from '$app/navigation';
function onClick(e: CustomEvent) {
const { href } = e.detail;
if (href?.startsWith('/')) {
e.preventDefault();
goto(href);
}
}
</script>
<md-button variant="text" href="/settings" on:mdClick={onClick}>
Settings
</md-button>md-button is form-associated via ElementInternals, so type="submit"
and type="reset" work across the shadow boundary — no hidden <input>
needed. Submit calls form.requestSubmit(), so the form’s submit event
fires and native constraint validation runs.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<form id="profile">
<md-text-field label="Email" type="email" name="email" required></md-text-field>
<md-button variant="filled" type="submit">Save</md-button>
<md-button variant="text" type="reset">Reset</md-button>
</form>import { MdButton, MdTextField } from '@awc-ui/react';
export function Demo() {
return (
<>
<form id="profile">
<MdTextField label="Email" type="email" name="email" required></MdTextField>
<MdButton variant="filled" type="submit">Save</MdButton>
<MdButton variant="text" type="reset">Reset</MdButton>
</form>
</>
);
}// 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 -->
<form id="profile">
<md-text-field label="Email" type="email" name="email" required></md-text-field>
<md-button variant="filled" type="submit">Save</md-button>
<md-button variant="text" type="reset">Reset</md-button>
</form><script setup>
import '@awc-ui/core/define';
</script>
<template>
<form id="profile">
<md-text-field label="Email" type="email" name="email" required></md-text-field>
<md-button variant="filled" type="submit">Save</md-button>
<md-button variant="text" type="reset">Reset</md-button>
</form>
</template><script>
import '@awc-ui/core/define';
</script>
<form id="profile">
<md-text-field label="Email" type="email" name="email" required></md-text-field>
<md-button variant="filled" type="submit">Save</md-button>
<md-button variant="text" type="reset">Reset</md-button>
</form><form id="profile">
<md-text-field label="Email" type="email" name="email" required></md-text-field>
<md-button variant="filled" type="submit">Save</md-button>
<md-button variant="text" type="reset">Reset</md-button>
</form>
<script type="module">
document.getElementById('profile').addEventListener('submit', (e) => {
e.preventDefault();
const data = new FormData(e.target);
console.log(Object.fromEntries(data)); // { email: '…' }
});
</script>import { MdButton, MdTextField } from '@awc-ui/react';
export function ProfileForm() {
function onSubmit(e: React.FormEvent<HTMLFormElement>) {
e.preventDefault();
const data = new FormData(e.currentTarget);
console.log(Object.fromEntries(data));
}
return (
<form onSubmit={onSubmit}>
<MdTextField label="Email" type="email" name="email" required />
<MdButton variant="filled" type="submit">Save</MdButton>
<MdButton variant="text" type="reset">Reset</MdButton>
</form>
);
}import { Component } from '@angular/core';
@Component({
selector: 'app-profile-form',
template: `
<form (submit)="onSubmit($event)">
<md-text-field label="Email" type="email" name="email" required></md-text-field>
<md-button variant="filled" type="submit">Save</md-button>
<md-button variant="text" type="reset">Reset</md-button>
</form>
`,
})
export class ProfileFormComponent {
onSubmit(e: Event) {
e.preventDefault();
const data = new FormData(e.target as HTMLFormElement);
console.log(Object.fromEntries(data));
}
}<script setup lang="ts">
function onSubmit(e: Event) {
e.preventDefault();
const data = new FormData(e.target as HTMLFormElement);
console.log(Object.fromEntries(data));
}
</script>
<template>
<form @submit="onSubmit">
<md-text-field label="Email" type="email" name="email" required />
<md-button variant="filled" type="submit">Save</md-button>
<md-button variant="text" type="reset">Reset</md-button>
</form>
</template><script lang="ts">
function onSubmit(e: Event) {
e.preventDefault();
const data = new FormData(e.target as HTMLFormElement);
console.log(Object.fromEntries(data));
}
</script>
<form on:submit={onSubmit}>
<md-text-field label="Email" type="email" name="email" required />
<md-button variant="filled" type="submit">Save</md-button>
<md-button variant="text" type="reset">Reset</md-button>
</form>| Event | Cancelable | Detail | Fires |
|---|---|---|---|
mdClick | yes | MdButtonClickDetail | Every activation (pointer, Enter, Space) |
mdChange | no | { selected, value } | Only when toggle mode flips selected |
mdChange’s payload is a strict subset of mdClick’s, so the difference is not
the data — it is the guarantee.
mdClick.detail.selected is a prediction: the state the button will take if
nothing cancels the click. A listener registered after yours can still call
preventDefault(), so a handler that commits on mdClick can commit a change
that never happened. mdChange fires after the flip and cannot be vetoed, so it
is the committed fact.
This is the same split the platform uses for <input type="checkbox"> —
click is cancelable and predictive, change is settled — including the part
people forget: neither fires on a programmatic change. Setting
btn.selected = true in code emits nothing, exactly as input.checked = true
emits nothing. If your own code changes the state, your own code already knows.
| You want to… | Listen to |
|---|---|
| Veto the activation (guard, confirm, permission check) | mdClick + preventDefault() |
| React to a committed toggle | mdChange |
| Handle a plain, non-toggle button press | mdClick |
| Know the previous state | mdClick — detail.selected is the incoming one |
interface MdButtonClickDetail { value: string; toggle: boolean; selected: boolean; // the state the button WILL take — a before-change hook href: string; target: string; originalEvent: MouseEvent | KeyboardEvent;}Both events bubble and are composed, so one delegated listener on an ancestor catches every button.
<md-button id="save" variant="filled" toggle value="fav">Favorite</md-button>
<script type="module">
const btn = document.getElementById('save');
btn.addEventListener('mdClick', (e) => {
if (!confirm('Continue?')) e.preventDefault(); // veto
});
btn.addEventListener('mdChange', (e) => {
console.log(e.detail.value, e.detail.selected);
});
</script>import { MdButton } from '@awc-ui/react';
export function FavoriteButton() {
return (
<MdButton
variant="filled"
toggle
value="fav"
onMdClick={(e) => {
if (!window.confirm('Continue?')) e.preventDefault();
}}
onMdChange={(e) => console.log(e.detail.value, e.detail.selected)}
>
Favorite
</MdButton>
);
}import { Component } from '@angular/core';
@Component({
selector: 'app-favorite-button',
template: `
<md-button
variant="filled"
toggle
value="fav"
(mdClick)="onClick($event)"
(mdChange)="onChange($event)"
>Favorite</md-button>
`,
})
export class FavoriteButtonComponent {
onClick(e: CustomEvent) {
if (!confirm('Continue?')) e.preventDefault();
}
onChange(e: CustomEvent) {
console.log(e.detail.value, e.detail.selected);
}
}<script setup lang="ts">
function onClick(e: CustomEvent) {
if (!confirm('Continue?')) e.preventDefault();
}
function onChange(e: CustomEvent) {
console.log(e.detail.value, e.detail.selected);
}
</script>
<template>
<md-button
variant="filled"
toggle
value="fav"
@mdClick="onClick"
@mdChange="onChange"
>Favorite</md-button>
</template><script lang="ts">
function onClick(e: CustomEvent) {
if (!confirm('Continue?')) e.preventDefault();
}
function onChange(e: CustomEvent) {
console.log(e.detail.value, e.detail.selected);
}
</script>
<md-button
variant="filled"
toggle
value="fav"
on:mdClick={onClick}
on:mdChange={onChange}
>Favorite</md-button>| Property | Attribute | Type | Default | Reflects |
|---|---|---|---|---|
type | type | 'button' | 'submit' | 'reset' | 'button' | Yes |
variant | variant | 'filled' | 'outlined' | 'text' | 'elevated' | 'tonal' | 'filled' | — |
size | size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'sm' | — |
shape | shape | 'round' | 'square' | 'round' | — |
disabled | disabled | boolean | false | Yes |
softDisabled | soft-disabled | boolean | false | Yes |
ripple | ripple | boolean | true | — |
loading | loading | boolean | false | — |
icon | icon | string | '' | — |
trailingIcon | trailing-icon | string | '' | — |
href | href | string | '' | — |
target | target | string | '_self' | — |
toggle | toggle | boolean | false | — |
selected | selected | boolean | false | — |
shapeMorph | shape-morph | boolean | true | — |
mirrorIcon | mirror-icon | boolean | false | Yes |
suppressExpandIconFlip | suppress-expand-icon-flip | boolean | false | Yes |
fullWidth | full-width | boolean | false | Yes |
connectedLeft | connected-left | boolean | false | Yes |
connectedRight | connected-right | boolean | false | Yes |
value | value | string | '' | — |
groupTabindex | group-tabindex | number | null | null | — |
roleOverride | role-override | string | '' | — |
density | density | 0 | -1 | -2 | -3 | -4 | 0 | Yes |
| Slot | Description |
|---|---|
(default) | — |
leading-icon | Custom leading icon (replaces icon prop) |
trailing-icon | Custom trailing icon (replaces trailingIcon prop) |
loader | — |
Override on the host element for per-instance theming:
| Property | Description |
|---|---|
--md-button-container-color | Container background |
--md-button-label-color | Label + icon text color |
--md-button-icon-color | Icon-only color override |
--md-button-icon-size | Icon dimensions |
--md-button-container-shape | Border-radius override |
--md-button-outline-color | Outlined border color |
--md-button-outline-width | Outlined border width |
--md-button-width | Fixed inline-size (default: auto) |
--md-button-min-width | Minimum inline-size (default: per-size touch target) |
--md-button-max-width | Maximum inline-size (default: none) |
--md-button-height | Fixed block-size (default: auto) |
--md-button-min-height | Minimum block-size (default: per-size touch target) |
--md-button-loading-size | — |
--md-button-focus-ring-color | — |
Style internal elements through shadow DOM with ::part():
| Part | Description |
|---|---|
anchor | — |
state-layer | State-layer overlay |
icon | Leading icon (fallback) |
label | Label text wrapper |
trailing-icon | Trailing icon (fallback) |
loading | Loading spinner |
role="button", Enter/Space activation, and
a 3px focus ring at 2px offset on every variant.aria-disabled is set whenever disabled, soft-disabled or loading
is active.aria-pressed is emitted only in toggle mode.aria-label whenever the visible label is insufficient. Verified against
axe-core with zero WCAG 2.1 AA violations.soft-disabled over disabled for contextually-unavailable actions —
it stays focusable, so keyboard users can still discover it.role-override exists for composite widgets (e.g. gridcell in
md-date-picker). Leave it empty otherwise.Tab through these: the soft-disabled button still takes focus, the disabled one is skipped, and the toggle announces its pressed state.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled">Focusable</md-button>
<md-button variant="filled" soft-disabled>Soft-disabled — still focusable</md-button>
<md-button variant="filled" disabled>Disabled — skipped</md-button>
<md-button variant="tonal" toggle selected value="bookmark" icon="bookmark">Saved</md-button>
<md-button variant="text" icon="delete" aria-label="Delete invoice 4021">Delete</md-button>
<md-icon-button icon="delete" aria-label="Delete invoice 4021"></md-icon-button>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdButton, MdIconButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled">Focusable</MdButton>
<MdButton variant="filled" soft-disabled>Soft-disabled — still focusable</MdButton>
<MdButton variant="filled" disabled>Disabled — skipped</MdButton>
<MdButton variant="tonal" toggle selected value="bookmark" icon="bookmark">Saved</MdButton>
<MdButton variant="text" icon="delete" aria-label="Delete invoice 4021">Delete</MdButton>
<MdIconButton icon="delete" aria-label="Delete invoice 4021"></MdIconButton>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// 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-button variant="filled">Focusable</md-button>
<md-button variant="filled" soft-disabled>Soft-disabled — still focusable</md-button>
<md-button variant="filled" disabled>Disabled — skipped</md-button>
<md-button variant="tonal" toggle selected value="bookmark" icon="bookmark">Saved</md-button>
<md-button variant="text" icon="delete" aria-label="Delete invoice 4021">Delete</md-button>
<md-icon-button icon="delete" aria-label="Delete invoice 4021"></md-icon-button><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled">Focusable</md-button>
<md-button variant="filled" soft-disabled>Soft-disabled — still focusable</md-button>
<md-button variant="filled" disabled>Disabled — skipped</md-button>
<md-button variant="tonal" toggle selected value="bookmark" icon="bookmark">Saved</md-button>
<md-button variant="text" icon="delete" aria-label="Delete invoice 4021">Delete</md-button>
<md-icon-button icon="delete" aria-label="Delete invoice 4021"></md-icon-button>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<md-button variant="filled">Focusable</md-button>
<md-button variant="filled" soft-disabled>Soft-disabled — still focusable</md-button>
<md-button variant="filled" disabled>Disabled — skipped</md-button>
<md-button variant="tonal" toggle selected value="bookmark" icon="bookmark">Saved</md-button>
<md-button variant="text" icon="delete" aria-label="Delete invoice 4021">Delete</md-button>
<md-icon-button icon="delete" aria-label="Delete invoice 4021"></md-icon-button>The last two show the two legitimate uses of aria-label. On the md-button
the visible word “Delete” is the label; aria-label overrides it with
something more specific for screen-reader users, who hear “Delete invoice 4021”
without the row context a sighted user gets for free. For a genuinely icon-only
control, reach for md-icon-button — an
md-button with an icon and no text has no accessible name and the wrong
metrics, which is why it appears in Anti-patterns below.
RTL — all box metrics use logical properties, so leading/trailing icons
swap automatically under dir="rtl". Add mirror-icon for directional
glyphs only (arrow_forward, chevron_right, send); never for add,
search or favorite. See RTL.
<div dir="rtl"> <md-button variant="filled" trailing-icon="arrow_forward" mirror-icon>التالي</md-button></div>The same buttons in both directions. Nothing is re-authored between them —
only dir changes. Box metrics are logical, so the icon moves to the trailing
edge on its own:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- 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:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="add">Add item</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>Next</md-button>
<md-button variant="tonal" icon="search">Search</md-button>
<md-button variant="text" icon="delete" trailing-icon="chevron_right" mirror-icon>Remove</md-button>
</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:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="add">إضافة عنصر</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="text" icon="delete" trailing-icon="chevron_right" mirror-icon>إزالة</md-button>
</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdButton } 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: '12px', flexWrap: 'wrap', alignItems: 'center' }}>
<MdButton variant="filled" icon="add">Add item</MdButton>
<MdButton variant="outlined" trailingIcon="arrow_forward" mirror-icon>Next</MdButton>
<MdButton variant="tonal" icon="search">Search</MdButton>
<MdButton variant="text" icon="delete" trailingIcon="chevron_right" mirror-icon>Remove</MdButton>
</div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>rtl</span>
<div dir="rtl" style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}>
<MdButton variant="filled" icon="add">إضافة عنصر</MdButton>
<MdButton variant="outlined" trailingIcon="arrow_forward" mirror-icon>التالي</MdButton>
<MdButton variant="tonal" icon="search">بحث</MdButton>
<MdButton variant="text" icon="delete" trailingIcon="chevron_right" mirror-icon>إزالة</MdButton>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// 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:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="add">Add item</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>Next</md-button>
<md-button variant="tonal" icon="search">Search</md-button>
<md-button variant="text" icon="delete" trailing-icon="chevron_right" mirror-icon>Remove</md-button>
</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:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="add">إضافة عنصر</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="text" icon="delete" trailing-icon="chevron_right" mirror-icon>إزالة</md-button>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
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:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="add">Add item</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>Next</md-button>
<md-button variant="tonal" icon="search">Search</md-button>
<md-button variant="text" icon="delete" trailing-icon="chevron_right" mirror-icon>Remove</md-button>
</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:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="add">إضافة عنصر</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="text" icon="delete" trailing-icon="chevron_right" mirror-icon>إزالة</md-button>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
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:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="add">Add item</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>Next</md-button>
<md-button variant="tonal" icon="search">Search</md-button>
<md-button variant="text" icon="delete" trailing-icon="chevron_right" mirror-icon>Remove</md-button>
</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:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="add">إضافة عنصر</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="text" icon="delete" trailing-icon="chevron_right" mirror-icon>إزالة</md-button>
</div>
</div>mirror-icon is per-glyph, not per-buttonOnly directional glyphs flip. A magnifier, a plus or a heart points nowhere, so mirroring them just makes them look wrong. Compare the two rows under RTL:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- 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;">correct</span>
<div dir="rtl" style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="outlined" trailing-icon="chevron_right" mirror-icon>المزيد</md-button>
<md-button variant="outlined" icon="send" mirror-icon>إرسال</md-button>
<md-button variant="tonal" icon="add">إضافة</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="tonal" icon="favorite">إعجاب</md-button>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">wrong</span>
<div dir="rtl" style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="outlined" trailing-icon="arrow_forward">التالي</md-button>
<md-button variant="outlined" trailing-icon="chevron_right">المزيد</md-button>
<md-button variant="outlined" icon="send">إرسال</md-button>
<md-button variant="tonal" icon="add" mirror-icon>إضافة</md-button>
<md-button variant="tonal" icon="search" mirror-icon>بحث</md-button>
<md-button variant="tonal" icon="favorite" mirror-icon>إعجاب</md-button>
</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdButton } 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' }}>correct</span>
<div dir="rtl" style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}>
<MdButton variant="outlined" trailingIcon="arrow_forward" mirror-icon>التالي</MdButton>
<MdButton variant="outlined" trailingIcon="chevron_right" mirror-icon>المزيد</MdButton>
<MdButton variant="outlined" icon="send" mirror-icon>إرسال</MdButton>
<MdButton variant="tonal" icon="add">إضافة</MdButton>
<MdButton variant="tonal" icon="search">بحث</MdButton>
<MdButton variant="tonal" icon="favorite">إعجاب</MdButton>
</div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>wrong</span>
<div dir="rtl" style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}>
<MdButton variant="outlined" trailingIcon="arrow_forward">التالي</MdButton>
<MdButton variant="outlined" trailingIcon="chevron_right">المزيد</MdButton>
<MdButton variant="outlined" icon="send">إرسال</MdButton>
<MdButton variant="tonal" icon="add" mirror-icon>إضافة</MdButton>
<MdButton variant="tonal" icon="search" mirror-icon>بحث</MdButton>
<MdButton variant="tonal" icon="favorite" mirror-icon>إعجاب</MdButton>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// 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;">correct</span>
<div dir="rtl" style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="outlined" trailing-icon="chevron_right" mirror-icon>المزيد</md-button>
<md-button variant="outlined" icon="send" mirror-icon>إرسال</md-button>
<md-button variant="tonal" icon="add">إضافة</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="tonal" icon="favorite">إعجاب</md-button>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">wrong</span>
<div dir="rtl" style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="outlined" trailing-icon="arrow_forward">التالي</md-button>
<md-button variant="outlined" trailing-icon="chevron_right">المزيد</md-button>
<md-button variant="outlined" icon="send">إرسال</md-button>
<md-button variant="tonal" icon="add" mirror-icon>إضافة</md-button>
<md-button variant="tonal" icon="search" mirror-icon>بحث</md-button>
<md-button variant="tonal" icon="favorite" mirror-icon>إعجاب</md-button>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
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;">correct</span>
<div dir="rtl" style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="outlined" trailing-icon="chevron_right" mirror-icon>المزيد</md-button>
<md-button variant="outlined" icon="send" mirror-icon>إرسال</md-button>
<md-button variant="tonal" icon="add">إضافة</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="tonal" icon="favorite">إعجاب</md-button>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">wrong</span>
<div dir="rtl" style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="outlined" trailing-icon="arrow_forward">التالي</md-button>
<md-button variant="outlined" trailing-icon="chevron_right">المزيد</md-button>
<md-button variant="outlined" icon="send">إرسال</md-button>
<md-button variant="tonal" icon="add" mirror-icon>إضافة</md-button>
<md-button variant="tonal" icon="search" mirror-icon>بحث</md-button>
<md-button variant="tonal" icon="favorite" mirror-icon>إعجاب</md-button>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
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;">correct</span>
<div dir="rtl" style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="outlined" trailing-icon="chevron_right" mirror-icon>المزيد</md-button>
<md-button variant="outlined" icon="send" mirror-icon>إرسال</md-button>
<md-button variant="tonal" icon="add">إضافة</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="tonal" icon="favorite">إعجاب</md-button>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">wrong</span>
<div dir="rtl" style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="outlined" trailing-icon="arrow_forward">التالي</md-button>
<md-button variant="outlined" trailing-icon="chevron_right">المزيد</md-button>
<md-button variant="outlined" icon="send">إرسال</md-button>
<md-button variant="tonal" icon="add" mirror-icon>إضافة</md-button>
<md-button variant="tonal" icon="search" mirror-icon>بحث</md-button>
<md-button variant="tonal" icon="favorite" mirror-icon>إعجاب</md-button>
</div>
</div>density sets a local rung — -1 through -4 — that wins over whatever
data-density an ancestor set. The top row carries no density at all: it is
the default the rungs taper away from.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- 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;">default</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" icon="save">Save</md-button><md-button variant="outlined">Cancel</md-button><md-button variant="text" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-1" icon="save">Save</md-button><md-button variant="outlined" density="-1">Cancel</md-button><md-button variant="text" density="-1" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-2" icon="save">Save</md-button><md-button variant="outlined" density="-2">Cancel</md-button><md-button variant="text" density="-2" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-3" icon="save">Save</md-button><md-button variant="outlined" density="-3">Cancel</md-button><md-button variant="text" density="-3" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-4" icon="save">Save</md-button><md-button variant="outlined" density="-4">Cancel</md-button><md-button variant="text" density="-4" icon="delete">Delete</md-button></div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdButton } 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' }}>default</span>
<div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}><MdButton variant="filled" icon="save">Save</MdButton><MdButton variant="outlined">Cancel</MdButton><MdButton variant="text" icon="delete">Delete</MdButton></div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-1</span>
<div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}><MdButton variant="filled" density="-1" icon="save">Save</MdButton><MdButton variant="outlined" density="-1">Cancel</MdButton><MdButton variant="text" density="-1" icon="delete">Delete</MdButton></div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-2</span>
<div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}><MdButton variant="filled" density="-2" icon="save">Save</MdButton><MdButton variant="outlined" density="-2">Cancel</MdButton><MdButton variant="text" density="-2" icon="delete">Delete</MdButton></div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-3</span>
<div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}><MdButton variant="filled" density="-3" icon="save">Save</MdButton><MdButton variant="outlined" density="-3">Cancel</MdButton><MdButton variant="text" density="-3" icon="delete">Delete</MdButton></div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-4</span>
<div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}><MdButton variant="filled" density="-4" icon="save">Save</MdButton><MdButton variant="outlined" density="-4">Cancel</MdButton><MdButton variant="text" density="-4" icon="delete">Delete</MdButton></div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// 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;">default</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" icon="save">Save</md-button><md-button variant="outlined">Cancel</md-button><md-button variant="text" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-1" icon="save">Save</md-button><md-button variant="outlined" density="-1">Cancel</md-button><md-button variant="text" density="-1" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-2" icon="save">Save</md-button><md-button variant="outlined" density="-2">Cancel</md-button><md-button variant="text" density="-2" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-3" icon="save">Save</md-button><md-button variant="outlined" density="-3">Cancel</md-button><md-button variant="text" density="-3" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-4" icon="save">Save</md-button><md-button variant="outlined" density="-4">Cancel</md-button><md-button variant="text" density="-4" icon="delete">Delete</md-button></div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
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;">default</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" icon="save">Save</md-button><md-button variant="outlined">Cancel</md-button><md-button variant="text" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-1" icon="save">Save</md-button><md-button variant="outlined" density="-1">Cancel</md-button><md-button variant="text" density="-1" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-2" icon="save">Save</md-button><md-button variant="outlined" density="-2">Cancel</md-button><md-button variant="text" density="-2" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-3" icon="save">Save</md-button><md-button variant="outlined" density="-3">Cancel</md-button><md-button variant="text" density="-3" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-4" icon="save">Save</md-button><md-button variant="outlined" density="-4">Cancel</md-button><md-button variant="text" density="-4" icon="delete">Delete</md-button></div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
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;">default</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" icon="save">Save</md-button><md-button variant="outlined">Cancel</md-button><md-button variant="text" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-1" icon="save">Save</md-button><md-button variant="outlined" density="-1">Cancel</md-button><md-button variant="text" density="-1" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-2" icon="save">Save</md-button><md-button variant="outlined" density="-2">Cancel</md-button><md-button variant="text" density="-2" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-3" icon="save">Save</md-button><md-button variant="outlined" density="-3">Cancel</md-button><md-button variant="text" density="-3" icon="delete">Delete</md-button></div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;"><md-button variant="filled" density="-4" icon="save">Save</md-button><md-button variant="outlined" density="-4">Cancel</md-button><md-button variant="text" density="-4" icon="delete">Delete</md-button></div>
</div>The two are independent signals, so they compose without any extra wiring — here
a dir="rtl" container at data-density="-2". The first three buttons inherit
that rung; the fourth tightens further with density="-4"; the last escapes the
inherited rung entirely by setting the signal itself.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- 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;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="save">حفظ</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="tonal" density="-4" icon="search">أضيق</md-button>
<md-button variant="text" style="--md-sys-density-scale: 0;" icon="add">افتراضي</md-button>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<div dir="rtl" data-density="-2" style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}>
<MdButton variant="filled" icon="save">حفظ</MdButton>
<MdButton variant="outlined" trailingIcon="arrow_forward" mirror-icon>التالي</MdButton>
<MdButton variant="tonal" icon="search">بحث</MdButton>
<MdButton variant="tonal" density="-4" icon="search">أضيق</MdButton>
<MdButton variant="text" style={{ '--md-sys-density-scale': '0' }} icon="add">افتراضي</MdButton>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// 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;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="save">حفظ</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="tonal" density="-4" icon="search">أضيق</md-button>
<md-button variant="text" style="--md-sys-density-scale: 0;" icon="add">افتراضي</md-button>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div dir="rtl" data-density="-2" style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="save">حفظ</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="tonal" density="-4" icon="search">أضيق</md-button>
<md-button variant="text" style="--md-sys-density-scale: 0;" icon="add">افتراضي</md-button>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div dir="rtl" data-density="-2" style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;">
<md-button variant="filled" icon="save">حفظ</md-button>
<md-button variant="outlined" trailing-icon="arrow_forward" mirror-icon>التالي</md-button>
<md-button variant="tonal" icon="search">بحث</md-button>
<md-button variant="tonal" density="-4" icon="search">أضيق</md-button>
<md-button variant="text" style="--md-sys-density-scale: 0;" icon="add">افتراضي</md-button>
</div>Density — density="-1…-4" locally overrides the inherited data-density
rung. See Density.
i18n — the label is your slotted text, so it comes straight from your i18n
layer; lang and dir are inherited from any ancestor. Localize aria-label
too, and watch M3’s length-stability rule on toggle labels.
| Custom property | Purpose | Default |
|---|---|---|
--md-button-container-color | Container background | Per variant |
--md-button-label-color | Label + icon color | Per variant |
--md-button-icon-color | Icon-only color override | Inherits label |
--md-button-icon-size | Icon box | 16–36px per size |
--md-button-container-shape | Border radius | Per shape/size |
--md-button-outline-color / -width | outlined border | outline / 1px |
--md-button-width / -min-width / -max-width | Inline-size bounds | auto / touch target / none |
--md-button-height / -min-height | Block-size bounds | auto / touch target |
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button variant="filled" style="--md-button-container-color: var(--md-sys-color-error); --md-button-label-color: var(--md-sys-color-on-error);">Delete</md-button>
<md-button variant="filled" style="--md-button-container-shape: 4px;">Squared off</md-button>import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<MdButton variant="filled" style={{ '--md-button-container-color': 'var(--md-sys-color-error)', '--md-button-label-color': 'var(--md-sys-color-on-error)' }}>Delete</MdButton>
<MdButton variant="filled" style={{ '--md-button-container-shape': '4px' }}>Squared off</MdButton>
</>
);
}// 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-button variant="filled" style="--md-button-container-color: var(--md-sys-color-error); --md-button-label-color: var(--md-sys-color-on-error);">Delete</md-button>
<md-button variant="filled" style="--md-button-container-shape: 4px;">Squared off</md-button><script setup>
import '@awc-ui/core/define';
</script>
<template>
<md-button variant="filled" style="--md-button-container-color: var(--md-sys-color-error); --md-button-label-color: var(--md-sys-color-on-error);">Delete</md-button>
<md-button variant="filled" style="--md-button-container-shape: 4px;">Squared off</md-button>
</template><script>
import '@awc-ui/core/define';
</script>
<md-button variant="filled" style="--md-button-container-color: var(--md-sys-color-error); --md-button-label-color: var(--md-sys-color-on-error);">Delete</md-button>
<md-button variant="filled" style="--md-button-container-shape: 4px;">Squared off</md-button>CSS Parts reach inside the shadow root for things custom properties do not
cover — part="label", part="icon", part="trailing-icon":
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<style>
.upper-btn::part(label) { text-transform: uppercase; letter-spacing: .08em; font-weight: 600; }
.big-icon::part(icon) { transform: scale(1.35); }
.danger-btn {
--md-button-container-color: #B3261E;
--md-button-label-color: #FFFFFF;
--md-button-container-shape: 8px;
}
</style>
<md-button variant="filled" class="upper-btn">Uppercase label</md-button>
<md-button variant="tonal" class="big-icon" icon="favorite">Bigger icon</md-button>
<md-button variant="filled" class="danger-btn" icon="delete">Custom danger</md-button>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdButton } from '@awc-ui/react';
export function Demo() {
return (
<>
<style>
.upper-btn::part(label) { text-transform: uppercase; letter-spacing: .08em; font-weight: 600; }
.big-icon::part(icon) { transform: scale(1.35); }
.danger-btn {
--md-button-container-color: #B3261E;
--md-button-label-color: #FFFFFF;
--md-button-container-shape: 8px;
}
</style>
<MdButton variant="filled" className="upper-btn">Uppercase label</MdButton>
<MdButton variant="tonal" className="big-icon" icon="favorite">Bigger icon</MdButton>
<MdButton variant="filled" className="danger-btn" icon="delete">Custom danger</MdButton>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// 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>
.upper-btn::part(label) { text-transform: uppercase; letter-spacing: .08em; font-weight: 600; }
.big-icon::part(icon) { transform: scale(1.35); }
.danger-btn {
--md-button-container-color: #B3261E;
--md-button-label-color: #FFFFFF;
--md-button-container-shape: 8px;
}
</style>
<md-button variant="filled" class="upper-btn">Uppercase label</md-button>
<md-button variant="tonal" class="big-icon" icon="favorite">Bigger icon</md-button>
<md-button variant="filled" class="danger-btn" icon="delete">Custom danger</md-button><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<style>
.upper-btn::part(label) { text-transform: uppercase; letter-spacing: .08em; font-weight: 600; }
.big-icon::part(icon) { transform: scale(1.35); }
.danger-btn {
--md-button-container-color: #B3261E;
--md-button-label-color: #FFFFFF;
--md-button-container-shape: 8px;
}
</style>
<md-button variant="filled" class="upper-btn">Uppercase label</md-button>
<md-button variant="tonal" class="big-icon" icon="favorite">Bigger icon</md-button>
<md-button variant="filled" class="danger-btn" icon="delete">Custom danger</md-button>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<style>
.upper-btn::part(label) { text-transform: uppercase; letter-spacing: .08em; font-weight: 600; }
.big-icon::part(icon) { transform: scale(1.35); }
.danger-btn {
--md-button-container-color: #B3261E;
--md-button-label-color: #FFFFFF;
--md-button-container-shape: 8px;
}
</style>
<md-button variant="filled" class="upper-btn">Uppercase label</md-button>
<md-button variant="tonal" class="big-icon" icon="favorite">Bigger icon</md-button>
<md-button variant="filled" class="danger-btn" icon="delete">Custom danger</md-button>CSS parts — state-layer, icon, trailing-icon, label, loading.
md-button::part(label) { letter-spacing: 0.5px;}md-icon-button ·
md-fab ·
md-split-button ·
md-button-group ·
md-segmented-button ·
md-chip ·
md-ripple
md-buttonTwo 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-button 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.