Modifiers

Media & Preferences

Create media and preference modifiers for adaptive styling based on user preferences like dark mode, reduced motion, and more.

Overview

Media and preference modifiers let you apply utility styles conditionally based on user preferences and media conditions. They wrap utility declarations in CSS @media queries like prefers-color-scheme: dark and prefers-reduced-motion, generating variant utility classes that adapt to the user's environment.

Why Use Media & Preference Modifiers?

Media and preference modifiers help you:

  • Support dark mode: Automatically switch colors and styles based on the user's color scheme preference
  • Respect motion preferences: Disable or reduce animations for users who prefer reduced motion
  • Handle contrast preferences: Increase or decrease contrast for users who need it
  • Target orientation: Adapt layouts for portrait and landscape orientations
  • Support print styles: Apply print-specific styling without separate stylesheets
  • Handle forced colors: Adapt to Windows High Contrast Mode and similar settings

useDarkModifier

The useDarkModifier() function creates a modifier that applies styles when the user's system prefers a dark color scheme.

styleframe.config.ts
import { styleframe } from "styleframe";
import { useBackgroundColorUtility, useTextColorUtility } from "@styleframe/theme";
import { useDarkModifier } from "@styleframe/theme";

const s = styleframe();

const dark = useDarkModifier(s);

useBackgroundColorUtility(s, {
    surface: '#ffffff',
    'surface-dark': '#1a1a2e',
}, [dark]);

useTextColorUtility(s, {
    body: '#212529',
    'body-light': '#e2e8f0',
}, [dark]);

export default s;

CSS Selector

Modifier NameMedia Query
dark@media (prefers-color-scheme: dark)

useMotionSafeModifier

The useMotionSafeModifier() function creates a modifier that applies styles only when the user has not requested reduced motion.

styleframe.config.ts
import { styleframe } from "styleframe";
import { useTransitionDurationUtility } from "@styleframe/theme";
import { useMotionSafeModifier } from "@styleframe/theme";

const s = styleframe();

const motionSafe = useMotionSafeModifier(s);

useTransitionDurationUtility(s, {
    300: '300ms',
    500: '500ms',
}, [motionSafe]);

export default s;

CSS Selector

Modifier NameMedia Query
motion-safe@media (prefers-reduced-motion: no-preference)

useMotionReduceModifier

The useMotionReduceModifier() function creates a modifier that applies styles when the user prefers reduced motion.

styleframe.config.ts
import { styleframe } from "styleframe";
import { useTransitionDurationUtility, useAnimationUtility } from "@styleframe/theme";
import { useMotionReduceModifier } from "@styleframe/theme";

const s = styleframe();

const motionReduce = useMotionReduceModifier(s);

useTransitionDurationUtility(s, {
    0: '0ms',
}, [motionReduce]);

useAnimationUtility(s, {
    none: 'none',
}, [motionReduce]);

export default s;

CSS Selector

Modifier NameMedia Query
motion-reduce@media (prefers-reduced-motion: reduce)

useContrastMoreModifier

The useContrastMoreModifier() function creates a modifier that applies styles when the user prefers more contrast.

CSS Selector

Modifier NameMedia Query
contrast-more@media (prefers-contrast: more)

useContrastLessModifier

The useContrastLessModifier() function creates a modifier that applies styles when the user prefers less contrast.

CSS Selector

Modifier NameMedia Query
contrast-less@media (prefers-contrast: less)

usePortraitModifier

The usePortraitModifier() function creates a modifier that applies styles in portrait orientation.

CSS Selector

Modifier NameMedia Query
portrait@media (orientation: portrait)

useLandscapeModifier

The useLandscapeModifier() function creates a modifier that applies styles in landscape orientation.

CSS Selector

Modifier NameMedia Query
landscape@media (orientation: landscape)

usePrintModifier

The usePrintModifier() function creates a modifier that applies styles for print media.

styleframe.config.ts
import { styleframe } from "styleframe";
import { useDisplayUtility, useBackgroundColorUtility } from "@styleframe/theme";
import { usePrintModifier } from "@styleframe/theme";

const s = styleframe();

const print = usePrintModifier(s);

useDisplayUtility(s, {
    none: 'none',
}, [print]);

useBackgroundColorUtility(s, {
    white: '#ffffff',
}, [print]);

export default s;

CSS Selector

Modifier NameMedia Query
print@media print

useForcedColorsModifier

The useForcedColorsModifier() function creates a modifier that applies styles when forced colors mode is active (e.g., Windows High Contrast Mode).

CSS Selector

Modifier NameMedia Query
forced-colors@media (forced-colors: active)

useMediaPreferenceModifiers

The useMediaPreferenceModifiers() function registers all media and preference modifiers at once and returns them as a destructurable object.

Returned Modifiers

KeyModifier NameMedia Query
darkdark@media (prefers-color-scheme: dark)
motionSafemotion-safe@media (prefers-reduced-motion: no-preference)
motionReducemotion-reduce@media (prefers-reduced-motion: reduce)
contrastMorecontrast-more@media (prefers-contrast: more)
contrastLesscontrast-less@media (prefers-contrast: less)
portraitportrait@media (orientation: portrait)
landscapelandscape@media (orientation: landscape)
printprint@media print
forcedColorsforced-colors@media (forced-colors: active)

Examples

Dark Mode with Accessible Motion

styleframe.config.ts
import { styleframe } from "styleframe";
import {
    useBackgroundColorUtility,
    useTextColorUtility,
    useTransitionDurationUtility,
} from "@styleframe/theme";
import { useMediaPreferenceModifiers } from "@styleframe/theme";

const s = styleframe();

const { dark, motionSafe, motionReduce } = useMediaPreferenceModifiers(s);

useBackgroundColorUtility(s, {
    surface: '#ffffff',
    'surface-dark': '#0f172a',
}, [dark]);

useTextColorUtility(s, {
    body: '#1e293b',
    'body-dark': '#e2e8f0',
}, [dark]);

useTransitionDurationUtility(s, {
    200: '200ms',
    0: '0ms',
}, [motionSafe, motionReduce]);

export default s;
styleframe.config.ts
import { styleframe } from "styleframe";
import {
    useDisplayUtility,
    useBackgroundColorUtility,
    useTextColorUtility,
} from "@styleframe/theme";
import { usePrintModifier } from "@styleframe/theme";

const s = styleframe();

const print = usePrintModifier(s);

useDisplayUtility(s, {
    none: 'none',
    block: 'block',
}, [print]);

useBackgroundColorUtility(s, {
    transparent: 'transparent',
}, [print]);

useTextColorUtility(s, {
    black: '#000000',
}, [print]);

export default s;

Best Practices

  • Use dark for color scheme adaptation: Provide alternative colors for dark mode without JavaScript
  • Always handle reduced motion: Use motion-reduce to disable animations for users who need it
  • Choose between motion-safe and motion-reduce: Use motion-safe to add animations (opt-in) or motion-reduce to remove them (opt-out)
  • Test print styles: Use browser print preview to verify print modifier results
  • Consider contrast preferences: Use contrast-more and contrast-less for users with visual needs
  • Use forced-colors sparingly: Only override forced colors mode when absolutely necessary for content comprehension

FAQ