perspective_viewer/components/style/style_provider.rs
1// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7// ┃ Copyright (c) 2017, the Perspective Authors. ┃
8// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9// ┃ This file is part of the Perspective library, distributed under the terms ┃
10// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
13use yew::prelude::*;
14
15use super::style_cache::StyleCache;
16
17#[derive(Properties, PartialEq)]
18pub struct StyleProviderProps {
19 pub root: web_sys::HtmlElement,
20
21 #[prop_or(true)]
22 pub is_shadow: bool,
23 pub children: Children,
24}
25
26/// A context which injects any CSS snippet registered within its tree, doing
27/// so only once for each unqiue snippet name.
28///
29/// CSS can be registered within sub-components via the `<LocalStyle>` component
30/// and `css!()` resource inlining macro.
31pub struct StyleProvider {
32 cache: StyleCache,
33}
34
35impl Component for StyleProvider {
36 type Message = ();
37 type Properties = StyleProviderProps;
38
39 fn create(ctx: &Context<Self>) -> Self {
40 let cache = StyleCache::new(ctx.props().is_shadow, &ctx.props().root);
41 Self { cache }
42 }
43
44 fn view(&self, ctx: &Context<Self>) -> Html {
45 html! {
46 <ContextProvider<StyleCache> context={self.cache.clone()}>
47 { for ctx.props().children.iter() }
48 </ContextProvider<StyleCache>>
49 }
50 }
51}