{"version":3,"sources":["../src/index.ts","../src/events.ts","../src/corner-smoothing.ts","../src/matrix.ts","../src/scene.ts","../src/renderer/content.ts","../src/renderer/gpu-layout.ts","../src/renderer/shader-layouts.ts","../src/shaders.ts","../src/renderer/gpu-constants.ts","../src/renderer/gpu-pass.ts","../src/renderer/adaptive-blur.ts","../src/renderer/gpu-targets.ts","../src/renderer/interaction.ts","../src/renderer/scene-order.ts","../src/renderer/dom-content-sync.ts","../src/renderer/pointer-controller.ts","../src/renderer/metrics.ts","../src/renderer/backdrop-metrics-state.ts","../src/renderer/core.ts","../src/renderer/dom-content-source.ts","../src/renderer/index.ts"],"sourcesContent":["export { GlassPointerEvent } from './events'\nexport { Glass, Html, Container, Group, StackingContext, Scene } from './scene'\nexport { Renderer, WebGpuGlassCore, WebGpuDomContentSource, resolveSpecularWidthPx } from './renderer'\nexport type { GlassPointerEventInit, GlassPointerEventType } from './events'\nexport type {\n  WebGpuDomContentSourceInit,\n  WebGpuGlassContentSource,\n  WebGpuGlassCoreInit,\n  WebGpuGlassCoreRenderOptions,\n} from './renderer'\nexport type { BackdropMetrics, Point, RgbaColor, SpecularWidth, SurfaceProfile, Transform } from './types'\n","import type { Renderer } from './renderer'\nimport type { Glass } from './scene'\n\nconst GLASS_POINTER_EVENT_TYPES = [\n  'click',\n  'pointerenter',\n  'pointerleave',\n  'pointermove',\n  'pointerdown',\n  'pointerup',\n  'pointercancel',\n] as const\n\nexport type GlassPointerEventType = (typeof GLASS_POINTER_EVENT_TYPES)[number]\n\nexport type GlassPointerEventInit = {\n  glass: Glass\n  renderer: Renderer\n  nativeEvent: PointerEvent\n  canvasX: number\n  canvasY: number\n  localX: number\n  localY: number\n  inside: boolean\n}\n\n/**\n * Custom pointer event dispatched by a {@link Glass} instance.\n */\nexport class GlassPointerEvent extends Event {\n  readonly glass: Glass\n  readonly renderer: Renderer\n  readonly nativeEvent: PointerEvent\n  readonly pointerId: number\n  readonly pointerType: string\n  readonly isPrimary: boolean\n  readonly button: number\n  readonly buttons: number\n  readonly clientX: number\n  readonly clientY: number\n  readonly canvasX: number\n  readonly canvasY: number\n  readonly localX: number\n  readonly localY: number\n  readonly inside: boolean\n\n  constructor(type: GlassPointerEventType, init: GlassPointerEventInit) {\n    super(type, { bubbles: false, cancelable: true, composed: false })\n\n    this.glass = init.glass\n    this.renderer = init.renderer\n    this.nativeEvent = init.nativeEvent\n    this.pointerId = init.nativeEvent.pointerId\n    this.pointerType = init.nativeEvent.pointerType\n    this.isPrimary = init.nativeEvent.isPrimary\n    this.button = init.nativeEvent.button\n    this.buttons = init.nativeEvent.buttons\n    this.clientX = init.nativeEvent.clientX\n    this.clientY = init.nativeEvent.clientY\n    this.canvasX = init.canvasX\n    this.canvasY = init.canvasY\n    this.localX = init.localX\n    this.localY = init.localY\n    this.inside = init.inside\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 { Transform } from './types'\n\nexport type Matrix2D = {\n  a: number\n  b: number\n  c: number\n  d: number\n  e: number\n  f: number\n}\n\nexport function identityMatrix(): Matrix2D {\n  return {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: 0,\n    f: 0,\n  }\n}\n\nfunction multiply(left: Matrix2D, right: Matrix2D): Matrix2D {\n  return {\n    a: left.a * right.a + left.c * right.b,\n    b: left.b * right.a + left.d * right.b,\n    c: left.a * right.c + left.c * right.d,\n    d: left.b * right.c + left.d * right.d,\n    e: left.a * right.e + left.c * right.f + left.e,\n    f: left.b * right.e + left.d * right.f + left.f,\n  }\n}\n\nfunction translationMatrix(x: number, y: number): Matrix2D {\n  return {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: x,\n    f: y,\n  }\n}\n\nfunction scaleMatrix(x: number, y: number): Matrix2D {\n  return {\n    a: x,\n    b: 0,\n    c: 0,\n    d: y,\n    e: 0,\n    f: 0,\n  }\n}\n\nfunction rotationMatrix(rotation: number): Matrix2D {\n  const cosine = Math.cos(rotation)\n  const sine = Math.sin(rotation)\n\n  return {\n    a: cosine,\n    b: sine,\n    c: -sine,\n    d: cosine,\n    e: 0,\n    f: 0,\n  }\n}\n\nexport function composeTransform(transform: Transform): Matrix2D {\n  return multiply(\n    translationMatrix(transform.x, transform.y),\n    multiply(\n      translationMatrix(transform.origin.x, transform.origin.y),\n      multiply(\n        rotationMatrix(transform.rotation),\n        multiply(\n          scaleMatrix(transform.scaleX, transform.scaleY),\n          translationMatrix(-transform.origin.x, -transform.origin.y),\n        ),\n      ),\n    ),\n  )\n}\n\nexport function multiplyMatrices(left: Matrix2D, right: Matrix2D): Matrix2D {\n  return multiply(left, right)\n}\n\nexport function invertMatrix(matrix: Matrix2D): Matrix2D | null {\n  const determinant = matrix.a * matrix.d - matrix.b * matrix.c\n  if (Math.abs(determinant) < 0.000001) {\n    return null\n  }\n\n  const inverseDeterminant = 1 / determinant\n\n  return {\n    a: matrix.d * inverseDeterminant,\n    b: -matrix.b * inverseDeterminant,\n    c: -matrix.c * inverseDeterminant,\n    d: matrix.a * inverseDeterminant,\n    e: (matrix.c * matrix.f - matrix.d * matrix.e) * inverseDeterminant,\n    f: (matrix.b * matrix.e - matrix.a * matrix.f) * inverseDeterminant,\n  }\n}\n\nexport function scaleOutputMatrix(matrix: Matrix2D, factor: number): Matrix2D {\n  return {\n    a: matrix.a * factor,\n    b: matrix.b * factor,\n    c: matrix.c * factor,\n    d: matrix.d * factor,\n    e: matrix.e * factor,\n    f: matrix.f * factor,\n  }\n}\n\nexport function transformPoint(matrix: Matrix2D, x: number, y: number) {\n  return {\n    x: matrix.a * x + matrix.c * y + matrix.e,\n    y: matrix.b * x + matrix.d * y + matrix.f,\n  }\n}\n\nexport function getMinimumScale(matrix: Matrix2D): number {\n  const scaleX = Math.hypot(matrix.a, matrix.b)\n  const scaleY = Math.hypot(matrix.c, matrix.d)\n  return Math.max(Math.min(scaleX, scaleY), 0.0001)\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","import type { Glass, Html } from '../scene'\nimport type { Matrix2D } from '../matrix'\nimport type { AdaptiveBlurTargetChain } from './gpu-targets'\n\n/** Padding in atlas pixels around each HTML content copy to reduce edge bleeding. */\nexport const CONTENT_ATLAS_PADDING = 1\n\n/** Runtime metadata for one HTML node packed into the glass content atlas. */\nexport type GlassContentEntry = {\n  html: Html\n  glass: Glass\n  elementVersion: number\n  blur: number\n  width: number\n  height: number\n  deviceWidth: number\n  deviceHeight: number\n  copiedDeviceWidth: number\n  copiedDeviceHeight: number\n  sourceTexture: GPUTexture | null\n  sourceTextureWidth: number\n  sourceTextureHeight: number\n  filteredTexture: GPUTexture | null\n  blurTargetChain: AdaptiveBlurTargetChain | null\n  atlasX: number\n  atlasY: number\n  inverseTransform: Matrix2D\n}\n\n/** Pixel-space rectangle assigned to one content entry inside the atlas. */\ntype ContentLayoutRect = {\n  x: number\n  y: number\n}\n\n/** Result of packing glass-attached HTML nodes into a single atlas texture. */\nexport type ContentAtlasLayout = {\n  width: number\n  height: number\n  rects: Map<Html, ContentLayoutRect>\n}\n\n/** Returns the smallest power of two greater than or equal to the value. */\nfunction nextPowerOfTwo(value: number) {\n  let next = 1\n  while (next < value) {\n    next *= 2\n  }\n  return next\n}\n\n/**\n * Buckets a required device-pixel size to the texture allocation size used for\n * resize stability.\n */\nexport function getTextureBucketSize(requiredSize: number, maxTextureSize = Number.POSITIVE_INFINITY) {\n  if (requiredSize > maxTextureSize) {\n    throw new Error(`Texture size ${requiredSize} exceeds the maximum supported size ${maxTextureSize}.`)\n  }\n\n  return Math.min(nextPowerOfTwo(Math.max(1, requiredSize)), maxTextureSize)\n}\n\n/** Attempts row-based packing for a fixed atlas width. */\nfunction tryPackContentAtlas(entries: GlassContentEntry[], atlasWidth: number) {\n  const rects = new Map<Html, ContentLayoutRect>()\n  let cursorX = 0\n  let cursorY = 0\n  let rowHeight = 0\n\n  for (const entry of entries) {\n    const rectWidth = getTextureBucketSize(entry.deviceWidth) + CONTENT_ATLAS_PADDING * 2\n    const rectHeight = getTextureBucketSize(entry.deviceHeight) + CONTENT_ATLAS_PADDING * 2\n\n    if (rectWidth > atlasWidth) {\n      return null\n    }\n\n    if (cursorX > 0 && cursorX + rectWidth > atlasWidth) {\n      cursorX = 0\n      cursorY += rowHeight\n      rowHeight = 0\n    }\n\n    rects.set(entry.html, {\n      x: cursorX,\n      y: cursorY,\n    })\n\n    cursorX += rectWidth\n    rowHeight = Math.max(rowHeight, rectHeight)\n  }\n\n  return {\n    width: atlasWidth,\n    height: cursorY + rowHeight,\n    rects,\n  }\n}\n\n/**\n * Packs glass-attached HTML entries into a power-of-two atlas that fits within\n * the device texture limit.\n */\nexport function packContentAtlas(entries: GlassContentEntry[], maxTextureSize: number): ContentAtlasLayout {\n  if (entries.length === 0) {\n    throw new Error('Cannot build a glass content atlas without any content entries.')\n  }\n\n  let maxEntryWidth = 1\n  for (const entry of entries) {\n    maxEntryWidth = Math.max(maxEntryWidth, getTextureBucketSize(entry.deviceWidth) + CONTENT_ATLAS_PADDING * 2)\n  }\n\n  let atlasWidth = nextPowerOfTwo(maxEntryWidth)\n  while (atlasWidth <= maxTextureSize) {\n    const layout = tryPackContentAtlas(entries, atlasWidth)\n    if (layout) {\n      const atlasHeight = nextPowerOfTwo(layout.height)\n      if (atlasHeight <= maxTextureSize) {\n        return {\n          ...layout,\n          height: atlasHeight,\n        }\n      }\n    }\n\n    atlasWidth *= 2\n  }\n\n  throw new Error('Glass content atlas exceeds the maximum supported texture size.')\n}\n","const FLOATS_PER_VEC4 = 4\nconst BYTES_PER_FLOAT = Float32Array.BYTES_PER_ELEMENT\n\n/** Definition for one vec4 lane in a generated WGSL/TypeScript struct. */\ntype Vec4Definition<Fields extends readonly string[]> = {\n  readonly type: 'vec4f'\n  readonly fields: Fields\n}\n\n/** Map of struct lane names to their vec4 field definitions. */\nexport type StructDefinition = Record<string, Vec4Definition<readonly string[]>>\n\n/** Value object accepted by a typed GPU struct layout writer. */\ntype StructValues<Definition extends StructDefinition> = {\n  [Lane in keyof Definition]: Record<Definition[Lane]['fields'][number], number>\n}\n\n/** Extracts the schema definition from a concrete GPU struct layout. */\nexport type GpuStructDefinition<Layout extends GpuStructLayout<StructDefinition>> =\n  Layout extends GpuStructLayout<infer Definition> ? Definition : never\n\n/** Shared schema object that can generate WGSL structs and pack matching data. */\nexport type GpuStructLayout<Definition extends StructDefinition> = {\n  readonly floatCount: number\n  readonly byteSize: number\n  createArray(count?: number): Float32Array\n  wgsl(name: string): string\n  write(target: Float32Array, values: StructValues<Definition>): void\n  writeAt(target: Float32Array, index: number, values: StructValues<Definition>): void\n}\n\n/** Declares a vec4 lane for a generated GPU struct layout. */\nexport function vec4<const Fields extends readonly string[]>(...fields: Fields): Vec4Definition<Fields> {\n  if (fields.length > FLOATS_PER_VEC4) {\n    throw new Error('A vec4 layout lane cannot contain more than four fields.')\n  }\n\n  return {\n    type: 'vec4f',\n    fields,\n  }\n}\n\n/**\n * Creates a schema that keeps WGSL vec4-lane structs and TypeScript buffer\n * writes aligned.\n */\nexport function structLayout<const Definition extends StructDefinition>(\n  definition: Definition,\n): GpuStructLayout<Definition> {\n  const lanes = Object.keys(definition) as Array<keyof Definition & string>\n  const floatCount = lanes.length * FLOATS_PER_VEC4\n  const byteSize = floatCount * BYTES_PER_FLOAT\n  const writeAt = (target: Float32Array, index: number, values: StructValues<Definition>) => {\n    const baseOffset = index * floatCount\n    if (baseOffset < 0 || baseOffset + floatCount > target.length) {\n      throw new RangeError('GPU struct write is outside the target buffer.')\n    }\n\n    target.fill(0, baseOffset, baseOffset + floatCount)\n    for (let laneIndex = 0; laneIndex < lanes.length; laneIndex += 1) {\n      const lane = lanes[laneIndex]\n      const fields = definition[lane].fields\n      const laneValues = values[lane] as Record<string, number>\n      const laneOffset = baseOffset + laneIndex * FLOATS_PER_VEC4\n\n      for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex += 1) {\n        target[laneOffset + fieldIndex] = laneValues[fields[fieldIndex]]\n      }\n    }\n  }\n\n  return {\n    floatCount,\n    byteSize,\n\n    /** Creates CPU-side storage for one or more struct values. */\n    createArray(count = 1) {\n      return new Float32Array(Math.max(count, 1) * floatCount)\n    },\n\n    /** Generates the WGSL struct declaration matching this layout. */\n    wgsl(name: string) {\n      const members = lanes.map((lane) => `  ${lane}: vec4f,`).join('\\n')\n      return `struct ${name} {\\n${members}\\n};`\n    },\n\n    /** Writes one struct value at the beginning of a target array. */\n    write(target: Float32Array, values: StructValues<Definition>) {\n      writeAt(target, 0, values)\n    },\n\n    /** Writes one struct value at a specific struct index in a target array. */\n    writeAt,\n  }\n}\n\n/** Fixed-size GPU buffer for one typed uniform or storage struct. */\nexport class GpuStructBuffer<Definition extends StructDefinition> {\n  /** CPU-side staging data written before queue upload. */\n  readonly data: Float32Array\n  /** GPU buffer backing this struct. */\n  readonly buffer: GPUBuffer\n\n  /** Allocates the GPU buffer for the provided layout and usage flags. */\n  constructor(\n    private readonly device: GPUDevice,\n    private readonly layout: GpuStructLayout<Definition>,\n    usage: GPUBufferUsageFlags,\n  ) {\n    this.data = layout.createArray()\n    this.buffer = device.createBuffer({\n      size: layout.byteSize,\n      usage,\n    })\n  }\n\n  /** Binding resource for a bind group entry. */\n  get bindingResource(): GPUBindingResource {\n    return { buffer: this.buffer }\n  }\n\n  /** Packs and uploads a complete struct value. */\n  write(values: StructValues<Definition>) {\n    this.layout.write(this.data, values)\n    this.device.queue.writeBuffer(this.buffer, 0, this.data)\n  }\n\n  /** Destroys the underlying GPU buffer. */\n  destroy() {\n    this.buffer.destroy()\n  }\n}\n\n/** Growable GPU buffer for arrays of typed structs. */\nexport class GpuStructArrayBuffer<Definition extends StructDefinition> {\n  /** CPU-side staging data sized to the current capacity. */\n  data: Float32Array\n  /** GPU buffer backing the array, allocated on demand. */\n  buffer: GPUBuffer | null = null\n  /** Number of struct elements currently allocated. */\n  capacity = 0\n\n  /** Creates a growable struct-array buffer manager. */\n  constructor(\n    private readonly device: GPUDevice,\n    private readonly layout: GpuStructLayout<Definition>,\n    private readonly usage: GPUBufferUsageFlags,\n  ) {\n    this.data = layout.createArray()\n  }\n\n  /** Binding resource for a bind group entry. */\n  get bindingResource(): GPUBindingResource {\n    if (!this.buffer) {\n      throw new Error('GPU struct array buffer has not been allocated.')\n    }\n\n    return { buffer: this.buffer }\n  }\n\n  /** Ensures the GPU and staging buffers can hold the requested element count. */\n  ensureCapacity(requiredCount: number) {\n    const nextCapacity = Math.max(requiredCount, 1)\n    if (this.buffer && nextCapacity <= this.capacity) {\n      return\n    }\n\n    this.buffer?.destroy()\n    this.buffer = this.device.createBuffer({\n      size: nextCapacity * this.layout.byteSize,\n      usage: this.usage,\n    })\n    this.data = this.layout.createArray(nextCapacity)\n    this.capacity = nextCapacity\n  }\n\n  /** Writes one struct value into the CPU-side staging array. */\n  writeAt(index: number, values: StructValues<Definition>) {\n    this.layout.writeAt(this.data, index, values)\n  }\n\n  /** Uploads the active prefix of the staging array to the GPU buffer. */\n  upload(count: number) {\n    if (!this.buffer) {\n      return\n    }\n\n    this.device.queue.writeBuffer(\n      this.buffer,\n      0,\n      this.data,\n      0,\n      Math.max(count, 1) * this.layout.floatCount,\n    )\n  }\n\n  /** Destroys the GPU buffer and resets allocation state. */\n  destroy() {\n    this.buffer?.destroy()\n    this.buffer = null\n    this.capacity = 0\n  }\n}\n","import { structLayout, vec4 } from './gpu-layout'\n\n/** Uniform layout for one blur pass direction and radius. */\nexport const BlurParamsLayout = structLayout({\n  params: vec4('directionX', 'directionY', 'radius'),\n})\n\n/** Uniform layout for canvas, material, lighting, and shape-count globals. */\nexport const GlobalsLayout = structLayout({\n  canvas: vec4('width', 'height'),\n  container: vec4('opacity'),\n  shape: vec4('smoothing', 'bezelWidth', 'shapeCount', 'surfaceProfile'),\n  sdf: vec4('normalDivergenceBlendPower', 'normalDivergenceBlendEnabled'),\n  glass: vec4('thickness', 'displacementFactor', 'ior', 'dispersion'),\n  content: vec4('ior', 'depth'),\n  lighting: vec4('x', 'y'),\n  specular: vec4('strength', 'width', 'sharpness', 'opacity'),\n  specularSecondary: vec4('oppositeStrength', 'falloff', 'reflectionOffset'),\n  tint: vec4('r', 'g', 'b', 'a'),\n  shadow: vec4('offsetX', 'offsetY', 'spread', 'blur'),\n  shadowColor: vec4('r', 'g', 'b', 'a'),\n  debug: vec4('displacement'),\n})\n\n/** Storage layout for one glass shape's inverse transform and geometry. */\nexport const ShapeDataLayout = structLayout({\n  inverse0: vec4('a', 'c', 'e', 'minimumScale'),\n  inverse1: vec4('b', 'd', 'f', 'cornerRadius'),\n  geometry: vec4('halfWidth', 'halfHeight', 'cornerSmoothing'),\n  contentRange: vec4('start', 'count'),\n})\n\n/** Storage layout for one glass-attached HTML content atlas entry. */\nexport const ContentDataLayout = structLayout({\n  inverse0: vec4('a', 'c', 'e', 'copiedWidth'),\n  inverse1: vec4('b', 'd', 'f', 'copiedHeight'),\n  atlasRect: vec4('u', 'v', 'uScale', 'vScale'),\n  opacity: vec4('value'),\n})\n\n/** Uniform layout for the bounds sampled by the backdrop metrics shader. */\nexport const BackdropMetricsBoundsLayout = structLayout({\n  bounds: vec4('minX', 'minY', 'maxX', 'maxY'),\n})\n\n/** Uniform layout for compositing scene-attached HTML into the scene target. */\nexport const HtmlCompositeParamsLayout = structLayout({\n  canvas: vec4('width', 'height', 'uScale', 'vScale'),\n  inverse0: vec4('a', 'c', 'e', 'copiedWidth'),\n  inverse1: vec4('b', 'd', 'f', 'copiedHeight'),\n  opacity: vec4('value'),\n})\n","import {\n  BackdropMetricsBoundsLayout,\n  BlurParamsLayout,\n  ContentDataLayout,\n  GlobalsLayout,\n  HtmlCompositeParamsLayout,\n  ShapeDataLayout,\n} from './renderer/shader-layouts'\nimport {\n  CIRCULAR_CORNER_EXPONENT,\n  CORNER_SMOOTHING_EXPONENT_DELTA,\n} from './corner-smoothing'\n\nconst FULLSCREEN_VERTEX = /* wgsl */ `\nstruct VertexOutput {\n  @builtin(position) position: vec4f,\n  @location(0) uv: vec2f,\n};\n\n@vertex\nfn vertexMain(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {\n  var positions = array<vec2f, 3>(\n    vec2f(-1.0, -3.0),\n    vec2f(-1.0, 1.0),\n    vec2f(3.0, 1.0),\n  );\n\n  let position = positions[vertexIndex];\n  var output: VertexOutput;\n  output.position = vec4f(position, 0.0, 1.0);\n  output.uv = vec2f(position.x * 0.5 + 0.5, 0.5 - position.y * 0.5);\n  return output;\n}\n`\n\n// Averages four source pixels into one lower-resolution pixel. This is safe for\n// both opaque backdrop color and premultiplied displacement fields.\nexport const DOWNSAMPLE_SHADER = /* wgsl */ `\n${FULLSCREEN_VERTEX}\n\n@group(0) @binding(0) var downsampleSampler: sampler;\n@group(0) @binding(1) var inputTexture: texture_2d<f32>;\n\n@fragment\nfn fragmentMain(in: VertexOutput) -> @location(0) vec4f {\n  let textureSize = vec2f(textureDimensions(inputTexture));\n  let texel = 1.0 / max(textureSize, vec2f(1.0));\n  let clampedUv = clamp(in.uv, vec2f(0.0), vec2f(1.0));\n\n  return (\n    textureSampleLevel(inputTexture, downsampleSampler, clampedUv + texel * vec2f(-0.5, -0.5), 0.0) +\n    textureSampleLevel(inputTexture, downsampleSampler, clampedUv + texel * vec2f(0.5, -0.5), 0.0) +\n    textureSampleLevel(inputTexture, downsampleSampler, clampedUv + texel * vec2f(-0.5, 0.5), 0.0) +\n    textureSampleLevel(inputTexture, downsampleSampler, clampedUv + texel * vec2f(0.5, 0.5), 0.0)\n  ) * 0.25;\n}\n`\n\n// Upsamples a lower-resolution adaptive blur level using the pipeline sampler's\n// linear filtering. Premultiplied fields stay premultiplied through this step.\nexport const UPSAMPLE_SHADER = /* wgsl */ `\n${FULLSCREEN_VERTEX}\n\n@group(0) @binding(0) var upsampleSampler: sampler;\n@group(0) @binding(1) var inputTexture: texture_2d<f32>;\n\n@fragment\nfn fragmentMain(in: VertexOutput) -> @location(0) vec4f {\n  return textureSampleLevel(inputTexture, upsampleSampler, in.uv, 0.0);\n}\n`\n\n// Copies or resolves an external texture into the core's render graph or final\n// output texture. It uses a render pass instead of copyTextureToTexture so the\n// destination only needs RENDER_ATTACHMENT usage, which is important when a host\n// renderer owns the canvas texture.\nexport const TEXTURE_BLIT_SHADER = /* wgsl */ `\n${FULLSCREEN_VERTEX}\n\n@group(0) @binding(0) var blitSampler: sampler;\n@group(0) @binding(1) var inputTexture: texture_2d<f32>;\n\n@fragment\nfn fragmentMain(in: VertexOutput) -> @location(0) vec4f {\n  return textureSampleLevel(inputTexture, blitSampler, in.uv, 0.0);\n}\n`\n\n// Shared adaptive blur kernel for backdrop color and premultiplied displacement\n// fields. The constants are generated from a sigma=3, 13-tap Gaussian over\n// [-6..6]. Neighboring same-side taps are paired into one bilinear-filtered\n// sample, so the shader keeps the shape of the dense kernel without paying for\n// all 13 texture reads.\nexport const ADAPTIVE_BLUR_SHADER = /* wgsl */ `\n${BlurParamsLayout.wgsl('BlurParams')}\n${FULLSCREEN_VERTEX}\n\n@group(0) @binding(0) var blurSampler: sampler;\n@group(0) @binding(1) var inputTexture: texture_2d<f32>;\n@group(0) @binding(2) var<uniform> blurParams: BlurParams;\n\nconst ADAPTIVE_BLUR_TAP_RADIUS: f32 = 6.0;\nconst ADAPTIVE_BLUR_CENTER_WEIGHT: f32 = 0.13702282;\nconst ADAPTIVE_BLUR_PAIR_OFFSETS: array<f32, 3> = array<f32, 3>(\n  1.4584295,\n  3.4039848,\n  5.3518057,\n);\nconst ADAPTIVE_BLUR_PAIR_WEIGHTS: array<f32, 3> = array<f32, 3>(\n  0.23933733,\n  0.1394403,\n  0.052710965,\n);\n\n@fragment\nfn fragmentMain(in: VertexOutput) -> @location(0) vec4f {\n  let textureSize = vec2f(textureDimensions(inputTexture));\n  let blurStep =\n    blurParams.params.xy /\n    max(textureSize, vec2f(1.0)) *\n    (blurParams.params.z / ADAPTIVE_BLUR_TAP_RADIUS);\n  let clampedUv = clamp(in.uv, vec2f(0.0), vec2f(1.0));\n\n  var color = textureSampleLevel(inputTexture, blurSampler, clampedUv, 0.0) * ADAPTIVE_BLUR_CENTER_WEIGHT;\n\n  for (var i = 0u; i < 3u; i = i + 1u) {\n    let offset = blurStep * ADAPTIVE_BLUR_PAIR_OFFSETS[i];\n    let weight = ADAPTIVE_BLUR_PAIR_WEIGHTS[i];\n    color =\n      color +\n      (\n        textureSampleLevel(inputTexture, blurSampler, clamp(clampedUv + offset, vec2f(0.0), vec2f(1.0)), 0.0) +\n        textureSampleLevel(inputTexture, blurSampler, clamp(clampedUv - offset, vec2f(0.0), vec2f(1.0)), 0.0)\n      ) *\n      weight;\n  }\n\n  return color;\n}\n`\n\n// Shared SDF, profile, and fullscreen-triangle helpers used by the glass and\n// metrics passes so both evaluate the same fused shape field.\nconst SHADER_SHARED = /* wgsl */ `\n${GlobalsLayout.wgsl('Globals')}\n\n${ShapeDataLayout.wgsl('ShapeData')}\n\nstruct VertexOutput {\n  @builtin(position) position: vec4f,\n  @location(0) uv: vec2f,\n};\n\n// Smooth union uses the classic polynomial smooth-min only after a normal gate.\n// Nearly aligned normals are treated as duplicate or nested boundaries and fall\n// back toward a hard union; diverging normals get the full blend radius so real\n// corners can form a rounded transition.\n// globals.sdf.x shapes a continuous ramp from aligned normals to opposed\n// normals. A high power keeps smoothing very small until larger angle\n// differences, without introducing a hard threshold in the blend radius.\n// globals.sdf.y toggles that normal gate; when disabled, every pair receives\n// the full configured smoothing distance.\nconst SDF_EPSILON: f32 = 0.0001;\nconst SDF_GRADIENT_STEP_PX: f32 = 1.0;\nconst DEBUG_DISPLACEMENT_ENCODE_SCALE: f32 = 0.01;\n// Smooth blending can flatten the fused SDF so one distance unit covers\n// more than one screen pixel. Specular is a screen-space rim effect, so it\n// converts SDF distance back to pixels with derivatives and caps the correction\n// when the local field becomes nearly flat.\nconst SPECULAR_DISTANCE_SCALE_FLOOR: f32 = 0.25;\n// Width of the antialiased feather around the specular band edge in device\n// pixels. This is separate from the configured specular band width.\nconst SPECULAR_EDGE_FEATHER_PX: f32 = 1.0;\nconst CIRCULAR_CORNER_EXPONENT: f32 = ${CIRCULAR_CORNER_EXPONENT.toFixed(8)};\nconst CORNER_SMOOTHING_EXPONENT_DELTA: f32 = ${CORNER_SMOOTHING_EXPONENT_DELTA.toFixed(8)};\n\n// Keep the SDF value and its local normal together. The normal is used to decide\n// when smoothing is a real edge-to-edge blend instead of an overlap artifact.\nstruct SdfSample {\n  distance: f32,\n  gradient: vec2f,\n};\n\nfn normalizeSdfGradient(gradient: vec2f) -> vec2f {\n  let magnitude = length(gradient);\n  if (magnitude < SDF_EPSILON) {\n    return vec2f(0.0, -1.0);\n  }\n  return gradient / magnitude;\n}\n\nfn hardUnion(left: SdfSample, right: SdfSample) -> SdfSample {\n  if (left.distance <= right.distance) {\n    return left;\n  }\n  return right;\n}\n\nfn smoothUnion(left: SdfSample, right: SdfSample, smoothing: f32) -> SdfSample {\n  let normalAlignment = clamp(dot(left.gradient, right.gradient), -1.0, 1.0);\n  let normalDivergenceBlendPower = max(globals.sdf.x, 0.0001);\n  let gatedNormalDivergence = pow((1.0 - normalAlignment) * 0.5, normalDivergenceBlendPower);\n  let normalDivergence = select(1.0, gatedNormalDivergence, globals.sdf.y > 0.5);\n  let blendDistance = smoothing * normalDivergence;\n\n  if (blendDistance <= SDF_EPSILON) {\n    return hardUnion(left, right);\n  }\n\n  let h = clamp(0.5 + 0.5 * (right.distance - left.distance) / blendDistance, 0.0, 1.0);\n  return SdfSample(\n    mix(right.distance, left.distance, h) - blendDistance * h * (1.0 - h),\n    normalizeSdfGradient(mix(right.gradient, left.gradient, h)),\n  );\n}\n\nfn shapeLocalPos(shape: ShapeData, pos: vec2f) -> vec2f {\n  return vec2f(\n    shape.inverse0.x * pos.x + shape.inverse0.y * pos.y + shape.inverse0.z,\n    shape.inverse1.x * pos.x + shape.inverse1.y * pos.y + shape.inverse1.z,\n  );\n}\n\nfn superellipseLength(v: vec2f, exponent: f32) -> f32 {\n  let a = abs(v);\n  return pow(pow(a.x, exponent) + pow(a.y, exponent), 1.0 / exponent);\n}\n\n// CPU hit testing mirrors this in renderer/interaction.ts. If this p-norm\n// approximation changes, update that path at the same time.\nfn sdSmoothRoundRect(localPos: vec2f, halfSize: vec2f, radius: f32, cornerSmoothing: f32) -> f32 {\n  let cornerLimit = min(halfSize.x, halfSize.y);\n  let clampedRadius = min(max(radius, 0.0), cornerLimit);\n  let q = abs(localPos) - halfSize + vec2f(clampedRadius);\n  let maxSmoothingThatFits = select(\n    0.0,\n    max(cornerLimit / max(radius, SDF_EPSILON) - 1.0, 0.0),\n    radius > SDF_EPSILON,\n  );\n  let effectiveSmoothing = min(clamp(cornerSmoothing, 0.0, 1.0), maxSmoothingThatFits);\n  let exponent = CIRCULAR_CORNER_EXPONENT + effectiveSmoothing * CORNER_SMOOTHING_EXPONENT_DELTA;\n  let cornerDistance = superellipseLength(max(q, vec2f(0.0)), exponent);\n  return cornerDistance + min(max(q.x, q.y), 0.0) - clampedRadius;\n}\n\nfn shapeDistanceFromLocal(shape: ShapeData, localPos: vec2f) -> f32 {\n  let halfSize = shape.geometry.xy;\n  let localDistance = sdSmoothRoundRect(\n    localPos - halfSize,\n    halfSize,\n    shape.inverse1.w,\n    shape.geometry.z,\n  );\n  return localDistance * shape.inverse0.w;\n}\n\nfn shapeDistance(shape: ShapeData, pos: vec2f) -> f32 {\n  return shapeDistanceFromLocal(shape, shapeLocalPos(shape, pos));\n}\n\nfn shapeGradient(shape: ShapeData, pos: vec2f) -> vec2f {\n  let eps = SDF_GRADIENT_STEP_PX;\n  return normalizeSdfGradient(vec2f(\n    shapeDistance(shape, pos + vec2f(eps, 0.0)) - shapeDistance(shape, pos - vec2f(eps, 0.0)),\n    shapeDistance(shape, pos + vec2f(0.0, eps)) - shapeDistance(shape, pos - vec2f(0.0, eps)),\n  ));\n}\n\nfn shapeSdfSample(shape: ShapeData, pos: vec2f) -> SdfSample {\n  return SdfSample(\n    shapeDistance(shape, pos),\n    shapeGradient(shape, pos),\n  );\n}\n\nfn sceneSdfSample(pos: vec2f, shapeCount: u32, smoothing: f32) -> SdfSample {\n  var result = SdfSample(1e5, vec2f(0.0, -1.0));\n  var found = false;\n\n  for (var i = 0u; i < shapeCount; i = i + 1u) {\n    let nextSample = shapeSdfSample(shapes[i], pos);\n    if (!found) {\n      result = nextSample;\n      found = true;\n    } else {\n      result = smoothUnion(result, nextSample, smoothing);\n    }\n  }\n\n  return result;\n}\n\nfn smootherstep(value: f32) -> f32 {\n  let x = clamp(value, 0.0, 1.0);\n  return x * x * x * (x * (x * 6.0 - 15.0) + 10.0);\n}\n\nfn smootherstepDerivative(value: f32) -> f32 {\n  let x = clamp(value, 0.0, 1.0);\n  return 30.0 * x * x * (x * (x - 2.0) + 1.0);\n}\n\nfn convexSquircle(x: f32) -> vec2f {\n  let u = 1.0 - clamp(x, 0.0, 1.0);\n  let inside = max(1.0 - pow(u, 4.0), 0.0001);\n  let height = sqrt(inside);\n  let derivative = 2.0 * pow(u, 3.0) / sqrt(inside);\n  return vec2f(height, derivative);\n}\n\nfn concaveCircle(x: f32) -> vec2f {\n  let squircle = convexSquircle(x);\n  return vec2f(1.0 - squircle.x, -squircle.y);\n}\n\nfn evaluateHeightProfile(profileIndex: f32, x: f32) -> vec2f {\n  if (profileIndex < 0.5) {\n    return convexSquircle(x);\n  }\n\n  if (profileIndex < 1.5) {\n    return concaveCircle(x);\n  }\n\n  let convex = convexSquircle(x);\n  let concave = concaveCircle(x);\n  let blend = smootherstep(x);\n  let blendDerivative = smootherstepDerivative(x);\n  let height = mix(convex.x, concave.x, blend);\n  let derivative = mix(convex.y, concave.y, blend) + (concave.x - convex.x) * blendDerivative;\n  return vec2f(height, derivative);\n}\n\n@vertex\nfn vertexMain(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {\n  var positions = array<vec2f, 3>(\n    vec2f(-1.0, -3.0),\n    vec2f(-1.0, 1.0),\n    vec2f(3.0, 1.0),\n  );\n\n  let position = positions[vertexIndex];\n  var output: VertexOutput;\n  output.position = vec4f(position, 0.0, 1.0);\n  output.uv = vec2f(position.x * 0.5 + 0.5, 0.5 - position.y * 0.5);\n  return output;\n}\n`\n\n// Writes the container's surface field before the main glass pass. The field is\n// premultiplied by fill weight so blur kernels can cross the glass edge without\n// leaking invalid vectors from outside the shape.\nexport const DISPLACEMENT_FIELD_SHADER = /* wgsl */ `\n${SHADER_SHARED}\n\n@group(0) @binding(0) var<uniform> globals: Globals;\n@group(0) @binding(1) var<storage, read> shapes: array<ShapeData>;\n\n@fragment\nfn fragmentMain(in: VertexOutput) -> @location(0) vec4f {\n  let shapeCount = u32(globals.shape.z);\n  let fragCoord = in.uv * globals.canvas.xy;\n  let sdfSample = sceneSdfSample(fragCoord, shapeCount, globals.shape.x);\n  let distance = sdfSample.distance;\n  let fillMask = 1.0 - smoothstep(0.0, 1.4, distance);\n  let pixelWidth = max(fwidth(distance), 0.75);\n  let bezelWidth = max(globals.shape.y, pixelWidth * 2.0);\n  let inwardDistance = max(-distance, 0.0);\n  let bezelProgress = clamp(inwardDistance / bezelWidth, 0.0, 1.0);\n  let surfaceDerivative = select(\n    evaluateHeightProfile(globals.shape.w, bezelProgress).y,\n    0.0,\n    inwardDistance > bezelWidth,\n  );\n  let clampedSlope = min(surfaceDerivative, tan(1.4835298));\n  let surfaceSlope = sdfSample.gradient * clampedSlope;\n\n  return vec4f(surfaceSlope * fillMask, 0.0, fillMask);\n}\n`\n\n// Writes a sharp alpha mask for the container's offset SDF silhouette. The\n// renderer blurs this mask with the shared adaptive blur pipeline before\n// compositing it under the glass.\nexport const SHADOW_MASK_SHADER = /* wgsl */ `\n${SHADER_SHARED}\n\n@group(0) @binding(0) var<uniform> globals: Globals;\n@group(0) @binding(1) var<storage, read> shapes: array<ShapeData>;\n\n@fragment\nfn fragmentMain(in: VertexOutput) -> @location(0) vec4f {\n  let shapeCount = u32(globals.shape.z);\n  let fragCoord = in.uv * globals.canvas.xy;\n  let shadowCoord = fragCoord - globals.shadow.xy;\n  let distance = sceneSdfSample(shadowCoord, shapeCount, globals.shape.x).distance - globals.shadow.z;\n  let pixelWidth = max(fwidth(distance), 0.75);\n  let alpha = 1.0 - smoothstep(0.0, pixelWidth, distance);\n\n  return vec4f(0.0, 0.0, 0.0, alpha);\n}\n`\n\n// Composites a blurred shadow mask over the current scene. This happens before\n// the glass pass so the glass itself samples the pre-shadow backdrop while later\n// containers still see shadows from earlier containers.\nexport const SHADOW_COMPOSITE_SHADER = /* wgsl */ `\n${GlobalsLayout.wgsl('Globals')}\n${FULLSCREEN_VERTEX}\n\n@group(0) @binding(0) var shadowSampler: sampler;\n@group(0) @binding(1) var sceneTexture: texture_2d<f32>;\n@group(0) @binding(2) var shadowMaskTexture: texture_2d<f32>;\n@group(0) @binding(3) var<uniform> globals: Globals;\n\n@fragment\nfn fragmentMain(in: VertexOutput) -> @location(0) vec4f {\n  let sceneColor = textureSampleLevel(sceneTexture, shadowSampler, in.uv, 0.0);\n  let shadowMask = textureSampleLevel(shadowMaskTexture, shadowSampler, in.uv, 0.0).a;\n  let containerOpacity = clamp(globals.container.x, 0.0, 1.0);\n  let shadowOpacity = clamp(shadowMask * globals.shadowColor.a * containerOpacity, 0.0, 1.0);\n  let color = mix(sceneColor.rgb, globals.shadowColor.rgb, shadowOpacity);\n\n  return vec4f(color, sceneColor.a);\n}\n`\n\n// Used by the main glass render pass. This shades the fused glass containers,\n// sampling the sharp and blurred backdrop textures for refraction, reflection, and highlights.\nexport const GLASS_SHADER = /* wgsl */ `\n${SHADER_SHARED}\n\n@group(0) @binding(0) var<uniform> globals: Globals;\n@group(0) @binding(1) var<storage, read> shapes: array<ShapeData>;\n@group(0) @binding(2) var backgroundSampler: sampler;\n@group(0) @binding(3) var backgroundTextureSharp: texture_2d<f32>;\n@group(0) @binding(4) var backgroundTextureBlurred: texture_2d<f32>;\n@group(0) @binding(5) var glassContentTexture: texture_2d<f32>;\n\n${ContentDataLayout.wgsl('ContentData')}\n\n@group(0) @binding(6) var<storage, read> contentEntries: array<ContentData>;\n@group(0) @binding(7) var displacementFieldTexture: texture_2d<f32>;\n\nfn sampleBackgroundSharp(uv: vec2f) -> vec3f {\n  return textureSampleLevel(backgroundTextureSharp, backgroundSampler, uv, 0.0).rgb;\n}\n\nfn sampleBackgroundBlurred(uv: vec2f) -> vec3f {\n  return textureSampleLevel(backgroundTextureBlurred, backgroundSampler, uv, 0.0).rgb;\n}\n\nfn sampleSurfaceSlope(uv: vec2f) -> vec2f {\n  let field = textureSampleLevel(displacementFieldTexture, backgroundSampler, uv, 0.0);\n  return select(vec2f(0.0), field.xy / max(field.a, SDF_EPSILON), field.a > SDF_EPSILON);\n}\n\nfn contentLocalPos(content: ContentData, glassLocalPos: vec2f) -> vec2f {\n  return vec2f(\n    content.inverse0.x * glassLocalPos.x + content.inverse0.y * glassLocalPos.y + content.inverse0.z,\n    content.inverse1.x * glassLocalPos.x + content.inverse1.y * glassLocalPos.y + content.inverse1.z,\n  );\n}\n\nfn sampleGlassContentAtlas(content: ContentData, localPos: vec2f) -> vec4f {\n  let copiedSize = vec2f(content.inverse0.w, content.inverse1.w);\n  if (\n    any(copiedSize <= vec2f(0.0)) ||\n    any(content.atlasRect.zw <= vec2f(0.0)) ||\n    any(localPos < vec2f(0.0)) ||\n    any(localPos > copiedSize)\n  ) {\n    return vec4f(0.0);\n  }\n\n  let atlasUv = content.atlasRect.xy + localPos * content.atlasRect.zw;\n  let contentColor = textureSampleLevel(glassContentTexture, backgroundSampler, atlasUv, 0.0);\n  return vec4f(contentColor.rgb, contentColor.a * clamp(content.opacity.x, 0.0, 1.0));\n}\n\nfn sampleGlassContentEntry(\n  content: ContentData,\n  glassLocalRed: vec2f,\n  glassLocalGreen: vec2f,\n  glassLocalBlue: vec2f,\n  contentMask: f32,\n) -> vec4f {\n  if (contentMask <= 0.0) {\n    return vec4f(0.0);\n  }\n\n  let contentRed = sampleGlassContentAtlas(content, contentLocalPos(content, glassLocalRed));\n  let contentGreen = sampleGlassContentAtlas(content, contentLocalPos(content, glassLocalGreen));\n  let contentBlue = sampleGlassContentAtlas(content, contentLocalPos(content, glassLocalBlue));\n  let alpha = max(contentGreen.a, max(contentRed.a, contentBlue.a)) * contentMask;\n  return vec4f(vec3f(contentRed.r, contentGreen.g, contentBlue.b), alpha);\n}\n\n@fragment\nfn fragmentMain(in: VertexOutput) -> @location(0) vec4f {\n  let shapeCount = u32(globals.shape.z);\n  let fragCoord = in.uv * globals.canvas.xy;\n  let background = sampleBackgroundSharp(in.uv);\n  let containerOpacity = clamp(globals.container.x, 0.0, 1.0);\n\n  let sdfSample = sceneSdfSample(fragCoord, shapeCount, globals.shape.x);\n  let distance = sdfSample.distance;\n  let fillMask = 1.0 - smoothstep(0.0, 1.4, distance);\n  let gradient = sdfSample.gradient;\n  let pixelWidth = max(fwidth(distance), 0.75);\n  let specularDistanceUnitsPerPx = max(\n    length(vec2f(dpdx(distance), dpdy(distance))),\n    SPECULAR_DISTANCE_SCALE_FLOOR,\n  );\n  let specularDistancePx = distance / specularDistanceUnitsPerPx;\n  let specularInwardDistancePx = max(-specularDistancePx, 0.0);\n  let rimWidthPx = max(globals.specular.y, 0.0001);\n  let specularOuterMask = 1.0 - smoothstep(0.0, SPECULAR_EDGE_FEATHER_PX, specularDistancePx);\n  let specularInnerMask = 1.0 - smoothstep(\n    rimWidthPx,\n    rimWidthPx + SPECULAR_EDGE_FEATHER_PX,\n    specularInwardDistancePx,\n  );\n  let rimBandMask = specularOuterMask * specularInnerMask;\n  let rimNormal = gradient;\n  let lightDir = normalize(\n    select(vec2f(1.0, 0.0), globals.lighting.xy, dot(globals.lighting.xy, globals.lighting.xy) > 0.0001),\n  );\n  let mirroredLightDir = -lightDir;\n\n  let bezelWidth = max(globals.shape.y, pixelWidth * 2.0);\n  let inwardDistance = max(-distance, 0.0);\n  let bezelProgress = clamp(inwardDistance / bezelWidth, 0.0, 1.0);\n  let profileResult = evaluateHeightProfile(globals.shape.w, bezelProgress);\n  let profileHeight = profileResult.x * bezelWidth;\n  let flatHeight = evaluateHeightProfile(globals.shape.w, 1.0).x * bezelWidth;\n  let surfaceHeight = globals.glass.x + select(profileHeight, flatHeight, inwardDistance > bezelWidth);\n  let surfaceSlope = sampleSurfaceSlope(in.uv);\n\n  // The displacement prepass filters the 2D bevel slope before we rebuild the\n  // 3D surface normal. Keeping this as a surface field, rather than a final\n  // pixel displacement, lets the glass and content refraction paths still use\n  // their own IOR, depth, and dispersion settings.\n  let surfaceNormal = normalize(vec3f(surfaceSlope, 1.0));\n  let dispersion = max(globals.glass.w, 0.0);\n  let baseIor = max(globals.glass.z, 1.0001);\n  let refractedRayRed = refract(\n    vec3f(0.0, 0.0, -1.0),\n    surfaceNormal,\n    1.0 / max(baseIor + dispersion, 1.0001),\n  );\n  let refractedRayGreen = refract(vec3f(0.0, 0.0, -1.0), surfaceNormal, 1.0 / baseIor);\n  let refractedRayBlue = refract(\n    vec3f(0.0, 0.0, -1.0),\n    surfaceNormal,\n    1.0 / max(baseIor - dispersion, 1.0001),\n  );\n  let displacementPxRed = select(\n    refractedRayRed.xy / max(-refractedRayRed.z, 0.0001) * surfaceHeight * globals.glass.y,\n    vec2f(0.0),\n    fillMask <= 0.0,\n  );\n  let displacementPxGreen = select(\n    refractedRayGreen.xy / max(-refractedRayGreen.z, 0.0001) * surfaceHeight * globals.glass.y,\n    vec2f(0.0),\n    fillMask <= 0.0,\n  );\n  let displacementPxBlue = select(\n    refractedRayBlue.xy / max(-refractedRayBlue.z, 0.0001) * surfaceHeight * globals.glass.y,\n    vec2f(0.0),\n    fillMask <= 0.0,\n  );\n  if (globals.debug.x > 0.5) {\n    // Signed pixel displacement is centered at 0.5 for display in the color target:\n    // red/green hold x/y displacement, blue stays zero.\n    let debugDisplacement = displacementPxGreen * DEBUG_DISPLACEMENT_ENCODE_SCALE + vec2f(0.5);\n    let debugColor = mix(background, vec3f(debugDisplacement, 0.0), fillMask);\n    return vec4f(mix(background, debugColor, containerOpacity), 1.0);\n  }\n  let contentBaseIor = max(globals.content.x, 1.0001);\n  let contentRefractedRayRed = refract(\n    vec3f(0.0, 0.0, -1.0),\n    surfaceNormal,\n    1.0 / max(contentBaseIor + dispersion, 1.0001),\n  );\n  let contentRefractedRayGreen = refract(vec3f(0.0, 0.0, -1.0), surfaceNormal, 1.0 / contentBaseIor);\n  let contentRefractedRayBlue = refract(\n    vec3f(0.0, 0.0, -1.0),\n    surfaceNormal,\n    1.0 / max(contentBaseIor - dispersion, 1.0001),\n  );\n  let contentDisplacementPxRed = select(\n    contentRefractedRayRed.xy /\n      max(-contentRefractedRayRed.z, 0.0001) *\n      globals.content.y *\n      globals.glass.y,\n    vec2f(0.0),\n    fillMask <= 0.0,\n  );\n  let contentDisplacementPxGreen = select(\n    contentRefractedRayGreen.xy /\n      max(-contentRefractedRayGreen.z, 0.0001) *\n      globals.content.y *\n      globals.glass.y,\n    vec2f(0.0),\n    fillMask <= 0.0,\n  );\n  let contentDisplacementPxBlue = select(\n    contentRefractedRayBlue.xy /\n      max(-contentRefractedRayBlue.z, 0.0001) *\n      globals.content.y *\n      globals.glass.y,\n    vec2f(0.0),\n    fillMask <= 0.0,\n  );\n  let refractedUvRed = in.uv + displacementPxRed / globals.canvas.xy;\n  let refractedUvGreen = in.uv + displacementPxGreen / globals.canvas.xy;\n  let refractedUvBlue = in.uv + displacementPxBlue / globals.canvas.xy;\n  let refractedColor = vec3f(\n    sampleBackgroundBlurred(refractedUvRed).r,\n    sampleBackgroundBlurred(refractedUvGreen).g,\n    sampleBackgroundBlurred(refractedUvBlue).b,\n  );\n  let reflectedUv = in.uv + rimNormal * globals.specularSecondary.z / globals.canvas.xy;\n  let reflectedColor = sampleBackgroundBlurred(reflectedUv);\n  let glass = mix(refractedColor, globals.tint.rgb, globals.tint.a);\n  let refractedLuma = dot(refractedColor, vec3f(0.2126, 0.7152, 0.0722));\n  let reflectedLuma = dot(reflectedColor, vec3f(0.2126, 0.7152, 0.0722));\n\n  // Reflection only shows when the reflected sample is bright enough and the refracted sample\n  // underneath is dark enough to accept it.\n  let reflectionPresence = smoothstep(0.2, 0.85, reflectedLuma);\n  let refractionAcceptance = 1.0 - smoothstep(0.35, 0.85, refractedLuma);\n  let reflectionBlend = reflectionPresence * refractionAcceptance;\n  let edgeSpecularColor = mix(refractedColor, reflectedColor, reflectionBlend);\n\n  // Content rendered into per-glass canvas children is sampled from its own sharp atlas,\n  // refracted with the same displacement field, and then layered over the tinted backdrop\n  // before any specular contributions are applied.\n  var glassInterior = glass;\n  for (var i = 0u; i < shapeCount; i = i + 1u) {\n    let shape = shapes[i];\n    let contentStart = u32(shape.contentRange.x);\n    let contentCount = u32(shape.contentRange.y);\n    let shapeDistanceAtFrag = shapeDistance(shape, fragCoord);\n    let contentBand = max(globals.shape.x, pixelWidth);\n    let contentMask = 1.0 - smoothstep(contentBand, contentBand + pixelWidth, shapeDistanceAtFrag);\n    let glassLocalRed = shapeLocalPos(shape, fragCoord + contentDisplacementPxRed);\n    let glassLocalGreen = shapeLocalPos(shape, fragCoord + contentDisplacementPxGreen);\n    let glassLocalBlue = shapeLocalPos(shape, fragCoord + contentDisplacementPxBlue);\n\n    for (var contentOffset = 0u; contentOffset < contentCount; contentOffset = contentOffset + 1u) {\n      let contentLayer = sampleGlassContentEntry(\n        contentEntries[contentStart + contentOffset],\n        glassLocalRed,\n        glassLocalGreen,\n        glassLocalBlue,\n        contentMask,\n      );\n      glassInterior = mix(glassInterior, contentLayer.rgb, contentLayer.a);\n    }\n  }\n\n  // White specular is a separate rim-only highlight driven by 2D normal/light alignment and\n  // then masked back to the configured rim band. The mask uses derivative-scaled\n  // screen-pixel distance so smooth SDF blends do not stretch hairline highlights.\n  let primaryBandProgress = clamp(\n    specularInwardDistancePx / max(rimWidthPx, SPECULAR_EDGE_FEATHER_PX),\n    0.0,\n    1.0,\n  );\n  let oppositeBandProgress = primaryBandProgress;\n  let primaryStrength = globals.specular.x - globals.specularSecondary.y * primaryBandProgress * primaryBandProgress;\n  let oppositeStrength =\n    globals.specularSecondary.x - globals.specularSecondary.y * oppositeBandProgress * oppositeBandProgress;\n  let oppositeRimBandMask = rimBandMask;\n  let rimSpecular = pow(max(dot(rimNormal, lightDir), 0.0), globals.specular.z);\n  let mirroredRimSpecular = pow(max(dot(rimNormal, mirroredLightDir), 0.0), globals.specular.z);\n  let primarySpecularOpacity = clamp(rimSpecular * primaryStrength, 0.0, 1.0);\n  let oppositeSpecularOpacity = clamp(mirroredRimSpecular * oppositeStrength, 0.0, 1.0);\n  let combinedRimSpecularOpacity = clamp(\n    primarySpecularOpacity * rimBandMask + oppositeSpecularOpacity * oppositeRimBandMask,\n    0.0,\n    1.0,\n  );\n  let whiteSpecularOpacity = combinedRimSpecularOpacity * globals.specular.w;\n  let coloredEdgeOpacity = combinedRimSpecularOpacity;\n  let whiteSpecular = vec3f(1.0) * whiteSpecularOpacity;\n\n  var color = background;\n  if (fillMask > 0.0) {\n    color = mix(color, glassInterior, fillMask);\n    color = mix(color, edgeSpecularColor, coloredEdgeOpacity);\n    color = color + whiteSpecular;\n  }\n\n  return vec4f(mix(background, color, containerOpacity), 1.0);\n}\n`\n\n// Used by the offscreen metrics pass. This samples the blurred backdrop over the\n// interior of a container so the renderer can expose backdrop luminance/color statistics.\nexport const METRICS_SHADER = /* wgsl */ `\n${SHADER_SHARED}\n\n${BackdropMetricsBoundsLayout.wgsl('MetricsBounds')}\n\n@group(0) @binding(0) var<uniform> globals: Globals;\n@group(0) @binding(1) var<storage, read> shapes: array<ShapeData>;\n@group(0) @binding(2) var metricsSampler: sampler;\n@group(0) @binding(3) var blurredBackdrop: texture_2d<f32>;\n@group(0) @binding(4) var<uniform> metricsBounds: MetricsBounds;\n\n@fragment\nfn fragmentMain(in: VertexOutput) -> @location(0) vec4f {\n  let shapeCount = u32(globals.shape.z);\n  let positionPx = mix(metricsBounds.bounds.xy, metricsBounds.bounds.zw, in.uv);\n  let insideCanvas =\n    all(positionPx >= vec2f(0.0)) &&\n    all(positionPx <= globals.canvas.xy);\n  let distance = sceneSdfSample(positionPx, shapeCount, globals.shape.x).distance;\n  // This uses bezel width as the interior cutoff. For heavily fused shapes with\n  // spacing wider than the bezel, the transition band can extend past this threshold,\n  // but we accept that simplification for now because it does not occur in our target use cases.\n  let isInterior = insideCanvas && distance <= -globals.shape.y;\n  let color = textureSampleLevel(blurredBackdrop, metricsSampler, positionPx / globals.canvas.xy, 0.0).rgb;\n  return vec4f(color, select(0.0, 1.0, isInterior));\n}\n`\n\n// Composites one DOM-backed Html texture into the scene using the node's world transform.\nexport const HTML_COMPOSITE_SHADER = /* wgsl */ `\n${HtmlCompositeParamsLayout.wgsl('HtmlCompositeParams')}\n\n@group(0) @binding(0) var compositeSampler: sampler;\n@group(0) @binding(1) var sceneTexture: texture_2d<f32>;\n@group(0) @binding(2) var htmlTexture: texture_2d<f32>;\n@group(0) @binding(3) var<uniform> params: HtmlCompositeParams;\n\nstruct VertexOutput {\n  @builtin(position) position: vec4f,\n  @location(0) uv: vec2f,\n};\n\n@vertex\nfn vertexMain(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {\n  var positions = array<vec2f, 3>(\n    vec2f(-1.0, -3.0),\n    vec2f(-1.0, 1.0),\n    vec2f(3.0, 1.0),\n  );\n\n  let position = positions[vertexIndex];\n  var output: VertexOutput;\n  output.position = vec4f(position, 0.0, 1.0);\n  output.uv = vec2f(position.x * 0.5 + 0.5, 0.5 - position.y * 0.5);\n  return output;\n}\n\n@fragment\nfn fragmentMain(in: VertexOutput) -> @location(0) vec4f {\n  let sceneColor = textureSampleLevel(sceneTexture, compositeSampler, in.uv, 0.0);\n  let fragCoord = in.uv * params.canvas.xy;\n  let localPos = vec2f(\n    params.inverse0.x * fragCoord.x + params.inverse0.y * fragCoord.y + params.inverse0.z,\n    params.inverse1.x * fragCoord.x + params.inverse1.y * fragCoord.y + params.inverse1.z,\n  );\n  let copiedSize = vec2f(params.inverse0.w, params.inverse1.w);\n\n  if (\n    any(params.canvas.zw <= vec2f(0.0)) ||\n    any(copiedSize <= vec2f(0.0)) ||\n    any(localPos < vec2f(0.0)) ||\n    any(localPos > copiedSize)\n  ) {\n    return sceneColor;\n  }\n\n  let htmlColor = textureSampleLevel(htmlTexture, compositeSampler, localPos * params.canvas.zw, 0.0);\n  let htmlAlpha = htmlColor.a * clamp(params.opacity.x, 0.0, 1.0);\n  return vec4f(mix(sceneColor.rgb, htmlColor.rgb, htmlAlpha), 1.0);\n}\n`\n","/** Numeric GPUBufferUsage flags used without relying on DOM runtime globals. */\nexport const GPU_BUFFER_USAGE = {\n  MAP_READ: 0x0001,\n  UNIFORM: 0x0040,\n  STORAGE: 0x0080,\n  COPY_DST: 0x0008,\n} as const\n\n/** Numeric GPUTextureUsage flags used without relying on DOM runtime globals. */\nexport const GPU_TEXTURE_USAGE = {\n  COPY_SRC: 0x01,\n  TEXTURE_BINDING: 0x04,\n  COPY_DST: 0x02,\n  RENDER_ATTACHMENT: 0x10,\n} as const\n","const OPAQUE_BLACK = { r: 0, g: 0, b: 0, a: 1 } as const\n\n/** Inputs required to draw a full-screen triangle into a render target. */\ntype FullscreenPassOptions = {\n  pipeline: GPURenderPipeline\n  bindGroup: GPUBindGroup\n  target: GPUTexture\n  clearValue?: GPUColorDict\n}\n\n/** Pair of scene textures used as the ping-pong composition targets. */\ntype SceneTargets = {\n  sceneA: GPUTexture\n  sceneB: GPUTexture\n}\n\n/** Creates a bind group for bind-group layout zero of a pipeline. */\nexport function createPipelineBindGroup(\n  device: GPUDevice,\n  pipeline: GPURenderPipeline,\n  entries: GPUBindGroupEntry[],\n) {\n  return device.createBindGroup({\n    layout: pipeline.getBindGroupLayout(0),\n    entries,\n  })\n}\n\n/** Clears a texture by opening and ending a render pass. */\nexport function clearRenderTarget(\n  encoder: GPUCommandEncoder,\n  target: GPUTexture,\n  clearValue: GPUColorDict = OPAQUE_BLACK,\n) {\n  const pass = encoder.beginRenderPass({\n    colorAttachments: [\n      {\n        clearValue,\n        loadOp: 'clear',\n        storeOp: 'store',\n        view: target.createView(),\n      },\n    ],\n  })\n  pass.end()\n}\n\n/** Draws a full-screen triangle pass into a target texture. */\nexport function drawFullscreenPass(\n  encoder: GPUCommandEncoder,\n  { pipeline, bindGroup, target, clearValue = OPAQUE_BLACK }: FullscreenPassOptions,\n) {\n  const pass = encoder.beginRenderPass({\n    colorAttachments: [\n      {\n        clearValue,\n        loadOp: 'clear',\n        storeOp: 'store',\n        view: target.createView(),\n      },\n    ],\n  })\n  pass.setPipeline(pipeline)\n  pass.setBindGroup(0, bindGroup)\n  pass.draw(3)\n  pass.end()\n}\n\n/** Manages two scene targets and a command encoder for incremental composition. */\nexport class PingPongComposer {\n  /** Active encoder for the current composition step. */\n  encoder: GPUCommandEncoder\n  private currentTexture: GPUTexture\n  private nextTexture: GPUTexture\n\n  /** Starts a composition sequence with sceneA cleared as the current texture. */\n  constructor(private readonly device: GPUDevice, targets: SceneTargets) {\n    this.encoder = device.createCommandEncoder()\n    this.currentTexture = targets.sceneA\n    this.nextTexture = targets.sceneB\n    clearRenderTarget(this.encoder, this.currentTexture)\n  }\n\n  /** Texture containing the latest submitted composition result. */\n  get current() {\n    return this.currentTexture\n  }\n\n  /** Texture to render the next composition pass into. */\n  get next() {\n    return this.nextTexture\n  }\n\n  /** Submits the current encoder and swaps current/next targets. */\n  submitAndSwap() {\n    this.device.queue.submit([this.encoder.finish()])\n    this.encoder = this.device.createCommandEncoder()\n    const previousCurrent = this.currentTexture\n    this.currentTexture = this.nextTexture\n    this.nextTexture = previousCurrent\n  }\n\n  /** Submits the final pending encoder without swapping targets. */\n  submit() {\n    this.device.queue.submit([this.encoder.finish()])\n  }\n}\n","import {\n  ADAPTIVE_BLUR_SHADER,\n  DOWNSAMPLE_SHADER,\n  UPSAMPLE_SHADER,\n} from '../shaders'\nimport { GPU_BUFFER_USAGE } from './gpu-constants'\nimport {\n  createPipelineBindGroup,\n  drawFullscreenPass,\n} from './gpu-pass'\nimport {\n  GpuStructBuffer,\n  type GpuStructDefinition,\n} from './gpu-layout'\nimport type { AdaptiveBlurTargetChain } from './gpu-targets'\nimport { BlurParamsLayout } from './shader-layouts'\n\nexport const ADAPTIVE_BLUR_DENSE_RADIUS_PX = 6\nconst TRANSPARENT_BLACK = { r: 0, g: 0, b: 0, a: 0 } as const\n\ntype BlurParamsBuffer = GpuStructBuffer<GpuStructDefinition<typeof BlurParamsLayout>>\n\ntype AdaptiveBlurPipelines = {\n  downsample: GPURenderPipeline\n  blur: GPURenderPipeline\n  upsample: GPURenderPipeline\n}\n\nexport type AdaptiveBlurResources = {\n  pipelines: AdaptiveBlurPipelines\n  horizontalBuffer: BlurParamsBuffer\n  verticalBuffer: BlurParamsBuffer\n}\n\ntype AdaptiveBlurRenderOptions = {\n  device: GPUDevice\n  sampler: GPUSampler\n  encoder: GPUCommandEncoder\n  source: GPUTexture\n  radiusPx: number\n  chain: AdaptiveBlurTargetChain\n  resources: AdaptiveBlurResources\n}\n\nexport type AdaptiveBlurLevelSelection = {\n  skip: boolean\n  level: number\n  scale: number\n  effectiveRadius: number\n}\n\n/** Chooses the lowest-resolution blur level that keeps the kernel densely sampled. */\nexport function chooseAdaptiveBlurLevel(radiusPx: number, maxLevel: number): AdaptiveBlurLevelSelection {\n  const normalizedMaxLevel = Number.isFinite(maxLevel) ? Math.max(0, Math.floor(maxLevel)) : 0\n  const normalizedRadius = Number.isFinite(radiusPx) ? Math.max(radiusPx, 0) : 0\n\n  if (normalizedRadius <= 0) {\n    return {\n      skip: true,\n      level: 0,\n      scale: 1,\n      effectiveRadius: 0,\n    }\n  }\n\n  const requestedLevel = Math.ceil(Math.log2(normalizedRadius / ADAPTIVE_BLUR_DENSE_RADIUS_PX))\n  const level = Math.min(Math.max(requestedLevel, 0), normalizedMaxLevel)\n  const scale = 2 ** level\n\n  return {\n    skip: false,\n    level,\n    scale,\n    effectiveRadius: normalizedRadius / scale,\n  }\n}\n\n/** Creates pipelines and uniforms for adaptive blur over one texture format. */\nexport function createAdaptiveBlurResources(device: GPUDevice, format: GPUTextureFormat): AdaptiveBlurResources {\n  const downsampleModule = device.createShaderModule({ code: DOWNSAMPLE_SHADER })\n  const blurModule = device.createShaderModule({ code: ADAPTIVE_BLUR_SHADER })\n  const upsampleModule = device.createShaderModule({ code: UPSAMPLE_SHADER })\n  const uniformBufferUsage = GPU_BUFFER_USAGE.UNIFORM | GPU_BUFFER_USAGE.COPY_DST\n\n  return {\n    pipelines: {\n      downsample: createFullscreenPipeline(device, format, downsampleModule),\n      blur: createFullscreenPipeline(device, format, blurModule),\n      upsample: createFullscreenPipeline(device, format, upsampleModule),\n    },\n    horizontalBuffer: new GpuStructBuffer(device, BlurParamsLayout, uniformBufferUsage),\n    verticalBuffer: new GpuStructBuffer(device, BlurParamsLayout, uniformBufferUsage),\n  }\n}\n\n/** Destroys GPU buffers owned by one adaptive blur resource set. */\nexport function destroyAdaptiveBlurResources(resources: AdaptiveBlurResources | null | undefined) {\n  resources?.horizontalBuffer.destroy()\n  resources?.verticalBuffer.destroy()\n}\n\n/** Runs the shared multi-resolution blur and returns the texture containing the result. */\nexport function renderAdaptiveBlur({\n  device,\n  sampler,\n  encoder,\n  source,\n  radiusPx,\n  chain,\n  resources,\n}: AdaptiveBlurRenderOptions) {\n  if (chain.levels.length === 0) {\n    return source\n  }\n\n  const selection = chooseAdaptiveBlurLevel(radiusPx, chain.levels.length - 1)\n  if (selection.skip) {\n    return source\n  }\n\n  // Move to the coarsest selected level first so the fixed blur kernel stays\n  // dense relative to the effective radius, even for large CSS blur values.\n  let current = source\n  for (let levelIndex = 1; levelIndex <= selection.level; levelIndex += 1) {\n    const targetLevel = chain.levels[levelIndex]\n    const bindGroup = createPipelineBindGroup(device, resources.pipelines.downsample, [\n      { binding: 0, resource: sampler },\n      { binding: 1, resource: current.createView() },\n    ])\n    drawFullscreenPass(encoder, {\n      pipeline: resources.pipelines.downsample,\n      bindGroup,\n      target: targetLevel.ping,\n      clearValue: TRANSPARENT_BLACK,\n    })\n    current = targetLevel.ping\n  }\n\n  const blurLevel = chain.levels[selection.level]\n  writeAdaptiveBlurParams(selection.effectiveRadius, resources.horizontalBuffer, resources.verticalBuffer)\n\n  const horizontalBindGroup = createPipelineBindGroup(device, resources.pipelines.blur, [\n    { binding: 0, resource: sampler },\n    { binding: 1, resource: current.createView() },\n    { binding: 2, resource: resources.horizontalBuffer.bindingResource },\n  ])\n  drawFullscreenPass(encoder, {\n    pipeline: resources.pipelines.blur,\n    bindGroup: horizontalBindGroup,\n    target: blurLevel.pong,\n    clearValue: TRANSPARENT_BLACK,\n  })\n\n  const verticalBindGroup = createPipelineBindGroup(device, resources.pipelines.blur, [\n    { binding: 0, resource: sampler },\n    { binding: 1, resource: blurLevel.pong.createView() },\n    { binding: 2, resource: resources.verticalBuffer.bindingResource },\n  ])\n  drawFullscreenPass(encoder, {\n    pipeline: resources.pipelines.blur,\n    bindGroup: verticalBindGroup,\n    target: blurLevel.ping,\n    clearValue: TRANSPARENT_BLACK,\n  })\n\n  // Come back to full resolution one level at a time. Progressive linear\n  // upsampling avoids a single large stretch and keeps premultiplied fields valid.\n  current = blurLevel.ping\n  for (let levelIndex = selection.level - 1; levelIndex >= 0; levelIndex -= 1) {\n    const targetLevel = chain.levels[levelIndex]\n    const bindGroup = createPipelineBindGroup(device, resources.pipelines.upsample, [\n      { binding: 0, resource: sampler },\n      { binding: 1, resource: current.createView() },\n    ])\n    drawFullscreenPass(encoder, {\n      pipeline: resources.pipelines.upsample,\n      bindGroup,\n      target: targetLevel.pong,\n      clearValue: TRANSPARENT_BLACK,\n    })\n    current = targetLevel.pong\n  }\n\n  return current\n}\n\nfunction createFullscreenPipeline(\n  device: GPUDevice,\n  format: GPUTextureFormat,\n  module: GPUShaderModule,\n) {\n  return device.createRenderPipeline({\n    layout: 'auto',\n    vertex: {\n      module,\n      entryPoint: 'vertexMain',\n    },\n    fragment: {\n      module,\n      entryPoint: 'fragmentMain',\n      targets: [{ format }],\n    },\n    primitive: {\n      topology: 'triangle-list',\n    },\n  })\n}\n\nfunction writeAdaptiveBlurParams(\n  radiusPx: number,\n  horizontalBuffer: BlurParamsBuffer,\n  verticalBuffer: BlurParamsBuffer,\n) {\n  const blurRadius = Math.max(radiusPx, 0)\n  horizontalBuffer.write({\n    params: {\n      directionX: 1,\n      directionY: 0,\n      radius: blurRadius,\n    },\n  })\n  verticalBuffer.write({\n    params: {\n      directionX: 0,\n      directionY: 1,\n      radius: blurRadius,\n    },\n  })\n}\n","import { GPU_TEXTURE_USAGE } from './gpu-constants'\n\n/** One resolution level in an adaptive blur chain. */\nexport type AdaptiveBlurTargetLevel = {\n  ping: GPUTexture\n  pong: GPUTexture\n  width: number\n  height: number\n}\n\n/** Full mip-like render target chain used by adaptive multi-resolution blur. */\nexport type AdaptiveBlurTargetChain = {\n  format: GPUTextureFormat\n  levels: AdaptiveBlurTargetLevel[]\n}\n\n/** Texture set used by blur passes and scene ping-pong composition. */\nexport type RenderTargetSet = {\n  backdropBlur: AdaptiveBlurTargetChain\n  displacementBlur: AdaptiveBlurTargetChain\n  shadowBlur: AdaptiveBlurTargetChain\n  sceneA: GPUTexture\n  sceneB: GPUTexture\n}\n\n/** Rectangular texture copy in source and destination pixel coordinates. */\nexport type TextureCopyRegion = {\n  sourceX: number\n  sourceY: number\n  destinationX: number\n  destinationY: number\n  width: number\n  height: number\n}\n\n/** Creates a render target compatible with sampling, rendering, and copies. */\nexport function createRenderTarget(\n  device: GPUDevice,\n  format: GPUTextureFormat,\n  width: number,\n  height: number,\n) {\n  return device.createTexture({\n    size: {\n      width,\n      height,\n      depthOrArrayLayers: 1,\n    },\n    format,\n    usage:\n      GPU_TEXTURE_USAGE.COPY_SRC |\n      GPU_TEXTURE_USAGE.TEXTURE_BINDING |\n      GPU_TEXTURE_USAGE.RENDER_ATTACHMENT |\n      GPU_TEXTURE_USAGE.COPY_DST,\n  })\n}\n\n/** Creates a full-size-to-1px texture chain for adaptive blur. */\nexport function createAdaptiveBlurTargetChain(\n  device: GPUDevice,\n  format: GPUTextureFormat,\n  width: number,\n  height: number,\n): AdaptiveBlurTargetChain {\n  const levels: AdaptiveBlurTargetLevel[] = []\n  let levelWidth = Math.max(Math.floor(width), 1)\n  let levelHeight = Math.max(Math.floor(height), 1)\n\n  while (true) {\n    levels.push({\n      ping: createRenderTarget(device, format, levelWidth, levelHeight),\n      pong: createRenderTarget(device, format, levelWidth, levelHeight),\n      width: levelWidth,\n      height: levelHeight,\n    })\n\n    if (levelWidth === 1 && levelHeight === 1) {\n      break\n    }\n\n    levelWidth = Math.max(Math.ceil(levelWidth / 2), 1)\n    levelHeight = Math.max(Math.ceil(levelHeight / 2), 1)\n  }\n\n  return {\n    format,\n    levels,\n  }\n}\n\n/** Destroys every texture in one adaptive blur chain. */\nexport function destroyAdaptiveBlurTargetChain(chain: AdaptiveBlurTargetChain | null | undefined) {\n  if (!chain) {\n    return\n  }\n\n  for (const level of chain.levels) {\n    level.ping.destroy()\n    level.pong.destroy()\n  }\n}\n\n/** Destroys every texture in a render target set. */\nexport function destroyTargets(targets: RenderTargetSet | null) {\n  if (!targets) {\n    return\n  }\n\n  destroyAdaptiveBlurTargetChain(targets.backdropBlur)\n  destroyAdaptiveBlurTargetChain(targets.displacementBlur)\n  destroyAdaptiveBlurTargetChain(targets.shadowBlur)\n  targets.sceneA.destroy()\n  targets.sceneB.destroy()\n}\n\n/** Copies a positive-size rectangular region between two textures. */\nexport function copyTextureRegion(\n  encoder: GPUCommandEncoder,\n  source: GPUTexture,\n  destination: GPUTexture,\n  region: TextureCopyRegion,\n) {\n  const width = Math.floor(region.width)\n  const height = Math.floor(region.height)\n\n  if (width <= 0 || height <= 0) {\n    return false\n  }\n\n  encoder.copyTextureToTexture(\n    {\n      texture: source,\n      origin: {\n        x: Math.floor(region.sourceX),\n        y: Math.floor(region.sourceY),\n        z: 0,\n      },\n    },\n    {\n      texture: destination,\n      origin: {\n        x: Math.floor(region.destinationX),\n        y: Math.floor(region.destinationY),\n        z: 0,\n      },\n    },\n    {\n      width,\n      height,\n      depthOrArrayLayers: 1,\n    },\n  )\n\n  return true\n}\n","import { resolveCornerSmoothingExponent } from '../corner-smoothing'\nimport { invertMatrix, multiplyMatrices, transformPoint, type Matrix2D } from '../matrix'\nimport { flattenContainerGlasses, type Container, type Glass } from '../scene'\n\nconst SDF_EPSILON = 0.0001\n\n/** Flattened container with the world transform used for hit testing. */\nexport type FlattenedContainer = {\n  container: Container\n  transform: Matrix2D\n}\n\n/** Cached geometry and transform data for pointer interaction with one glass. */\nexport type GlassInteractionEntry = {\n  glass: Glass\n  container: Container\n  containerOrder: number\n  glassOrder: number\n  transform: Matrix2D\n  inverseTransform: Matrix2D\n  halfWidth: number\n  halfHeight: number\n  cornerRadius: number\n  cornerSmoothing: number\n}\n\n/** Canvas-relative pointer coordinates paired with the original DOM event. */\nexport type PointerSnapshot = {\n  nativeEvent: PointerEvent\n  canvasX: number\n  canvasY: number\n}\n\n/** Mutable pointer interaction state tracked per native pointer id. */\nexport type PointerState = {\n  hoveredGlass: Glass | null\n  capturedGlass: Glass | null\n  capturedWithNativePointerCapture: boolean\n  pressedGlass: Glass | null\n  lastSnapshot: PointerSnapshot | null\n}\n\nfunction clamp(value: number, min: number, max: number) {\n  return Math.min(Math.max(value, min), max)\n}\n\nfunction superellipseLength(x: number, y: number, exponent: number) {\n  return (Math.abs(x) ** exponent + Math.abs(y) ** exponent) ** (1 / exponent)\n}\n\n// Mirrors the WGSL shape SDF in ../shaders.ts for pointer hit testing.\nfunction sdSmoothRoundRect(\n  localX: number,\n  localY: number,\n  halfWidth: number,\n  halfHeight: number,\n  radius: number,\n  cornerSmoothing: number,\n) {\n  const cornerLimit = Math.min(halfWidth, halfHeight)\n  const clampedRadius = Math.min(Math.max(radius, 0), cornerLimit)\n  const qx = Math.abs(localX) - halfWidth + clampedRadius\n  const qy = Math.abs(localY) - halfHeight + clampedRadius\n  const maxSmoothingThatFits = radius > SDF_EPSILON\n    ? Math.max(cornerLimit / Math.max(radius, SDF_EPSILON) - 1, 0)\n    : 0\n  const effectiveSmoothing = Math.min(clamp(cornerSmoothing, 0, 1), maxSmoothingThatFits)\n  const exponent = resolveCornerSmoothingExponent(effectiveSmoothing)\n  const cornerDistance = superellipseLength(Math.max(qx, 0), Math.max(qy, 0), exponent)\n\n  return cornerDistance + Math.min(Math.max(qx, qy), 0) - clampedRadius\n}\n\n/** Converts a 2D matrix into the CSS matrix() transform syntax. */\nexport function matrixToCssTransform(matrix: Matrix2D) {\n  return `matrix(${matrix.a}, ${matrix.b}, ${matrix.c}, ${matrix.d}, ${matrix.e}, ${matrix.f})`\n}\n\n/** Builds the ordered hit-test cache for every pointer-enabled glass. */\nexport function createGlassInteractionEntries(containers: FlattenedContainer[]) {\n  const entriesByGlass = new Map<Glass, GlassInteractionEntry>()\n  const orderedEntries: GlassInteractionEntry[] = []\n\n  for (let containerOrder = 0; containerOrder < containers.length; containerOrder += 1) {\n    const entry = containers[containerOrder]\n\n    for (const glassLayer of flattenContainerGlasses(entry.container)) {\n      const glass = glassLayer.glass\n      if (!glass.pointerEvents || glass.width <= 0 || glass.height <= 0) {\n        continue\n      }\n\n      const transform = multiplyMatrices(entry.transform, glassLayer.transform)\n      const inverseTransform = invertMatrix(transform)\n      if (!inverseTransform) {\n        continue\n      }\n\n      const interactionEntry = {\n        glass,\n        container: entry.container,\n        containerOrder,\n        glassOrder: glassLayer.traversalIndex,\n        transform,\n        inverseTransform,\n        halfWidth: glass.width * 0.5,\n        halfHeight: glass.height * 0.5,\n        cornerRadius: glass.cornerRadius,\n        cornerSmoothing: glass.cornerSmoothing,\n      } satisfies GlassInteractionEntry\n\n      entriesByGlass.set(glass, interactionEntry)\n      orderedEntries.push(interactionEntry)\n    }\n  }\n\n  orderedEntries.sort(\n    (left, right) =>\n      left.containerOrder - right.containerOrder ||\n      left.glassOrder - right.glassOrder,\n  )\n\n  return {\n    entriesByGlass,\n    orderedEntries,\n  }\n}\n\n/** Measures a canvas point in a glass interaction entry's local space. */\nexport function measureGlassInteractionEntry(entry: GlassInteractionEntry, canvasX: number, canvasY: number) {\n  const localPoint = transformPoint(entry.inverseTransform, canvasX, canvasY)\n  const centeredX = localPoint.x - entry.halfWidth\n  const centeredY = localPoint.y - entry.halfHeight\n  return {\n    localX: localPoint.x,\n    localY: localPoint.y,\n    inside:\n      sdSmoothRoundRect(\n        centeredX,\n        centeredY,\n        entry.halfWidth,\n        entry.halfHeight,\n        entry.cornerRadius,\n        entry.cornerSmoothing,\n      ) <= 0,\n  }\n}\n\n/** Returns the topmost glass interaction entry containing a canvas point. */\nexport function hitTestGlassInteractionEntries(\n  entries: GlassInteractionEntry[],\n  canvasX: number,\n  canvasY: number,\n) {\n  for (let index = entries.length - 1; index >= 0; index -= 1) {\n    const entry = entries[index]\n    if (measureGlassInteractionEntry(entry, canvasX, canvasY).inside) {\n      return entry\n    }\n  }\n\n  return null\n}\n","import {\n  Container,\n  flattenContainerGlasses,\n  flattenGlassHtml,\n  flattenSceneLayers,\n  Glass,\n  Html,\n  Scene,\n  type TraversedSceneLayer,\n} from '../scene'\nimport type { FlattenedContainer } from './interaction'\n\n/** Returns top-level render layers in final scene paint order. */\nexport function getSortedSceneLayers(scene: Scene) {\n  return flattenSceneLayers(scene)\n}\n\n/** Returns a container's flattened glass children in final local paint order. */\nexport function getSortedGlassLayers(container: Container) {\n  return flattenContainerGlasses(container)\n}\n\n/** Returns a glass node's flattened HTML children in final local paint order. */\nexport function getSortedGlassHtmlLayers(glass: Glass) {\n  return flattenGlassHtml(glass)\n}\n\n/** Extracts flattened container layers for interaction and content sync. */\nexport function getLayerContainers(layers: TraversedSceneLayer[]): FlattenedContainer[] {\n  return layers\n    .filter((entry): entry is TraversedSceneLayer & { child: Container } => entry.child instanceof Container)\n    .map((entry) => ({\n      container: entry.child,\n      transform: entry.transform,\n    }))\n}\n\n/** Computes stable DOM/z-index order for all live HTML hosts in render order. */\nexport function getHtmlHostOrder(layers: TraversedSceneLayer[]) {\n  const order = new Map<Html, number>()\n  let nextOrder = 1\n\n  for (const layer of layers) {\n    if (layer.child instanceof Html) {\n      if (layer.child.width > 0 && layer.child.height > 0) {\n        order.set(layer.child, nextOrder)\n        nextOrder += 1\n      }\n      continue\n    }\n\n    for (const glassLayer of getSortedGlassLayers(layer.child)) {\n      for (const htmlLayer of getSortedGlassHtmlLayers(glassLayer.glass)) {\n        const html = htmlLayer.html\n        if (html.width > 0 && html.height > 0) {\n          order.set(html, nextOrder)\n          nextOrder += 1\n        }\n      }\n    }\n  }\n\n  return order\n}\n","import {\n  invertMatrix,\n  multiplyMatrices,\n  scaleOutputMatrix,\n} from '../matrix'\nimport { Glass, Html, type TraversedSceneLayer } from '../scene'\nimport {\n  CONTENT_ATLAS_PADDING,\n  getTextureBucketSize,\n  packContentAtlas,\n  type GlassContentEntry,\n} from './content'\nimport {\n  createAdaptiveBlurResources,\n  destroyAdaptiveBlurResources,\n  renderAdaptiveBlur,\n  type AdaptiveBlurResources,\n} from './adaptive-blur'\nimport { GPU_BUFFER_USAGE, GPU_TEXTURE_USAGE } from './gpu-constants'\nimport {\n  GpuStructArrayBuffer,\n  type GpuStructDefinition,\n} from './gpu-layout'\nimport {\n  copyTextureRegion,\n  createAdaptiveBlurTargetChain,\n  createRenderTarget,\n  destroyAdaptiveBlurTargetChain,\n} from './gpu-targets'\nimport { matrixToCssTransform, type FlattenedContainer } from './interaction'\nimport { getSortedGlassHtmlLayers, getSortedGlassLayers } from './scene-order'\nimport { ContentDataLayout } from './shader-layouts'\nimport type { GlassContentRange, SceneHtmlEntry } from './content-source'\nexport type { FlattenedContainer } from './interaction'\n\n/** Typed GPU buffer used for glass content atlas entries. */\ntype ContentDataBuffer = GpuStructArrayBuffer<GpuStructDefinition<typeof ContentDataLayout>>\n\n/** Chrome's experimental queue extension for copying DOM elements to textures. */\ntype GPUQueueWithElementCopy = GPUQueue & {\n  copyElementImageToTexture: (\n    source: Element,\n    width: number,\n    height: number,\n    destination: { texture: GPUTexture; origin?: { x: number; y: number; z?: number } },\n  ) => void\n}\n\n/** Paint event payload emitted by canvas layout subtree updates. */\ntype CanvasPaintEvent = Event & {\n  changedElements?: readonly Element[]\n}\n\n/** Previous atlas location and copied size used when copying forward on repack. */\ntype PreviousGlassContentAtlasEntry = {\n  copiedDeviceWidth: number\n  copiedDeviceHeight: number\n  atlasX: number\n  atlasY: number\n}\n\n/** Dependencies needed by DOM content syncing without owning the renderer. */\ntype DomContentSyncOptions = {\n  targetCanvas: HTMLCanvasElement\n  getCurrentDpr: () => number\n}\n\n/** Returns whether a paint event changed any managed HTML host or descendant. */\nfunction changedElementsIncludeHost(changedElements: readonly Element[], hosts: Set<HTMLDivElement>) {\n  for (const element of changedElements) {\n    for (const host of hosts) {\n      if (element === host || host.contains(element)) {\n        return true\n      }\n    }\n  }\n\n  return false\n}\n\n/** Mounts and updates a managed HTML host's transform and z-index. */\nfunction syncHtmlHost(host: HTMLDivElement, canvas: HTMLCanvasElement, transform: string, zIndex: string) {\n  if (host.parentElement !== canvas) {\n    canvas.append(host)\n  }\n  if (host.style.transform !== transform) {\n    host.style.transform = transform\n  }\n  if (host.style.zIndex !== zIndex) {\n    host.style.zIndex = zIndex\n  }\n}\n\n/** Reorders managed HTML hosts to match the renderer's visual ordering. */\nfunction syncHtmlHostDomOrder(canvas: HTMLCanvasElement, hostOrder: Map<Html, number>) {\n  // Chrome's experimental layoutsubtree hit testing can follow canvas child order\n  // even when the hosts have matching CSS z-index values, so keep DOM order in\n  // sync with the renderer's visual order. The comparison avoids re-appending\n  // every frame, which would continuously invalidate the canvas paint cache.\n  const desiredHosts = [...hostOrder.entries()]\n    .sort((left, right) => left[1] - right[1])\n    .map(([html]) => html.host)\n    .filter((host) => host.parentElement === canvas)\n  const managedHosts = new Set(desiredHosts)\n  const currentHosts = Array.from(canvas.children).filter((child) => managedHosts.has(child as HTMLDivElement))\n\n  if (\n    currentHosts.length === desiredHosts.length &&\n    currentHosts.every((host, index) => host === desiredHosts[index])\n  ) {\n    return\n  }\n\n  for (const host of desiredHosts) {\n    canvas.append(host)\n  }\n}\n\n/** Converts copied device pixels into the copied extent in local CSS pixels. */\nexport function getCopiedCssSize(copiedDeviceSize: number, deviceSize: number, cssSize: number) {\n  if (copiedDeviceSize <= 0 || deviceSize <= 0 || cssSize <= 0) {\n    return 0\n  }\n  return (copiedDeviceSize / deviceSize) * cssSize\n}\n\n/** Converts a local CSS coordinate to a texture UV scale factor. */\nexport function getTextureUvScale(deviceSize: number, cssSize: number, textureSize: number) {\n  if (deviceSize <= 0 || cssSize <= 0 || textureSize <= 0) {\n    return 0\n  }\n  return deviceSize / cssSize / textureSize\n}\n\n/** Synchronizes DOM-backed HTML hosts, textures, atlases, and content buffers. */\nexport class DomContentSync {\n  /** Hosts for scene-attached HTML nodes currently managed by the renderer. */\n  readonly sceneHtmlHosts = new Set<HTMLDivElement>()\n  /** Hosts for glass-attached HTML nodes currently managed by the renderer. */\n  readonly glassContentHosts = new Set<HTMLDivElement>()\n\n  private device: GPUDevice | null = null\n  private presentationFormat: GPUTextureFormat | null = null\n  private readonly sceneHtmlEntries = new Map<Html, SceneHtmlEntry>()\n  private readonly glassContentEntries = new Map<Html, GlassContentEntry>()\n  private readonly glassContentRanges = new Map<Glass, GlassContentRange>()\n  private glassContentOrder: GlassContentEntry[] = []\n  private needsSceneHtmlCopy = false\n  private needsSceneHtmlFilter = false\n  private needsContentCopy = false\n  private needsContentFilter = false\n  private contentEntriesBuffer: ContentDataBuffer | null = null\n  private glassContentAtlas: GPUTexture | null = null\n  private glassContentAtlasWidth = 0\n  private glassContentAtlasHeight = 0\n  private sampler: GPUSampler | null = null\n  private htmlBlurResources: AdaptiveBlurResources | null = null\n\n  /** Creates a DOM content sync helper for one renderer canvas. */\n  constructor(private readonly options: DomContentSyncOptions) {}\n\n  /** Current atlas texture for glass-attached HTML content, if any exists. */\n  get atlasTexture() {\n    return this.glassContentAtlas\n  }\n\n  /** Binding resource for content entries, or null before GPU allocation. */\n  get contentEntriesBindingResource() {\n    return this.contentEntriesBuffer?.buffer ? this.contentEntriesBuffer.bindingResource : null\n  }\n\n  /** Attaches GPU resources and creates the fallback content-entry buffer. */\n  setDevice(device: GPUDevice, presentationFormat: GPUTextureFormat) {\n    this.device = device\n    this.presentationFormat = presentationFormat\n    this.sampler = device.createSampler({\n      magFilter: 'linear',\n      minFilter: 'linear',\n      addressModeU: 'clamp-to-edge',\n      addressModeV: 'clamp-to-edge',\n    })\n    destroyAdaptiveBlurResources(this.htmlBlurResources)\n    this.htmlBlurResources = createAdaptiveBlurResources(device, presentationFormat)\n    this.contentEntriesBuffer?.destroy()\n    this.contentEntriesBuffer = new GpuStructArrayBuffer(\n      device,\n      ContentDataLayout,\n      GPU_BUFFER_USAGE.STORAGE | GPU_BUFFER_USAGE.COPY_DST,\n    )\n    this.contentEntriesBuffer.ensureCapacity(0)\n  }\n\n  /** Removes DOM hosts and destroys all GPU resources owned by this helper. */\n  destroy() {\n    for (const entry of this.sceneHtmlEntries.values()) {\n      entry.texture?.destroy()\n      destroyAdaptiveBlurTargetChain(entry.blurTargetChain)\n      entry.html.host.remove()\n    }\n    this.sceneHtmlEntries.clear()\n    this.sceneHtmlHosts.clear()\n\n    for (const entry of this.glassContentEntries.values()) {\n      entry.sourceTexture?.destroy()\n      destroyAdaptiveBlurTargetChain(entry.blurTargetChain)\n      entry.html.host.remove()\n    }\n    this.glassContentEntries.clear()\n    this.glassContentRanges.clear()\n    this.glassContentOrder = []\n    this.glassContentHosts.clear()\n    this.glassContentAtlas?.destroy()\n    this.glassContentAtlas = null\n    this.glassContentAtlasWidth = 0\n    this.glassContentAtlasHeight = 0\n    this.contentEntriesBuffer?.destroy()\n    this.contentEntriesBuffer = null\n    destroyAdaptiveBlurResources(this.htmlBlurResources)\n    this.htmlBlurResources = null\n    this.sampler = null\n  }\n\n  /** Handles canvas paint events by copying changed DOM hosts into textures. */\n  handlePaintEvent(event: Event) {\n    if (!this.device) {\n      return\n    }\n\n    const changedElements = (event as CanvasPaintEvent).changedElements\n    const hasChangedElements = Array.isArray(changedElements)\n    const shouldCopySceneHtml =\n      this.needsSceneHtmlCopy ||\n      !hasChangedElements ||\n      changedElementsIncludeHost(changedElements, this.sceneHtmlHosts)\n    const shouldCopyContent =\n      this.needsContentCopy ||\n      !hasChangedElements ||\n      changedElementsIncludeHost(changedElements, this.glassContentHosts)\n\n    if (shouldCopySceneHtml) {\n      this.copySceneHtmlTextures()\n    }\n\n    if (this.needsSceneHtmlFilter) {\n      this.filterSceneHtmlTextures()\n    }\n\n    if (shouldCopyContent) {\n      this.copyGlassContentAtlas()\n    }\n\n    if (this.needsContentFilter) {\n      this.filterGlassContentAtlas()\n    }\n  }\n\n  /** Attempts any pending DOM-to-texture copies immediately. */\n  copyPending() {\n    if (this.needsSceneHtmlCopy) {\n      this.copySceneHtmlTextures()\n    }\n\n    if (this.needsSceneHtmlFilter) {\n      this.filterSceneHtmlTextures()\n    }\n\n    if (this.needsContentCopy) {\n      this.copyGlassContentAtlas()\n    }\n\n    if (this.needsContentFilter) {\n      this.filterGlassContentAtlas()\n    }\n  }\n\n  /** Synchronizes managed HTML hosts and GPU content state with the scene. */\n  sync(\n    layers: TraversedSceneLayer[],\n    containers: FlattenedContainer[],\n    hostOrder: Map<Html, number>,\n  ) {\n    this.syncSceneHtml(layers, hostOrder)\n    this.syncGlassContent(containers, hostOrder)\n    syncHtmlHostDomOrder(this.options.targetCanvas, hostOrder)\n  }\n\n  /** Returns GPU state for a scene-attached HTML node. */\n  getSceneHtmlEntry(html: Html) {\n    return this.sceneHtmlEntries.get(html) ?? null\n  }\n\n  /** Returns the storage-buffer range for a glass node's attached HTML. */\n  getGlassContentRange(glass: Glass) {\n    return this.glassContentRanges.get(glass) ?? null\n  }\n\n  /** Removes one scene-attached HTML entry and optionally keeps its host mounted. */\n  private removeSceneHtmlEntry(html: Html, keepHostMounted: boolean) {\n    const entry = this.sceneHtmlEntries.get(html)\n    if (!entry) {\n      return\n    }\n\n    entry.texture?.destroy()\n    destroyAdaptiveBlurTargetChain(entry.blurTargetChain)\n    this.sceneHtmlHosts.delete(html.host)\n    this.sceneHtmlEntries.delete(html)\n    if (!keepHostMounted) {\n      html.host.remove()\n    }\n  }\n\n  /** Removes one glass-attached HTML entry and optionally keeps its host mounted. */\n  private removeGlassContentEntry(html: Html, keepHostMounted: boolean) {\n    const entry = this.glassContentEntries.get(html)\n    if (!entry) {\n      return\n    }\n\n    entry.sourceTexture?.destroy()\n    destroyAdaptiveBlurTargetChain(entry.blurTargetChain)\n    this.glassContentHosts.delete(html.host)\n    this.glassContentEntries.delete(html)\n    if (!keepHostMounted) {\n      html.host.remove()\n    }\n  }\n\n  /** Synchronizes textures and transforms for scene-attached HTML layers. */\n  private syncSceneHtml(layers: TraversedSceneLayer[], hostOrder: Map<Html, number>) {\n    const activeHtml = new Set<Html>()\n    let layoutChanged = false\n    let contentChanged = false\n    const currentDpr = this.options.getCurrentDpr()\n\n    for (const layer of layers) {\n      if (!(layer.child instanceof Html) || layer.child.width <= 0 || layer.child.height <= 0) {\n        continue\n      }\n\n      const html = layer.child\n      activeHtml.add(html)\n\n      let entry = this.sceneHtmlEntries.get(html)\n      if (!entry) {\n        entry = {\n          html,\n          texture: null,\n          filteredTexture: null,\n          elementVersion: -1,\n          blur: -1,\n          width: -1,\n          height: -1,\n          deviceWidth: 0,\n          deviceHeight: 0,\n          copiedDeviceWidth: 0,\n          copiedDeviceHeight: 0,\n          textureWidth: 0,\n          textureHeight: 0,\n          blurTargetChain: null,\n          transform: layer.transform,\n          inverseTransform: null,\n        }\n        this.sceneHtmlEntries.set(html, entry)\n        layoutChanged = true\n        contentChanged = true\n      }\n\n      entry.transform = layer.transform\n      entry.inverseTransform = invertMatrix(scaleOutputMatrix(layer.transform, currentDpr))\n\n      if (entry.elementVersion !== html._elementVersion) {\n        entry.elementVersion = html._elementVersion\n        contentChanged = true\n      }\n\n      if (entry.blur !== html.blur) {\n        entry.blur = html.blur\n        this.needsSceneHtmlFilter = true\n      }\n\n      const previousDeviceWidth = entry.deviceWidth\n      const previousDeviceHeight = entry.deviceHeight\n      const nextDeviceWidth = Math.max(1, Math.round(html.width * currentDpr))\n      const nextDeviceHeight = Math.max(1, Math.round(html.height * currentDpr))\n      let nextTextureWidth = entry.textureWidth\n      let nextTextureHeight = entry.textureHeight\n      let textureSizeChanged = false\n\n      if (this.device) {\n        nextTextureWidth = getTextureBucketSize(nextDeviceWidth, this.device.limits.maxTextureDimension2D)\n        nextTextureHeight = getTextureBucketSize(nextDeviceHeight, this.device.limits.maxTextureDimension2D)\n        textureSizeChanged =\n          entry.textureWidth !== nextTextureWidth || entry.textureHeight !== nextTextureHeight\n      }\n\n      const contentSizeChanged =\n        entry.deviceWidth !== nextDeviceWidth || entry.deviceHeight !== nextDeviceHeight\n      if (\n        entry.width !== html.width ||\n        entry.height !== html.height ||\n        contentSizeChanged\n      ) {\n        entry.width = html.width\n        entry.height = html.height\n        entry.deviceWidth = nextDeviceWidth\n        entry.deviceHeight = nextDeviceHeight\n        layoutChanged = true\n        contentChanged = true\n      }\n\n      if (this.device && this.presentationFormat) {\n        const rebuildTexture =\n          !entry.texture ||\n          textureSizeChanged\n\n        if (rebuildTexture) {\n          const previousTexture = entry.texture\n          const nextTexture = this.device.createTexture({\n            size: {\n              width: nextTextureWidth,\n              height: nextTextureHeight,\n              depthOrArrayLayers: 1,\n            },\n            format: this.presentationFormat,\n            // Required by Chrome's experimental DOM-to-texture copy path for scene Html layers.\n            usage:\n              GPU_TEXTURE_USAGE.COPY_SRC |\n              GPU_TEXTURE_USAGE.TEXTURE_BINDING |\n              GPU_TEXTURE_USAGE.COPY_DST |\n              GPU_TEXTURE_USAGE.RENDER_ATTACHMENT,\n          })\n\n          if (previousTexture) {\n            const encoder = this.device.createCommandEncoder()\n            const copiedDeviceWidth = Math.min(entry.copiedDeviceWidth, previousDeviceWidth, nextTextureWidth)\n            const copiedDeviceHeight = Math.min(entry.copiedDeviceHeight, previousDeviceHeight, nextTextureHeight)\n            const copied = copyTextureRegion(encoder, previousTexture, nextTexture, {\n              sourceX: 0,\n              sourceY: 0,\n              destinationX: 0,\n              destinationY: 0,\n              width: copiedDeviceWidth,\n              height: copiedDeviceHeight,\n            })\n\n            if (copied) {\n              this.device.queue.submit([encoder.finish()])\n            }\n\n            entry.copiedDeviceWidth = copiedDeviceWidth\n            entry.copiedDeviceHeight = copiedDeviceHeight\n          } else {\n            entry.copiedDeviceWidth = 0\n            entry.copiedDeviceHeight = 0\n          }\n\n          previousTexture?.destroy()\n          destroyAdaptiveBlurTargetChain(entry.blurTargetChain)\n          entry.texture = nextTexture\n          entry.filteredTexture = null\n          entry.blurTargetChain = null\n          entry.textureWidth = nextTextureWidth\n          entry.textureHeight = nextTextureHeight\n          layoutChanged = true\n          contentChanged = true\n        }\n      }\n\n      if (entry.texture) {\n        this.sceneHtmlHosts.add(html.host)\n        syncHtmlHost(\n          html.host,\n          this.options.targetCanvas,\n          matrixToCssTransform(layer.transform),\n          String(hostOrder.get(html) ?? 0),\n        )\n      }\n    }\n\n    for (const html of [...this.sceneHtmlEntries.keys()]) {\n      if (!activeHtml.has(html)) {\n        this.removeSceneHtmlEntry(html, hostOrder.has(html))\n        layoutChanged = true\n        contentChanged = true\n      }\n    }\n\n    if (activeHtml.size === 0) {\n      this.needsSceneHtmlCopy = false\n      this.needsSceneHtmlFilter = false\n      return\n    }\n\n    if (layoutChanged || contentChanged) {\n      this.needsSceneHtmlCopy = true\n    }\n  }\n\n  /** Synchronizes glass-attached HTML entries and atlas packing. */\n  private syncGlassContent(containers: FlattenedContainer[], hostOrder: Map<Html, number>) {\n    const activeContentHtml = new Set<Html>()\n    const activeEntries: GlassContentEntry[] = []\n    const nextRanges = new Map<Glass, GlassContentRange>()\n    const previousAtlasTexture = this.glassContentAtlas\n    const previousAtlasEntries = new Map<Html, PreviousGlassContentAtlasEntry>()\n    const currentDpr = this.options.getCurrentDpr()\n    let layoutChanged = false\n    let contentChanged = false\n\n    if (previousAtlasTexture) {\n      for (const entry of this.glassContentEntries.values()) {\n        previousAtlasEntries.set(entry.html, {\n          copiedDeviceWidth: entry.copiedDeviceWidth,\n          copiedDeviceHeight: entry.copiedDeviceHeight,\n          atlasX: entry.atlasX,\n          atlasY: entry.atlasY,\n        })\n      }\n    }\n\n    for (const containerEntry of containers) {\n      const containerTransform = containerEntry.transform\n\n      for (const glassLayer of getSortedGlassLayers(containerEntry.container)) {\n        const glass = glassLayer.glass\n        if (glass.width <= 0 || glass.height <= 0) {\n          continue\n        }\n\n        const glassTransform = multiplyMatrices(containerTransform, glassLayer.transform)\n        const contentStart = activeEntries.length\n\n        for (const htmlLayer of getSortedGlassHtmlLayers(glass)) {\n          const html = htmlLayer.html\n          if (html.width <= 0 || html.height <= 0) {\n            continue\n          }\n\n          const inverseTransform = invertMatrix(htmlLayer.transform)\n          this.glassContentHosts.add(html.host)\n          syncHtmlHost(\n            html.host,\n            this.options.targetCanvas,\n            matrixToCssTransform(multiplyMatrices(glassTransform, htmlLayer.transform)),\n            String(hostOrder.get(html) ?? 0),\n          )\n\n          if (!inverseTransform) {\n            continue\n          }\n          activeContentHtml.add(html)\n\n          let contentEntry = this.glassContentEntries.get(html)\n          if (!contentEntry) {\n            contentEntry = {\n              html,\n              glass,\n              elementVersion: -1,\n              blur: -1,\n              width: -1,\n              height: -1,\n              deviceWidth: 0,\n              deviceHeight: 0,\n              copiedDeviceWidth: 0,\n              copiedDeviceHeight: 0,\n              sourceTexture: null,\n              sourceTextureWidth: 0,\n              sourceTextureHeight: 0,\n              filteredTexture: null,\n              blurTargetChain: null,\n              atlasX: 0,\n              atlasY: 0,\n              inverseTransform,\n            }\n            this.glassContentEntries.set(html, contentEntry)\n            layoutChanged = true\n            contentChanged = true\n          }\n\n          if (contentEntry.glass !== glass) {\n            contentEntry.glass = glass\n            layoutChanged = true\n          }\n\n          contentEntry.inverseTransform = inverseTransform\n\n          if (contentEntry.elementVersion !== html._elementVersion) {\n            contentEntry.elementVersion = html._elementVersion\n            contentChanged = true\n          }\n\n          const nextDeviceWidth = Math.max(1, Math.round(html.width * currentDpr))\n          const nextDeviceHeight = Math.max(1, Math.round(html.height * currentDpr))\n          let nextSourceTextureWidth = contentEntry.sourceTextureWidth\n          let nextSourceTextureHeight = contentEntry.sourceTextureHeight\n          let sourceTextureSizeChanged = false\n\n          if (this.device) {\n            nextSourceTextureWidth = getTextureBucketSize(nextDeviceWidth, this.device.limits.maxTextureDimension2D)\n            nextSourceTextureHeight = getTextureBucketSize(nextDeviceHeight, this.device.limits.maxTextureDimension2D)\n            sourceTextureSizeChanged =\n              contentEntry.sourceTextureWidth !== nextSourceTextureWidth ||\n              contentEntry.sourceTextureHeight !== nextSourceTextureHeight\n          }\n\n          if (\n            contentEntry.width !== html.width ||\n            contentEntry.height !== html.height ||\n            contentEntry.deviceWidth !== nextDeviceWidth ||\n            contentEntry.deviceHeight !== nextDeviceHeight\n          ) {\n            contentEntry.width = html.width\n            contentEntry.height = html.height\n            contentEntry.deviceWidth = nextDeviceWidth\n            contentEntry.deviceHeight = nextDeviceHeight\n            layoutChanged = true\n            contentChanged = true\n          }\n\n          if (contentEntry.blur !== html.blur) {\n            contentEntry.blur = html.blur\n            this.needsContentFilter = true\n          }\n\n          if (this.device && this.presentationFormat) {\n            const rebuildSourceTexture =\n              !contentEntry.sourceTexture ||\n              sourceTextureSizeChanged\n\n            if (rebuildSourceTexture) {\n              contentEntry.sourceTexture?.destroy()\n              destroyAdaptiveBlurTargetChain(contentEntry.blurTargetChain)\n              contentEntry.sourceTexture = createRenderTarget(\n                this.device,\n                this.presentationFormat,\n                nextSourceTextureWidth,\n                nextSourceTextureHeight,\n              )\n              contentEntry.sourceTextureWidth = nextSourceTextureWidth\n              contentEntry.sourceTextureHeight = nextSourceTextureHeight\n              contentEntry.filteredTexture = null\n              contentEntry.blurTargetChain = null\n              contentEntry.copiedDeviceWidth = 0\n              contentEntry.copiedDeviceHeight = 0\n              contentChanged = true\n            }\n          }\n\n          activeEntries.push(contentEntry)\n        }\n\n        const contentCount = activeEntries.length - contentStart\n        if (contentCount > 0) {\n          nextRanges.set(glass, {\n            start: contentStart,\n            count: contentCount,\n          })\n        }\n      }\n    }\n\n    for (const html of [...this.glassContentEntries.keys()]) {\n      if (!activeContentHtml.has(html)) {\n        this.removeGlassContentEntry(html, hostOrder.has(html))\n        layoutChanged = true\n        contentChanged = true\n      }\n    }\n\n    this.glassContentOrder = activeEntries\n    this.glassContentRanges.clear()\n    for (const [glass, range] of nextRanges) {\n      this.glassContentRanges.set(glass, range)\n    }\n\n    if (!this.device) {\n      this.needsContentCopy = false\n      return\n    }\n\n    if (activeEntries.length === 0) {\n      this.glassContentAtlas?.destroy()\n      this.glassContentAtlas = null\n      this.glassContentAtlasWidth = 0\n      this.glassContentAtlasHeight = 0\n      this.needsContentCopy = false\n      this.needsContentFilter = false\n      return\n    }\n\n    if (layoutChanged || !this.glassContentAtlas) {\n      const layout = packContentAtlas(activeEntries, this.device.limits.maxTextureDimension2D)\n      const nextAtlasWidth = layout.width\n      const nextAtlasHeight = layout.height\n      const previousAtlasWidth = this.glassContentAtlasWidth\n      const previousAtlasHeight = this.glassContentAtlasHeight\n      const atlasLayoutChanged =\n        !this.glassContentAtlas ||\n        nextAtlasWidth !== this.glassContentAtlasWidth ||\n        nextAtlasHeight !== this.glassContentAtlasHeight ||\n        activeEntries.some((entry) => {\n          const rect = layout.rects.get(entry.html)!\n          return entry.atlasX !== rect.x || entry.atlasY !== rect.y\n        })\n\n      if (atlasLayoutChanged) {\n        const nextAtlas = this.device.createTexture({\n          size: {\n            width: nextAtlasWidth,\n            height: nextAtlasHeight,\n            depthOrArrayLayers: 1,\n          },\n          format: this.presentationFormat ?? 'bgra8unorm',\n          usage:\n            GPU_TEXTURE_USAGE.COPY_SRC |\n            GPU_TEXTURE_USAGE.TEXTURE_BINDING |\n            GPU_TEXTURE_USAGE.COPY_DST |\n            GPU_TEXTURE_USAGE.RENDER_ATTACHMENT,\n        })\n\n        if (previousAtlasTexture) {\n          const encoder = this.device.createCommandEncoder()\n          let copiedAny = false\n\n          for (const entry of activeEntries) {\n            const previousEntry = previousAtlasEntries.get(entry.html)\n            const rect = layout.rects.get(entry.html)!\n            if (!previousEntry) {\n              entry.copiedDeviceWidth = 0\n              entry.copiedDeviceHeight = 0\n              continue\n            }\n\n            const sourceX = previousEntry.atlasX + CONTENT_ATLAS_PADDING\n            const sourceY = previousEntry.atlasY + CONTENT_ATLAS_PADDING\n            const destinationX = rect.x + CONTENT_ATLAS_PADDING\n            const destinationY = rect.y + CONTENT_ATLAS_PADDING\n            const copiedDeviceWidth = Math.min(\n              previousEntry.copiedDeviceWidth,\n              previousAtlasWidth - sourceX,\n              nextAtlasWidth - destinationX,\n            )\n            const copiedDeviceHeight = Math.min(\n              previousEntry.copiedDeviceHeight,\n              previousAtlasHeight - sourceY,\n              nextAtlasHeight - destinationY,\n            )\n\n            copiedAny =\n              copyTextureRegion(encoder, previousAtlasTexture, nextAtlas, {\n                sourceX,\n                sourceY,\n                destinationX,\n                destinationY,\n                width: copiedDeviceWidth,\n                height: copiedDeviceHeight,\n              }) || copiedAny\n\n            entry.copiedDeviceWidth = Math.max(0, copiedDeviceWidth)\n            entry.copiedDeviceHeight = Math.max(0, copiedDeviceHeight)\n          }\n\n          if (copiedAny) {\n            this.device.queue.submit([encoder.finish()])\n          }\n        } else {\n          for (const entry of activeEntries) {\n            entry.copiedDeviceWidth = 0\n            entry.copiedDeviceHeight = 0\n          }\n        }\n\n        previousAtlasTexture?.destroy()\n        this.glassContentAtlas = nextAtlas\n        this.glassContentAtlasWidth = nextAtlasWidth\n        this.glassContentAtlasHeight = nextAtlasHeight\n      }\n\n      for (const entry of activeEntries) {\n        const rect = layout.rects.get(entry.html)!\n\n        entry.atlasX = rect.x\n        entry.atlasY = rect.y\n      }\n\n      this.needsContentCopy = true\n      this.needsContentFilter = true\n    } else if (contentChanged) {\n      this.needsContentCopy = true\n    }\n\n    this.writeContentEntries(activeEntries)\n  }\n\n  /** Writes glass content metadata into the storage buffer. */\n  private writeContentEntries(entries: GlassContentEntry[]) {\n    if (!this.contentEntriesBuffer) {\n      return\n    }\n\n    this.contentEntriesBuffer.ensureCapacity(entries.length)\n    for (let index = 0; index < entries.length; index += 1) {\n      const entry = entries[index]\n      const inverse = entry.inverseTransform\n\n      this.contentEntriesBuffer.writeAt(index, {\n        inverse0: {\n          a: inverse.a,\n          c: inverse.c,\n          e: inverse.e,\n          copiedWidth: getCopiedCssSize(entry.copiedDeviceWidth, entry.deviceWidth, entry.width),\n        },\n        inverse1: {\n          b: inverse.b,\n          d: inverse.d,\n          f: inverse.f,\n          copiedHeight: getCopiedCssSize(entry.copiedDeviceHeight, entry.deviceHeight, entry.height),\n        },\n        atlasRect: {\n          u: (entry.atlasX + CONTENT_ATLAS_PADDING) / this.glassContentAtlasWidth,\n          v: (entry.atlasY + CONTENT_ATLAS_PADDING) / this.glassContentAtlasHeight,\n          uScale: getTextureUvScale(entry.deviceWidth, entry.width, this.glassContentAtlasWidth),\n          vScale: getTextureUvScale(entry.deviceHeight, entry.height, this.glassContentAtlasHeight),\n        },\n        opacity: {\n          value: entry.html.opacity,\n        },\n      })\n    }\n\n    this.contentEntriesBuffer.upload(entries.length)\n  }\n\n  /** Copies scene-attached HTML hosts into their individual textures. */\n  private copySceneHtmlTextures() {\n    if (!this.device || this.sceneHtmlEntries.size === 0) {\n      this.needsSceneHtmlCopy = false\n      return true\n    }\n\n    let copiedAll = true\n    let copiedAny = false\n    for (const entry of this.sceneHtmlEntries.values()) {\n      if (!entry.texture) {\n        copiedAll = false\n        continue\n      }\n\n      try {\n        ;(this.device.queue as GPUQueueWithElementCopy).copyElementImageToTexture(\n          entry.html.host,\n          entry.deviceWidth,\n          entry.deviceHeight,\n          { texture: entry.texture },\n        )\n        entry.copiedDeviceWidth = entry.deviceWidth\n        entry.copiedDeviceHeight = entry.deviceHeight\n        copiedAny = true\n      } catch (error) {\n        copiedAll = false\n        if (!(error instanceof DOMException && error.name === 'InvalidStateError')) {\n          console.error(error)\n        }\n      }\n    }\n\n    if (copiedAny) {\n      this.needsSceneHtmlFilter = true\n    }\n\n    this.needsSceneHtmlCopy = !copiedAll\n    return copiedAll\n  }\n\n  /** Applies GPU blur to scene-attached HTML textures when requested. */\n  private filterSceneHtmlTextures() {\n    if (!this.device || !this.sampler || !this.htmlBlurResources) {\n      this.needsSceneHtmlFilter = false\n      return true\n    }\n\n    const encoder = this.device.createCommandEncoder()\n    let filteredAny = false\n\n    for (const entry of this.sceneHtmlEntries.values()) {\n      entry.filteredTexture = null\n\n      if (!entry.texture || entry.copiedDeviceWidth <= 0 || entry.copiedDeviceHeight <= 0) {\n        continue\n      }\n\n      const blurRadiusPx = entry.html.blur * this.options.getCurrentDpr()\n      if (blurRadiusPx <= 0) {\n        continue\n      }\n\n      if (\n        !entry.blurTargetChain ||\n        entry.blurTargetChain.levels[0]?.width !== entry.textureWidth ||\n        entry.blurTargetChain.levels[0]?.height !== entry.textureHeight\n      ) {\n        destroyAdaptiveBlurTargetChain(entry.blurTargetChain)\n        entry.blurTargetChain = createAdaptiveBlurTargetChain(\n          this.device,\n          this.presentationFormat ?? 'bgra8unorm',\n          entry.textureWidth,\n          entry.textureHeight,\n        )\n      }\n\n      entry.filteredTexture = renderAdaptiveBlur({\n        device: this.device,\n        sampler: this.sampler,\n        encoder,\n        source: entry.texture,\n        radiusPx: blurRadiusPx,\n        chain: entry.blurTargetChain,\n        resources: this.htmlBlurResources,\n      })\n      filteredAny = true\n    }\n\n    if (filteredAny) {\n      this.device.queue.submit([encoder.finish()])\n    }\n\n    this.needsSceneHtmlFilter = false\n    return true\n  }\n\n  /** Copies glass-attached HTML hosts into per-node source textures. */\n  private copyGlassContentAtlas() {\n    if (!this.device || this.glassContentOrder.length === 0) {\n      this.needsContentCopy = false\n      return true\n    }\n\n    let copiedAll = true\n    let copiedAny = false\n    for (const entry of this.glassContentOrder) {\n      if (!entry.sourceTexture) {\n        copiedAll = false\n        continue\n      }\n\n      try {\n        ;(this.device.queue as GPUQueueWithElementCopy).copyElementImageToTexture(\n          entry.html.host,\n          entry.deviceWidth,\n          entry.deviceHeight,\n          { texture: entry.sourceTexture },\n        )\n        entry.copiedDeviceWidth = entry.deviceWidth\n        entry.copiedDeviceHeight = entry.deviceHeight\n        copiedAny = true\n      } catch (error) {\n        copiedAll = false\n        if (!(error instanceof DOMException && error.name === 'InvalidStateError')) {\n          console.error(error)\n        }\n      }\n    }\n\n    if (copiedAny) {\n      this.needsContentFilter = true\n    }\n\n    this.needsContentCopy = !copiedAll\n    return copiedAll\n  }\n\n  /** Applies GPU blur to glass-attached HTML sources and writes the result into the content atlas. */\n  private filterGlassContentAtlas() {\n    if (\n      !this.device ||\n      !this.sampler ||\n      !this.htmlBlurResources ||\n      !this.glassContentAtlas ||\n      this.glassContentOrder.length === 0\n    ) {\n      this.needsContentFilter = false\n      return true\n    }\n\n    const encoder = this.device.createCommandEncoder()\n    let copiedAny = false\n\n    for (const entry of this.glassContentOrder) {\n      if (!entry.sourceTexture || entry.copiedDeviceWidth <= 0 || entry.copiedDeviceHeight <= 0) {\n        continue\n      }\n\n      let sourceTexture = entry.sourceTexture\n      const blurRadiusPx = entry.html.blur * this.options.getCurrentDpr()\n      entry.filteredTexture = null\n\n      if (blurRadiusPx > 0) {\n        if (\n          !entry.blurTargetChain ||\n          entry.blurTargetChain.levels[0]?.width !== entry.sourceTextureWidth ||\n          entry.blurTargetChain.levels[0]?.height !== entry.sourceTextureHeight\n        ) {\n          destroyAdaptiveBlurTargetChain(entry.blurTargetChain)\n          entry.blurTargetChain = createAdaptiveBlurTargetChain(\n            this.device,\n            this.presentationFormat ?? 'bgra8unorm',\n            entry.sourceTextureWidth,\n            entry.sourceTextureHeight,\n          )\n        }\n\n        entry.filteredTexture = renderAdaptiveBlur({\n          device: this.device,\n          sampler: this.sampler,\n          encoder,\n          source: entry.sourceTexture,\n          radiusPx: blurRadiusPx,\n          chain: entry.blurTargetChain,\n          resources: this.htmlBlurResources,\n        })\n        sourceTexture = entry.filteredTexture\n      }\n\n      copiedAny = copyTextureRegion(encoder, sourceTexture, this.glassContentAtlas, {\n        sourceX: 0,\n        sourceY: 0,\n        destinationX: entry.atlasX + CONTENT_ATLAS_PADDING,\n        destinationY: entry.atlasY + CONTENT_ATLAS_PADDING,\n        width: entry.copiedDeviceWidth,\n        height: entry.copiedDeviceHeight,\n      }) || copiedAny\n    }\n\n    if (copiedAny) {\n      this.writeContentEntries(this.glassContentOrder)\n      this.device.queue.submit([encoder.finish()])\n    }\n\n    this.needsContentFilter = false\n    return true\n  }\n}\n","import { GlassPointerEvent, type GlassPointerEventInit, type GlassPointerEventType } from '../events'\nimport type { Glass } from '../scene'\nimport {\n  createGlassInteractionEntries,\n  hitTestGlassInteractionEntries,\n  measureGlassInteractionEntry,\n  type GlassInteractionEntry,\n  type PointerSnapshot,\n  type PointerState,\n} from './interaction'\n\n/** Dependencies needed by the pointer controller without owning the renderer. */\ntype PointerControllerOptions = {\n  targetCanvas: HTMLCanvasElement\n  renderer: GlassPointerEventInit['renderer']\n  isDestroyed: () => boolean\n  flushSceneContentSync: () => void\n  getSceneHtmlHosts: () => Set<HTMLDivElement>\n  getGlassContentHosts: () => Set<HTMLDivElement>\n}\n\n/** Returns whether an event's composed path contains one of the HTML hosts. */\nfunction eventTargetsHost(event: Event, hosts: Set<HTMLDivElement>) {\n  const path = event.composedPath()\n\n  for (const host of hosts) {\n    if (path.includes(host)) {\n      return true\n    }\n  }\n\n  return false\n}\n\n/** Owns glass pointer hit testing, hover state, capture state, and dispatch. */\nexport class PointerController {\n  private glassInteractionEntries = new Map<Glass, GlassInteractionEntry>()\n  private glassInteractionOrder: GlassInteractionEntry[] = []\n  private readonly pointerStates = new Map<number, PointerState>()\n\n  /** Native pointermove listener wired to the renderer canvas. */\n  readonly handlePointerMove = (event: PointerEvent) => {\n    this.handleNativePointerEvent('pointermove', event)\n  }\n\n  /** Native pointerdown listener wired to the renderer canvas. */\n  readonly handlePointerDown = (event: PointerEvent) => {\n    this.handleNativePointerEvent('pointerdown', event)\n  }\n\n  /** Native pointerup listener wired to the renderer canvas. */\n  readonly handlePointerUp = (event: PointerEvent) => {\n    this.handleNativePointerEvent('pointerup', event)\n  }\n\n  /** Native pointercancel listener wired to the renderer canvas. */\n  readonly handlePointerCancel = (event: PointerEvent) => {\n    this.handleNativePointerEvent('pointercancel', event)\n  }\n\n  /** Native pointerleave listener wired to the renderer canvas. */\n  readonly handlePointerLeave = (event: PointerEvent) => {\n    if (!this.isTargetCanvasLeave(event)) {\n      return\n    }\n\n    this.handleNativePointerEvent('pointerleave', event)\n  }\n\n  /** Creates a pointer controller for one renderer canvas. */\n  constructor(private readonly options: PointerControllerOptions) {}\n\n  /** Rebuilds hit-test entries after scene or layout changes. */\n  syncInteractions(containers: Parameters<typeof createGlassInteractionEntries>[0]) {\n    const previousEntries = this.glassInteractionEntries\n    const { entriesByGlass, orderedEntries } = createGlassInteractionEntries(containers)\n    this.glassInteractionEntries = entriesByGlass\n    this.glassInteractionOrder = orderedEntries\n    this.handleRemovedInteractionTargets(previousEntries)\n  }\n\n  /** Clears cached hit-test entries and pointer state. */\n  clear() {\n    this.glassInteractionEntries.clear()\n    this.glassInteractionOrder = []\n    this.pointerStates.clear()\n  }\n\n  /** Returns existing pointer state or initializes one for a native pointer id. */\n  private getPointerState(pointerId: number) {\n    let state = this.pointerStates.get(pointerId)\n    if (state) {\n      return state\n    }\n\n    state = {\n      hoveredGlass: null,\n      capturedGlass: null,\n      capturedWithNativePointerCapture: false,\n      pressedGlass: null,\n      lastSnapshot: null,\n    }\n    this.pointerStates.set(pointerId, state)\n    return state\n  }\n\n  /** Captures canvas-relative pointer coordinates for event dispatch. */\n  private createPointerSnapshot(event: PointerEvent): PointerSnapshot {\n    const bounds = this.options.targetCanvas.getBoundingClientRect()\n    return {\n      nativeEvent: event,\n      canvasX: event.clientX - bounds.left,\n      canvasY: event.clientY - bounds.top,\n    }\n  }\n\n  /** Returns whether a native pointerleave means the pointer left the renderer canvas itself. */\n  private isTargetCanvasLeave(event: PointerEvent) {\n    if (event.target !== this.options.targetCanvas) {\n      return false\n    }\n\n    const relatedTarget = event.relatedTarget\n    return !(relatedTarget instanceof Node && this.options.targetCanvas.contains(relatedTarget))\n  }\n\n  /** Dispatches a synthetic glass pointer event and mirrors preventDefault. */\n  private dispatchGlassPointerEvent(\n    type: GlassPointerEventType,\n    glass: Glass,\n    entry: GlassInteractionEntry | null,\n    snapshot: PointerSnapshot,\n    inside: boolean,\n  ) {\n    const localPoint = entry\n      ? measureGlassInteractionEntry(entry, snapshot.canvasX, snapshot.canvasY)\n      : { localX: 0, localY: 0 }\n    const event = new GlassPointerEvent(type, {\n      glass,\n      renderer: this.options.renderer,\n      nativeEvent: snapshot.nativeEvent,\n      canvasX: snapshot.canvasX,\n      canvasY: snapshot.canvasY,\n      localX: localPoint.localX,\n      localY: localPoint.localY,\n      inside,\n    })\n\n    glass.dispatchEvent(event)\n    if (event.defaultPrevented) {\n      snapshot.nativeEvent.preventDefault()\n    }\n  }\n\n  /** Sends enter/leave events when the hovered glass target changes. */\n  private updateHoveredGlass(state: PointerState, nextEntry: GlassInteractionEntry | null, snapshot: PointerSnapshot) {\n    const currentGlass = state.hoveredGlass\n    const nextGlass = nextEntry?.glass ?? null\n    if (currentGlass === nextGlass) {\n      return\n    }\n\n    if (currentGlass) {\n      const currentEntry = this.glassInteractionEntries.get(currentGlass) ?? null\n      this.dispatchGlassPointerEvent('pointerleave', currentGlass, currentEntry, snapshot, false)\n    }\n\n    state.hoveredGlass = nextGlass\n    if (nextEntry) {\n      this.dispatchGlassPointerEvent('pointerenter', nextEntry.glass, nextEntry, snapshot, true)\n    }\n  }\n\n  /** Releases native pointer capture when the canvas currently owns it. */\n  private releaseNativePointerCapture(pointerId: number) {\n    if (!this.options.targetCanvas.hasPointerCapture(pointerId)) {\n      return\n    }\n\n    try {\n      this.options.targetCanvas.releasePointerCapture(pointerId)\n    } catch {\n      // Ignore browsers rejecting a redundant release.\n    }\n  }\n\n  /** Removes idle pointer state after hover, capture, and press state are clear. */\n  private cleanupPointerState(pointerId: number, state: PointerState) {\n    if (state.hoveredGlass || state.capturedGlass || state.pressedGlass) {\n      return\n    }\n\n    this.pointerStates.delete(pointerId)\n  }\n\n  /** Flushes scene sync after handling an event and prunes idle pointer state. */\n  private finishPointerEvent(pointerId: number, state: PointerState) {\n    this.options.flushSceneContentSync()\n    this.cleanupPointerState(pointerId, state)\n  }\n\n  /** Cancels or retargets pointer state when glass nodes leave the scene. */\n  private handleRemovedInteractionTargets(previousEntries: Map<Glass, GlassInteractionEntry>) {\n    for (const [pointerId, state] of this.pointerStates) {\n      const snapshot = state.lastSnapshot\n      const capturedGlass = state.capturedGlass\n      if (capturedGlass && !this.glassInteractionEntries.has(capturedGlass)) {\n        const previousEntry = previousEntries.get(capturedGlass) ?? null\n        if (snapshot) {\n          this.dispatchGlassPointerEvent('pointercancel', capturedGlass, previousEntry, snapshot, false)\n        }\n        state.capturedGlass = null\n        state.capturedWithNativePointerCapture = false\n        state.pressedGlass = null\n        this.releaseNativePointerCapture(pointerId)\n      }\n\n      const hoveredGlass = state.hoveredGlass\n      if (hoveredGlass && !this.glassInteractionEntries.has(hoveredGlass)) {\n        const previousEntry = previousEntries.get(hoveredGlass) ?? null\n        if (snapshot) {\n          this.dispatchGlassPointerEvent('pointerleave', hoveredGlass, previousEntry, snapshot, false)\n        }\n        state.hoveredGlass = null\n      }\n\n      if (!state.capturedGlass && snapshot) {\n        this.updateHoveredGlass(\n          state,\n          hitTestGlassInteractionEntries(this.glassInteractionOrder, snapshot.canvasX, snapshot.canvasY),\n          snapshot,\n        )\n      }\n\n      this.cleanupPointerState(pointerId, state)\n    }\n  }\n\n  /** Handles native pointer events and dispatches the matching glass events. */\n  private handleNativePointerEvent(type: GlassPointerEventType, event: PointerEvent) {\n    if (this.options.isDestroyed()) {\n      return\n    }\n\n    this.options.flushSceneContentSync()\n\n    const state = this.getPointerState(event.pointerId)\n    const snapshot = this.createPointerSnapshot(event)\n    state.lastSnapshot = snapshot\n\n    const capturedEntry = state.capturedGlass\n      ? this.glassInteractionEntries.get(state.capturedGlass) ?? null\n      : null\n\n    if (capturedEntry) {\n      if (type === 'pointerleave') {\n        if (!state.capturedWithNativePointerCapture) {\n          this.dispatchGlassPointerEvent('pointercancel', capturedEntry.glass, capturedEntry, snapshot, false)\n          state.capturedGlass = null\n          state.capturedWithNativePointerCapture = false\n          state.pressedGlass = null\n          this.updateHoveredGlass(state, null, snapshot)\n          this.cleanupPointerState(event.pointerId, state)\n        }\n        return\n      }\n\n      const measurement = measureGlassInteractionEntry(capturedEntry, snapshot.canvasX, snapshot.canvasY)\n      this.dispatchGlassPointerEvent(type, capturedEntry.glass, capturedEntry, snapshot, measurement.inside)\n\n      if (type === 'pointerup' || type === 'pointercancel') {\n        if (\n          type === 'pointerup' &&\n          event.button === 0 &&\n          state.pressedGlass === capturedEntry.glass &&\n          measurement.inside\n        ) {\n          this.dispatchGlassPointerEvent('click', capturedEntry.glass, capturedEntry, snapshot, true)\n        }\n\n        state.capturedGlass = null\n        state.capturedWithNativePointerCapture = false\n        state.pressedGlass = null\n        this.releaseNativePointerCapture(event.pointerId)\n        this.updateHoveredGlass(\n          state,\n          hitTestGlassInteractionEntries(this.glassInteractionOrder, snapshot.canvasX, snapshot.canvasY),\n          snapshot,\n        )\n      }\n\n      this.finishPointerEvent(event.pointerId, state)\n      return\n    }\n\n    if (type === 'pointerleave') {\n      if (state.hoveredGlass) {\n        const hoveredEntry = this.glassInteractionEntries.get(state.hoveredGlass) ?? null\n        this.dispatchGlassPointerEvent('pointerleave', state.hoveredGlass, hoveredEntry, snapshot, false)\n        state.hoveredGlass = null\n      }\n\n      this.finishPointerEvent(event.pointerId, state)\n      return\n    }\n\n    const hitEntry = hitTestGlassInteractionEntries(\n      this.glassInteractionOrder,\n      snapshot.canvasX,\n      snapshot.canvasY,\n    )\n    this.updateHoveredGlass(state, hitEntry, snapshot)\n\n    if (hitEntry) {\n      this.dispatchGlassPointerEvent(type, hitEntry.glass, hitEntry, snapshot, true)\n\n      if (type === 'pointerdown') {\n        state.pressedGlass = hitEntry.glass\n        this.options.flushSceneContentSync()\n\n        if (this.glassInteractionEntries.has(hitEntry.glass)) {\n          state.capturedGlass = hitEntry.glass\n          state.capturedWithNativePointerCapture = false\n\n          if (\n            !eventTargetsHost(event, this.options.getSceneHtmlHosts()) &&\n            !eventTargetsHost(event, this.options.getGlassContentHosts())\n          ) {\n            try {\n              this.options.targetCanvas.setPointerCapture(event.pointerId)\n              state.capturedWithNativePointerCapture = true\n            } catch {\n              state.capturedGlass = null\n              state.pressedGlass = null\n            }\n          }\n        }\n      }\n    }\n\n    this.finishPointerEvent(event.pointerId, state)\n  }\n}\n","import type { BackdropMetrics } from '../types'\n\n/** Width and height, in pixels, of the low-resolution backdrop metrics target. */\nexport const BACKDROP_METRICS_SIZE = 32\n/** Required row stride for copying the metrics texture into a readback buffer. */\nexport const BACKDROP_METRICS_BYTES_PER_ROW = 256\n/** Total byte size of the backdrop metrics readback buffer. */\nexport const BACKDROP_METRICS_BUFFER_SIZE = BACKDROP_METRICS_BYTES_PER_ROW * BACKDROP_METRICS_SIZE\n\n/** Axis-aligned device-pixel bounds used to restrict metrics and blur work. */\nexport type BoundsRect = {\n  minX: number\n  minY: number\n  maxX: number\n  maxY: number\n}\n\n/** Restricts a number to an inclusive range. */\nfunction clamp(value: number, min: number, max: number) {\n  return Math.min(Math.max(value, min), max)\n}\n\n/** Creates an initially empty bounds accumulator. */\nexport function createEmptyBounds(): BoundsRect {\n  return {\n    minX: Number.POSITIVE_INFINITY,\n    minY: Number.POSITIVE_INFINITY,\n    maxX: Number.NEGATIVE_INFINITY,\n    maxY: Number.NEGATIVE_INFINITY,\n  }\n}\n\n/** Expands a bounds accumulator to include one point. */\nexport function expandBounds(bounds: BoundsRect, x: number, y: number) {\n  bounds.minX = Math.min(bounds.minX, x)\n  bounds.minY = Math.min(bounds.minY, y)\n  bounds.maxX = Math.max(bounds.maxX, x)\n  bounds.maxY = Math.max(bounds.maxY, y)\n}\n\n/** Returns whether a bounds accumulator contains a finite non-empty area. */\nexport function hasBounds(bounds: BoundsRect) {\n  return (\n    Number.isFinite(bounds.minX) &&\n    Number.isFinite(bounds.minY) &&\n    Number.isFinite(bounds.maxX) &&\n    Number.isFinite(bounds.maxY) &&\n    bounds.maxX > bounds.minX &&\n    bounds.maxY > bounds.minY\n  )\n}\n\n/** Computes a linearly interpolated percentile from a sorted numeric array. */\nfunction percentile(values: number[], p: number) {\n  if (values.length === 0) {\n    return 0\n  }\n\n  if (values.length === 1) {\n    return values[0]\n  }\n\n  const index = clamp((values.length - 1) * p, 0, values.length - 1)\n  const lower = Math.floor(index)\n  const upper = Math.ceil(index)\n  const blend = index - lower\n  return values[lower] + (values[upper] - values[lower]) * blend\n}\n\n/**\n * Reads the mapped backdrop metrics buffer and summarizes color and luminance\n * over visible pixels.\n */\nexport function parseBackdropMetrics(buffer: GPUBuffer): BackdropMetrics | null {\n  const bytes = new Uint8Array(buffer.getMappedRange())\n  const luminances: number[] = []\n  let red = 0\n  let green = 0\n  let blue = 0\n\n  for (let y = 0; y < BACKDROP_METRICS_SIZE; y += 1) {\n    const rowOffset = y * BACKDROP_METRICS_BYTES_PER_ROW\n\n    for (let x = 0; x < BACKDROP_METRICS_SIZE; x += 1) {\n      const offset = rowOffset + x * 4\n      const alpha = bytes[offset + 3] / 255\n      if (alpha <= 0.5) {\n        continue\n      }\n\n      const linearRed = bytes[offset] / 255\n      const linearGreen = bytes[offset + 1] / 255\n      const linearBlue = bytes[offset + 2] / 255\n      const luminance = linearRed * 0.2126 + linearGreen * 0.7152 + linearBlue * 0.0722\n\n      red += linearRed\n      green += linearGreen\n      blue += linearBlue\n      luminances.push(luminance)\n    }\n  }\n\n  if (luminances.length === 0) {\n    return null\n  }\n\n  luminances.sort((left, right) => left - right)\n\n  const count = luminances.length\n  return {\n    averageLinearColor: {\n      r: red / count,\n      g: green / count,\n      b: blue / count,\n    },\n    averageLuminance: luminances.reduce((sum, value) => sum + value, 0) / count,\n    luminanceP10: percentile(luminances, 0.1),\n    luminanceP50: percentile(luminances, 0.5),\n    luminanceP90: percentile(luminances, 0.9),\n  }\n}\n","import type { Container } from '../scene'\nimport type { BackdropMetrics } from '../types'\nimport { GPU_BUFFER_USAGE } from './gpu-constants'\nimport { BACKDROP_METRICS_BUFFER_SIZE, parseBackdropMetrics } from './metrics'\n\n/** Per-container state for asynchronous backdrop metrics readback. */\nexport type BackdropMetricsState = {\n  container: Container\n  readbackBuffer: GPUBuffer | null\n  metrics: BackdropMetrics | null\n  pendingReadback: boolean\n  inScene: boolean\n  cleanupAfterPending: boolean\n}\n\n/** Tracks cached backdrop metrics resources and readback lifecycle. */\nexport class BackdropMetricsTracker {\n  private device: GPUDevice | null = null\n  private readonly stateByContainer = new WeakMap<Container, BackdropMetricsState>()\n  private readonly trackedContainers = new Set<Container>()\n  private readonly pendingStates = new Set<BackdropMetricsState>()\n\n  /** Creates a tracker that can query renderer teardown state. */\n  constructor(private readonly isDestroyed: () => boolean) {}\n\n  /** Attaches the GPU device and allocates buffers for already tracked containers. */\n  setDevice(device: GPUDevice) {\n    this.device = device\n\n    for (const container of this.trackedContainers) {\n      const state = this.stateByContainer.get(container)\n      if (state) {\n        this.ensureResources(state)\n      }\n    }\n  }\n\n  /** Enables or disables metrics tracking for a container. */\n  setTracking(container: Container, enabled: boolean) {\n    if (enabled) {\n      const state = this.getOrCreateState(container)\n      state.cleanupAfterPending = false\n      this.trackedContainers.add(container)\n      this.ensureResources(state)\n      return\n    }\n\n    this.trackedContainers.delete(container)\n    const state = this.stateByContainer.get(container)\n    if (!state) {\n      return\n    }\n\n    state.metrics = null\n    state.inScene = false\n\n    if (state.pendingReadback) {\n      state.cleanupAfterPending = true\n      return\n    }\n\n    this.cleanupState(state)\n  }\n\n  /** Returns the latest completed metrics for a tracked in-scene container. */\n  getMetrics(container: Container) {\n    if (!this.trackedContainers.has(container)) {\n      return null\n    }\n\n    const state = this.stateByContainer.get(container)\n    if (!state || !state.inScene) {\n      return null\n    }\n\n    return state.metrics\n  }\n\n  /** Returns mutable state for a tracked container, creating it if needed. */\n  getTrackedState(container: Container) {\n    if (!this.trackedContainers.has(container)) {\n      return null\n    }\n\n    return this.getOrCreateState(container)\n  }\n\n  /** Allocates the readback buffer for a metrics state if possible. */\n  ensureResources(state: BackdropMetricsState) {\n    if (!this.device || state.readbackBuffer) {\n      return\n    }\n\n    state.readbackBuffer = this.device.createBuffer({\n      size: BACKDROP_METRICS_BUFFER_SIZE,\n      usage: GPU_BUFFER_USAGE.MAP_READ | GPU_BUFFER_USAGE.COPY_DST,\n    })\n  }\n\n  /** Marks which tracked containers were seen in the latest rendered scene. */\n  markSceneMembership(seenContainers: Set<Container>) {\n    for (const container of this.trackedContainers) {\n      const state = this.stateByContainer.get(container)\n      if (!state) {\n        continue\n      }\n\n      state.inScene = seenContainers.has(container)\n      if (!state.inScene) {\n        state.metrics = null\n      }\n    }\n  }\n\n  /** Starts an asynchronous readback and parses metrics when mapping completes. */\n  scheduleReadback(state: BackdropMetricsState) {\n    const readbackBuffer = state.readbackBuffer\n    if (!readbackBuffer || state.pendingReadback) {\n      return\n    }\n\n    state.pendingReadback = true\n    this.pendingStates.add(state)\n\n    void readbackBuffer\n      .mapAsync(GPUMapMode.READ)\n      .then(() => {\n        if (this.isDestroyed() || !this.trackedContainers.has(state.container) || !state.inScene) {\n          state.metrics = null\n          return\n        }\n\n        const nextMetrics = parseBackdropMetrics(readbackBuffer)\n        if (!nextMetrics) {\n          state.metrics = null\n          return\n        }\n\n        state.metrics = nextMetrics\n      })\n      .catch((error) => {\n        if (!this.isDestroyed() && !state.cleanupAfterPending) {\n          console.error(error)\n        }\n        state.metrics = null\n      })\n      .finally(() => {\n        if (readbackBuffer.mapState === 'mapped') {\n          readbackBuffer.unmap()\n        }\n\n        state.pendingReadback = false\n        this.pendingStates.delete(state)\n\n        if (this.isDestroyed() || state.cleanupAfterPending) {\n          this.cleanupState(state)\n        }\n      })\n  }\n\n  /** Releases completed resources and marks pending readbacks for cleanup. */\n  destroy() {\n    for (const container of this.trackedContainers) {\n      const state = this.stateByContainer.get(container)\n      if (!state) {\n        continue\n      }\n\n      if (state.pendingReadback) {\n        state.cleanupAfterPending = true\n      } else {\n        this.cleanupState(state)\n      }\n    }\n    this.trackedContainers.clear()\n\n    for (const state of this.pendingStates) {\n      state.cleanupAfterPending = true\n    }\n  }\n\n  /** Returns existing metrics state for a container or creates a new one. */\n  private getOrCreateState(container: Container) {\n    let state = this.stateByContainer.get(container)\n    if (state) {\n      return state\n    }\n\n    state = {\n      container,\n      readbackBuffer: null,\n      metrics: null,\n      pendingReadback: false,\n      inScene: false,\n      cleanupAfterPending: false,\n    }\n    this.stateByContainer.set(container, state)\n    return state\n  }\n\n  /** Releases a state readback buffer once it is no longer pending. */\n  private cleanupState(state: BackdropMetricsState) {\n    if (state.pendingReadback) {\n      state.cleanupAfterPending = true\n      return\n    }\n\n    state.metrics = null\n    state.inScene = false\n    state.cleanupAfterPending = false\n    this.pendingStates.delete(state)\n    state.readbackBuffer?.destroy()\n    state.readbackBuffer = null\n  }\n}\n","import {\n  getMinimumScale,\n  invertMatrix,\n  multiplyMatrices,\n  scaleOutputMatrix,\n  transformPoint,\n  type Matrix2D,\n} from '../matrix'\nimport { BackdropMetricsTracker, type BackdropMetricsState } from './backdrop-metrics-state'\nimport {\n  getCopiedCssSize,\n  getTextureUvScale,\n} from './dom-content-sync'\nimport type { SceneHtmlEntry, WebGpuGlassContentSource } from './content-source'\nimport { GPU_BUFFER_USAGE, GPU_TEXTURE_USAGE } from './gpu-constants'\nimport {\n  createPipelineBindGroup,\n  drawFullscreenPass,\n  PingPongComposer,\n} from './gpu-pass'\nimport {\n  GpuStructArrayBuffer,\n  GpuStructBuffer,\n  type GpuStructDefinition,\n} from './gpu-layout'\nimport {\n  createAdaptiveBlurTargetChain,\n  createRenderTarget,\n  destroyTargets,\n  type RenderTargetSet,\n} from './gpu-targets'\nimport {\n  createAdaptiveBlurResources,\n  destroyAdaptiveBlurResources,\n  renderAdaptiveBlur,\n  type AdaptiveBlurResources,\n} from './adaptive-blur'\nimport {\n  BACKDROP_METRICS_BYTES_PER_ROW,\n  BACKDROP_METRICS_SIZE,\n  createEmptyBounds,\n  expandBounds,\n  hasBounds,\n  type BoundsRect,\n} from './metrics'\nimport {\n  BackdropMetricsBoundsLayout,\n  ContentDataLayout,\n  GlobalsLayout,\n  HtmlCompositeParamsLayout,\n  ShapeDataLayout,\n} from './shader-layouts'\nimport {\n  getSortedGlassLayers,\n  getSortedSceneLayers,\n} from './scene-order'\nimport { Container, Html, Scene, type TraversedSceneLayer } from '../scene'\nimport {\n  DISPLACEMENT_FIELD_SHADER,\n  GLASS_SHADER,\n  HTML_COMPOSITE_SHADER,\n  METRICS_SHADER,\n  SHADOW_COMPOSITE_SHADER,\n  SHADOW_MASK_SHADER,\n  TEXTURE_BLIT_SHADER,\n} from '../shaders'\nimport type { SpecularWidth, SurfaceProfile } from '../types'\n\n/** Resolves public specular-width semantics into the shader's device-pixel space. */\nexport function resolveSpecularWidthPx(specularWidth: SpecularWidth, dpr: number) {\n  return specularWidth === 'hairline' ? 1 : specularWidth * dpr\n}\n\n/** Constructor options for the reusable WebGPU glass core. */\nexport type WebGpuGlassCoreInit = {\n  device: GPUDevice\n  format: GPUTextureFormat\n}\n\n/** Inputs for one texture-in/texture-out core render. */\nexport type WebGpuGlassCoreRenderOptions = {\n  layers?: TraversedSceneLayer[]\n  scene?: Scene\n  width: number\n  height: number\n  dpr: number\n  outputTexture: GPUTexture\n  backdropTexture?: GPUTexture | null\n  contentSource?: WebGpuGlassContentSource | null\n}\n\ntype PackedShapesResult = {\n  shapeCount: number\n  bounds: BoundsRect | null\n}\n\ntype GlobalsBuffer = GpuStructBuffer<GpuStructDefinition<typeof GlobalsLayout>>\ntype ShapeDataBuffer = GpuStructArrayBuffer<GpuStructDefinition<typeof ShapeDataLayout>>\ntype BackdropMetricsBoundsBuffer = GpuStructBuffer<GpuStructDefinition<typeof BackdropMetricsBoundsLayout>>\ntype HtmlCompositeParamsBuffer = GpuStructBuffer<GpuStructDefinition<typeof HtmlCompositeParamsLayout>>\nconst DISPLACEMENT_FIELD_FORMAT = 'rgba16float' satisfies GPUTextureFormat\nconst SHADOW_MASK_FORMAT = 'rgba8unorm' satisfies GPUTextureFormat\n\n/** Maps a public surface profile string to the shader enum value. */\nfunction getSurfaceProfileIndex(profile: SurfaceProfile) {\n  if (profile === 'convex') {\n    return 0\n  }\n  if (profile === 'concave') {\n    return 1\n  }\n  return 2\n}\n\n\n/** Texture-in/texture-out WebGPU compositor for a liquid-glass scene graph. */\nexport class WebGpuGlassCore {\n  private readonly backdropMetrics = new BackdropMetricsTracker(() => this.destroyed)\n\n  private destroyed = false\n  private currentDpr = 1\n  private width = 1\n  private height = 1\n  private contentSource: WebGpuGlassContentSource | null = null\n\n  private readonly device: GPUDevice\n  private readonly format: GPUTextureFormat\n  private globalsBuffer: GlobalsBuffer\n  private shapesBuffer: ShapeDataBuffer | null = null\n  private backdropMetricsBoundsBuffer: BackdropMetricsBoundsBuffer\n  private htmlCompositeParamsBuffer: HtmlCompositeParamsBuffer\n  private emptyContentEntriesBuffer: GpuStructArrayBuffer<GpuStructDefinition<typeof ContentDataLayout>>\n  private sampler: GPUSampler\n  private backdropBlurResources: AdaptiveBlurResources\n  private displacementBlurResources: AdaptiveBlurResources\n  private shadowBlurResources: AdaptiveBlurResources\n  private displacementFieldPipeline: GPURenderPipeline\n  private shadowMaskPipeline: GPURenderPipeline\n  private shadowCompositePipeline: GPURenderPipeline\n  private glassPipeline: GPURenderPipeline\n  private htmlCompositePipeline: GPURenderPipeline\n  private backdropMetricsPipeline: GPURenderPipeline\n  private blitPipeline: GPURenderPipeline\n  private targets: RenderTargetSet | null = null\n  private backdropMetricsTarget: GPUTexture\n\n  /** Creates reusable GPU resources for a host-owned WebGPU device. */\n  constructor({ device, format }: WebGpuGlassCoreInit) {\n    this.device = device\n    this.format = format\n    this.sampler = device.createSampler({\n      magFilter: 'linear',\n      minFilter: 'linear',\n      addressModeU: 'clamp-to-edge',\n      addressModeV: 'clamp-to-edge',\n    })\n    const uniformBufferUsage = GPU_BUFFER_USAGE.UNIFORM | GPU_BUFFER_USAGE.COPY_DST\n\n    this.globalsBuffer = new GpuStructBuffer(device, GlobalsLayout, uniformBufferUsage)\n    this.backdropMetricsBoundsBuffer = new GpuStructBuffer(device, BackdropMetricsBoundsLayout, uniformBufferUsage)\n    this.htmlCompositeParamsBuffer = new GpuStructBuffer(device, HtmlCompositeParamsLayout, uniformBufferUsage)\n    this.emptyContentEntriesBuffer = new GpuStructArrayBuffer(\n      device,\n      ContentDataLayout,\n      GPU_BUFFER_USAGE.STORAGE | GPU_BUFFER_USAGE.COPY_DST,\n    )\n    this.emptyContentEntriesBuffer.ensureCapacity(0)\n    this.backdropBlurResources = createAdaptiveBlurResources(device, format)\n    this.displacementBlurResources = createAdaptiveBlurResources(device, DISPLACEMENT_FIELD_FORMAT)\n    this.shadowBlurResources = createAdaptiveBlurResources(device, SHADOW_MASK_FORMAT)\n\n    this.displacementFieldPipeline = device.createRenderPipeline({\n      layout: 'auto',\n      vertex: {\n        module: device.createShaderModule({ code: DISPLACEMENT_FIELD_SHADER }),\n        entryPoint: 'vertexMain',\n      },\n      fragment: {\n        module: device.createShaderModule({ code: DISPLACEMENT_FIELD_SHADER }),\n        entryPoint: 'fragmentMain',\n        targets: [{ format: DISPLACEMENT_FIELD_FORMAT }],\n      },\n      primitive: {\n        topology: 'triangle-list',\n      },\n    })\n\n    this.glassPipeline = device.createRenderPipeline({\n      layout: 'auto',\n      vertex: {\n        module: device.createShaderModule({ code: GLASS_SHADER }),\n        entryPoint: 'vertexMain',\n      },\n      fragment: {\n        module: device.createShaderModule({ code: GLASS_SHADER }),\n        entryPoint: 'fragmentMain',\n        targets: [{ format }],\n      },\n      primitive: {\n        topology: 'triangle-list',\n      },\n    })\n\n    this.shadowMaskPipeline = device.createRenderPipeline({\n      layout: 'auto',\n      vertex: {\n        module: device.createShaderModule({ code: SHADOW_MASK_SHADER }),\n        entryPoint: 'vertexMain',\n      },\n      fragment: {\n        module: device.createShaderModule({ code: SHADOW_MASK_SHADER }),\n        entryPoint: 'fragmentMain',\n        targets: [{ format: SHADOW_MASK_FORMAT }],\n      },\n      primitive: {\n        topology: 'triangle-list',\n      },\n    })\n\n    this.shadowCompositePipeline = device.createRenderPipeline({\n      layout: 'auto',\n      vertex: {\n        module: device.createShaderModule({ code: SHADOW_COMPOSITE_SHADER }),\n        entryPoint: 'vertexMain',\n      },\n      fragment: {\n        module: device.createShaderModule({ code: SHADOW_COMPOSITE_SHADER }),\n        entryPoint: 'fragmentMain',\n        targets: [{ format }],\n      },\n      primitive: {\n        topology: 'triangle-list',\n      },\n    })\n\n    this.htmlCompositePipeline = device.createRenderPipeline({\n      layout: 'auto',\n      vertex: {\n        module: device.createShaderModule({ code: HTML_COMPOSITE_SHADER }),\n        entryPoint: 'vertexMain',\n      },\n      fragment: {\n        module: device.createShaderModule({ code: HTML_COMPOSITE_SHADER }),\n        entryPoint: 'fragmentMain',\n        targets: [{ format }],\n      },\n      primitive: {\n        topology: 'triangle-list',\n      },\n    })\n\n    this.backdropMetricsPipeline = device.createRenderPipeline({\n      layout: 'auto',\n      vertex: {\n        module: device.createShaderModule({ code: METRICS_SHADER }),\n        entryPoint: 'vertexMain',\n      },\n      fragment: {\n        module: device.createShaderModule({ code: METRICS_SHADER }),\n        entryPoint: 'fragmentMain',\n        targets: [{ format: 'rgba8unorm' }],\n      },\n      primitive: {\n        topology: 'triangle-list',\n      },\n    })\n\n    this.blitPipeline = device.createRenderPipeline({\n      layout: 'auto',\n      vertex: {\n        module: device.createShaderModule({ code: TEXTURE_BLIT_SHADER }),\n        entryPoint: 'vertexMain',\n      },\n      fragment: {\n        module: device.createShaderModule({ code: TEXTURE_BLIT_SHADER }),\n        entryPoint: 'fragmentMain',\n        targets: [{ format }],\n      },\n      primitive: {\n        topology: 'triangle-list',\n      },\n    })\n\n    this.backdropMetricsTarget = device.createTexture({\n      size: {\n        width: BACKDROP_METRICS_SIZE,\n        height: BACKDROP_METRICS_SIZE,\n        depthOrArrayLayers: 1,\n      },\n      format: 'rgba8unorm',\n      usage: GPU_TEXTURE_USAGE.RENDER_ATTACHMENT | GPU_TEXTURE_USAGE.COPY_SRC,\n    })\n\n    this.backdropMetrics.setDevice(device)\n  }\n\n  /** Enables or disables cached backdrop metrics for a container. */\n  setBackdropMetricsTracking(container: Container, enabled: boolean) {\n    this.backdropMetrics.setTracking(container, enabled)\n  }\n\n  /** Returns the latest completed cached backdrop metrics for a tracked container. */\n  getBackdropMetrics(container: Container) {\n    return this.backdropMetrics.getMetrics(container)\n  }\n\n  /** Draws one frame into a host-provided output texture. */\n  render(options: WebGpuGlassCoreRenderOptions) {\n    if (this.destroyed) {\n      return\n    }\n\n    this.width = Math.max(1, Math.floor(options.width))\n    this.height = Math.max(1, Math.floor(options.height))\n    this.currentDpr = Math.max(options.dpr, 0.0001)\n    this.contentSource = options.contentSource ?? null\n    this.syncTargets()\n    const layers = options.layers ?? (options.scene ? getSortedSceneLayers(options.scene) : [])\n    try {\n      this.drawFrame(layers, options.outputTexture, options.backdropTexture ?? null)\n    } finally {\n      this.contentSource = null\n    }\n  }\n\n  /** Releases GPU resources owned by the core. */\n  destroy() {\n    if (this.destroyed) {\n      return\n    }\n\n    this.destroyed = true\n    destroyTargets(this.targets)\n    this.targets = null\n    this.backdropMetricsTarget.destroy()\n    this.globalsBuffer.destroy()\n    this.shapesBuffer?.destroy()\n    this.emptyContentEntriesBuffer.destroy()\n    destroyAdaptiveBlurResources(this.backdropBlurResources)\n    destroyAdaptiveBlurResources(this.displacementBlurResources)\n    destroyAdaptiveBlurResources(this.shadowBlurResources)\n    this.backdropMetricsBoundsBuffer.destroy()\n    this.htmlCompositeParamsBuffer.destroy()\n    this.backdropMetrics.destroy()\n  }\n\n  /** Synchronizes internal render-target dimensions with the host output. */\n  private syncTargets() {\n    if (\n      this.targets &&\n      this.targets.backdropBlur.levels[0]?.width === this.width &&\n      this.targets.backdropBlur.levels[0]?.height === this.height\n    ) {\n      return\n    }\n\n    destroyTargets(this.targets)\n    this.targets = {\n      backdropBlur: createAdaptiveBlurTargetChain(this.device, this.format, this.width, this.height),\n      displacementBlur: createAdaptiveBlurTargetChain(this.device, DISPLACEMENT_FIELD_FORMAT, this.width, this.height),\n      shadowBlur: createAdaptiveBlurTargetChain(this.device, SHADOW_MASK_FORMAT, this.width, this.height),\n      sceneA: createRenderTarget(this.device, this.format, this.width, this.height),\n      sceneB: createRenderTarget(this.device, this.format, this.width, this.height),\n    }\n  }\n\n  /** Ensures the shape storage buffer can hold the active glass count. */\n  private ensureShapesBuffer(requiredCount: number) {\n    if (!this.shapesBuffer) {\n      this.shapesBuffer = new GpuStructArrayBuffer(\n        this.device,\n        ShapeDataLayout,\n        GPU_BUFFER_USAGE.STORAGE | GPU_BUFFER_USAGE.COPY_DST,\n      )\n    }\n\n    this.shapesBuffer.ensureCapacity(requiredCount)\n  }\n\n  /** Writes per-container global shader parameters. */\n  private writeGlobals(container: Container, shapeCount: number) {\n    const dpr = this.currentDpr\n\n    this.globalsBuffer.write({\n      canvas: {\n        width: this.width,\n        height: this.height,\n      },\n      container: {\n        opacity: container.opacity,\n      },\n      shape: {\n        smoothing: container.spacing * dpr,\n        bezelWidth: container.bezelWidth * dpr,\n        shapeCount,\n        surfaceProfile: getSurfaceProfileIndex(container.surfaceProfile),\n      },\n      sdf: {\n        normalDivergenceBlendPower: container.normalDivergenceBlendPower,\n        normalDivergenceBlendEnabled: container.normalDivergenceBlendEnabled ? 1 : 0,\n      },\n      glass: {\n        thickness: container.thickness * dpr,\n        displacementFactor: container.displacementFactor,\n        ior: container.ior,\n        dispersion: container.dispersion,\n      },\n      content: {\n        ior: container.contentIor,\n        depth: container.contentDepth * dpr,\n      },\n      lighting: {\n        x: Math.sin(container.lightDirection),\n        y: -Math.cos(container.lightDirection),\n      },\n      specular: {\n        strength: container.specularStrength,\n        width: resolveSpecularWidthPx(container.specularWidth, dpr),\n        sharpness: container.specularSharpness,\n        opacity: container.specularOpacity,\n      },\n      specularSecondary: {\n        oppositeStrength: container.oppositeSpecularStrength,\n        falloff: container.specularFalloff,\n        reflectionOffset: container.reflectionOffset * dpr,\n      },\n      tint: {\n        r: container.tint.r,\n        g: container.tint.g,\n        b: container.tint.b,\n        a: container.tint.a,\n      },\n      shadow: {\n        offsetX: container.shadowOffsetX * dpr,\n        offsetY: container.shadowOffsetY * dpr,\n        spread: container.shadowSpread * dpr,\n        blur: container.shadowBlur * dpr,\n      },\n      shadowColor: {\n        r: container.shadowColor.r,\n        g: container.shadowColor.g,\n        b: container.shadowColor.b,\n        a: container.shadowColor.a,\n      },\n      debug: {\n        displacement: container.debugDisplacement ? 1 : 0,\n      },\n    })\n  }\n\n  /** Writes the device-pixel bounds sampled by the backdrop metrics pass. */\n  private writeBackdropMetricsBounds(bounds: BoundsRect) {\n    this.backdropMetricsBoundsBuffer.write({\n      bounds: {\n        minX: bounds.minX,\n        minY: bounds.minY,\n        maxX: bounds.maxX,\n        maxY: bounds.maxY,\n      },\n    })\n  }\n\n  /** Packs visible glass shapes into the storage buffer and accumulates bounds. */\n  private packShapes(container: Container, containerTransform: Matrix2D): PackedShapesResult {\n    const dpr = this.currentDpr\n    const glassLayers = getSortedGlassLayers(container)\n    const bounds = createEmptyBounds()\n    let activeCount = 0\n\n    this.ensureShapesBuffer(glassLayers.length)\n    const shapesBuffer = this.shapesBuffer\n\n    for (const glassLayer of glassLayers) {\n      const glass = glassLayer.glass\n      if (glass.width <= 0 || glass.height <= 0) {\n        continue\n      }\n\n      const worldCss = multiplyMatrices(containerTransform, glassLayer.transform)\n      const worldDevice = scaleOutputMatrix(worldCss, dpr)\n      const inverse = invertMatrix(worldDevice)\n      if (!inverse) {\n        continue\n      }\n\n      const topLeft = transformPoint(worldDevice, 0, 0)\n      const topRight = transformPoint(worldDevice, glass.width, 0)\n      const bottomLeft = transformPoint(worldDevice, 0, glass.height)\n      const bottomRight = transformPoint(worldDevice, glass.width, glass.height)\n      expandBounds(bounds, topLeft.x, topLeft.y)\n      expandBounds(bounds, topRight.x, topRight.y)\n      expandBounds(bounds, bottomLeft.x, bottomLeft.y)\n      expandBounds(bounds, bottomRight.x, bottomRight.y)\n\n      const contentRange = this.contentSource?.getGlassContentRange?.(glass)\n      const halfWidth = glass.width * 0.5\n      const halfHeight = glass.height * 0.5\n      shapesBuffer?.writeAt(activeCount, {\n        inverse0: {\n          a: inverse.a,\n          c: inverse.c,\n          e: inverse.e,\n          minimumScale: getMinimumScale(worldDevice),\n        },\n        inverse1: {\n          b: inverse.b,\n          d: inverse.d,\n          f: inverse.f,\n          cornerRadius: glass.cornerRadius,\n        },\n        geometry: {\n          halfWidth,\n          halfHeight,\n          cornerSmoothing: glass.cornerSmoothing,\n        },\n        contentRange: {\n          start: contentRange?.start ?? 0,\n          count: contentRange?.count ?? 0,\n        },\n      })\n\n      activeCount += 1\n    }\n\n    shapesBuffer?.upload(activeCount)\n\n    return {\n      shapeCount: activeCount,\n      bounds: hasBounds(bounds) ? bounds : null,\n    }\n  }\n\n  /** Renders and filters the premultiplied surface field used for refraction displacement. */\n  private renderDisplacementField(encoder: GPUCommandEncoder, targetContainer: Container) {\n    if (!this.shapesBuffer?.buffer || !this.targets) {\n      return null\n    }\n\n    const rawLevel = this.targets.displacementBlur.levels[0]\n    const fieldBindGroup = createPipelineBindGroup(this.device, this.displacementFieldPipeline, [\n      { binding: 0, resource: this.globalsBuffer.bindingResource },\n      { binding: 1, resource: this.shapesBuffer.bindingResource },\n    ])\n    drawFullscreenPass(encoder, {\n      pipeline: this.displacementFieldPipeline,\n      bindGroup: fieldBindGroup,\n      target: rawLevel.ping,\n      clearValue: { r: 0, g: 0, b: 0, a: 0 },\n    })\n\n    return renderAdaptiveBlur({\n      device: this.device,\n      sampler: this.sampler,\n      encoder,\n      source: rawLevel.ping,\n      radiusPx: targetContainer.displacementBlur * this.currentDpr,\n      chain: this.targets.displacementBlur,\n      resources: this.displacementBlurResources,\n    })\n  }\n\n  /** Renders the container shadow mask, blurs it, and composites it under the glass. */\n  private renderShadow(\n    encoder: GPUCommandEncoder,\n    source: GPUTexture,\n    target: GPUTexture,\n    targetContainer: Container,\n  ) {\n    if (\n      targetContainer.opacity <= 0 ||\n      targetContainer.shadowColor.a <= 0 ||\n      !this.shapesBuffer?.buffer ||\n      !this.targets\n    ) {\n      return false\n    }\n\n    const rawLevel = this.targets.shadowBlur.levels[0]\n    const maskBindGroup = createPipelineBindGroup(this.device, this.shadowMaskPipeline, [\n      { binding: 0, resource: this.globalsBuffer.bindingResource },\n      { binding: 1, resource: this.shapesBuffer.bindingResource },\n    ])\n    drawFullscreenPass(encoder, {\n      pipeline: this.shadowMaskPipeline,\n      bindGroup: maskBindGroup,\n      target: rawLevel.ping,\n      clearValue: { r: 0, g: 0, b: 0, a: 0 },\n    })\n\n    const blurredMask = renderAdaptiveBlur({\n      device: this.device,\n      sampler: this.sampler,\n      encoder,\n      source: rawLevel.ping,\n      radiusPx: targetContainer.shadowBlur * this.currentDpr,\n      chain: this.targets.shadowBlur,\n      resources: this.shadowBlurResources,\n    })\n\n    const compositeBindGroup = createPipelineBindGroup(this.device, this.shadowCompositePipeline, [\n      { binding: 0, resource: this.sampler },\n      { binding: 1, resource: source.createView() },\n      { binding: 2, resource: blurredMask.createView() },\n      { binding: 3, resource: this.globalsBuffer.bindingResource },\n    ])\n    drawFullscreenPass(encoder, {\n      pipeline: this.shadowCompositePipeline,\n      bindGroup: compositeBindGroup,\n      target,\n    })\n\n    return true\n  }\n\n  /** Returns whether rendering this container will add a shadow composition pass. */\n  private shouldRenderShadow(targetContainer: Container) {\n    return targetContainer.opacity > 0 &&\n      targetContainer.shadowColor.a > 0 &&\n      Boolean(this.shapesBuffer?.buffer) &&\n      Boolean(this.targets)\n  }\n\n  /** Renders and queues copy commands for one backdrop metrics target. */\n  private renderBackdropMetrics(\n    encoder: GPUCommandEncoder,\n    state: BackdropMetricsState,\n    bounds: BoundsRect | null,\n    blurredBackdrop: GPUTexture,\n  ) {\n    if (\n      !this.shapesBuffer?.buffer ||\n      !bounds ||\n      state.pendingReadback\n    ) {\n      if (!bounds && !state.pendingReadback) {\n        state.metrics = null\n      }\n      return false\n    }\n\n    this.backdropMetrics.ensureResources(state)\n    if (!state.readbackBuffer) {\n      return false\n    }\n\n    this.writeBackdropMetricsBounds(bounds)\n\n    const bindGroup = createPipelineBindGroup(this.device, this.backdropMetricsPipeline, [\n      { binding: 0, resource: this.globalsBuffer.bindingResource },\n      { binding: 1, resource: this.shapesBuffer.bindingResource },\n      { binding: 2, resource: this.sampler },\n      { binding: 3, resource: blurredBackdrop.createView() },\n      { binding: 4, resource: this.backdropMetricsBoundsBuffer.bindingResource },\n    ])\n    drawFullscreenPass(encoder, {\n      pipeline: this.backdropMetricsPipeline,\n      bindGroup,\n      target: this.backdropMetricsTarget,\n      clearValue: { r: 0, g: 0, b: 0, a: 0 },\n    })\n\n    encoder.copyTextureToBuffer(\n      { texture: this.backdropMetricsTarget },\n      {\n        buffer: state.readbackBuffer,\n        bytesPerRow: BACKDROP_METRICS_BYTES_PER_ROW,\n        rowsPerImage: BACKDROP_METRICS_SIZE,\n      },\n      {\n        width: BACKDROP_METRICS_SIZE,\n        height: BACKDROP_METRICS_SIZE,\n        depthOrArrayLayers: 1,\n      },\n    )\n\n    return true\n  }\n\n  /** Renders one container's glass shapes over the current scene texture. */\n  private renderContainer(\n    encoder: GPUCommandEncoder,\n    sharpSource: GPUTexture,\n    blurredBackdrop: GPUTexture,\n    displacementField: GPUTexture,\n    target: GPUTexture,\n  ) {\n    if (!this.shapesBuffer?.buffer) {\n      return\n    }\n\n    const contentEntriesBindingResource =\n      this.contentSource?.contentEntriesBindingResource ?? this.emptyContentEntriesBuffer.bindingResource\n\n    // The shader never reads this when all content ranges are empty, but the\n    // bind group still needs a valid texture for the fixed glass pipeline layout.\n    const contentTexture = this.contentSource?.atlasTexture ?? sharpSource\n\n    const bindGroup = createPipelineBindGroup(this.device, this.glassPipeline, [\n      { binding: 0, resource: this.globalsBuffer.bindingResource },\n      { binding: 1, resource: this.shapesBuffer.bindingResource },\n      { binding: 2, resource: this.sampler },\n      { binding: 3, resource: sharpSource.createView() },\n      { binding: 4, resource: blurredBackdrop.createView() },\n      { binding: 5, resource: contentTexture.createView() },\n      { binding: 6, resource: contentEntriesBindingResource },\n      { binding: 7, resource: displacementField.createView() },\n    ])\n    drawFullscreenPass(encoder, {\n      pipeline: this.glassPipeline,\n      bindGroup,\n      target,\n    })\n  }\n\n  /** Writes uniforms for compositing one scene-attached HTML texture. */\n  private writeHtmlCompositeParams(entry: SceneHtmlEntry) {\n    if (!entry.inverseTransform) {\n      return\n    }\n\n    const inverse = entry.inverseTransform\n    this.htmlCompositeParamsBuffer.write({\n      canvas: {\n        width: this.width,\n        height: this.height,\n        uScale: getTextureUvScale(entry.deviceWidth, entry.width, entry.textureWidth),\n        vScale: getTextureUvScale(entry.deviceHeight, entry.height, entry.textureHeight),\n      },\n      inverse0: {\n        a: inverse.a,\n        c: inverse.c,\n        e: inverse.e,\n        copiedWidth: getCopiedCssSize(entry.copiedDeviceWidth, entry.deviceWidth, entry.width),\n      },\n      inverse1: {\n        b: inverse.b,\n        d: inverse.d,\n        f: inverse.f,\n        copiedHeight: getCopiedCssSize(entry.copiedDeviceHeight, entry.deviceHeight, entry.height),\n      },\n      opacity: {\n        value: entry.html.opacity,\n      },\n    })\n  }\n\n  /** Composites a scene-attached HTML layer over the current scene texture. */\n  private compositeHtmlLayer(\n    encoder: GPUCommandEncoder,\n    sharpSource: GPUTexture,\n    target: GPUTexture,\n    entry: SceneHtmlEntry,\n  ) {\n    if (\n      (!entry.filteredTexture && !entry.texture) ||\n      !entry.inverseTransform\n    ) {\n      return\n    }\n\n    this.writeHtmlCompositeParams(entry)\n\n    const bindGroup = createPipelineBindGroup(this.device, this.htmlCompositePipeline, [\n      { binding: 0, resource: this.sampler },\n      { binding: 1, resource: sharpSource.createView() },\n      { binding: 2, resource: (entry.filteredTexture ?? entry.texture)!.createView() },\n      { binding: 3, resource: this.htmlCompositeParamsBuffer.bindingResource },\n    ])\n    drawFullscreenPass(encoder, {\n      pipeline: this.htmlCompositePipeline,\n      bindGroup,\n      target,\n    })\n  }\n\n  /** Samples one texture into another render attachment. */\n  private blitTexture(encoder: GPUCommandEncoder, source: GPUTexture, target: GPUTexture) {\n    const bindGroup = createPipelineBindGroup(this.device, this.blitPipeline, [\n      { binding: 0, resource: this.sampler },\n      { binding: 1, resource: source.createView() },\n    ])\n    drawFullscreenPass(encoder, {\n      pipeline: this.blitPipeline,\n      bindGroup,\n      target,\n    })\n  }\n\n  /** Draws a complete frame for the provided sorted scene layers. */\n  private drawFrame(\n    layers: TraversedSceneLayer[],\n    outputTexture: GPUTexture,\n    backdropTexture: GPUTexture | null,\n  ) {\n    if (this.destroyed || !this.targets) {\n      return\n    }\n\n    const seenContainers = new Set<Container>()\n    const composer = new PingPongComposer(this.device, this.targets)\n    if (backdropTexture) {\n      this.blitTexture(composer.encoder, backdropTexture, composer.current)\n    }\n\n    for (const entry of layers) {\n      if (entry.child instanceof Html) {\n        if (entry.child.opacity <= 0) {\n          continue\n        }\n\n        const htmlEntry = this.contentSource?.getSceneHtmlEntry?.(entry.child)\n        if (!htmlEntry || !htmlEntry.texture || !htmlEntry.inverseTransform) {\n          continue\n        }\n\n        this.compositeHtmlLayer(composer.encoder, composer.current, composer.next, htmlEntry)\n        composer.submitAndSwap()\n        continue\n      }\n\n      if (entry.child.opacity <= 0) {\n        continue\n      }\n      const packedShapes = this.packShapes(entry.child, entry.transform)\n      this.writeGlobals(entry.child, packedShapes.shapeCount)\n      const blurRadiusPx = entry.child.blur * this.currentDpr\n      let blurredBackdrop = renderAdaptiveBlur({\n        device: this.device,\n        sampler: this.sampler,\n        encoder: composer.encoder,\n        source: composer.current,\n        radiusPx: blurRadiusPx,\n        chain: this.targets.backdropBlur,\n        resources: this.backdropBlurResources,\n      })\n      if (blurRadiusPx <= 0 && this.shouldRenderShadow(entry.child)) {\n        // With zero blur the \"blurred\" backdrop is the sharp scene texture.\n        // The shadow pass below swaps the ping-pong targets before the glass\n        // pass, which would otherwise make that texture become the glass render\n        // target. Snapshot it into the blur chain so the glass pass never reads\n        // from the same texture it writes to.\n        blurredBackdrop = this.targets.backdropBlur.levels[0].pong\n        this.blitTexture(composer.encoder, composer.current, blurredBackdrop)\n      }\n      const displacementField = this.renderDisplacementField(composer.encoder, entry.child)\n      if (!displacementField) {\n        continue\n      }\n\n      const metricsState = this.backdropMetrics.getTrackedState(entry.child)\n      let scheduledMetricsReadback = false\n\n      if (metricsState) {\n        seenContainers.add(entry.child)\n        scheduledMetricsReadback = this.renderBackdropMetrics(\n          composer.encoder,\n          metricsState,\n          packedShapes.bounds,\n          blurredBackdrop,\n        )\n      }\n\n      if (this.renderShadow(composer.encoder, composer.current, composer.next, entry.child)) {\n        composer.submitAndSwap()\n      }\n\n      this.renderContainer(composer.encoder, composer.current, blurredBackdrop, displacementField, composer.next)\n      composer.submitAndSwap()\n\n      if (metricsState && scheduledMetricsReadback) {\n        this.backdropMetrics.scheduleReadback(metricsState)\n      }\n    }\n\n    this.backdropMetrics.markSceneMembership(seenContainers)\n    this.blitTexture(composer.encoder, composer.current, outputTexture)\n    composer.submit()\n  }\n}\n","import { Scene } from '../scene'\nimport { DomContentSync } from './dom-content-sync'\nimport {\n  getHtmlHostOrder,\n  getLayerContainers,\n  getSortedSceneLayers,\n} from './scene-order'\nimport type { GlassContentRange, SceneHtmlEntry, WebGpuGlassContentSource } from './content-source'\nimport type { Glass, Html } from '../scene'\n\n/** Constructor options for a DOM-backed content provider usable by WebGPU hosts. */\nexport type WebGpuDomContentSourceInit = {\n  targetCanvas: HTMLCanvasElement\n  getCurrentDpr: () => number\n  scene?: Scene\n}\n\n/**\n * DOM-to-texture content source for hosts that use {@link WebGpuGlassCore}\n * without the standalone DOM renderer.\n */\nexport class WebGpuDomContentSource implements WebGpuGlassContentSource {\n  readonly scene: Scene | null\n\n  private readonly targetCanvas: HTMLCanvasElement\n  private readonly domContent: DomContentSync\n  private destroyed = false\n\n  private readonly handlePaintEvent = (event: Event) => {\n    if (!this.destroyed) {\n      this.domContent.handlePaintEvent(event)\n    }\n  }\n\n  constructor({ targetCanvas, getCurrentDpr, scene }: WebGpuDomContentSourceInit) {\n    this.targetCanvas = targetCanvas\n    this.scene = scene ?? null\n    this.domContent = new DomContentSync({ targetCanvas, getCurrentDpr })\n    this.targetCanvas.setAttribute('layoutsubtree', 'true')\n    this.targetCanvas.addEventListener('paint', this.handlePaintEvent as EventListener)\n  }\n\n  /** Current atlas texture for glass-attached HTML content, if any exists. */\n  get atlasTexture() {\n    return this.domContent.atlasTexture\n  }\n\n  /** Binding resource for glass content entries, or null before GPU allocation. */\n  get contentEntriesBindingResource() {\n    return this.domContent.contentEntriesBindingResource\n  }\n\n  /** Attaches GPU resources used for DOM content textures and storage buffers. */\n  setDevice(device: GPUDevice, presentationFormat: GPUTextureFormat) {\n    this.domContent.setDevice(device, presentationFormat)\n  }\n\n  /** Synchronizes DOM hosts, atlas metadata, and pending DOM-to-texture copies. */\n  sync(scene = this.scene) {\n    if (!scene) {\n      throw new Error('WebGpuDomContentSource.sync requires a scene.')\n    }\n\n    const layers = getSortedSceneLayers(scene)\n    this.domContent.sync(layers, getLayerContainers(layers), getHtmlHostOrder(layers))\n    this.domContent.copyPending()\n    return layers\n  }\n\n  /** Returns GPU state for a scene-attached HTML node. */\n  getSceneHtmlEntry(html: Html): SceneHtmlEntry | null {\n    return this.domContent.getSceneHtmlEntry(html)\n  }\n\n  /** Returns the storage-buffer range for a glass node's attached HTML. */\n  getGlassContentRange(glass: Glass): GlassContentRange | null {\n    return this.domContent.getGlassContentRange(glass)\n  }\n\n  /** Removes DOM hosts and destroys GPU resources owned by this content source. */\n  destroy() {\n    if (this.destroyed) {\n      return\n    }\n\n    this.destroyed = true\n    this.targetCanvas.removeEventListener('paint', this.handlePaintEvent as EventListener)\n    this.domContent.destroy()\n  }\n}\n","import { Container, Scene } from '../scene'\nimport { DomContentSync } from './dom-content-sync'\nimport { GPU_TEXTURE_USAGE } from './gpu-constants'\nimport { clearRenderTarget } from './gpu-pass'\nimport { copyTextureRegion, createRenderTarget } from './gpu-targets'\nimport {\n  getHtmlHostOrder,\n  getLayerContainers,\n  getSortedSceneLayers,\n} from './scene-order'\nimport { PointerController } from './pointer-controller'\nimport {\n  WebGpuGlassCore,\n  resolveSpecularWidthPx,\n  type WebGpuGlassCoreRenderOptions,\n  type WebGpuGlassCoreInit,\n} from './core'\nimport { WebGpuDomContentSource, type WebGpuDomContentSourceInit } from './dom-content-source'\nimport type { WebGpuGlassContentSource } from './content-source'\n\nexport {\n  WebGpuGlassCore,\n  WebGpuDomContentSource,\n  resolveSpecularWidthPx,\n  type WebGpuGlassCoreInit,\n  type WebGpuGlassCoreRenderOptions,\n  type WebGpuGlassContentSource,\n  type WebGpuDomContentSourceInit,\n}\n\n/**\n * Constructor options for {@link Renderer}.\n */\ntype RendererInit = {\n  /** Scene to render. If omitted, a new empty scene is created. */\n  scene?: Scene\n  /** Maximum device pixel ratio used for internal render targets. Defaults to `2`. */\n  maxDpr?: number\n}\n\n/**\n * Imperative WebGPU renderer for a liquid-glass scene graph.\n *\n * The renderer owns a canvas and a DOM subtree root that is copied into GPU\n * textures. Rendering itself is delegated to {@link WebGpuGlassCore}, which can\n * also be hosted by non-DOM renderers.\n */\nexport class Renderer {\n  /** Scene currently rendered by this renderer. */\n  readonly scene: Scene\n  /** Canvas element that presents the rendered output. */\n  readonly canvas: HTMLCanvasElement\n  /** Maximum device pixel ratio used for internal render targets. */\n  maxDpr: number\n\n  private readonly targetCanvas: HTMLCanvasElement\n  private readonly domContent: DomContentSync\n  private readonly pointerController: PointerController\n\n  private unsubscribeSceneMutations: (() => void) | null = null\n  private initError: unknown = null\n  private destroyed = false\n  private initialized = false\n  private pendingSceneContentSync = true\n  private sceneContentSyncQueued = false\n  private currentDpr = 1\n  private resizeObserver: ResizeObserver | null = null\n\n  private device: GPUDevice | null = null\n  private context: GPUCanvasContext | null = null\n  private presentationFormat: GPUTextureFormat | null = null\n  private core: WebGpuGlassCore | null = null\n  private canvasConfigured = false\n  private lastFrameTexture: GPUTexture | null = null\n\n  /** Handles canvas paint events by copying managed DOM content into GPU textures. */\n  private readonly handlePaintEvent = (event: Event) => {\n    if (this.destroyed || !this.core) {\n      return\n    }\n\n    this.domContent.handlePaintEvent(event)\n  }\n\n  /** Marks scene-derived DOM and interaction state as dirty after scene mutations. */\n  private readonly handleSceneMutation = () => {\n    this.queueSceneContentSync()\n  }\n\n  /**\n   * Creates a renderer and begins asynchronous WebGPU initialization immediately.\n   */\n  constructor(options: RendererInit = {}) {\n    this.scene = options.scene ?? new Scene()\n    this.maxDpr = options.maxDpr ?? 2\n    this.targetCanvas = document.createElement('canvas')\n    this.targetCanvas.setAttribute('layoutsubtree', 'true')\n    this.targetCanvas.style.display = 'block'\n    this.domContent = new DomContentSync({\n      targetCanvas: this.targetCanvas,\n      getCurrentDpr: () => this.currentDpr,\n    })\n    this.pointerController = new PointerController({\n      targetCanvas: this.targetCanvas,\n      renderer: this,\n      isDestroyed: () => this.destroyed,\n      flushSceneContentSync: () => this.flushSceneContentSync(),\n      getSceneHtmlHosts: () => this.domContent.sceneHtmlHosts,\n      getGlassContentHosts: () => this.domContent.glassContentHosts,\n    })\n\n    this.targetCanvas.addEventListener('paint', this.handlePaintEvent as EventListener)\n    this.targetCanvas.addEventListener('pointermove', this.pointerController.handlePointerMove, true)\n    this.targetCanvas.addEventListener('pointerdown', this.pointerController.handlePointerDown, true)\n    this.targetCanvas.addEventListener('pointerup', this.pointerController.handlePointerUp, true)\n    this.targetCanvas.addEventListener('pointercancel', this.pointerController.handlePointerCancel, true)\n    this.targetCanvas.addEventListener('pointerleave', this.pointerController.handlePointerLeave, true)\n    this.unsubscribeSceneMutations = this.scene._subscribe(this.handleSceneMutation)\n\n    this.canvas = this.targetCanvas\n    void this.initialize().catch((error) => {\n      this.initError = error\n      console.error(error)\n    })\n  }\n\n  /** Enables or disables cached backdrop metrics for a container. */\n  setBackdropMetricsTracking(container: Container, enabled: boolean) {\n    this.core?.setBackdropMetricsTracking(container, enabled)\n  }\n\n  /** Returns the latest completed cached backdrop metrics for a tracked container. */\n  getBackdropMetrics(container: Container) {\n    return this.core?.getBackdropMetrics(container) ?? null\n  }\n\n  /** Renders one frame if the renderer is initialized. */\n  render() {\n    if (this.destroyed) {\n      return\n    }\n\n    if (this.initError) {\n      throw this.initError\n    }\n\n    const layers = this.syncSceneNow()\n    if (!this.initialized) {\n      return\n    }\n\n    this.drawFrame(layers)\n  }\n\n  /** Tears down observers, event listeners, and GPU resources owned by this renderer. */\n  destroy() {\n    if (this.destroyed) {\n      return\n    }\n\n    this.destroyed = true\n    this.targetCanvas.removeEventListener('paint', this.handlePaintEvent as EventListener)\n    this.targetCanvas.removeEventListener('pointermove', this.pointerController.handlePointerMove, true)\n    this.targetCanvas.removeEventListener('pointerdown', this.pointerController.handlePointerDown, true)\n    this.targetCanvas.removeEventListener('pointerup', this.pointerController.handlePointerUp, true)\n    this.targetCanvas.removeEventListener('pointercancel', this.pointerController.handlePointerCancel, true)\n    this.targetCanvas.removeEventListener('pointerleave', this.pointerController.handlePointerLeave, true)\n    this.unsubscribeSceneMutations?.()\n    this.unsubscribeSceneMutations = null\n    this.resizeObserver?.disconnect()\n    this.core?.destroy()\n    this.core = null\n    this.lastFrameTexture?.destroy()\n    this.lastFrameTexture = null\n    this.domContent.destroy()\n    this.pointerController.clear()\n  }\n\n  /** Creates WebGPU resources and pipelines needed by the renderer. */\n  private async initialize() {\n    const gpuNavigator = navigator as Navigator & { gpu?: GPU }\n    if (!gpuNavigator.gpu) {\n      throw new Error('WebGPU is not available in this browser.')\n    }\n\n    const adapter = await gpuNavigator.gpu.requestAdapter()\n    if (!adapter) {\n      throw new Error('No compatible GPU adapter was returned.')\n    }\n\n    const device = await adapter.requestDevice()\n    const context = this.targetCanvas.getContext('webgpu') as GPUCanvasContext | null\n    if (!context) {\n      throw new Error('Unable to acquire a WebGPU canvas context.')\n    }\n\n    const presentationFormat = gpuNavigator.gpu.getPreferredCanvasFormat()\n    this.device = device\n    this.context = context\n    this.presentationFormat = presentationFormat\n    this.core = new WebGpuGlassCore({ device, format: presentationFormat })\n    this.domContent.setDevice(device, presentationFormat)\n    this.initialized = true\n    this.syncCanvasSize()\n\n    this.resizeObserver = new ResizeObserver(() => {\n      this.syncCanvasSize()\n    })\n    this.resizeObserver.observe(this.targetCanvas)\n    this.queueSceneContentSync()\n  }\n\n  /** Synchronizes canvas/backing texture dimensions with CSS size and DPR. */\n  private syncCanvasSize() {\n    if (!this.device || !this.context || !this.presentationFormat) {\n      return\n    }\n\n    const bounds = this.targetCanvas.getBoundingClientRect()\n    const dpr = Math.min(window.devicePixelRatio || 1, this.maxDpr)\n    const nextWidth = Math.max(1, Math.round(bounds.width * dpr))\n    const nextHeight = Math.max(1, Math.round(bounds.height * dpr))\n\n    this.currentDpr = dpr\n\n    if (\n      !this.canvasConfigured ||\n      this.targetCanvas.width !== nextWidth ||\n      this.targetCanvas.height !== nextHeight\n    ) {\n      const previousLastFrame = this.lastFrameTexture\n      const previousWidth = this.targetCanvas.width\n      const previousHeight = this.targetCanvas.height\n      this.targetCanvas.width = nextWidth\n      this.targetCanvas.height = nextHeight\n      this.context.configure({\n        device: this.device,\n        format: this.presentationFormat,\n        usage: GPU_TEXTURE_USAGE.RENDER_ATTACHMENT | GPU_TEXTURE_USAGE.COPY_SRC | GPU_TEXTURE_USAGE.COPY_DST,\n        alphaMode: 'opaque',\n      })\n      this.canvasConfigured = true\n      this.lastFrameTexture = createRenderTarget(this.device, this.presentationFormat, nextWidth, nextHeight)\n      this.preservePreviousFrameAfterResize(previousLastFrame, previousWidth, previousHeight)\n      previousLastFrame?.destroy()\n    }\n\n    this.syncSceneNow()\n  }\n\n  /** Paints the previous completed frame into the newly configured canvas target. */\n  private preservePreviousFrameAfterResize(previousFrame: GPUTexture | null, previousWidth: number, previousHeight: number) {\n    if (\n      !previousFrame ||\n      !this.device ||\n      !this.context ||\n      !this.lastFrameTexture ||\n      previousWidth <= 0 ||\n      previousHeight <= 0\n    ) {\n      return\n    }\n\n    const copyWidth = Math.min(previousWidth, this.targetCanvas.width)\n    const copyHeight = Math.min(previousHeight, this.targetCanvas.height)\n    const encoder = this.device.createCommandEncoder()\n    const currentTexture = this.context.getCurrentTexture()\n    const region = {\n      sourceX: 0,\n      sourceY: 0,\n      destinationX: 0,\n      destinationY: 0,\n      width: copyWidth,\n      height: copyHeight,\n    }\n\n    clearRenderTarget(encoder, this.lastFrameTexture)\n    clearRenderTarget(encoder, currentTexture)\n    copyTextureRegion(encoder, previousFrame, this.lastFrameTexture, region)\n    copyTextureRegion(encoder, previousFrame, currentTexture, region)\n    this.device.queue.submit([encoder.finish()])\n  }\n\n  /** Queues scene-derived DOM and pointer state synchronization on a microtask. */\n  private queueSceneContentSync() {\n    this.pendingSceneContentSync = true\n\n    if (this.sceneContentSyncQueued || this.destroyed) {\n      return\n    }\n\n    this.sceneContentSyncQueued = true\n    queueMicrotask(() => {\n      this.sceneContentSyncQueued = false\n\n      if (this.destroyed || !this.pendingSceneContentSync) {\n        return\n      }\n\n      this.syncSceneNow()\n    })\n  }\n\n  /** Immediately synchronizes scene-derived DOM, content, and pointer caches. */\n  private syncSceneNow() {\n    const layers = getSortedSceneLayers(this.scene)\n    const containers = getLayerContainers(layers)\n    const hostOrder = getHtmlHostOrder(layers)\n\n    this.pointerController.syncInteractions(containers)\n    this.domContent.sync(layers, containers, hostOrder)\n    this.domContent.copyPending()\n\n    this.pendingSceneContentSync = false\n    return layers\n  }\n\n  /** Flushes any queued scene content synchronization before pointer work. */\n  private flushSceneContentSync() {\n    if (this.pendingSceneContentSync) {\n      this.syncSceneNow()\n    }\n  }\n\n  /** Draws a complete frame for the provided sorted scene layers. */\n  private drawFrame(layers = getSortedSceneLayers(this.scene)) {\n    if (\n      this.destroyed ||\n      !this.context ||\n      !this.core ||\n      !this.device ||\n      !this.lastFrameTexture ||\n      this.targetCanvas.width <= 0 ||\n      this.targetCanvas.height <= 0\n    ) {\n      return\n    }\n\n    this.core.render({\n      layers,\n      width: this.targetCanvas.width,\n      height: this.targetCanvas.height,\n      dpr: this.currentDpr,\n      outputTexture: this.lastFrameTexture,\n      contentSource: this.domContent,\n    })\n\n    const encoder = this.device.createCommandEncoder()\n    copyTextureRegion(encoder, this.lastFrameTexture, this.context.getCurrentTexture(), {\n      sourceX: 0,\n      sourceY: 0,\n      destinationX: 0,\n      destinationY: 0,\n      width: this.targetCanvas.width,\n      height: this.targetCanvas.height,\n    })\n    this.device.queue.submit([encoder.finish()])\n  }\n}\n"],"mappings":"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","names":["module","clamp","state"]}