{"version":3,"sources":["../src/layout.ts","../src/corner-smoothing.ts","../src/scene.ts"],"sourcesContent":["import {\n  Background as LayoutBackground,\n  LayoutEngine,\n  Frame as LayoutFrame,\n  HStack as LayoutHStack,\n  Noop as LayoutNoop,\n  Overlay as LayoutOverlay,\n  Padding as LayoutPadding,\n  Spacer as LayoutSpacer,\n  VStack as LayoutVStack,\n  ZStack as LayoutZStack,\n} from '@liquid-dom/layout'\nimport {\n  DomLeaf,\n  type DomLeafOptions,\n  type DomLeafSizing,\n} from '@liquid-dom/layout/dom'\nimport {\n  Container as SceneContainer,\n  Glass as SceneGlass,\n  Group as SceneGroup,\n  Html as SceneHtml,\n  Scene as GlassScene,\n  StackingContext as SceneStackingContext,\n  type ContainerInit,\n  type GlassInit,\n} from './scene'\nimport type {\n  Alignment,\n  DecorationOptions,\n  FrameNode,\n  FrameOptions,\n  InsetsInput,\n  LayoutDebugStats,\n  LayoutEngineOptions,\n  LayoutInvalidation,\n  LayoutNode,\n  PaddingNode,\n  PaddingOptions,\n  ProposedSize,\n  Rect,\n  SpacerNode,\n  SpacerOptions,\n  StackAlignment,\n  StackNode,\n  StackOptions,\n  ZStackNode,\n  ZStackOptions,\n} from '@liquid-dom/layout'\nimport type { Point, RgbaColor, SpecularWidth, SurfaceProfile, Transform as SceneTransform } from './types'\n\ntype SceneNode = SceneContainer | SceneGlass | SceneGroup | SceneStackingContext | SceneHtml\ntype SceneParent = GlassScene | SceneNode\ntype UiParent = LayoutScene | UiNode\n\n/** Any node accepted by the layout UI tree. */\nexport type LayoutUiNode =\n  | HStack\n  | VStack\n  | Frame\n  | Padding\n  | Overlay\n  | Background\n  | ZStack\n  | Transform\n  | GlassContainer\n  | Glass\n  | Html\n  | Spacer\n\n/** Constructor options for {@link LayoutScene}. */\nexport type LayoutSceneOptions = Omit<LayoutEngineOptions, 'root'> & {\n  /** Optional root node to attach immediately. */\n  root?: LayoutUiNode\n}\n\n/** Kind of layout UI invalidation emitted by {@link LayoutScene}. */\nexport type LayoutSceneInvalidationKind = 'layout' | 'frame'\n\n/** Invalidation emitted when layout UI nodes are mutated imperatively. */\nexport type LayoutSceneInvalidation = {\n  /** Whether the mutation requires a layout pass or only a new frame. */\n  kind: LayoutSceneInvalidationKind\n  /** Optional source node for mutations that came from the layout UI tree. */\n  node?: LayoutUiNode\n  /** Optional low-level invalidation detail. */\n  cause?: unknown\n}\n\n/** Listener registered with {@link LayoutScene.addInvalidationListener}. */\nexport type LayoutSceneInvalidationListener = (invalidation: LayoutSceneInvalidation) => void\n\n/** Constructor options for {@link GlassContainer}. */\nexport type GlassContainerOptions = Omit<ContainerInit, keyof SceneTransform>\n\n/** Constructor options for {@link Glass}. */\nexport type GlassOptions = Omit<GlassInit, keyof SceneTransform | 'width' | 'height'>\n\n/** Constructor options for {@link Html}. */\nexport type HtmlOptions = {\n  /** Final opacity used when compositing this HTML node into the rendered scene. */\n  opacity?: number\n  /** Content blur radius in CSS pixels applied when compositing this HTML node. */\n  blur?: number\n  /** Scene draw order among sibling scene or glass HTML nodes. */\n  zIndex?: number\n  /** Measured content element rendered inside the layout-owned scene HTML host. */\n  element?: HTMLElement | null\n  /** DOM measurement mode used by the default DOM measurement path. */\n  sizing?: DomLeafSizing\n}\n\n/** Unit-space origin for a layout transform. `{ x: 0, y: 0 }` is top-left and `{ x: 0.5, y: 0.5 }` is center. */\nexport type UnitPoint = {\n  x: number\n  y: number\n}\n\n/** Constructor options for {@link Transform}. */\nexport type TransformOptions = Omit<Partial<SceneTransform>, 'origin'> & {\n  /** Transform origin as a unit point in the layout node's measured bounds. */\n  origin?: UnitPoint\n}\n\nfunction clonePoint(point?: Point): Point {\n  return point ? { x: point.x, y: point.y } : { x: 0, y: 0 }\n}\n\nfunction cloneUnitPoint(point?: UnitPoint): UnitPoint {\n  return point ? { x: point.x, y: point.y } : { x: 0, y: 0 }\n}\n\nfunction resetLayoutTransform(node: SceneTransform, rect: Rect) {\n  node.x = rect.x\n  node.y = rect.y\n  node.scaleX = 1\n  node.scaleY = 1\n  node.rotation = 0\n  node.origin = { x: 0, y: 0 }\n}\n\nfunction syncOwnedHtmlElementSizing(element: HTMLElement, sizing: DomLeafSizing) {\n  if (sizing === 'fill') {\n    element.style.display = 'block'\n    element.style.width = '100%'\n    element.style.height = '100%'\n    element.style.boxSizing = 'border-box'\n    return\n  }\n\n  element.style.display = ''\n  element.style.width = ''\n  element.style.height = ''\n  element.style.boxSizing = ''\n}\n\nfunction setProperty<T extends object, K extends keyof T>(target: T, key: K, value: T[K]): boolean {\n  const previous = target[key]\n  target[key] = value\n  return !Object.is(target[key], previous)\n}\n\nfunction attachSceneChild(parent: SceneParent, child: SceneNode) {\n  if (parent instanceof GlassScene) {\n    if (child instanceof SceneContainer || child instanceof SceneHtml || child instanceof SceneGroup) {\n      parent.add(child)\n      return\n    }\n  } else if (parent instanceof SceneContainer) {\n    if (child instanceof SceneGlass || child instanceof SceneGroup) {\n      parent.add(child)\n      return\n    }\n  } else if (parent instanceof SceneGlass) {\n    if (child instanceof SceneHtml || child instanceof SceneGroup) {\n      parent.add(child)\n      return\n    }\n  } else if (parent instanceof SceneGroup) {\n    parent.add(child)\n    return\n  }\n\n  throw new Error('This layout child cannot be attached to the nearest liquid-glass scene parent.')\n}\n\nfunction assertNoUiCycle(parent: UiNode, child: UiNode) {\n  if (parent === child) {\n    throw new Error('A layout UI node cannot be inserted into itself.')\n  }\n\n  let current: UiParent | null = parent\n  while (current instanceof UiNode) {\n    if (current === child) {\n      throw new Error('A layout UI node cannot be inserted into one of its descendants.')\n    }\n    current = current._parent\n  }\n}\n\n/**\n * Base class for nodes in the liquid-glass layout UI tree.\n */\nabstract class UiNode<\n  Layout extends LayoutNode = LayoutNode,\n  SceneRef extends SceneNode | null = SceneNode | null,\n> {\n  /** Node owned by the @liquid-dom/layout engine. */\n  readonly layoutNode: Layout\n  /** Scene graph node owned by the liquid-glass renderer, when this node has one. */\n  readonly sceneNode: SceneRef\n\n  _parent: UiParent | null = null\n  protected readonly _children: LayoutUiNode[] = []\n\n  protected constructor(layoutNode: Layout, sceneNode: SceneRef) {\n    this.layoutNode = layoutNode\n    this.sceneNode = sceneNode\n  }\n\n  /** UI children in layout order. */\n  get children(): readonly LayoutUiNode[] {\n    return this._children\n  }\n\n  /** Adds a child node, reparenting it from any previous UI parent. */\n  add<T extends LayoutUiNode>(child: T): T {\n    return this.addChild(child)\n  }\n\n  /** Detaches this node from its current UI parent. */\n  remove() {\n    this._parent?._detachChild(this as unknown as LayoutUiNode)\n  }\n\n  _detachChild(child: LayoutUiNode) {\n    const index = this._children.indexOf(child)\n    if (index === -1) {\n      return\n    }\n\n    this._children.splice(index, 1)\n    child.layoutNode.remove()\n    child.sceneNode?.remove()\n    child._parent = null\n  }\n\n  _applyLayoutTree() {\n    const rect = this.layoutNode.layout?.rect\n    if (rect) {\n      this.applyLayoutRect(rect)\n    }\n\n    for (const child of this._children) {\n      child._applyLayoutTree()\n    }\n  }\n\n  protected addChild<T extends LayoutUiNode>(child: T): T {\n    if (child._parent === this && this._children.includes(child)) {\n      return child\n    }\n\n    assertNoUiCycle(this, child)\n    this.assertCanAddChild(child)\n    child._parent?._detachChild(child)\n\n    this._children.push(child)\n    child._parent = this\n    this.layoutNode.append(child.layoutNode)\n    this.attachChildScene(child)\n    return child\n  }\n\n  _emitInvalidation(invalidation: LayoutSceneInvalidation) {\n    this._parent?._emitInvalidation(invalidation)\n  }\n\n  protected invalidateLayout(cause?: unknown) {\n    this._emitInvalidation({\n      kind: 'layout',\n      node: this as unknown as LayoutUiNode,\n      cause,\n    })\n  }\n\n  protected invalidateFrame(cause?: unknown) {\n    this._emitInvalidation({\n      kind: 'frame',\n      node: this as unknown as LayoutUiNode,\n      cause,\n    })\n  }\n\n  protected assertCanAddChild(_child: LayoutUiNode) {\n    return\n  }\n\n  protected attachChildScene(child: LayoutUiNode) {\n    if (!this.sceneNode || !child.sceneNode) {\n      return\n    }\n\n    attachSceneChild(this.sceneNode, child.sceneNode)\n  }\n\n  protected applyLayoutRect(rect: Rect) {\n    if (this.sceneNode) {\n      resetLayoutTransform(this.sceneNode, rect)\n    }\n  }\n}\n\n/**\n * Base class for layout nodes that accept exactly one child.\n */\nabstract class SingleChildUiNode<\n  Layout extends LayoutNode = LayoutNode,\n  SceneRef extends SceneNode | null = SceneNode | null,\n> extends UiNode<Layout, SceneRef> {\n  override add<T extends LayoutUiNode>(child: T): T {\n    return this.addChild(child)\n  }\n\n  protected override assertCanAddChild(child: LayoutUiNode) {\n    if (this._children.length > 0 && this._children[0] !== child) {\n      throw new Error(`${this.constructor.name} accepts exactly one child.`)\n    }\n  }\n}\n\n/**\n * Root owner for a layout UI tree, @liquid-dom/layout engine, and raw liquid-glass scene.\n */\nexport class LayoutScene {\n  /** Raw scene consumed by {@link import('./renderer').Renderer}. */\n  readonly scene = new GlassScene()\n  /** Layout engine used to measure and place the UI tree. */\n  readonly engine: LayoutEngine\n\n  private _root: LayoutUiNode | null = null\n  private readonly invalidationListeners = new Set<LayoutSceneInvalidationListener>()\n\n  constructor(options: LayoutSceneOptions = {}) {\n    const { root, onInvalidate, ...engineOptions } = options\n    this.engine = new LayoutEngine({\n      ...engineOptions,\n      onInvalidate: (invalidation: LayoutInvalidation) => {\n        onInvalidate?.(invalidation)\n        this._emitInvalidation({ kind: 'layout', cause: invalidation })\n      },\n    })\n    if (root) {\n      this.add(root)\n    }\n  }\n\n  /** Current root UI node, if one is attached. */\n  get root(): LayoutUiNode | null {\n    return this._root\n  }\n\n  /** Adds a listener for UI mutations that require layout or rendering work. */\n  addInvalidationListener(listener: LayoutSceneInvalidationListener): () => void {\n    this.invalidationListeners.add(listener)\n    return () => {\n      this.invalidationListeners.delete(listener)\n    }\n  }\n\n  /** Adds the root UI node, replacing no existing root. */\n  add<T extends LayoutUiNode>(child: T): T {\n    if (this._root === child) {\n      return child\n    }\n    if (this._root) {\n      throw new Error('LayoutScene accepts exactly one root node.')\n    }\n\n    child._parent?._detachChild(child)\n    this._root = child\n    child._parent = this\n    this.engine.root = child.layoutNode\n    if (child.sceneNode) {\n      attachSceneChild(this.scene, child.sceneNode)\n    }\n\n    this._emitInvalidation({ kind: 'layout', node: child, cause: 'root' })\n    return child\n  }\n\n  /** Runs layout and applies the resulting geometry to the mirrored scene graph. */\n  layout(proposal: ProposedSize): LayoutDebugStats {\n    const stats = this.engine.layout(proposal)\n    this._root?._applyLayoutTree()\n    return stats\n  }\n\n  /** Returns the @liquid-dom/layout engine's most recent debug stats. */\n  getDebugStats(): LayoutDebugStats {\n    return this.engine.getDebugStats()\n  }\n\n  /** Detaches the root and disposes the layout engine. */\n  dispose() {\n    if (this._root) {\n      this._detachChild(this._root)\n    }\n    this.engine.dispose()\n  }\n\n  _detachChild(child: LayoutUiNode) {\n    if (this._root !== child) {\n      return\n    }\n\n    child.layoutNode.remove()\n    child.sceneNode?.remove()\n    child._parent = null\n    this._root = null\n    this.engine.root = undefined\n    this._emitInvalidation({ kind: 'layout', node: child, cause: 'root' })\n  }\n\n  _emitInvalidation(invalidation: LayoutSceneInvalidation) {\n    for (const listener of this.invalidationListeners) {\n      listener(invalidation)\n    }\n  }\n}\n\n/**\n * Horizontal stack layout backed by a transform-only scene group.\n */\nexport class HStack extends UiNode<StackNode, SceneGroup> {\n  constructor(options: StackOptions = {}) {\n    super(new LayoutHStack(options), new SceneGroup())\n  }\n\n  get spacing(): number {\n    return this.layoutNode.spacing\n  }\n\n  set spacing(value: number) {\n    this.layoutNode.spacing = value\n  }\n\n  get alignment(): StackAlignment {\n    return this.layoutNode.alignment\n  }\n\n  set alignment(value: StackAlignment) {\n    this.layoutNode.alignment = value\n  }\n}\n\n/**\n * Vertical stack layout backed by a transform-only scene group.\n */\nexport class VStack extends UiNode<StackNode, SceneGroup> {\n  constructor(options: StackOptions = {}) {\n    super(new LayoutVStack(options), new SceneGroup())\n  }\n\n  get spacing(): number {\n    return this.layoutNode.spacing\n  }\n\n  set spacing(value: number) {\n    this.layoutNode.spacing = value\n  }\n\n  get alignment(): StackAlignment {\n    return this.layoutNode.alignment\n  }\n\n  set alignment(value: StackAlignment) {\n    this.layoutNode.alignment = value\n  }\n}\n\n/**\n * Z-stack layout backed by a local stacking context.\n */\nexport class ZStack extends UiNode<ZStackNode, SceneStackingContext> {\n  private readonly sceneSlots = new Map<LayoutUiNode, SceneStackingContext>()\n\n  constructor(options: ZStackOptions = {}) {\n    super(new LayoutZStack(options), new SceneStackingContext())\n  }\n\n  get alignment(): Alignment {\n    return this.layoutNode.alignment\n  }\n\n  set alignment(value: Alignment) {\n    this.layoutNode.alignment = value\n  }\n\n  override _detachChild(child: LayoutUiNode) {\n    const slot = this.sceneSlots.get(child)\n    super._detachChild(child)\n    slot?.remove()\n    this.sceneSlots.delete(child)\n    this.syncSlotZIndices()\n  }\n\n  protected override addChild<T extends LayoutUiNode>(child: T): T {\n    const added = super.addChild(child)\n    this.syncSlotZIndices()\n    return added\n  }\n\n  protected override attachChildScene(child: LayoutUiNode) {\n    if (!child.sceneNode) {\n      return\n    }\n\n    const slot = new SceneStackingContext()\n    this.sceneSlots.set(child, slot)\n    attachSceneChild(this.sceneNode, slot)\n    attachSceneChild(slot, child.sceneNode)\n  }\n\n  private syncSlotZIndices() {\n    for (const [index, child] of this._children.entries()) {\n      const slot = this.sceneSlots.get(child)\n      if (slot) {\n        slot.zIndex = index\n      }\n    }\n  }\n}\n\n/**\n * Frame layout backed by a transform-only scene group.\n */\nexport class Frame extends SingleChildUiNode<FrameNode, SceneGroup> {\n  constructor(options: FrameOptions = {}) {\n    super(new LayoutFrame(options), new SceneGroup())\n  }\n\n  get width(): number | undefined {\n    return this.layoutNode.width\n  }\n\n  set width(value: number | undefined) {\n    this.layoutNode.width = value\n  }\n\n  get height(): number | undefined {\n    return this.layoutNode.height\n  }\n\n  set height(value: number | undefined) {\n    this.layoutNode.height = value\n  }\n\n  get minWidth(): number | undefined {\n    return this.layoutNode.minWidth\n  }\n\n  set minWidth(value: number | undefined) {\n    this.layoutNode.minWidth = value\n  }\n\n  get minHeight(): number | undefined {\n    return this.layoutNode.minHeight\n  }\n\n  set minHeight(value: number | undefined) {\n    this.layoutNode.minHeight = value\n  }\n\n  get idealWidth(): number | undefined {\n    return this.layoutNode.idealWidth\n  }\n\n  set idealWidth(value: number | undefined) {\n    this.layoutNode.idealWidth = value\n  }\n\n  get idealHeight(): number | undefined {\n    return this.layoutNode.idealHeight\n  }\n\n  set idealHeight(value: number | undefined) {\n    this.layoutNode.idealHeight = value\n  }\n\n  get maxWidth(): FrameNode['maxWidth'] {\n    return this.layoutNode.maxWidth\n  }\n\n  set maxWidth(value: FrameNode['maxWidth']) {\n    this.layoutNode.maxWidth = value\n  }\n\n  get maxHeight(): FrameNode['maxHeight'] {\n    return this.layoutNode.maxHeight\n  }\n\n  set maxHeight(value: FrameNode['maxHeight']) {\n    this.layoutNode.maxHeight = value\n  }\n\n  get alignment(): Alignment {\n    return this.layoutNode.alignment\n  }\n\n  set alignment(value: Alignment) {\n    this.layoutNode.alignment = value\n  }\n}\n\n/**\n * Padding layout backed by a transform-only scene group.\n */\nexport class Padding extends SingleChildUiNode<PaddingNode, SceneGroup> {\n  constructor(options: PaddingOptions = {}) {\n    super(new LayoutPadding(options), new SceneGroup())\n  }\n\n  get insets(): InsetsInput {\n    return this.layoutNode.insets\n  }\n\n  set insets(value: InsetsInput) {\n    this.layoutNode.insets = value\n  }\n}\n\nabstract class DecorationUiNode extends UiNode<LayoutNode, SceneStackingContext> {\n  private readonly emptyContent = new LayoutNoop()\n  private readonly emptyDecoration = new LayoutNoop()\n  private readonly contentSlot = new SceneStackingContext()\n  private readonly decorationSlot = new SceneStackingContext()\n  private content: LayoutUiNode | null = null\n  private decoration: LayoutUiNode | null = null\n\n  protected constructor(\n    layoutNode: LayoutNode,\n    private readonly sceneOrder: 'background' | 'overlay',\n  ) {\n    super(layoutNode, new SceneStackingContext())\n    this.syncSlotZIndices()\n    attachSceneChild(this.sceneNode, this.contentSlot)\n    attachSceneChild(this.sceneNode, this.decorationSlot)\n  }\n\n  override add<T extends LayoutUiNode>(child: T): T {\n    if (!this.content) {\n      return this.setContent(child)\n    }\n    if (!this.decoration) {\n      return this.setDecoration(child)\n    }\n\n    throw new Error(`${this.constructor.name} accepts content and decoration children only.`)\n  }\n\n  /** Replaces the content child. */\n  setContent<T extends LayoutUiNode>(child: T): T {\n    this.replaceSlot('content', child)\n    return child\n  }\n\n  /** Replaces the decoration child. */\n  setDecoration<T extends LayoutUiNode>(child: T): T {\n    this.replaceSlot('decoration', child)\n    return child\n  }\n\n  get alignment(): Alignment {\n    return (this.layoutNode as unknown as { alignment: Alignment }).alignment\n  }\n\n  set alignment(value: Alignment) {\n    const layoutNode = this.layoutNode as unknown as { alignment: Alignment }\n    layoutNode.alignment = value\n  }\n\n  override _detachChild(child: LayoutUiNode) {\n    if (this.content !== child && this.decoration !== child) {\n      return\n    }\n\n    if (this.content === child) {\n      this.content = null\n    } else {\n      this.decoration = null\n    }\n\n    this._children.splice(this._children.indexOf(child), 1)\n    child.layoutNode.remove()\n    child.sceneNode?.remove()\n    child._parent = null\n    this.syncLayoutSlots()\n  }\n\n  private replaceSlot(slot: 'content' | 'decoration', child: LayoutUiNode) {\n    assertNoUiCycle(this, child)\n\n    const current = slot === 'content' ? this.content : this.decoration\n    if (current === child) {\n      return\n    }\n    if (current) {\n      this._detachChild(current)\n    }\n\n    child._parent?._detachChild(child)\n    if (slot === 'content') {\n      this.content = child\n    } else {\n      this.decoration = child\n    }\n\n    this._children.push(child)\n    child._parent = this\n    this.syncLayoutSlots()\n    this.syncSceneSlots()\n  }\n\n  private syncLayoutSlots() {\n    this.layoutNode.replaceChildren(\n      this.content?.layoutNode ?? this.emptyContent,\n      this.decoration?.layoutNode ?? this.emptyDecoration,\n    )\n  }\n\n  private syncSceneSlots() {\n    this.content?.sceneNode?.remove()\n    this.decoration?.sceneNode?.remove()\n\n    if (this.content?.sceneNode) {\n      attachSceneChild(this.contentSlot, this.content.sceneNode)\n    }\n    if (this.decoration?.sceneNode) {\n      attachSceneChild(this.decorationSlot, this.decoration.sceneNode)\n    }\n  }\n\n  private syncSlotZIndices() {\n    this.contentSlot.zIndex = this.sceneOrder === 'background' ? 1 : 0\n    this.decorationSlot.zIndex = this.sceneOrder === 'background' ? 0 : 1\n  }\n}\n\n/**\n * Background decoration layout backed by a local stacking context.\n */\nexport class Background extends DecorationUiNode {\n  constructor(options: DecorationOptions = {}) {\n    const emptyContent = new LayoutNoop()\n    const emptyDecoration = new LayoutNoop()\n    super(new LayoutBackground(options).append(emptyContent, emptyDecoration), 'background')\n  }\n}\n\n/**\n * Overlay decoration layout backed by a local stacking context.\n */\nexport class Overlay extends DecorationUiNode {\n  constructor(options: DecorationOptions = {}) {\n    const emptyContent = new LayoutNoop()\n    const emptyDecoration = new LayoutNoop()\n    super(new LayoutOverlay(options).append(emptyContent, emptyDecoration), 'overlay')\n  }\n}\n\n/**\n * Layout pass-through node that contributes an explicit scene transform.\n */\nexport class Transform extends SingleChildUiNode<LayoutNode, SceneGroup> {\n  private _x = 0\n  private _y = 0\n  private _scaleX = 1\n  private _scaleY = 1\n  private _rotation = 0\n  private _origin: UnitPoint = { x: 0, y: 0 }\n\n  constructor(options: TransformOptions = {}) {\n    super(new LayoutNoop(), new SceneGroup())\n    this._x = options.x ?? 0\n    this._y = options.y ?? 0\n    this._scaleX = options.scaleX ?? 1\n    this._scaleY = options.scaleY ?? 1\n    this._rotation = options.rotation ?? 0\n    this._origin = cloneUnitPoint(options.origin)\n  }\n\n  get x(): number {\n    return this._x\n  }\n\n  set x(value: number) {\n    if (Object.is(this._x, value)) {\n      return\n    }\n\n    this._x = value\n    this.syncSceneTransform()\n    this.invalidateFrame('x')\n  }\n\n  get y(): number {\n    return this._y\n  }\n\n  set y(value: number) {\n    if (Object.is(this._y, value)) {\n      return\n    }\n\n    this._y = value\n    this.syncSceneTransform()\n    this.invalidateFrame('y')\n  }\n\n  get scaleX(): number {\n    return this._scaleX\n  }\n\n  set scaleX(value: number) {\n    if (Object.is(this._scaleX, value)) {\n      return\n    }\n\n    this._scaleX = value\n    this.syncSceneTransform()\n    this.invalidateFrame('scaleX')\n  }\n\n  get scaleY(): number {\n    return this._scaleY\n  }\n\n  set scaleY(value: number) {\n    if (Object.is(this._scaleY, value)) {\n      return\n    }\n\n    this._scaleY = value\n    this.syncSceneTransform()\n    this.invalidateFrame('scaleY')\n  }\n\n  get rotation(): number {\n    return this._rotation\n  }\n\n  set rotation(value: number) {\n    if (Object.is(this._rotation, value)) {\n      return\n    }\n\n    this._rotation = value\n    this.syncSceneTransform()\n    this.invalidateFrame('rotation')\n  }\n\n  get origin(): UnitPoint {\n    return this._origin\n  }\n\n  set origin(value: UnitPoint) {\n    if (this._origin.x === value.x && this._origin.y === value.y) {\n      return\n    }\n\n    this._origin = cloneUnitPoint(value)\n    this.syncSceneTransform()\n    this.invalidateFrame('origin')\n  }\n\n  protected override applyLayoutRect(rect: Rect) {\n    this.syncSceneTransform(rect)\n  }\n\n  private syncSceneTransform(rect = this.layoutNode.layout?.rect) {\n    const layoutX = rect?.x ?? 0\n    const layoutY = rect?.y ?? 0\n    this.sceneNode.x = layoutX + this._x\n    this.sceneNode.y = layoutY + this._y\n    this.sceneNode.scaleX = this._scaleX\n    this.sceneNode.scaleY = this._scaleY\n    this.sceneNode.rotation = this._rotation\n    this.sceneNode.origin = {\n      x: this._origin.x * (rect?.width ?? 0),\n      y: this._origin.y * (rect?.height ?? 0),\n    }\n  }\n}\n\n/**\n * Liquid-glass container view backed by a scene {@link SceneContainer}.\n */\nexport class GlassContainer extends SingleChildUiNode<LayoutNode, SceneContainer> {\n  constructor(options: GlassContainerOptions = {}) {\n    super(new LayoutNoop(), new SceneContainer(options))\n  }\n\n  get opacity(): number {\n    return this.sceneNode.opacity\n  }\n\n  set opacity(value: number) {\n    if (setProperty(this.sceneNode, 'opacity', value)) {\n      this.invalidateFrame('opacity')\n    }\n  }\n\n  get spacing(): number {\n    return this.sceneNode.spacing\n  }\n\n  set spacing(value: number) {\n    if (setProperty(this.sceneNode, 'spacing', value)) {\n      this.invalidateFrame('spacing')\n    }\n  }\n\n  get blur(): number {\n    return this.sceneNode.blur\n  }\n\n  set blur(value: number) {\n    if (setProperty(this.sceneNode, 'blur', value)) {\n      this.invalidateFrame('blur')\n    }\n  }\n\n  get bezelWidth(): number {\n    return this.sceneNode.bezelWidth\n  }\n\n  set bezelWidth(value: number) {\n    if (setProperty(this.sceneNode, 'bezelWidth', value)) {\n      this.invalidateFrame('bezelWidth')\n    }\n  }\n\n  get thickness(): number {\n    return this.sceneNode.thickness\n  }\n\n  set thickness(value: number) {\n    if (setProperty(this.sceneNode, 'thickness', value)) {\n      this.invalidateFrame('thickness')\n    }\n  }\n\n  get displacementFactor(): number {\n    return this.sceneNode.displacementFactor\n  }\n\n  set displacementFactor(value: number) {\n    if (setProperty(this.sceneNode, 'displacementFactor', value)) {\n      this.invalidateFrame('displacementFactor')\n    }\n  }\n\n  get displacementBlur(): number {\n    return this.sceneNode.displacementBlur\n  }\n\n  set displacementBlur(value: number) {\n    if (setProperty(this.sceneNode, 'displacementBlur', value)) {\n      this.invalidateFrame('displacementBlur')\n    }\n  }\n\n  get normalDivergenceBlendPower(): number {\n    return this.sceneNode.normalDivergenceBlendPower\n  }\n\n  set normalDivergenceBlendPower(value: number) {\n    if (setProperty(this.sceneNode, 'normalDivergenceBlendPower', value)) {\n      this.invalidateFrame('normalDivergenceBlendPower')\n    }\n  }\n\n  get normalDivergenceBlendEnabled(): boolean {\n    return this.sceneNode.normalDivergenceBlendEnabled\n  }\n\n  set normalDivergenceBlendEnabled(value: boolean) {\n    if (setProperty(this.sceneNode, 'normalDivergenceBlendEnabled', value)) {\n      this.invalidateFrame('normalDivergenceBlendEnabled')\n    }\n  }\n\n  get ior(): number {\n    return this.sceneNode.ior\n  }\n\n  set ior(value: number) {\n    if (setProperty(this.sceneNode, 'ior', value)) {\n      this.invalidateFrame('ior')\n    }\n  }\n\n  get contentIor(): number {\n    return this.sceneNode.contentIor\n  }\n\n  set contentIor(value: number) {\n    if (setProperty(this.sceneNode, 'contentIor', value)) {\n      this.invalidateFrame('contentIor')\n    }\n  }\n\n  get contentDepth(): number {\n    return this.sceneNode.contentDepth\n  }\n\n  set contentDepth(value: number) {\n    if (setProperty(this.sceneNode, 'contentDepth', value)) {\n      this.invalidateFrame('contentDepth')\n    }\n  }\n\n  get dispersion(): number {\n    return this.sceneNode.dispersion\n  }\n\n  set dispersion(value: number) {\n    if (setProperty(this.sceneNode, 'dispersion', value)) {\n      this.invalidateFrame('dispersion')\n    }\n  }\n\n  get surfaceProfile(): SurfaceProfile {\n    return this.sceneNode.surfaceProfile\n  }\n\n  set surfaceProfile(value: SurfaceProfile) {\n    if (setProperty(this.sceneNode, 'surfaceProfile', value)) {\n      this.invalidateFrame('surfaceProfile')\n    }\n  }\n\n  get lightDirection(): number {\n    return this.sceneNode.lightDirection\n  }\n\n  set lightDirection(value: number) {\n    if (setProperty(this.sceneNode, 'lightDirection', value)) {\n      this.invalidateFrame('lightDirection')\n    }\n  }\n\n  get specularStrength(): number {\n    return this.sceneNode.specularStrength\n  }\n\n  set specularStrength(value: number) {\n    if (setProperty(this.sceneNode, 'specularStrength', value)) {\n      this.invalidateFrame('specularStrength')\n    }\n  }\n\n  get specularWidth(): SpecularWidth {\n    return this.sceneNode.specularWidth\n  }\n\n  set specularWidth(value: SpecularWidth) {\n    if (setProperty(this.sceneNode, 'specularWidth', value)) {\n      this.invalidateFrame('specularWidth')\n    }\n  }\n\n  get specularFalloff(): number {\n    return this.sceneNode.specularFalloff\n  }\n\n  set specularFalloff(value: number) {\n    if (setProperty(this.sceneNode, 'specularFalloff', value)) {\n      this.invalidateFrame('specularFalloff')\n    }\n  }\n\n  get oppositeSpecularStrength(): number {\n    return this.sceneNode.oppositeSpecularStrength\n  }\n\n  set oppositeSpecularStrength(value: number) {\n    if (setProperty(this.sceneNode, 'oppositeSpecularStrength', value)) {\n      this.invalidateFrame('oppositeSpecularStrength')\n    }\n  }\n\n  get specularSharpness(): number {\n    return this.sceneNode.specularSharpness\n  }\n\n  set specularSharpness(value: number) {\n    if (setProperty(this.sceneNode, 'specularSharpness', value)) {\n      this.invalidateFrame('specularSharpness')\n    }\n  }\n\n  get specularOpacity(): number {\n    return this.sceneNode.specularOpacity\n  }\n\n  set specularOpacity(value: number) {\n    if (setProperty(this.sceneNode, 'specularOpacity', value)) {\n      this.invalidateFrame('specularOpacity')\n    }\n  }\n\n  get reflectionOffset(): number {\n    return this.sceneNode.reflectionOffset\n  }\n\n  set reflectionOffset(value: number) {\n    if (setProperty(this.sceneNode, 'reflectionOffset', value)) {\n      this.invalidateFrame('reflectionOffset')\n    }\n  }\n\n  get tint(): RgbaColor {\n    return this.sceneNode.tint\n  }\n\n  set tint(value: RgbaColor) {\n    if (setProperty(this.sceneNode, 'tint', value)) {\n      this.invalidateFrame('tint')\n    }\n  }\n\n  get shadowColor(): RgbaColor {\n    return this.sceneNode.shadowColor\n  }\n\n  set shadowColor(value: RgbaColor) {\n    if (setProperty(this.sceneNode, 'shadowColor', value)) {\n      this.invalidateFrame('shadowColor')\n    }\n  }\n\n  get shadowOffsetX(): number {\n    return this.sceneNode.shadowOffsetX\n  }\n\n  set shadowOffsetX(value: number) {\n    if (setProperty(this.sceneNode, 'shadowOffsetX', value)) {\n      this.invalidateFrame('shadowOffsetX')\n    }\n  }\n\n  get shadowOffsetY(): number {\n    return this.sceneNode.shadowOffsetY\n  }\n\n  set shadowOffsetY(value: number) {\n    if (setProperty(this.sceneNode, 'shadowOffsetY', value)) {\n      this.invalidateFrame('shadowOffsetY')\n    }\n  }\n\n  get shadowBlur(): number {\n    return this.sceneNode.shadowBlur\n  }\n\n  set shadowBlur(value: number) {\n    if (setProperty(this.sceneNode, 'shadowBlur', value)) {\n      this.invalidateFrame('shadowBlur')\n    }\n  }\n\n  get shadowSpread(): number {\n    return this.sceneNode.shadowSpread\n  }\n\n  set shadowSpread(value: number) {\n    if (setProperty(this.sceneNode, 'shadowSpread', value)) {\n      this.invalidateFrame('shadowSpread')\n    }\n  }\n\n  get debugDisplacement(): boolean {\n    return this.sceneNode.debugDisplacement\n  }\n\n  set debugDisplacement(value: boolean) {\n    if (setProperty(this.sceneNode, 'debugDisplacement', value)) {\n      this.invalidateFrame('debugDisplacement')\n    }\n  }\n\n  get zIndex(): number {\n    return this.sceneNode.zIndex\n  }\n\n  set zIndex(value: number) {\n    if (setProperty(this.sceneNode, 'zIndex', value)) {\n      this.invalidateFrame('zIndex')\n    }\n  }\n}\n\n/**\n * Liquid-glass shape view backed by a scene {@link SceneGlass}.\n */\nexport class Glass extends SingleChildUiNode<LayoutNode, SceneGlass> {\n  constructor(options: GlassOptions = {}) {\n    super(new LayoutNoop(), new SceneGlass(options))\n  }\n\n  get cornerRadius(): number {\n    return this.sceneNode.cornerRadius\n  }\n\n  set cornerRadius(value: number) {\n    if (setProperty(this.sceneNode, 'cornerRadius', value)) {\n      this.invalidateFrame('cornerRadius')\n    }\n  }\n\n  get cornerSmoothing(): number {\n    return this.sceneNode.cornerSmoothing\n  }\n\n  set cornerSmoothing(value: number) {\n    if (setProperty(this.sceneNode, 'cornerSmoothing', value)) {\n      this.invalidateFrame('cornerSmoothing')\n    }\n  }\n\n  get pointerEvents(): boolean {\n    return this.sceneNode.pointerEvents\n  }\n\n  set pointerEvents(value: boolean) {\n    if (setProperty(this.sceneNode, 'pointerEvents', value)) {\n      this.invalidateFrame('pointerEvents')\n    }\n  }\n\n  get zIndex(): number {\n    return this.sceneNode.zIndex\n  }\n\n  set zIndex(value: number) {\n    if (setProperty(this.sceneNode, 'zIndex', value)) {\n      this.invalidateFrame('zIndex')\n    }\n  }\n\n  protected override applyLayoutRect(rect: Rect) {\n    resetLayoutTransform(this.sceneNode, rect)\n    this.sceneNode.width = rect.width\n    this.sceneNode.height = rect.height\n  }\n}\n\n/**\n * DOM-backed HTML view backed by a measured layout leaf and scene {@link SceneHtml}.\n */\nexport class Html extends UiNode<DomLeaf, SceneHtml> {\n  private readonly ownedElement: HTMLElement\n\n  constructor(options: HtmlOptions = {}) {\n    const ownedElement = document.createElement('div')\n    const contentElement = options.element ?? ownedElement\n    const sizing = options.sizing ?? 'constrained-width'\n    syncOwnedHtmlElementSizing(ownedElement, sizing)\n    const sceneNode = new SceneHtml({\n      opacity: options.opacity,\n      blur: options.blur,\n      zIndex: options.zIndex,\n      element: contentElement,\n    })\n    const defaultMeasureOptions: DomLeafOptions = {\n      element: contentElement,\n      sizing,\n    }\n    const layoutNode = new DomLeaf(defaultMeasureOptions)\n\n    super(layoutNode, sceneNode)\n    this.ownedElement = ownedElement\n  }\n\n  override add<T extends LayoutUiNode>(_child: T): T {\n    throw new Error('Html is a leaf node and cannot accept children.')\n  }\n\n  /** DOM measurement sizing mode. */\n  get sizing(): DomLeafSizing {\n    return this.layoutNode.sizing\n  }\n\n  set sizing(value: DomLeafSizing | undefined) {\n    const nextSizing = value ?? 'constrained-width'\n    if (this.layoutNode.sizing === nextSizing) {\n      return\n    }\n\n    syncOwnedHtmlElementSizing(this.ownedElement, nextSizing)\n    this.layoutNode.sizing = nextSizing\n  }\n\n  get opacity(): number {\n    return this.sceneNode.opacity\n  }\n\n  set opacity(value: number) {\n    if (setProperty(this.sceneNode, 'opacity', value)) {\n      this.invalidateFrame('opacity')\n    }\n  }\n\n  get blur(): number {\n    return this.sceneNode.blur\n  }\n\n  set blur(value: number) {\n    if (setProperty(this.sceneNode, 'blur', value)) {\n      this.invalidateFrame('blur')\n    }\n  }\n\n  get zIndex(): number {\n    return this.sceneNode.zIndex\n  }\n\n  set zIndex(value: number) {\n    if (setProperty(this.sceneNode, 'zIndex', value)) {\n      this.invalidateFrame('zIndex')\n    }\n  }\n\n  get element(): HTMLElement | null {\n    return this.sceneNode.element\n  }\n\n  set element(value: HTMLElement | null) {\n    this.setElement(value)\n  }\n\n  /** Replaces the measured content element inside the layout-owned scene host. */\n  setElement(element: HTMLElement | null) {\n    const contentElement = element ?? this.ownedElement\n    if (this.layoutNode.element === contentElement) {\n      return\n    }\n\n    this.sceneNode.setElement(contentElement)\n    if (contentElement === this.ownedElement) {\n      syncOwnedHtmlElementSizing(this.ownedElement, this.sizing)\n    }\n    this.layoutNode.element = contentElement\n  }\n\n  protected override applyLayoutRect(rect: Rect) {\n    resetLayoutTransform(this.sceneNode, rect)\n    this.sceneNode.width = rect.width\n    this.sceneNode.height = rect.height\n  }\n}\n\n/**\n * Layout-only spacer leaf. It has no liquid-glass scene node.\n */\nexport class Spacer extends UiNode<SpacerNode, null> {\n  constructor(options: SpacerOptions = {}) {\n    super(new LayoutSpacer(options), null)\n  }\n\n  override add<T extends LayoutUiNode>(_child: T): T {\n    throw new Error('Spacer is a leaf node and cannot accept children.')\n  }\n\n  get minLength(): number {\n    return this.layoutNode.minLength\n  }\n\n  set minLength(value: number) {\n    this.layoutNode.minLength = value\n  }\n}\n","/** Circular rounded corners use the Euclidean p-norm exponent. */\nexport const CIRCULAR_CORNER_EXPONENT = 2\n/** Smooth-corner value tuned as the default iOS-like shape. */\nexport const DEFAULT_CORNER_SMOOTHING = 0.6\n/** p-norm exponent that approximates the classic squircle shape at the default smoothing value. */\nexport const IOS_LIKE_CORNER_EXPONENT = 4\n/**\n * Amount added to the p-norm exponent per unit of effective corner smoothing.\n *\n * This is derived rather than hand-picked so the public default smoothing value\n * maps exactly to exponent 4, while smoothing 0 stays circular at exponent 2.\n */\nexport const CORNER_SMOOTHING_EXPONENT_DELTA =\n  (IOS_LIKE_CORNER_EXPONENT - CIRCULAR_CORNER_EXPONENT) / DEFAULT_CORNER_SMOOTHING\n\nexport function sanitizeCornerRadius(radius: number) {\n  return Number.isFinite(radius) ? Math.max(radius, 0) : 0\n}\n\nexport function sanitizeCornerSmoothing(smoothing: number) {\n  return Number.isFinite(smoothing) ? Math.min(Math.max(smoothing, 0), 1) : DEFAULT_CORNER_SMOOTHING\n}\n\nexport function resolveCornerSmoothingExponent(cornerSmoothing: number) {\n  return CIRCULAR_CORNER_EXPONENT +\n    sanitizeCornerSmoothing(cornerSmoothing) * CORNER_SMOOTHING_EXPONENT_DELTA\n}\n","import type { GlassPointerEvent, GlassPointerEventType } from './events'\nimport {\n  DEFAULT_CORNER_SMOOTHING,\n  sanitizeCornerRadius,\n  sanitizeCornerSmoothing,\n} from './corner-smoothing'\nimport { composeTransform, identityMatrix, multiplyMatrices, type Matrix2D } from './matrix'\nimport type { Point, RgbaColor, SpecularWidth, SurfaceProfile, Transform } from './types'\n\n/**\n * Constructor options for a {@link Html} node.\n */\nexport type HtmlInit = Partial<Transform> & {\n  width?: number\n  height?: number\n  opacity?: number\n  blur?: number\n  zIndex?: number\n  element?: HTMLElement | null\n}\n\n/**\n * Constructor options for a {@link Glass} node.\n */\nexport type GlassInit = Partial<Transform> & {\n  width?: number\n  height?: number\n  cornerRadius?: number\n  cornerSmoothing?: number\n  pointerEvents?: boolean\n  zIndex?: number\n}\n\nexport interface GlassEventMap {\n  click: GlassPointerEvent\n  pointerenter: GlassPointerEvent\n  pointerleave: GlassPointerEvent\n  pointermove: GlassPointerEvent\n  pointerdown: GlassPointerEvent\n  pointerup: GlassPointerEvent\n  pointercancel: GlassPointerEvent\n}\n\n/**\n * Constructor options for a {@link Container}.\n */\nexport type ContainerInit = Partial<Transform> & {\n  opacity?: number\n  spacing?: number\n  blur?: number\n  bezelWidth?: number\n  thickness?: number\n  displacementFactor?: number\n  displacementBlur?: number\n  normalDivergenceBlendPower?: number\n  normalDivergenceBlendEnabled?: boolean\n  ior?: number\n  contentIor?: number\n  contentDepth?: number\n  dispersion?: number\n  surfaceProfile?: SurfaceProfile\n  lightDirection?: number\n  specularStrength?: number\n  specularWidth?: SpecularWidth\n  specularFalloff?: number\n  oppositeSpecularStrength?: number\n  specularSharpness?: number\n  specularOpacity?: number\n  reflectionOffset?: number\n  tint?: RgbaColor\n  shadowColor?: RgbaColor\n  shadowOffsetX?: number\n  shadowOffsetY?: number\n  shadowBlur?: number\n  shadowSpread?: number\n  debugDisplacement?: boolean\n  zIndex?: number\n}\n\n/**\n * Constructor options for a {@link Group}.\n */\nexport type GroupInit = Partial<Transform>\n\n/**\n * Constructor options for a {@link StackingContext}.\n */\nexport type StackingContextInit = GroupInit & {\n  zIndex?: number\n}\n\ntype SceneChild = Container | Html | Group\ntype RenderSceneChild = Container | Html\ntype ContainerChild = Glass | Group\ntype GlassChild = Html | Group\ntype GroupChild = Container | Glass | Html | Group\ntype ParentNode = Scene | Container | Glass | Group\ntype SceneMutationListener = () => void\n\n/** Flattened container with its composed world transform and stable traversal order. */\ntype TraversedContainer = {\n  /** Container node reached through the scene hierarchy. */\n  container: Container\n  /** Container transform composed with any ancestor groups. */\n  transform: Matrix2D\n  /** Stable preorder index among flattened containers. */\n  traversalIndex: number\n}\n\n/** Flattened scene render layer with its composed world transform and stable traversal order. */\nexport type TraversedSceneLayer = {\n  /** Renderable scene node reached through the scene hierarchy. */\n  child: RenderSceneChild\n  /** Scene-layer transform composed with any ancestor groups. */\n  transform: Matrix2D\n  /** Stable preorder index among flattened scene layers. */\n  traversalIndex: number\n}\n\n/** Flattened glass child with its transform relative to the owning container. */\nexport type TraversedGlass = {\n  /** Glass node reached through the container hierarchy. */\n  glass: Glass\n  /** Glass transform composed with any ancestor groups inside the container. */\n  transform: Matrix2D\n  /** Stable preorder index among flattened glass nodes. */\n  traversalIndex: number\n}\n\n/** Flattened HTML child with its transform relative to the owning glass. */\nexport type TraversedHtml = {\n  /** HTML node reached through the glass hierarchy. */\n  html: Html\n  /** HTML transform composed with any ancestor groups inside the glass. */\n  transform: Matrix2D\n  /** Stable preorder index among flattened glass HTML nodes. */\n  traversalIndex: number\n}\n\nfunction clonePoint(point?: Point): Point {\n  return point ? { x: point.x, y: point.y } : { x: 0, y: 0 }\n}\n\nfunction cloneColor(color?: RgbaColor): RgbaColor {\n  return color ? { r: color.r, g: color.g, b: color.b, a: color.a } : { r: 0, g: 0, b: 0, a: 0 }\n}\n\nfunction applyTransformDefaults(target: Transform, options: Partial<Transform> | undefined) {\n  if (!options) {\n    return\n  }\n\n  if (options.x !== undefined) {\n    target.x = options.x\n  }\n  if (options.y !== undefined) {\n    target.y = options.y\n  }\n  if (options.scaleX !== undefined) {\n    target.scaleX = options.scaleX\n  }\n  if (options.scaleY !== undefined) {\n    target.scaleY = options.scaleY\n  }\n  if (options.rotation !== undefined) {\n    target.rotation = options.rotation\n  }\n  if (options.origin !== undefined) {\n    target.origin = clonePoint(options.origin)\n  }\n}\n\nfunction findScene(node: { _parent: ParentNode | null } | ParentNode | null): Scene | null {\n  let current: ParentNode | null = node instanceof Scene ? node : node?._parent ?? null\n\n  while (current) {\n    if (current instanceof Scene) {\n      return current\n    }\n\n    current = current._parent\n  }\n\n  return null\n}\n\nfunction notifySceneMutation(node: { _parent: ParentNode | null } | ParentNode | null) {\n  findScene(node)?._notifyMutation()\n}\n\nfunction removeFromParent(node: { _parent: ParentNode | null }) {\n  const parent = node._parent\n  if (!parent) {\n    return\n  }\n\n  const scene = findScene(node)\n\n  parent._children = parent._children.filter((child) => child !== node)\n\n  node._parent = null\n  scene?._notifyMutation()\n}\n\n/** Throws when adding a group under the target parent would create a scene graph cycle. */\nfunction ensureNoCycle(parent: ParentNode, child: Group) {\n  if (parent === child) {\n    throw new Error('A Group cannot be added to itself.')\n  }\n\n  let current: ParentNode | null = parent\n  while (current) {\n    if (current === child) {\n      throw new Error('A Group cannot be added to one of its descendants.')\n    }\n    current = '_parent' in current ? current._parent : null\n  }\n}\n\n/** Returns the nearest non-group parent that defines what child node types a group may contain. */\nfunction getGroupContext(parent: ParentNode | null): Scene | Container | Glass | null {\n  let current = parent\n  while (current instanceof Group) {\n    current = current._parent\n  }\n\n  return current\n}\n\n/** Throws when a child cannot be inserted in a group for the provided parent context. */\nfunction validateGroupChildForContext(child: GroupChild, context: Scene | Container | Glass | null) {\n  if (!context || child instanceof Group) {\n    return\n  }\n\n  if (context instanceof Scene && (child instanceof Container || child instanceof Html)) {\n    return\n  }\n  if (context instanceof Container && child instanceof Glass) {\n    return\n  }\n  if (context instanceof Glass && child instanceof Html) {\n    return\n  }\n\n  throw new Error('A Group child must match the node type accepted by its nearest non-group parent.')\n}\n\n/** Recursively validates all descendants of a group against the provided parent context. */\nfunction validateGroupForContext(group: Group, context: Scene | Container | Glass | null) {\n  for (const child of group._children) {\n    validateGroupChildForContext(child, context)\n    if (child instanceof Group) {\n      validateGroupForContext(child, context)\n    }\n  }\n}\n\n/**\n * A DOM-backed scene node that can be layered directly in the scene or inside a glass shape.\n */\nexport class Html implements Transform {\n  /** Horizontal translation in CSS pixels. */\n  x = 0\n  /** Vertical translation in CSS pixels. */\n  y = 0\n  /** Horizontal scale factor. */\n  scaleX = 1\n  /** Vertical scale factor. */\n  scaleY = 1\n  /** Clockwise rotation in radians. */\n  rotation = 0\n  /** Local-space transform origin in CSS pixels. */\n  origin: Point = { x: 0, y: 0 }\n\n  /** Host element copied by the renderer and used by the browser for hit testing. */\n  readonly host: HTMLDivElement\n\n  private _width = 0\n  private _height = 0\n  private _opacity = 1\n  private _blur = 0\n  private _zIndex = 0\n  private _element: HTMLElement | null = null\n  _elementVersion = 0\n  _parent: Scene | Glass | Group | null = null\n\n  constructor(options: HtmlInit = {}) {\n    this.host = document.createElement('div')\n    this.host.style.position = 'absolute'\n    this.host.style.left = '0'\n    this.host.style.top = '0'\n    this.host.style.display = 'block'\n    this.host.style.overflow = 'hidden'\n    // Chrome's HTML-in-canvas copy path can capture an empty texture for scene-level\n    // Html hosts when paint containment is applied here.\n    this.host.style.transformOrigin = '0 0'\n\n    applyTransformDefaults(this, options)\n\n    if (options.width !== undefined) {\n      this.width = options.width\n    } else {\n      this.syncHostSize()\n    }\n    if (options.height !== undefined) {\n      this.height = options.height\n    } else {\n      this.syncHostSize()\n    }\n    if (options.opacity !== undefined) {\n      this.opacity = options.opacity\n    }\n    if (options.blur !== undefined) {\n      this.blur = options.blur\n    }\n    if (options.zIndex !== undefined) {\n      this.zIndex = options.zIndex\n    }\n    if (options.element !== undefined) {\n      this.setElement(options.element)\n    }\n  }\n\n  /** Node width in CSS pixels. */\n  get width() {\n    return this._width\n  }\n\n  set width(value: number) {\n    if (this._width === value) {\n      return\n    }\n\n    this._width = value\n    this.syncHostSize()\n    notifySceneMutation(this)\n  }\n\n  /** Node height in CSS pixels. */\n  get height() {\n    return this._height\n  }\n\n  set height(value: number) {\n    if (this._height === value) {\n      return\n    }\n\n    this._height = value\n    this.syncHostSize()\n    notifySceneMutation(this)\n  }\n\n  /** Final opacity used when compositing this HTML node into the rendered scene. */\n  get opacity() {\n    return this._opacity\n  }\n\n  set opacity(value: number) {\n    if (this._opacity === value) {\n      return\n    }\n\n    this._opacity = value\n    notifySceneMutation(this)\n  }\n\n  /** Content blur radius in CSS pixels applied when compositing this HTML node. */\n  get blur() {\n    return this._blur\n  }\n\n  set blur(value: number) {\n    if (this._blur === value) {\n      return\n    }\n\n    this._blur = value\n    notifySceneMutation(this)\n  }\n\n  /** Draw order among sibling scene or glass HTML nodes. */\n  get zIndex() {\n    return this._zIndex\n  }\n\n  set zIndex(value: number) {\n    if (this._zIndex === value) {\n      return\n    }\n\n    this._zIndex = value\n    notifySceneMutation(this)\n  }\n\n  /** The optional child element rendered inside this node's host. */\n  get element() {\n    return this._element\n  }\n\n  /** Replaces the single child element inside this node's host. */\n  setElement(element: HTMLElement | null) {\n    if (this._element === element) {\n      return\n    }\n\n    this._element = element\n    this._elementVersion += 1\n    this.host.replaceChildren()\n    if (element) {\n      this.host.append(element)\n    }\n    notifySceneMutation(this)\n  }\n\n  /** Detaches this HTML node from its parent scene or glass, if attached. */\n  remove() {\n    removeFromParent(this)\n  }\n\n  private syncHostSize() {\n    this.host.style.width = `${this._width}px`\n    this.host.style.height = `${this._height}px`\n  }\n}\n\n/**\n * A single rounded glass shape inside a {@link Container}.\n */\nexport class Glass extends EventTarget implements Transform {\n  /** Horizontal translation in CSS pixels. */\n  x = 0\n  /** Vertical translation in CSS pixels. */\n  y = 0\n  /** Horizontal scale factor. */\n  scaleX = 1\n  /** Vertical scale factor. */\n  scaleY = 1\n  /** Clockwise rotation in radians. */\n  rotation = 0\n  /** Local-space transform origin in CSS pixels. */\n  origin: Point = { x: 0, y: 0 }\n\n  private _width = 0\n  private _height = 0\n\n  /** Shape width in CSS pixels. */\n  get width() {\n    return this._width\n  }\n\n  set width(value: number) {\n    if (this._width === value) {\n      return\n    }\n\n    this._width = value\n    notifySceneMutation(this)\n  }\n\n  /** Shape height in CSS pixels. */\n  get height() {\n    return this._height\n  }\n\n  set height(value: number) {\n    if (this._height === value) {\n      return\n    }\n\n    this._height = value\n    notifySceneMutation(this)\n  }\n\n  private _cornerRadius = 0\n  private _cornerSmoothing = DEFAULT_CORNER_SMOOTHING\n\n  /** Uniform corner radius in CSS pixels. */\n  get cornerRadius() {\n    return this._cornerRadius\n  }\n\n  set cornerRadius(value: number) {\n    const sanitized = sanitizeCornerRadius(value)\n    if (this._cornerRadius === sanitized) {\n      return\n    }\n\n    this._cornerRadius = sanitized\n    notifySceneMutation(this)\n  }\n\n  /** Smooth-corner amount. 0 produces circular corners; 0.6 is tuned for an iOS-like squircle. */\n  get cornerSmoothing() {\n    return this._cornerSmoothing\n  }\n\n  set cornerSmoothing(value: number) {\n    const sanitized = sanitizeCornerSmoothing(value)\n    if (this._cornerSmoothing === sanitized) {\n      return\n    }\n\n    this._cornerSmoothing = sanitized\n    notifySceneMutation(this)\n  }\n\n  private _pointerEvents = false\n  private _zIndex = 0\n\n  /** Enables renderer-side glass pointer events when set to `true`. */\n  get pointerEvents() {\n    return this._pointerEvents\n  }\n\n  set pointerEvents(value: boolean) {\n    if (this._pointerEvents === value) {\n      return\n    }\n\n    this._pointerEvents = value\n    notifySceneMutation(this)\n  }\n\n  /** Draw order among sibling glass nodes in the same container. */\n  get zIndex() {\n    return this._zIndex\n  }\n\n  set zIndex(value: number) {\n    if (this._zIndex === value) {\n      return\n    }\n\n    this._zIndex = value\n    notifySceneMutation(this)\n  }\n\n  _parent: Container | Group | null = null\n  _children: GlassChild[] = []\n\n  /**\n   * Creates a glass shape descriptor.\n   */\n  constructor(options: GlassInit = {}) {\n    super()\n    applyTransformDefaults(this, options)\n\n    if (options.width !== undefined) {\n      this.width = options.width\n    }\n    if (options.height !== undefined) {\n      this.height = options.height\n    }\n    if (options.cornerRadius !== undefined) {\n      this.cornerRadius = options.cornerRadius\n    }\n    if (options.cornerSmoothing !== undefined) {\n      this.cornerSmoothing = options.cornerSmoothing\n    }\n    if (options.pointerEvents !== undefined) {\n      this.pointerEvents = options.pointerEvents\n    }\n    if (options.zIndex !== undefined) {\n      this.zIndex = options.zIndex\n    }\n  }\n\n  /** Adds an HTML child or transform-only group to this glass, reparenting it if needed. */\n  add<T extends GlassChild>(child: T): T {\n    if (child instanceof Group) {\n      ensureNoCycle(this, child)\n      validateGroupForContext(child, this)\n    }\n\n    removeFromParent(child)\n    this._children.push(child)\n    child._parent = this\n    notifySceneMutation(child)\n    return child\n  }\n\n  /**\n   * Detaches this glass from its parent container, if attached.\n   */\n  remove() {\n    removeFromParent(this)\n  }\n\n  addEventListener<T extends GlassPointerEventType>(\n    type: T,\n    listener: ((event: GlassEventMap[T]) => void) | null,\n    options?: boolean | AddEventListenerOptions,\n  ): void\n  addEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject | null,\n    options?: boolean | AddEventListenerOptions,\n  ): void\n  addEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject | null,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    super.addEventListener(type, listener, options)\n  }\n\n  removeEventListener<T extends GlassPointerEventType>(\n    type: T,\n    listener: ((event: GlassEventMap[T]) => void) | null,\n    options?: boolean | EventListenerOptions,\n  ): void\n  removeEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject | null,\n    options?: boolean | EventListenerOptions,\n  ): void\n  removeEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject | null,\n    options?: boolean | EventListenerOptions,\n  ) {\n    super.removeEventListener(type, listener, options)\n  }\n}\n\n/**\n * A renderable glass layer whose child {@link Glass} nodes blend into a single SDF field.\n */\nexport class Container implements Transform {\n  /** Horizontal translation in CSS pixels. */\n  x = 0\n  /** Vertical translation in CSS pixels. */\n  y = 0\n  /** Horizontal scale factor. */\n  scaleX = 1\n  /** Vertical scale factor. */\n  scaleY = 1\n  /** Clockwise rotation in radians. */\n  rotation = 0\n  /** Local-space transform origin in CSS pixels. */\n  origin: Point = { x: 0, y: 0 }\n\n  /** Overall compositing opacity for the container's glass and shadow. */\n  opacity = 1\n  /** Fusion distance used when blending neighboring shapes in CSS pixels. */\n  spacing = 12\n  /** Backdrop blur radius in CSS pixels. */\n  blur = 8\n  /** Width of the beveled edge in CSS pixels. */\n  bezelWidth = 14\n  /** Base glass thickness in CSS pixels. */\n  thickness = 90\n  /** Scalar applied to the physically-derived displacement amount. */\n  displacementFactor = 1\n  /** Blur radius applied to the precomputed displacement field in CSS pixels. */\n  displacementBlur = 6\n  /**\n   * Exponent shaping SDF smooth-union normal gating.\n   * Higher values suppress blending longer as boundary normals diverge.\n   */\n  normalDivergenceBlendPower = 0.5\n  /** Enables normal-based suppression of SDF smooth-union blending. */\n  normalDivergenceBlendEnabled = true\n  /** Refractive index used for the displacement model. */\n  ior = 1.5\n  /** Refractive index used when refracting DOM content rendered inside the glass. */\n  contentIor = 1\n  /**\n   * Content-only refraction depth in CSS pixels.\n   * This is used instead of {@link thickness} when calculating DOM-content refraction.\n   */\n  contentDepth = 0\n  /** Strength of RGB channel separation applied to refraction. */\n  dispersion = 0\n  /** Surface profile used for the beveled edge. */\n  surfaceProfile: SurfaceProfile = 'convex'\n  /** 2D light direction in radians, where 0 points upward in screen space. */\n  lightDirection = -Math.PI / 4\n  /** Multiplier applied to the white specular term. */\n  specularStrength = 1\n  /** Width of the specular band. Numeric values are CSS pixels; `'hairline'` is one device pixel. */\n  specularWidth: SpecularWidth = 1\n  /** Amount by which specular strength falls off from the edge to the end of the band. */\n  specularFalloff = 1\n  /** Multiplier applied to the opposite-side white specular term. */\n  oppositeSpecularStrength = 1\n  /** Exponent controlling specular falloff. */\n  specularSharpness = 2\n  /** Final opacity of the white specular contribution. */\n  specularOpacity = 0.45\n  /** Offset in CSS pixels used when sampling the reflection color. */\n  reflectionOffset = 18\n  /** RGBA tint color layered over the refracted glass interior. */\n  tint: RgbaColor = { r: 1, g: 1, b: 1, a: 0.15 }\n  /** RGBA color used by the container's drop shadow. Alpha `0` disables shadows. */\n  shadowColor: RgbaColor = { r: 0, g: 0, b: 0, a: 0.12 }\n  /** Horizontal drop shadow offset in CSS pixels. */\n  shadowOffsetX = 0\n  /** Vertical drop shadow offset in CSS pixels. */\n  shadowOffsetY = 10\n  /** Drop shadow blur radius in CSS pixels. */\n  shadowBlur = 24\n  /** Drop shadow spread in CSS pixels. Positive values expand the silhouette. */\n  shadowSpread = 0\n  /** Renders the calculated displacement field instead of the shaded glass. */\n  debugDisplacement = false\n  /** Draw order among scene layers; higher values render later. */\n  zIndex = 0\n\n  _parent: Scene | Group | null = null\n  _children: ContainerChild[] = []\n\n  /**\n   * Creates a glass rendering layer with optical properties shared by its child shapes.\n   */\n  constructor(options: ContainerInit = {}) {\n    applyTransformDefaults(this, options)\n\n    if (options.opacity !== undefined) {\n      this.opacity = options.opacity\n    }\n    if (options.spacing !== undefined) {\n      this.spacing = options.spacing\n    }\n    if (options.blur !== undefined) {\n      this.blur = options.blur\n    }\n    if (options.bezelWidth !== undefined) {\n      this.bezelWidth = options.bezelWidth\n    }\n    if (options.thickness !== undefined) {\n      this.thickness = options.thickness\n    }\n    if (options.displacementFactor !== undefined) {\n      this.displacementFactor = options.displacementFactor\n    }\n    if (options.displacementBlur !== undefined) {\n      this.displacementBlur = options.displacementBlur\n    }\n    if (options.normalDivergenceBlendPower !== undefined) {\n      this.normalDivergenceBlendPower = options.normalDivergenceBlendPower\n    }\n    if (options.normalDivergenceBlendEnabled !== undefined) {\n      this.normalDivergenceBlendEnabled = options.normalDivergenceBlendEnabled\n    }\n    if (options.ior !== undefined) {\n      this.ior = options.ior\n    }\n    if (options.contentIor !== undefined) {\n      this.contentIor = options.contentIor\n    }\n    if (options.contentDepth !== undefined) {\n      this.contentDepth = options.contentDepth\n    }\n    if (options.dispersion !== undefined) {\n      this.dispersion = options.dispersion\n    }\n    if (options.surfaceProfile !== undefined) {\n      this.surfaceProfile = options.surfaceProfile\n    }\n    if (options.lightDirection !== undefined) {\n      this.lightDirection = options.lightDirection\n    }\n    if (options.specularStrength !== undefined) {\n      this.specularStrength = options.specularStrength\n    }\n    if (options.specularWidth !== undefined) {\n      this.specularWidth = options.specularWidth\n    }\n    if (options.specularFalloff !== undefined) {\n      this.specularFalloff = options.specularFalloff\n    }\n    this.oppositeSpecularStrength = options.oppositeSpecularStrength ?? this.specularStrength\n    if (options.specularSharpness !== undefined) {\n      this.specularSharpness = options.specularSharpness\n    }\n    if (options.specularOpacity !== undefined) {\n      this.specularOpacity = options.specularOpacity\n    }\n    if (options.reflectionOffset !== undefined) {\n      this.reflectionOffset = options.reflectionOffset\n    }\n    if (options.tint !== undefined) {\n      this.tint = cloneColor(options.tint)\n    }\n    if (options.shadowColor !== undefined) {\n      this.shadowColor = cloneColor(options.shadowColor)\n    }\n    if (options.shadowOffsetX !== undefined) {\n      this.shadowOffsetX = options.shadowOffsetX\n    }\n    if (options.shadowOffsetY !== undefined) {\n      this.shadowOffsetY = options.shadowOffsetY\n    }\n    if (options.shadowBlur !== undefined) {\n      this.shadowBlur = options.shadowBlur\n    }\n    if (options.shadowSpread !== undefined) {\n      this.shadowSpread = options.shadowSpread\n    }\n    if (options.debugDisplacement !== undefined) {\n      this.debugDisplacement = options.debugDisplacement\n    }\n    if (options.zIndex !== undefined) {\n      this.zIndex = options.zIndex\n    }\n  }\n\n  /**\n   * Adds a glass shape or transform-only group to this container, reparenting it if needed.\n   */\n  add<T extends ContainerChild>(child: T): T {\n    if (child instanceof Group) {\n      ensureNoCycle(this, child)\n      validateGroupForContext(child, this)\n    }\n\n    removeFromParent(child)\n    this._children.push(child)\n    child._parent = this\n    notifySceneMutation(child)\n    return child\n  }\n\n  /**\n   * Detaches this container from its parent scene or group, if attached.\n   */\n  remove() {\n    removeFromParent(this)\n  }\n}\n\n/**\n * A transform-only hierarchy node that can be inserted anywhere in the scene graph.\n */\nexport class Group implements Transform {\n  /** Horizontal translation in CSS pixels. */\n  x = 0\n  /** Vertical translation in CSS pixels. */\n  y = 0\n  /** Horizontal scale factor. */\n  scaleX = 1\n  /** Vertical scale factor. */\n  scaleY = 1\n  /** Clockwise rotation in radians. */\n  rotation = 0\n  /** Local-space transform origin in CSS pixels. */\n  origin: Point = { x: 0, y: 0 }\n\n  _parent: Scene | Container | Glass | Group | null = null\n  _children: GroupChild[] = []\n\n  /**\n   * Creates a transform-only group node.\n   */\n  constructor(options: GroupInit = {}) {\n    applyTransformDefaults(this, options)\n  }\n\n  /**\n   * Adds a child node, reparenting it if needed.\n   * Throws if the child type is invalid for this group's nearest non-group parent.\n   */\n  add<T extends GroupChild>(child: T): T {\n    if (child instanceof Group) {\n      ensureNoCycle(this, child)\n    }\n\n    const context = getGroupContext(this)\n    validateGroupChildForContext(child, context)\n    if (child instanceof Group) {\n      validateGroupForContext(child, context)\n    }\n\n    removeFromParent(child)\n    this._children.push(child)\n    child._parent = this\n    notifySceneMutation(child)\n    return child\n  }\n\n  /**\n   * Detaches this group from its parent, if attached.\n   */\n  remove() {\n    removeFromParent(this)\n  }\n}\n\n/**\n * A transform-only hierarchy node that creates a local z-index sorting context.\n */\nexport class StackingContext extends Group {\n  private _zIndex = 0\n\n  /**\n   * Creates a local stacking context.\n   */\n  constructor(options: StackingContextInit = {}) {\n    super(options)\n\n    if (options.zIndex !== undefined) {\n      this._zIndex = options.zIndex\n    }\n  }\n\n  /** Draw order of this entire subtree in the nearest parent stacking context. */\n  get zIndex() {\n    return this._zIndex\n  }\n\n  set zIndex(value: number) {\n    if (this._zIndex === value) {\n      return\n    }\n\n    this._zIndex = value\n    notifySceneMutation(this)\n  }\n}\n\n/**\n * Root node for a glass scene graph.\n */\nexport class Scene {\n  _children: SceneChild[] = []\n  _listeners = new Set<SceneMutationListener>()\n\n  /**\n   * Adds a container, HTML layer, transform-only group, or stacking context to the scene.\n   */\n  add<T extends SceneChild>(child: T): T {\n    if (child instanceof Group) {\n      ensureNoCycle(this, child)\n      validateGroupForContext(child, this)\n    }\n\n    removeFromParent(child)\n    this._children.push(child)\n    child._parent = this\n    this._notifyMutation()\n    return child\n  }\n\n  _subscribe(listener: SceneMutationListener) {\n    this._listeners.add(listener)\n    return () => {\n      this._listeners.delete(listener)\n    }\n  }\n\n  _notifyMutation() {\n    for (const listener of this._listeners) {\n      listener()\n    }\n  }\n}\n\n/**\n * Flattens scene children into final paint order with group transforms composed away.\n */\nexport function flattenSceneLayers(scene: Scene): TraversedSceneLayer[] {\n  const result: TraversedSceneLayer[] = []\n\n  function visitContext(children: readonly GroupChild[], parentTransform: Matrix2D) {\n    const order = { value: 0 }\n    const items: Array<{\n      child: RenderSceneChild | StackingContext\n      transform: Matrix2D\n      zIndex: number\n      order: number\n    }> = []\n\n    collectContextItems(children, parentTransform, order, (child, transform) => {\n      if (child instanceof Container || child instanceof Html) {\n        items.push({\n          child,\n          transform,\n          zIndex: child.zIndex,\n          order: order.value,\n        })\n        order.value += 1\n      }\n    }, (context, transform) => {\n      items.push({\n        child: context,\n        transform,\n        zIndex: context.zIndex,\n        order: order.value,\n      })\n      order.value += 1\n    })\n\n    items.sort((left, right) => left.zIndex - right.zIndex || left.order - right.order)\n\n    for (const item of items) {\n      if (item.child instanceof StackingContext) {\n        visitContext(item.child._children, item.transform)\n        continue\n      }\n\n      result.push({\n        child: item.child,\n        transform: item.transform,\n        traversalIndex: result.length,\n      })\n    }\n  }\n\n  visitContext(scene._children, identityMatrix())\n  return result\n}\n\n/**\n * Flattens a container's glass hierarchy into final paint order.\n */\nexport function flattenContainerGlasses(container: Container): TraversedGlass[] {\n  const result: TraversedGlass[] = []\n\n  function visitContext(children: readonly GroupChild[], parentTransform: Matrix2D) {\n    const order = { value: 0 }\n    const items: Array<{\n      child: Glass | StackingContext\n      transform: Matrix2D\n      zIndex: number\n      order: number\n    }> = []\n\n    collectContextItems(children, parentTransform, order, (child, transform) => {\n      if (child instanceof Glass) {\n        items.push({\n          child,\n          transform,\n          zIndex: child.zIndex,\n          order: order.value,\n        })\n        order.value += 1\n      }\n    }, (context, transform) => {\n      items.push({\n        child: context,\n        transform,\n        zIndex: context.zIndex,\n        order: order.value,\n      })\n      order.value += 1\n    })\n\n    items.sort((left, right) => left.zIndex - right.zIndex || left.order - right.order)\n\n    for (const item of items) {\n      if (item.child instanceof StackingContext) {\n        visitContext(item.child._children, item.transform)\n        continue\n      }\n\n      result.push({\n        glass: item.child,\n        transform: item.transform,\n        traversalIndex: result.length,\n      })\n    }\n  }\n\n  visitContext(container._children, identityMatrix())\n  return result\n}\n\n/**\n * Flattens a glass node's HTML hierarchy into final paint order.\n */\nexport function flattenGlassHtml(glass: Glass): TraversedHtml[] {\n  const result: TraversedHtml[] = []\n\n  function visitContext(children: readonly GroupChild[], parentTransform: Matrix2D) {\n    const order = { value: 0 }\n    const items: Array<{\n      child: Html | StackingContext\n      transform: Matrix2D\n      zIndex: number\n      order: number\n    }> = []\n\n    collectContextItems(children, parentTransform, order, (child, transform) => {\n      if (child instanceof Html) {\n        items.push({\n          child,\n          transform,\n          zIndex: child.zIndex,\n          order: order.value,\n        })\n        order.value += 1\n      }\n    }, (context, transform) => {\n      items.push({\n        child: context,\n        transform,\n        zIndex: context.zIndex,\n        order: order.value,\n      })\n      order.value += 1\n    })\n\n    items.sort((left, right) => left.zIndex - right.zIndex || left.order - right.order)\n\n    for (const item of items) {\n      if (item.child instanceof StackingContext) {\n        visitContext(item.child._children, item.transform)\n        continue\n      }\n\n      result.push({\n        html: item.child,\n        transform: item.transform,\n        traversalIndex: result.length,\n      })\n    }\n  }\n\n  visitContext(glass._children, identityMatrix())\n  return result\n}\n\nfunction collectContextItems(\n  children: readonly GroupChild[],\n  parentTransform: Matrix2D,\n  order: { value: number },\n  addRenderable: (child: GroupChild, transform: Matrix2D) => void,\n  addContext: (context: StackingContext, transform: Matrix2D) => void,\n) {\n  for (const child of children) {\n    const transform = multiplyMatrices(parentTransform, composeTransform(child))\n    if (child instanceof StackingContext) {\n      addContext(child, transform)\n      continue\n    }\n\n    if (child instanceof Group) {\n      collectContextItems(child._children, transform, order, addRenderable, addContext)\n      continue\n    }\n\n    addRenderable(child, transform)\n  }\n}\n\n/**\n * Flattens the scene hierarchy into renderable containers with composed world transforms.\n */\nexport function flattenContainers(scene: Scene): TraversedContainer[] {\n  return flattenSceneLayers(scene)\n    .filter((entry): entry is TraversedSceneLayer & { child: Container } => entry.child instanceof Container)\n    .map((entry) => ({\n      container: entry.child,\n      transform: entry.transform,\n      traversalIndex: entry.traversalIndex,\n    }))\n}\n"],"mappings":"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","names":["Glass","Html","LayoutHStack","LayoutVStack","LayoutZStack","LayoutFrame","LayoutPadding","LayoutNoop","LayoutBackground","LayoutOverlay","Glass","Html","LayoutSpacer"]}