leptos_use/
use_preferred_contrast.rs

1use crate::use_media_query;
2use leptos::prelude::*;
3use leptos::reactive::wrappers::read::Signal;
4use std::fmt::Display;
5
6/// Reactive [prefers-contrast](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-contrast) media query.
7///
8/// ## Usage
9///
10/// ```
11/// # use leptos::prelude::*;
12/// # use leptos_use::use_preferred_contrast;
13/// #
14/// # #[component]
15/// # fn Demo() -> impl IntoView {
16/// #
17/// let preferred_contrast = use_preferred_contrast();
18/// #
19/// #    view! { }
20/// # }
21/// ```
22///
23/// ## Server-Side Rendering
24///
25/// On the server this returns a `Signal` that always contains the value `PreferredContrast::NoPreference`.
26///
27/// ## See also
28///
29/// * [`fn@crate::use_media_query`]
30/// * [`fn@crate::use_preferred_dark`]
31/// * [`fn@crate::use_prefers_reduced_motion`]
32pub fn use_preferred_contrast() -> Signal<PreferredContrast> {
33    let is_more = use_media_query("(prefers-contrast: more)");
34    let is_less = use_media_query("(prefers-contrast: less)");
35    let is_custom = use_media_query("(prefers-contrast: custom)");
36
37    Signal::derive(move || {
38        if is_more.get() {
39            PreferredContrast::More
40        } else if is_less.get() {
41            PreferredContrast::Less
42        } else if is_custom.get() {
43            PreferredContrast::Custom
44        } else {
45            PreferredContrast::NoPreference
46        }
47    })
48}
49
50/// Return value for [`use_preferred_contrast`]
51#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
52pub enum PreferredContrast {
53    More,
54    Less,
55    Custom,
56    #[default]
57    NoPreference,
58}
59impl Display for PreferredContrast {
60    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
61        match self {
62            PreferredContrast::More => write!(f, "more"),
63            PreferredContrast::Less => write!(f, "less"),
64            PreferredContrast::Custom => write!(f, "custom"),
65            PreferredContrast::NoPreference => write!(f, "no-preference"),
66        }
67    }
68}