//! Hand-directed integration scaffolding, not generated code: box tree construction //! now, fragment tree construction from step 3 on. Built only against `dom`'s //! spec-named accessors, never against Stylo directly (`roadmap.md` -> "DOM layer, //! shaped by Stylo": `dom` is the only crate naming `style::`/`selectors::`). //! //! Box tree and fragment tree are kept separate (`roadmap.md` -> "Decisions"): a box //! can produce many fragments, so fragmentation cannot be expressed in a single tree. pub mod absolute; pub mod boxtree; pub mod containing_block; pub mod float; pub mod fragment; mod generated; pub mod height; pub mod inline_atomic; pub mod margin; pub mod overflow; pub mod percentage; pub mod relpos; pub mod stacking; pub mod table; pub mod transform; pub mod width; /// Paint order, back to front, of every element `root` laid out, per CSS 2.1 Appendix E /// (`stacking`, `specs/stacking-order.md`). Reads the fragment tree `fragment::layout` /// already produced rather than re-running layout. Defaults to the admitted candidate /// under `generated/stacking.rs`, the same way `fragment::layout` defaults to the other /// four seams' admitted candidates. pub fn paint_order(document: &dom::Document, root: &fragment::Fragment) -> Vec { paint_order_with(document, root, generated::stacking::resolve) } /// [`paint_order`] with an explicit resolver -- what the generation runner scores a /// candidate through. pub fn paint_order_with( document: &dom::Document, root: &fragment::Fragment, resolver: stacking::StackingResolver, ) -> Vec { let (inputs, nodes) = stacking::StackingInputs::from_layout(document, root); resolver(&inputs).order.into_iter().map(|id| nodes[id]).collect() } /// Whether each box laid out under `root` gets a scrollbar on each axis, per CSS 2.1 /// ยง11.1.1 (`overflow`, `specs/overflow-scrollbars.md`). Reads the fragment tree /// `fragment::layout` already produced rather than re-running layout, the same way /// [`paint_order`] does, because this seam decides nothing that feeds back into /// placement. Defaults to the admitted candidate under `generated/overflow.rs`. pub fn scrollbars( document: &dom::Document, root: &fragment::Fragment, viewport: (f64, f64), ) -> Vec<(dom::node::NodeId, overflow::OverflowOutputs)> { scrollbars_with(document, root, viewport, generated::overflow::resolve) } /// [`scrollbars`] with an explicit resolver -- what the generation runner scores a /// candidate through. pub fn scrollbars_with( document: &dom::Document, root: &fragment::Fragment, viewport: (f64, f64), resolver: overflow::OverflowResolver, ) -> Vec<(dom::node::NodeId, overflow::OverflowOutputs)> { overflow::inputs_from_layout(document, root, viewport) .into_iter() .map(|(node, inputs)| (node, resolver(&inputs))) .collect() } /// The admitted absolute-positioning/percentage-resolution candidates `generated` holds /// privately (this module's own doc comment), re-exported for a seam whose own corpus /// needs another seam's real behavior rather than its bootstrap baseline -- unlike /// `fragment.rs`'s own use of `generated::*` internally, `generation::relpos_runner` /// lives in a different crate and cannot reach a private module directly. The height and /// stacking ones exist for `generation`'s `generated_score_check` binary, which scores each /// generated function over its own corpus. pub use generated::absolute::resolve as generated_absolute_resolve; pub use generated::containing_block::resolve as generated_containing_block_resolve; pub use generated::float::resolve as generated_float_resolve; pub use generated::height::resolve as generated_height_resolve; pub use generated::inline_atomic::resolve as generated_inline_atomic_resolve; pub use generated::margin::classify as generated_margin_classify; pub use generated::margin::combine as generated_margin_combine; pub use generated::overflow::resolve as generated_overflow_resolve; pub use generated::percentage::resolve as generated_percentage_resolve; pub use generated::relpos::resolve as generated_relpos_resolve; pub use generated::stacking::resolve as generated_stacking_resolve; pub use generated::table::columns as generated_table_columns; pub use generated::table::rows as generated_table_rows; pub use generated::transform::resolve as generated_transform_resolve; pub use generated::width::resolve as generated_width_resolve;