{"version":3,"file":"9987.ba1685e2.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/maps/components/CanvasHover.tsx","webpack://@finviz/website/./js/app/maps/components/Canvas.tsx","webpack://@finviz/website/./js/app/maps/components/Legend.tsx","webpack://@finviz/website/./js/app/maps/components/Map.tsx","webpack://@finviz/website/./js/app/maps/store/action-creators.ts","webpack://@finviz/website/./js/app/maps/store/appDispatcher.ts","webpack://@finviz/website/./js/app/maps/store/constants.ts","webpack://@finviz/website/./js/app/maps/store/store.ts","webpack://@finviz/website/./js/app/maps/store/mapStore.ts","webpack://@finviz/website/./js/app/maps/constants/font.ts","webpack://@finviz/website/./js/app/maps/zoom.ts","webpack://@finviz/website/./js/app/maps/treemap.ts","webpack://@finviz/website/./js/app/shared/components/Sparkline.tsx","webpack://@finviz/website/./js/app/shared/getTextFontFamily.ts","webpack://@finviz/website/./js/app/shared/loadImage.ts","webpack://@finviz/website/./js/app/shared/retinafy.ts"],"sourcesContent":["import { flip, offset, shift, useClientPoint, useFloating, useInteractions } from '@floating-ui/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport '../../../../styles/map-hover.css'\r\nimport Sparkline from '../../shared/components/Sparkline'\r\nimport MapActions from '../store/action-creators'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapDataNode, MapTypeId } from '../types'\r\nimport { getVisibleTooltipNodes } from '../utils'\r\n\r\ninterface CanvasHoverProps {\r\n  treemap: Treemap\r\n}\r\n\r\ninterface CanvasHoverState {\r\n  hoveredNode?: MapDataNode | null\r\n  visibleNodes: MapDataNode[]\r\n  sparklineData: Record<string, number[]>\r\n}\r\n\r\nconst formatPerf = (d: MapDataNode, treemap: Treemap) => {\r\n  if (typeof d.additional !== 'undefined' && d.additional !== null) {\r\n    return d.additional\r\n  } else if (typeof d.perf !== 'undefined' && d.perf !== null) {\r\n    return treemap.formatValue(d.perf.toFixed(2))\r\n  } else {\r\n    return 'N/A'\r\n  }\r\n}\r\n\r\nexport default function CanvasHover(props: CanvasHoverProps) {\r\n  const prevDataHash = React.useRef(props.treemap.dataHash)\r\n  const [{ hoveredNode, visibleNodes, sparklineData }, setState] = React.useState<CanvasHoverState>({\r\n    hoveredNode: null,\r\n    visibleNodes: [],\r\n    sparklineData: {},\r\n  })\r\n\r\n  /**\r\n   * Compute position using floating ui\r\n   */\r\n  const { refs, floatingStyles, context, isPositioned, update } = useFloating({\r\n    open: !!hoveredNode,\r\n    strategy: 'fixed',\r\n    placement: 'right-start',\r\n    middleware: [offset({ mainAxis: 100 }), flip({ crossAxis: false }), shift()],\r\n  })\r\n  const clientPoint = useClientPoint(context)\r\n  const { getFloatingProps } = useInteractions([clientPoint])\r\n\r\n  /**\r\n   * Update state when store changes\r\n   */\r\n  React.useEffect(() => {\r\n    const handleMapStoreChange = () => {\r\n      const storeHoveredNode = MapStore.getHoveredNode(props.treemap.mapNodeId)\r\n      const sparklineData = MapStore.getSparklines()\r\n      const visibleNodes = getVisibleTooltipNodes(storeHoveredNode)\r\n\r\n      if (storeHoveredNode && storeHoveredNode.name !== hoveredNode?.name) {\r\n        const tickersToLoad = visibleNodes\r\n          .filter((node) => (props.treemap.dataHash !== prevDataHash.current ? true : !sparklineData[node.name]))\r\n          .map((node) => node!.name)\r\n        if (\r\n          storeHoveredNode &&\r\n          !sparklineData[storeHoveredNode.name] &&\r\n          !tickersToLoad.includes(storeHoveredNode?.name)\r\n        ) {\r\n          tickersToLoad.push(storeHoveredNode.name)\r\n        }\r\n\r\n        prevDataHash.current = props.treemap.dataHash\r\n        MapActions.loadSparklineData(tickersToLoad, props.treemap.type)\r\n      }\r\n\r\n      setState((prevState) => ({ ...prevState, hoveredNode: storeHoveredNode, visibleNodes, sparklineData }))\r\n    }\r\n\r\n    MapStore.addChangeListener(handleMapStoreChange)\r\n\r\n    return () => {\r\n      MapStore.removeChangeListener(handleMapStoreChange)\r\n      MapActions.loadSparklinesCancel()\r\n    }\r\n  }, [hoveredNode?.name, props.treemap.mapNodeId, props.treemap.type, props.treemap.dataHash, update])\r\n\r\n  const hoveredSparkline = hoveredNode ? sparklineData[hoveredNode.name] : []\r\n  const hasSparkline = hoveredSparkline?.length > 0\r\n  const price = hoveredSparkline?.[hoveredSparkline.length - 1]?.toFixed(2) ?? ''\r\n  const isSmall = visibleNodes.length > 15\r\n  const title =\r\n    (props.treemap.type !== MapTypeId.World ? hoveredNode?.parent.parent.name + ' - ' : '') + hoveredNode?.parent.name\r\n  const backgroundColor = hoveredNode ? props.treemap.colorScale(hoveredNode.perf) : undefined\r\n\r\n  return (\r\n    <div\r\n      ref={refs.setFloating}\r\n      id=\"hover\"\r\n      className={classnames('pointer-events-none absolute left-0 top-0', { invisible: !hoveredNode || !isPositioned })}\r\n      style={floatingStyles}\r\n      {...getFloatingProps()}\r\n    >\r\n      <h3 className=\"text-left\">{title}</h3>\r\n      <table className={isSmall ? 'is-small' : ''}>\r\n        <tbody>\r\n          {hoveredNode && (\r\n            <>\r\n              <tr className=\"hovered\" style={{ backgroundColor }}>\r\n                <td className=\"ticker\">{hoveredNode.data?.data?.nameOverride ?? hoveredNode.name}</td>\r\n                <td>\r\n                  {hasSparkline && (\r\n                    <Sparkline className=\"white\" width={65} height={25} data={sparklineData[hoveredNode.name]} />\r\n                  )}\r\n                </td>\r\n                <td className=\"price\">{price}</td>\r\n                <td className=\"change\">{formatPerf(hoveredNode, props.treemap)}</td>\r\n              </tr>\r\n              <tr\r\n                className={classnames('hovered is-description', { 'is-empty': !hoveredNode.description })}\r\n                style={{ backgroundColor }}\r\n              >\r\n                <td colSpan={4} className={classnames({ description: hoveredNode.description })}>\r\n                  {hoveredNode.description}\r\n                </td>\r\n              </tr>\r\n            </>\r\n          )}\r\n\r\n          {visibleNodes.length > 1 &&\r\n            visibleNodes.map((c) => {\r\n              const hasSparkline = sparklineData?.[c.name]?.length > 0\r\n              const data = hasSparkline ? sparklineData[c.name] : []\r\n              return (\r\n                <tr key={c.name}>\r\n                  <td className=\"ticker text-gray-900\">{c.data?.data?.nameOverride ?? c.name}</td>\r\n                  <td>\r\n                    {hasSparkline && <Sparkline width={65} height={isSmall ? 20 : 25} data={sparklineData[c.name]} />}\r\n                  </td>\r\n                  <td className=\"price text-gray-900\">{hasSparkline ? data[data.length - 1].toFixed(2) : ''}</td>\r\n                  <td className=\"change\" style={{ color: props.treemap.colorScale(c.perf) }}>\r\n                    {formatPerf(c, props.treemap)}\r\n                  </td>\r\n                </tr>\r\n              )\r\n            })}\r\n        </tbody>\r\n      </table>\r\n    </div>\r\n  )\r\n}\r\n","import classNames from 'classnames'\r\nimport Hammer from 'hammerjs'\r\nimport * as React from 'react'\r\n\r\nimport { isFirefoxDesktop } from '../../shared/isMobile'\r\nimport { loadImage } from '../../shared/loadImage'\r\nimport { retinafy } from '../../shared/retinafy'\r\nimport LayoutGenerator from '../layout-generator'\r\nimport MapActionCreators from '../store/action-creators'\r\nimport mapActionCreators from '../store/action-creators'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapDataIndustry, MapDataNode, MapDataSector, MapTypeId, NodeDepth } from '../types'\r\nimport { getOffset } from '../utils'\r\nimport CanvasHover from './CanvasHover'\r\nimport Legend from './Legend'\r\n\r\ninterface CanvasProps {\r\n  alt?: string\r\n  treemap: Treemap\r\n  zoom?: boolean\r\n  legend?: boolean\r\n  zoomOnWheel?: boolean\r\n  hover?: boolean\r\n  onNodeClick?: (props: {\r\n    event: React.MouseEvent<HTMLCanvasElement>\r\n    treemap: Treemap\r\n    node?: MapDataNode\r\n    industry?: MapDataIndustry\r\n    sector?: MapDataSector\r\n  }) => void\r\n}\r\n\r\ninterface CanvasState {\r\n  zoom: number\r\n  initialized: boolean\r\n  type: MapTypeId\r\n  dataHash: string\r\n  width: number\r\n  height: number\r\n}\r\n\r\n// TODO presunt w, h, zoom, translate do stavu\r\nclass Canvas extends React.Component<CanvasProps, CanvasState> {\r\n  static defaultProps = {\r\n    zoom: true,\r\n    legend: true,\r\n    hover: true,\r\n    zoomOnWheel: true,\r\n  }\r\n\r\n  state: CanvasState = {\r\n    zoom: 1,\r\n    initialized: false,\r\n    type: this.props.treemap.type,\r\n    dataHash: this.props.treemap.dataHash,\r\n    width: this.props.treemap.width,\r\n    height: this.props.treemap.height,\r\n  }\r\n\r\n  _canvas = React.createRef<HTMLCanvasElement>()\r\n  _hoverCanvas = React.createRef<HTMLCanvasElement>()\r\n\r\n  // @ts-ignore\r\n  _canvasContext: CanvasRenderingContext2D\r\n  // @ts-ignore\r\n  _hoverContext: CanvasRenderingContext2D\r\n\r\n  _cache: Record<string, { canvas: HTMLCanvasElement; context: CanvasRenderingContext2D }> = {}\r\n  mouseDown: boolean = false\r\n  lastPanX: number = 0\r\n  lastPanY: number = 0\r\n\r\n  animationFrameId: number | null = null\r\n\r\n  // @ts-ignore\r\n  worldBackground: HTMLImageElement\r\n\r\n  constructor(props: CanvasProps) {\r\n    super(props)\r\n\r\n    this._cache = {}\r\n\r\n    for (var event of [\r\n      '_onChange',\r\n      '_onMouseDown',\r\n      '_onMouseMove',\r\n      '_onMouseUp',\r\n      '_onMouseLeave',\r\n      '_onDoubleClick',\r\n      '_onWheel',\r\n      '_onPanStart',\r\n      '_onPanMove',\r\n      '_onPinch',\r\n      '_getPublishCanvas',\r\n    ]) {\r\n      // @ts-ignore\r\n      this[event] = this[event].bind(this)\r\n    }\r\n  }\r\n\r\n  componentDidMount() {\r\n    MapStore.addChangeListener(this._onChange)\r\n    mapActionCreators._setOnPublish(this._getPublishCanvas)\r\n\r\n    void this._initialize()\r\n  }\r\n\r\n  componentDidUpdate() {\r\n    if (!this.state.initialized) return\r\n\r\n    const { treemap } = this.props\r\n    const { dataHash, type } = this.state\r\n\r\n    // Nothing changed from outside, so we just render the current view\r\n    if (\r\n      // Data update\r\n      treemap.dataHash === dataHash &&\r\n      // Type update\r\n      type === treemap.type &&\r\n      // Window Resize\r\n      treemap.width === this.state.width &&\r\n      treemap.height === this.state.height\r\n    ) {\r\n      this.renderFromCache(this._canvasContext)\r\n      this.renderHover(this._hoverContext)\r\n      return\r\n    }\r\n\r\n    this._setCanvasSize(treemap.width, treemap.height)\r\n\r\n    if (!this.worldBackground && treemap.type === MapTypeId.World) {\r\n      void this._loadTreemapGeoBackground().then(() => this._updateCanvasCaches(treemap))\r\n    } else {\r\n      this._updateCanvasCaches(treemap)\r\n    }\r\n  }\r\n\r\n  componentWillUnmount() {\r\n    // TODO remove hammer listener\r\n    MapStore.removeChangeListener(this._onChange)\r\n    this._hoverCanvas.current?.removeEventListener('wheel', this._onWheel)\r\n  }\r\n\r\n  render() {\r\n    const { initialized } = this.state\r\n    const { alt, treemap, legend, hover, zoom } = this.props\r\n\r\n    return (\r\n      <div id=\"canvas-wrapper\">\r\n        <canvas ref={this._canvas} className={classNames('chart', { initialized })}>\r\n          {alt}\r\n        </canvas>\r\n        {(hover || zoom) && (\r\n          <canvas\r\n            ref={this._hoverCanvas}\r\n            className=\"hover-canvas absolute left-0 top-0\"\r\n            onMouseDown={this._onMouseDown}\r\n            onMouseMove={this._onMouseMove}\r\n            onMouseUp={this._onMouseUp}\r\n            onMouseLeave={this._onMouseLeave}\r\n            onDoubleClick={this._onDoubleClick}\r\n          />\r\n        )}\r\n        {legend && <Legend key={treemap.scale.id} treemap={treemap} className=\"pt-4\" />}\r\n        {hover && <CanvasHover treemap={treemap} />}\r\n      </div>\r\n    )\r\n  }\r\n\r\n  renderFromCache(context: CanvasRenderingContext2D) {\r\n    const { treemap } = this.props\r\n    const { zoom } = this.state\r\n    const [x, y] = treemap.zoom.translate()\r\n    const nearestSize = treemap.zoom.getNearestSize(zoom)\r\n\r\n    // Last resort if the cache doesn’t exist\r\n    if (!this._cache[nearestSize]) this._createCache(nearestSize)\r\n\r\n    context.save()\r\n    context.drawImage(this._cache[nearestSize].canvas, ~~x, ~~y, ~~(treemap.width * zoom), ~~(treemap.height * zoom))\r\n    context.restore()\r\n  }\r\n\r\n  _onChange() {\r\n    const { treemap } = this.props\r\n\r\n    this.setState({ zoom: treemap.zoom.scale() })\r\n  }\r\n\r\n  _onMouseDown() {\r\n    this.mouseDown = true\r\n  }\r\n\r\n  _onMouseMove(e: React.MouseEvent<HTMLCanvasElement>) {\r\n    if (this.mouseDown || !this.props.hover) return\r\n\r\n    const { treemap } = this.props\r\n    var { offsetX, offsetY } = getOffset(e)\r\n    let nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\r\n\r\n    if (!nodeAtPosition) {\r\n      const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\r\n      nodeAtPosition = industryAtPosition?.children[0]\r\n    }\r\n\r\n    MapActionCreators.setHoveredNode(treemap.mapNodeId, nodeAtPosition)\r\n  }\r\n\r\n  _onMouseUp() {\r\n    this.mouseDown = false\r\n  }\r\n\r\n  _onMouseLeave() {\r\n    MapActionCreators.setHoveredNode(this.props.treemap.mapNodeId, undefined)\r\n  }\r\n\r\n  _onDoubleClick(e: React.MouseEvent<HTMLCanvasElement>) {\r\n    const { treemap } = this.props\r\n    const { offsetX, offsetY } = getOffset(e)\r\n    const nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\r\n    const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\r\n    const sectorAtPosition = treemap.getSectorAtPosition(offsetX, offsetY)\r\n    this.props.onNodeClick?.({\r\n      event: e,\r\n      treemap,\r\n      node: nodeAtPosition,\r\n      industry: industryAtPosition,\r\n      sector: sectorAtPosition,\r\n    })\r\n  }\r\n\r\n  _onWheel(e: MouseEvent) {\r\n    if (!this.props.zoom) return\r\n\r\n    e.preventDefault()\r\n\r\n    if (!this.state.initialized) {\r\n      return\r\n    }\r\n\r\n    var { offsetX, offsetY } = getOffset(e)\r\n    // @ts-ignore\r\n    MapActionCreators.zoom(this.props.treemap, -e.deltaY, offsetX, offsetY)\r\n  }\r\n\r\n  _onPanStart(e: any) {\r\n    if (!this.state.initialized) {\r\n      return\r\n    }\r\n\r\n    this.lastPanX = e.pointers[0].clientX\r\n    this.lastPanY = e.pointers[0].clientY\r\n  }\r\n\r\n  _onPanMove(e: any) {\r\n    if (!this.state.initialized) {\r\n      return\r\n    }\r\n\r\n    var movementX = this.lastPanX - e.pointers[0].clientX\r\n    var movementY = this.lastPanY - e.pointers[0].clientY\r\n    this.lastPanX = e.pointers[0].clientX\r\n    this.lastPanY = e.pointers[0].clientY\r\n    const { treemap } = this.props\r\n    MapActionCreators.changeTranslate(treemap, movementX, movementY)\r\n  }\r\n\r\n  _onPinch(e: any) {\r\n    if (!this.state.initialized || !this.props.zoom || e.pointers.length < 2) {\r\n      return\r\n    }\r\n\r\n    var offsetX1 = e.pointers[0].clientX - e.target.offsetLeft - e.target.offsetParent.offsetLeft, // TODO fix scrolled\r\n      offsetY1 = e.pointers[0].clientY - e.target.offsetTop - e.target.offsetParent.offsetTop,\r\n      offsetX2 = e.pointers[1].clientX - e.target.offsetLeft - e.target.offsetParent.offsetLeft,\r\n      offsetY2 = e.pointers[1].clientY - e.target.offsetTop - e.target.offsetParent.offsetTop,\r\n      offsetX = (offsetX1 + offsetX2) / 2,\r\n      offsetY = (offsetY1 + offsetY2) / 2\r\n    var direction = e.scale >= 1 ? 1 : -1\r\n    MapActionCreators.zoom(this.props.treemap, direction, offsetX, offsetY)\r\n  }\r\n\r\n  _setCanvasContexts() {\r\n    const canvas = this._canvas.current!\r\n    const canvasContext = canvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n    this._canvasContext = canvasContext\r\n\r\n    if (this.props.hover || this.props.zoom) {\r\n      const hoverCanvas = this._hoverCanvas.current!\r\n      const hoverContext = hoverCanvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n\r\n      this._hoverContext = hoverContext\r\n    }\r\n  }\r\n\r\n  _setCanvasSize(width: number, height: number) {\r\n    retinafy(this._canvas.current, this._canvasContext, width, height)\r\n\r\n    if (this.props.hover || this.props.zoom) {\r\n      retinafy(this._hoverCanvas.current, this._hoverContext, width, height)\r\n    }\r\n  }\r\n\r\n  async _initialize() {\r\n    const { treemap, zoomOnWheel } = this.props\r\n\r\n    this._setCanvasContexts()\r\n    this._setCanvasSize(treemap.width, treemap.height)\r\n\r\n    const zoomLevels = treemap.getZoomLevels()\r\n    var render = () => {\r\n      this._createCacheWithPriority(zoomLevels, zoomLevels[0], () => {\r\n        this.setState({ initialized: true })\r\n\r\n        const hoverCanvas = this._hoverCanvas.current\r\n\r\n        if (!hoverCanvas) return\r\n\r\n        var hammertime = new Hammer(hoverCanvas)\r\n        hammertime.get('pinch').set({ enable: true, threshold: 0.1 })\r\n        hammertime.on('panstart', this._onPanStart)\r\n        hammertime.on('panmove', this._onPanMove)\r\n        hammertime.on('pinch', this._onPinch)\r\n\r\n        if (zoomOnWheel) {\r\n          hoverCanvas.addEventListener('wheel', this._onWheel, { passive: false })\r\n        }\r\n      })\r\n    }\r\n\r\n    if (treemap.type === MapTypeId.World) {\r\n      await this._loadTreemapGeoBackground()\r\n      render()\r\n    } else {\r\n      render()\r\n    }\r\n  }\r\n\r\n  async _getTreemapGeoBackground() {\r\n    if (this.props.treemap.getIsSmall()) {\r\n      return FinvizSettings.hasDarkTheme\r\n        ? import('../assets/map_geo_small_dark@2x.png')\r\n        : import('../assets/map_geo_small@2x.png')\r\n    }\r\n\r\n    return import('../assets/map_geo.png')\r\n  }\r\n\r\n  async _loadTreemapGeoBackground() {\r\n    try {\r\n      const image = await this._getTreemapGeoBackground()\r\n      this.worldBackground = await loadImage(image.default)\r\n    } catch {}\r\n  }\r\n\r\n  _createCache(scale: number) {\r\n    const { treemap } = this.props\r\n\r\n    const oldScale = treemap.zoom.scale()\r\n    const oldTranslate = treemap.zoom.translate()\r\n    const width = ~~(treemap.width * scale)\r\n    const height = ~~(treemap.height * scale)\r\n\r\n    if (!this._cache[scale]) {\r\n      const cacheCanvas = document.createElement('canvas')\r\n      const cacheContext = cacheCanvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n\r\n      this._cache[scale] = { canvas: cacheCanvas, context: cacheContext }\r\n    }\r\n\r\n    retinafy(this._cache[scale].canvas, this._cache[scale].context, width, height)\r\n\r\n    treemap.zoom.scale(scale)\r\n    treemap.zoom.translateAbs([0, 0])\r\n    this.renderCanvas(this._cache[scale].context, treemap)\r\n    treemap.zoom.scale(oldScale)\r\n    treemap.zoom.translateAbs(oldTranslate)\r\n  }\r\n\r\n  _updateCanvasCaches(treemap: Treemap) {\r\n    this._createCacheWithPriority(treemap.getZoomLevels(), treemap.zoom.getNearestSize(), () => {\r\n      this.setState((prevState) => ({\r\n        dataHash: treemap.dataHash,\r\n        width: treemap.width,\r\n        height: treemap.height,\r\n        type: treemap.type,\r\n        zoom: treemap.type !== prevState.type ? 1 : prevState.zoom,\r\n      }))\r\n\r\n      // Reset zoom if we’re changing map type\r\n      if (this.state.type !== treemap.type) {\r\n        mapActionCreators.setHoveredNode(treemap.mapNodeId, undefined)\r\n        mapActionCreators.resetSparklineData()\r\n      }\r\n\r\n      this.renderFromCache(this._canvasContext)\r\n    })\r\n  }\r\n\r\n  _createCacheWithPriority(zoomLevels: number[], currentZoom: number, callback?: () => void) {\r\n    if (this.animationFrameId) window.cancelAnimationFrame(this.animationFrameId)\r\n\r\n    const remainingLevels = zoomLevels.filter((level) => level !== currentZoom)\r\n    this.animationFrameId = requestAnimationFrame(() => {\r\n      this._createCache(currentZoom)\r\n      callback?.()\r\n      this._queueUpdateCache(remainingLevels)\r\n    })\r\n  }\r\n\r\n  _queueUpdateCache(scales: number[], currentScale = 0) {\r\n    if (!scales[currentScale]) return\r\n\r\n    this.animationFrameId = requestAnimationFrame(() => {\r\n      this._createCache(scales[currentScale])\r\n      this._queueUpdateCache(scales, currentScale + 1)\r\n    })\r\n  }\r\n\r\n  renderHover(context: CanvasRenderingContext2D) {\r\n    if (!this.props.hover) return\r\n\r\n    const { treemap } = this.props\r\n    const { hover } = treemap.settings.industry\r\n    const hoveredNode = MapStore.getHoveredNode(treemap.mapNodeId)\r\n    const industry = hoveredNode?.parent\r\n\r\n    context.save()\r\n\r\n    context.clearRect(0, 0, treemap.width, treemap.height)\r\n    context.translate.apply(context, treemap.zoom.translate())\r\n    context.scale(treemap.zoom.scale(), treemap.zoom.scale())\r\n\r\n    if (!industry) {\r\n      context.restore()\r\n      return\r\n    }\r\n\r\n    const showIndustryHeader =\r\n      LayoutGenerator.isNodeHeaderVisible(industry, treemap.settings) && industry.depth === NodeDepth.Industry\r\n    let industryOffset =\r\n      treemap.getIsSmall() || showIndustryHeader\r\n        ? treemap.settings.industry.padding.top\r\n        : LayoutGenerator.smallIndustryPadding.top\r\n\r\n    if (industry.depth === NodeDepth.Sector) industryOffset = treemap.settings.sector.header.height\r\n\r\n    if (showIndustryHeader && !treemap.getIsSmall()) {\r\n      industryOffset += 1.5\r\n    }\r\n\r\n    // Outter border\r\n    context.strokeStyle = hover?.border ?? 'transparent'\r\n    context.lineWidth = 3\r\n    context.strokeRect(industry.x - 0.5, industry.y - 0.5 + industryOffset, industry.dx, industry.dy - industryOffset)\r\n\r\n    // Inner borders\r\n    context.translate(0.5, 0.5)\r\n    context.lineWidth = 1\r\n    context.beginPath()\r\n    for (let i = 0; i < industry.children.length; i++) {\r\n      const node = industry.children[i]\r\n      context.moveTo(node.x - 1, node.y - 1)\r\n      context.lineTo(node.x + node.dx - 1, node.y - 1)\r\n      context.lineTo(node.x + node.dx - 1, node.y + node.dy - 1)\r\n      context.lineTo(node.x - 1, node.y + node.dy - 1)\r\n      context.lineTo(node.x - 1, node.y - 1.5)\r\n    }\r\n    context.stroke()\r\n\r\n    // Header and text\r\n    if (!treemap.getIsSmall() && showIndustryHeader) {\r\n      context.translate(-0.5, -0.5)\r\n      treemap.renderIndustryHeader({\r\n        node: industry,\r\n        context,\r\n        config: hover,\r\n        parent: treemap.settings.industry,\r\n        fill: hover?.background ?? treemap.settings.background,\r\n      })\r\n      treemap.renderNodeText({ node: industry, context, config: hover, parent: treemap.settings.industry })\r\n    }\r\n\r\n    context.restore()\r\n  }\r\n\r\n  renderCanvas(context: CanvasRenderingContext2D, treemap: Treemap) {\r\n    context.save()\r\n\r\n    const scale = treemap.zoom.getNearestSize()\r\n\r\n    context.fillStyle = treemap.settings.background\r\n    context.fillRect(0, 0, treemap.width * scale, treemap.height * scale)\r\n\r\n    context.translate.apply(context, treemap.zoom.translate())\r\n    context.scale(scale, scale)\r\n\r\n    /* BACKGROUND */\r\n    if (treemap.type === MapTypeId.World && this.worldBackground) {\r\n      if (treemap.getIsSmall()) context.translate(0, 20)\r\n\r\n      context.drawImage(\r\n        this.worldBackground,\r\n        0,\r\n        0,\r\n        this.worldBackground.naturalWidth,\r\n        this.worldBackground.naturalHeight,\r\n        0,\r\n        20,\r\n        treemap.width,\r\n        treemap.width / (this.worldBackground.naturalWidth / this.worldBackground.naturalHeight)\r\n      )\r\n    }\r\n\r\n    if (treemap.settings.sector.background) {\r\n      context.fillStyle = treemap.settings.sector.background\r\n      for (let index = 0; index < treemap.sectors.length; index++) {\r\n        const node = treemap.sectors[index]\r\n        context.fillRect(node.x, node.y, node.dx, node.dy)\r\n      }\r\n    }\r\n\r\n    if (treemap.settings.industry.background) {\r\n      context.fillStyle = treemap.settings.industry.background\r\n      for (let index = 0; index < treemap.industries.length; index++) {\r\n        const node = treemap.industries[index]\r\n        context.fillRect(node.x, node.y + 3, node.dx - 1, node.dy - 4)\r\n      }\r\n    }\r\n\r\n    /* STOCKS */\r\n    for (let index = 0; index < treemap.nodes.length; index++) {\r\n      const node = treemap.nodes[index]\r\n      if (!node.parent) continue // Skip on root node\r\n      treemap.renderStockNode(treemap.nodes[index], context)\r\n    }\r\n\r\n    /* INDUSTRIES */\r\n    for (let index = 0; index < treemap.industries.length; index++) {\r\n      const node = treemap.industries[index]\r\n      const isLargeNode = LayoutGenerator.isNodeHeaderVisible(node, treemap.settings)\r\n      const isGeoMap = treemap.type === MapTypeId.World\r\n      const renderBackground = treemap.getIsSmall() ? isGeoMap : !isGeoMap\r\n\r\n      if (!isLargeNode || (treemap.getIsSmall() && !isGeoMap)) continue\r\n\r\n      if (Number.isFinite(node.perf) && renderBackground) {\r\n        treemap.renderIndustryHeader({\r\n          node,\r\n          context,\r\n          config: treemap.settings.industry.header,\r\n          parent: treemap.settings.industry,\r\n          fill: treemap.colorScale(node.perf),\r\n        })\r\n      }\r\n\r\n      treemap.renderNodeText({\r\n        node,\r\n        context,\r\n        config: treemap.settings.industry.header,\r\n        parent: treemap.settings.industry,\r\n      })\r\n    }\r\n\r\n    /* SECTORS */\r\n    if (treemap.type !== MapTypeId.World) {\r\n      for (let index = 0; index < treemap.sectors.length; index++) {\r\n        const node = treemap.sectors[index]\r\n\r\n        if (treemap.getIsSmall()) {\r\n          treemap.renderIndustryHeader({\r\n            node,\r\n            context,\r\n            config: treemap.settings.sector.header,\r\n            parent: treemap.settings.sector,\r\n            fill: treemap.settings.sector.header.background ?? treemap.colorScale(node.perf),\r\n          })\r\n        }\r\n\r\n        treemap.renderNodeText({\r\n          node,\r\n          context,\r\n          config: treemap.settings.sector.header,\r\n          parent: treemap.settings.sector,\r\n        })\r\n      }\r\n    }\r\n\r\n    context.restore()\r\n\r\n    if (treemap.settings.sector.border) {\r\n      this.renderSectorBorders(context, treemap)\r\n    }\r\n  }\r\n\r\n  renderSectorBorders(context: CanvasRenderingContext2D, treemap: Treemap) {\r\n    const scale = treemap.zoom.scale()\r\n    context.lineWidth = 2 * scale\r\n    context.strokeStyle = treemap.settings.sector.border ?? 'transparent'\r\n\r\n    context.beginPath()\r\n\r\n    // Outside border\r\n    context.moveTo(0, 0)\r\n    context.lineTo(treemap.width * scale, 0)\r\n    context.lineTo(treemap.width * scale, treemap.height * scale)\r\n    context.lineTo(0, treemap.height * scale)\r\n    context.lineTo(0, -1)\r\n\r\n    for (let index = 0; index < treemap.sectors.length; index++) {\r\n      const sector = treemap.sectors[index]\r\n\r\n      context.strokeRect(sector.x * scale, sector.y * scale, sector.dx * scale, sector.dy * scale)\r\n    }\r\n\r\n    context.stroke()\r\n  }\r\n\r\n  _getPublishCanvas() {\r\n    return this._cache[1].canvas\r\n  }\r\n}\r\n\r\nexport default Canvas\r\n","import classnames from 'classnames'\r\n\r\nimport { scaleStepFormat } from '../constants/settings'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapTypeId } from '../types'\r\n\r\ninterface LegendProps {\r\n  treemap: Treemap\r\n  className?: string\r\n}\r\n\r\nfunction Legend(props: LegendProps) {\r\n  const colorScale = props.treemap.colorScale\r\n\r\n  if (!colorScale) {\r\n    return null\r\n  }\r\n\r\n  var boxover =\r\n    'cssbody=[tooltip_bdy] cssheader=[tooltip_hdr] header=[' +\r\n    props.treemap.scale.name +\r\n    \"] body=[<table width=300><tr><td class='tooltip_tab'>\" +\r\n    props.treemap.scale.tooltip +\r\n    '</td></tr></table>] offsety=[-70] delay=[500]'\r\n\r\n  const [scaleMin, scaleMax] = props.treemap.getScaleMinMax()\r\n  var steps = [scaleMin]\r\n  var diff = scaleMax - scaleMin\r\n  if (diff > 0) {\r\n    var step = diff / 6\r\n    for (var i = 1; i < 7; i++) {\r\n      steps.push(Math.round((scaleMin + step * i) * 10) / 10)\r\n    }\r\n  }\r\n\r\n  if (props.treemap.scale.id === '_rec') {\r\n    steps = [5, 4, 3, 2, 1]\r\n  } else if (props.treemap.scale.id === '_earndate') {\r\n    steps = [-30, -15, -1, 1, 15, 30]\r\n  }\r\n\r\n  // TODO some widths\r\n  var stepWidth = ['_rec', '_earndate'].indexOf(props.treemap.scale.id) !== -1 ? 100 : 50\r\n  var format = scaleStepFormat[props.treemap.scale.id]\r\n  return (\r\n    <div className={classnames('flex justify-between', props.className)}>\r\n      {![MapTypeId.Portfolio, MapTypeId.ETFHoldings, MapTypeId.ManagersAndFunds].includes(props.treemap.type) && (\r\n        <div className=\"info w-full\">\r\n          Use mouse wheel to zoom in and out. Drag zoomed map to pan it.\r\n          <br />\r\n          Double&#x2011;click a ticker to display detailed information in a new window.\r\n          <br />\r\n          {!MapStore.isWidget() &&\r\n            'Hover mouse cursor over a ticker to see its main competitors in a stacked view with a 3-month history graph.'}\r\n        </div>\r\n      )}\r\n      <div className=\"ml-auto mr-0 flex space-x-px whitespace-nowrap\" data-boxover={boxover}>\r\n        {steps.map((step, index) => (\r\n          <div\r\n            key={`${step}-${index}`}\r\n            className=\"flex h-6 items-center justify-center px-2 text-2xs text-white font-normal\"\r\n            style={{\r\n              background: colorScale(step),\r\n              minWidth: stepWidth,\r\n              textShadow: '0 1px 0 rgba(0, 0, 0, 0.25)',\r\n            }}\r\n          >\r\n            {props.treemap.formatValue(step.toString(), [scaleMin, scaleMax], format)}\r\n          </div>\r\n        ))}\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default Legend\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nimport { Delayed } from '../../../main/components/delayed'\r\nimport { Spinner } from '../../../main/components/spinner'\r\nimport { ISettings } from '../constants/settings'\r\nimport LayoutGenerator from '../layout-generator'\r\nimport mapActionCreators from '../store/action-creators'\r\nimport Treemap from '../treemap'\r\nimport { MapDataRoot, MapSubtype, MapType } from '../types'\r\nimport * as mapUtils from '../utils'\r\nimport Canvas from './Canvas'\r\n\r\nconst MapContext = React.createContext<{\r\n  treemap?: Treemap\r\n  setTreemap: React.Dispatch<React.SetStateAction<Treemap | undefined>>\r\n  generator?: LayoutGenerator\r\n  setGenerator: React.Dispatch<React.SetStateAction<LayoutGenerator | undefined>>\r\n}>({ setTreemap: () => {}, setGenerator: () => {} })\r\n\r\nexport function useMapContext() {\r\n  return React.useContext(MapContext)\r\n}\r\n\r\nexport function MapContextProvider(props: React.PropsWithChildren) {\r\n  const [treemap, setTreemap] = React.useState<Treemap>()\r\n  const [generator, setGenerator] = React.useState<LayoutGenerator>()\r\n\r\n  return (\r\n    <MapContext.Provider value={{ treemap, setTreemap, generator, setGenerator }}>{props.children}</MapContext.Provider>\r\n  )\r\n}\r\n\r\ninterface MapProps {\r\n  className?: string\r\n  isLoadingData?: boolean\r\n  isFetchingPerf?: boolean\r\n  type: MapType\r\n  subtype: MapSubtype\r\n  data?: MapDataRoot\r\n  settings?: ISettings\r\n  onNodeClick?: React.ComponentProps<typeof Canvas>['onNodeClick']\r\n  zoom?: boolean\r\n  zoomOnWheel?: boolean\r\n  legend?: boolean\r\n  hover?: boolean\r\n  truncateNodeName?: boolean\r\n  dataHash?: string\r\n}\r\n\r\nexport function Map({\r\n  className,\r\n  isLoadingData,\r\n  isFetchingPerf = isLoadingData,\r\n  type,\r\n  subtype,\r\n  data,\r\n  settings,\r\n  onNodeClick,\r\n  zoom,\r\n  zoomOnWheel,\r\n  legend,\r\n  hover,\r\n  truncateNodeName,\r\n  dataHash,\r\n}: MapProps) {\r\n  const { setGenerator, treemap: prevTreemap, setTreemap } = useMapContext()\r\n  const containerRef = React.useRef<HTMLDivElement>(null)\r\n\r\n  /**\r\n   * We can’t `useEffect` for generator/treemap, because we’d have to deal with stale references in\r\n   * other effects. In order to ensure we always get the current values, we need to either `useRef`\r\n   * them (and update props for both state and ref) or `useMemo` and wait for first render to happen.\r\n   */\r\n  const [hasRendered, setHasRendered] = React.useState(false)\r\n\r\n  /**\r\n   * Generator makes the layout, it should only change when the map type or settings change.\r\n   */\r\n  const generator = React.useMemo(() => {\r\n    if (!hasRendered || !containerRef.current) return\r\n\r\n    const isSmall = mapUtils.getIsSmall()\r\n    const size = mapUtils.getSize(containerRef.current, type.type, isSmall)\r\n    const mapSettings = settings ?? mapUtils.getSettingsForMapType(type.type, isSmall)\r\n    const generator = new LayoutGenerator(size.width, size.height, type.type, mapSettings, isSmall)\r\n\r\n    // This is used for updating the map base data using map-generator\r\n    window.MAP_EXPORT = generator\r\n\r\n    return generator\r\n  }, [hasRendered, type.type, settings])\r\n\r\n  /**\r\n   * Treemap object is the logical representation of the map (whereas Canvas is graphical)\r\n   * We want to hold to it for as long as we can and reuse it. That’s why we’re comparing\r\n   * `prevTreemap` and returning the prev value if it equals.\r\n   */\r\n  const treemap = React.useMemo(() => {\r\n    if (!generator || !data || !dataHash || prevTreemap?.type === type.type) return prevTreemap\r\n\r\n    return new Treemap({\r\n      data: generator.getLayout(data),\r\n      width: generator.width,\r\n      height: generator.height,\r\n      settings: generator.settings,\r\n      isSmall: generator.isSmall,\r\n      scale: { id: subtype.scaleId, name: subtype.label, tooltip: subtype.tooltip },\r\n      countIndustryPerf: subtype.countIndustryPerf,\r\n      countSectorPerf: generator.isSmall && subtype.countSectorPerf,\r\n      type: type.type,\r\n      subtype: subtype.value,\r\n      truncateNodeName,\r\n      mapNodeId: prevTreemap?.mapNodeId,\r\n      dataHash,\r\n      zoomLevels: zoom === false ? [1] : undefined,\r\n    })\r\n    // Can’t add `prevTreemap` because we’d end up in a loop\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [generator, data, type.type, subtype])\r\n\r\n  /**\r\n   * Update context values\r\n   */\r\n  React.useEffect(() => {\r\n    setHasRendered(true)\r\n    setGenerator(generator)\r\n    setTreemap(treemap)\r\n  }, [generator, setGenerator, setTreemap, treemap])\r\n\r\n  /**\r\n   * Handle data updates\r\n   */\r\n  const updateTimeoutRef = React.useRef<number>()\r\n  React.useEffect(() => {\r\n    if (!treemap || !generator || !data || isFetchingPerf) return\r\n\r\n    updateTimeoutRef.current = window.setTimeout(() => {\r\n      if (!dataHash || treemap.dataHash === dataHash) return\r\n\r\n      const layout = generator.getLayout(data)\r\n      mapActionCreators.updateLayout(treemap, {\r\n        width: generator.width,\r\n        height: generator.height,\r\n        data: layout,\r\n        scale: { id: subtype.scaleId, name: subtype.label, tooltip: subtype.tooltip },\r\n        dataHash,\r\n      })\r\n    }, 100)\r\n\r\n    return () => {\r\n      if (updateTimeoutRef.current) window.clearTimeout(updateTimeoutRef.current)\r\n    }\r\n  }, [generator, treemap, data, isFetchingPerf, subtype, dataHash])\r\n\r\n  /**\r\n   * Recalculate layout when the window size changes\r\n   */\r\n  React.useEffect(() => {\r\n    const containerElement = containerRef.current\r\n\r\n    if (!generator || !containerElement || !treemap || !data) return\r\n\r\n    const resize = throttle(() => {\r\n      const size = mapUtils.getSize(containerElement, generator.type, generator.isSmall)\r\n\r\n      if (size.width === treemap.width && size.height === treemap.height) return\r\n\r\n      treemap.zoom.scale(1)\r\n      generator.width = size.width\r\n      generator.height = size.height\r\n      const layout = generator.getLayout(data)\r\n      mapActionCreators.updateLayout(treemap, {\r\n        width: generator.width,\r\n        height: generator.height,\r\n        data: layout,\r\n        scale: treemap.scale,\r\n        dataHash: treemap.dataHash,\r\n      })\r\n    }, 100)\r\n\r\n    window.addEventListener('resize', resize)\r\n\r\n    return () => {\r\n      window.removeEventListener('resize', resize)\r\n    }\r\n  }, [generator, treemap, data])\r\n\r\n  return (\r\n    <div id=\"map\" className={className}>\r\n      <div\r\n        ref={containerRef}\r\n        id=\"body\"\r\n        className={classnames('relative h-full w-full', { 'pointer-events-none': !treemap })}\r\n      >\r\n        {(!treemap && !isLoadingData) || !treemap || isLoadingData ? (\r\n          <Delayed delayComponent={<div className=\"h-full w-full\" />}>\r\n            <div className=\"flex h-full items-center justify-center\">\r\n              <Spinner />\r\n            </div>\r\n          </Delayed>\r\n        ) : (\r\n          <Canvas\r\n            alt={document.title}\r\n            treemap={treemap}\r\n            onNodeClick={onNodeClick}\r\n            zoom={zoom}\r\n            zoomOnWheel={zoomOnWheel}\r\n            legend={legend}\r\n            hover={hover}\r\n          />\r\n        )}\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n","import debounce from 'lodash.debounce'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../../main/services/api'\r\nimport Treemap from '../treemap'\r\nimport { MapData, MapDataNode, MapTypeId, PerfData, Scale } from '../types'\r\nimport { getVisibleTooltipNodes } from '../utils'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport mapStore from './mapStore'\r\n\r\nvar _targetScale = 1\r\nfunction zoomIn(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n  _targetScale = scale\r\n  animate()\r\n  function animate() {\r\n    treemap.zoom.scale(+(treemap.zoom.scale() + 0.05).toFixed(2), { x: tx, y: ty })\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n    if (treemap.zoom.scale() + 0.05 < _targetScale + 0.00001) {\r\n      requestAnimationFrame(animate)\r\n    }\r\n  }\r\n}\r\n\r\nfunction zoomOut(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n  _targetScale = scale\r\n  animate()\r\n  function animate() {\r\n    treemap.zoom.scale(+(treemap.zoom.scale() - 0.05).toFixed(2), { x: tx, y: ty })\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n    if (treemap.zoom.scale() - 0.05 > _targetScale - 0.00001) {\r\n      requestAnimationFrame(animate)\r\n    }\r\n  }\r\n}\r\n\r\nfunction updateVisibleSparklines(treemap: Treemap) {\r\n  const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n  const visibleNodes = getVisibleTooltipNodes(hoveredNode)\r\n\r\n  if (!visibleNodes.length) return\r\n\r\n  const tickersToLoad = visibleNodes.map((node) => node!.name)\r\n  if (hoveredNode && !tickersToLoad.includes(hoveredNode?.name)) {\r\n    tickersToLoad.push(hoveredNode.name)\r\n  }\r\n\r\n  void debouncedLoadSparklines(tickersToLoad, treemap.type)\r\n}\r\n\r\nlet _lastSparklinesRequest: CancelablePromise<any> | null = null\r\nasync function loadSparklines(tickers: string[], mapType: string) {\r\n  AppDispatcher.handleViewAction({\r\n    type: ActionTypes.LOAD_SPARKLINES_STARTED,\r\n  })\r\n  _lastSparklinesRequest?.cancel?.()\r\n  _lastSparklinesRequest = apiRequest(\r\n    '/api/map_sparklines.ashx',\r\n    { query: { t: tickers.join(','), ty: mapType } },\r\n    true\r\n  )\r\n\r\n  try {\r\n    const data = await _lastSparklinesRequest\r\n    AppDispatcher.handleServerAction({\r\n      type: ActionTypes.LOAD_SPARKLINES_COMPLETED,\r\n      data: data,\r\n    })\r\n  } catch (error) {\r\n    // This just means we canceled the previous request\r\n    if (_lastSparklinesRequest.aborted) return\r\n\r\n    AppDispatcher.handleServerAction({\r\n      type: ActionTypes.LOAD_SPARKLINES_FAILED,\r\n      error,\r\n    })\r\n  }\r\n}\r\n\r\nconst debouncedLoadSparklines = debounce(loadSparklines, 200, { trailing: true })\r\n\r\nconst actions = {\r\n  setHoveredNode(mapNodeId: string, node: MapDataNode | undefined) {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.SET_HOVERED_NODE,\r\n      node,\r\n      mapNodeId,\r\n    })\r\n  },\r\n\r\n  loadSparklineData(tickers: string[], mapType: MapTypeId) {\r\n    if (tickers.length > 0) {\r\n      void debouncedLoadSparklines(tickers, mapType)\r\n    }\r\n  },\r\n\r\n  loadSparklinesCancel() {\r\n    _lastSparklinesRequest?.cancel?.()\r\n  },\r\n\r\n  resetSparklineData() {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.RESET_SPARKLINE_DATA,\r\n    })\r\n  },\r\n\r\n  changeTranslate(treemap: Treemap, tx: number, ty: number) {\r\n    treemap.zoom.translate([tx, ty])\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.CHANGE_TRANSLATE,\r\n    })\r\n  },\r\n\r\n  zoom(treemap: Treemap, direction: number, offsetX: number, offsetY: number) {\r\n    if (direction > 0) {\r\n      const zoomLevel = treemap.getNextZoomLevel()\r\n      if (zoomLevel !== treemap.zoom.scale()) {\r\n        zoomIn(treemap, zoomLevel, offsetX, offsetY)\r\n      }\r\n    } else {\r\n      const zoomLevel = treemap.getPreviousZoomLevel()\r\n      if (zoomLevel !== treemap.zoom.scale()) {\r\n        zoomOut(treemap, zoomLevel, offsetX, offsetY)\r\n      }\r\n    }\r\n  },\r\n\r\n  render() {\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n  },\r\n\r\n  zoomAndTranslate(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n    treemap.zoom.scale(1, { x: tx, y: ty })\r\n    treemap.zoom.scale(scale, { x: tx, y: ty })\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n  },\r\n\r\n  updateLayout(\r\n    treemap: Treemap,\r\n    props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }\r\n  ) {\r\n    treemap.updateData(props)\r\n    treemap.zoom.updateDimensions(props)\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n\r\n    // Update hovered node if any\r\n    const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n    if (hoveredNode) {\r\n      AppDispatcher.handleViewAction({\r\n        type: ActionTypes.SET_HOVERED_NODE,\r\n        node: treemap.nodes.find((node) => node.name === hoveredNode.name),\r\n        mapNodeId: treemap.mapNodeId,\r\n      })\r\n      updateVisibleSparklines(treemap)\r\n    }\r\n  },\r\n\r\n  updatePerfData(treemap?: Treemap, data?: PerfData) {\r\n    if (!treemap || !data) return\r\n\r\n    treemap.updatePerf(data)\r\n    AppDispatcher.handleServerAction({ type: ActionTypes.UPDATE_DATA, version: data.version })\r\n\r\n    updateVisibleSparklines(treemap)\r\n  },\r\n\r\n  _setOnPublish(getPublishCanvas: () => HTMLCanvasElement) {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.SET_PUBLISH_CANVAS,\r\n      getPublishCanvas,\r\n    })\r\n  },\r\n\r\n  setupWidget() {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.SET_WIDGET,\r\n      isWidget: true,\r\n    })\r\n  },\r\n}\r\n\r\nexport default actions\r\n","import { Dispatcher } from 'flux'\r\n\r\nimport { PayloadSources } from './constants'\r\n\r\nclass AppDispatcher extends Dispatcher<any> {\r\n  handleServerAction(action: any) {\r\n    var payload = {\r\n      source: PayloadSources.SERVER_ACTION,\r\n      action: action,\r\n    }\r\n    //console.log(action, payload);\r\n    this.dispatch(payload)\r\n  }\r\n\r\n  handleViewAction(action: any) {\r\n    var payload = {\r\n      source: PayloadSources.VIEW_ACTION,\r\n      action: action,\r\n    }\r\n    //console.log(action, payload);\r\n    this.dispatch(payload)\r\n  }\r\n}\r\n\r\nconst dispatcher = new AppDispatcher()\r\nexport default dispatcher\r\n","import keyMirror from 'keymirror'\r\n\r\nconst ActionTypes = keyMirror({\r\n  RENDER_TREEMAP: null,\r\n  CHANGE_TRANSLATE: null,\r\n  SET_HOVERED_NODE: null,\r\n\r\n  LOAD_SPARKLINES_STARTED: null,\r\n  LOAD_SPARKLINES_COMPLETED: null,\r\n  LOAD_SPARKLINES_FAILED: null,\r\n  RESET_SPARKLINE_DATA: null,\r\n\r\n  INIT_STARTED: null,\r\n  INIT_FAILED: null,\r\n\r\n  UPDATE_DATA: null,\r\n\r\n  SET_PUBLISH_CANVAS: null,\r\n\r\n  SET_WIDGET: null,\r\n})\r\n\r\nconst PayloadSources = keyMirror({\r\n  SERVER_ACTION: null,\r\n  VIEW_ACTION: null,\r\n})\r\n\r\nexport { ActionTypes, PayloadSources }\r\n","import { EventEmitter } from 'events'\r\n\r\nclass Store extends EventEmitter {\r\n  static CHANGE_EVENT = 'change'\r\n\r\n  emitChange() {\r\n    this.emit(Store.CHANGE_EVENT)\r\n  }\r\n\r\n  addChangeListener(callback: (...args: any[]) => void) {\r\n    this.on(Store.CHANGE_EVENT, callback)\r\n  }\r\n\r\n  removeChangeListener(callback: (...args: any[]) => void) {\r\n    this.removeListener(Store.CHANGE_EVENT, callback)\r\n  }\r\n}\r\n\r\nexport default Store\r\n","import { MapDataNode } from '../types'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport Store from './store'\r\n\r\nlet _hoveredNode: MapDataNode\r\nlet _mapNodeId: string\r\nlet _sparklinesData: Record<string, number[]> = {}\r\nlet _dataVersion: number\r\nlet _isWidget = false\r\nlet _getPublishCanvas: () => HTMLCanvasElement\r\n\r\nclass MapStore extends Store {\r\n  getHoveredNode(mapNodeId: string) {\r\n    if (mapNodeId === _mapNodeId) return _hoveredNode\r\n    return undefined\r\n  }\r\n\r\n  getSparklines() {\r\n    return _sparklinesData\r\n  }\r\n\r\n  getDataVersion() {\r\n    return _dataVersion\r\n  }\r\n\r\n  isWidget() {\r\n    return _isWidget\r\n  }\r\n\r\n  getPublishCanvas() {\r\n    return _getPublishCanvas()\r\n  }\r\n}\r\n\r\nvar mapStore = new MapStore()\r\n\r\n// @ts-ignore\r\nmapStore.dispatchToken = AppDispatcher.register(function (payload: any) {\r\n  var action = payload.action\r\n\r\n  switch (action.type) {\r\n    case ActionTypes.RENDER_TREEMAP:\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.SET_HOVERED_NODE:\r\n      if (action.node !== _hoveredNode) {\r\n        _hoveredNode = action.node\r\n        _mapNodeId = action.mapNodeId\r\n        mapStore.emitChange()\r\n      }\r\n      break\r\n\r\n    case ActionTypes.CHANGE_TRANSLATE:\r\n      // @ts-ignore\r\n      _hoveredNode = undefined\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.LOAD_SPARKLINES_STARTED:\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.LOAD_SPARKLINES_COMPLETED:\r\n      _sparklinesData = { ..._sparklinesData, ...action.data }\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.RESET_SPARKLINE_DATA:\r\n    case ActionTypes.LOAD_SPARKLINES_FAILED:\r\n      _sparklinesData = {}\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.UPDATE_DATA:\r\n      _dataVersion = action.version\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.SET_PUBLISH_CANVAS:\r\n      _getPublishCanvas = action.getPublishCanvas\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.SET_WIDGET:\r\n      _isWidget = action.isWidget\r\n      mapStore.emitChange()\r\n      break\r\n  }\r\n})\r\n\r\nexport default mapStore\r\n","// Based on Lato font with bold weight\r\nexport const fontSizesWidths: Record<number, Record<string | number, number>> = {\r\n  4: {\r\n    0: 2.32,\r\n    1: 2.32,\r\n    2: 2.32,\r\n    3: 2.32,\r\n    4: 2.32,\r\n    5: 2.32,\r\n    6: 2.32,\r\n    7: 2.32,\r\n    8: 2.32,\r\n    9: 2.32,\r\n    ' ': 0.772,\r\n    '+': 2.32,\r\n    '-': 1.436,\r\n    '%': 3.212,\r\n    '.': 0.9,\r\n    a: 2.094,\r\n    b: 2.28,\r\n    c: 1.908,\r\n    d: 2.28,\r\n    e: 2.138,\r\n    f: 1.402,\r\n    g: 2.07,\r\n    h: 2.274,\r\n    i: 1.084,\r\n    j: 1.076,\r\n    k: 2.206,\r\n    l: 1.084,\r\n    m: 3.368,\r\n    n: 2.274,\r\n    o: 2.274,\r\n    p: 2.262,\r\n    q: 2.28,\r\n    r: 1.634,\r\n    s: 1.748,\r\n    t: 1.548,\r\n    u: 2.274,\r\n    v: 2.134,\r\n    w: 3.164,\r\n    x: 2.16,\r\n    y: 2.134,\r\n    z: 1.878,\r\n    A: 2.84,\r\n    B: 2.606,\r\n    C: 2.682,\r\n    D: 2.99,\r\n    E: 2.29,\r\n    F: 2.246,\r\n    G: 2.892,\r\n    H: 3.024,\r\n    I: 1.256,\r\n    J: 1.748,\r\n    K: 2.792,\r\n    L: 2.068,\r\n    M: 3.72,\r\n    N: 3.024,\r\n    O: 3.198,\r\n    P: 2.5,\r\n    Q: 3.198,\r\n    R: 2.62,\r\n    S: 2.146,\r\n    T: 2.38,\r\n    U: 2.912,\r\n    V: 2.84,\r\n    W: 4.186,\r\n    X: 2.716,\r\n    Y: 2.618,\r\n    Z: 2.468,\r\n  },\r\n  6: {\r\n    0: 3.48,\r\n    1: 3.48,\r\n    2: 3.48,\r\n    3: 3.48,\r\n    4: 3.48,\r\n    5: 3.48,\r\n    6: 3.48,\r\n    7: 3.48,\r\n    8: 3.48,\r\n    9: 3.48,\r\n    ' ': 1.158,\r\n    '+': 3.48,\r\n    '-': 2.154,\r\n    '%': 4.818,\r\n    '.': 1.35,\r\n    a: 3.141,\r\n    b: 3.42,\r\n    c: 2.862,\r\n    d: 3.42,\r\n    e: 3.207,\r\n    f: 2.103,\r\n    g: 3.105,\r\n    h: 3.411,\r\n    i: 1.626,\r\n    j: 1.614,\r\n    k: 3.309,\r\n    l: 1.626,\r\n    m: 5.052,\r\n    n: 3.411,\r\n    o: 3.411,\r\n    p: 3.393,\r\n    q: 3.42,\r\n    r: 2.451,\r\n    s: 2.622,\r\n    t: 2.322,\r\n    u: 3.411,\r\n    v: 3.201,\r\n    w: 4.746,\r\n    x: 3.24,\r\n    y: 3.201,\r\n    z: 2.817,\r\n    A: 4.26,\r\n    B: 3.909,\r\n    C: 4.023,\r\n    D: 4.485,\r\n    E: 3.435,\r\n    F: 3.369,\r\n    G: 4.338,\r\n    H: 4.536,\r\n    I: 1.884,\r\n    J: 2.622,\r\n    K: 4.188,\r\n    L: 3.102,\r\n    M: 5.58,\r\n    N: 4.536,\r\n    O: 4.797,\r\n    P: 3.75,\r\n    Q: 4.797,\r\n    R: 3.93,\r\n    S: 3.219,\r\n    T: 3.57,\r\n    U: 4.368,\r\n    V: 4.26,\r\n    W: 6.279,\r\n    X: 4.074,\r\n    Y: 3.927,\r\n    Z: 3.702,\r\n  },\r\n  8: {\r\n    0: 4.64,\r\n    1: 4.64,\r\n    2: 4.64,\r\n    3: 4.64,\r\n    4: 4.64,\r\n    5: 4.64,\r\n    6: 4.64,\r\n    7: 4.64,\r\n    8: 4.64,\r\n    9: 4.64,\r\n    ' ': 1.544,\r\n    '+': 4.64,\r\n    '-': 2.872,\r\n    '%': 6.424,\r\n    '.': 1.8,\r\n    a: 4.188,\r\n    b: 4.56,\r\n    c: 3.816,\r\n    d: 4.56,\r\n    e: 4.276,\r\n    f: 2.804,\r\n    g: 4.14,\r\n    h: 4.548,\r\n    i: 2.168,\r\n    j: 2.152,\r\n    k: 4.412,\r\n    l: 2.168,\r\n    m: 6.736,\r\n    n: 4.548,\r\n    o: 4.548,\r\n    p: 4.524,\r\n    q: 4.56,\r\n    r: 3.268,\r\n    s: 3.496,\r\n    t: 3.096,\r\n    u: 4.548,\r\n    v: 4.268,\r\n    w: 6.328,\r\n    x: 4.32,\r\n    y: 4.268,\r\n    z: 3.756,\r\n    A: 5.68,\r\n    B: 5.212,\r\n    C: 5.364,\r\n    D: 5.98,\r\n    E: 4.58,\r\n    F: 4.492,\r\n    G: 5.784,\r\n    H: 6.048,\r\n    I: 2.512,\r\n    J: 3.496,\r\n    K: 5.584,\r\n    L: 4.136,\r\n    M: 7.44,\r\n    N: 6.048,\r\n    O: 6.396,\r\n    P: 5,\r\n    Q: 6.396,\r\n    R: 5.24,\r\n    S: 4.292,\r\n    T: 4.76,\r\n    U: 5.824,\r\n    V: 5.68,\r\n    W: 8.372,\r\n    X: 5.432,\r\n    Y: 5.236,\r\n    Z: 4.936,\r\n  },\r\n  9: {\r\n    0: 5.22,\r\n    1: 5.22,\r\n    2: 5.22,\r\n    3: 5.22,\r\n    4: 5.22,\r\n    5: 5.22,\r\n    6: 5.22,\r\n    7: 5.22,\r\n    8: 5.22,\r\n    9: 5.22,\r\n    ' ': 1.737,\r\n    '+': 5.22,\r\n    '-': 3.231,\r\n    '%': 7.227,\r\n    '.': 2.025,\r\n    a: 4.712,\r\n    b: 5.13,\r\n    c: 4.293,\r\n    d: 5.13,\r\n    e: 4.811,\r\n    f: 3.155,\r\n    g: 4.658,\r\n    h: 5.117,\r\n    i: 2.439,\r\n    j: 2.421,\r\n    k: 4.964,\r\n    l: 2.439,\r\n    m: 7.578,\r\n    n: 5.117,\r\n    o: 5.117,\r\n    p: 5.09,\r\n    q: 5.13,\r\n    r: 3.677,\r\n    s: 3.933,\r\n    t: 3.483,\r\n    u: 5.117,\r\n    v: 4.802,\r\n    w: 7.119,\r\n    x: 4.86,\r\n    y: 4.802,\r\n    z: 4.226,\r\n    A: 6.39,\r\n    B: 5.864,\r\n    C: 6.035,\r\n    D: 6.728,\r\n    E: 5.153,\r\n    F: 5.054,\r\n    G: 6.507,\r\n    H: 6.804,\r\n    I: 2.826,\r\n    J: 3.933,\r\n    K: 6.282,\r\n    L: 4.653,\r\n    M: 8.37,\r\n    N: 6.804,\r\n    O: 7.196,\r\n    P: 5.625,\r\n    Q: 7.196,\r\n    R: 5.895,\r\n    S: 4.829,\r\n    T: 5.355,\r\n    U: 6.552,\r\n    V: 6.39,\r\n    W: 9.419,\r\n    X: 6.111,\r\n    Y: 5.891,\r\n    Z: 5.553,\r\n  },\r\n  10: {\r\n    0: 5.8,\r\n    1: 5.8,\r\n    2: 5.8,\r\n    3: 5.8,\r\n    4: 5.8,\r\n    5: 5.8,\r\n    6: 5.8,\r\n    7: 5.8,\r\n    8: 5.8,\r\n    9: 5.8,\r\n    ' ': 1.93,\r\n    '+': 5.8,\r\n    '-': 3.59,\r\n    '%': 8.03,\r\n    '.': 2.25,\r\n    a: 5.235,\r\n    b: 5.7,\r\n    c: 4.77,\r\n    d: 5.7,\r\n    e: 5.345,\r\n    f: 3.505,\r\n    g: 5.175,\r\n    h: 5.685,\r\n    i: 2.71,\r\n    j: 2.69,\r\n    k: 5.515,\r\n    l: 2.71,\r\n    m: 8.42,\r\n    n: 5.685,\r\n    o: 5.685,\r\n    p: 5.655,\r\n    q: 5.7,\r\n    r: 4.085,\r\n    s: 4.37,\r\n    t: 3.87,\r\n    u: 5.685,\r\n    v: 5.335,\r\n    w: 7.91,\r\n    x: 5.4,\r\n    y: 5.335,\r\n    z: 4.695,\r\n    A: 7.1,\r\n    B: 6.515,\r\n    C: 6.705,\r\n    D: 7.475,\r\n    E: 5.725,\r\n    F: 5.615,\r\n    G: 7.23,\r\n    H: 7.56,\r\n    I: 3.14,\r\n    J: 4.37,\r\n    K: 6.98,\r\n    L: 5.17,\r\n    M: 9.3,\r\n    N: 7.56,\r\n    O: 7.995,\r\n    P: 6.25,\r\n    Q: 7.995,\r\n    R: 6.55,\r\n    S: 5.365,\r\n    T: 5.95,\r\n    U: 7.28,\r\n    V: 7.1,\r\n    W: 10.465,\r\n    X: 6.79,\r\n    Y: 6.545,\r\n    Z: 6.17,\r\n  },\r\n  11: {\r\n    0: 6.38,\r\n    1: 6.38,\r\n    2: 6.38,\r\n    3: 6.38,\r\n    4: 6.38,\r\n    5: 6.38,\r\n    6: 6.38,\r\n    7: 6.38,\r\n    8: 6.38,\r\n    9: 6.38,\r\n    ' ': 2.123,\r\n    '+': 6.38,\r\n    '-': 3.949,\r\n    '%': 8.833,\r\n    '.': 2.475,\r\n    a: 5.759,\r\n    b: 6.27,\r\n    c: 5.247,\r\n    d: 6.27,\r\n    e: 5.88,\r\n    f: 3.856,\r\n    g: 5.693,\r\n    h: 6.254,\r\n    i: 2.981,\r\n    j: 2.959,\r\n    k: 6.067,\r\n    l: 2.981,\r\n    m: 9.262,\r\n    n: 6.254,\r\n    o: 6.254,\r\n    p: 6.221,\r\n    q: 6.27,\r\n    r: 4.494,\r\n    s: 4.807,\r\n    t: 4.257,\r\n    u: 6.254,\r\n    v: 5.869,\r\n    w: 8.701,\r\n    x: 5.94,\r\n    y: 5.869,\r\n    z: 5.165,\r\n    A: 7.81,\r\n    B: 7.167,\r\n    C: 7.376,\r\n    D: 8.223,\r\n    E: 6.298,\r\n    F: 6.177,\r\n    G: 7.953,\r\n    H: 8.316,\r\n    I: 3.454,\r\n    J: 4.807,\r\n    K: 7.678,\r\n    L: 5.687,\r\n    M: 10.23,\r\n    N: 8.316,\r\n    O: 8.795,\r\n    P: 6.875,\r\n    Q: 8.795,\r\n    R: 7.205,\r\n    S: 5.902,\r\n    T: 6.545,\r\n    U: 8.008,\r\n    V: 7.81,\r\n    W: 11.512,\r\n    X: 7.469,\r\n    Y: 7.2,\r\n    Z: 6.787,\r\n  },\r\n  12: {\r\n    0: 6.96,\r\n    1: 6.96,\r\n    2: 6.96,\r\n    3: 6.96,\r\n    4: 6.96,\r\n    5: 6.96,\r\n    6: 6.96,\r\n    7: 6.96,\r\n    8: 6.96,\r\n    9: 6.96,\r\n    ' ': 2.316,\r\n    '+': 6.96,\r\n    '-': 4.308,\r\n    '%': 9.636,\r\n    '.': 2.7,\r\n    a: 6.282,\r\n    b: 6.84,\r\n    c: 5.724,\r\n    d: 6.84,\r\n    e: 6.414,\r\n    f: 4.206,\r\n    g: 6.21,\r\n    h: 6.822,\r\n    i: 3.252,\r\n    j: 3.228,\r\n    k: 6.618,\r\n    l: 3.252,\r\n    m: 10.104,\r\n    n: 6.822,\r\n    o: 6.822,\r\n    p: 6.786,\r\n    q: 6.84,\r\n    r: 4.902,\r\n    s: 5.244,\r\n    t: 4.644,\r\n    u: 6.822,\r\n    v: 6.402,\r\n    w: 9.492,\r\n    x: 6.48,\r\n    y: 6.402,\r\n    z: 5.634,\r\n    A: 8.52,\r\n    B: 7.818,\r\n    C: 8.046,\r\n    D: 8.97,\r\n    E: 6.87,\r\n    F: 6.738,\r\n    G: 8.676,\r\n    H: 9.072,\r\n    I: 3.768,\r\n    J: 5.244,\r\n    K: 8.376,\r\n    L: 6.204,\r\n    M: 11.16,\r\n    N: 9.072,\r\n    O: 9.594,\r\n    P: 7.5,\r\n    Q: 9.594,\r\n    R: 7.86,\r\n    S: 6.438,\r\n    T: 7.14,\r\n    U: 8.736,\r\n    V: 8.52,\r\n    W: 12.558,\r\n    X: 8.148,\r\n    Y: 7.854,\r\n    Z: 7.404,\r\n  },\r\n  13: {\r\n    0: 7.54,\r\n    1: 7.54,\r\n    2: 7.54,\r\n    3: 7.54,\r\n    4: 7.54,\r\n    5: 7.54,\r\n    6: 7.54,\r\n    7: 7.54,\r\n    8: 7.54,\r\n    9: 7.54,\r\n    ' ': 2.509,\r\n    '+': 7.54,\r\n    '-': 4.667,\r\n    '%': 10.439,\r\n    '.': 2.925,\r\n    a: 6.806,\r\n    b: 7.41,\r\n    c: 6.201,\r\n    d: 7.41,\r\n    e: 6.949,\r\n    f: 4.557,\r\n    g: 6.728,\r\n    h: 7.391,\r\n    i: 3.523,\r\n    j: 3.497,\r\n    k: 7.17,\r\n    l: 3.523,\r\n    m: 10.946,\r\n    n: 7.391,\r\n    o: 7.391,\r\n    p: 7.352,\r\n    q: 7.41,\r\n    r: 5.311,\r\n    s: 5.681,\r\n    t: 5.031,\r\n    u: 7.391,\r\n    v: 6.936,\r\n    w: 10.283,\r\n    x: 7.02,\r\n    y: 6.936,\r\n    z: 6.104,\r\n    A: 9.23,\r\n    B: 8.47,\r\n    C: 8.717,\r\n    D: 9.718,\r\n    E: 7.443,\r\n    F: 7.3,\r\n    G: 9.399,\r\n    H: 9.828,\r\n    I: 4.082,\r\n    J: 5.681,\r\n    K: 9.074,\r\n    L: 6.721,\r\n    M: 12.09,\r\n    N: 9.828,\r\n    O: 10.394,\r\n    P: 8.125,\r\n    Q: 10.394,\r\n    R: 8.515,\r\n    S: 6.975,\r\n    T: 7.735,\r\n    U: 9.464,\r\n    V: 9.23,\r\n    W: 13.605,\r\n    X: 8.827,\r\n    Y: 8.509,\r\n    Z: 8.021,\r\n  },\r\n  14: {\r\n    0: 8.12,\r\n    1: 8.12,\r\n    2: 8.12,\r\n    3: 8.12,\r\n    4: 8.12,\r\n    5: 8.12,\r\n    6: 8.12,\r\n    7: 8.12,\r\n    8: 8.12,\r\n    9: 8.12,\r\n    ' ': 2.702,\r\n    '+': 8.12,\r\n    '-': 5.026,\r\n    '%': 11.242,\r\n    '.': 3.15,\r\n    a: 7.329,\r\n    b: 7.98,\r\n    c: 6.678,\r\n    d: 7.98,\r\n    e: 7.483,\r\n    f: 4.907,\r\n    g: 7.245,\r\n    h: 7.959,\r\n    i: 3.794,\r\n    j: 3.766,\r\n    k: 7.721,\r\n    l: 3.794,\r\n    m: 11.788,\r\n    n: 7.959,\r\n    o: 7.959,\r\n    p: 7.917,\r\n    q: 7.98,\r\n    r: 5.719,\r\n    s: 6.118,\r\n    t: 5.418,\r\n    u: 7.959,\r\n    v: 7.469,\r\n    w: 11.074,\r\n    x: 7.56,\r\n    y: 7.469,\r\n    z: 6.573,\r\n    A: 9.94,\r\n    B: 9.121,\r\n    C: 9.387,\r\n    D: 10.465,\r\n    E: 8.015,\r\n    F: 7.861,\r\n    G: 10.122,\r\n    H: 10.584,\r\n    I: 4.396,\r\n    J: 6.118,\r\n    K: 9.772,\r\n    L: 7.238,\r\n    M: 13.02,\r\n    N: 10.584,\r\n    O: 11.193,\r\n    P: 8.75,\r\n    Q: 11.193,\r\n    R: 9.17,\r\n    S: 7.511,\r\n    T: 8.33,\r\n    U: 10.192,\r\n    V: 9.94,\r\n    W: 14.651,\r\n    X: 9.506,\r\n    Y: 9.163,\r\n    Z: 8.638,\r\n  },\r\n  18: {\r\n    0: 10.44,\r\n    1: 10.44,\r\n    2: 10.44,\r\n    3: 10.44,\r\n    4: 10.44,\r\n    5: 10.44,\r\n    6: 10.44,\r\n    7: 10.44,\r\n    8: 10.44,\r\n    9: 10.44,\r\n    ' ': 3.474,\r\n    '+': 10.44,\r\n    '-': 6.462,\r\n    '%': 14.454,\r\n    '.': 4.05,\r\n    a: 9.423,\r\n    b: 10.26,\r\n    c: 8.586,\r\n    d: 10.26,\r\n    e: 9.621,\r\n    f: 6.309,\r\n    g: 9.315,\r\n    h: 10.233,\r\n    i: 4.878,\r\n    j: 4.842,\r\n    k: 9.927,\r\n    l: 4.878,\r\n    m: 15.156,\r\n    n: 10.233,\r\n    o: 10.233,\r\n    p: 10.179,\r\n    q: 10.26,\r\n    r: 7.353,\r\n    s: 7.866,\r\n    t: 6.966,\r\n    u: 10.233,\r\n    v: 9.603,\r\n    w: 14.238,\r\n    x: 9.72,\r\n    y: 9.603,\r\n    z: 8.451,\r\n    A: 12.78,\r\n    B: 11.727,\r\n    C: 12.069,\r\n    D: 13.455,\r\n    E: 10.305,\r\n    F: 10.107,\r\n    G: 13.014,\r\n    H: 13.608,\r\n    I: 5.652,\r\n    J: 7.866,\r\n    K: 12.564,\r\n    L: 9.306,\r\n    M: 16.74,\r\n    N: 13.608,\r\n    O: 14.391,\r\n    P: 11.25,\r\n    Q: 14.391,\r\n    R: 11.79,\r\n    S: 9.657,\r\n    T: 10.71,\r\n    U: 13.104,\r\n    V: 12.78,\r\n    W: 18.837,\r\n    X: 12.222,\r\n    Y: 11.781,\r\n    Z: 11.106,\r\n  },\r\n  20: {\r\n    0: 11.6,\r\n    1: 11.6,\r\n    2: 11.6,\r\n    3: 11.6,\r\n    4: 11.6,\r\n    5: 11.6,\r\n    6: 11.6,\r\n    7: 11.6,\r\n    8: 11.6,\r\n    9: 11.6,\r\n    ' ': 3.86,\r\n    '+': 11.6,\r\n    '-': 7.18,\r\n    '%': 16.06,\r\n    '.': 4.5,\r\n    a: 10.47,\r\n    b: 11.4,\r\n    c: 9.54,\r\n    d: 11.4,\r\n    e: 10.69,\r\n    f: 7.01,\r\n    g: 10.35,\r\n    h: 11.37,\r\n    i: 5.42,\r\n    j: 5.38,\r\n    k: 11.03,\r\n    l: 5.42,\r\n    m: 16.84,\r\n    n: 11.37,\r\n    o: 11.37,\r\n    p: 11.31,\r\n    q: 11.4,\r\n    r: 8.17,\r\n    s: 8.74,\r\n    t: 7.74,\r\n    u: 11.37,\r\n    v: 10.67,\r\n    w: 15.82,\r\n    x: 10.8,\r\n    y: 10.67,\r\n    z: 9.39,\r\n    A: 14.2,\r\n    B: 13.03,\r\n    C: 13.41,\r\n    D: 14.95,\r\n    E: 11.45,\r\n    F: 11.23,\r\n    G: 14.46,\r\n    H: 15.12,\r\n    I: 6.28,\r\n    J: 8.74,\r\n    K: 13.96,\r\n    L: 10.34,\r\n    M: 18.6,\r\n    N: 15.12,\r\n    O: 15.99,\r\n    P: 12.5,\r\n    Q: 15.99,\r\n    R: 13.1,\r\n    S: 10.73,\r\n    T: 11.9,\r\n    U: 14.56,\r\n    V: 14.2,\r\n    W: 20.93,\r\n    X: 13.58,\r\n    Y: 13.09,\r\n    Z: 12.34,\r\n  },\r\n  24: {\r\n    0: 13.92,\r\n    1: 13.92,\r\n    2: 13.92,\r\n    3: 13.92,\r\n    4: 13.92,\r\n    5: 13.92,\r\n    6: 13.92,\r\n    7: 13.92,\r\n    8: 13.92,\r\n    9: 13.92,\r\n    ' ': 4.632,\r\n    '+': 13.92,\r\n    '-': 8.616,\r\n    '%': 19.272,\r\n    '.': 5.4,\r\n    a: 12.564,\r\n    b: 13.68,\r\n    c: 11.448,\r\n    d: 13.68,\r\n    e: 12.828,\r\n    f: 8.412,\r\n    g: 12.42,\r\n    h: 13.644,\r\n    i: 6.504,\r\n    j: 6.456,\r\n    k: 13.236,\r\n    l: 6.504,\r\n    m: 20.208,\r\n    n: 13.644,\r\n    o: 13.644,\r\n    p: 13.572,\r\n    q: 13.68,\r\n    r: 9.804,\r\n    s: 10.488,\r\n    t: 9.288,\r\n    u: 13.644,\r\n    v: 12.804,\r\n    w: 18.984,\r\n    x: 12.96,\r\n    y: 12.804,\r\n    z: 11.268,\r\n    A: 17.04,\r\n    B: 15.636,\r\n    C: 16.092,\r\n    D: 17.94,\r\n    E: 13.74,\r\n    F: 13.476,\r\n    G: 17.352,\r\n    H: 18.144,\r\n    I: 7.536,\r\n    J: 10.488,\r\n    K: 16.752,\r\n    L: 12.408,\r\n    M: 22.32,\r\n    N: 18.144,\r\n    O: 19.188,\r\n    P: 15,\r\n    Q: 19.188,\r\n    R: 15.72,\r\n    S: 12.876,\r\n    T: 14.28,\r\n    U: 17.472,\r\n    V: 17.04,\r\n    W: 25.116,\r\n    X: 16.296,\r\n    Y: 15.708,\r\n    Z: 14.808,\r\n  },\r\n  30: {\r\n    0: 17.4,\r\n    1: 17.4,\r\n    2: 17.4,\r\n    3: 17.4,\r\n    4: 17.4,\r\n    5: 17.4,\r\n    6: 17.4,\r\n    7: 17.4,\r\n    8: 17.4,\r\n    9: 17.4,\r\n    ' ': 5.79,\r\n    '+': 17.4,\r\n    '-': 10.77,\r\n    '%': 24.09,\r\n    '.': 6.75,\r\n    a: 15.705,\r\n    b: 17.1,\r\n    c: 14.31,\r\n    d: 17.1,\r\n    e: 16.035,\r\n    f: 10.515,\r\n    g: 15.525,\r\n    h: 17.055,\r\n    i: 8.13,\r\n    j: 8.07,\r\n    k: 16.545,\r\n    l: 8.13,\r\n    m: 25.26,\r\n    n: 17.055,\r\n    o: 17.055,\r\n    p: 16.965,\r\n    q: 17.1,\r\n    r: 12.255,\r\n    s: 13.11,\r\n    t: 11.61,\r\n    u: 17.055,\r\n    v: 16.005,\r\n    w: 23.73,\r\n    x: 16.2,\r\n    y: 16.005,\r\n    z: 14.085,\r\n    A: 21.3,\r\n    B: 19.545,\r\n    C: 20.115,\r\n    D: 22.425,\r\n    E: 17.175,\r\n    F: 16.845,\r\n    G: 21.69,\r\n    H: 22.68,\r\n    I: 9.42,\r\n    J: 13.11,\r\n    K: 20.94,\r\n    L: 15.51,\r\n    M: 27.9,\r\n    N: 22.68,\r\n    O: 23.985,\r\n    P: 18.75,\r\n    Q: 23.985,\r\n    R: 19.65,\r\n    S: 16.095,\r\n    T: 17.85,\r\n    U: 21.84,\r\n    V: 21.3,\r\n    W: 31.395,\r\n    X: 20.37,\r\n    Y: 19.635,\r\n    Z: 18.51,\r\n  },\r\n  36: {\r\n    0: 20.88,\r\n    1: 20.88,\r\n    2: 20.88,\r\n    3: 20.88,\r\n    4: 20.88,\r\n    5: 20.88,\r\n    6: 20.88,\r\n    7: 20.88,\r\n    8: 20.88,\r\n    9: 20.88,\r\n    ' ': 6.948,\r\n    '+': 20.88,\r\n    '-': 12.924,\r\n    '%': 28.908,\r\n    '.': 8.1,\r\n    a: 18.846,\r\n    b: 20.52,\r\n    c: 17.172,\r\n    d: 20.52,\r\n    e: 19.242,\r\n    f: 12.618,\r\n    g: 18.63,\r\n    h: 20.466,\r\n    i: 9.756,\r\n    j: 9.684,\r\n    k: 19.854,\r\n    l: 9.756,\r\n    m: 30.312,\r\n    n: 20.466,\r\n    o: 20.466,\r\n    p: 20.358,\r\n    q: 20.52,\r\n    r: 14.706,\r\n    s: 15.732,\r\n    t: 13.932,\r\n    u: 20.466,\r\n    v: 19.206,\r\n    w: 28.476,\r\n    x: 19.44,\r\n    y: 19.206,\r\n    z: 16.902,\r\n    A: 25.56,\r\n    B: 23.454,\r\n    C: 24.138,\r\n    D: 26.91,\r\n    E: 20.61,\r\n    F: 20.214,\r\n    G: 26.028,\r\n    H: 27.216,\r\n    I: 11.304,\r\n    J: 15.732,\r\n    K: 25.128,\r\n    L: 18.612,\r\n    M: 33.48,\r\n    N: 27.216,\r\n    O: 28.782,\r\n    P: 22.5,\r\n    Q: 28.782,\r\n    R: 23.58,\r\n    S: 19.314,\r\n    T: 21.42,\r\n    U: 26.208,\r\n    V: 25.56,\r\n    W: 37.674,\r\n    X: 24.444,\r\n    Y: 23.562,\r\n    Z: 22.212,\r\n  },\r\n}\r\n\r\nexport const fontSizeLineHeights: Record<number, number> = {\r\n  4: 5,\r\n  6: 7,\r\n  8: 10,\r\n  9: 11,\r\n  10: 12,\r\n  11: 13,\r\n  12: 14,\r\n  13: 15,\r\n  14: 20,\r\n  18: 21,\r\n  20: 24,\r\n  24: 28,\r\n  30: 35,\r\n  36: 42,\r\n}\r\n","import * as d3 from 'd3'\r\n\r\ninterface Dimensions {\r\n  width: number\r\n  height: number\r\n}\r\n\r\nexport class Zoom<Datum> {\r\n  zoomElement = document.createElement('canvas')\r\n  zoomSelection = d3.select<HTMLCanvasElement, Datum>(this.zoomElement)\r\n  behavior: d3.ZoomBehavior<HTMLCanvasElement, Datum>\r\n\r\n  translateExtent: [width: number, height: number]\r\n  zoomLevels: number[]\r\n\r\n  constructor(dimensions: Dimensions, zoomLevels: number[]) {\r\n    this.translateExtent = [dimensions.width, dimensions.height]\r\n    this.zoomLevels = zoomLevels\r\n\r\n    this.behavior = d3\r\n      .zoom<HTMLCanvasElement, Datum>()\r\n      .extent([[0, 0], this.translateExtent])\r\n      .scaleExtent([this.zoomLevels[0], this.zoomLevels[this.zoomLevels.length - 1]])\r\n      .translateExtent([[0, 0], this.translateExtent])\r\n      .on('zoom', null)\r\n\r\n    this.zoomSelection.call(this.behavior)\r\n  }\r\n\r\n  updateDimensions = (dimensions: Dimensions) => {\r\n    this.translateExtent = [dimensions.width, dimensions.height]\r\n    this.behavior.extent([[0, 0], this.translateExtent]).translateExtent([[0, 0], this.translateExtent])\r\n  }\r\n\r\n  getTransform = () => d3.zoomTransform(this.zoomElement)\r\n\r\n  scale = (newZoom?: number, mapCenter?: { x: number; y: number }) => {\r\n    if (typeof newZoom === 'number' && Number.isFinite(newZoom)) {\r\n      if (mapCenter) {\r\n        this.zoomSelection.call(this.behavior.scaleTo, newZoom, [mapCenter.x, mapCenter.y])\r\n      } else {\r\n        this.zoomSelection.call(this.behavior.scaleTo, newZoom)\r\n      }\r\n      return newZoom\r\n    }\r\n\r\n    return this.getTransform().k\r\n  }\r\n\r\n  translate = (args?: [x: number, y: number]): [x: number, y: number] => {\r\n    const scale = this.scale()\r\n\r\n    if (Array.isArray(args) && Number.isFinite(args[0]) && Number.isFinite(args[1])) {\r\n      this.zoomSelection.call(this.behavior.translateBy, -(args[0] / scale), -(args[1] / scale))\r\n      return [args[0], args[1]]\r\n    }\r\n    let t = this.getTransform()\r\n    return [t.x, t.y]\r\n  }\r\n\r\n  translateAbs = ([x, y]: [x: number, y: number]) => {\r\n    const scale = this.scale()\r\n    this.zoomSelection.call(this.behavior.translateTo, -(x / scale), -(y / scale), [0, 0])\r\n  }\r\n\r\n  getNearestSize(currentZoom: number = this.scale()) {\r\n    let nearestSize = this.zoomLevels[0]\r\n    for (var i = 0, len = this.zoomLevels.length; i < len; i++) {\r\n      const level = this.zoomLevels[i]\r\n      if (level >= currentZoom) {\r\n        nearestSize = level\r\n        break\r\n      }\r\n    }\r\n\r\n    return nearestSize\r\n  }\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport { PortfolioSymbolType } from '../../main/modules/portfolio/types'\r\nimport { getSymbolType } from '../../main/modules/portfolio/utils'\r\nimport { getUuid } from '../../main/util'\r\nimport { getTextFontFamily } from '../shared/getTextFontFamily'\r\nimport { gradientSmall, gradients } from '../shared/gradients'\r\nimport { fontSizeLineHeights, fontSizesWidths } from './constants/font'\r\nimport { ISettingsSection, scaleMinMax, scaleStepFormat } from './constants/settings'\r\nimport { ISettings, ISettingsSectionFont, ISettingsSectionHeader } from './constants/settings'\r\nimport LayoutGenerator from './layout-generator'\r\nimport {\r\n  MapData,\r\n  MapDataIndustry,\r\n  MapDataNode,\r\n  MapDataRow,\r\n  MapDataSector,\r\n  MapSubtypeId,\r\n  MapTypeId,\r\n  PerfData,\r\n  Scale,\r\n  ScaleId,\r\n} from './types'\r\nimport * as mapUtils from './utils'\r\nimport { Zoom } from './zoom'\r\n\r\nconst fontFamily = getTextFontFamily()\r\n\r\nclass Treemap {\r\n  width: number\r\n  height: number\r\n  version?: number\r\n  scale: Scale\r\n  countIndustryPerf: boolean\r\n  countSectorPerf?: boolean\r\n  nodes: MapDataNode[] = []\r\n  sectors: MapDataSector[] = []\r\n  industries: MapDataIndustry[] = []\r\n  zoom: Zoom<MapDataNode>\r\n  colorScale: (n?: number) => string\r\n  settings: ISettings\r\n  type: MapTypeId\r\n  subtype: MapSubtypeId\r\n  isSmall: boolean\r\n  zoomLevels: number[]\r\n  dataHash: string\r\n  mapNodeId: string\r\n  truncateNodeName: boolean\r\n\r\n  constructor({\r\n    countIndustryPerf = false,\r\n    countSectorPerf = false,\r\n    subtype = MapSubtypeId.DayPerf,\r\n    isSmall = false,\r\n    zoomLevels = mapUtils.getDefaultZoomLevels(),\r\n    truncateNodeName = false,\r\n    ...props\r\n  }: {\r\n    data: MapData\r\n    width: number\r\n    height: number\r\n    version?: number\r\n    scale: Scale\r\n    countIndustryPerf?: boolean\r\n    countSectorPerf?: boolean\r\n    settings: ISettings\r\n    type: MapTypeId\r\n    subtype?: MapSubtypeId\r\n    isSmall?: boolean\r\n    zoomLevels?: number[]\r\n    truncateNodeName?: boolean\r\n    mapNodeId?: string\r\n    dataHash: string\r\n  }) {\r\n    this.width = props.width\r\n    this.height = props.height\r\n    this.version = props.version\r\n    this.settings = props.settings\r\n    this.type = props.type\r\n    this.scale = props.scale\r\n    this.nodes = props.data.nodes\r\n    this.sectors = props.data.sectors\r\n    this.industries = props.data.industries\r\n    this.subtype = subtype\r\n    this.zoomLevels = zoomLevels\r\n    this.isSmall = isSmall\r\n    this.countIndustryPerf = countIndustryPerf\r\n    this.countSectorPerf = countSectorPerf\r\n    this.truncateNodeName = truncateNodeName\r\n    this.mapNodeId = props.mapNodeId ?? getUuid()\r\n    this.dataHash = props.dataHash\r\n\r\n    this.zoom = new Zoom<MapDataNode>({ width: this.width, height: this.height }, this.zoomLevels)\r\n\r\n    this.colorScale = this.getColorScale()\r\n\r\n    if (this.countIndustryPerf) {\r\n      this._updateIndustryPerf()\r\n    }\r\n    if (this.countSectorPerf) {\r\n      this._updateSectorPerf()\r\n    }\r\n  }\r\n\r\n  getIsSmall() {\r\n    return this.isSmall\r\n  }\r\n\r\n  updateData(props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }) {\r\n    this.width = props.width\r\n    this.height = props.height\r\n    this.nodes = props.data.nodes\r\n    this.sectors = props.data.sectors\r\n    this.industries = props.data.industries\r\n    this.scale = props.scale\r\n    this.dataHash = props.dataHash\r\n\r\n    if (this.countIndustryPerf) {\r\n      this._updateIndustryPerf()\r\n    }\r\n    if (this.countSectorPerf) {\r\n      this._updateSectorPerf()\r\n    }\r\n\r\n    this.colorScale = this.getColorScale()\r\n  }\r\n\r\n  getScaleMinMax() {\r\n    switch (this.scale.id) {\r\n      case ScaleId.PortfolioPct:\r\n      case ScaleId.PortfolioUsd:\r\n        if (this.nodes.length === 0) return [0, 0]\r\n        // get min/max week perf\r\n        const minValuePerf = Math.abs(d3.min(this.nodes, (node: MapDataNode) => node.data?.perfWeek ?? 0))\r\n        const maxValuePerf = Math.abs(d3.max(this.nodes, (node: MapDataNode) => node.data?.perfWeek ?? 0))\r\n        const perfMax = Math.max(minValuePerf, maxValuePerf)\r\n        // get min/max all time perf\r\n        const minValueNode = Math.abs(d3.min(this.nodes, (node: MapDataNode) => node.perf)!)\r\n        const maxValueNode = Math.abs(d3.max(this.nodes, (node: MapDataNode) => node.perf)!)\r\n        const valueMax = Math.max(minValueNode, maxValueNode)\r\n        // Use the weekly perf as a buffer, compute number of digits and round nicely\r\n        const valueToUse = this.scale.id === ScaleId.PortfolioPct ? valueMax + perfMax : valueMax * (1 + perfMax / 100)\r\n        // Sanity check\r\n        if (Number.isNaN(valueToUse)) return [0, 0]\r\n        const numberOfDigits = Math.max(Math.floor(Math.log10(Math.abs(valueToUse))), 0) + 1\r\n        const roundedBound = Math.ceil(valueToUse / numberOfDigits) * numberOfDigits\r\n\r\n        return [-roundedBound, roundedBound]\r\n      default:\r\n        return scaleMinMax[this.scale.id]\r\n    }\r\n  }\r\n\r\n  getColorScale() {\r\n    const [minDomain, maxDomain] = this.getScaleMinMax()\r\n    let gradient = gradients[this.scale.id]\r\n    if (this.getIsSmall() && this.scale.id === ScaleId.DayPerf) {\r\n      gradient = gradientSmall\r\n    }\r\n    const linearScale = d3\r\n      .scaleLinear()\r\n      .domain([minDomain, maxDomain])\r\n      .range([0, gradient.colors.length - 1])\r\n    return (d?: number) => {\r\n      if (typeof d === 'undefined' || !Number.isFinite(d)) {\r\n        return gradient.nullColor\r\n      }\r\n      const min = Math.min(minDomain, maxDomain)\r\n      const max = Math.max(minDomain, maxDomain)\r\n      const value = Math.max(Math.min(d, max), min)\r\n\r\n      const i = Math.round(linearScale(value))\r\n\r\n      return gradient.colors[i]\r\n    }\r\n  }\r\n\r\n  getParentSector(node: MapDataNode | MapDataIndustry): string {\r\n    if (node.parent && !!node.parent.parent) return this.getParentSector(node.parent as MapDataIndustry)\r\n\r\n    return node.name\r\n  }\r\n\r\n  /*\r\n   * data = {\r\n   *   nodes: {\"AAPL\":  1.5, \"MSFT\": -0.5}\r\n   *   industries: {...}\r\n   * }\r\n   */\r\n  updatePerf(data: PerfData) {\r\n    this.dataHash = data.hash\r\n\r\n    for (var i = 0; i < this.nodes.length; i++) {\r\n      const nodeName = this.nodes[i].name\r\n\r\n      if (Array.isArray(data.nodes)) {\r\n        const parentSector = this.getParentSector(this.nodes[i])\r\n        const updatedNode = data.nodes.find((node) => node.name === nodeName && node.data?.sector === parentSector)\r\n\r\n        if (!updatedNode) continue\r\n\r\n        this.nodes[i].perf = updatedNode.perf\r\n        this.nodes[i].additional = updatedNode.additional\r\n      } else {\r\n        this.nodes[i].perf = data.nodes[nodeName]\r\n        this.nodes[i].additional = data.additional[nodeName]\r\n      }\r\n    }\r\n\r\n    if (this.countIndustryPerf) {\r\n      this._updateIndustryPerf()\r\n    } else {\r\n      this._resetIndustryPerf()\r\n    }\r\n\r\n    if (this.countSectorPerf) {\r\n      this._updateSectorPerf()\r\n    }\r\n\r\n    this.colorScale = this.getColorScale()\r\n  }\r\n\r\n  _resetIndustryPerf() {\r\n    for (var i = 0; i < this.industries.length; i++) {\r\n      this.industries[i].perf = undefined\r\n    }\r\n  }\r\n\r\n  _updateIndustryPerf() {\r\n    var industry, weightedPriceSum, marketCapSum, stock, marketCap, everyStockUndefined\r\n    for (var i = 0; i < this.industries.length; i++) {\r\n      industry = this.industries[i]\r\n      weightedPriceSum = 0\r\n      marketCapSum = 0\r\n      everyStockUndefined = true\r\n      for (var j = 0; j < industry.children.length; j++) {\r\n        stock = industry.children[j]\r\n        marketCap = stock.dx * stock.dy\r\n        if (typeof stock.perf !== 'undefined' && stock.perf !== null) {\r\n          weightedPriceSum += stock.perf * marketCap\r\n          everyStockUndefined = false\r\n        }\r\n        marketCapSum += marketCap\r\n      }\r\n      if (!everyStockUndefined) {\r\n        industry.perf = marketCapSum !== 0 ? weightedPriceSum / marketCapSum : 0\r\n      }\r\n    }\r\n  }\r\n\r\n  _updateSectorPerf() {\r\n    var sector, industry, weightedPriceSum, marketCapSum, stock, marketCap\r\n    for (var s = 0; s < this.sectors.length; s++) {\r\n      sector = this.sectors[s]\r\n      weightedPriceSum = 0\r\n      marketCapSum = 0\r\n      for (var i = 0; i < sector.children.length; i++) {\r\n        industry = sector.children[i]\r\n        for (var j = 0; j < industry.children.length; j++) {\r\n          stock = industry.children[j]\r\n          marketCap = stock.dx * stock.dy\r\n          if (typeof stock.perf !== 'undefined' && stock.perf !== null) {\r\n            weightedPriceSum += stock.perf * marketCap\r\n          }\r\n          marketCapSum += marketCap\r\n        }\r\n      }\r\n      sector.perf = marketCapSum !== 0 ? weightedPriceSum / marketCapSum : 0\r\n    }\r\n  }\r\n\r\n  _getNodeTopOffset(node: MapDataNode) {\r\n    if (!this.isSmall && this.type === MapTypeId.World) return 0\r\n\r\n    const isSmallSecMap = this.isSmall && this.type === MapTypeId.Sector\r\n    // Industry\r\n    let parent: MapDataRow = node.parent\r\n    let leftPadding = this.settings.industry.padding.left\r\n    let topPadding = this.settings.industry.padding.top + this.settings.industry.header.height\r\n\r\n    if (isSmallSecMap) {\r\n      // Sector\r\n      parent = node.parent.parent\r\n      leftPadding = this.settings.sector.padding.left\r\n      topPadding = this.settings.sector.padding.top + this.settings.sector.header.height\r\n    }\r\n\r\n    const isFirstNodeInIndustry =\r\n      Math.floor(parent.x + leftPadding) === node.x && Math.floor(parent.y + topPadding) === node.y\r\n    const showIndustryHeader = LayoutGenerator.isNodeHeaderVisible(parent, this.settings)\r\n\r\n    return isFirstNodeInIndustry && showIndustryHeader ? 6 : 0\r\n  }\r\n\r\n  getNodeText(node: MapDataNode) {\r\n    let name = node.name\r\n    const scale = this.zoom.getNearestSize()\r\n    const fontSizes = this.settings.scaleFontSizes[scale]\r\n    const nodeTopOffset = this._getNodeTopOffset(node)\r\n    const nodeHeight = node.dy - nodeTopOffset\r\n\r\n    let nodeNameFontSize = this.findMaxFontSizeForText(node.name, node.dx, nodeHeight, fontSizes)\r\n    if (!nodeNameFontSize && this.truncateNodeName) {\r\n      nodeNameFontSize = fontSizes[fontSizes.length - 1]\r\n      name = this.getLongestText(\r\n        name,\r\n        nodeNameFontSize,\r\n        Math.max(0, node.dx - this.settings.fontSizePadding[nodeNameFontSize] * 2)\r\n      )\r\n    } else if (!nodeNameFontSize) return null\r\n\r\n    const nodeNameLineHeight = fontSizeLineHeights[nodeNameFontSize]\r\n    const stepFormat = scaleStepFormat[this.scale.id]\r\n    const format = stepFormat === '%N%' ? (node.dx > 32 ? stepFormat : '%N') : stepFormat\r\n\r\n    let perfText = getSymbolType(node.name) === PortfolioSymbolType.Cash ? '' : (node.additional ?? '')\r\n    if (perfText.length === 0 && node.perf !== undefined && Number.isFinite(node.perf)) {\r\n      perfText = this.formatValue(node.perf.toFixed(2), scaleMinMax[this.scale.id], format)\r\n    }\r\n\r\n    const fontPairs =\r\n      this.settings.fontSizePairs[nodeNameFontSize]?.filter((allowedSize) => fontSizes.includes(allowedSize)) ?? []\r\n\r\n    let perfFontSize\r\n    let perfLineHeight = 0\r\n    if (fontPairs.length) {\r\n      perfFontSize =\r\n        fontPairs && this.findMaxFontSizeForText(perfText, node.dx, nodeHeight - nodeNameLineHeight, fontPairs)\r\n      perfLineHeight = perfFontSize ? fontSizeLineHeights[perfFontSize] : 0\r\n    }\r\n\r\n    const textHeight = nodeNameLineHeight + perfLineHeight\r\n\r\n    return {\r\n      topOffset: node.dy - textHeight <= nodeTopOffset ? nodeTopOffset : 0,\r\n      fontSize: nodeNameFontSize,\r\n      perfText,\r\n      perfFontSize,\r\n      name,\r\n    }\r\n  }\r\n\r\n  findMaxFontSizeForText(text: string, width: number, height: number, fontSizes: number[]) {\r\n    if (!text.length) return\r\n\r\n    return fontSizes.find(\r\n      (fontSize) =>\r\n        this.getLongestText(text, fontSize, Math.max(0, width - this.settings.fontSizePadding[fontSize] * 2)) ===\r\n          text && fontSizeLineHeights[fontSize] < height\r\n    )\r\n  }\r\n\r\n  getLongestText(text: string, fontSize: number, maxWidth: number) {\r\n    if (maxWidth === 0) return ''\r\n    const widths = fontSizesWidths[fontSize]\r\n    let i = 0\r\n    let width = 0\r\n\r\n    while (i < text.length) {\r\n      width += widths[text[i]] ?? widths['W']\r\n      if (width > maxWidth) break\r\n      i++\r\n    }\r\n\r\n    return text.substring(0, i)\r\n  }\r\n\r\n  getZoomLevels() {\r\n    return this.zoomLevels\r\n  }\r\n\r\n  getNextZoomLevel() {\r\n    var actualZoomLevel = this.zoom.scale()\r\n    if (this.zoomLevels[this.zoomLevels.length - 1] === actualZoomLevel) {\r\n      return actualZoomLevel\r\n    }\r\n    for (var i = 0; i < this.zoomLevels.length; i++) {\r\n      if (this.zoomLevels[i] > actualZoomLevel) {\r\n        return this.zoomLevels[i]\r\n      }\r\n    }\r\n\r\n    return this.zoomLevels[0]\r\n  }\r\n\r\n  getPreviousZoomLevel() {\r\n    var actualZoomLevel = this.zoom.scale()\r\n    if (this.zoomLevels[0] === actualZoomLevel) {\r\n      return actualZoomLevel\r\n    }\r\n    for (var i = this.zoomLevels.length; i >= 0; i--) {\r\n      if (this.zoomLevels[i] < actualZoomLevel) {\r\n        return this.zoomLevels[i]\r\n      }\r\n    }\r\n\r\n    return this.zoomLevels[0]\r\n  }\r\n\r\n  getLastZoomLevel() {\r\n    return this.zoomLevels[this.zoomLevels.length - 1]\r\n  }\r\n\r\n  formatValue(\r\n    value: string,\r\n    [min, max]: [min: number, max: number] = scaleMinMax[this.scale.id],\r\n    format: string = scaleStepFormat[this.scale.id]\r\n  ) {\r\n    let stepFormat = format\r\n    if (typeof format !== 'string') {\r\n      stepFormat = format[value]\r\n    }\r\n\r\n    if (!stepFormat) return value\r\n\r\n    const floatValue = parseFloat(value)\r\n    const absValue = value.replace(/^-/, '')\r\n    const isPositiveScaleOnly = Math.min(min, max) >= 0 && Math.max(min, max) >= 0\r\n    let formated = stepFormat?.replace('%N', absValue) ?? absValue\r\n\r\n    // Some formats might not include number (eg. Before/After earnings)\r\n    if (!stepFormat || !stepFormat.includes('%N')) return formated\r\n\r\n    if (floatValue > 0 && !isPositiveScaleOnly) return `+${formated}`\r\n\r\n    if (floatValue < 0) return `-${formated}`\r\n\r\n    return formated\r\n  }\r\n\r\n  renderStockNode(node: MapDataNode, context: CanvasRenderingContext2D) {\r\n    // Draw background\r\n    context.fillStyle = this.colorScale(node.perf)\r\n    context.fillRect(node.x, node.y, node.dx - 1, node.dy - 1)\r\n\r\n    const nodeText = this.getNodeText(node)\r\n\r\n    if (!nodeText) return\r\n\r\n    context.save()\r\n\r\n    // Set text properties\r\n    context.textBaseline = 'middle'\r\n    context.textAlign = 'center'\r\n    context.fillStyle = 'rgba(0, 0, 0, 0.5)'\r\n\r\n    const nodeY = node.y + nodeText.topOffset\r\n    const nodeDY = node.dy - nodeText.topOffset\r\n    const textX = node.x + node.dx / 2\r\n    let nameY = nodeY + nodeDY / 2\r\n    let perfTextY = nameY + nodeText.fontSize / 2\r\n    const zoom = this.zoom.scale()\r\n    const offset = zoom > 1 ? (1 / zoom) * 1.2 : 1\r\n    if (nodeText.perfFontSize) {\r\n      perfTextY = nameY + nodeText.fontSize / 2\r\n      nameY -= nodeText.perfFontSize / 2\r\n      context.font = 'bold ' + nodeText.perfFontSize + 'px ' + fontFamily\r\n      context.fillText(nodeText.perfText, textX + offset, perfTextY + offset)\r\n    }\r\n\r\n    context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\r\n    context.fillText(nodeText.name, textX + offset, nameY + offset)\r\n\r\n    context.fillStyle = 'rgba(255, 255, 255, 1)'\r\n\r\n    if (nodeText.perfFontSize) {\r\n      context.font = 'bold ' + nodeText.perfFontSize + 'px ' + fontFamily\r\n      context.fillText(nodeText.perfText, textX, perfTextY)\r\n    }\r\n\r\n    context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\r\n    context.fillText(nodeText.name, textX, nameY)\r\n    context.restore()\r\n  }\r\n\r\n  getSpacingWithDefaults(spacing?: { top: number; right: number; bottom?: number; left: number }) {\r\n    return {\r\n      top: spacing?.top ?? 0,\r\n      right: spacing?.right ?? 0,\r\n      bottom: spacing?.bottom ?? 0,\r\n      left: spacing?.left ?? 0,\r\n    }\r\n  }\r\n\r\n  renderIndustryHeader({\r\n    node,\r\n    context,\r\n    config,\r\n    fill,\r\n    parent,\r\n  }: {\r\n    node: MapDataRow\r\n    context: CanvasRenderingContext2D\r\n    config?: ISettingsSectionHeader\r\n    parent?: ISettingsSection\r\n    fill: string\r\n  }) {\r\n    const parrentPadding = this.getSpacingWithDefaults(parent?.padding)\r\n    const margin = this.getSpacingWithDefaults(config?.margin)\r\n    const x = node.x + parrentPadding.left + margin.left\r\n    const y = node.y + parrentPadding.top + margin.top\r\n    const width = node.dx - parrentPadding.left - margin.left - parrentPadding.right - margin.right\r\n    const height = y + (config?.height ?? 0)\r\n\r\n    context.fillStyle = fill\r\n    context.strokeStyle = config?.border ?? this.settings.background\r\n    context.beginPath()\r\n    context.moveTo(x, y)\r\n    context.lineTo(x, height)\r\n\r\n    context.lineTo(node.x + 6, height)\r\n    context.lineTo(node.x + 11, height + 5)\r\n    context.lineTo(node.x + 16, height)\r\n\r\n    context.lineTo(x + width, height)\r\n    context.lineTo(x + width, y)\r\n    context.lineTo(x - 0.5, y)\r\n    context.fill()\r\n    context.stroke()\r\n  }\r\n\r\n  renderNodeText({\r\n    node,\r\n    context,\r\n    config,\r\n    parent,\r\n  }: {\r\n    node: MapDataRow\r\n    context: CanvasRenderingContext2D\r\n    config?: ISettingsSectionFont\r\n    parent?: ISettingsSection\r\n  }) {\r\n    if (!config) return\r\n\r\n    const parrentPadding = this.getSpacingWithDefaults(parent?.padding)\r\n    const padding = this.getSpacingWithDefaults(config?.padding)\r\n\r\n    context.textBaseline = 'alphabetic'\r\n    context.textAlign = 'left'\r\n    context.fillStyle = config.color\r\n    context.font = `${config.fontWeight} ${config.fontSize}px ${fontFamily}`\r\n\r\n    const text = this.getLongestText(\r\n      node.name.toUpperCase(),\r\n      config.fontSize,\r\n      node.dx - parrentPadding.left - padding.left - parrentPadding.right - padding.right\r\n    )\r\n    context.fillText(\r\n      text,\r\n      node.x + parrentPadding.left + padding.left,\r\n      node.y + parrentPadding.top + padding.top + config.fontSize\r\n    )\r\n  }\r\n\r\n  getNodeAtPosition(x: number, y: number): MapDataNode | undefined {\r\n    var scale = this.zoom.scale()\r\n    var [tx, ty] = this.zoom.translate()\r\n    for (var i = 0, len = this.nodes.length; i < len; i++) {\r\n      var d = this.nodes[i]\r\n      if (\r\n        d.x * scale + tx < x &&\r\n        x < (d.x + d.dx + 1) * scale + tx &&\r\n        d.y * scale + ty < y &&\r\n        y < (d.y + d.dy + 1) * scale + ty &&\r\n        d.parent\r\n      ) {\r\n        return d\r\n      }\r\n    }\r\n  }\r\n\r\n  getSectorAtPosition(x: number, y: number): MapDataSector | undefined {\r\n    var scale = this.zoom.scale()\r\n    var [tx, ty] = this.zoom.translate()\r\n    for (var i = 0, len = this.sectors.length; i < len; i++) {\r\n      var d = this.sectors[i]\r\n      if (\r\n        d.x * scale + tx < x &&\r\n        x < (d.x + d.dx + 1) * scale + tx &&\r\n        d.y * scale + ty < y &&\r\n        y < (d.y + d.dy + 1) * scale + ty &&\r\n        d.parent\r\n      ) {\r\n        return d\r\n      }\r\n    }\r\n  }\r\n\r\n  getIndustryAtPosition(x: number, y: number): MapDataIndustry | undefined {\r\n    var scale = this.zoom.scale()\r\n    var [tx, ty] = this.zoom.translate()\r\n    for (var i = 0, len = this.industries.length; i < len; i++) {\r\n      var d = this.industries[i]\r\n      if (\r\n        d.x * scale + tx < x &&\r\n        x < (d.x + d.dx + 1) * scale + tx &&\r\n        d.y * scale + ty < y &&\r\n        y < (d.y + d.dy + 1) * scale + ty &&\r\n        d.parent\r\n      ) {\r\n        return d\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nexport default Treemap\r\n","import classnames from 'classnames'\r\nimport * as d3 from 'd3'\r\nimport PropTypes from 'prop-types'\r\nimport { Component } from 'react'\r\n\r\ninterface SparklineProps {\r\n  className?: string\r\n  data: number[]\r\n  width: number\r\n  height: number\r\n}\r\n\r\nclass Sparkline extends Component<SparklineProps> {\r\n  static propTypes = {\r\n    width: PropTypes.number.isRequired,\r\n    height: PropTypes.number.isRequired,\r\n    data: PropTypes.arrayOf(PropTypes.number).isRequired,\r\n  }\r\n\r\n  shouldComponentUpdate(nextProps: SparklineProps) {\r\n    // eslint-disable-next-line eqeqeq\r\n    return nextProps.data != this.props.data\r\n  }\r\n\r\n  render() {\r\n    var data = this.props.data\r\n    var x = d3.scaleLinear().range([0, this.props.width]).domain([0, data.length])\r\n\r\n    var y = d3\r\n      .scaleLinear()\r\n      .range([this.props.height - 4, 0])\r\n      .domain(d3.extent(data, (d) => d) as [number, number])\r\n\r\n    var line = d3\r\n      .line<number>()\r\n      .curve(d3.curveBasis)\r\n      .x((d, i) => x(i))\r\n      .y((d) => y(d))\r\n\r\n    return (\r\n      <svg\r\n        className={classnames('sparkline', this.props.className)}\r\n        width={this.props.width}\r\n        height={this.props.height}\r\n      >\r\n        <g transform=\"translate(0, 2)\">\r\n          <path d={line(data)!} />\r\n        </g>\r\n      </svg>\r\n    )\r\n  }\r\n}\r\n\r\nexport default Sparkline\r\n","export function getTextFontFamily() {\r\n  return 'Lato'\r\n}\r\n","/**\r\n * Load image before we can render it in canvas\r\n */\r\nexport function loadImage(src: string): Promise<HTMLImageElement> {\r\n  return new Promise((resolve, reject) => {\r\n    var image = new Image()\r\n\r\n    image.onload = function () {\r\n      resolve(image)\r\n    }\r\n\r\n    image.onerror = function () {\r\n      reject()\r\n    }\r\n\r\n    image.src = src\r\n  })\r\n}\r\n","export function getScaleRatio() {\r\n  return window.devicePixelRatio ?? 1\r\n}\r\n\r\nexport function retinafy(\r\n  canvas: HTMLCanvasElement | undefined | null,\r\n  context: CanvasRenderingContext2D | undefined,\r\n  width: number,\r\n  height: number\r\n) {\r\n  if (!canvas || !context) return\r\n\r\n  const ratio = getScaleRatio()\r\n\r\n  canvas.width = width * ratio\r\n  canvas.height = height * ratio\r\n  canvas.style.width = width + 'px'\r\n  canvas.style.height = height + 'px'\r\n  context.scale(ratio, ratio)\r\n\r\n  return ratio\r\n}\r\n"],"names":["formatPerf","d","treemap","additional","perf","formatValue","toFixed","CanvasHover","props","_hoveredSparkline$toF","_hoveredSparkline","_hoveredNode$data$dat","_hoveredNode$data","prevDataHash","React","dataHash","hoveredNode","visibleNodes","sparklineData","setState","refs","floatingStyles","context","isPositioned","update","useFloating","open","strategy","placement","middleware","offset","mainAxis","flip","crossAxis","shift","clientPoint","useClientPoint","getFloatingProps","useInteractions","handleMapStoreChange","storeHoveredNode","MapStore","getHoveredNode","mapNodeId","getSparklines","getVisibleTooltipNodes","name","tickersToLoad","filter","node","current","map","includes","push","MapActions","loadSparklineData","type","prevState","addChangeListener","removeChangeListener","loadSparklinesCancel","hoveredSparkline","hasSparkline","length","price","isSmall","title","MapTypeId","World","parent","backgroundColor","colorScale","undefined","_jsxs","ref","setFloating","id","className","classnames","invisible","style","children","_jsx","_Fragment","data","nameOverride","Sparkline","width","height","description","colSpan","c","_sparklineData$c$name","_c$data$data$nameOver","_c$data","color","Canvas","constructor","event","super","_defineProperty","zoom","initialized","this","_cache","bind","componentDidMount","_onChange","mapActionCreators","_setOnPublish","_getPublishCanvas","_initialize","componentDidUpdate","state","renderFromCache","_canvasContext","renderHover","_hoverContext","_setCanvasSize","worldBackground","_updateCanvasCaches","_loadTreemapGeoBackground","then","componentWillUnmount","_this$_hoverCanvas$cu","_hoverCanvas","removeEventListener","_onWheel","render","alt","legend","hover","_canvas","classNames","onMouseDown","_onMouseDown","onMouseMove","_onMouseMove","onMouseUp","_onMouseUp","onMouseLeave","_onMouseLeave","onDoubleClick","_onDoubleClick","Legend","scale","x","y","translate","nearestSize","getNearestSize","_createCache","save","drawImage","canvas","restore","mouseDown","e","offsetX","offsetY","getOffset","nodeAtPosition","getNodeAtPosition","industryAtPosition","getIndustryAtPosition","MapActionCreators","setHoveredNode","_this$props$onNodeCli","_this$props","sectorAtPosition","getSectorAtPosition","onNodeClick","call","industry","sector","preventDefault","deltaY","_onPanStart","lastPanX","pointers","clientX","lastPanY","clientY","_onPanMove","movementX","movementY","changeTranslate","_onPinch","offsetX1","target","offsetLeft","offsetParent","offsetY1","offsetTop","direction","_setCanvasContexts","canvasContext","getContext","isFirefoxDesktop","willReadFrequently","hoverContext","retinafy","zoomOnWheel","zoomLevels","getZoomLevels","_createCacheWithPriority","hoverCanvas","hammertime","Hammer","get","set","enable","threshold","on","addEventListener","passive","_getTreemapGeoBackground","getIsSmall","FinvizSettings","hasDarkTheme","image","loadImage","default","oldScale","oldTranslate","cacheCanvas","document","createElement","cacheContext","translateAbs","renderCanvas","resetSparklineData","currentZoom","callback","animationFrameId","window","cancelAnimationFrame","remainingLevels","level","requestAnimationFrame","_queueUpdateCache","scales","currentScale","arguments","_hover$border","settings","clearRect","apply","showIndustryHeader","LayoutGenerator","isNodeHeaderVisible","depth","NodeDepth","Industry","industryOffset","padding","top","smallIndustryPadding","Sector","header","strokeStyle","border","lineWidth","strokeRect","dx","dy","beginPath","i","moveTo","lineTo","_hover$background","stroke","renderIndustryHeader","config","fill","background","renderNodeText","fillStyle","fillRect","naturalWidth","naturalHeight","index","sectors","industries","nodes","renderStockNode","isLargeNode","isGeoMap","renderBackground","Number","isFinite","_treemap$settings$sec","renderSectorBorders","_treemap$settings$sec2","boxover","tooltip","scaleMin","scaleMax","getScaleMinMax","steps","diff","step","Math","round","stepWidth","indexOf","format","scaleStepFormat","Portfolio","ETFHoldings","ManagersAndFunds","isWidget","minWidth","textShadow","toString","MapContext","setTreemap","setGenerator","useMapContext","MapContextProvider","generator","Provider","value","Map","_ref","isLoadingData","isFetchingPerf","subtype","truncateNodeName","prevTreemap","containerRef","hasRendered","setHasRendered","mapUtils","size","mapSettings","MAP_EXPORT","Treemap","getLayout","scaleId","label","countIndustryPerf","countSectorPerf","updateTimeoutRef","setTimeout","layout","updateLayout","clearTimeout","containerElement","resize","throttle","Delayed","delayComponent","Spinner","_targetScale","updateVisibleSparklines","mapStore","debouncedLoadSparklines","_lastSparklinesRequest","debounce","async","tickers","mapType","_lastSparklinesReques","_lastSparklinesReques2","AppDispatcher","handleViewAction","ActionTypes","LOAD_SPARKLINES_STARTED","cancel","apiRequest","query","t","join","ty","handleServerAction","LOAD_SPARKLINES_COMPLETED","error","aborted","LOAD_SPARKLINES_FAILED","trailing","SET_HOVERED_NODE","_lastSparklinesReques3","_lastSparklinesReques4","RESET_SPARKLINE_DATA","tx","CHANGE_TRANSLATE","zoomLevel","getNextZoomLevel","animate","RENDER_TREEMAP","zoomIn","getPreviousZoomLevel","zoomOut","zoomAndTranslate","updateData","updateDimensions","find","updatePerfData","updatePerf","UPDATE_DATA","version","getPublishCanvas","SET_PUBLISH_CANVAS","setupWidget","SET_WIDGET","Dispatcher","action","payload","source","PayloadSources","SERVER_ACTION","dispatch","VIEW_ACTION","keyMirror","INIT_STARTED","INIT_FAILED","Store","EventEmitter","emitChange","emit","CHANGE_EVENT","removeListener","_hoveredNode","_mapNodeId","_dataVersion","_sparklinesData","_isWidget","getDataVersion","dispatchToken","register","fontSizesWidths","a","b","f","g","h","j","k","l","m","n","o","p","q","r","s","u","v","w","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","fontSizeLineHeights","Zoom","dimensions","d3","zoomElement","translateExtent","behavior","extent","newZoom","mapCenter","zoomSelection","scaleTo","getTransform","args","Array","isArray","translateBy","translateTo","scaleExtent","len","fontFamily","getTextFontFamily","_props$mapNodeId","MapSubtypeId","DayPerf","getUuid","getColorScale","_updateIndustryPerf","_updateSectorPerf","ScaleId","PortfolioPct","PortfolioUsd","minValuePerf","abs","_node$data$perfWeek","_node$data","perfWeek","maxValuePerf","_node$data$perfWeek2","_node$data2","perfMax","max","minValueNode","maxValueNode","valueMax","valueToUse","isNaN","numberOfDigits","floor","log10","roundedBound","ceil","scaleMinMax","minDomain","maxDomain","gradient","gradients","gradientSmall","linearScale","domain","range","colors","nullColor","min","getParentSector","hash","nodeName","parentSector","updatedNode","_node$data3","_resetIndustryPerf","weightedPriceSum","marketCapSum","stock","marketCap","everyStockUndefined","_getNodeTopOffset","isSmallSecMap","leftPadding","left","topPadding","isFirstNodeInIndustry","getNodeText","_node$additional","_this$settings$fontSi","_this$settings$fontSi2","fontSizes","scaleFontSizes","nodeTopOffset","nodeHeight","nodeNameFontSize","findMaxFontSizeForText","getLongestText","fontSizePadding","nodeNameLineHeight","stepFormat","perfText","getSymbolType","PortfolioSymbolType","Cash","fontPairs","fontSizePairs","allowedSize","perfFontSize","perfLineHeight","textHeight","topOffset","fontSize","text","maxWidth","widths","_widths$text$i","substring","actualZoomLevel","getLastZoomLevel","_stepFormat$replace","_stepFormat","floatValue","parseFloat","absValue","replace","isPositiveScaleOnly","formated","nodeText","textBaseline","textAlign","nodeY","nodeDY","textX","nameY","perfTextY","font","fillText","getSpacingWithDefaults","spacing","_spacing$top","_spacing$right","_spacing$bottom","_spacing$left","right","bottom","_ref2","_config$height","_config$border","parrentPadding","margin","_ref3","fontWeight","toUpperCase","Component","shouldComponentUpdate","nextProps","line","curve","transform","PropTypes","isRequired","src","Promise","resolve","reject","Image","onload","onerror","getScaleRatio","_window$devicePixelRa","devicePixelRatio","ratio"],"sourceRoot":""}