{"version":3,"file":"YogaManager-D8GxdTBD.cjs","names":[],"sources":["../src/util/parseFlexValue.ts","../src/util/applyReactPropsToYoga.ts","../src/YogaManager.ts"],"sourcesContent":["import type { AutoDimensionValue } from '../types';\n\ntype FlexConfig = {\n  grow: number;\n  shrink: number;\n  basis: AutoDimensionValue | string;\n};\n\n// Cache for parsed flex values\nconst flexCache = new Map<string | number, FlexConfig>();\n\nexport function parseFlexValue(\n  value: string | number,\n  expandToAutoFlexBasis = false,\n): FlexConfig | null {\n  // Check cache first for string values to prevent parsing again\n  const cached = flexCache.get(value);\n\n  if (cached) {\n    return cached;\n  }\n\n  let flexConfig: {\n    grow: number;\n    shrink: number;\n    basis: AutoDimensionValue | string;\n  };\n\n  if (typeof value === 'number') {\n    flexConfig = {\n      grow: value,\n      shrink: 1,\n      basis: expandToAutoFlexBasis ? 'auto' : '0%',\n    };\n  } else {\n    // Trim whitespace and filter out empty parts\n    const parts = value\n      .trim()\n      .split(/\\s+/)\n      .filter((part) => part.length > 0);\n\n    // Return null for empty input\n    if (parts.length === 0) {\n      return null;\n    }\n\n    const [grow, shrink, basis] = parts;\n\n    // Helper function to check if a string is a valid number (including decimals and negatives)\n    const isValidNumber = (str: string): boolean => {\n      return /^-?(\\d+\\.?\\d*|\\d*\\.\\d+)([eE][+-]?\\d+)?$/.test(str.trim());\n    };\n\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/flex\n    if (parts.length === 3 && grow != null && shrink != null && basis != null) {\n      flexConfig = {\n        grow: Number.parseFloat(grow),\n        shrink: Number.parseFloat(shrink),\n        basis,\n      };\n    } else if (parts.length === 2 && grow != null && shrink != null) {\n      // For two values, if the second value is a pure number (not \"0\"), treat as grow/shrink\n      // If it's \"0\" or has units, treat as grow/basis\n      if (isValidNumber(shrink) && shrink !== '0') {\n        flexConfig = {\n          grow: Number.parseFloat(grow),\n          shrink: Number.parseFloat(shrink),\n          basis: 0,\n        };\n      } else {\n        flexConfig = {\n          grow: Number.parseFloat(grow),\n          shrink: 1,\n          basis: shrink,\n        };\n      }\n    } else if (parts.length === 1 && grow != null) {\n      if (isValidNumber(grow)) {\n        flexConfig = {\n          grow: Number.parseFloat(grow),\n          shrink: 1,\n          basis: expandToAutoFlexBasis ? 'auto' : '0%',\n        };\n      } else if (grow === 'none') {\n        flexConfig = { grow: 0, shrink: 0, basis: 'auto' };\n      } else {\n        flexConfig = { grow: 1, shrink: 1, basis: grow };\n      }\n    } else {\n      return null;\n    }\n  }\n\n  // Cache the parsed result\n  flexCache.set(value, flexConfig);\n\n  return flexConfig;\n}\n","import type {\n  Align,\n  Display,\n  Justify,\n  Node,\n  PositionType,\n  Wrap,\n  FlexDirection as YogaFlexDirection,\n} from 'yoga-layout';\nimport type { Yoga } from 'yoga-layout/load';\n\nimport type { LightningViewElementStyle } from '@plextv/react-lightning';\n\nimport type { YogaOptions } from '../types';\nimport type { AutoDimensionValue, Transform } from '../types/FlexStyles';\nimport type { ManagerNode } from '../types/ManagerNode';\nimport type { FlexProps } from './isFlexStyleProp';\nimport { isFlexStyleProp } from './isFlexStyleProp';\nimport { parseFlexValue } from './parseFlexValue';\n\nfunction mapDisplay(yoga: Yoga, value?: 'flex' | 'none'): Display {\n  switch (value) {\n    case 'none':\n      return yoga.DISPLAY_NONE;\n    default:\n      return yoga.DISPLAY_FLEX;\n  }\n}\n\nfunction mapDirection(yoga: Yoga, value?: number | string): YogaFlexDirection {\n  switch (value) {\n    case 'column-reverse':\n      return yoga.FLEX_DIRECTION_COLUMN_REVERSE;\n    case 'column':\n      return yoga.FLEX_DIRECTION_COLUMN;\n    case 'row-reverse':\n      return yoga.FLEX_DIRECTION_ROW_REVERSE;\n    default:\n      return yoga.FLEX_DIRECTION_ROW;\n  }\n}\n\nfunction mapAlignItems(yoga: Yoga, value?: number | string): Align {\n  switch (value) {\n    case 'flex-start':\n      return yoga.ALIGN_FLEX_START;\n    case 'flex-end':\n      return yoga.ALIGN_FLEX_END;\n    case 'center':\n      return yoga.ALIGN_CENTER;\n    case 'baseline':\n      return yoga.ALIGN_BASELINE;\n    default:\n      return yoga.ALIGN_STRETCH;\n  }\n}\n\nfunction mapAlignContent(yoga: Yoga, value?: number | string): Align {\n  switch (value) {\n    case 'space-around':\n      return yoga.ALIGN_SPACE_AROUND;\n    case 'space-between':\n    case 'space-evenly':\n      return yoga.ALIGN_SPACE_BETWEEN;\n    case 'center':\n      return yoga.ALIGN_CENTER;\n    case 'flex-end':\n      return yoga.ALIGN_FLEX_END;\n    case 'stretch':\n      return yoga.ALIGN_STRETCH;\n    default:\n      return yoga.ALIGN_FLEX_START;\n  }\n}\n\nfunction mapWrap(yoga: Yoga, value?: number | string): Wrap {\n  switch (value) {\n    case 'wrap':\n      return yoga.WRAP_WRAP;\n    case 'wrap-reverse':\n      return yoga.WRAP_WRAP_REVERSE;\n    default:\n      return yoga.WRAP_NO_WRAP;\n  }\n}\n\nfunction mapJustify(yoga: Yoga, value?: number | string): Justify {\n  switch (value) {\n    case 'center':\n      return yoga.JUSTIFY_CENTER;\n    case 'flex-end':\n      return yoga.JUSTIFY_FLEX_END;\n    case 'space-around':\n      return yoga.JUSTIFY_SPACE_AROUND;\n    case 'space-between':\n      return yoga.JUSTIFY_SPACE_BETWEEN;\n    case 'space-evenly':\n      return yoga.JUSTIFY_SPACE_EVENLY;\n    default:\n      return yoga.JUSTIFY_FLEX_START;\n  }\n}\n\nfunction mapPosition(yoga: Yoga, value?: number | string): PositionType {\n  switch (value) {\n    case 'absolute':\n    case 'fixed':\n      return yoga.POSITION_TYPE_ABSOLUTE;\n    case 'static':\n      return yoga.POSITION_TYPE_STATIC;\n    default:\n      return yoga.POSITION_TYPE_RELATIVE;\n  }\n}\n\nfunction formatSizeValue<T extends keyof LightningViewElementStyle>(\n  value?: string | number | undefined,\n): LightningViewElementStyle[T] {\n  if (value === 'none' || value === 'auto') {\n    return undefined;\n  }\n\n  return value as LightningViewElementStyle[T];\n}\n\nfunction applyFlexBasis(node: Node, value?: AutoDimensionValue | string) {\n  if (value == null) {\n    return;\n  }\n\n  if (typeof value === 'string') {\n    if (value === 'auto') {\n      node.setFlexBasisAuto();\n    } else if (value.endsWith('%')) {\n      node.setFlexBasisPercent(Number.parseFloat(value));\n    } else {\n      node.setFlexBasis(Number.parseFloat(value));\n    }\n  } else if (typeof value === 'number') {\n    node.setFlexBasis(value);\n  }\n}\n\nfunction applyFlex(node: Node, value?: string | number, expandToAutoFlexBasis = false) {\n  if (value == null) {\n    return;\n  }\n\n  const flexConfig = parseFlexValue(value, expandToAutoFlexBasis);\n\n  if (flexConfig) {\n    node.setFlexGrow(flexConfig.grow);\n    node.setFlexShrink(flexConfig.shrink);\n    applyFlexBasis(node, flexConfig.basis);\n  }\n}\n\nexport default function applyReactPropsToYoga(\n  yoga: Yoga,\n  config: YogaOptions,\n  managerNode: ManagerNode,\n  style: Partial<LightningViewElementStyle>,\n): void {\n  // `for...in` instead of `Object.entries(style)` to avoid the per-call\n  // array allocation. This function runs on every applyStyle dispatch,\n  // which during a UI update can be hundreds of times per frame.\n  for (const prop in style) {\n    if (isFlexStyleProp(prop)) {\n      const value = style[prop];\n\n      if (managerNode.props[prop] !== value) {\n        managerNode.props[prop] = value;\n\n        applyFlexPropToYoga(\n          yoga,\n          config,\n          managerNode.node,\n          prop,\n          value as LightningViewElementStyle[typeof prop],\n        );\n      }\n    }\n  }\n}\n\nexport function applyFlexPropToYoga<K extends FlexProps>(\n  yoga: Yoga,\n  config: YogaOptions,\n  node: Node,\n  key: K,\n  styleValue: LightningViewElementStyle[K],\n): boolean {\n  if (styleValue == null) {\n    return false;\n  }\n\n  try {\n    const value = styleValue as Exclude<LightningViewElementStyle[K], Transform>;\n\n    switch (key) {\n      case 'display':\n        node.setDisplay(mapDisplay(yoga, value as LightningViewElementStyle['display']));\n        return true;\n      case 'w':\n        node.setWidth(value as LightningViewElementStyle['w']);\n        return true;\n      case 'minWidth':\n        node.setMinWidth(value as LightningViewElementStyle['minWidth']);\n        return true;\n      case 'maxWidth':\n        node.setMaxWidth(formatSizeValue<'maxWidth'>(value));\n        return true;\n      case 'h':\n        node.setHeight(value as LightningViewElementStyle['h']);\n        return true;\n      case 'minHeight':\n        node.setMinHeight(value as LightningViewElementStyle['minHeight']);\n        return true;\n      case 'maxHeight':\n        node.setMaxHeight(formatSizeValue<'maxHeight'>(value));\n        return true;\n      case 'aspectRatio':\n        node.setAspectRatio(value as LightningViewElementStyle['aspectRatio']);\n        return true;\n      case 'margin':\n        node.setMargin(yoga.EDGE_ALL, value as LightningViewElementStyle['margin']);\n        return true;\n      case 'marginBottom':\n        node.setMargin(yoga.EDGE_BOTTOM, value as LightningViewElementStyle['marginBottom']);\n        return true;\n      case 'marginEnd':\n        node.setMargin(yoga.EDGE_END, value as LightningViewElementStyle['marginEnd']);\n        return true;\n      case 'marginLeft':\n        node.setMargin(yoga.EDGE_LEFT, value as LightningViewElementStyle['marginLeft']);\n        return true;\n      case 'marginRight':\n        node.setMargin(yoga.EDGE_RIGHT, value as LightningViewElementStyle['marginRight']);\n        return true;\n      case 'marginStart':\n        node.setMargin(yoga.EDGE_START, value as LightningViewElementStyle['marginStart']);\n        return true;\n      case 'marginTop':\n        node.setMargin(yoga.EDGE_TOP, value as LightningViewElementStyle['marginTop']);\n        return true;\n      case 'marginHorizontal':\n      case 'marginInline':\n        node.setMargin(yoga.EDGE_HORIZONTAL, value as LightningViewElementStyle['marginInline']);\n        return true;\n      case 'marginVertical':\n      case 'marginBlock':\n        node.setMargin(yoga.EDGE_VERTICAL, value as LightningViewElementStyle['marginBlock']);\n        return true;\n      case 'padding':\n        node.setPadding(yoga.EDGE_ALL, value as LightningViewElementStyle['padding']);\n        return true;\n      case 'paddingBottom':\n        node.setPadding(yoga.EDGE_BOTTOM, value as LightningViewElementStyle['paddingBottom']);\n        return true;\n      case 'paddingEnd':\n        node.setPadding(yoga.EDGE_END, value as LightningViewElementStyle['paddingEnd']);\n        return true;\n      case 'paddingLeft':\n        node.setPadding(yoga.EDGE_LEFT, value as LightningViewElementStyle['paddingLeft']);\n        return true;\n      case 'paddingRight':\n        node.setPadding(yoga.EDGE_RIGHT, value as LightningViewElementStyle['paddingRight']);\n        return true;\n      case 'paddingStart':\n        node.setPadding(yoga.EDGE_START, value as LightningViewElementStyle['paddingStart']);\n        return true;\n      case 'paddingTop':\n        node.setPadding(yoga.EDGE_TOP, value as LightningViewElementStyle['paddingTop']);\n        return true;\n      case 'paddingHorizontal':\n      case 'paddingInline':\n        node.setPadding(yoga.EDGE_HORIZONTAL, value as LightningViewElementStyle['paddingInline']);\n        return true;\n      case 'paddingVertical':\n      case 'paddingBlock':\n        node.setPadding(yoga.EDGE_VERTICAL, value as LightningViewElementStyle['paddingBlock']);\n        return true;\n      case 'flex':\n        applyFlex(node, value, config.expandToAutoFlexBasis);\n        return true;\n      case 'flexDirection':\n        node.setFlexDirection(mapDirection(yoga, value));\n        return true;\n      case 'alignContent':\n        node.setAlignContent(mapAlignContent(yoga, value));\n        return true;\n      case 'alignItems':\n        node.setAlignItems(mapAlignItems(yoga, value));\n        return true;\n      case 'alignSelf':\n        node.setAlignSelf(mapAlignItems(yoga, value));\n        return true;\n      case 'justifyContent':\n        node.setJustifyContent(mapJustify(yoga, value));\n        return true;\n      case 'flexWrap':\n        node.setFlexWrap(mapWrap(yoga, value));\n        return true;\n      case 'flexBasis':\n        applyFlexBasis(node, value as LightningViewElementStyle['flexBasis']);\n        return true;\n      case 'flexGrow':\n        node.setFlexGrow((value as LightningViewElementStyle['flexGrow']) ?? 1);\n        return true;\n      case 'flexShrink':\n        node.setFlexShrink((value as LightningViewElementStyle['flexShrink']) ?? 0);\n        return true;\n      case 'gap':\n        node.setGap(yoga.GUTTER_ALL, (value as LightningViewElementStyle['gap']) ?? 0);\n        return true;\n      case 'columnGap':\n        node.setGap(yoga.GUTTER_COLUMN, (value as LightningViewElementStyle['columnGap']) ?? 0);\n        return true;\n      case 'rowGap':\n        node.setGap(yoga.GUTTER_ROW, (value as LightningViewElementStyle['rowGap']) ?? 0);\n        return true;\n      case 'position':\n        node.setPositionType(mapPosition(yoga, value));\n        return true;\n      case 'right':\n        node.setPosition(yoga.EDGE_RIGHT, (value as LightningViewElementStyle['right']) ?? 0);\n        return true;\n      case 'bottom':\n        node.setPosition(yoga.EDGE_BOTTOM, (value as LightningViewElementStyle['bottom']) ?? 0);\n        return true;\n      case 'left':\n        node.setPosition(yoga.EDGE_LEFT, (value as LightningViewElementStyle['left']) ?? 0);\n        return true;\n      case 'top':\n        node.setPosition(yoga.EDGE_TOP, (value as LightningViewElementStyle['top']) ?? 0);\n        return true;\n    }\n  } catch (err) {\n    console.error(err);\n  }\n\n  return false;\n}\n","import { EventEmitter } from 'tseep';\nimport { type Config, loadYoga, type Yoga } from 'yoga-layout/load';\n\nimport type { LightningElementStyle, Rect } from '@plextv/react-lightning';\n\nimport type { ManagerNode } from './types/ManagerNode';\nimport type { YogaOptions } from './types/YogaOptions';\nimport applyReactPropsToYoga, { applyFlexPropToYoga } from './util/applyReactPropsToYoga';\nimport { SimpleDataView } from './util/SimpleDataView';\n\nexport type BatchedUpdate = Record<number, Partial<Rect>>;\n\nexport type YogaManagerEvents = {\n  // Updates are sent in an array. This is because when working with web\n  // workers, it's more efficient to transfer an array instead of serializing\n  // values and sending them over postMessage. The first 32 unsigned bits of the\n  // array are reserved for the number of elements being updated. The rest of the\n  // array contains the updates for each element. The data structure is as follows:\n  //   uint32 - The element ID of the element being updated\n  //   int16 - The x coordinate of the element\n  //   int16 - The y coordinate of the element\n  //   int16 - The width of the element\n  //   int16 - The height of the element\n  render: (updates: ArrayBuffer) => void;\n};\n\n// elementId + x + y + width + height, as per spec above\nconst APPROX_SIZEOF_UPDATE = 4 + 2 + 2 + 2 + 2;\n// 10KB, should be enough for most updates. If it's bigger than this, we'll chunk the updates\nconst MAX_SIZEOF_UPDATE = 1024 * 10;\n\nexport class YogaManager {\n  private _elementMap: Map<number, ManagerNode> = new Map();\n  private _hiddenElements: Set<number> = new Set();\n  private _independentRoots: Set<ManagerNode> = new Set();\n  private _yoga?: Yoga;\n  private _config?: Config;\n  private _initialized = false;\n  private _isRenderQueued = false;\n  private _yogaOptions: Required<YogaOptions> = {\n    useWebDefaults: false,\n    errata: 'none',\n    processHiddenNodes: false,\n    useWebWorker: false,\n    expandToAutoFlexBasis: false,\n  };\n  private _eventEmitter: EventEmitter<YogaManagerEvents> = new EventEmitter();\n  private _dataView: SimpleDataView;\n\n  public on: EventEmitter<YogaManagerEvents>['on'] = this._eventEmitter.on.bind(this._eventEmitter);\n  public off: EventEmitter<YogaManagerEvents>['off'] = this._eventEmitter.off.bind(\n    this._eventEmitter,\n  );\n\n  public get initialized(): boolean {\n    return this._initialized;\n  }\n\n  public constructor() {\n    this._dataView = new SimpleDataView(MAX_SIZEOF_UPDATE, true, this._flushArrayBuffer);\n  }\n\n  public async init(yogaOptions?: YogaOptions): Promise<void> {\n    Object.assign(this._yogaOptions, yogaOptions);\n\n    this._yoga = await loadYoga();\n    this._config = this._yoga.Config.create();\n    this._config.setUseWebDefaults(this._yogaOptions.useWebDefaults);\n\n    switch (this._yogaOptions.errata) {\n      case 'all':\n        this._config.setErrata(this._yoga.ERRATA_ALL);\n        break;\n      case 'classic':\n        this._config.setErrata(this._yoga.ERRATA_CLASSIC);\n        break;\n      case 'stretch-flex-basis':\n        this._config.setErrata(this._yoga.ERRATA_STRETCH_FLEX_BASIS);\n        break;\n      case 'absolute-percent-against-inner':\n        this._config.setErrata(this._yoga.ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE);\n        break;\n      case 'absolute-position-without-insets':\n        this._config.setErrata(this._yoga.ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING);\n        break;\n      default:\n        this._config.setErrata(this._yoga.ERRATA_NONE);\n        break;\n    }\n\n    this._initialized = true;\n  }\n\n  public addNode(elementId: number): ManagerNode {\n    if (this._elementMap.has(elementId)) {\n      // oxlint-disable-next-line typescript/no-non-null-assertion -- Already checked\n      return this._elementMap.get(elementId)!;\n    }\n\n    const node = this._createNode(elementId);\n\n    this._elementMap.set(elementId, node);\n\n    return node;\n  }\n\n  public removeNode(elementId: number): void {\n    const yogaNode = this._elementMap.get(elementId);\n\n    if (yogaNode) {\n      yogaNode.node.free();\n\n      // Remove the node from its parent's children array\n      if (yogaNode.parent) {\n        const index = yogaNode.parent.children.indexOf(yogaNode);\n\n        if (index !== -1) {\n          yogaNode.parent.children.splice(index, 1);\n        }\n      }\n\n      this._elementMap.delete(elementId);\n    }\n  }\n\n  public addChildNode(parentId: number, childId: number, index?: number): void {\n    const parentYogaNode = this._elementMap.get(parentId);\n    const childYogaNode = this._elementMap.get(childId);\n\n    if (!parentYogaNode || !childYogaNode) {\n      throw new Error(`Parent or child node not found for IDs ${parentId} and ${childId}.`);\n    }\n\n    index ??= childYogaNode.children.length;\n\n    parentYogaNode.node.insertChild(childYogaNode.node, index);\n    parentYogaNode.children.splice(index, 0, childYogaNode);\n    childYogaNode.parent = parentYogaNode;\n  }\n\n  public detachChildNode(parentId: number, childId: number): void {\n    const parentYogaNode = this._elementMap.get(parentId);\n    const childYogaNode = this._elementMap.get(childId);\n\n    if (!parentYogaNode || !childYogaNode) {\n      return;\n    }\n\n    const idx = parentYogaNode.children.indexOf(childYogaNode);\n\n    if (idx === -1) {\n      return;\n    }\n\n    parentYogaNode.node.removeChild(childYogaNode.node);\n    parentYogaNode.children.splice(idx, 1);\n    childYogaNode.parent = undefined;\n  }\n\n  public addIndependentRoot(elementId: number): void {\n    const node = this._elementMap.get(elementId);\n\n    if (node) {\n      this._independentRoots.add(node);\n    }\n  }\n\n  public removeIndependentRoot(elementId: number): void {\n    const node = this._elementMap.get(elementId);\n\n    if (node) {\n      this._independentRoots.delete(node);\n    }\n  }\n\n  public queueRender(_elementId: number, force = false): void {\n    if (!this._initialized || !this._yoga) {\n      throw new Error('Yoga is not initialized! Did you call `init()`?');\n    }\n\n    if (this._isRenderQueued) {\n      return;\n    }\n\n    this._isRenderQueued = true;\n\n    // Microtask runs AFTER the current synchronous batch of style/node\n    // ops (arriving from postMessage handlers); setTimeout's 1ms+ minimum\n    // would fragment a batch into many render passes.\n    queueMicrotask(() => {\n      this._isRenderQueued = false;\n\n      if (this._independentRoots.size === 0) {\n        return;\n      }\n\n      this._initializeArrayBuffer();\n\n      for (const independentRoot of this._independentRoots) {\n        // undefined available size → yoga uses the root's own w/h (or\n        // shrink-to-fit). Passing 1920×1080 would stretch any unset axis\n        // and break measurement-driven roots like VirtualList cells.\n        independentRoot.node.calculateLayout(\n          undefined,\n          undefined,\n          // oxlint-disable-next-line typescript/no-non-null-assertion -- Already checked this._yoga above\n          this._yoga!.DIRECTION_LTR,\n        );\n        this._getUpdatedStyles(independentRoot, force);\n      }\n\n      this._flushArrayBuffer(this._dataView.buffer);\n    });\n  }\n\n  public applyStyles(\n    styles: Record<number, Partial<LightningElementStyle>>,\n    skipRender = false,\n  ): void {\n    if (!this._initialized) {\n      throw new Error('Yoga was not initialized! Did you call `init()`?');\n    }\n\n    // `for...in` skips the [key, value] tuple allocation of Object.entries —\n    // this is a hot path on every flushBoth/applyStyles message.\n    for (const elementId in styles) {\n      // oxlint-disable-next-line typescript/no-non-null-assertion -- key from for..in iteration of own props\n      this.applyStyle(+elementId, styles[elementId as unknown as number]!, skipRender);\n    }\n  }\n\n  public applyStyle(\n    elementId: number,\n    style: Partial<LightningElementStyle> | null,\n    skipRender = false,\n  ): void {\n    if (!style) {\n      return;\n    }\n\n    if (!this._initialized || !this._yoga || !this._config) {\n      throw new Error('Yoga was not initialized! Did you call `init()`?');\n    }\n\n    const yogaNode = this._elementMap.get(elementId);\n\n    if (!yogaNode) {\n      console.warn(`Yoga node with ID ${elementId} not found.`);\n\n      return;\n    }\n\n    applyReactPropsToYoga(this._yoga, this._yogaOptions, yogaNode, style);\n\n    if (style.transform) {\n      const { x, y, transform } = style;\n\n      // Apply transforms after all the styles are applied\n      if (transform) {\n        const { translateX, translateY } = transform;\n\n        if (translateX != null) {\n          const left = x ?? 0;\n\n          applyFlexPropToYoga(\n            this._yoga,\n            this._yogaOptions,\n            yogaNode.node,\n            'left',\n            left + translateX,\n          );\n        }\n\n        if (translateY != null) {\n          const top = y ?? 0;\n\n          applyFlexPropToYoga(\n            this._yoga,\n            this._yogaOptions,\n            yogaNode.node,\n            'top',\n            top + translateY,\n          );\n        }\n      }\n    }\n\n    if (!skipRender) {\n      this.queueRender(elementId);\n    }\n  }\n\n  private _flushArrayBuffer(buffer: ArrayBuffer) {\n    // Emit the current buffer\n    this._eventEmitter.emit('render', buffer);\n    this._initializeArrayBuffer();\n  }\n\n  private _initializeArrayBuffer() {\n    this._dataView.reset();\n  }\n\n  private _createNode(elementId: number): ManagerNode {\n    if (!this._initialized || !this._yoga || !this._config) {\n      throw new Error('Yoga was not initialized! Did you call `init()`?');\n    }\n\n    const node = this._yoga.Node.create(this._config);\n    const yogaNode = {\n      id: elementId,\n      node,\n      children: [],\n      props: {},\n    };\n\n    this._elementMap.set(elementId, yogaNode);\n\n    return yogaNode;\n  }\n\n  // Recursion is unconditional — yoga's hasNewLayout is per-node, so a\n  // child's layout can change even when the parent's didn't (absolute\n  // children, just-attached subtrees from _reattachChildren).\n  private _getUpdatedStyles(yogaNode: ManagerNode, force = false) {\n    const skipHiddenNode =\n      !this._yogaOptions.processHiddenNodes && this._hiddenElements.has(yogaNode.id);\n\n    if (!skipHiddenNode && (force || yogaNode.node.hasNewLayout())) {\n      if (!this._dataView.hasSpace(APPROX_SIZEOF_UPDATE)) {\n        this._flushArrayBuffer(this._dataView.buffer);\n      }\n\n      // Individual getters instead of getComputedLayout() — that allocates\n      // a {left, top, width, height} object per node, and we recurse the\n      // entire yoga tree every layout pass.\n      const node = yogaNode.node;\n\n      // Direct DataView writes — hasSpace above already validated the full\n      // 12-byte run, so per-call overflow checks are pure overhead here.\n      const view = this._dataView.dataView;\n      const offset = this._dataView.offset;\n\n      view.setUint32(offset, yogaNode.id, true);\n      view.setInt16(offset + 4, node.getComputedLeft(), true);\n      view.setInt16(offset + 6, node.getComputedTop(), true);\n      view.setInt16(offset + 8, node.getComputedWidth(), true);\n      view.setInt16(offset + 10, node.getComputedHeight(), true);\n      this._dataView.advance(APPROX_SIZEOF_UPDATE);\n\n      node.markLayoutSeen();\n    }\n\n    const children = yogaNode.children;\n\n    for (let i = 0, len = children.length; i < len; i++) {\n      // oxlint-disable-next-line typescript/no-non-null-assertion -- length-bounded\n      this._getUpdatedStyles(children[i]!, force);\n    }\n  }\n}\n"],"mappings":"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"}