Skip to main content

ratatui_style/
lib.rs

1//! # ratatui-style
2//!
3//! A CSS cascade engine for ratatui — selectors, specificity, inheritance,
4//! pseudo-states, and data-driven styling. Produces native ratatui `Style` /
5//! `Block` / `Constraint` values; it is never a parallel rendering stack.
6//!
7//! See [`design.md`](https://github.com/Liangdi/a2ui/blob/master/crates/ratatui-style/design.md)
8//! for the full RFC.
9//!
10//! # Quick start (L1 — stylesheet + class)
11//!
12//! ```
13//! use ratatui_style::{CssStyle, Origin, OwnedNode, Stylesheet};
14//!
15//! let mut sheet = Stylesheet::new();
16//! sheet.add(
17//!     "Button.primary",
18//!     CssStyle::new().color("#fff").background("blue").bold(),
19//!     Origin::User,
20//! )
21//! .unwrap();
22//!
23//! let node = OwnedNode::new("Button").with_classes(["primary"]);
24//! let computed = sheet.compute(&node, None);
25//! let _ratatui_style = computed.to_style();
26//! ```
27
28#![forbid(unsafe_code)]
29
30pub mod box_model;
31pub mod cache;
32pub mod cascade;
33pub mod color;
34pub mod css_macro;
35pub mod error;
36pub mod media;
37pub mod node;
38pub mod runtime;
39pub mod selector;
40pub mod style;
41pub mod stylesheet;
42pub mod supports;
43pub mod token;
44
45#[cfg(feature = "themekit")]
46pub mod themekit;
47
48// The `scss!` macro calls into `grass`; re-export it at the crate root so the
49// macro resolves in downstream crates without them depending on `grass`.
50#[cfg(feature = "scss")]
51pub mod scss_macro;
52
53#[cfg(feature = "scss")]
54pub use grass;
55
56// Re-exports — the primary public surface.
57pub use box_model::{
58    BorderSpec, BorderStyle, BorderStyleValue, BoxEdges, BoxEdgesValue, IntoBorderSpec,
59    IntoBoxEdges, Length,
60};
61pub use cache::ComputeCache;
62pub use cascade::{render_computed, CascadeContext, ComputedStyle, ComputeScratch};
63pub use color::Color;
64pub use error::{CssError, CssErrorKind, Loc, Result};
65pub use media::{MediaAlternative, MediaCondition, MediaContext, MediaQuery, MediaTerm};
66pub use node::{Classes, NodeRef, OwnedNode, Position, State, StyledNode};
67pub use runtime::RuntimeStyle;
68pub use selector::{Combinator, NthExpr, Pseudo, PseudoClass, Selector};
69pub use style::{Align, CssStyle, FontStyle, TextDecoration, Weight};
70pub use stylesheet::{apply_decl, Origin, RuleEntry, Stylesheet};
71pub use supports::{SupportsAlternative, SupportsCondition, SupportsQuery, SupportsTerm};
72pub use token::ThemeTokens;
73
74/// Convenience re-exports — `use ratatui_style::prelude::*;` to pull in the
75/// common public surface in one line.
76///
77/// This is purely an ergonomic entry point: every item here is also re-exported
78/// at the crate root, so the prelude adds nothing new — it just gathers the
79/// types/traits/functions/macros a downstream app most often needs into one
80/// glob-importable list.
81///
82/// The `css!` macro is `#[macro_export]`-ed at the crate root and (as a
83/// `macro_rules!`) cannot be reliably re-exported through a module glob, so it
84/// is **not** included here. Import it directly:
85///
86/// ```rust,ignore
87/// use ratatui_style::css;
88/// ```
89pub mod prelude {
90    pub use crate::box_model::{
91        BorderSpec, BorderStyle, BorderStyleValue, BoxEdges, BoxEdgesValue, IntoBorderSpec,
92        IntoBoxEdges, Length,
93    };
94    pub use crate::cache::ComputeCache;
95    pub use crate::cascade::{render_computed, CascadeContext, ComputedStyle, ComputeScratch};
96    pub use crate::color::Color;
97    pub use crate::error::{CssError, CssErrorKind, Loc, Result};
98    pub use crate::media::{MediaAlternative, MediaCondition, MediaContext, MediaQuery, MediaTerm};
99    pub use crate::node::{Classes, NodeRef, OwnedNode, Position, State, StyledNode};
100    pub use crate::runtime::RuntimeStyle;
101    pub use crate::selector::{Combinator, NthExpr, Pseudo, PseudoClass, Selector};
102    pub use crate::style::{Align, CssStyle, FontStyle, TextDecoration, Weight};
103    pub use crate::stylesheet::{Origin, RuleEntry, Stylesheet};
104    pub use crate::supports::{SupportsAlternative, SupportsCondition, SupportsQuery, SupportsTerm};
105    pub use crate::token::ThemeTokens;
106}