use rdom_core as core;
pub mod accessors;
pub mod cssom;
pub mod editing;
pub mod ext;
pub mod layout;
pub mod node;
pub mod prelude;
pub mod render;
pub mod runtime;
pub mod style;
pub mod tui_event;
pub use accessors::{
ScrollBehaviorOption, ScrollIntoViewOptions, ScrollLogicalPosition, ScrollToOptions,
TuiAccessors, TuiAccessorsMut, TuiDocAccessors,
};
pub use cssom::{extend_from_style_tags, seed_inline_styles};
pub use tui_event::{TuiDispatchExt, TuiEvent};
pub use ext::{PseudoLayout, StaticPosition, TuiExt};
pub use layout::{
Align, Border, Direction, Display, Flow, LayoutRect, Overflow, Padding, Size, UserSelect,
WhiteSpace,
};
pub use node::{TuiNodeExt, TuiNodeMutExt};
#[cfg(any(test, feature = "test-util"))]
pub use render::VirtualScreen;
pub use render::{
Backend, Buffer, Cell, CellDiff, CompletedFrame, CrosstermBackend, LayoutExt, PaintExt, Rect,
Style, Terminal, TerminalGuard, TestBackend,
};
pub use runtime::builtins::canvas::RenderContext;
pub use runtime::builtins::form::SubmitOutcome;
pub use runtime::builtins::validation::ValidityState;
pub use runtime::{
App, AppContext, AppHandle, ControlFlow, HitTestExt, RouteOutcome, Router, StylesheetId,
};
pub use style::{
CascadeExt, Color, ComputedStyle, Content, DirtyTracker, ImportantMask, Modifier,
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, ContentEditableState, DocumentPosition, DomError, Event, EventDetail,
EventPhase, FormEnctype, FormMethod, InputDetail, InputType, InputTypeState, InteractionKind,
KeyboardDetail, KeyboardModifiers, ListenerId, ListenerOptions, MouseButton, MouseDetail,
Mutation, MutationObserver, NodeData, NodeId, NodeType, ObserverId, Position, Range, Result,
Selection, SelectionSerial, SubmitDetail, ToggleDetail, ToggleState, TransitionDetail,
ValidityHook,
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn form_and_editing_vocabulary_is_reexported() {
let mut dom: TuiDom = TuiDom::new();
let input = dom.create_element("input");
assert_eq!(dom.input_type_state(input), Some(InputTypeState::Text));
dom.set_attribute(input, "contenteditable", "").unwrap();
assert_eq!(
dom.content_editable_state(input),
Some(ContentEditableState::True)
);
let hook: ValidityHook<TuiExt> = |_, _| true;
dom.set_validity_hook(Some(hook));
let serial: SelectionSerial = dom.selection_serial();
assert_eq!(serial, dom.selection_serial());
}
#[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!(ext.inline_style.is_none());
}
#[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_inline_style(
TuiStyle::new()
.fg(Color::Rgb(255, 255, 255))
.bg(Color::Rgb(0, 0, 0)),
)
.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);
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
))))
);
}
}