What is @material/feature-targeting?
@material/feature-targeting is a utility package from Material Components for the web (MDC Web) that provides a way to target specific CSS features. It allows developers to write CSS that is conditionally applied based on the presence of certain features, such as CSS variables or specific browser capabilities.
What are @material/feature-targeting's main functionalities?
CSS Variable Support
This feature allows you to write CSS rules that are only applied if the browser supports CSS variables. The mixin `supports-css-variables` checks for CSS variable support and applies the enclosed styles if the feature is available.
/* Import the feature targeting mixins */
@use '@material/feature-targeting/feature-targeting';
/* Define a CSS rule that only applies if CSS variables are supported */
@include feature-targeting.supports-css-variables() {
.my-class {
color: var(--my-color, black);
}
}
Custom Property Fallbacks
This feature allows you to provide fallback styles for browsers that do not support CSS variables. The mixin `supports-css-variables` is used to conditionally apply the CSS variable-based styles, while the fallback styles are applied unconditionally.
/* Import the feature targeting mixins */
@use '@material/feature-targeting/feature-targeting';
/* Define a CSS rule with a fallback for browsers that do not support CSS variables */
.my-class {
color: black;
@include feature-targeting.supports-css-variables() {
color: var(--my-color, black);
}
}
Other packages similar to @material/feature-targeting
postcss-preset-env
postcss-preset-env is a PostCSS plugin that allows you to use future CSS features today. It includes polyfills for CSS features that are not yet widely supported, similar to how @material/feature-targeting provides conditional CSS based on feature support. However, postcss-preset-env is more comprehensive and supports a wider range of CSS features.
modernizr
Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user’s browser. It allows you to conditionally apply styles and scripts based on the presence of specific features, similar to @material/feature-targeting. Modernizr provides a more extensive set of feature detections and is not limited to CSS features.
Feature Targeting
MDC Feature Targeting provides infrastructure to allow CSS styles to be included or excluded categorically.
Most of the time, you shouldn't need to depend on mdc-feature-targeting
directly. However, understanding it can be useful if you're interested in having more control over when certain types of MDC styles are emitted.
Installation
npm install @material/feature-targeting
Basic Usage
Styles
Authoring component styles:
@use "@material/feature-targeting";
@mixin my-component-core-styles($query: feature-targeting.all()) {
$feat-structure: feature-targeting.create-target($query, structure);
@include feature-targeting.targets($feat-structure) {
}
}
Consuming component styles:
@use "@material/feature-targeting";
@use "my-component-mixins";
@include my-component-core-styles;
@include my-component-core-styles(structure);
@include my-component-core-styles(feature-targeting.any(color, typography));
@include my-component-core-styles(feature-targeting.without(animation));
Sass Mixins and Functions
Mixin | Description |
---|
targets($feature-targets...) | Conditionalizes content to only be emitted if the given feature target(s) is/are queried. |
Function | Description |
---|
create-target($feature-query, $targeted-feature) | Returns a variable to be passed to targets in order to filter emitted styles. |
all($feature-queries...) | Returns a query object which will result in emitting targets blocks that match all of the specified features. Passing no arguments results in all blocks being emitted, which is the most common use case. |
any($feature-queries...) | Returns a query object which will result in emitting targets blocks that match any of the specified features. Passing no arguments results in no blocks being emitted. |
without($feature-query) | Returns a query object which will result in emitting targets blocks that do not match the specified feature. |
$feature-query
and $feature-queries
refer to one or more of the values listed below under Supported Features.
Supported Features
MDC Web's styles are currently split according to the following features:
structure
- All baseline styles that don't fit into any other categoryanimation
- Styles responsible for causing animations and transitions to occurcolor
- Color-specific styles which rely on mdc-theme
variablestypography
- Typography-specific styles which rely on mdc-typography
13.0.0 (2021-09-24)
Bug Fixes
- Fix missing $ripple-target param for ripple mixin (1340ee9)
- banner: Adjusting theme api selectors to use
mdc-button
. (15981e9) - banner: Correcting incorrect theme values passed through to button's
theme-mixin
. (0de2f2e) - banner: exclude source from npm package (#7381) (d48a017), closes #7360
- banner: Removing
action-<state>-label-text-color
values from MDC light-theme
map. (d97f8f1) - button: cleanup outlined button theme keys (28d0d75)
- button: fix touch target reset in context of link buttons (3b8d442)
- button: remove negative padding around icons (d470693)
- button: remove rem/em transformers from typography theme-styles (a395972)
- button: stack ripple behind content (e1e69fd)
- density: typo in variable exports (6df682e)
- dom: Support providing an owner document for announcer messages. (6236f35)
- elevation: reduce warnings when not providing elevation tokens (adb9f1a)
- iconbutton: Fix icon button theme keys/light theme values based on updated tokens. (42d175e)
- menu: apply elevation overlay to new lists (0ad12ed)
- sass: Wrap templated calc expressions in strings (818f4ee), closes #7391
- slider: Reorder such that dragstart event is emitted before any other events when handling drag start. (877e3fb)
- slider: Replace
innerHTML
with firstChild
(37d4db8) - Fix compilation issues with TypeScript 4.4 (7246447)
- switch: add pointer cursor (12f5622)
- switch: distribute correct css (#7292) (7b6bcb8)
- switch: elevation theme custom properties not working (2865629)
- switch: use correct colors for icons in all HCM themes (d86fb6f)
- theme: ensure state selectors negate properly (7249a30)
- tooltip: Add a getActiveElement() method to MDCTooltipAdapter to delegate getting the active element from the correct document. (e334676)
- tooltip: Adjust tooltip
focusout
handler. Ensures that interactive tooltips remain open when ChromeVox uses linear navigation to read non-focusable content inside the tooltip. (7c96e6b) - tooltip: non-persistent tooltips disappear on scroll (1f9259b)
- update combined mdc package to use new switch CSS (077dcfc), closes #7304
- tooltip: allow the Mac zoom service to access plain tooltip contents (510cf90)
Code Refactoring
- fab: Deprecate legacy Fab theme mixins (83bdd02)
- iconbutton: Forward only theme mixins from MDC icon button index module. (0a90693)
- theme: Rename validate-keys() to validate-theme() (2fb068f)
Features
- button: add custom props to outlined button theme-styles (bf405d2)
- button: add custom props to protected button theme-styles (4ca11fe)
- button: add custom props to text button theme-styles (3dd6110)
- button: add missing transitions to box-shadow/border (3b92903)
- button: add static-styles-without-ripple for MWC consumption (f4241a4)
- button: add theme mixin that emits custom properties instead (4c40586)
- button: emit custom properties fill button theme-styles (a80c8b2)
- button: m3 elevation + icon base theme modules (2da3606)
- button: resolve elevation keys in theme mixin (843342f)
- chips: Add theming Sass mixin to MDC Filter Chip (8390093)
- chips: Add theming Sass mixin to MDC input & suggestion Chip (860ad06)
- chips: Added theme mixins to Assist Chip (d4e16a6)
- chips: Export all non-deprecated members through chips index (8647986)
- chips: Rename action's exported members to avoid naming collisions (b49359c)
- chips: Rename chip set's exported members to avoid naming collisions (13db34b)
- chips: Rename chip's exported members to avoid naming collisions (470bd34)
- data-table: Implement row click feature to MDC data table (8de07c0)
- data-table: use new select + list templates for pagination (08398f8)
- dialog: Add theme styles mixin to dialog (21ece53)
- dialog: Separate static styles from dialog core-styles mixin (43d2eed)
- fab: create theming file for small fabs (d082790)
- fab: prepare fab-extended for theming in MWC (ce25bc3)
- iconbutton: Add
.mdc-icon-button--display-flex
class that centers icon via flexbox. When using the new theme API, the icon button should have this class. (8355e14) - iconbutton: Add MDC theme mixin that declares custom properties. (fa7520f)
- iconbutton: Add theme styles mixin. (65aa63b)
- menu: Added getter method to check fixed position status of menu (fb76c50)
- menu: Adds option to prevent focus from being restored after an item action. (65084ba)
- select: start compatibility work for evolution lists (e8554db)
- theme: Added
validate-theme-keys()
mixin to validate theme keys only (457d89a)
BREAKING CHANGES
PiperOrigin-RevId: 398575780
- iconbutton: MDC iconbutton
_index
Sass module will only export theme mixins.
PiperOrigin-RevId: 391773229
- theme: Renamed Sass mixins
validate-keys()
to validate-theme()
in @material/theme
PiperOrigin-RevId: 390671152
- fab: Renamed Fab's mixins to deprecate legacy theme mixins.
PiperOrigin-RevId: 387378201