{"version":3,"file":"ResizeManager.js","names":["item: ObservedGridNodes | ObservedAnnotationNodes | undefined","update: CodeColumnUpdate"],"sources":["../../src/managers/ResizeManager.ts"],"sourcesContent":["import type { ObservedAnnotationNodes, ObservedGridNodes } from '../types';\n\ntype CodeColumnUpdate = [HTMLElement, number];\n\nexport class ResizeManager {\n  private observedNodes = new Map<\n    HTMLElement,\n    ObservedAnnotationNodes | ObservedGridNodes\n  >();\n  private queuedUpdates: Map<ObservedGridNodes, CodeColumnUpdate[]> = new Map();\n\n  cleanUp(): void {\n    // Disconnect any existing observer\n    this.resizeObserver?.disconnect();\n    this.observedNodes.clear();\n    this.queuedUpdates.clear();\n  }\n\n  private resizeObserver: ResizeObserver | undefined;\n\n  setup(pre: HTMLPreElement, disableAnnotations: boolean): void {\n    this.resizeObserver ??= new ResizeObserver(this.handleResizeObserver);\n    const codeElements = pre.querySelectorAll('code');\n\n    const observedNodes = new Map(this.observedNodes);\n    this.observedNodes.clear();\n    for (const codeElement of codeElements) {\n      let item: ObservedGridNodes | ObservedAnnotationNodes | undefined =\n        observedNodes.get(codeElement);\n      if (item != null && item.type !== 'code') {\n        throw new Error(\n          'ResizeManager.setup: somehow a code node is being used for an annotation, should be impossible'\n        );\n      }\n\n      let numberElement = codeElement.firstElementChild;\n      if (!(numberElement instanceof HTMLElement)) {\n        numberElement = null;\n      }\n\n      if (item != null) {\n        this.observedNodes.set(codeElement, item);\n        observedNodes.delete(codeElement);\n        if (item.numberElement !== numberElement) {\n          if (item.numberElement != null) {\n            this.resizeObserver.unobserve(item.numberElement);\n          }\n          if (numberElement != null) {\n            this.resizeObserver.observe(numberElement);\n            observedNodes.delete(numberElement);\n            this.observedNodes.set(numberElement, item);\n          }\n          item.numberElement = numberElement;\n        } else if (item.numberElement != null) {\n          observedNodes.delete(item.numberElement);\n          this.observedNodes.set(item.numberElement, item);\n        }\n      } else {\n        item = {\n          type: 'code',\n          codeElement,\n          numberElement,\n          codeWidth: 'auto',\n          numberWidth: 0,\n        };\n        this.observedNodes.set(codeElement, item);\n        this.resizeObserver.observe(codeElement);\n        if (numberElement != null) {\n          this.observedNodes.set(numberElement, item);\n          this.resizeObserver.observe(numberElement);\n        }\n      }\n    }\n\n    if (codeElements.length > 1 && !disableAnnotations) {\n      const annotationElements = pre.querySelectorAll(\n        '[data-line-annotation*=\",\"]'\n      );\n\n      const elementMap = new Map<string, HTMLElement[]>();\n      for (const element of annotationElements) {\n        if (!(element instanceof HTMLElement)) {\n          continue;\n        }\n        const { lineAnnotation = '' } = element.dataset;\n        if (!/^\\d+,\\d+$/.test(lineAnnotation)) {\n          console.error(\n            'DiffFileRenderer.setupResizeObserver: Invalid element or annotation',\n            { lineAnnotation, element }\n          );\n          continue;\n        }\n        let pairs = elementMap.get(lineAnnotation);\n        if (pairs == null) {\n          pairs = [];\n          elementMap.set(lineAnnotation, pairs);\n        }\n        pairs.push(element);\n      }\n\n      for (const [key, pair] of elementMap) {\n        if (pair.length !== 2) {\n          console.error(\n            'DiffFileRenderer.setupResizeObserver: Bad Pair',\n            key,\n            pair\n          );\n          continue;\n        }\n        const [container1, container2] = pair;\n        const child1 = container1.firstElementChild;\n        const child2 = container2.firstElementChild;\n        if (\n          !(container1 instanceof HTMLElement) ||\n          !(container2 instanceof HTMLElement) ||\n          !(child1 instanceof HTMLElement) ||\n          !(child2 instanceof HTMLElement)\n        ) {\n          continue;\n        }\n\n        let item = observedNodes.get(child1);\n\n        if (item != null) {\n          this.observedNodes.set(child1, item);\n          this.observedNodes.set(child2, item);\n          observedNodes.delete(child1);\n          observedNodes.delete(child2);\n          continue;\n        }\n\n        item = {\n          type: 'annotations',\n          column1: {\n            container: container1,\n            child: child1,\n            childHeight: child1.getBoundingClientRect().height,\n          },\n          column2: {\n            container: container2,\n            child: child2,\n            childHeight: child2.getBoundingClientRect().height,\n          },\n          currentHeight: 'auto',\n        };\n\n        const newHeight = Math.max(\n          item.column1.childHeight,\n          item.column2.childHeight\n        );\n        this.applyNewHeight(item, newHeight);\n\n        this.observedNodes.set(child1, item);\n        this.observedNodes.set(child2, item);\n        this.resizeObserver.observe(child1);\n        this.resizeObserver.observe(child2);\n      }\n    }\n\n    for (const element of observedNodes.keys()) {\n      if (element.isConnected) {\n        element.style.removeProperty('--diffs-column-content-width');\n        element.style.removeProperty('--diffs-column-number-width');\n        element.style.removeProperty('--diffs-column-width');\n        if (element.parentElement instanceof HTMLElement) {\n          element.parentElement.style.removeProperty(\n            '--diffs-annotation-min-height'\n          );\n        }\n      }\n      this.resizeObserver.unobserve(element);\n    }\n    observedNodes.clear();\n  }\n\n  private handleResizeObserver = (entries: ResizeObserverEntry[]) => {\n    for (const entry of entries) {\n      const { target, borderBoxSize, contentBoxSize } = entry;\n      if (!(target instanceof HTMLElement)) {\n        console.error(\n          'FileDiff.handleResizeObserver: Invalid element for ResizeObserver',\n          entry\n        );\n        continue;\n      }\n      const item = this.observedNodes.get(target);\n      if (item == null) {\n        console.error(\n          'FileDiff.handleResizeObserver: Not a valid observed node',\n          entry\n        );\n        continue;\n      }\n      if (item.type === 'annotations') {\n        const column = (() => {\n          if (target === item.column1.child) {\n            return item.column1;\n          }\n          if (target === item.column2.child) {\n            return item.column2;\n          }\n          return undefined;\n        })();\n\n        if (column == null) {\n          console.error(\n            `FileDiff.handleResizeObserver: Couldn't find a column for`,\n            { item, target }\n          );\n          continue;\n        }\n\n        column.childHeight = borderBoxSize[0].blockSize;\n        const newHeight = Math.max(\n          item.column1.childHeight,\n          item.column2.childHeight\n        );\n        this.applyNewHeight(item, newHeight);\n      } else if (item.type === 'code') {\n        const update: CodeColumnUpdate = [target, contentBoxSize[0].inlineSize];\n        const updates = this.queuedUpdates.get(item) ?? [];\n        updates.push(update);\n        this.queuedUpdates.set(item, updates);\n      }\n    }\n    this.handleColumnChange();\n  };\n\n  private handleColumnChange = () => {\n    for (const [item, updates] of this.queuedUpdates) {\n      for (const [target, targetInlineSize] of updates) {\n        // FIXME(amadeus): This needs to be re-worked with display: contents,\n        // not sure setting to auto is a good assumption most of the time...\n        if (target === item.codeElement) {\n          const inlineSize = Math.max(Math.floor(targetInlineSize), 0);\n          if (inlineSize !== item.codeWidth) {\n            const targetWidth = Math.max(inlineSize - item.numberWidth, 0);\n            item.codeWidth = inlineSize === 0 ? 'auto' : inlineSize;\n            item.codeElement.style.setProperty(\n              '--diffs-column-content-width',\n              `${targetWidth > 0 ? `${targetWidth}px` : 'auto'}`\n            );\n            item.codeElement.style.setProperty(\n              '--diffs-column-width',\n              `${typeof item.codeWidth === 'number' ? `${item.codeWidth}px` : 'auto'}`\n            );\n          }\n          if (\n            item.numberElement != null &&\n            typeof item.codeWidth === 'number' &&\n            item.numberWidth === 0\n          ) {\n            updates.push([\n              item.numberElement,\n              item.numberElement.getBoundingClientRect().width,\n            ]);\n          }\n        } else if (target === item.numberElement) {\n          const inlineSize = Math.max(Math.ceil(targetInlineSize), 0);\n          if (inlineSize !== item.numberWidth) {\n            item.numberWidth = inlineSize;\n            item.codeElement.style.setProperty(\n              '--diffs-column-number-width',\n              `${item.numberWidth === 0 ? 'auto' : `${item.numberWidth}px`}`\n            );\n            // We probably need to update code width variable if\n            // `numberWidth` changed\n            if (item.codeWidth !== 'auto') {\n              const targetWidth = Math.max(\n                item.codeWidth - item.numberWidth,\n                0\n              );\n              item.codeElement.style.setProperty(\n                '--diffs-column-content-width',\n                `${targetWidth === 0 ? 'auto' : `${targetWidth}px`}`\n              );\n            }\n          }\n        }\n      }\n    }\n    this.queuedUpdates.clear();\n  };\n\n  private applyNewHeight(item: ObservedAnnotationNodes, newHeight: number) {\n    if (newHeight !== item.currentHeight) {\n      item.currentHeight = Math.max(newHeight, 0);\n      item.column1.container.style.setProperty(\n        '--diffs-annotation-min-height',\n        `${item.currentHeight}px`\n      );\n      item.column2.container.style.setProperty(\n        '--diffs-annotation-min-height',\n        `${item.currentHeight}px`\n      );\n    }\n  }\n}\n"],"mappings":"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"}