use crate::html::assets::AssetsTrait; use crate::html::{html, Markup, PreEscaped, Render}; use crate::{join_pair, AutoDefault, Weight}; // Define el origen del recurso CSS y cómo se incluye en el documento. // // Los estilos pueden cargarse desde un archivo externo o estar embebidos directamente en una // etiqueta ``. El parámetro `name` se usa como identificador interno del /// recurso. pub fn inline(name: impl Into, styles: impl Into) -> Self { StyleSheet { source: Source::Inline(name.into(), styles.into()), ..Default::default() } } // StyleSheet BUILDER ************************************************************************** /// Asocia una versión al recurso (usada para control de la caché del navegador). /// /// Si `version` está vacío, no se añade ningún parámetro a la URL. pub fn with_version(mut self, version: impl Into) -> Self { self.version = version.into(); self } /// Modifica el peso del recurso. /// /// Los recursos se renderizan de menor a mayor peso. Por defecto es `0`, que respeta el orden /// de creación. pub fn with_weight(mut self, value: Weight) -> Self { self.weight = value; self } // StyleSheet EXTRAS *************************************************************************** /// Especifica el medio donde se aplican los estilos. /// /// Según el argumento `media`: /// /// - `TargetMedia::Default` - Se aplica en todos los casos (medio por defecto). /// - `TargetMedia::Print` - Se aplican cuando el documento se imprime. /// - `TargetMedia::Screen` - Se aplican en pantallas. /// - `TargetMedia::Speech` - Se aplican en dispositivos que convierten el texto a voz. pub fn for_media(mut self, media: TargetMedia) -> Self { self.media = media; self } } impl AssetsTrait for StyleSheet { // Para hojas de estilos externas es la ruta; para las embebidas, un identificador. fn name(&self) -> &str { match &self.source { Source::From(path) => path, Source::Inline(name, _) => name, } } fn weight(&self) -> Weight { self.weight } } impl Render for StyleSheet { fn render(&self) -> Markup { match &self.source { Source::From(path) => html! { link rel="stylesheet" href=(join_pair!(path, "?v=", self.version.as_str())) media=[self.media.as_str_opt()]; }, Source::Inline(_, code) => html! { style { (PreEscaped(code)) }; }, } } }