{"version":3,"file":"17.06a2518b.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/maps/components/CanvasHover.tsx","webpack://@finviz/website/./js/app/maps/components/Legend.tsx","webpack://@finviz/website/./js/app/maps/components/Canvas.tsx","webpack://@finviz/website/./js/app/maps/components/Map.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Zoom.tsx","webpack://@finviz/website/./js/app/maps/services/api.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/screener/utils.ts","webpack://@finviz/website/./js/app/shared/components/Sparkline.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 { 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}\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()\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()\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.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.name}\r\n {hasSparkline ? (\r\n \r\n ) : null}\r\n {price}{this._formatPerf(d)}
{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 { scaleStepFormat } from '../constants/settings'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapTypeId, Scale } from '../types'\r\n\r\ninterface LegendProps {\r\n treemap: Treemap\r\n scale: Scale\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.scale.name +\r\n \"] body=[
\" +\r\n props.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 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 if (props.scale.id === '_rec') {\r\n steps = [5, 4, 3, 2, 1]\r\n } else if (props.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.scale.id) !== -1 ? 100 : 50\r\n var format = scaleStepFormat[props.scale.id]\r\n return (\r\n
\r\n {props.treemap.type !== MapTypeId.Portfolio && (\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) => (\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 Hammer from 'hammerjs'\r\nimport * as React from 'react'\r\n\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, Scale } 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 scale: Scale\r\n onNodeClick?: (\r\n event: React.MouseEvent,\r\n node?: MapDataNode,\r\n industry?: MapDataIndustry,\r\n sector?: MapDataSector\r\n ) => void\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 = {\r\n zoom: 1,\r\n dataTimestamp: MapStore.getDataTimestamp(),\r\n initialized: false,\r\n type: this.props.treemap.type,\r\n updateTimestamp: undefined,\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 // @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 const { treemap } = this.props\r\n const { initialized, updateTimestamp, zoom, type } = this.state\r\n\r\n if (!initialized) return\r\n\r\n if (type !== treemap.type) {\r\n this.setState({ initialized: false, zoom: 1, type: treemap.type }, this._initialize)\r\n mapActionCreators.setHoveredNode(undefined)\r\n mapActionCreators.resetSparklineData()\r\n return\r\n }\r\n\r\n // Resize & update cache\r\n if (treemap.updateTimestamp && treemap.updateTimestamp !== updateTimestamp) {\r\n this._setCanvasSize(treemap.width, treemap.height)\r\n treemap.getZoomLevels().forEach((zoomLevel: number) => {\r\n this._createCache(zoomLevel)\r\n })\r\n this.setState({ updateTimestamp: treemap.updateTimestamp })\r\n }\r\n\r\n // Redraw\r\n const [x, y] = treemap.zoom.translate()\r\n this.renderFromCache(this._canvasContext, zoom, treemap.width, treemap.height, x, y)\r\n this.renderHover(this._hoverContext)\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 { alt, treemap, scale, 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(\r\n context: CanvasRenderingContext2D,\r\n scale: number,\r\n width: number,\r\n height: number,\r\n tx: number,\r\n ty: number\r\n ) {\r\n const zoomLevels = this.props.treemap.getZoomLevels()\r\n\r\n let nearestSize: number = zoomLevels[0]\r\n for (var i = 0, len = zoomLevels.length; i < len; i++) {\r\n const level = zoomLevels[i]\r\n if (this._cache[level]?.canvas && level >= +scale.toFixed(2)) {\r\n nearestSize = level\r\n break\r\n }\r\n }\r\n\r\n context.save()\r\n context.drawImage(this._cache[nearestSize].canvas, ~~tx, ~~ty, ~~(width * scale), ~~(height * scale))\r\n context.restore()\r\n }\r\n\r\n _onChange() {\r\n const { treemap } = this.props\r\n const dataTimestamp = MapStore.getDataTimestamp()\r\n\r\n this.setState({ zoom: treemap.zoom.scale() })\r\n if (this.state.dataTimestamp !== dataTimestamp) {\r\n let scale = treemap.zoom.scale()\r\n let translate = treemap.zoom.translate()\r\n\r\n treemap.getZoomLevels().forEach((zoomLevel: number) => {\r\n this._createCache(zoomLevel)\r\n })\r\n\r\n treemap.zoom.scale(scale)\r\n treemap.zoom.translateAbs([translate[0], translate[1]])\r\n\r\n this.setState({ dataTimestamp })\r\n }\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 const nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\r\n if (nodeAtPosition) {\r\n MapActionCreators.setHoveredNode(nodeAtPosition)\r\n } else {\r\n const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\r\n const nodeAtPosition = industryAtPosition?.children[0]\r\n MapActionCreators.setHoveredNode(nodeAtPosition)\r\n }\r\n }\r\n\r\n _onMouseUp() {\r\n this.mouseDown = false\r\n }\r\n\r\n _onMouseLeave() {\r\n MapActionCreators.setHoveredNode(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?.(e, nodeAtPosition, industryAtPosition, sectorAtPosition)\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')!\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')!\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 var renderLevel = (zoomLevelIndex: number) => {\r\n var zoomLevels = treemap.getZoomLevels()\r\n this._createCache(zoomLevels[zoomLevelIndex])\r\n\r\n if (zoomLevelIndex === 0) {\r\n const [x, y] = treemap.zoom.translate()\r\n this.renderFromCache(this._canvasContext, this.state.zoom, treemap.width, treemap.height, x, y)\r\n }\r\n\r\n if (zoomLevelIndex + 1 < zoomLevels.length) {\r\n setTimeout(() => {\r\n renderLevel(zoomLevelIndex + 1)\r\n }, 0)\r\n }\r\n\r\n if (zoomLevelIndex === zoomLevels.length - 1) {\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 var render = () => {\r\n setTimeout(() => {\r\n renderLevel(0)\r\n }, 0)\r\n }\r\n\r\n if (treemap.type === MapTypeId.World) {\r\n try {\r\n const image = await this._getTreemapGeoBackground()\r\n this.worldBackground = await loadImage(image.default)\r\n } catch {}\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 import('../assets/map_geo_small.png')\r\n }\r\n\r\n return import('../assets/map_geo.png')\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 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')!\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 }\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()\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.scale()\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 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\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 { MapDataIndustry, MapDataNode, MapDataRoot, MapDataSector, MapSubtype, MapSubtypeId, MapType } from '../types'\r\nimport * as mapUtils from '../utils'\r\nimport Canvas from './Canvas'\r\n\r\ninterface MapProps {\r\n className?: string\r\n isLoadingTreemap?: boolean\r\n isLoadingData?: boolean\r\n treemap?: Treemap\r\n setTreemap: (treemap: Treemap) => void\r\n type: MapType\r\n subtype: MapSubtype\r\n data?: MapDataRoot\r\n settings?: ISettings\r\n showETF?: boolean\r\n onNodeClick?: (\r\n event: React.MouseEvent,\r\n node?: MapDataNode,\r\n industry?: MapDataIndustry,\r\n sector?: MapDataSector\r\n ) => void\r\n zoom?: boolean\r\n zoomOnWheel?: boolean\r\n legend?: boolean\r\n hover?: boolean\r\n}\r\n\r\nexport function Map({\r\n className,\r\n isLoadingTreemap,\r\n isLoadingData,\r\n treemap,\r\n setTreemap,\r\n type,\r\n subtype,\r\n data,\r\n settings,\r\n showETF,\r\n onNodeClick,\r\n zoom,\r\n zoomOnWheel,\r\n legend,\r\n hover,\r\n}: MapProps) {\r\n const [generator, setGenerator] = React.useState()\r\n const containerRef = React.useRef(null)\r\n const prevSubtype = React.useRef(subtype.id)\r\n\r\n /**\r\n * Construct the layout when data is ready and when type changes. Do not change layout on subtype\r\n * change as it is not necessary.\r\n */\r\n React.useEffect(() => {\r\n const containerElement = containerRef.current\r\n\r\n if (!containerElement || isLoadingData) {\r\n return\r\n }\r\n\r\n const isSmall = mapUtils.getIsSmall()\r\n const size = mapUtils.getSize(containerElement, 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 setGenerator(generator)\r\n window.MAP_EXPORT = generator\r\n }, [data, isLoadingData, type.type, settings])\r\n\r\n /**\r\n * Create a new Treemap instance when the layout changes\r\n */\r\n React.useEffect(() => {\r\n if (!generator || !data || generator.type === treemap?.type) return\r\n\r\n const treemapObj = new Treemap({\r\n data: generator.getLayout(data, { showETF }),\r\n width: generator.width,\r\n height: generator.height,\r\n settings: generator.settings,\r\n isSmall: generator.isSmall,\r\n scaleId: subtype.scaleId,\r\n countIndustryPerf: subtype.countIndustryPerf,\r\n countSectorPerf: generator.isSmall && subtype.countSectorPerf,\r\n type: type.type,\r\n subtype: subtype.id,\r\n })\r\n\r\n setTreemap(treemapObj)\r\n // Run this only when layout changes, that means we need a new treemap. Otherwise reuse\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [generator])\r\n\r\n /**\r\n * Update the layout when the subtype changes\r\n */\r\n React.useEffect(() => {\r\n if (!treemap || prevSubtype.current === subtype.id) return\r\n\r\n // Set prev type so we don’t run this effect accidentally again\r\n prevSubtype.current = subtype.id\r\n\r\n treemap.subtype = subtype.id\r\n treemap.scaleId = subtype.scaleId\r\n treemap.countIndustryPerf = subtype.countIndustryPerf\r\n treemap.countSectorPerf = treemap.isSmall && subtype.countIndustryPerf\r\n }, [subtype, treemap])\r\n\r\n React.useEffect(() => {\r\n if (data && generator && treemap) {\r\n const layout = generator.getLayout(data, { showETF })\r\n mapActionCreators.updateLayout(treemap, { width: generator.width, height: generator.height, data: layout })\r\n }\r\n // Only run when Show ETFs change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [showETF])\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 generator.width = size.width\r\n generator.height = size.height\r\n\r\n if (size.width !== treemap.width && size.height !== treemap.height) {\r\n treemap.zoom.scale(1)\r\n const layout = generator.getLayout(data, { showETF })\r\n mapActionCreators.updateLayout(treemap, { width: generator.width, height: generator.height, data: layout })\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, showETF])\r\n\r\n return (\r\n
\r\n
\r\n {isLoadingTreemap && (\r\n \r\n
\r\n \r\n
\r\n
\r\n )}\r\n {treemap && (\r\n \r\n )}\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 { SVG } from '../../../../main/components/icon/svg'\r\nimport mapActionCreators from '../../store/action-creators'\r\nimport Treemap from '../../treemap'\r\n\r\nexport function Zoom({ treemap }: { treemap: Treemap }) {\r\n const onMinusClick = React.useCallback(\r\n (ev: React.MouseEvent) => {\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 onPlusClick = React.useCallback(\r\n (ev: React.MouseEvent) => {\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 (\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 { 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?rev=${cacheBuster}`)\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","// 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\ntype Extent = [min: number, max: number]\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 zoomExtent: [min: number, max: number]\r\n\r\n constructor(dimensions: Dimensions, zoomExtent: Extent) {\r\n this.translateExtent = [dimensions.width, dimensions.height]\r\n this.zoomExtent = zoomExtent\r\n\r\n this.behavior = d3\r\n .zoom()\r\n .extent([[0, 0], this.translateExtent])\r\n .scaleExtent(zoomExtent)\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","import * as d3 from 'd3'\r\n\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 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 scaleId: ScaleId\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 updateTimestamp?: number\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 ...props\r\n }: {\r\n data: MapData\r\n width: number\r\n height: number\r\n scaleId: ScaleId\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 }) {\r\n this.width = props.width\r\n this.height = props.height\r\n this.settings = props.settings\r\n this.type = props.type\r\n this.scaleId = props.scaleId\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\r\n this.zoom = new Zoom({ width: this.width, height: this.height }, [\r\n this.zoomLevels[0],\r\n this.zoomLevels[this.zoomLevels.length - 1],\r\n ])\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 }) {\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.updateTimestamp = +new Date()\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 getScaleMinMax() {\r\n switch (this.scaleId) {\r\n case ScaleId.PortfolioPct:\r\n case ScaleId.PortfolioUsd:\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 nubmer of digits and round nicely\r\n const valueToUse = this.scaleId === ScaleId.PortfolioPct ? valueMax + perfMax : valueMax * (1 + perfMax / 100)\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.scaleId]\r\n }\r\n }\r\n\r\n getColorScale() {\r\n const [minDomain, maxDomain] = this.getScaleMinMax()\r\n let gradient = gradients[this.scaleId]\r\n if (this.getIsSmall() && this.scaleId === 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.name !== 'Root') 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 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\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 const scale = this.zoom.scale()\r\n const fontSizes = this.settings.scaleFontSizes[scale]\r\n const nodeTopOffset = this._getNodeTopOffset(node)\r\n\r\n const nodeHeight = node.dy - nodeTopOffset\r\n let nodeNameFontSize = this.findMaxFontSizeForText(node.name, node.dx, nodeHeight, fontSizes)\r\n\r\n if (!nodeNameFontSize) return null\r\n\r\n const nodeNameLineHeight = fontSizeLineHeights[nodeNameFontSize]\r\n const stepFormat = scaleStepFormat[this.scaleId]\r\n const format = stepFormat === '%N%' ? (node.dx > 32 ? stepFormat : '%N') : stepFormat\r\n\r\n let perfText = 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.scaleId], 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 }\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.scaleId],\r\n format: string = scaleStepFormat[this.scaleId]\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\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 + 1, perfTextY + 1)\r\n }\r\n\r\n context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\r\n context.fillText(node.name, textX + 1, nameY + 1)\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(node.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 ) {\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 ) {\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 ) {\r\n return d\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Treemap\r\n","export enum ScreenerQuery {\r\n View = 'v',\r\n Signal = 's',\r\n Order = 'o',\r\n Tickers = 't',\r\n Filters = 'f',\r\n FilterTab = 'ft',\r\n MapSubtype = 'st',\r\n}\r\n\r\nexport enum ScreenerFilter {\r\n MarketCap = 'cap',\r\n Index = 'idx',\r\n Sector = 'sec',\r\n Industry = 'ind',\r\n AverageVolume = 'sh_avgvol',\r\n}\r\n\r\nexport enum ScreenerAddtionalQuery {\r\n ShowEtf = 'show_etf',\r\n}\r\n\r\nexport enum ScreenerView {\r\n Overview = 11,\r\n Maps = 71,\r\n Bubbles = 72,\r\n}\r\n\r\nexport function eventListenerRegister(el: HTMLElement, eventName: string, handler: (...args: any[]) => any) {\r\n el.addEventListener(eventName, handler)\r\n\r\n return () => {\r\n el.removeEventListener(eventName, handler)\r\n }\r\n}\r\n\r\nexport function textContent(el: HTMLElement) {\r\n return el.textContent || el.innerText\r\n}\r\n\r\nexport function ScreenerGetOptionsList(select: HTMLSelectElement) {\r\n const options = select.getAttribute('data-selected')?.split('|') ?? [],\r\n result = []\r\n for (var i = 0, len = options.length; i < len; i++) {\r\n var option = options[i]\r\n for (var j = 0; j < select.children.length; j++) {\r\n var optionEl = select.children[j] as HTMLOptionElement\r\n if (optionEl.value === option) {\r\n result.push({\r\n key: option,\r\n value: textContent(optionEl),\r\n })\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\nexport function ScreenerRenderCustomModal(select: any) {\r\n const filter = select.getAttribute('data-filter')\r\n const customWrapper = document.getElementById('fsm_' + filter) as HTMLElement\r\n if (customWrapper) {\r\n select.style.display = 'none'\r\n customWrapper.style.display = 'block'\r\n const input = document.getElementById('fsmi_' + filter) as HTMLInputElement\r\n const options = ScreenerGetOptionsList(select)\r\n const arr = []\r\n for (let i = 0, len = options.length; i < len; i++) {\r\n arr.push(options[i].value)\r\n }\r\n input.value = arr.join(', ')\r\n }\r\n}\r\n\r\nconst DATE_REGEX = /^[0-9]{2}[-][0-9]{2}[-][0-9]{4}/\r\n\r\nexport function getIsOptionDateRange(option: string) {\r\n if (!option.includes('x')) return false\r\n\r\n const [from, to] = option.split('x')\r\n const [isValidFromDate, isValidToDate] = [from, to].map((value) => {\r\n if (DATE_REGEX.test(value)) {\r\n return !Number.isNaN(new Date(value.replace(/-/g, '/')).getTime())\r\n }\r\n return false\r\n })\r\n\r\n return isValidFromDate || isValidToDate\r\n}\r\n\r\nexport function getInitialDateFromSelectedValues(selectedValues: string[]) {\r\n const initialDate = selectedValues.find(getIsOptionDateRange)\r\n\r\n if (initialDate) {\r\n return initialDate.split('x').map((date) => (DATE_REGEX.test(date) ? date.replace(/-/g, '/') : undefined))\r\n }\r\n}\r\n\r\nexport function dateRangeToFilterString({ from, to }: { from?: string; to?: string }) {\r\n return from || to ? `${from ?? ''}x${to ?? ''}`.replace(/\\//g, '-') : null\r\n}\r\n\r\n/**\r\n * Creates link for given view & subview and ignores any additional query params\r\n */\r\nexport function getQueryForView(view?: ScreenerView, allowedParams: string[] = [], baseQuery = window.location.search) {\r\n const query = new URLSearchParams(baseQuery)\r\n const allowList = [...allowedParams, ...Object.values(ScreenerQuery)]\r\n\r\n /**\r\n * Seems like `query` is a live property, so we can’t use `query.forEach` to delete,\r\n * so we need to copy keys before looping.\r\n * https://stackoverflow.com/questions/60522437\r\n */\r\n const keys = Array.from(query.keys())\r\n\r\n keys.forEach((key) => {\r\n if (!allowList.includes(key)) {\r\n query.delete(key)\r\n }\r\n })\r\n\r\n const [, originalView, settings = 0] = query.get(ScreenerQuery.View)?.match(/(\\d{2})(\\d)/) ?? []\r\n\r\n if (view ?? originalView) {\r\n query.set(ScreenerQuery.View, `${view ?? originalView}${settings}`)\r\n }\r\n\r\n return query\r\n}\r\n\r\n/**\r\n * Parse screener `f` query param to object\r\n */\r\nexport function parseScreenerFilters(baseQuery = window.location.search) {\r\n const query = new URLSearchParams(baseQuery)\r\n const filtersString = query.get(ScreenerQuery.Filters)\r\n\r\n if (!filtersString) return {}\r\n\r\n return Object.fromEntries(\r\n filtersString.split(',').map((f) => {\r\n const lastUnderscore = f.lastIndexOf('_')\r\n const key = f.substring(0, lastUnderscore)\r\n const value = f.substring(lastUnderscore + 1)\r\n return [key, value.split('|')]\r\n })\r\n )\r\n}\r\n\r\n/**\r\n * Stringify screener `f` query param\r\n */\r\nexport function stringifyScreenerFilters(filters: Record) {\r\n return Object.entries(filters)\r\n .filter(([, value]) => String(value).length > 0)\r\n .map(([key, value]) => `${key}_${value.join('|')}`)\r\n .join(',')\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","/**\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","visibleTickers","activeNode","undefined","sparklinesData","MapStore","this","setState","getVisibleTooltipTickers","d","additional","perf","props","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","_onChange","addEventListener","_onMouseMove","componentWillUnmount","MapActions","removeEventListener","componentDidUpdate","_","prevState","name","includes","push","tickersToLoad","filter","ticker","length","mapType","render","hasSparkline","price","colorScale","type","children","parent","node","sort","a","b","dx","dy","isSmall","title","MapTypeId","id","className","backgroundColor","Sparkline","width","height","data","_formatPerf","colSpan","description","map","c","color","boxover","scale","tooltip","scaleMin","scaleMax","getScaleMinMax","steps","step","i","round","stepWidth","indexOf","format","scaleStepFormat","background","minWidth","textShadow","toString","Canvas","React","constructor","event","super","zoom","dataTimestamp","initialized","updateTimestamp","_cache","bind","mapActionCreators","_getPublishCanvas","_initialize","_setCanvasSize","getZoomLevels","forEach","zoomLevel","_createCache","x","y","translate","renderFromCache","_canvasContext","renderHover","_hoverContext","_hoverCanvas","current","_onWheel","alt","legend","hover","ref","_canvas","onMouseDown","_onMouseDown","onMouseMove","onMouseUp","_onMouseUp","onMouseLeave","_onMouseLeave","onDoubleClick","_onDoubleClick","context","tx","ty","zoomLevels","nearestSize","len","level","canvas","save","drawImage","restore","translateAbs","mouseDown","offsetX","offsetY","getOffset","nodeAtPosition","getNodeAtPosition","MapActionCreators","industryAtPosition","getIndustryAtPosition","sectorAtPosition","getSectorAtPosition","onNodeClick","preventDefault","deltaY","_onPanStart","lastPanX","pointers","lastPanY","_onPanMove","movementX","movementY","_onPinch","offsetX1","target","offsetLeft","offsetParent","offsetY1","offsetTop","direction","_setCanvasContexts","canvasContext","getContext","hoverContext","retinafy","zoomOnWheel","renderLevel","zoomLevelIndex","setTimeout","hoverCanvas","hammertime","Hammer","get","set","enable","threshold","on","passive","image","_getTreemapGeoBackground","worldBackground","loadImage","default","getIsSmall","oldScale","cacheCanvas","createElement","cacheContext","renderCanvas","settings","industry","hoveredNode","clearRect","apply","showIndustryHeader","LayoutGenerator","depth","NodeDepth","industryOffset","padding","sector","header","strokeStyle","border","lineWidth","strokeRect","beginPath","moveTo","lineTo","stroke","renderIndustryHeader","config","fill","renderNodeText","fillStyle","fillRect","naturalWidth","naturalHeight","index","sectors","industries","nodes","renderStockNode","isLargeNode","isGeoMap","renderBackground","Number","isFinite","renderSectorBorders","Map","isLoadingTreemap","isLoadingData","setTreemap","subtype","showETF","generator","setGenerator","containerRef","prevSubtype","containerElement","mapUtils","size","mapSettings","window","MAP_EXPORT","treemapObj","Treemap","getLayout","scaleId","countIndustryPerf","countSectorPerf","layout","resize","throttle","classnames","Delayed","Spinner","Zoom","onMinusClick","ev","onPlusClick","Button","theme","rounding","onClick","mapBaseData","cacheBuster","apiRequest","mapPerf","query","t","st","mapPerfScreener","location","search","uploadMap","method","headers","ContentType","body","URLSearchParams","file","replace","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","zoomExtent","d3","zoomElement","translateExtent","behavior","extent","newZoom","mapCenter","zoomSelection","call","scaleTo","getTransform","args","Array","isArray","translateBy","translateTo","scaleExtent","fontFamily","getTextFontFamily","MapSubtypeId","getColorScale","_updateIndustryPerf","_updateSectorPerf","updateData","Date","ScaleId","minValuePerf","abs","perfWeek","maxValuePerf","perfMax","minValueNode","maxValueNode","valueMax","valueToUse","numberOfDigits","floor","log10","roundedBound","ceil","scaleMinMax","minDomain","maxDomain","gradient","gradients","gradientSmall","linearScale","domain","range","colors","nullColor","min","value","getParentSector","updatePerf","nodeName","parentSector","updatedNode","find","_resetIndustryPerf","weightedPriceSum","marketCapSum","stock","marketCap","everyStockUndefined","_getNodeTopOffset","isSmallSecMap","leftPadding","topPadding","isFirstNodeInIndustry","getNodeText","fontSizes","scaleFontSizes","nodeTopOffset","nodeHeight","nodeNameFontSize","findMaxFontSizeForText","nodeNameLineHeight","stepFormat","perfText","fontPairs","fontSizePairs","allowedSize","perfFontSize","perfLineHeight","textHeight","topOffset","fontSize","text","getLongestText","fontSizePadding","maxWidth","widths","substring","getNextZoomLevel","actualZoomLevel","getPreviousZoomLevel","getLastZoomLevel","floatValue","parseFloat","absValue","isPositiveScaleOnly","formated","nodeText","textBaseline","textAlign","nodeY","nodeDY","textX","nameY","perfTextY","font","fillText","getSpacingWithDefaults","spacing","right","bottom","parrentPadding","margin","fontWeight","toUpperCase","ScreenerQuery","ScreenerFilter","ScreenerAddtionalQuery","ScreenerView","eventListenerRegister","eventName","handler","textContent","innerText","ScreenerRenderCustomModal","select","getAttribute","customWrapper","display","input","options","split","result","option","optionEl","key","ScreenerGetOptionsList","arr","join","DATE_REGEX","getIsOptionDateRange","from","to","isValidFromDate","isValidToDate","test","isNaN","getTime","getInitialDateFromSelectedValues","selectedValues","initialDate","date","dateRangeToFilterString","getQueryForView","view","allowedParams","baseQuery","allowList","Object","values","keys","delete","originalView","View","match","parseScreenerFilters","filtersString","Filters","fromEntries","lastUnderscore","lastIndexOf","stringifyScreenerFilters","filters","entries","String","shouldComponentUpdate","nextProps","line","curve","transform","PropTypes","isRequired","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":""}