///|
pub using @renderer_api {
  type CssMutation,
  type CssMutationAction,
  type RenderVariant,
  type RenderVariantResult,
}

///|
pub using @core_subset_pkg {type CoreIssue, type CoreComputeResult}

///|
/// Compute layout through the dedicated layout package boundary.
pub fn compute_layout(
  node : @layout.Node,
  viewport : @types.Size[Double],
) -> @types.Layout {
  @layout.compute_layout(node, viewport)
}

///|
/// Compute layout with warnings through the layout package boundary.
pub fn compute_layout_with_warnings(
  node : @layout.Node,
  viewport : @types.Size[Double],
) -> @types.LayoutResult {
  @layout.compute_layout_with_warnings(node, viewport)
}

///|
/// Compute block layout directly
pub fn compute_block_layout(
  node : @layout.Node,
  ctx : @types.LayoutContext,
) -> @types.Layout {
  @layout.compute_block_layout(node, ctx)
}

///|
/// Compute flex layout directly
pub fn compute_flex_layout(
  node : @layout.Node,
  ctx : @types.LayoutContext,
) -> @types.Layout {
  @layout.compute_flex_layout(node, ctx)
}

///|
pub fn validate_core_subset(node : @layout.Node) -> Array[CoreIssue] {
  @core_subset_pkg.validate_core_subset(node)
}

///|
pub fn compute_core_layout(
  node : @layout.Node,
  viewport : @types.Size[Double],
) -> CoreComputeResult {
  @core_subset_pkg.compute_core_layout(node, viewport)
}

///|
/// Compute element shift (CLS)
pub fn compute_element_shift(
  before : @types.BoundingRect,
  after : @types.BoundingRect,
  viewport : @types.Size[Double],
) -> @webvitals.LayoutShift {
  @webvitals.compute_element_shift(before, after, viewport)
}

///|
/// Compute total CLS score
pub fn compute_total_cls(
  before : Array[@types.BoundingRect],
  after : Array[@types.BoundingRect],
  viewport : @types.Size[Double],
) -> Double {
  @webvitals.compute_total(before, after, viewport)
}

///|
pub fn render_html_to_paint_tree(
  html : String,
  viewport : @types.Size[Double],
) -> @paint.PaintNode {
  @renderer_api.render_html_to_paint_tree(html, viewport)
}

///|
pub fn render_html_to_paint_tree_with_external_css(
  html : String,
  viewport : @types.Size[Double],
  external_css : Array[String],
) -> @paint.PaintNode {
  @renderer_api.render_html_to_paint_tree_with_external_css(
    html, viewport, external_css,
  )
}

///|
pub fn render_html_to_paint_tree_json(
  html : String,
  viewport : @types.Size[Double],
) -> String {
  @renderer_api.render_html_to_paint_tree_json(html, viewport)
}

///|
pub fn diff_rendered_paint_trees(
  baseline_html : String,
  current_html : String,
  viewport : @types.Size[Double],
) -> @paint.PaintTreeDiff {
  @renderer_api.diff_rendered_paint_trees(baseline_html, current_html, viewport)
}

///|
pub fn render_html_batch_variants(
  html : String,
  viewport : @types.Size[Double],
  variants : Array[RenderVariant],
) -> Array[RenderVariantResult] {
  @renderer_api.render_html_batch_variants(html, viewport, variants)
}