# MD3 Component Catalog
Complete reference for Material Design 3 components. **Primary mappings:** Jetpack Compose (`androidx.compose.material3`) where most users ship UIs today; **web** uses `@material/web` element names and imports — [Material Web is maintenance-only](https://m3.material.io/develop/web).
## Google I/O 2026 Component Updates
Material's [I/O 2026 update](https://m3.material.io/blog/whats-new-at-io26) highlights refreshed expressive guidance for **lists**, **menus**, **search**, and **search app bars**, with Jetpack Compose as the primary implementation path. When implementing these in Android:
- Prefer current `androidx.compose.material3` components and verify expressive APIs against the active Material3 BOM.
- Expect expressive variants to include richer visual style, motion, and flexible configuration.
- Treat web implementations as spec-aligned approximations unless Material Web exposes an equivalent component; Material Web remains maintenance-only.
## Actions
### Buttons
MD3 has 5 button types ordered by emphasis: Filled > Filled Tonal > Elevated > Outlined > Text.
**General attributes** (shared by all button types):
| Attribute | Type | Description |
|-----------|------|-------------|
| `disabled` | boolean | Disables the button |
| `href` | string | Turns button into a link |
| `target` | string | Link target (`_blank`, etc.) |
| `trailing-icon` | boolean | Moves icon to trailing position |
| `type` | string | Form type: `button`, `submit`, `reset` |
#### Filled Button
**Element**: `md-filled-button` | **Import**: `@material/web/button/filled-button.js`
**Use when**: Primary action, highest emphasis.
```html
Get started
arrow_forward
Sign up
```
**Customize**: `--md-filled-button-container-color`, `--md-filled-button-label-text-color`, `--md-filled-button-container-shape`, `--md-filled-button-container-height`
#### Filled Tonal Button
**Element**: `md-filled-tonal-button` | **Import**: `@material/web/button/filled-tonal-button.js`
**Use when**: Medium emphasis, softer than filled. Secondary actions alongside a filled button.
```html
Save draft
```
**Customize**: `--md-filled-tonal-button-container-color`, `--md-filled-tonal-button-label-text-color`
#### Elevated Button
**Element**: `md-elevated-button` | **Import**: `@material/web/button/elevated-button.js`
**Use when**: Medium emphasis with shadow. Use on colored backgrounds where tonal button blends in.
```html
Add to cart
```
#### Outlined Button
**Element**: `md-outlined-button` | **Import**: `@material/web/button/outlined-button.js`
**Use when**: Medium emphasis, neutral. Good for secondary actions.
```html
Cancel
```
**Customize**: `--md-outlined-button-outline-color`, `--md-outlined-button-outline-width`
#### Text Button
**Element**: `md-text-button` | **Import**: `@material/web/button/text-button.js`
**Use when**: Lowest emphasis. Inline actions, dialog actions, less important options.
```html
Learn more
```
#### Button Sizes (Expressive)
Buttons now support 5 sizes: extra-small, small (default), medium, large, extra-large. Set via CSS:
```css
md-filled-button { --md-filled-button-container-height: 32px; } /* XS */
md-filled-button { --md-filled-button-container-height: 40px; } /* S (default) */
md-filled-button { --md-filled-button-container-height: 48px; } /* M */
md-filled-button { --md-filled-button-container-height: 56px; } /* L */
md-filled-button { --md-filled-button-container-height: 64px; } /* XL */
```
**A11y**: Buttons have built-in button role. Use `aria-label` when using icon-only buttons. Minimum touch target 48x48dp.
### Button Group
**Element**: `md-button-group` | **Import**: `@material/web/button/button-group.js`
**Use when**: Grouping related actions together with connected visual treatment.
```html
Day
Week
Month
```
### FAB (Floating Action Button)
**Element**: `md-fab` | **Import**: `@material/web/fab/fab.js`
**Use when**: The single most important action on a screen.
| Attribute | Type | Description |
|-----------|------|-------------|
| `size` | string | `small`, `medium` (default), `large` |
| `variant` | string | `surface`, `primary`, `secondary`, `tertiary` |
| `label` | string | Text label (for extended FAB) |
```html
add
edit
```
**Customize**: `--md-fab-container-color`, `--md-fab-container-shape`, `--md-fab-icon-color`
**A11y**: Always provide `aria-label` since FABs are icon-only.
### Extended FAB
**Element**: `md-extended-fab` | **Import**: `@material/web/fab/extended-fab.js`
**Use when**: Primary action with explanatory text.
```html
edit
```
### Icon Button
**Element**: `md-icon-button` | **Import**: `@material/web/iconbutton/icon-button.js`
4 variants with separate elements:
| Variant | Element | Import |
|---------|---------|--------|
| Standard | `md-icon-button` | `@material/web/iconbutton/icon-button.js` |
| Filled | `md-filled-icon-button` | `@material/web/iconbutton/filled-icon-button.js` |
| Filled Tonal | `md-filled-tonal-icon-button` | `@material/web/iconbutton/filled-tonal-icon-button.js` |
| Outlined | `md-outlined-icon-button` | `@material/web/iconbutton/outlined-icon-button.js` |
| Attribute | Type | Description |
|-----------|------|-------------|
| `toggle` | boolean | Enables toggle behavior |
| `selected` | boolean | Selected state (when toggle) |
```html
settings
favorite_border
favorite
```
**A11y**: Always provide `aria-label`. Toggle buttons should have descriptive labels for both states.
### Segmented Buttons
**No @material/web element yet.** Implement with standard HTML + MD3 tokens:
```html
```
```css
.md3-segmented-buttons {
display: flex;
border: 1px solid var(--md-sys-color-outline);
border-radius: var(--md-sys-shape-corner-full);
overflow: hidden;
}
.md3-segmented-button {
flex: 1;
padding: 10px 16px;
border: none;
background: transparent;
color: var(--md-sys-color-on-surface);
cursor: pointer;
font: var(--md-sys-typescale-label-large);
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.md3-segmented-button--selected {
background: var(--md-sys-color-secondary-container);
color: var(--md-sys-color-on-secondary-container);
}
```
## Communication
### Badge
**No @material/web element yet.** Implement with CSS:
```html
notifications
3
```
```css
.md3-badge-container { position: relative; display: inline-flex; }
.md3-badge {
position: absolute;
top: -4px;
right: -4px;
background: var(--md-sys-color-error);
color: var(--md-sys-color-on-error);
border-radius: var(--md-sys-shape-corner-full);
font: var(--md-sys-typescale-label-small);
}
.md3-badge--small { width: 6px; height: 6px; padding: 0; } /* dot only */
.md3-badge--large { min-width: 16px; height: 16px; padding: 0 4px; text-align: center; }
```
### Progress Indicator
**Elements**: `md-linear-progress`, `md-circular-progress`
**Import**: `@material/web/progress/linear-progress.js`, `@material/web/progress/circular-progress.js`
| Attribute | Type | Description |
|-----------|------|-------------|
| `value` | number | Current progress (0–1) |
| `max` | number | Maximum value (default 1) |
| `indeterminate` | boolean | Shows indeterminate animation |
| `four-color` | boolean | Four-color indeterminate variant |
```html
```
**Customize**: `--md-linear-progress-active-indicator-color`, `--md-circular-progress-active-indicator-color`
**A11y**: Has built-in `progressbar` role. Add `aria-label` for context (e.g., "Loading messages").
### Snackbar
**No @material/web element yet.** Implement with standard HTML:
```html
Message sent
Undo
close
```
```css
.md3-snackbar {
background: var(--md-sys-color-inverse-surface);
color: var(--md-sys-color-inverse-on-surface);
border-radius: var(--md-sys-shape-corner-extra-small);
padding: 12px 16px;
display: flex;
align-items: center;
gap: 8px;
min-height: 48px;
max-width: 560px;
}
```
### Tooltip
**No @material/web element yet.**
Two types:
- **Plain**: Short text label, appears on hover/focus. Use for icon buttons and truncated text.
- **Rich**: Multi-line with optional actions. Use for complex explanations.
## Containment
### Card
**No @material/web element yet.** Three variants:
| Variant | Appearance | Elevation |
|---------|-----------|-----------|
| Filled | Surface-container-highest fill, no border | Level 0 |
| Outlined | Surface fill, outline-variant border | Level 0 |
| Elevated | Surface-container-low fill, shadow | Level 1 |
```html
...
...
```
```css
.md3-card {
border-radius: var(--md-sys-shape-corner-medium, 12px);
overflow: hidden;
}
.md3-card--outlined {
background: var(--md-sys-color-surface);
border: 1px solid var(--md-sys-color-outline-variant);
}
.md3-card--filled {
background: var(--md-sys-color-surface-container-highest);
}
.md3-card--elevated {
background: var(--md-sys-color-surface-container-low);
box-shadow: 0 1px 2px rgba(0,0,0,0.3), 0 1px 3px 1px rgba(0,0,0,0.15);
}
.md3-card__content { padding: 16px; }
.md3-card__actions { padding: 16px; display: flex; gap: 8px; justify-content: flex-end; }
```
### Dialog
**Element**: `md-dialog` | **Import**: `@material/web/dialog/dialog.js`
| Attribute | Type | Description |
|-----------|------|-------------|
| `open` | boolean | Shows the dialog |
| `type` | string | `alert` (default) |
```html
Confirm action
Cancel
Confirm
```
**A11y**: Dialog traps focus automatically. Use `slot="headline"` for accessible title.
### Bottom Sheet
**No @material/web element yet.** Two variants: Standard (persistent, coexists with content) and Modal (blocks interaction, has scrim).
### Side Sheet
**No @material/web element yet.** Two variants: Standard (docked alongside content) and Modal (overlays content with scrim).
### Divider
**Element**: `md-divider` | **Import**: `@material/web/divider/divider.js`
| Attribute | Type | Description |
|-----------|------|-------------|
| `inset` | boolean | Adds inset on both sides |
| `inset-start` | boolean | Adds inset on start side |
| `inset-end` | boolean | Adds inset on end side |
```html
```
### Carousel
**No @material/web element yet.** Three configurations:
- **Multi-browse**: Multiple items visible, scrollable
- **Uncontained**: Items extend beyond viewport edges
- **Hero**: One large featured item with smaller previews
## Input
### Checkbox
**Element**: `md-checkbox` | **Import**: `@material/web/checkbox/checkbox.js`
| Attribute | Type | Description |
|-----------|------|-------------|
| `checked` | boolean | Checked state |
| `indeterminate` | boolean | Indeterminate state |
| `disabled` | boolean | Disabled state |
| `required` | boolean | Required for form validation |
```html
```
**A11y**: Wrap in `