use rdom_core as core;
pub mod accessors;
pub mod cssom;
pub mod editing;
pub mod ext;
pub mod node;
pub mod prelude;
pub mod render;
pub mod runtime;
pub mod style;
pub mod tui_event;
pub use rdom_style::layout;
pub use accessors::{TuiAccessors, TuiAccessorsMut, TuiDocAccessors};
pub use cssom::{extend_from_style_tags, seed_inline_styles};
pub use tui_event::{TuiDispatchExt, TuiEvent};
pub use ext::{PseudoLayout, TuiExt};
pub use layout::{
Align, Border, Direction, Display, Flow, LayoutRect, Overflow, Padding, Size, UserSelect,
WhiteSpace,
};
pub use node::{TuiNodeExt, TuiNodeMutExt};
pub use render::{
Backend, Buffer, Cell, CellDiff, CompletedFrame, CrosstermBackend, LayoutExt, PaintExt, Rect,
RenderContext, Style, Terminal, TerminalGuard, TestBackend, VirtualScreen,
};
pub use runtime::{
App, AppContext, AppHandle, ControlFlow, HitTestExt, RouteOutcome, Router, StylesheetId,
};
pub use style::{
CascadeExt, Color, ComputedStyle, Content, DirtyTracker, INHERITS_MASK, ImportantMask,
LAYOUT_MASK, Modifier, PropMask, PseudoElementTarget, Rule, RuleOrigin, Specificity,
StyleError, Stylesheet, TuiColor, TuiStyle, Value, VarMap, parse_color, resolve_tui_color,
};
pub type TuiDom = core::Dom<TuiExt>;
pub type TuiNodeRef<'a> = core::NodeRef<'a, TuiExt>;
pub type TuiNodeMut<'a> = core::NodeMut<'a, TuiExt>;
pub type TuiEventCtx<'a> = core::EventCtx<'a, TuiExt>;
pub use rdom_core as core_api;
pub use rdom_core::{
AdjacentPosition, DocumentPosition, DomError, Event, EventDetail, EventPhase, InputDetail,
InputType, InteractionKind, KeyboardDetail, KeyboardModifiers, ListenerId, ListenerOptions,
MouseButton, MouseDetail, Mutation, MutationObserver, NodeData, NodeId, NodeType, ObserverId,
Position, Range, Result, Selection, SubmitDetail, ToggleDetail, ToggleState, TransitionDetail,
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tui_dom_aliases_compile() {
let mut dom: TuiDom = TuiDom::new();
let root = dom.root();
let div = dom.create_element("div");
dom.append_child(root, div).unwrap();
let node: TuiNodeRef<'_> = dom.node(div);
assert_eq!(node.tag_name(), Some("div"));
let mut node_mut: TuiNodeMut<'_> = dom.node_mut(div);
node_mut.set_id("hero").unwrap();
assert_eq!(dom.node(div).get_attribute("id"), Some("hero"));
}
#[test]
fn default_ext_is_default_tui_ext() {
let ext: TuiExt = TuiExt::default();
assert_eq!(ext.direction, Direction::Column);
assert_eq!(ext.width, Size::Auto);
}
#[test]
fn event_dispatch_works_over_tui_ext() {
use std::cell::Cell;
use std::rc::Rc;
let mut dom: TuiDom = TuiDom::new();
let btn = dom.create_element("button");
let fired = Rc::new(Cell::new(false));
let f = fired.clone();
dom.add_event_listener(
btn,
"click",
ListenerOptions::default(),
move |_ctx: &mut TuiEventCtx<'_>| {
f.set(true);
},
)
.unwrap();
let mut e = Event::new("click");
dom.dispatch_event(btn, &mut e).unwrap();
assert!(fired.get());
}
#[test]
fn query_selector_works_over_tui_ext() {
let mut dom: TuiDom = TuiDom::new();
let root = dom.root();
let div = dom.create_element("div");
dom.node_mut(div).set_id("target").unwrap();
dom.append_child(root, div).unwrap();
assert_eq!(dom.query_selector_in(root, "#target").unwrap(), Some(div));
}
#[test]
fn presentation_builder_end_to_end() {
let mut dom: TuiDom = TuiDom::new();
let root = dom.root();
let div = dom.create_element("div");
dom.node_mut(div)
.set_width(Size::Fixed(80))
.set_height(Size::Flex(1))
.set_padding(Padding::symmetric(2, 1))
.set_border(Border::rounded())
.set_gap(1)
.set_direction(Direction::Row)
.set_inline_style(
TuiStyle::new()
.fg(Color::Rgb(255, 255, 255))
.bg(Color::Rgb(0, 0, 0)),
);
dom.append_child(root, div).unwrap();
let n = dom.node(div);
assert_eq!(n.width(), Some(Size::Fixed(80)));
assert_eq!(n.padding(), Some(Padding::symmetric(2, 1)));
assert_eq!(n.border(), Some(Border::rounded()));
assert_eq!(
n.inline_style().unwrap().fg,
Some(Value::Specified(TuiColor::Literal(Color::Rgb(
255, 255, 255
))))
);
}
}