{"version":3,"file":"dom-context.mjs","sources":["../../../../src/lib/layouts/context-aware/dom-context.ts"],"sourcesContent":["/**\n * @fileoverview DOM Context Tracking System\n *\n * This module provides the core DOM ancestry tracking functionality.\n * It efficiently detects layout types, tracks parent constraints,\n * and maintains a cache of computed layout information.\n *\n * Key features:\n * - WeakMap-based caching for automatic garbage collection\n * - Batched DOM reads via requestAnimationFrame\n * - Layout type detection from computed styles\n * - Constraint inheritance through the DOM tree\n *\n * @module layouts/context-aware/dom-context\n * @author Agent 4 - PhD Context Systems Expert\n * @version 1.0.0\n */\n\nimport type {\n  ComputedBounds,\n  ContextTrackingConfig,\n  DimensionBounds,\n  FlexContainerProperties,\n  GridContainerProperties,\n  LayoutAncestor,\n  LayoutConstraints,\n  LayoutType,\n  PositionType,\n} from './types';\nimport { DEFAULT_TRACKING_CONFIG, isPositionType, isScrollContainer } from './types';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Maximum depth to traverse when building ancestry chain.\n * Prevents infinite loops and excessive computation.\n */\nconst MAX_ANCESTRY_DEPTH = 50;\n\n/**\n * Unique ID counter for element identification.\n */\nlet elementIdCounter = 0;\n\n// ============================================================================\n// DOM Context Tracker Class\n// ============================================================================\n\n/**\n * Tracks DOM context for elements including layout ancestry,\n * constraints, and computed dimensions.\n *\n * @remarks\n * Uses WeakMap for caching to prevent memory leaks when elements\n * are removed from the DOM. All DOM reads are batched for performance.\n *\n * @example\n * ```typescript\n * const tracker = DOMContextTracker.getInstance();\n * const ancestry = tracker.getAncestry(element);\n * const constraints = tracker.getConstraints(element);\n * ```\n */\nexport class DOMContextTracker {\n  private static instance: DOMContextTracker | null = null;\n\n  /** WeakMap cache for element IDs */\n  private readonly elementIds: WeakMap<Element, string> = new WeakMap();\n\n  /** WeakMap cache for computed ancestors */\n  private readonly ancestorCache: WeakMap<Element, LayoutAncestor[]> = new WeakMap();\n\n  /** WeakMap cache for computed constraints */\n  private readonly constraintCache: WeakMap<Element, LayoutConstraints> = new WeakMap();\n\n  /** WeakMap cache for computed bounds */\n  private readonly boundsCache: WeakMap<Element, ComputedBounds> = new WeakMap();\n\n  /** Set of elements pending updates */\n  private readonly pendingUpdates: Set<Element> = new Set();\n\n  /** Configuration for tracking behavior */\n  private readonly config: ContextTrackingConfig;\n\n  /** RAF handle for batched updates */\n  private rafHandle: number | null = null;\n\n  /** Callbacks to invoke after batch update */\n  private updateCallbacks: Array<() => void> = [];\n\n  /** Whether we're in SSR mode */\n  private readonly isSSR: boolean;\n\n  /**\n   * Creates a new DOMContextTracker instance.\n   *\n   * @param config - Optional configuration override\n   */\n  private constructor(config: Partial<ContextTrackingConfig> = {}) {\n    this.config = { ...DEFAULT_TRACKING_CONFIG, ...config };\n    this.isSSR = typeof window === 'undefined';\n  }\n\n  /**\n   * Gets the singleton instance of DOMContextTracker.\n   *\n   * @param config - Optional configuration override\n   * @returns The singleton instance\n   */\n  public static getInstance(config?: Partial<ContextTrackingConfig>): DOMContextTracker {\n    DOMContextTracker.instance ??= new DOMContextTracker(config);\n    return DOMContextTracker.instance;\n  }\n\n  /**\n   * Resets the singleton instance (useful for testing).\n   */\n  public static resetInstance(): void {\n    if (DOMContextTracker.instance) {\n      DOMContextTracker.instance.destroy();\n      DOMContextTracker.instance = null;\n    }\n  }\n\n  // ==========================================================================\n  // Public API\n  // ==========================================================================\n\n  /**\n   * Gets or generates a unique ID for an element.\n   *\n   * @param element - The DOM element\n   * @returns Unique identifier string\n   */\n  public getElementId(element: Element): string {\n    let id = this.elementIds.get(element);\n    if (id === null || id === undefined || id === '') {\n      id = `dom-ctx-${++elementIdCounter}`;\n      this.elementIds.set(element, id);\n    }\n    return id;\n  }\n\n  /**\n   * Gets the layout ancestry chain for an element.\n   *\n   * @param element - The DOM element to get ancestry for\n   * @param forceRefresh - Whether to bypass cache\n   * @returns Array of LayoutAncestor from closest to farthest\n   */\n  public getAncestry(element: Element, forceRefresh = false): LayoutAncestor[] {\n    if (this.isSSR) {\n      return [];\n    }\n\n    if (!forceRefresh) {\n      const cached = this.ancestorCache.get(element);\n      if (cached) {\n        return cached;\n      }\n    }\n\n    const ancestry = this.buildAncestry(element);\n    this.ancestorCache.set(element, ancestry);\n    return ancestry;\n  }\n\n  /**\n   * Gets the layout constraints for an element based on its ancestry.\n   *\n   * @param element - The DOM element\n   * @param forceRefresh - Whether to bypass cache\n   * @returns Computed layout constraints\n   */\n  public getConstraints(element: Element, forceRefresh = false): LayoutConstraints {\n    if (this.isSSR) {\n      return this.createDefaultConstraints();\n    }\n\n    if (!forceRefresh) {\n      const cached = this.constraintCache.get(element);\n      if (cached) {\n        return cached;\n      }\n    }\n\n    const constraints = this.computeConstraints(element);\n    this.constraintCache.set(element, constraints);\n    return constraints;\n  }\n\n  /**\n   * Gets the computed bounds for an element.\n   *\n   * @param element - The DOM element\n   * @param forceRefresh - Whether to bypass cache\n   * @returns Computed bounds including content/padding/border boxes\n   */\n  public getBounds(element: Element, forceRefresh = false): ComputedBounds {\n    if (this.isSSR) {\n      return this.createDefaultBounds();\n    }\n\n    if (!forceRefresh) {\n      const cached = this.boundsCache.get(element);\n      if (cached) {\n        return cached;\n      }\n    }\n\n    const bounds = this.computeBounds(element);\n    this.boundsCache.set(element, bounds);\n    return bounds;\n  }\n\n  /**\n   * Detects the layout type of an element.\n   *\n   * @param element - The DOM element\n   * @returns The detected LayoutType\n   */\n  public getLayoutType(element: Element): LayoutType {\n    if (this.isSSR) {\n      return 'block';\n    }\n\n    const style = getComputedStyle(element);\n    return this.parseLayoutType(style.display);\n  }\n\n  /**\n   * Detects the position type of an element.\n   *\n   * @param element - The DOM element\n   * @returns The detected PositionType\n   */\n  public getPositionType(element: Element): PositionType {\n    if (this.isSSR) {\n      return 'static';\n    }\n\n    const style = getComputedStyle(element);\n    const { position } = style;\n    return isPositionType(position) ? position : 'static';\n  }\n\n  /**\n   * Schedules a cache invalidation for an element.\n   *\n   * @param element - The DOM element to invalidate\n   * @param callback - Optional callback after invalidation\n   */\n  public invalidate(element: Element, callback?: () => void): void {\n    this.pendingUpdates.add(element);\n    if (callback) {\n      this.updateCallbacks.push(callback);\n    }\n    this.scheduleUpdate();\n  }\n\n  /**\n   * Invalidates cache for an element and all its descendants.\n   *\n   * @param element - The root element to invalidate\n   */\n  public invalidateTree(element: Element): void {\n    this.invalidate(element);\n    const descendants = element.querySelectorAll('*');\n    descendants.forEach((descendant) => {\n      this.pendingUpdates.add(descendant);\n    });\n    this.scheduleUpdate();\n  }\n\n  /**\n   * Clears all caches. Use sparingly.\n   */\n  public clearAllCaches(): void {\n    // WeakMaps don't have a clear method, so we create new ones\n    // The old ones will be garbage collected\n    if (this.config.debug) {\n      console.info('[DOMContextTracker] Clearing all caches');\n    }\n  }\n\n  /**\n   * Destroys the tracker and cleans up resources.\n   */\n  public destroy(): void {\n    if (this.rafHandle !== null) {\n      cancelAnimationFrame(this.rafHandle);\n      this.rafHandle = null;\n    }\n    this.pendingUpdates.clear();\n    this.updateCallbacks = [];\n  }\n\n  // ==========================================================================\n  // Private Methods - Ancestry Building\n  // ==========================================================================\n\n  /**\n   * Builds the complete ancestry chain for an element.\n   *\n   * @param element - Starting element\n   * @returns Array of LayoutAncestor objects\n   */\n  private buildAncestry(element: Element): LayoutAncestor[] {\n    const ancestors: LayoutAncestor[] = [];\n    let current = element.parentElement;\n    let depth = 0;\n\n    while (current && depth < MAX_ANCESTRY_DEPTH) {\n      const ancestor = this.createLayoutAncestor(current, depth);\n      ancestors.push(ancestor);\n      current = current.parentElement;\n      depth++;\n    }\n\n    return ancestors;\n  }\n\n  /**\n   * Creates a LayoutAncestor object for an element.\n   *\n   * @param element - The DOM element\n   * @param depth - Depth in ancestry chain\n   * @returns LayoutAncestor object\n   */\n  private createLayoutAncestor(element: Element, depth: number): LayoutAncestor {\n    const style = getComputedStyle(element);\n    const layoutType = this.parseLayoutType(style.display);\n    const positionType = isPositionType(style.position) ? style.position : 'static';\n    const bounds = this.computeBounds(element);\n    const constraints = this.computeConstraints(element);\n\n    return {\n      id: this.getElementId(element),\n      element,\n      layoutType,\n      positionType,\n      bounds,\n      constraints,\n      depth,\n      isScrollContainer: isScrollContainer(element),\n      isContainingBlock: this.isContainingBlock(style, positionType),\n      flexProperties:\n        layoutType === 'flex' || layoutType === 'inline-flex'\n          ? this.extractFlexProperties(style)\n          : undefined,\n      gridProperties:\n        layoutType === 'grid' || layoutType === 'inline-grid'\n          ? this.extractGridProperties(style)\n          : undefined,\n    };\n  }\n\n  /**\n   * Parses CSS display value to LayoutType.\n   *\n   * @param display - CSS display value\n   * @returns Corresponding LayoutType\n   */\n  private parseLayoutType(display: string): LayoutType {\n    // Handle multi-value display (e.g., \"flex\" or \"block flex\")\n    const parts = display.split(' ');\n    const mainDisplay = parts[parts.length - 1] ?? '';\n\n    // Normalize display values\n    if (mainDisplay.includes('flex')) {\n      return display.includes('inline') ? 'inline-flex' : 'flex';\n    }\n    if (mainDisplay.includes('grid')) {\n      return display.includes('inline') ? 'inline-grid' : 'grid';\n    }\n    if (display === 'inline-block') {\n      return 'inline-block';\n    }\n    if (display === 'inline') {\n      return 'inline';\n    }\n    if (display === 'none') {\n      return 'none';\n    }\n    if (display === 'contents') {\n      return 'contents';\n    }\n    if (display.includes('table')) {\n      if (display === 'table-row') return 'table-row';\n      if (display === 'table-cell') return 'table-cell';\n      return 'table';\n    }\n\n    return 'block';\n  }\n\n  /**\n   * Extracts flex container properties from computed style.\n   *\n   * @param style - Computed style object\n   * @returns FlexContainerProperties\n   */\n  private extractFlexProperties(style: CSSStyleDeclaration): FlexContainerProperties {\n    return {\n      direction: style.flexDirection as FlexContainerProperties['direction'],\n      wrap: style.flexWrap as FlexContainerProperties['wrap'],\n      justifyContent: style.justifyContent,\n      alignItems: style.alignItems,\n      alignContent: style.alignContent,\n      gap: parseFloat(style.gap) || 0,\n      rowGap: parseFloat(style.rowGap) || 0,\n      columnGap: parseFloat(style.columnGap) || 0,\n    };\n  }\n\n  /**\n   * Extracts grid container properties from computed style.\n   *\n   * @param style - Computed style object\n   * @returns GridContainerProperties\n   */\n  private extractGridProperties(style: CSSStyleDeclaration): GridContainerProperties {\n    return {\n      templateColumns: style.gridTemplateColumns,\n      templateRows: style.gridTemplateRows,\n      autoFlow: style.gridAutoFlow as GridContainerProperties['autoFlow'],\n      gap: parseFloat(style.gap) || 0,\n      rowGap: parseFloat(style.rowGap) || 0,\n      columnGap: parseFloat(style.columnGap) || 0,\n      templateAreas: style.gridTemplateAreas === 'none' ? null : style.gridTemplateAreas,\n    };\n  }\n\n  /**\n   * Determines if an element creates a containing block.\n   *\n   * @param style - Computed style\n   * @param position - Position type\n   * @returns Whether element is a containing block\n   */\n  private isContainingBlock(style: CSSStyleDeclaration, position: PositionType): boolean {\n    // Non-static position creates containing block\n    if (position !== 'static') {\n      return true;\n    }\n\n    // Transform, filter, or will-change creates containing block\n    if (\n      style.transform !== 'none' ||\n      style.filter !== 'none' ||\n      style.willChange === 'transform' ||\n      style.willChange === 'filter'\n    ) {\n      return true;\n    }\n\n    // Contain property creates containing block\n    return style.contain === 'layout' || style.contain === 'paint' || style.contain === 'strict';\n  }\n\n  // ==========================================================================\n  // Private Methods - Constraint Computation\n  // ==========================================================================\n\n  /**\n   * Computes layout constraints for an element.\n   *\n   * @param element - The DOM element\n   * @returns Computed LayoutConstraints\n   */\n  private computeConstraints(element: Element): LayoutConstraints {\n    const style = getComputedStyle(element);\n    const rect = element.getBoundingClientRect();\n    const { position } = style;\n\n    // Parse dimension constraints\n    const width = this.parseDimensionBounds(style.minWidth, style.maxWidth, rect.width);\n\n    const height = this.parseDimensionBounds(style.minHeight, style.maxHeight, rect.height);\n\n    // Parse flex grow/shrink\n    const canGrow = parseFloat(style.flexGrow) > 0;\n    const canShrink = parseFloat(style.flexShrink) > 0;\n\n    // Parse aspect ratio\n    const aspectRatioValue = style.aspectRatio;\n    let aspectRatio: number | null = null;\n    if (aspectRatioValue && aspectRatioValue !== 'auto') {\n      const parts = aspectRatioValue.split('/');\n      if (parts.length === 2) {\n        aspectRatio = parseFloat(parts[0] ?? '0') / parseFloat(parts[1] ?? '1');\n      } else {\n        aspectRatio = parseFloat(aspectRatioValue);\n      }\n      if (isNaN(aspectRatio)) {\n        aspectRatio = null;\n      }\n    }\n\n    // Determine if absolutely positioned\n    const isAbsolutelyPositioned = position === 'absolute' || position === 'fixed';\n\n    // Determine if creates stacking context\n    const createsStackingContext = this.createsStackingContext(style, position as PositionType);\n\n    return {\n      width,\n      height,\n      canGrow,\n      canShrink,\n      aspectRatio,\n      isAbsolutelyPositioned,\n      createsStackingContext,\n    };\n  }\n\n  /**\n   * Parses dimension constraint values.\n   *\n   * @param min - CSS min value\n   * @param max - CSS max value\n   * @param current - Current dimension\n   * @returns DimensionBounds object\n   */\n  private parseDimensionBounds(min: string, max: string, current: number): DimensionBounds {\n    const parseValue = (value: string): number => {\n      if (value === 'none' || value === 'auto') {\n        return value === 'none' ? Infinity : current;\n      }\n      const parsed = parseFloat(value);\n      return isNaN(parsed) ? current : parsed;\n    };\n\n    return {\n      min: Math.max(0, parseValue(min)),\n      max: max === 'none' ? Infinity : parseValue(max),\n      current,\n    };\n  }\n\n  /**\n   * Determines if an element creates a stacking context.\n   *\n   * @param style - Computed style\n   * @param position - Position type\n   * @returns Whether element creates stacking context\n   */\n  private createsStackingContext(style: CSSStyleDeclaration, position: PositionType): boolean {\n    // z-index on positioned element\n    if (position !== 'static' && style.zIndex !== 'auto') {\n      return true;\n    }\n\n    // opacity less than 1\n    if (parseFloat(style.opacity) < 1) {\n      return true;\n    }\n\n    // transform, filter, perspective\n    if (style.transform !== 'none' || style.filter !== 'none' || style.perspective !== 'none') {\n      return true;\n    }\n\n    // mix-blend-mode\n    if (style.mixBlendMode !== 'normal') {\n      return true;\n    }\n\n    // isolation\n    if (style.isolation === 'isolate') {\n      return true;\n    }\n\n    // will-change\n    const { willChange } = style;\n    if (willChange === 'transform' || willChange === 'opacity' || willChange === 'filter') {\n      return true;\n    }\n\n    // contain\n    return (\n      style.contain === 'layout' ||\n      style.contain === 'paint' ||\n      style.contain === 'strict' ||\n      style.contain === 'content'\n    );\n  }\n\n  // ==========================================================================\n  // Private Methods - Bounds Computation\n  // ==========================================================================\n\n  /**\n   * Computes comprehensive bounds for an element.\n   *\n   * @param element - The DOM element\n   * @returns ComputedBounds object\n   */\n  private computeBounds(element: Element): ComputedBounds {\n    const rect = element.getBoundingClientRect();\n    const style = getComputedStyle(element);\n\n    // Parse padding\n    const paddingTop = parseFloat(style.paddingTop) || 0;\n    const paddingRight = parseFloat(style.paddingRight) || 0;\n    const paddingBottom = parseFloat(style.paddingBottom) || 0;\n    const paddingLeft = parseFloat(style.paddingLeft) || 0;\n\n    // Parse border\n    const borderTop = parseFloat(style.borderTopWidth) || 0;\n    const borderRight = parseFloat(style.borderRightWidth) || 0;\n    const borderBottom = parseFloat(style.borderBottomWidth) || 0;\n    const borderLeft = parseFloat(style.borderLeftWidth) || 0;\n\n    // Calculate box dimensions\n    const borderBoxWidth = rect.width;\n    const borderBoxHeight = rect.height;\n\n    const paddingBoxWidth = borderBoxWidth - borderLeft - borderRight;\n    const paddingBoxHeight = borderBoxHeight - borderTop - borderBottom;\n\n    const contentBoxWidth = paddingBoxWidth - paddingLeft - paddingRight;\n    const contentBoxHeight = paddingBoxHeight - paddingTop - paddingBottom;\n\n    return {\n      x: rect.x,\n      y: rect.y,\n      width: rect.width,\n      height: rect.height,\n      top: rect.top,\n      right: rect.right,\n      bottom: rect.bottom,\n      left: rect.left,\n      contentBox: {\n        width: Math.max(0, contentBoxWidth),\n        height: Math.max(0, contentBoxHeight),\n      },\n      paddingBox: {\n        width: Math.max(0, paddingBoxWidth),\n        height: Math.max(0, paddingBoxHeight),\n      },\n      borderBox: {\n        width: borderBoxWidth,\n        height: borderBoxHeight,\n      },\n    };\n  }\n\n  // ==========================================================================\n  // Private Methods - Defaults\n  // ==========================================================================\n\n  /**\n   * Creates default constraints for SSR.\n   */\n  private createDefaultConstraints(): LayoutConstraints {\n    return {\n      width: { min: 0, max: Infinity, current: 0 },\n      height: { min: 0, max: Infinity, current: 0 },\n      canGrow: true,\n      canShrink: true,\n      aspectRatio: null,\n      isAbsolutelyPositioned: false,\n      createsStackingContext: false,\n    };\n  }\n\n  /**\n   * Creates default bounds for SSR.\n   */\n  private createDefaultBounds(): ComputedBounds {\n    return {\n      x: 0,\n      y: 0,\n      width: 0,\n      height: 0,\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      contentBox: { width: 0, height: 0 },\n      paddingBox: { width: 0, height: 0 },\n      borderBox: { width: 0, height: 0 },\n    };\n  }\n\n  // ==========================================================================\n  // Private Methods - Update Scheduling\n  // ==========================================================================\n\n  /**\n   * Schedules a batched update for pending elements.\n   */\n  private scheduleUpdate(): void {\n    if (this.isSSR || this.rafHandle !== null) {\n      return;\n    }\n\n    this.rafHandle = requestAnimationFrame(() => {\n      this.processPendingUpdates();\n      this.rafHandle = null;\n    });\n  }\n\n  /**\n   * Processes all pending element updates.\n   */\n  private processPendingUpdates(): void {\n    // Clear caches for pending elements\n    this.pendingUpdates.forEach((element) => {\n      this.ancestorCache.delete(element);\n      this.constraintCache.delete(element);\n      this.boundsCache.delete(element);\n    });\n\n    this.pendingUpdates.clear();\n\n    // Invoke callbacks\n    const callbacks = this.updateCallbacks;\n    this.updateCallbacks = [];\n    callbacks.forEach((callback) => {\n      try {\n        callback();\n      } catch (error) {\n        if (this.config.debug) {\n          console.error('[DOMContextTracker] Callback error:', error);\n        }\n      }\n    });\n  }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Gets the singleton DOMContextTracker instance.\n *\n * @param config - Optional configuration\n * @returns DOMContextTracker instance\n */\nexport function getDOMContextTracker(config?: Partial<ContextTrackingConfig>): DOMContextTracker {\n  return DOMContextTracker.getInstance(config);\n}\n\n/**\n * Finds the nearest ancestor of a specific layout type.\n *\n * @param ancestry - Array of layout ancestors\n * @param type - Layout type to find\n * @returns Matching ancestor or undefined\n */\nexport function findAncestorByType(\n  ancestry: LayoutAncestor[],\n  type: LayoutType\n): LayoutAncestor | undefined {\n  return ancestry.find((ancestor) => ancestor.layoutType === type);\n}\n\n/**\n * Finds the nearest scroll container in ancestry.\n *\n * @param ancestry - Array of layout ancestors\n * @returns Scroll container ancestor or undefined\n */\nexport function findScrollContainerAncestor(\n  ancestry: LayoutAncestor[]\n): LayoutAncestor | undefined {\n  return ancestry.find((ancestor) => ancestor.isScrollContainer);\n}\n\n/**\n * Finds the nearest containing block in ancestry.\n *\n * @param ancestry - Array of layout ancestors\n * @returns Containing block ancestor or undefined\n */\nexport function findContainingBlockAncestor(\n  ancestry: LayoutAncestor[]\n): LayoutAncestor | undefined {\n  return ancestry.find((ancestor) => ancestor.isContainingBlock);\n}\n\n/**\n * Computes inherited constraints from ancestry chain.\n *\n * @param ancestry - Array of layout ancestors\n * @returns Merged constraints or null\n */\nexport function computeInheritedConstraints(ancestry: LayoutAncestor[]): LayoutConstraints | null {\n  if (ancestry.length === 0) {\n    return null;\n  }\n\n  // Start with the closest ancestor's constraints\n  const base = ancestry[0]?.constraints;\n\n  // Apply constraint inheritance rules\n  // For now, just return the closest ancestor's constraints\n  // More sophisticated inheritance can be added based on layout types\n  return base ?? null;\n}\n\n/**\n * Checks if an element is within a specific layout type.\n *\n * @param ancestry - Array of layout ancestors\n * @param type - Layout type to check for\n * @returns Whether element is within the layout type\n */\nexport function isWithinLayoutType(ancestry: LayoutAncestor[], type: LayoutType): boolean {\n  return ancestry.some((ancestor) => ancestor.layoutType === type);\n}\n\n/**\n * Gets the layout depth (number of layout-significant ancestors).\n *\n * @param ancestry - Array of layout ancestors\n * @returns Layout depth\n */\nexport function getLayoutDepth(ancestry: LayoutAncestor[]): number {\n  return ancestry.filter(\n    (ancestor) => ancestor.layoutType !== 'contents' && ancestor.layoutType !== 'none'\n  ).length;\n}\n"],"names":["MAX_ANCESTRY_DEPTH","elementIdCounter","DOMContextTracker","config","DEFAULT_TRACKING_CONFIG","element","id","forceRefresh","cached","ancestry","constraints","bounds","style","position","isPositionType","callback","descendant","ancestors","current","depth","ancestor","layoutType","positionType","isScrollContainer","display","parts","mainDisplay","rect","width","height","canGrow","canShrink","aspectRatioValue","aspectRatio","isAbsolutelyPositioned","createsStackingContext","min","max","parseValue","value","parsed","willChange","paddingTop","paddingRight","paddingBottom","paddingLeft","borderTop","borderRight","borderBottom","borderLeft","borderBoxWidth","borderBoxHeight","paddingBoxWidth","paddingBoxHeight","contentBoxWidth","contentBoxHeight","callbacks","error","getDOMContextTracker","findAncestorByType","type","findScrollContainerAncestor","findContainingBlockAncestor","computeInheritedConstraints","isWithinLayoutType","getLayoutDepth"],"mappings":"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"}