{"version":3,"file":"map.f599f5a2.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/components/MapContext.tsx","webpack://@finviz/website/./js/app/maps/components/Search.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Expand.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Share.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Zoom.tsx","webpack://@finviz/website/./js/app/maps/hooks/use-map-data.ts","webpack://@finviz/website/./js/app/maps/hooks/use-map-type.ts","webpack://@finviz/website/./js/app/maps/components/MapTypeList.tsx","webpack://@finviz/website/./js/app/maps/App.tsx","webpack://@finviz/website/./js/app/maps/treemap-canvas.tsx","webpack://@finviz/website/./js/app/maps/treemap-small.tsx","webpack://@finviz/website/./js/app/maps/services/api.ts","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/Ads.tsx","webpack://@finviz/website/./js/app/shared/components/Sparkline.tsx","webpack://@finviz/website/./js/app/shared/parseJSONFromScript.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/components/icon/svg.tsx","webpack://@finviz/website/../node_modules/prop-types/factoryWithThrowingShims.js","webpack://@finviz/website/../node_modules/prop-types/index.js","webpack://@finviz/website/../node_modules/prop-types/lib/ReactPropTypesSecret.js"],"sourcesContent":["import classnames from 'classnames'\r\nimport { Component } 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 { getVisibleTooltipTickers } from '../utils'\r\n\r\ninterface CanvasHoverProps {\r\n treemap: Treemap\r\n mapType: MapTypeId\r\n mapNodeId: string\r\n}\r\n\r\ninterface CanvasHoverState {\r\n visibleTickers: string[]\r\n activeNode?: MapDataNode\r\n sparklinesData: Record\r\n}\r\n\r\nclass CanvasHover extends Component {\r\n state: CanvasHoverState = { visibleTickers: [], activeNode: undefined, sparklinesData: {} }\r\n\r\n componentDidMount() {\r\n MapStore.addChangeListener(this._onChange)\r\n document.addEventListener('mousemove', this._onMouseMove)\r\n }\r\n\r\n componentWillUnmount() {\r\n MapActions.loadSparklinesCancel()\r\n MapStore.removeChangeListener(this._onChange)\r\n document.removeEventListener('mousemove', this._onMouseMove)\r\n }\r\n\r\n componentDidUpdate(_: CanvasHoverProps, prevState: CanvasHoverState) {\r\n const { activeNode, visibleTickers, sparklinesData } = this.state\r\n\r\n if (!activeNode || activeNode.name === prevState?.activeNode?.name) return\r\n\r\n if (!visibleTickers.includes(activeNode.name)) {\r\n visibleTickers.push(activeNode.name)\r\n }\r\n\r\n const tickersToLoad = visibleTickers.filter((ticker) => !sparklinesData[ticker])\r\n\r\n if (tickersToLoad.length) {\r\n MapActions.loadSparklineData(tickersToLoad, this.props.mapType)\r\n }\r\n }\r\n\r\n _onChange = () => {\r\n const activeNode = MapStore.getHoveredNode(this.props.mapNodeId)\r\n const sparklinesData = MapStore.getSparklines()\r\n\r\n this.setState({\r\n visibleTickers: getVisibleTooltipTickers(activeNode),\r\n activeNode,\r\n sparklinesData,\r\n })\r\n }\r\n\r\n _formatPerf = (d: MapDataNode) => {\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 this.props.treemap.formatValue(d.perf.toFixed(2))\r\n } else {\r\n return 'N/A'\r\n }\r\n }\r\n\r\n render() {\r\n var d = MapStore.getHoveredNode(this.props.mapNodeId)\r\n if (!this.state.activeNode || !d) {\r\n return null\r\n }\r\n var hasSparkline =\r\n this.state.sparklinesData && this.state.sparklinesData[d.name] && this.state.sparklinesData[d.name].length > 0\r\n var price = hasSparkline\r\n ? this.state.sparklinesData[d.name][this.state.sparklinesData[d.name].length - 1].toFixed(2)\r\n : ''\r\n var colorScale = this.props.treemap.colorScale\r\n var type = this.props.treemap.type\r\n\r\n var children = d.parent.children\r\n .filter((node) => this.state.visibleTickers.includes(node.name))\r\n .sort((a, b) => b.dx * b.dy - a.dx * a.dy)\r\n\r\n var isSmall = children.length > 15\r\n var title = (type !== MapTypeId.World ? d.parent.parent.name + ' - ' : '') + d.parent.name\r\n return (\r\n
\r\n

{title}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {d.description}\r\n \r\n \r\n\r\n {children.length > 1 &&\r\n children.map((c) => {\r\n var hasSparkline =\r\n this.state.sparklinesData &&\r\n this.state.sparklinesData[c.name] &&\r\n this.state.sparklinesData[c.name].length > 0\r\n var data = hasSparkline ? this.state.sparklinesData[c.name] : []\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n
{d.data?.data?.nameOverride ?? d.name}\r\n {hasSparkline ? (\r\n \r\n ) : null}\r\n {price}{this._formatPerf(d)}
{c.data?.data?.nameOverride ?? c.name}\r\n {hasSparkline ? (\r\n \r\n ) : null}\r\n {hasSparkline ? data[data.length - 1].toFixed(2) : ''}\r\n {this._formatPerf(c)}\r\n
\r\n
\r\n )\r\n }\r\n\r\n _onMouseMove = (e: MouseEvent) => {\r\n if (!this.state.activeNode) {\r\n return\r\n }\r\n var marginLeft = 100\r\n var marginTop = 0\r\n var el = document.getElementById('hover')!\r\n var hoverWidth = el.scrollWidth\r\n var hoverHeight = el.scrollHeight\r\n var availWidth = document.documentElement.clientWidth\r\n var availHeight = document.documentElement.clientHeight\r\n if (e.clientX + hoverWidth + marginLeft * 1.5 < availWidth) {\r\n el.style.left = e.clientX + marginLeft + 'px'\r\n } else if (e.clientX - hoverWidth - marginLeft > 0) {\r\n el.style.left = e.clientX - marginLeft - hoverWidth + 'px'\r\n } else {\r\n marginLeft = 20\r\n if (e.clientX + hoverWidth + marginLeft < availWidth) {\r\n el.style.left = e.clientX + marginLeft + 'px'\r\n } else {\r\n el.style.left = e.clientX - marginLeft - hoverWidth + 'px'\r\n }\r\n }\r\n el.style.top =\r\n Math.max(0, e.clientY + marginTop - Math.max(0, e.clientY + marginTop + hoverHeight - availHeight)) + 'px'\r\n }\r\n}\r\n\r\nexport default CanvasHover\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\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 {\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()\r\n _hoverCanvas = React.createRef()\r\n\r\n // @ts-ignore\r\n _canvasContext: CanvasRenderingContext2D\r\n // @ts-ignore\r\n _hoverContext: CanvasRenderingContext2D\r\n\r\n _cache: Record = {}\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 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 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
\r\n \r\n {alt}\r\n \r\n {(hover || zoom) && (\r\n \r\n )}\r\n {legend && }\r\n {hover && }\r\n
\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) {\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) {\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=[
\" +\r\n props.treemap.scale.tooltip +\r\n '
] 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
\r\n {![MapTypeId.Portfolio, MapTypeId.ETFHoldings].includes(props.treemap.type) && (\r\n
\r\n Use mouse wheel to zoom in and out. Drag zoomed map to pan it.\r\n
\r\n Double‑click a ticker to display detailed information in a new window.\r\n
\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
\r\n )}\r\n
\r\n {steps.map((step, index) => (\r\n \r\n {props.treemap.formatValue(step.toString(), [scaleMin, scaleMax], format)}\r\n
\r\n ))}\r\n
\r\n \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>\r\n generator?: LayoutGenerator\r\n setGenerator: React.Dispatch>\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()\r\n const [generator, setGenerator] = React.useState()\r\n\r\n return (\r\n {props.children}\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['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(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()\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
\r\n \r\n {(!treemap && !isLoadingData) || !treemap || isLoadingData ? (\r\n }>\r\n
\r\n \r\n
\r\n
\r\n ) : (\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { BrowserRouter } from 'react-router-dom'\r\n\r\nimport { Loading } from '../../../main/components/loading'\r\nimport { QueryClientContext } from '../../shared/components/QueryClientContext'\r\nimport { MapContextProvider } from './Map'\r\n\r\nexport function MapContext(props: React.PropsWithChildren) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n {props.children}\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps } from '../../../main/components/button'\r\nimport { Input, InputHTMLProps, InputProps } from '../../../main/components/input'\r\nimport MapActionCreators from '../store/action-creators'\r\nimport { MapDataNode } from '../types'\r\nimport { useMapContext } from './Map'\r\n\r\nfunction filterItems(stocks: MapDataNode[] = [], input: string) {\r\n return stocks\r\n .filter(function (stock) {\r\n return stock.name.indexOf(input) === 0 || (stock.description || '').toUpperCase().indexOf(input) === 0\r\n })\r\n .sort(function (a, b) {\r\n if (a.name === b.name) {\r\n return 0\r\n }\r\n return a.name < b.name ? -1 : 1\r\n })\r\n .slice(0, 10)\r\n}\r\n\r\nexport function useSearch() {\r\n const { treemap } = useMapContext()\r\n const [value, setValue] = React.useState('')\r\n const [results, setResults] = React.useState(filterItems(treemap?.nodes, ''))\r\n\r\n React.useEffect(() => {\r\n if (treemap) {\r\n setResults(filterItems(treemap.nodes, ''))\r\n setValue('')\r\n }\r\n }, [treemap])\r\n\r\n const onInputChange = React.useCallback(\r\n (event: React.ChangeEvent) => {\r\n const input = event.target.value.toUpperCase()\r\n setValue(input)\r\n setResults(filterItems(treemap?.nodes, input))\r\n },\r\n [treemap]\r\n )\r\n\r\n const onItemClick = React.useCallback(\r\n (node: MapDataNode) => {\r\n if (!treemap) return\r\n\r\n const cx = (node.x + node.x + node.dx) / 2,\r\n cy = (node.y + node.y + node.dy) / 2,\r\n diffX = cx - treemap.width / 2,\r\n diffY = cy - treemap.height / 2\r\n\r\n MapActionCreators.zoomAndTranslate(treemap, treemap.getLastZoomLevel(), cx + diffX, cy + diffY)\r\n MapActionCreators.setHoveredNode(treemap.mapNodeId, node)\r\n },\r\n [treemap]\r\n )\r\n\r\n const onResultMouseLeave = React.useCallback(() => {\r\n if (!treemap) return\r\n MapActionCreators.setHoveredNode(treemap.mapNodeId, undefined)\r\n }, [treemap])\r\n\r\n return {\r\n value,\r\n results,\r\n onInputChange,\r\n onItemClick,\r\n onResultMouseLeave,\r\n }\r\n}\r\n\r\nexport function SearchInput(props: InputProps & Omit) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ninterface SearchResultProps extends ButtonProps, Omit {\r\n result: MapDataNode\r\n onClick: (node: MapDataNode) => void\r\n onMouseLeave: (e: React.MouseEvent) => void\r\n}\r\n\r\nexport function SearchResult({ result, onClick, onMouseLeave, ...props }: Omit) {\r\n return (\r\n
  • \r\n onClick(result)}\r\n >\r\n {result.name}\r\n {result.description}\r\n \r\n
  • \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Button } from '../../../../main/components/button'\r\nimport { isIpad, isMobile } from '../../../shared/isMobile'\r\nimport { EXPANDED_MAP_BODY_CLASSS } from '../../constants/constants'\r\nimport mapActionCreators from '../../store/action-creators'\r\nimport { MapDataRoot } from '../../types'\r\nimport * as mapUtils from '../../utils'\r\nimport { useMapContext } from '../Map'\r\n\r\ninterface ExpandProps {\r\n data?: MapDataRoot\r\n className?: string\r\n}\r\n\r\nexport function Expand(props: ExpandProps) {\r\n const { treemap, generator } = useMapContext()\r\n\r\n const onExpand = React.useCallback(() => {\r\n if (!treemap || !generator || !props.data) return\r\n\r\n if (document.body.classList.contains(EXPANDED_MAP_BODY_CLASSS)) {\r\n document.body.classList.remove(EXPANDED_MAP_BODY_CLASSS)\r\n } else {\r\n window.gtag?.('event', 'map-expand', { event_category: 'maps' })\r\n document.body.classList.add(EXPANDED_MAP_BODY_CLASSS)\r\n }\r\n\r\n const containerElement = document.getElementById('body')\r\n const size = mapUtils.getSize(containerElement, treemap.type, treemap.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(props.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\r\n window.scrollTo(0, 0)\r\n }, [treemap, generator, props.data])\r\n\r\n if (isMobile() && !isIpad()) return null\r\n\r\n return (\r\n \r\n )\r\n}\r\n","/* eslint-disable import/first */\r\nimport { useMutation } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\n\r\nimport { getFormattedDateString } from '../../../header/utils'\r\nimport { Share as ShareDialog } from '../../../shared/components/Share'\r\nimport { drawShareMap } from '../../../shared/drawShareMap'\r\nimport * as api from '../../services/api'\r\nimport mapStore from '../../store/mapStore'\r\nimport { MapSubtype, MapType } from '../../types'\r\nimport { useMapContext } from '../Map'\r\n\r\ninterface ShareMapProps {\r\n mapType: MapType\r\n subtype: MapSubtype\r\n className?: string\r\n}\r\n\r\nexport function Share(props: ShareMapProps) {\r\n const { treemap } = useMapContext()\r\n const uploadImage = useMutation(api.uploadMap)\r\n\r\n const onShareClick = React.useCallback(async () => {\r\n if (!treemap) return\r\n const canvas = mapStore.getPublishCanvas()\r\n const data = await drawShareMap(canvas, [props.mapType.name, props.subtype.label, getFormattedDateString()])\r\n\r\n if (data) {\r\n uploadImage.mutate({ type: treemap.type, subtype: treemap.subtype, data })\r\n }\r\n }, [props.mapType, props.subtype, treemap, uploadImage])\r\n\r\n return \r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Button } from '../../../../main/components/button'\r\nimport { SVG } from '../../../../main/components/icon/svg'\r\nimport mapActionCreators from '../../store/action-creators'\r\nimport { useMapContext } from '../Map'\r\n\r\nexport function useZoomButtons() {\r\n const { treemap } = useMapContext()\r\n const zoomOut = React.useCallback(\r\n (ev: React.MouseEvent) => {\r\n if (!treemap) return\r\n ev.preventDefault()\r\n mapActionCreators.zoom(treemap, -1, treemap.width / 2, treemap.height / 2)\r\n },\r\n [treemap]\r\n )\r\n const zoomIn = React.useCallback(\r\n (ev: React.MouseEvent) => {\r\n if (!treemap) return\r\n ev.preventDefault()\r\n mapActionCreators.zoom(treemap, 1, treemap.width / 2, treemap.height / 2)\r\n },\r\n [treemap]\r\n )\r\n\r\n return { zoomIn, zoomOut }\r\n}\r\n\r\nexport function Zoom() {\r\n const handlers = useZoomButtons()\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { useQuery, useQueryClient } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\n\r\nimport { FALLBACK_PERF_RESPONSE } from '../constants/constants'\r\nimport * as api from '../services/api'\r\nimport { MapDataRoot, MapSubtypeId, MapTypeId, PerfData } from '../types'\r\nimport * as mapUtils from '../utils'\r\n\r\nexport type MapDataHookReturn = ReturnType\r\n\r\n/**\r\n * Hook which fetches map data and perf data from the api\r\n */\r\nexport function useMapData(\r\n type: MapTypeId,\r\n subtype: MapSubtypeId,\r\n cacheBuster: number,\r\n mapBaseData?: MapDataRoot,\r\n initialPerf?: PerfData,\r\n fetchBaseData = api.mapBaseData,\r\n fetchPerfData = api.mapPerf\r\n) {\r\n const queryClient = useQueryClient()\r\n const dataVersion = React.useRef()\r\n const prevType = React.useRef()\r\n\r\n React.useEffect(() => {\r\n if (mapBaseData) {\r\n const perfData = mapUtils.parseInitDataAsPerf(mapBaseData)\r\n queryClient.setQueryData(['mapPerf', type, subtype], perfData)\r\n prevType.current = type\r\n } else if (initialPerf) {\r\n queryClient.setQueryData(['mapPerf', type, subtype], initialPerf)\r\n prevType.current = type\r\n }\r\n // This effect only needs to run on mount, otherwise we’d be overriding the data\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n /**\r\n * Fetch base data and perf data for the map. We cannot use `useQueries` here,\r\n * because `keepPreviousData` doesn’t work as it creates new objects every time.\r\n */\r\n const baseDataQuery = useQuery({\r\n queryKey: ['mapBaseData', type, cacheBuster],\r\n queryFn: () => fetchBaseData(type, cacheBuster),\r\n initialData: !prevType.current ? mapBaseData : undefined,\r\n cacheTime: Infinity,\r\n staleTime: Infinity,\r\n })\r\n\r\n const perfDataQuery = useQuery({\r\n queryKey: ['mapPerf', type, subtype],\r\n queryFn: async () => {\r\n const data = await fetchPerfData(type, subtype)\r\n\r\n return (\r\n data ??\r\n queryClient.getQueryData(['mapPerf', type, subtype]) ?? {\r\n ...FALLBACK_PERF_RESPONSE,\r\n version: dataVersion.current,\r\n }\r\n )\r\n },\r\n // Keep previous data if the map type hasn’t changed\r\n keepPreviousData: prevType.current === type,\r\n refetchInterval: () => mapUtils.getMapsRefreshInterval(),\r\n staleTime: 1000,\r\n onSuccess(data) {\r\n if (!dataVersion.current && data) {\r\n dataVersion.current = data.version\r\n }\r\n\r\n if (dataVersion.current !== data?.version) {\r\n window.location.reload()\r\n return\r\n }\r\n\r\n prevType.current = type\r\n },\r\n })\r\n\r\n const data = React.useMemo(() => {\r\n if (!perfDataQuery.data || !baseDataQuery.data) return undefined\r\n\r\n const [restoredData] = mapUtils.restoreDataKeys([baseDataQuery.data], perfDataQuery.data)\r\n\r\n return restoredData\r\n }, [baseDataQuery.data, perfDataQuery.data])\r\n\r\n return {\r\n data,\r\n baseDataQuery,\r\n perfDataQuery,\r\n }\r\n}\r\n","import { useLocation } from 'react-router-dom'\r\n\r\nimport { MAP_TYPES } from '../constants/constants'\r\nimport { MapSubtypeId } from '../types'\r\n\r\n/**\r\n * Hook which gets the current map type and subtype from the URL\r\n */\r\nexport function useMapType() {\r\n const query = new URLSearchParams(useLocation().search)\r\n const typeFromQuery = query.get('t')\r\n const subtypeFromQuery = query.get('st')\r\n\r\n const type = MAP_TYPES.find((t) => t.type === typeFromQuery) ?? MAP_TYPES[0]\r\n const subtypes = type.subtypes.flatMap((type) => type.items)\r\n const subtype =\r\n subtypes.find((subtype) => subtype.value === subtypeFromQuery) ??\r\n subtypes.find((subtype) => subtype.value === MapSubtypeId.DayPerf) ??\r\n subtypes[0]\r\n\r\n return { type, subtype }\r\n}\r\n","import classnames from 'classnames'\r\nimport { NavLink } from 'react-router-dom'\r\n\r\nimport { Delayed } from '../../../main/components/delayed'\r\nimport { Spinner } from '../../../main/components/spinner'\r\nimport * as tracking from '../../shared/tracking'\r\nimport { MAP_TYPES } from '../constants/constants'\r\nimport { MapSubtypeId, MapTypeId } from '../types'\r\n\r\ninterface MapTypeProps {\r\n activeType: MapTypeId\r\n activeSubtype: MapSubtypeId\r\n isLoading: boolean\r\n linkClassName?: string\r\n}\r\n\r\nexport function MapTypeList(props: MapTypeProps) {\r\n const linkClass = props.linkClassName ?? ''\r\n\r\n return (\r\n
      \r\n {MAP_TYPES.map((map) => {\r\n const isActiveTreemap = props.activeType === map.type\r\n const query = new URLSearchParams({ t: map.type })\r\n if (props.activeSubtype !== MapSubtypeId.DayPerf) {\r\n query.append('st', props.activeSubtype)\r\n }\r\n\r\n return (\r\n
    • \r\n \r\n classnames('text-xs leading-7', {\r\n [linkClass]: !isActiveTreemap,\r\n 'text-white font-bold': isActiveTreemap,\r\n })\r\n }\r\n onClick={() => {\r\n document.title = map.pageTitle\r\n tracking.trackPageView({ query: `t=${map.type}` })\r\n }}\r\n >\r\n \r\n {map.name}\r\n {isActiveTreemap && props.isLoading && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n
    • \r\n )\r\n })}\r\n
    \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { Button } from '../../main/components/button'\r\nimport { DefaultErrorBoundary } from '../../main/components/error-view'\r\nimport { Paragraph } from '../../main/components/typography'\r\nimport { AdTag, useInvestingChannelAds } from '../shared/components/Ads'\r\nimport * as tracking from '../shared/tracking'\r\nimport { Map, useMapContext } from './components/Map'\r\nimport { MapSelect } from './components/MapSelect'\r\nimport { MapTypeList } from './components/MapTypeList'\r\nimport { SearchInput, SearchResult, useSearch } from './components/Search'\r\nimport { Topbar } from './components/Topbar'\r\nimport { Expand } from './components/Topbar/Expand'\r\nimport { Share } from './components/Topbar/Share'\r\nimport { Zoom } from './components/Topbar/Zoom'\r\nimport { useMapData } from './hooks/use-map-data'\r\nimport { useMapType } from './hooks/use-map-type'\r\nimport { MapDataRoot, MapSubtypeId, PerfData } from './types'\r\nimport * as mapUtils from './utils'\r\n\r\nconst linkClassName = 'text-link hover:text-white'\r\n\r\nexport interface MapInitProps {\r\n initData?: MapDataRoot\r\n initialPerf?: PerfData\r\n cacheBuster: number\r\n generate?: boolean\r\n}\r\n\r\nfunction App(props: MapInitProps) {\r\n const { treemap } = useMapContext()\r\n const navigate = useNavigate()\r\n const { type, subtype } = useMapType()\r\n const mapData = useMapData(type.type, subtype.value, props.cacheBuster, props.initData, props.initialPerf)\r\n const search = useSearch()\r\n // Make sure all ads are refreshed on type/subtype change (page navigation)\r\n const hasInvestingChannelAds = useInvestingChannelAds([type, subtype])\r\n\r\n /**\r\n * Set new subtype to be false on perf data load so we don’t display loading state when fetching\r\n * new perf data for the same type\r\n */\r\n const [isNewSubtype, setIsNewSubtype] = React.useState(false)\r\n React.useEffect(() => {\r\n if (!mapData.perfDataQuery.isFetching) {\r\n setIsNewSubtype(false)\r\n }\r\n }, [mapData.perfDataQuery.isFetching])\r\n\r\n const isLoadingInitialBaseData = !mapData.baseDataQuery.isPreviousData && mapData.baseDataQuery.isLoading\r\n const isLoadingInitialPerf = !mapData.perfDataQuery.isPreviousData && mapData.perfDataQuery.isLoading\r\n const isInitialLoading = isLoadingInitialBaseData || isLoadingInitialPerf\r\n const isFetchingNewPerf = isNewSubtype && !mapData.perfDataQuery.isLoading && mapData.perfDataQuery.isFetching\r\n\r\n return (\r\n <>\r\n \r\n

    View

    \r\n \r\n \r\n \r\n }\r\n mapControls={\r\n <>\r\n
    \r\n \r\n \r\n
    \r\n \r\n \r\n }\r\n >\r\n \r\n {type.description}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n

    Map Filter

    \r\n \r\n
    \r\n {\r\n const query = new URLSearchParams(window.location.search)\r\n if (item.value === MapSubtypeId.DayPerf) {\r\n query.delete('st')\r\n } else {\r\n query.set('st', item.value)\r\n }\r\n\r\n setIsNewSubtype(true)\r\n const stringQuery = query.toString()\r\n navigate({ pathname: window.location.pathname, search: stringQuery }, { replace: true })\r\n tracking.trackPageView({ query: stringQuery })\r\n }}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
      \r\n {search.results.map((result) => (\r\n \r\n ))}\r\n
    \r\n\r\n {hasInvestingChannelAds && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n\r\n \r\n
    \r\n \r\n {hasInvestingChannelAds && }\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n )\r\n}\r\n\r\nexport default App\r\n","import * as ReactDOM from 'react-dom'\r\n\r\nimport App, { MapInitProps } from './App'\r\nimport { MapContext } from './components/MapContext'\r\n\r\nwindow['FinvizInitCanvas'] = async function initCanvas(props: MapInitProps) {\r\n const root = document.getElementById('root')\r\n\r\n ReactDOM.render(\r\n \r\n \r\n ,\r\n root\r\n )\r\n}\r\n","import ReactDOM from 'react-dom'\r\n\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport Canvas from './components/Canvas'\r\nimport { MAP_SUBTYPE_DAY_PERF } from './constants/constants'\r\nimport { SettingsSmall, SettingsSmallDark, SettingsSmallGeo, SettingsSmallGeoDark } from './constants/settings'\r\nimport Treemap from './treemap'\r\nimport { MapTypeId, PerfData } from './types'\r\nimport * as mapUtils from './utils'\r\n\r\nconst CANVAS_WIDTH = 400\r\nconst CANVAS_HEIGHT_GEO = 235\r\nconst CANVAS_HEIGHT = 300\r\nconst CANVAS_HEIGHT_NEW = 368\r\n\r\nasync function renderTreemaps(props: { perfDataSec: PerfData; perfDataGeo: PerfData; cacheBuster: number }) {\r\n let precomputedData\r\n try {\r\n precomputedData = await mapUtils.fetchBaseData(\r\n FinvizSettings.hasRedesignEnabled ? 'hp_redesign.json' : 'hp.json',\r\n props.cacheBuster\r\n )\r\n } catch {\r\n return\r\n }\r\n\r\n if (props.perfDataSec) {\r\n const subtype = MAP_SUBTYPE_DAY_PERF\r\n const scale = { id: subtype.scaleId, name: subtype.label, tooltip: subtype.tooltip }\r\n const initData = mapUtils.getMapData(precomputedData.sec, props.perfDataSec)\r\n const treemap = new Treemap({\r\n data: initData,\r\n scale,\r\n width: CANVAS_WIDTH,\r\n height: FinvizSettings.hasRedesignEnabled ? CANVAS_HEIGHT_NEW : CANVAS_HEIGHT,\r\n countIndustryPerf: false,\r\n countSectorPerf: true,\r\n settings: FinvizSettings.hasDarkTheme ? SettingsSmallDark : SettingsSmall,\r\n type: MapTypeId.Sector,\r\n subtype: subtype.value,\r\n isSmall: true,\r\n zoomLevels: [1],\r\n version: props.perfDataSec.version,\r\n dataHash: props.perfDataSec.hash,\r\n })\r\n\r\n window.FinvizIndexSecMap = treemap\r\n\r\n ReactDOM.render(\r\n ,\r\n document.getElementById('treemap-small')\r\n )\r\n }\r\n\r\n if (props.perfDataGeo) {\r\n const subtype = MAP_SUBTYPE_DAY_PERF\r\n const scale = { id: subtype.scaleId, name: subtype.label, tooltip: subtype.tooltip }\r\n const initData = mapUtils.getMapData(precomputedData.geo, props.perfDataGeo)\r\n const treemap = new Treemap({\r\n data: initData,\r\n scale,\r\n width: CANVAS_WIDTH,\r\n height: CANVAS_HEIGHT_GEO,\r\n countIndustryPerf: true,\r\n countSectorPerf: false,\r\n settings: FinvizSettings.hasDarkTheme ? SettingsSmallGeoDark : SettingsSmallGeo,\r\n type: MapTypeId.World,\r\n subtype: subtype.value,\r\n isSmall: true,\r\n zoomLevels: [1],\r\n version: props.perfDataGeo.version,\r\n dataHash: props.perfDataGeo.hash,\r\n })\r\n\r\n window.FinvizIndexGeoMap = treemap\r\n\r\n ReactDOM.render(\r\n ,\r\n document.getElementById('treemap-small-geo')\r\n )\r\n }\r\n}\r\n\r\nif (document.getElementById('map-data')) {\r\n const mapProps = parseJSONFromScript<{ perfDataSec: PerfData; perfDataGeo: PerfData; cacheBuster: number }>(\r\n 'map-data'\r\n )\r\n if (mapProps) renderTreemaps(mapProps)\r\n}\r\n","import { ContentType, apiRequest } from '../../../main/services/api'\r\nimport { MapDataRoot, MapSubtypeId, MapTypeId, PerfData } from '../types'\r\n\r\nexport function mapBaseData(type: MapTypeId, cacheBuster: number) {\r\n return apiRequest(`/maps/${type}.json`, { query: { rev: cacheBuster } }, true)\r\n}\r\n\r\nexport function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\r\n return apiRequest(`/api/map_perf.ashx`, { query: { t: type, st: subtype } })\r\n}\r\n\r\nexport function mapPerfScreener(query = window.location.search) {\r\n return apiRequest(`/api/map_perf_screener.ashx${query}`)\r\n}\r\n\r\nexport interface UploadMapResponse {\r\n imgUrl: string\r\n shareUrl: string\r\n}\r\n\r\nexport function uploadMap({ type, subtype, data }: { type: MapTypeId; subtype: MapSubtypeId; data: string }) {\r\n return apiRequest(`/publish_map_submit.ashx`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': ContentType.FormUrlEncoded,\r\n },\r\n body: new URLSearchParams({\r\n file: data.replace('data:image/png;base64,', ''),\r\n type,\r\n subtype,\r\n }),\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 { getVisibleTooltipTickers } 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 if (hoveredNode) {\r\n const tickersToLoad = getVisibleTooltipTickers(hoveredNode)\r\n\r\n if (!tickersToLoad.includes(hoveredNode.name)) {\r\n tickersToLoad.push(hoveredNode.name)\r\n }\r\n\r\n if (tickersToLoad.length) {\r\n debouncedLoadSparklines(tickersToLoad, treemap.type)\r\n }\r\n }\r\n}\r\n\r\nlet _lastSparklinesRequest: CancelablePromise | 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 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 if (!node) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.RESET_SPARKLINE_DATA,\r\n })\r\n }\r\n\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) {\r\n 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 {\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\nexport default new AppDispatcher()\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 = {}\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> = {\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 = {\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 {\r\n zoomElement = document.createElement('canvas')\r\n zoomSelection = d3.select(this.zoomElement)\r\n behavior: d3.ZoomBehavior\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()\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\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({ 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 * as React from 'react'\r\n\r\nimport * as tracking from '../tracking'\r\n\r\nexport const IC_PUBLISHER_ID = 'df0d0d52-cc7f-11e8-82a5-0abbb61c4a6a'\r\n\r\nenum AdTagName {\r\n IC_TickerInContent = 'IC_D_3x3',\r\n IC_MapsLeftRail = 'IC_D_125x125',\r\n IC_Statements = 'IC_D_300x60',\r\n IC_Groups = 'IC_D_300x250',\r\n}\r\n\r\nconst tagDefinition = {\r\n [AdTagName.IC_TickerInContent]: { placements: 3, style: { width: 970, minHeight: 250 } },\r\n [AdTagName.IC_MapsLeftRail]: { placements: 2, style: { width: 125, minHeight: 125 } },\r\n [AdTagName.IC_Statements]: { placements: 1, style: { width: 300, minHeight: 60 } },\r\n [AdTagName.IC_Groups]: { placements: 1, style: { width: 336, minHeight: 280 } },\r\n}\r\n\r\nconst hasInvestingChannelAds = tracking.getAdsProvider() === tracking.AdsProvider.InvestingChannel\r\n\r\n/**\r\n * Get create/destroy methods to control ads insertion\r\n */\r\nexport function getInvestingChannelPage() {\r\n var page: ICPageReturn\r\n\r\n function create() {\r\n try {\r\n if (hasInvestingChannelAds) {\r\n window.InvestingChannelQueue?.push(() => {\r\n let config = window['FINVIZ_IC_UAT_CONFIG'] ?? {}\r\n page = window.InvestingChannel?.UAT.Run(IC_PUBLISHER_ID, config)\r\n })\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n }\r\n\r\n function destroy() {\r\n try {\r\n if (hasInvestingChannelAds) {\r\n window.InvestingChannelQueue?.push(() => {\r\n page?.destroy()\r\n })\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n }\r\n\r\n return { create, destroy }\r\n}\r\n\r\n/**\r\n * Hook which recreates ads on deps change (SPA navigation,…)\r\n */\r\nexport function useInvestingChannelAds(deps: unknown[] = []) {\r\n React.useLayoutEffect(() => {\r\n const page = getInvestingChannelPage()\r\n\r\n page.create()\r\n\r\n return () => page.destroy()\r\n // eslint cannot statically check the dependencies and complains about it\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, deps)\r\n\r\n return hasInvestingChannelAds\r\n}\r\n\r\ninterface AdTagProps extends Omit, 'name'> {\r\n /**\r\n * Name of the ad tag\r\n */\r\n name: keyof typeof AdTagName\r\n\r\n /**\r\n * Manually set the placement position for this tag\r\n *\r\n * @default 1\r\n */\r\n position?: number\r\n\r\n /**\r\n * Additional class names for the wrapper div\r\n */\r\n className?: string\r\n}\r\n\r\nexport function AdTag({ name, position = 1, ...props }: AdTagProps) {\r\n const tagName = AdTagName[name]\r\n const tagProps = tagDefinition[tagName]\r\n const placementName = `${tagName}_${Math.min(Math.max(position, 1), tagProps.placements)}`\r\n\r\n if (!hasInvestingChannelAds) return null\r\n\r\n return
    \r\n}\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 {\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()\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 \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default Sparkline\r\n","export function parseJSONFromScript(id: string, doc: Document = document): T | null {\r\n const el = doc.getElementById(id)\r\n const isValidElement = el && el.tagName === 'SCRIPT' && el.getAttribute('type') === 'application/json'\r\n\r\n if (!isValidElement) {\r\n window.Sentry?.captureMessage('parseJSONFromScript', {\r\n extra: {\r\n el: el ? 'yes' : 'no',\r\n tagName: el?.tagName,\r\n type: el?.getAttribute('type'),\r\n },\r\n })\r\n }\r\n\r\n if (!isValidElement) return null\r\n\r\n try {\r\n return JSON.parse(el.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return null\r\n }\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport type SVGProps = React.SVGProps\r\n\r\nexport function SVG({ className, width = 16, height = width, ...props }: SVGProps) {\r\n return (\r\n \r\n )\r\n}\r\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n"],"names":["CanvasHover","Component","constructor","arguments","_defineProperty","visibleTickers","activeNode","undefined","sparklinesData","MapStore","getHoveredNode","this","props","mapNodeId","getSparklines","setState","getVisibleTooltipTickers","d","additional","perf","treemap","formatValue","toFixed","e","state","marginLeft","el","document","getElementById","hoverWidth","scrollWidth","hoverHeight","scrollHeight","availWidth","documentElement","clientWidth","availHeight","clientHeight","clientX","style","left","top","Math","max","clientY","componentDidMount","addChangeListener","_onChange","addEventListener","_onMouseMove","componentWillUnmount","MapActions","loadSparklinesCancel","removeChangeListener","removeEventListener","componentDidUpdate","_","prevState","_prevState$activeNode","name","includes","push","tickersToLoad","filter","ticker","length","loadSparklineData","mapType","render","_d$data$data$nameOver","_d$data","hasSparkline","price","colorScale","type","children","parent","node","sort","a","b","dx","dy","isSmall","title","MapTypeId","World","_jsxs","id","_jsx","className","backgroundColor","data","nameOverride","Sparkline","width","height","_formatPerf","classnames","description","colSpan","map","c","_c$data$data$nameOver","_c$data","color","Canvas","React","event","super","zoom","initialized","dataHash","_cache","bind","mapActionCreators","_setOnPublish","_getPublishCanvas","_initialize","renderFromCache","_canvasContext","renderHover","_hoverContext","_setCanvasSize","worldBackground","_updateCanvasCaches","_loadTreemapGeoBackground","then","_this$_hoverCanvas$cu","_hoverCanvas","current","_onWheel","alt","legend","hover","ref","_canvas","classNames","onMouseDown","_onMouseDown","onMouseMove","onMouseUp","_onMouseUp","onMouseLeave","_onMouseLeave","onDoubleClick","_onDoubleClick","Legend","scale","context","x","y","translate","nearestSize","getNearestSize","_createCache","save","drawImage","canvas","restore","mouseDown","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","lastPanY","_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","passive","_getTreemapGeoBackground","getIsSmall","FinvizSettings","hasDarkTheme","image","loadImage","default","oldScale","oldTranslate","cacheCanvas","createElement","cacheContext","translateAbs","renderCanvas","resetSparklineData","currentZoom","callback","animationFrameId","window","cancelAnimationFrame","remainingLevels","level","requestAnimationFrame","_queueUpdateCache","scales","currentScale","_hover$border","settings","hoveredNode","clearRect","apply","showIndustryHeader","LayoutGenerator","isNodeHeaderVisible","depth","NodeDepth","Industry","industryOffset","padding","smallIndustryPadding","Sector","header","strokeStyle","border","lineWidth","strokeRect","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","round","stepWidth","indexOf","format","scaleStepFormat","Portfolio","ETFHoldings","isWidget","minWidth","textShadow","toString","concat","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","QueryClientContext","fallback","Loading","BrowserRouter","filterItems","input","stock","toUpperCase","slice","useSearch","setValue","results","setResults","onInputChange","onItemClick","cx","cy","diffX","diffY","zoomAndTranslate","getLastZoomLevel","onResultMouseLeave","SearchInput","Input","theme","rounding","placeholder","leftContent","onChange","SearchResult","result","onClick","Button","contentClass","Expand","onExpand","_window$gtag","_window","body","classList","contains","EXPANDED_MAP_BODY_CLASSS","remove","gtag","event_category","add","scrollTo","isMobile","isIpad","Share","uploadImage","useMutation","api","onShareClick","async","mapStore","getPublishCanvas","drawShareMap","getFormattedDateString","mutate","ShareDialog","disabled","useZoomButtons","zoomOut","ev","zoomIn","Zoom","handlers","_Fragment","SVG","useMapData","cacheBuster","mapBaseData","initialPerf","fetchBaseData","fetchPerfData","queryClient","useQueryClient","dataVersion","prevType","perfData","setQueryData","baseDataQuery","useQuery","queryKey","queryFn","initialData","cacheTime","Infinity","staleTime","perfDataQuery","getQueryData","FALLBACK_PERF_RESPONSE","version","keepPreviousData","refetchInterval","onSuccess","location","reload","restoredData","useMapType","_MAP_TYPES$find","_subtypes$find","query","URLSearchParams","useLocation","search","typeFromQuery","subtypeFromQuery","MAP_TYPES","find","t","subtypes","flatMap","items","MapSubtypeId","DayPerf","MapTypeList","_props$linkClassName","linkClass","linkClassName","isActiveTreemap","activeType","activeSubtype","append","NavLink","to","pageTitle","tracking","isLoading","_mapData$perfDataQuer","navigate","useNavigate","mapData","initData","hasInvestingChannelAds","useInvestingChannelAds","isNewSubtype","setIsNewSubtype","isFetching","isLoadingInitialBaseData","isPreviousData","isLoadingInitialPerf","isInitialLoading","isFetchingNewPerf","Topbar","navContent","as","href","mapControls","Paragraph","MapSelect","comboBox","item","delete","stringQuery","pathname","replace","inputClass","AdTag","position","ErrorBoundary","resetKeys","FallbackComponent","DefaultErrorBoundary","hash","root","ReactDOM","App","mapProps","parseJSONFromScript","precomputedData","hasRedesignEnabled","perfDataSec","MAP_SUBTYPE_DAY_PERF","sec","SettingsSmallDark","SettingsSmall","FinvizIndexSecMap","perfDataGeo","geo","SettingsSmallGeoDark","SettingsSmallGeo","FinvizIndexGeoMap","renderTreemaps","apiRequest","rev","mapPerf","st","mapPerfScreener","uploadMap","method","headers","ContentType","FormUrlEncoded","file","_targetScale","updateVisibleSparklines","debouncedLoadSparklines","_lastSparklinesRequest","debounce","tickers","_lastSparklinesReques","_lastSparklinesReques2","AppDispatcher","handleViewAction","ActionTypes","LOAD_SPARKLINES_STARTED","cancel","join","ty","handleServerAction","LOAD_SPARKLINES_COMPLETED","error","LOAD_SPARKLINES_FAILED","trailing","RESET_SPARKLINE_DATA","SET_HOVERED_NODE","_lastSparklinesReques3","_lastSparklinesReques4","tx","CHANGE_TRANSLATE","zoomLevel","getNextZoomLevel","animate","RENDER_TREEMAP","getPreviousZoomLevel","updateData","updateDimensions","updatePerfData","updatePerf","UPDATE_DATA","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","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","dimensions","d3","zoomElement","translateExtent","behavior","extent","newZoom","mapCenter","zoomSelection","scaleTo","getTransform","args","Array","isArray","translateBy","translateTo","scaleExtent","len","fontFamily","getTextFontFamily","_props$mapNodeId","getUuid","getColorScale","_updateIndustryPerf","_updateSectorPerf","ScaleId","PortfolioPct","PortfolioUsd","minValuePerf","abs","_node$data$perfWeek","_node$data","perfWeek","maxValuePerf","_node$data$perfWeek2","_node$data2","perfMax","minValueNode","maxValueNode","valueMax","valueToUse","isNaN","numberOfDigits","floor","log10","roundedBound","ceil","scaleMinMax","minDomain","maxDomain","gradient","gradients","gradientSmall","linearScale","domain","range","colors","nullColor","min","getParentSector","nodeName","parentSector","updatedNode","_node$data3","_resetIndustryPerf","weightedPriceSum","marketCapSum","marketCap","everyStockUndefined","_getNodeTopOffset","isSmallSecMap","leftPadding","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","_stepFormat$replace","_stepFormat","floatValue","parseFloat","absValue","isPositiveScaleOnly","formated","nodeText","textBaseline","textAlign","nodeY","nodeDY","textX","nameY","perfTextY","offset","font","fillText","getSpacingWithDefaults","spacing","_spacing$top","_spacing$right","_spacing$bottom","_spacing$left","right","bottom","_ref2","_config$height","_config$border","parrentPadding","margin","_ref3","fontWeight","IC_PUBLISHER_ID","AdTagName","tagDefinition","IC_TickerInContent","placements","minHeight","IC_MapsLeftRail","IC_Statements","IC_Groups","InvestingChannel","getInvestingChannelPage","page","create","_window$InvestingChan","InvestingChannelQueue","_window$FINVIZ_IC_UAT","_window$InvestingChan2","UAT","Run","console","destroy","_window$InvestingChan3","_page","deps","tagName","tagProps","placementName","shouldComponentUpdate","nextProps","line","curve","transform","PropTypes","isRequired","isValidElement","getAttribute","_window$Sentry","Sentry","captureMessage","extra","JSON","parse","textContent","captureException","AdsProvider","getAdsProvider","hasUserPremium","None","adsProvider","Freestar","trackPageView","_window$gtag2","_window2","freestarPageView","_window$freestar","freestar","queue","trackPageview","xmlns","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","module","exports","shim","propName","componentName","propFullName","secret","err","Error","getShim","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes"],"sourceRoot":""}