Documentation

Why material

PublishedUpdated

material is an independent Material Design 3 component library for the web, with Expressive components, plain JavaScript factories, web components, and framework bindings. This guide sets out what it ships, what a page downloads, and the limits to check before choosing it. See Getting started for installation.

Material 3 and Expressive coverage

Google describes M3 Expressive as an evolution of Material 3, with new and updated components, spring motion, and changes to shape, colour and typography. It does not replace every baseline component. material combines baseline components with Expressive controls and styling; the table below describes its shipped scope, rather than claiming that every option in the design guidelines is implemented.

These are the library's 37 components, grouped as in the component catalogue. Each link opens the reference for that component's options and limitations. Forms and colour pickers are additional references for material-addons, outside this count.

Actions

Component What ships
Button Filled, tonal, elevated, outlined and text; Expressive sizes and round or square shapes.
Icon button Standard, filled, tonal and outlined; toggles, Expressive sizes, shapes and widths.
Button group Standard and connected groups, with selection and shape changes.
Split button A main action paired with a menu action.
FAB Floating primary actions, size and colour variants.
Extended FAB A labelled floating action, with size variants and extension or collapse.
FAB menu Related actions opened from a FAB; rendered in the browser, not by the SSR renderer.

Selection & input

Component What ships
Checkbox Selected, unselected, indeterminate and error states.
Switch On/off state, optional icons and form participation.
Radio buttons Mutually exclusive choices with keyboard navigation.
Chips Assist, filter, input and suggestion chips.
Slider Standard, centred and range sliders, discrete steps and Expressive sizes.
Text field Filled and outlined fields, multiline input, labels, affixes and validation.
Select A field with a menu of options.
Search A search bar and a docked or full-screen search view.
Date picker Docked and modal pickers, typed input, full-screen and range selection.
Time picker Clock dial or keyboard input in a modal.
Component What ships
Navigation rail Expressive collapsed and expanded rails.
Navigation bar Destinations with labels below or beside icons, badges and hiding on scroll.
Drawer Baseline standard and modal navigation drawers.
Tabs Primary and secondary tabs with keyboard navigation.
Menu Baseline and Expressive vertical menus.
Top app bar Small, centre-aligned, medium and large bars; medium and large compress on scroll.
Bottom app bar The baseline bar remains available for existing designs.
Toolbar Expressive docked and floating toolbars, horizontal or vertical layouts, colour variants and scroll behavior.

Google's toolbar overview recommends the docked toolbar in place of the bottom app bar. Floating-toolbar collapse is not done yet: toolbars can hide on scroll (scrollBehavior: exit), rather than collapsing a floating toolbar into a smaller control or FAB on scroll. Choose the behavior that exists today rather than depending on a future update.

Containment

Component What ships
Card Elevated, filled and outlined cards.
List Rows with leading and trailing content, supporting text and selection.
Carousel Multi-browse, uncontained, hero, centre-aligned hero and full-screen layouts.
Divider Horizontal and vertical separators, including inset variants.
Dialog Modal decisions and short tasks, with focus management.
Bottom sheet Standard and modal sheets anchored to the bottom.
Side sheet Standard and modal sheets at the side.

Communication

Component What ships
Badge A dot or a short count/status label.
Progress Linear and circular, determinate and indeterminate, flat and Expressive wavy indicators.
Loading indicator The Expressive morphing-shape indicator for short waits.
Snackbar A brief message with an optional action.
Tooltip Hover and focus descriptions, placement and timing; plain and rich colour variants.

The colour roles, shape tokens and motion are shared across these components. See Theming for customisation and Architecture for how the same implementation serves the different bindings.

Measured bundle sizes

The following is the published material 3.7.2 size table, taken from its README's CI-measured rows. These are minified, gzipped outputs measured from the packed package, not estimates or the size of an entire app. Here, kB means 1,000 bytes. New releases can change these figures.

Import gzip
createButton from material, with code splitting: the initial chunks (the progress indicator loads on demand) 7.6 kB
createButton, without code splitting (the progress indicator included) 13.9 kB
createButton, createTextField and createCheckbox, without code splitting 20.4 kB
Everything the root exports (export * from 'material'), without code splitting 127.1 kB
material/styles/base 2.9 kB
material/styles/base-lite 1.6 kB
material/styles/base and material/styles/button 5.1 kB
material/styles, the full stylesheet 58.7 kB

The full stylesheet is about 59 kB gzip, against a 63.75 kB gzip CI budget. The release changelog records the underlying package measurements.

A page pays only for what it imports when its bundler tree-shakes the JavaScript and it uses selective style entries. Importing material/styles deliberately brings the whole stylesheet; importing material/styles/base and the needed component styles keeps that cost selective. Web components and framework bindings carry their shadow-root styles. The component catalogue shows per-component sizes; shared code means adding individual figures is not a reliable way to predict a combined bundle. Measure your own production build too.

Browser support

The supported target is current Chrome, Edge, Firefox and Safari. The library's browser support statement also names the ES2022 JavaScript floor and the platform features used by its elements.

Browser Components, forms and overlays CSS linear() spring motion
Chrome, current Supported Supported
Edge, current Supported Supported
Firefox, current Supported Supported
Safari, current Supported Safari 17.2 and later

In older browsers without CSS linear(), every component renders correctly without the spring transitions, provided the browser meets the JavaScript and other platform requirements. This motion fallback is not a promise of support for every old browser.

The elements use form-associated custom elements for form values and validation, and the top layer through popover and <dialog> for overlays. All current browsers in the table provide those features. Check your actual browser or embedded webview target when it is older than the current releases.

Frameworks and server rendering

There are zero runtime dependencies. React, Vue, Svelte and SolidJS are optional peer dependencies: the library uses the framework your app already has. The published README describes the shared implementation and binding contracts.

Way to use it Entry Guide
Vanilla JavaScript factories material Vanilla
Web Components material/elements Web Components
React 18 and 19 material/react React
Vue 3 material/vue Vue
Svelte 5 material/svelte Svelte
SolidJS material/solid SolidJS

For SSR, renderElement from material/ssr emits Declarative Shadow DOM, and the framework bridges are material/ssr/react, material/ssr/vue, material/ssr/svelte and material/ssr/solid. They render the same element roots on the server and hydrate in the browser. SSR targets Node and Bun; worker and edge runtimes are unsupported. Plain factories need a browser DOM; use the server entry for server output.

The SSR contract describes inline styles for a styled first paint and link mode for smaller HTML. Link mode can paint unstyled roots in WebKit until its stylesheets arrive. The FAB menu opts out of server rendering, and the React and Svelte bridges have limits around context and Suspense; check the server-rendering guide before designing around those features.

Release history and reporting issues

As of November 5, 2026, the latest published release is 3.7.2. Recent releases have been frequent: 3.7.0 was published on November 4, and 3.7.1 and 3.7.2 on November 5. That is an observed recent pace, not a promised release schedule or support response time.

Read the changelog for changes and migration notes, and the release history to check what has actually shipped. Evaluate that history against the maintenance needs of your app.

Report bugs or request features in the issue tracker. Include the package version, browser and framework, a small reproduction, and what you expected to happen. An independent project still needs evidence you can inspect: working examples, release notes and reproducible issue reports are more useful than a blanket completeness claim.

Other libraries, as of November 2026

These projects make different tradeoffs. The links below lead to each project's own description; check its current component docs and maintenance status when deciding.

Library Approach and scope
material Independent M3 and Expressive implementation with factories, web components and React, Vue, Svelte and SolidJS bindings; scope and limits are listed above.
@material/web Google's baseline M3 web components. It does not implement the M3 Expressive update; its roadmap states that it is in maintenance mode with no new features or components planned.
material-esm/material A community fork of Material Web; its README links an Expressive demo and component-specific documentation. It is a separate project from the material npm package documented here.
MDUI A Material Design 3 library built with web components, with dynamic colour, dark mode and on-demand imports.
M3E An independent Material 3 Expressive web-component project, with web components and React bindings in its package list.

There is no bundle-size ranking here: different imports, styling strategies and measurement fixtures would make the figures incomparable. Try the components your app needs and compare accessibility, integration and production output in the same app.