# 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

Title

Supporting text

Action
...
...
``` ```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
Are you sure you want to proceed?
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 `