styled_dom::{ChangedCssProperty, NodeHierarchyItemId, NodeHierarchyItem, RestyleResult, StyledNodeState},
#[allow(clippy::too_many_lines)] // large but cohesive: single-purpose parser/builder/dispatch (one branch per input variant)
/// 2. **Content hash** — exact match including content; catches pure reorders of anonymous nodes.
/// 3. **Structural hash** — matches node type + attrs ignoring text content; for text-edit cases.
#[allow(clippy::needless_pass_by_value)] // owned azul value taken by value (public API / ownership-transfer convention)
#[allow(clippy::too_many_lines)] // large but cohesive: single-purpose parser/builder/dispatch (one branch per input variant)
#[must_use] pub fn create_migration_map(node_moves: &[NodeMove]) -> OrderedMap<NodeId, NodeId> {
let mut hasher = crate::hash::DefaultHasher::new(); // Different seed for structural keys
self.per_node.is_empty() && self.mounted_nodes.is_empty() && self.unmounted_nodes.is_empty()
#[must_use] pub fn compute(node: &NodeData, styled_state: Option<&StyledNodeState>) -> Self {
let decorated = NodeData::create_text_do_not_use_without_block_level_wrapper("totally different")
calculate_reconciliation_key(&[NodeData::create_text_do_not_use_without_block_level_wrapper("x")], &[], NodeId::new(0));
let old = vec![NodeData::create_text_do_not_use_without_block_level_wrapper("v1").with_key(1u32)];
let old = vec![NodeData::create_text_do_not_use_without_block_level_wrapper("v1").with_key(1u32)];
let new = vec![NodeData::create_text_do_not_use_without_block_level_wrapper("v2").with_key(1u32)];
let moved = LogicalRect::new(LogicalPosition::new(999.0, 999.0), LogicalSize::new(10.0, 10.0));
let new_nd = vec![NodeData::create_text_do_not_use_without_block_level_wrapper("héllo wörld")];
let old = vec![NodeData::create_text_do_not_use_without_block_level_wrapper("v1").with_key(1u32)];
let new = vec![NodeData::create_text_do_not_use_without_block_level_wrapper("v2").with_key(1u32)];
let old = vec![NodeData::create_text_do_not_use_without_block_level_wrapper("before").with_key(1u32)];
let new = vec![NodeData::create_text_do_not_use_without_block_level_wrapper("after").with_key(1u32)];
let a = NodeDataFingerprint::compute(&NodeData::create_text_do_not_use_without_block_level_wrapper(*s), Some(&state));
let b = NodeDataFingerprint::compute(&NodeData::create_text_do_not_use_without_block_level_wrapper(*s), Some(&state));
let a = NodeDataFingerprint::compute(&NodeData::create_text_do_not_use_without_block_level_wrapper("a"), None);
let a = NodeDataFingerprint::compute(&NodeData::create_text_do_not_use_without_block_level_wrapper("one"), None);
let b = NodeDataFingerprint::compute(&NodeData::create_text_do_not_use_without_block_level_wrapper("two"), None);
#[allow(clippy::too_many_lines)] // cohesive single-pass walker; splitting adds state-threading
#[must_use] pub fn fingerprint_dom(dom: &crate::dom::Dom) -> (DomFingerprints, PreCascadeTransfers) {
let (b, _) = fingerprint_dom(&sample_dom().with_child(Dom::create_text_do_not_use_without_block_level_wrapper("extra")));