diff --git a/src/html.rs b/src/html.rs
index 3c9c796..7f18ee8 100644
--- a/src/html.rs
+++ b/src/html.rs
@@ -10,7 +10,7 @@ pub use assets::stylesheet::{StyleSheet, TargetMedia};
pub(crate) use assets::Assets;
mod context;
-pub use context::{Context, ErrorParam};
+pub use context::{Context, ContextOp, ErrorParam};
mod opt_id;
pub use opt_id::OptionId;
diff --git a/src/html/context.rs b/src/html/context.rs
index b362250..4374b14 100644
--- a/src/html/context.rs
+++ b/src/html/context.rs
@@ -13,6 +13,37 @@ use std::str::FromStr;
use std::fmt;
+/// Operaciones para modificar el contexto ([`Context`]) del documento.
+pub enum ContextOp {
+ /// Modifica el identificador de idioma del documento.
+ LangId(&'static LanguageIdentifier),
+ /// Establece el tema que se usará para renderizar el documento.
+ ///
+ /// Localiza el tema por su [`short_name`](crate::core::AnyInfo::short_name), y si no aplica
+ /// ninguno entonces usará el tema por defecto.
+ Theme(&'static str),
+ /// Define el tipo de composición usado para renderizar el documento.
+ Layout(&'static str),
+
+ // Favicon.
+ /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior.
+ SetFavicon(Option),
+ /// Define el *favicon* solo si no se ha establecido previamente.
+ SetFaviconIfNone(Favicon),
+
+ // Stylesheets.
+ /// Añade una hoja de estilos CSS al documento.
+ AddStyleSheet(StyleSheet),
+ /// Elimina una hoja de estilos por su ruta o identificador.
+ RemoveStyleSheet(&'static str),
+
+ // JavaScripts.
+ /// Añade un *script* JavaScript al documento.
+ AddJavaScript(JavaScript),
+ /// Elimina un *script* por su ruta o identificador.
+ RemoveJavaScript(&'static str),
+}
+
/// Errores de lectura o conversión de parámetros almacenados en el contexto.
#[derive(Debug)]
pub enum ErrorParam {
@@ -33,48 +64,52 @@ impl fmt::Display for ErrorParam {
impl Error for ErrorParam {}
-/// Representa el contexto asociado a un documento HTML.
+/// Representa el contexto de un documento HTML.
///
-/// Esta estructura se crea internamente para recoger información relativa al documento asociado,
-/// como la solicitud HTTP de origen, el idioma, el tema para renderizar ([`ThemeRef`]), y los
-/// recursos *favicon* ([`Favicon`]), las hojas de estilo ([`StyleSheet`]) y los *scripts*
-/// ([`JavaScript`]). También admite parámetros de contexto definidos en tiempo de ejecución.
+/// Se crea internamente para manejar información relevante del documento, como la solicitud HTTP de
+/// origen, el idioma, tema y composición para el renderizado, los recursos *favicon* ([`Favicon`]),
+/// hojas de estilo ([`StyleSheet`]) y *scripts* ([`JavaScript`]), así como parámetros de contexto
+/// definidos en tiempo de ejecución.
///
/// # Ejemplo
///
/// ```rust
/// use pagetop::prelude::*;
///
-/// fn configure_context(mut ctx: Context) {
+/// fn configure_context(mut cx: Context) {
/// // Establece el idioma del documento a español.
-/// ctx.set_langid(LangMatch::langid_or_default("es-ES"));
-///
+/// cx.alter_assets(ContextOp::LangId(
+/// LangMatch::langid_or_default("es-ES")
+/// ))
/// // Selecciona un tema (por su nombre corto).
-/// ctx.set_theme("aliner");
-///
+/// .alter_assets(ContextOp::Theme("aliner"))
/// // Asigna un favicon.
-/// ctx.set_favicon(Some(Favicon::new().with_icon("/icons/favicon.ico")));
-///
+/// .alter_assets(ContextOp::SetFavicon(Some(
+/// Favicon::new().with_icon("/icons/favicon.ico")
+/// )))
/// // Añade una hoja de estilo externa.
-/// ctx.add_stylesheet(StyleSheet::from("/css/style.css"));
-///
+/// .alter_assets(ContextOp::AddStyleSheet(
+/// StyleSheet::from("/css/style.css")
+/// ))
/// // Añade un script JavaScript.
-/// ctx.add_javascript(JavaScript::defer("/js/main.js"));
+/// .alter_assets(ContextOp::AddJavaScript(
+/// JavaScript::defer("/js/main.js")
+/// ));
///
/// // Añade un parámetro dinámico al contexto.
-/// ctx.set_param("usuario_id", 42);
+/// cx.set_param("usuario_id", 42);
///
/// // Recupera el parámetro y lo convierte a su tipo original.
-/// let id: i32 = ctx.get_param("usuario_id").unwrap();
+/// let id: i32 = cx.get_param("usuario_id").unwrap();
/// assert_eq!(id, 42);
///
/// // Recupera el tema seleccionado.
-/// let active_theme = ctx.theme();
+/// let active_theme = cx.theme();
/// assert_eq!(active_theme.short_name(), "aliner");
///
/// // Genera un identificador único para un componente de tipo `Menu`.
/// struct Menu;
-/// let unique_id = ctx.required_id::