{"version":3,"sources":["jsdelivr-header.js","/npm/squarify@1.1.0/src/index.ts"],"names":[],"mappings":"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","file":"/npm/squarify@1.1.0/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.19.2.\n * Original file: /npm/squarify@1.1.0/lib/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export type IDatum<Custom> = {\n  value: number\n  children?: Array<IDatum<Custom>>,\n} & Custom;\n\nexport type Input<Custom> = {\n  value: number,\n  children?: Array<Input<Custom>>,\n} & Custom;\n\nexport default function<Custom>(\n  data: Array<Input<Custom>>,\n  container: {x0: number, y0: number, x1: number, y1: number}) {\n\n  const x0 = container.x0;\n  const y0 = container.y0;\n  const x1 = container.x1;\n  const y1 = container.y1;\n\n  const input = {\n    x0, y0, x1, y1,\n    children: data,\n  } as ILayoutRect<Custom>;\n  return recurse(input);\n}\n\nexport type INormalizedDatum<Custom> = IDatum<Custom> & {\n  // this is the value after going through `normalizeData` function\n  normalizedValue: number,\n};\nexport interface IRect {\n  // Top-left corner:\n  x0: number;\n  y0: number;\n  // Bottom right corner:\n  x1: number;\n  y1: number;\n}\nexport type ILayoutRect<T> = IRect & INormalizedDatum<T>;\n\n// Calculate the max aspect ratio if a list of rectangles whose areas are contained in `row`\n// are laid out against a line of length `length`:\nexport const calculateMaxAspectRatio = <Custom>(row: Array<INormalizedDatum<Custom>>, length: number): number => {\n  const rowLength = row.length;\n  if (rowLength === 0) {\n    throw new Error('Inpupt ' + row + ' is an empty array');\n  } else {\n    let minArea = Infinity;\n    let maxArea = - Infinity;\n    let sumArea = 0;\n    for (let i = 0; i < rowLength; i += 1) {\n      const area = row[i].normalizedValue;\n      if (area < minArea) {\n        minArea = area;\n      }\n      if (area > maxArea) {\n        maxArea = area;\n      }\n      sumArea += area;\n    }\n    const result = Math.max(\n      (length ** 2) * maxArea / (sumArea ** 2),\n      (sumArea ** 2) / ((length ** 2) * minArea),\n    );\n    return result;\n  }\n};\n\nexport const doesAddingToRowImproveAspectRatio = <Custom>(\n    currentRow: Array<INormalizedDatum<Custom>>, nextDatum: INormalizedDatum<Custom>, length: number,\n  ) => {\n\n  if (currentRow.length === 0) {\n    return true;\n  } else {\n    const newRow = currentRow.concat(nextDatum);\n    const currentMaxAspectRatio = calculateMaxAspectRatio(currentRow, length);\n    const newMaxAspectRatio = calculateMaxAspectRatio(newRow, length);\n    return (currentMaxAspectRatio >= newMaxAspectRatio);\n  }\n};\n\n// Ensure that the sum of elements in `data` is equal to `area` (as per original algorithm):\nexport const normalizeData = <Custom>(data: Array<IDatum<Custom>>, area: number): Array<INormalizedDatum<Custom>> => {\n  const dataLength = data.length;\n  let dataSum = 0;\n  for (let i = 0; i < dataLength; i += 1) {\n    dataSum += data[i].value;\n  }\n\n  const multiplier = area / dataSum;\n  // TODO: use spread/rest type instead of `Object.assign` when bug with rest/spread has been fixed.\n  const result: Array<INormalizedDatum<Custom>> = [];\n  let elementResult: INormalizedDatum<Custom>, datum: IDatum<Custom>;\n  for (let j = 0; j < dataLength; j += 1) {\n    datum = data[j];\n    elementResult = Object.assign({}, datum, {\n      normalizedValue: datum.value * multiplier,\n    });\n    result.push(elementResult);\n  }\n  return result;\n};\n\ninterface IContainer {\n  xOffset: number;\n  yOffset: number;\n  height: number;\n  width: number;\n}\n\nconst containerToRect = (container: IContainer): IRect => {\n  const xOffset = container.xOffset;\n  const yOffset = container.yOffset;\n  const width = container.width;\n  const height = container.height;\n  return {\n    x0: xOffset,\n    y0: yOffset,\n    x1: xOffset + width,\n    y1: yOffset + height,\n  };\n};\n\nconst rectToContainer = (rect: IRect): IContainer => {\n  const x0 = rect.x0;\n  const y0 = rect.y0;\n  const x1 = rect.x1;\n  const y1 = rect.y1;\n  return {\n    xOffset: x0,\n    yOffset: y0,\n    width: x1 - x0,\n    height: y1 - y0,\n  };\n};\n\nconst getShortestEdge = (input: IRect) => {\n  const container = rectToContainer(input);\n  const width = container.width;\n  const height = container.height;\n  const result = Math.min(width, height);\n  return result;\n};\n\n// Lay the rectangles inside a `container` so that the rectangles stack on top of each other in the direction\n// parallel to the width:\nexport const getCoordinates = <Custom>(\n    row: Array<INormalizedDatum<Custom>>, rect: IRect,\n  ): Array<ILayoutRect<Custom>> => {\n\n  const container = rectToContainer(rect);\n  const width = container.width;\n  const height = container.height;\n  const xOffset = container.xOffset;\n  const yOffset = container.yOffset;\n\n  const rowLength = row.length;\n  let valueSum = 0;\n  for (let i = 0; i < rowLength; i += 1) {\n    valueSum += row[i].normalizedValue;\n  }\n\n  const areaWidth = valueSum / height;\n  const areaHeight = valueSum / width;\n\n  let subXOffset = xOffset;\n  let subYOffset = yOffset;\n  const coordinates: Array<ILayoutRect<Custom>> = [];\n  if (width >= height) {\n    for (let i = 0; i < rowLength; i += 1) {\n      const num = row[i];\n      const y1 = subYOffset + num.normalizedValue / areaWidth;\n      const rectangle: IRect = {\n        x0: subXOffset,\n        y0: subYOffset,\n        x1: subXOffset + areaWidth,\n        y1,\n      };\n      const nextCoordinate: ILayoutRect<Custom> = Object.assign({}, num, rectangle);\n      subYOffset = y1;\n      coordinates.push(nextCoordinate);\n    }\n\n    return coordinates;\n  } else {\n    for (let i = 0; i < rowLength; i += 1) {\n      const num = row[i];\n      const x1 = subXOffset + num.normalizedValue  / areaHeight;\n      const rectangle: IRect = {\n        x0: subXOffset,\n        y0: subYOffset,\n        x1,\n        y1: subYOffset + areaHeight,\n      };\n      const nextCoordinate: ILayoutRect<Custom> = Object.assign({}, num, rectangle);\n      subXOffset = x1;\n      coordinates.push(nextCoordinate);\n    }\n    return coordinates;\n  }\n};\n\nexport const cutArea = (rect: IRect, area: number): IRect => {\n  const {width, height, xOffset, yOffset} = rectToContainer(rect);\n  if (width >= height) {\n    const areaWidth = area / height;\n    const newWidth = width - areaWidth;\n    const container: IContainer = {\n      xOffset: xOffset + areaWidth,\n      yOffset,\n      width: newWidth,\n      height,\n    };\n    return containerToRect(container);\n  } else {\n    const areaHeight = area / width;\n    const newHeight = height - areaHeight;\n    const container: IContainer = {\n      xOffset,\n      yOffset: yOffset + areaHeight,\n      width,\n      height: newHeight,\n    };\n    return containerToRect(container);\n  }\n};\n\nexport const squarify = <Custom>(\n    inputData: Array<INormalizedDatum<Custom>>,\n    inputCurrentRow: Array<INormalizedDatum<Custom>>,\n    inputRect: IRect,\n    inputStack: Array<ILayoutRect<Custom>>): Array<ILayoutRect<Custom>> => {\n\n  let data: Array<INormalizedDatum<Custom>> = inputData,\n  currentRow: Array<INormalizedDatum<Custom>> = inputCurrentRow,\n  rect: IRect = inputRect,\n  stack: Array<ILayoutRect<Custom>> = inputStack;\n\n  while (true) {\n    const dataLength = data.length;\n    if (dataLength === 0) {\n      const newCoordinates = getCoordinates(currentRow, rect);\n      const newStack: Array<ILayoutRect<Custom>> = stack.concat(newCoordinates);\n      return newStack;\n    }\n\n    const width = getShortestEdge(rect);\n    const nextDatum = data[0];\n    const restData = data.slice(1, dataLength);\n\n    if (doesAddingToRowImproveAspectRatio(currentRow, nextDatum, width)) {\n      const newRow = currentRow.concat(nextDatum);\n      data = restData;\n      currentRow = newRow;\n      rect = rect;\n      stack = stack;\n    } else {\n      const currentRowLength = currentRow.length;\n      let valueSum = 0;\n      for (let i = 0; i < currentRowLength; i += 1) {\n        valueSum += currentRow[i].normalizedValue;\n      }\n\n      const newContainer = cutArea(rect, valueSum);\n      const newCoordinates = getCoordinates(currentRow, rect);\n      const newStack = stack.concat(newCoordinates);\n      data = data;\n      currentRow = [];\n      rect = newContainer;\n      stack = newStack;\n    }\n  }\n};\n\nconst flatten = <T>(listOfLists: T[][]): T[] => {\n  const result: T[] = [];\n  const listOfListsLength = listOfLists.length;\n  for (let i = 0; i < listOfListsLength; i += 1) {\n    const innerList = listOfLists[i];\n    const innerListLength = innerList.length;\n    for (let j = 0; j < innerListLength; j += 1) {\n      result.push(innerList[j]);\n    }\n  }\n  return result;\n};\n\nconst getArea = (rect: IRect) => (rect.x1 - rect.x0) * (rect.y1 - rect.y0);\n\nexport const recurse = <Custom>(datum: ILayoutRect<Custom>): Array<ILayoutRect<Custom>> => {\n  if (datum.children === undefined) {\n    const result = [datum];\n    return result;\n  } else {\n    const normalizedChildren: Array<INormalizedDatum<Custom>> = normalizeData<Custom>(datum.children, getArea(datum));\n    const squarified: Array<ILayoutRect<Custom>> = squarify(normalizedChildren, [], datum, []);\n\n    const squarifiedLength = squarified.length;\n    const contained: Array<Array<ILayoutRect<Custom>>> = [];\n    for (let i = 0; i < squarifiedLength; i += 1) {\n      contained.push(recurse(squarified[i]));\n    }\n\n    const flattened: Array<ILayoutRect<Custom>> = flatten<ILayoutRect<Custom>>(contained);\n    return flattened;\n  }\n};\n"]}