{"version":3,"file":"6340.5edf52db.js","mappings":"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G,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,IACL9rB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHtC,EAAG,KACHwC,EAAG,MACH4nB,EAAG,MACHC,EAAG,KACHC,EAAG,MACHhd,EAAG,MACHid,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACH9G,EAAG,MACH1D,EAAG,MACHyK,EAAG,MACHC,EAAG,MACHC,EAAG,MACHrkB,EAAG,KACHC,EAAG,MACHqkB,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,EACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,EAAG,CACD,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,MACL9rB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHtC,EAAG,KACHwC,EAAG,MACH4nB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHhd,EAAG,MACHid,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACH9G,EAAG,MACH1D,EAAG,MACHyK,EAAG,MACHC,EAAG,MACHC,EAAG,MACHrkB,EAAG,KACHC,EAAG,MACHqkB,EAAG,MACHC,EAAG,KACHC,E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G,IACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,GAAI,CACF,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,OACL,IAAK,MACL9rB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHtC,EAAG,KACHwC,EAAG,MACH4nB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHhd,EAAG,MACHid,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACH9G,EAAG,MACH1D,EAAG,MACHyK,EAAG,MACHC,EAAG,MACHC,EAAG,OACHrkB,EAAG,KACHC,EAAG,MACHqkB,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,IACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,GAAI,CACF,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,OACL,IAAK,KACL9rB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHtC,EAAG,KACHwC,EAAG,MACH4nB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHhd,EAAG,MACHid,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,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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/components/Topbar/Topbar.tsx","webpack://@finviz/website/./js/app/maps/constants/constants.ts","webpack://@finviz/website/./js/app/maps/constants/generator.ts","webpack://@finviz/website/./js/app/maps/constants/settings.ts","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/layout-generator.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/maps/types.ts","webpack://@finviz/website/./js/app/maps/utils.ts","webpack://@finviz/website/./js/app/screener/utils.ts","webpack://@finviz/website/./js/app/shared/components/Share.tsx","webpack://@finviz/website/./js/app/shared/components/Sparkline.tsx","webpack://@finviz/website/./js/app/shared/drawShareMap.ts","webpack://@finviz/website/./js/app/shared/isStockFastRefreshAvailable.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/components/RedGreenText.tsx","webpack://@finviz/website/./js/main/components/Table/Table.tsx","webpack://@finviz/website/./js/main/components/Table/types.ts","webpack://@finviz/website/./js/main/components/Table/TableCell.tsx","webpack://@finviz/website/./js/main/components/Table/TableHeader.tsx","webpack://@finviz/website/./js/main/components/Table/TableRow.tsx","webpack://@finviz/website/./js/main/components/Table/hooks.ts","webpack://@finviz/website/./js/main/components/delayed.tsx","webpack://@finviz/website/./js/main/components/icon/svg.tsx","webpack://@finviz/website/./js/main/components/loading.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./js/main/hooks/use-sort-data.ts","webpack://@finviz/website/./js/main/modules/portfolio/constants/columns.tsx","webpack://@finviz/website/./js/main/modules/portfolio/constants/general.ts","webpack://@finviz/website/./js/main/modules/portfolio/services/api.ts","webpack://@finviz/website/./js/main/modules/portfolio/types.tsx","webpack://@finviz/website/./js/main/modules/portfolio/utils.ts","webpack://@finviz/website/../node_modules/copy-to-clipboard/index.js","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","webpack://@finviz/website/../node_modules/react-dom/cjs/react-dom-server.browser.production.min.js","webpack://@finviz/website/../node_modules/react-dom/server.browser.js","webpack://@finviz/website/../node_modules/react-fast-compare/index.js","webpack://@finviz/website/../node_modules/react-popper/lib/esm/utils.js","webpack://@finviz/website/../node_modules/react-popper/lib/esm/usePopper.js","webpack://@finviz/website/../node_modules/react-router-dom/dist/index.js","webpack://@finviz/website/../node_modules/react-share/es/FacebookIcon.js","webpack://@finviz/website/../node_modules/react-share/es/FacebookShareButton.js","webpack://@finviz/website/../node_modules/react-share/es/TwitterIcon.js","webpack://@finviz/website/../node_modules/react-share/es/TwitterShareButton.js","webpack://@finviz/website/../node_modules/react-share/es/hocs/createIcon.js","webpack://@finviz/website/../node_modules/react-share/es/ShareButton.js","webpack://@finviz/website/../node_modules/react-share/es/hocs/createShareButton.js","webpack://@finviz/website/../node_modules/react-share/es/utils/assert.js","webpack://@finviz/website/../node_modules/react-share/es/utils/objectToGetParams.js","webpack://@finviz/website/../node_modules/reakit/es/Tab/Tab.js","webpack://@finviz/website/../node_modules/reakit/es/Tab/TabList.js","webpack://@finviz/website/../node_modules/reakit/es/Tab/TabPanel.js","webpack://@finviz/website/../node_modules/reakit/es/Tab/TabState.js","webpack://@finviz/website/../node_modules/reakit/es/__keys-3c0b2243.js","webpack://@finviz/website/../node_modules/toggle-selection/index.js","webpack://@finviz/website/../node_modules/@tanstack/query-core/build/lib/mutationObserver.mjs","webpack://@finviz/website/../node_modules/@tanstack/react-query/build/lib/useMutation.mjs"],"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 (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 showETF?: boolean\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 showETF,\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, { showETF }),\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.name, tooltip: subtype.tooltip },\r\n countIndustryPerf: subtype.countIndustryPerf,\r\n countSectorPerf: generator.isSmall && subtype.countSectorPerf,\r\n type: type.type,\r\n subtype: subtype.id,\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, showETF, 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, { showETF })\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.name, 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, showETF, 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, { showETF })\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, showETF])\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 layoutOptions?: Record\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, { showETF: props.layoutOptions?.showETF })\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, props.layoutOptions])\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.name, 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 if (!treemap) return null\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 classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface TopbarProps {\r\n className?: string\r\n navContent?: React.ReactNode\r\n mapControls?: React.ReactNode\r\n}\r\n\r\nexport function Topbar(props: React.PropsWithChildren) {\r\n return (\r\n
    \r\n {props.navContent && (\r\n
    \r\n {props.navContent}\r\n
    \r\n )}\r\n
    {props.children}
    \r\n {props.mapControls}\r\n
    \r\n )\r\n}\r\n","import { MapSubtype, MapSubtypeId, MapType, MapTypeId, PerfData, ScaleId } from '../types'\r\n\r\nexport const EXPANDED_MAP_BODY_CLASSS = 'is-map-expanded'\r\nexport const FALLBACK_PERF_RESPONSE: PerfData = { nodes: {}, additional: {}, subtype: MapSubtypeId.DayPerf, hash: '' }\r\n\r\nexport const MAP_SUBTYPES_COMPANIES_BY_ID: Record = {\r\n [MapSubtypeId.DayPerf]: {\r\n id: MapSubtypeId.DayPerf,\r\n name: '1 Day Performance',\r\n scaleId: ScaleId.DayPerf,\r\n tooltip:\r\n \"Color indicates today's stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.WeekPerf]: {\r\n id: MapSubtypeId.WeekPerf,\r\n name: '1 Week Performance',\r\n scaleId: ScaleId.WeekPerf,\r\n tooltip:\r\n 'Color indicates weekly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.MonthPerf]: {\r\n id: MapSubtypeId.MonthPerf,\r\n name: '1 Month Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n 'Color indicates monthly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ThreeMonthPerf]: {\r\n id: MapSubtypeId.ThreeMonthPerf,\r\n name: '3 Months Performance',\r\n scaleId: ScaleId.ThreeMonthPerf,\r\n tooltip:\r\n 'Color indicates quarterly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.SixMonthPerf]: {\r\n id: MapSubtypeId.SixMonthPerf,\r\n name: '6 Months Performance',\r\n scaleId: ScaleId.SixMonthPerf,\r\n tooltip:\r\n 'Color indicates half-yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearPerf]: {\r\n id: MapSubtypeId.YearPerf,\r\n name: '1 Year Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearToDatePerf]: {\r\n id: MapSubtypeId.YearToDatePerf,\r\n name: 'Year To Date Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates year to date stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.RelativeVolume]: {\r\n id: MapSubtypeId.RelativeVolume,\r\n name: 'Relative Volume',\r\n scaleId: ScaleId.RelativeVolume,\r\n tooltip:\r\n \"Color indicates the stock's relative volume, ratio between today's and average volume. Values above 1.5 show strong volume, values below 0.5 indicate weak volume.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToEarnings]: {\r\n id: MapSubtypeId.PriceToEarnings,\r\n name: 'P/E',\r\n scaleId: ScaleId.PriceToEarnings,\r\n tooltip: \"Color indicates the stock's price-to-earnings ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ForwardPriceToEearnings]: {\r\n id: MapSubtypeId.ForwardPriceToEearnings,\r\n name: 'Forward P/E',\r\n scaleId: ScaleId.ForwardPriceToEearnings,\r\n tooltip: \"Color indicates the stock's forward price-to-earnings ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceEarningsToGrowth]: {\r\n id: MapSubtypeId.PriceEarningsToGrowth,\r\n name: 'PEG',\r\n scaleId: ScaleId.PriceEarningsToGrowth,\r\n tooltip: \"Color indicates the stock's price-to-earnings-to-growth ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToSellsRatio]: {\r\n id: MapSubtypeId.PriceToSellsRatio,\r\n name: 'P/S',\r\n scaleId: ScaleId.PriceToSellsRatio,\r\n tooltip: \"Color indicates the stock's price-to-sales ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToBookRatio]: {\r\n id: MapSubtypeId.PriceToBookRatio,\r\n name: 'P/B',\r\n scaleId: ScaleId.PriceToBookRatio,\r\n tooltip: \"Color indicates the stock's price-to-book ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.DividendYield]: {\r\n id: MapSubtypeId.DividendYield,\r\n name: 'Dividend Yield',\r\n scaleId: ScaleId.DividendYield,\r\n tooltip: \"Color indicates the stock's dividend yield.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.EPSGrowth5y]: {\r\n id: MapSubtypeId.EPSGrowth5y,\r\n name: 'EPS Growth Past 5 Years',\r\n scaleId: ScaleId.EPSGrowth5y,\r\n tooltip: \"Color indicates the stock's annual earnings (EPS) growth over past 5 years.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.FloatShort]: {\r\n id: MapSubtypeId.FloatShort,\r\n name: 'Float Short',\r\n scaleId: ScaleId.FloatShort,\r\n tooltip: \"Color indicates percent of the stock's float sold short.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.AnalystRecommendation]: {\r\n id: MapSubtypeId.AnalystRecommendation,\r\n name: 'Analysts Recom.',\r\n scaleId: ScaleId.AnalystRecommendation,\r\n tooltip:\r\n \"Color indicates the analyst's recommendations for given stocks. The rating is based on a 1-5 scale, ranging from a strong-buy, to a strong-sell.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.EarningsPerf]: {\r\n id: MapSubtypeId.EarningsPerf,\r\n name: 'Earnings Day Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n \"Color indicates stock's performance on earnings day. Next day performance for earnings reported after market close.\",\r\n countIndustryPerf: false,\r\n countSectorPerf: false,\r\n },\r\n [MapSubtypeId.EarningsDate]: {\r\n id: MapSubtypeId.EarningsDate,\r\n name: 'Earnings Date',\r\n scaleId: ScaleId.EarningsDate,\r\n tooltip: \"Color indicates stock's earnings date.\",\r\n countIndustryPerf: false,\r\n countSectorPerf: false,\r\n },\r\n}\r\n\r\nexport const MAP_SUBTYPES_ETF_BY_ID = {\r\n [MapSubtypeId.DayPerf]: {\r\n id: MapSubtypeId.DayPerf,\r\n name: '1 Day Performance',\r\n scaleId: ScaleId.DayPerf,\r\n tooltip:\r\n \"Color indicates today's stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.WeekPerf]: {\r\n id: MapSubtypeId.WeekPerf,\r\n name: '1 Week Performance',\r\n scaleId: ScaleId.WeekPerf,\r\n tooltip:\r\n 'Color indicates weekly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.MonthPerf]: {\r\n id: MapSubtypeId.MonthPerf,\r\n name: '1 Month Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n 'Color indicates monthly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ThreeMonthPerf]: {\r\n id: MapSubtypeId.ThreeMonthPerf,\r\n name: '3 Months Performance',\r\n scaleId: ScaleId.ThreeMonthPerf,\r\n tooltip:\r\n 'Color indicates quarterly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.SixMonthPerf]: {\r\n id: MapSubtypeId.SixMonthPerf,\r\n name: '6 Months Performance',\r\n scaleId: ScaleId.SixMonthPerf,\r\n tooltip:\r\n 'Color indicates half-yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearPerf]: {\r\n id: MapSubtypeId.YearPerf,\r\n name: '1 Year Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearToDatePerf]: {\r\n id: MapSubtypeId.YearToDatePerf,\r\n name: 'Year To Date Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates year to date stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.RelativeVolume]: {\r\n id: MapSubtypeId.RelativeVolume,\r\n name: 'Relative Volume',\r\n scaleId: ScaleId.RelativeVolume,\r\n tooltip:\r\n \"Color indicates the stock's relative volume, ratio between today's and average volume. Values above 1.5 show strong volume, values below 0.5 indicate weak volume.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n}\r\n\r\nexport const MAP_SUBTYPES_COMPANIES: MapSubtype[] = Object.values(MAP_SUBTYPES_COMPANIES_BY_ID)\r\n\r\nexport const MAP_SUBTYPES_ETF: MapSubtype[] = Object.values(MAP_SUBTYPES_ETF_BY_ID)\r\n\r\nexport const MAP_TYPES: MapType[] = [\r\n {\r\n name: 'S&P 500',\r\n pageTitle: 'S&P 500 Map',\r\n description:\r\n \"Standard and Poor's 500 index stocks categorized by sectors and industries. Size represents market cap.\",\r\n type: MapTypeId.Sector,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'World',\r\n pageTitle: 'World Map',\r\n description:\r\n 'Foreign ADR stocks listed on NYSE, NASDAQ, AMEX categorized by geo location. Size represents market cap.',\r\n type: MapTypeId.World,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'Full',\r\n pageTitle: 'Stock Market Map',\r\n description:\r\n 'All stocks listed on US stock exchanges, categorized by sectors and industries. Size represents market cap.',\r\n type: MapTypeId.SectorFull,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'Exchange Traded Funds',\r\n pageTitle: 'ETF Map - Exchange Traded Funds Map',\r\n nameShort: 'ETF',\r\n description: 'ETFs categorized by sectors and styles. Size represents 3-month average dollar volume, $1M minimum.',\r\n type: MapTypeId.ETF,\r\n subtypes: MAP_SUBTYPES_ETF,\r\n },\r\n]\r\n\r\nexport const MAP_TYPE_SCREENER = {\r\n name: 'Screener',\r\n pageTitle: 'Screener Map',\r\n description:\r\n 'All stocks listed on US stock exchanges, categorized by sectors and industries. Size represents market cap.',\r\n type: MapTypeId.Screener,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n}\r\n\r\nexport const MAP_TYPE_ETF_HOLDINGS_WIDGET = {\r\n name: 'ETF Holdings',\r\n pageTitle: '',\r\n description: '',\r\n type: MapTypeId.ETFHoldings,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n}\r\n","export type MapOrder = Record\r\n\r\nexport const MAP_MIN_WIDTH = 700\r\nexport const MAP_MIN_HEIGHT = 388\r\nexport const SECTOR_MIN_HEIGHT = 5\r\nexport const LEGEND_HEIGHT = 79\r\n\r\nexport const LARGE_MAP_HEIGHT_RATIO = 1.8\r\nexport const SMALL_MAP_GEO_HEIGHT_RATIO = 1.7\r\nexport const SMALL_MAP_HEIGHT_RATIO = 1.085 // old design ratio - 1.33\r\n\r\n// Minimal size of node to display header\r\nexport const LARGE_NODE_SIZE = {\r\n dx: 40,\r\n dy: 12,\r\n}\r\n\r\n// Don't display header if node height - header is smaller than this\r\nexport const LARGE_NODE_MIN_HEIGHT = 5\r\n\r\nexport const ORDER_SP500: MapOrder = {\r\n Technology: 10,\r\n Financial: 11,\r\n 'Communication Services': 9,\r\n Healthcare: 4,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n\r\n // Industries\r\n 'Software - Infrastructure': 2,\r\n Semiconductors: 1,\r\n}\r\n\r\nexport const ORDER_SEC_ALL: MapOrder = {\r\n Financial: 10,\r\n Technology: 9,\r\n 'Communication Services': 8,\r\n 'Consumer Cyclical': 7,\r\n 'Consumer Defensive': 6,\r\n Healthcare: 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n\r\n // Industries\r\n 'Software - Infrastructure': 2,\r\n Semiconductors: 1,\r\n}\r\nexport const ORDER_ETF: MapOrder = {\r\n US: 11,\r\n 'US Sector': 10,\r\n 'US Large Cap': 9,\r\n 'US Mid Cap': 8,\r\n 'US Small Cap': 7,\r\n 'US Volatility': 6,\r\n Global: 5,\r\n International: 3,\r\n 'Fixed Income': 2,\r\n Commodity: 4,\r\n Strategy: 1,\r\n Forex: 0,\r\n}\r\n\r\nexport const ORDER_SCREENER: MapOrder = {\r\n Technology: 10,\r\n Financial: 9,\r\n 'Communication Services': 8,\r\n Healthcare: 7,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n}\r\n\r\nexport const ORDER_SCREENER_ETF: MapOrder = {\r\n ...ORDER_SCREENER,\r\n Financial: 1000,\r\n}\r\n\r\nexport const ORDER_WORLD: MapOrder = {\r\n Ireland: 20,\r\n 'United Kingdom': 19,\r\n Spain: 18,\r\n France: 17,\r\n Belgium: 16,\r\n Netherlands: 15,\r\n Switzerland: 14,\r\n\r\n China: 21,\r\n Japan: 20,\r\n India: 19,\r\n 'Hong Kong': 18,\r\n 'South Korea': 15,\r\n Taiwan: 14,\r\n\r\n Colombia: 30,\r\n Chile: 29,\r\n Argentina: 28,\r\n}\r\n\r\nexport const WORLD_INDUSTRIES = [\r\n {\r\n x: 4,\r\n y: 0,\r\n dx: 240,\r\n dy: 226,\r\n name: 'Canada',\r\n countries: ['Canada'],\r\n },\r\n {\r\n x: 4,\r\n y: 230,\r\n dx: 240,\r\n dy: 135,\r\n name: 'Mexico',\r\n countries: ['Cayman Islands', 'Bermuda', 'Mexico'],\r\n },\r\n {\r\n x: 4,\r\n y: 375,\r\n dx: 240,\r\n dy: 170,\r\n name: 'South America',\r\n countries: ['Netherlands Antilles', 'Panama', 'Peru', 'Argentina', 'Colombia', 'Chile', 'Brazil'],\r\n },\r\n {\r\n x: 730,\r\n y: 380,\r\n dx: 108,\r\n dy: 80,\r\n name: 'South Africa',\r\n countries: ['South Africa'],\r\n },\r\n {\r\n x: 725,\r\n y: 180,\r\n dx: 108,\r\n dy: 81,\r\n name: 'Israel',\r\n countries: ['Israel'],\r\n },\r\n {\r\n x: 1055,\r\n y: 420,\r\n dx: 144,\r\n dy: 80,\r\n name: 'Australia',\r\n countries: ['Australia'],\r\n },\r\n {\r\n x: 871,\r\n y: 0,\r\n dx: 336,\r\n dy: 396,\r\n name: 'Asia',\r\n countries: [\r\n 'Malaysia',\r\n 'Russia',\r\n 'Philippines',\r\n 'Indonesia',\r\n 'Singapore',\r\n 'South Korea',\r\n 'Taiwan',\r\n 'India',\r\n 'Hong Kong',\r\n 'Japan',\r\n 'China',\r\n ],\r\n },\r\n {\r\n x: 324,\r\n y: 0,\r\n dx: 374,\r\n dy: 428,\r\n name: 'Europe',\r\n countries: [\r\n 'Cyprus',\r\n 'Channel Islands',\r\n 'Greece',\r\n 'Luxembourg',\r\n 'Germany',\r\n 'Belgium',\r\n 'Spain',\r\n 'France',\r\n 'Ireland',\r\n 'Switzerland',\r\n 'Netherlands',\r\n 'United Kingdom',\r\n ],\r\n },\r\n {\r\n x: 697,\r\n y: 75,\r\n dx: 144,\r\n dy: 51,\r\n name: 'Frozen',\r\n countries: ['Finland', 'Sweden', 'Norway', 'Denmark'],\r\n },\r\n {\r\n x: 542,\r\n y: 414,\r\n dx: 102,\r\n dy: 68,\r\n name: 'Italy',\r\n countries: ['Italy'],\r\n },\r\n]\r\n","import tailwindColors from '../../../../../config/colors'\r\nimport { ScaleId } from '../types'\r\n\r\nexport interface ISettings {\r\n padding: { top: number; right: number; bottom: number; left: number }\r\n background: string\r\n industry: ISettingsSection\r\n sector: ISettingsSection\r\n scaleFontSizes: Record\r\n fontSizePadding: Record\r\n fontSizePairs: Record\r\n}\r\n\r\nexport interface ISettingsSection {\r\n padding: { top: number; right: number; bottom: number; left: number }\r\n background: string | null\r\n border: string | null\r\n header: ISettingsSectionHeader\r\n hover?: ISettingsSectionHeader\r\n}\r\n\r\nexport interface ISettingsSectionHeader extends ISettingsSectionFont {\r\n background: string | null\r\n border: string | null\r\n height: number\r\n margin: { top: number; right: number; bottom: number; left: number }\r\n}\r\n\r\nexport interface ISettingsSectionFont {\r\n color: string\r\n fontSize: number\r\n fontWeight: 'bold' | 'normal'\r\n padding: { top: number; right: number; left: number }\r\n}\r\n\r\nexport const scaleMinMax: Record = {\r\n [ScaleId.DayPerf]: [-3, 3],\r\n _5: [-6, 6],\r\n _10: [-10, 10],\r\n _15: [-18, 18],\r\n _20: [-24, 24],\r\n _25: [-30, 30],\r\n _relvol: [0, 3],\r\n _pe: [0, 30],\r\n _fpe: [0, 30],\r\n _peg: [0, 3],\r\n _ps: [0, 5],\r\n _pb: [0, 5],\r\n _div: [0, 5],\r\n _eps5y: [-50, 50],\r\n _short: [0, 15],\r\n _rec: [5, 1],\r\n _earndate: [30, -30],\r\n // Portfolio — values are just placeholders, the real value is computed from data\r\n _portfolioPct: [-1, 1],\r\n _portfolioUsd: [-1, 1],\r\n}\r\n\r\nexport const scaleStepFormat: Record = {\r\n [ScaleId.DayPerf]: '%N%',\r\n _5: '%N%',\r\n _10: '%N%',\r\n _15: '%N%',\r\n _20: '%N%',\r\n _25: '%N%',\r\n _relvol: '%N',\r\n _pe: '%N',\r\n _fpe: '%N',\r\n _peg: '%N',\r\n _ps: '%N',\r\n _pb: '%N',\r\n _div: '%N%',\r\n _eps5y: '%N%',\r\n _short: '%N%',\r\n _rec: { 1: '%N Strong Buy', 2: '%N Buy', 3: '%N Hold', 4: '%N Sell', 5: '%N Strong Sell' },\r\n _earndate: {\r\n '-30': '%N Days',\r\n '-15': '%N Days',\r\n '-1': 'After Earnings',\r\n 1: 'Before Earnings',\r\n 15: '%N Days',\r\n 30: '%N Days',\r\n },\r\n _portfolioPct: '%N%',\r\n _portfolioUsd: '$%N',\r\n}\r\n\r\nexport const Settings: ISettings = {\r\n padding: { top: 0, right: 0, bottom: 1, left: 1 },\r\n background: tailwindColors.finviz['blue-gray'],\r\n sector: {\r\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\r\n background: null,\r\n border: null,\r\n header: {\r\n color: '#fff',\r\n background: null,\r\n border: null,\r\n height: 14.5,\r\n fontSize: 13,\r\n fontWeight: 'bold',\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n padding: { top: -1, right: 4, left: 4 },\r\n },\r\n },\r\n industry: {\r\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\r\n background: null,\r\n border: null,\r\n header: {\r\n color: '#fff',\r\n background: null,\r\n border: tailwindColors.finviz['blue-gray'],\r\n height: 12,\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n margin: { top: 0, right: 0.5, bottom: 0, left: -0.5 },\r\n padding: { top: -0.5, right: 4, left: 4 },\r\n },\r\n hover: {\r\n color: '#6b5811',\r\n background: '#ffd614',\r\n border: '#ffd614',\r\n height: 12,\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n padding: { top: -0.5, right: 3, left: 4 },\r\n },\r\n },\r\n scaleFontSizes: {\r\n 1: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8],\r\n 1.5: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n 2.25: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n 3: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n },\r\n fontSizePadding: {\r\n 36: 30,\r\n 30: 25,\r\n 24: 20,\r\n 20: 14,\r\n 18: 12,\r\n 14: 9,\r\n 13: 7,\r\n 12: 7,\r\n 11: 4,\r\n 10: 3,\r\n 9: 3,\r\n 8: 2.5,\r\n 6: 0,\r\n 4: 1,\r\n },\r\n fontSizePairs: {\r\n 36: [18, 14, 13, 12],\r\n 30: [14, 13, 12, 11, 10],\r\n 24: [14, 13, 12, 11, 10],\r\n 20: [12, 11, 10, 9, 8, 6],\r\n 18: [11, 10, 9, 8, 6],\r\n 14: [9, 8, 6, 4],\r\n 13: [9, 8, 6, 4],\r\n 12: [9, 8, 6, 4],\r\n 11: [8, 6, 4],\r\n 10: [10, 9, 8, 6, 4],\r\n 9: [9, 8, 6, 4],\r\n 8: [8, 6, 4],\r\n 6: [6, 4],\r\n 4: [4],\r\n },\r\n}\r\n\r\nexport const SettingsSmall: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\r\n background: '#343842',\r\n sector: {\r\n ...Settings.industry,\r\n padding: { top: 0.5, right: 0, bottom: 0, left: 2 },\r\n border: '#e0e0e0',\r\n header: {\r\n ...Settings.industry.header,\r\n margin: { top: 0, right: 0.5, bottom: 0, left: -1.5 },\r\n padding: { top: 0.5, right: 1, left: 1 },\r\n border: '#343842',\r\n fontSize: 9,\r\n },\r\n },\r\n industry: {\r\n ...Settings.industry,\r\n padding: { top: 0, right: 1, bottom: 1, left: 0 },\r\n header: {\r\n ...Settings.industry.header,\r\n height: 0,\r\n },\r\n },\r\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\r\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 2, 6: 0, 4: 0 },\r\n fontSizePairs: {\r\n 14: [9, 8, 6],\r\n 13: [9, 8, 6],\r\n 12: [6],\r\n 11: [6],\r\n 10: [6],\r\n 9: [6],\r\n 8: [6],\r\n 6: [6],\r\n },\r\n}\r\n\r\nexport const SettingsSmallDark: ISettings = {\r\n ...SettingsSmall,\r\n sector: {\r\n ...SettingsSmall.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n header: {\r\n ...SettingsSmall.sector.header,\r\n padding: { top: 0.5, right: 2, left: 2 },\r\n margin: { top: 0, right: 1.5, bottom: 0, left: -0.5 },\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n industry: {\r\n ...SettingsSmall.industry,\r\n header: {\r\n ...SettingsSmall.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsSmallGeo: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\r\n background: '#a7c4d3',\r\n industry: {\r\n ...Settings.industry,\r\n background: '#e0e0e0',\r\n header: {\r\n ...Settings.industry.header,\r\n height: 9,\r\n fontSize: 8,\r\n border: '#e0e0e0',\r\n margin: { top: -0.5, right: 0.5, bottom: 0, left: -0.5 },\r\n padding: { top: -1, right: 0, left: 1 },\r\n },\r\n },\r\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\r\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 1, 6: 0, 4: 0 },\r\n fontSizePairs: {\r\n 14: [9, 8, 6],\r\n 13: [9, 8, 6],\r\n 12: [6],\r\n 11: [6],\r\n 10: [6],\r\n 9: [6],\r\n 8: [6],\r\n 6: [6],\r\n },\r\n}\r\n\r\nexport const SettingsSmallGeoDark: ISettings = {\r\n ...SettingsSmallGeo,\r\n background: tailwindColors.gray[800],\r\n sector: {\r\n ...SettingsSmallGeo.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n },\r\n industry: {\r\n ...SettingsSmallGeo.industry,\r\n border: tailwindColors.gray[800],\r\n background: tailwindColors.gray[800],\r\n header: {\r\n ...SettingsSmallGeo.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsScreener: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\r\n sector: {\r\n ...Settings.sector,\r\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\r\n background: '#363a46',\r\n border: '#d3d3d3',\r\n header: {\r\n ...Settings.sector.header,\r\n height: 20,\r\n padding: { top: 2.5, right: 4, left: 4 },\r\n },\r\n },\r\n industry: {\r\n ...Settings.industry,\r\n header: {\r\n ...Settings.industry.header,\r\n border: '#363a46',\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsScreenerDark: ISettings = {\r\n ...SettingsScreener,\r\n sector: {\r\n ...SettingsScreener.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n },\r\n industry: {\r\n ...SettingsScreener.industry,\r\n header: {\r\n ...SettingsScreener.industry.header,\r\n border: tailwindColors.gray[800],\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 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 }\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\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 subtype = type.subtypes.find((subtype) => subtype.id === subtypeFromQuery) ?? type.subtypes[0]\r\n\r\n return { type, subtype }\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport * as constants from './constants/generator'\r\nimport { ISettings } from './constants/settings'\r\nimport { MapDataIndustry, MapDataNode, MapDataRoot, MapDataRow, MapDataSector, MapTypeId, NodeDepth } from './types'\r\n\r\nexport default class LayoutGenerator {\r\n width: number\r\n height: number\r\n settings: ISettings\r\n layout?: Array>\r\n sectors: MapDataSector[] = []\r\n industries: MapDataIndustry[] = []\r\n nodes: MapDataNode[] = []\r\n isSmall: boolean\r\n type: MapTypeId\r\n minSectorHeight: number\r\n\r\n static smallIndustryPadding = {\r\n top: 4,\r\n right: 1,\r\n bottom: 1,\r\n left: 1,\r\n }\r\n\r\n static smallIndustryGeoPadding = {\r\n top: 4,\r\n right: 1,\r\n bottom: 1,\r\n left: 1,\r\n }\r\n\r\n static getSizeRatio = (type: MapTypeId, isSmall: boolean) => {\r\n if (isSmall) {\r\n if (type === MapTypeId.World) {\r\n return constants.SMALL_MAP_GEO_HEIGHT_RATIO\r\n }\r\n return constants.SMALL_MAP_HEIGHT_RATIO\r\n }\r\n\r\n return constants.LARGE_MAP_HEIGHT_RATIO\r\n }\r\n\r\n static calculateHeight = (\r\n width: number,\r\n type: MapTypeId,\r\n isSmall: boolean,\r\n ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n ) => ~~(width / ratio)\r\n\r\n static calculateWidth = (height: number, type: MapTypeId, isSmall: boolean) => {\r\n const ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n\r\n return Math.round(height * ratio)\r\n }\r\n\r\n static isNodeHeaderVisible(node: any, settings: ISettings) {\r\n const deltaX = node.dx ?? Math.round(node.x1) - Math.round(node.x0)\r\n const deltaY = node.dy ?? Math.round(node.y1) - Math.round(node.y0)\r\n\r\n const isLargeNode = deltaX >= constants.LARGE_NODE_SIZE.dx && deltaY >= constants.LARGE_NODE_SIZE.dy\r\n const showHeader =\r\n deltaY - settings.industry.padding.top - settings.industry.header.height > constants.LARGE_NODE_MIN_HEIGHT\r\n\r\n return isLargeNode && showHeader\r\n }\r\n\r\n constructor(width: number, height: number, type: MapTypeId, settings: ISettings, isSmall: boolean = false) {\r\n this.width = width\r\n this.height = height\r\n this.settings = settings\r\n this.isSmall = isSmall\r\n this.type = type\r\n this.minSectorHeight = settings.sector.padding.top + settings.sector.header.height + constants.SECTOR_MIN_HEIGHT\r\n }\r\n\r\n getExportData() {\r\n let mapRoot: MapDataRoot\r\n if (this.type === MapTypeId.World) {\r\n mapRoot = this._rootsToRoot(this.industries)\r\n } else {\r\n mapRoot = this.layout?.find((node) => node.data.name === 'Root') as unknown as MapDataRoot\r\n }\r\n\r\n // Save some file size by filtering out small nodes on maps where hover is not a concern\r\n if (this.isSmall) {\r\n mapRoot.children = this.filterVisibleNodes(mapRoot.children)\r\n }\r\n\r\n const stringified = JSON.stringify(mapRoot, (key, value) => (key === 'parent' ? '[Circular]' : value))\r\n\r\n return JSON.parse(stringified)\r\n }\r\n\r\n getLayoutData() {\r\n return {\r\n nodes: this.nodes,\r\n sectors: this.sectors,\r\n industries: this.industries,\r\n }\r\n }\r\n\r\n filterVisibleNodes = (arr: T[]) =>\r\n arr.filter((node) => {\r\n const isVisible = this.isNodeVisible(node)\r\n if (isVisible && node.children?.length) {\r\n node.children = this.filterVisibleNodes(node.children)\r\n }\r\n return isVisible\r\n })\r\n\r\n isNodeVisible(d: MapDataRow) {\r\n if (!d.depth || d.depth < NodeDepth.Industry) return true\r\n\r\n return d.dx > 0 && d.dy > 0\r\n }\r\n\r\n getLayout(data: MapDataRoot, options: Record = {}) {\r\n this.nodes = []\r\n this.sectors = []\r\n this.industries = []\r\n\r\n switch (this.type) {\r\n case MapTypeId.Sector:\r\n this.layout = this._generateSP500(data).descendants()\r\n break\r\n case MapTypeId.SectorFull:\r\n this.layout = this._generateFull(data).descendants()\r\n break\r\n case MapTypeId.Portfolio:\r\n case MapTypeId.Screener:\r\n case MapTypeId.ETFHoldings:\r\n this.layout = this._generateScreener(data, options).descendants()\r\n break\r\n case MapTypeId.World:\r\n this.layout = this._generateWorld(data)\r\n break\r\n case MapTypeId.ETF:\r\n this.layout = this._generateETF(data).descendants()\r\n break\r\n }\r\n\r\n this.layout?.forEach((d: any) => {\r\n this._transformNode(d)\r\n\r\n if (!this.isNodeVisible(d)) return\r\n\r\n if (!d.children) {\r\n this.nodes.push(d)\r\n } else if (d.parent && !d.parent.parent) {\r\n this.sectors.push(d)\r\n } else if (d.parent && !!d.parent.parent && d.children) {\r\n this.industries.push(d)\r\n }\r\n })\r\n\r\n return this.getLayoutData()\r\n }\r\n\r\n _transformNode(d: d3.HierarchyRectangularNode) {\r\n Object.assign(d, {\r\n name: d.data.name,\r\n description: d.data.description,\r\n perf: d.data.perf,\r\n additional: d.data.additional,\r\n x: d.x0,\r\n y: d.y0,\r\n dx: d.x1 - d.x0,\r\n dy: d.y1 - d.y0,\r\n })\r\n }\r\n\r\n _rootsToRoot(roots: any) {\r\n return {\r\n name: 'Root',\r\n children: [\r\n {\r\n name: 'World',\r\n children: roots,\r\n },\r\n ],\r\n duplicateTickers: 0,\r\n } as MapDataRoot\r\n }\r\n\r\n _getPadding = (d: d3.HierarchyRectangularNode) => {\r\n // Root\r\n if (d.depth === NodeDepth.Root) {\r\n return [\r\n this.settings.padding.top,\r\n this.settings.padding.right,\r\n this.settings.padding.bottom,\r\n this.settings.padding.left,\r\n ]\r\n }\r\n\r\n // Industries\r\n if (d.depth === NodeDepth.Industry) {\r\n if (this.isSmall || LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\r\n return [\r\n this.settings.industry.padding.top + this.settings.industry.header.height,\r\n this.settings.industry.padding.right,\r\n this.settings.industry.padding.bottom,\r\n this.settings.industry.padding.left,\r\n ]\r\n }\r\n\r\n return [\r\n LayoutGenerator.smallIndustryPadding.top,\r\n LayoutGenerator.smallIndustryPadding.right,\r\n LayoutGenerator.smallIndustryPadding.bottom,\r\n LayoutGenerator.smallIndustryPadding.left,\r\n ]\r\n }\r\n\r\n // Sectors\r\n return [\r\n this.settings.sector.padding.top + this.settings.sector.header.height,\r\n this.settings.sector.padding.right,\r\n this.settings.sector.padding.bottom,\r\n this.settings.sector.padding.left,\r\n ]\r\n }\r\n\r\n _getPaddingGeo = (d: d3.HierarchyRectangularNode) => {\r\n // Root\r\n if (d.depth === NodeDepth.Root) {\r\n return [\r\n this.settings.padding.top,\r\n this.settings.padding.right,\r\n this.settings.padding.bottom,\r\n this.settings.padding.left,\r\n ]\r\n }\r\n\r\n // Industries\r\n if (d.depth === NodeDepth.Industry) {\r\n if (LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\r\n return [\r\n this.settings.industry.padding.top + this.settings.industry.header.height,\r\n this.settings.industry.padding.right,\r\n this.settings.industry.padding.bottom,\r\n this.settings.industry.padding.left,\r\n ]\r\n }\r\n\r\n return [\r\n LayoutGenerator.smallIndustryGeoPadding.top,\r\n LayoutGenerator.smallIndustryGeoPadding.right,\r\n LayoutGenerator.smallIndustryGeoPadding.bottom,\r\n LayoutGenerator.smallIndustryGeoPadding.left,\r\n ]\r\n }\r\n\r\n // Sectors\r\n return [\r\n this.settings.sector.padding.top + this.settings.sector.header.height,\r\n this.settings.sector.padding.right,\r\n this.settings.sector.padding.bottom,\r\n this.settings.sector.padding.left,\r\n ]\r\n }\r\n\r\n _getHierarchySort = <\r\n Datum extends { y0?: number; y1?: number; value?: number; data: { name: string }; depth?: number },\r\n >(\r\n a: Datum,\r\n b: Datum,\r\n order: constants.MapOrder\r\n ): number => {\r\n // Sort small sectors (works only when layout is recalculated)\r\n const heightB = b.y1! - b.y0!\r\n if (b.depth === NodeDepth.Sector && Number.isFinite(heightB) && heightB < this.minSectorHeight) {\r\n return b.value! - a.value!\r\n }\r\n\r\n if (order.hasOwnProperty(a.data.name) && order.hasOwnProperty(b.data.name)) {\r\n return order[b.data.name] - order[a.data.name]\r\n }\r\n return b.value! - a.value!\r\n }\r\n\r\n _getHierarchy = (data: MapDataRoot, order: constants.MapOrder) =>\r\n d3\r\n .hierarchy(data as unknown as MapDataNode)\r\n .sum((d) => d.value)\r\n .sort((a, b) => this._getHierarchySort(a, b, order))\r\n\r\n _getTreemap = (width: number, height: number) => {\r\n const paddingFn = this.type === MapTypeId.World ? this._getPaddingGeo : this._getPadding\r\n\r\n return d3\r\n .treemap()\r\n .size([width, height])\r\n .round(true)\r\n .tile(d3.treemapSquarify.ratio(1))\r\n .paddingTop((d) => paddingFn(d)[0])\r\n .paddingRight((d) => paddingFn(d)[1])\r\n .paddingBottom((d) => paddingFn(d)[2])\r\n .paddingLeft((d) => paddingFn(d)[3])\r\n }\r\n\r\n _getIndustriesRoots(data: MapDataRoot, industries: string[]) {\r\n return data.children[0].children.filter(function (d) {\r\n return industries.some((i) => i === d.name)\r\n })\r\n }\r\n\r\n _getSectorsRoots(data: MapDataRoot, sectors: string[]) {\r\n return data.children.filter(function (d) {\r\n return sectors.some((s) => s === d.name)\r\n })\r\n }\r\n\r\n _generateLayout(data: MapDataRoot, order: constants.MapOrder, recountSectors = false) {\r\n const treemapHeight = LayoutGenerator.calculateHeight(this.width, this.type, false)\r\n const treemap = this._getTreemap(this.width, treemapHeight)\r\n const hierarchy = this._getHierarchy(data, order)\r\n const recalculateHeight = this.height !== treemapHeight\r\n\r\n // Calculate the base layout\r\n let nodes = treemap(hierarchy)\r\n\r\n // Recalculate for custom height\r\n if (this.height !== treemapHeight) {\r\n treemap.tile(d3.treemapResquarify).size([this.width, this.height])\r\n }\r\n\r\n // Run layout again so that possible small sectors are reordered\r\n // This also applies the recalculateHeight option\r\n if (recountSectors || recalculateHeight) {\r\n nodes = treemap(nodes.sort((a, b) => this._getHierarchySort(a, b, order)))\r\n }\r\n\r\n return nodes\r\n }\r\n\r\n _generateSP500(data: MapDataRoot) {\r\n const nodes = this._generateLayout(data, constants.ORDER_SP500)\r\n\r\n // Switch financial and technology sector\r\n const financialSector = nodes.find((node) => node.data.name === 'Financial')!\r\n const technologySector = nodes.find((node) => node.data.name === 'Technology')!\r\n const financialHeight = financialSector.y1 - financialSector.y0\r\n const technologyHeight = technologySector.y1 - technologySector.y0\r\n\r\n financialSector.eachAfter((node) => {\r\n if (node.y1 - node.y0 < 1) return\r\n node.y0 += technologyHeight\r\n node.y1 += technologyHeight\r\n })\r\n\r\n technologySector.eachAfter((node) => {\r\n if (node.y1 - node.y0 < 1) return\r\n node.y0 -= financialHeight\r\n node.y1 -= financialHeight\r\n })\r\n\r\n return nodes\r\n }\r\n\r\n _generateFull(data: MapDataRoot) {\r\n const layout = this._generateLayout(data, constants.ORDER_SEC_ALL)\r\n\r\n // Swap Technology and financial sectors\r\n const technologySector = layout.find((node) => node.depth === NodeDepth.Sector && node.data.name === 'Technology')!\r\n const financialSector = layout.find((node) => node.depth === NodeDepth.Sector && node.data.name === 'Financial')!\r\n\r\n const financialHeight = financialSector.y1 - financialSector.y0\r\n technologySector.each((node) => {\r\n node.y0 -= financialHeight\r\n node.y1 -= financialHeight\r\n })\r\n\r\n const technologyHeight = technologySector.y1 - technologySector.y0\r\n financialSector.each((node) => {\r\n node.y0 += technologyHeight\r\n node.y1 += technologyHeight\r\n })\r\n\r\n return layout\r\n }\r\n\r\n _generateScreener(data: MapDataRoot, { showETF }: Record) {\r\n const order = showETF ? constants.ORDER_SCREENER_ETF : constants.ORDER_SCREENER\r\n\r\n return this._generateLayout(data, order, true)\r\n }\r\n\r\n _generateETF(data: MapDataRoot) {\r\n return this._generateLayout(data, constants.ORDER_ETF)\r\n }\r\n\r\n _generateWorld = (data: MapDataRoot) => {\r\n const originalWidth = 1211\r\n const ratio = this.width / originalWidth\r\n let nodes: Array> = []\r\n\r\n for (let industryIndex = 0; industryIndex < constants.WORLD_INDUSTRIES.length; industryIndex++) {\r\n const industry = constants.WORLD_INDUSTRIES[industryIndex]\r\n const industryX = Math.round(industry.x * ratio)\r\n const industryY = Math.round(industry.y * ratio)\r\n const industryWidth = Math.round(industry.dx * ratio)\r\n const industryHeight = Math.round(industry.dy * ratio)\r\n\r\n const countriesRoots = this._getIndustriesRoots(data, industry.countries)\r\n const root = this._rootsToRoot(countriesRoots)\r\n const hierarchy = this._getHierarchy(root, constants.ORDER_WORLD)\r\n const treemap = this._getTreemap(industryWidth, industryHeight)\r\n const treemapNodes = treemap(hierarchy)\r\n\r\n treemapNodes.each((d) => {\r\n d.x0 += industryX\r\n d.x1 += industryX\r\n d.y0 += industryY\r\n d.y1 += industryY\r\n })\r\n\r\n // SWITCH BRAZIL AND OTHERS\r\n if (industry.name === 'South America') {\r\n const brazil = treemapNodes.find((d) => d.data.name === 'Brazil')!\r\n const colombia = treemapNodes.find((d) => d.data.name === 'Colombia')!\r\n const brazilWidth = brazil.x1 - brazil.x0\r\n const colombiaWidth = colombia.x1 - colombia.x0\r\n\r\n treemapNodes.each((d) => {\r\n if ([d.parent?.data.name, d.data.name].includes('Brazil')) {\r\n d.x0 += colombiaWidth\r\n d.x1 += colombiaWidth\r\n } else {\r\n d.x0 -= brazilWidth\r\n d.x1 -= brazilWidth\r\n }\r\n })\r\n }\r\n\r\n nodes = nodes.concat(treemapNodes.descendants())\r\n }\r\n\r\n return nodes\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`, { 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 { ReactNode } from 'react'\r\n\r\nexport enum MapTypeId {\r\n Sector = 'sec',\r\n World = 'geo',\r\n SectorFull = 'sec_all',\r\n ETF = 'etf',\r\n Screener = 'screener',\r\n Portfolio = 'portfolio',\r\n ETFHoldings = 'etf_holdings',\r\n}\r\n\r\nexport enum MapSubtypeId {\r\n DayPerf = 'd1',\r\n WeekPerf = 'w1',\r\n MonthPerf = 'w4',\r\n ThreeMonthPerf = 'w13',\r\n SixMonthPerf = 'w26',\r\n YearPerf = 'w52',\r\n YearToDatePerf = 'ytd',\r\n RelativeVolume = 'relvol',\r\n PriceToEarnings = 'pe',\r\n ForwardPriceToEearnings = 'fpe',\r\n PriceEarningsToGrowth = 'peg',\r\n PriceToSellsRatio = 'ps',\r\n PriceToBookRatio = 'pb',\r\n DividendYield = 'div',\r\n EPSGrowth5y = 'eps5y',\r\n FloatShort = 'short',\r\n AnalystRecommendation = 'rec',\r\n EarningsPerf = 'earnperf',\r\n EarningsDate = 'earndate',\r\n // Portfolio\r\n PortfolioGainPct = 'portfolioGainPct',\r\n PortfolioGainUsd = 'portfolioGainUsd',\r\n PortfolioChangePct = 'portfolioChangePct',\r\n PortfolioChangeUsd = 'portfolioChangeUsd',\r\n}\r\n\r\nexport enum ScaleId {\r\n DayPerf = 'default',\r\n WeekPerf = '_5',\r\n MonthPerf = '_10',\r\n ThreeMonthPerf = '_15',\r\n SixMonthPerf = '_20',\r\n YearPerf = '_25',\r\n RelativeVolume = '_relvol',\r\n PriceToEarnings = '_pe',\r\n ForwardPriceToEearnings = '_fpe',\r\n PriceEarningsToGrowth = '_peg',\r\n PriceToSellsRatio = '_ps',\r\n PriceToBookRatio = '_pb',\r\n DividendYield = '_div',\r\n EPSGrowth5y = '_eps5y',\r\n FloatShort = '_short',\r\n AnalystRecommendation = '_rec',\r\n EarningsDate = '_earndate',\r\n // Portfolio\r\n PortfolioPct = '_portfolioPct',\r\n PortfolioUsd = '_portfolioUsd',\r\n}\r\n\r\nexport const enum NodeDepth {\r\n Root,\r\n Sector,\r\n Industry,\r\n Node,\r\n}\r\n\r\nexport interface MapDataRow {\r\n name: string\r\n perf?: number\r\n x: number\r\n y: number\r\n dx: number\r\n dy: number\r\n data: any\r\n depth: NodeDepth\r\n}\r\n\r\nexport interface MapDataRoot {\r\n name: string\r\n children: MapDataSector[]\r\n duplicateTickers: number\r\n hash: string\r\n}\r\n\r\nexport interface MapDataSector extends MapDataRow {\r\n children: MapDataIndustry[]\r\n parent: MapDataRoot\r\n}\r\n\r\nexport interface MapDataIndustry extends MapDataRow {\r\n children: MapDataNode[]\r\n parent: MapDataSector\r\n}\r\n\r\nexport interface MapDataNode extends MapDataRow {\r\n parent: MapDataIndustry\r\n additional?: string\r\n description: string\r\n perfText: string\r\n value: number\r\n}\r\n\r\nexport interface MapData {\r\n sectors: MapDataSector[]\r\n industries: MapDataIndustry[]\r\n nodes: MapDataNode[]\r\n}\r\n\r\nexport type PerfData = {\r\n nodes: Record | Array\r\n additional: Record\r\n subtype: MapSubtypeId\r\n version?: number\r\n hash: string\r\n}\r\n\r\nexport interface MapSubtype {\r\n id: MapSubtypeId\r\n name: string\r\n scaleId: ScaleId\r\n tooltip: string\r\n countIndustryPerf: boolean\r\n countSectorPerf: boolean\r\n}\r\n\r\nexport interface MapType {\r\n name: string\r\n pageTitle: string\r\n nameShort?: string\r\n description: string\r\n type: MapTypeId\r\n subtypes: MapSubtype[]\r\n}\r\n\r\nexport interface Scale {\r\n name: string\r\n tooltip: ReactNode\r\n id: ScaleId\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { ScreenerQuery, ScreenerView } from '../screener/utils'\r\nimport { isMobile } from '../shared/isMobile'\r\nimport { isStockFastRefreshAvailable } from '../shared/isStockFastRefreshAvailable'\r\nimport { EXPANDED_MAP_BODY_CLASSS } from './constants/constants'\r\nimport { LEGEND_HEIGHT, MAP_MIN_HEIGHT, MAP_MIN_WIDTH } from './constants/generator'\r\nimport { Settings, SettingsSmall, SettingsSmallGeo } from './constants/settings'\r\nimport LayoutGenerator from './layout-generator'\r\nimport type Treemap from './treemap'\r\nimport {\r\n MapDataIndustry,\r\n MapDataNode,\r\n MapDataRoot,\r\n MapDataRow,\r\n MapDataSector,\r\n MapSubtypeId,\r\n MapTypeId,\r\n PerfData,\r\n} from './types'\r\n\r\nexport function getOffset(e: MouseEvent | React.MouseEvent) {\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n\r\n return {\r\n offsetX: e.clientX - rect.left,\r\n offsetY: e.clientY - rect.top,\r\n }\r\n}\r\n\r\nexport function getIsSmall() {\r\n const query = new URLSearchParams(window.location.search)\r\n return query.get('settings') === 'small'\r\n}\r\n\r\nexport function getSettingsForMapType(type: MapTypeId, isSmall?: boolean) {\r\n if (isSmall) {\r\n if (type === MapTypeId.World) {\r\n return SettingsSmallGeo\r\n }\r\n return SettingsSmall\r\n }\r\n\r\n return Settings\r\n}\r\n\r\ntype DataRow = MapDataRow | MapDataRoot\r\n/**\r\n * We strip parents when serializing data for precomputed JSONs\r\n * but we need to restore them so that we can get them in treemap\r\n */\r\nexport function restoreDataKeys(\r\n data: T[],\r\n perfData: PerfData,\r\n parent?: any\r\n): T[] {\r\n return data.map((row) => {\r\n const newRow = {\r\n ...row,\r\n parent,\r\n perf: (perfData.nodes as Record)[row.name],\r\n additional: perfData.additional[row.name],\r\n }\r\n\r\n newRow.children = row.children ? restoreDataKeys(row.children, perfData, newRow) : undefined\r\n\r\n return newRow\r\n })\r\n}\r\n\r\nexport function splitData(mapData: MapDataRoot) {\r\n let sectors: MapDataSector[] = []\r\n let industries: MapDataIndustry[] = []\r\n let nodes: MapDataNode[] = []\r\n\r\n mapData.children?.forEach((sector) => {\r\n sectors.push(sector)\r\n sector.children?.forEach((industry) => {\r\n industries.push(industry)\r\n industry.children?.forEach((company) => {\r\n if (!(company.dx < 1 || company.dy < 1)) {\r\n nodes.push(company)\r\n }\r\n })\r\n })\r\n })\r\n\r\n return { sectors, industries, nodes }\r\n}\r\n\r\nexport function getMapData(mapData: MapDataRoot, perfData: PerfData) {\r\n const [data] = restoreDataKeys([mapData], perfData)\r\n\r\n return splitData(data)\r\n}\r\n\r\nexport async function fetchBaseData(filename: string, cacheBuster: number) {\r\n // https://stackoverflow.com/questions/52635660/can-link-rel-preload-be-made-to-work-with-fetch\r\n const response = await fetch(`/maps/${filename}?rev=${cacheBuster}`, {\r\n method: 'GET',\r\n credentials: 'include',\r\n mode: 'no-cors',\r\n })\r\n\r\n return response.json()\r\n}\r\n\r\nfunction getSizeForExpandedMap(element: HTMLElement, wrapper: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n wrapper?.style.removeProperty('max-width')\r\n let size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n const elementHeight = Math.max(window.innerHeight - LEGEND_HEIGHT - 50, MAP_MIN_HEIGHT)\r\n\r\n // We don’t want the map to overflow the height\r\n if (size.height > elementHeight) {\r\n const newWidth = LayoutGenerator.calculateWidth(elementHeight, type, isSmall)\r\n size = {\r\n width: newWidth,\r\n height: LayoutGenerator.calculateHeight(newWidth, type, isSmall),\r\n }\r\n }\r\n\r\n if (wrapper) {\r\n wrapper.style.maxWidth = `${size.width}px`\r\n }\r\n\r\n return size\r\n}\r\n\r\nfunction getRatioSizeForWidth(width: number, type: MapTypeId, isSmall: boolean) {\r\n const mapWidth = Math.max(width, MAP_MIN_WIDTH)\r\n return {\r\n width: mapWidth,\r\n height: LayoutGenerator.calculateHeight(mapWidth, type, isSmall),\r\n }\r\n}\r\n\r\nfunction getSizeRatioBasedMap(element: HTMLElement, wrapper: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n // Remove maxWidth if exiting expanded mode\r\n if (wrapper?.style.maxWidth) {\r\n wrapper.style.removeProperty('max-width')\r\n }\r\n\r\n let size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n\r\n // Set height so that we know if scrollbars are visible\r\n element.style.height = `${size.height + LEGEND_HEIGHT}px`\r\n\r\n // Add a bit of padding if scrollbar is visible and map touches it\r\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\r\n const isMediumScreen =\r\n window.innerWidth > 1430 &&\r\n window.innerWidth < 1450 &&\r\n !document.body.classList.contains('is-screener') &&\r\n !document.body.classList.contains('is-portfolio')\r\n if (isMediumScreen && scrollbarWidth > 0) {\r\n size = getRatioSizeForWidth(element.clientWidth - 10, type, isSmall)\r\n\r\n // This means we would display a horizontal scrollbar, which we don’t want\r\n } else if (size.width !== element.clientWidth) {\r\n size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n }\r\n\r\n element.style.removeProperty('height')\r\n\r\n return size\r\n}\r\n\r\n/**\r\n * Calculate size of the treemap based on w/h ratio and scrollbars visibility\r\n */\r\nexport function getSize(element: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n const canvasWrapper = document.getElementById('canvas-wrapper')\r\n\r\n if (!element) {\r\n return { width: 1, height: 1 }\r\n }\r\n\r\n // Custom width using query param\r\n const query = new URLSearchParams(window.location.search)\r\n if (query.has('width')) {\r\n const width = Number(query.get('width'))\r\n const parsedRatio = query.has('ratio') ? parseFloat(query.get('ratio')!) : undefined\r\n const ratio = Number.isFinite(parsedRatio) ? parsedRatio : undefined\r\n return {\r\n width,\r\n height: LayoutGenerator.calculateHeight(width, type, isSmall, ratio),\r\n }\r\n }\r\n\r\n // Expanded map\r\n if (document.body.classList.contains(EXPANDED_MAP_BODY_CLASSS)) {\r\n return getSizeForExpandedMap(element, canvasWrapper, type, isSmall)\r\n }\r\n\r\n if (type === MapTypeId.ETFHoldings) {\r\n return { height: element.clientHeight, width: element.clientWidth }\r\n }\r\n\r\n return getSizeRatioBasedMap(element, canvasWrapper, type, isSmall)\r\n}\r\n\r\n/**\r\n * Get treemap zoom levels based on env\r\n */\r\nexport function getDefaultZoomLevels() {\r\n if (isMobile()) {\r\n return [1, 1.5]\r\n }\r\n\r\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\r\n return [1, 1.5, 2.25]\r\n }\r\n\r\n return [1, 1.5, 2.25, 3]\r\n}\r\n\r\nexport function parseInitDataAsPerf(data?: MapDataRoot): PerfData | undefined {\r\n if (!data) return\r\n\r\n const nodes: Record = {}\r\n const additional: Record = {}\r\n\r\n for (const sector of data.children) {\r\n for (const industry of sector.children) {\r\n for (const node of industry.children) {\r\n if (node.perf !== undefined) {\r\n nodes[node.name] = node.perf\r\n }\r\n if (node.additional !== undefined) {\r\n additional[node.name] = node.additional\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n nodes,\r\n additional,\r\n subtype: MapSubtypeId.DayPerf,\r\n version: 1,\r\n hash: data.hash,\r\n }\r\n}\r\n\r\nconst MAX_SPARKLINES = 120\r\nconst HOVER_TOP_ROW_HEIGHT = 100\r\nconst HOVER_BORDER_WIDTH = 4\r\nconst ROW_HEIGHT = 30\r\nconst ROW_HEIGHT_SMALL = 24\r\nconst ROW_HEIGHT_BREAKPOINT = 15\r\n\r\nexport function getVisibleTooltipTickers(node?: MapDataNode) {\r\n if (!node) return []\r\n\r\n const industryTickers = node.parent.children\r\n const isSmall = industryTickers.length > ROW_HEIGHT_BREAKPOINT\r\n const rowHeight = isSmall ? ROW_HEIGHT_SMALL : ROW_HEIGHT\r\n const visibleRows = Math.floor((window.innerHeight - HOVER_TOP_ROW_HEIGHT - 2 * HOVER_BORDER_WIDTH) / rowHeight)\r\n const visibleChildren = industryTickers\r\n .slice()\r\n .sort((a, b) => b.dx * b.dy - a.dx * a.dy)\r\n .slice(0, Math.min(visibleRows, MAX_SPARKLINES))\r\n .map((n) => n.name)\r\n\r\n return visibleChildren\r\n}\r\n\r\nexport function onNodeClick({\r\n treemap,\r\n node,\r\n industry,\r\n sector,\r\n}: {\r\n treemap: Treemap\r\n node?: MapDataNode\r\n industry?: MapDataIndustry\r\n sector?: MapDataSector\r\n}) {\r\n if (node) {\r\n window.open(`/quote.ashx?t=${node.name}`)\r\n return\r\n }\r\n\r\n const query = new URLSearchParams()\r\n query.set(ScreenerQuery.View, ScreenerView.Overview.toString())\r\n\r\n // Use ticker filter for ETFs\r\n if (treemap.type === MapTypeId.ETF) {\r\n let tickers: string[] = []\r\n if (industry) {\r\n tickers = industry.children.map((node) => node.name)\r\n } else if (sector) {\r\n tickers = sector.children.flatMap((industry) => industry.children.map((node) => node.name))\r\n }\r\n\r\n if (tickers.length) {\r\n query.set(ScreenerQuery.Tickers, tickers.join(','))\r\n window.open(`/screener.ashx?${query}`)\r\n }\r\n\r\n return\r\n }\r\n\r\n if (industry) {\r\n const id = industry.name.replace(/[^a-zA-Z]/g, '').toLowerCase()\r\n const filter = treemap.type === MapTypeId.World ? 'geo' : 'ind'\r\n\r\n query.set(ScreenerQuery.Filters, `${filter}_${id}`)\r\n window.open(`/screener.ashx?${query}`)\r\n } else if (sector) {\r\n const id = sector.name.replace(/[^a-zA-Z]/g, '').toLowerCase()\r\n\r\n query.set(ScreenerQuery.Filters, `sec_${id}`)\r\n window.open(`/screener.ashx?${query}`)\r\n }\r\n}\r\n\r\nenum MapsPollingIntervalInMs {\r\n Free = 180000,\r\n Elite = 3000,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport function getMapsRefreshInterval({\r\n base = MapsPollingIntervalInMs.Elite,\r\n reduced = MapsPollingIntervalInMs.EliteStocksReduced,\r\n free = MapsPollingIntervalInMs.Free,\r\n}: { base?: number; reduced?: number; free?: number } = {}) {\r\n const isPremium = FinvizSettings.hasUserPremium\r\n let customRefreshInterval = base\r\n if (!isPremium) {\r\n customRefreshInterval = free\r\n } else if (!isStockFastRefreshAvailable()) {\r\n customRefreshInterval = reduced\r\n }\r\n\r\n return customRefreshInterval\r\n}\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\r\nexport function rangesToFilter(\r\n ranges: {\r\n from: string\r\n to: string\r\n }[],\r\n rangeSuffixes?: string[],\r\n delimiter = 'x',\r\n rangeDelimiter = 'to'\r\n) {\r\n return ranges.reduce((filter, range, index) => {\r\n const { from, to } = range\r\n const rangeStr = from || to ? `${from}${rangeDelimiter}${to}${rangeSuffixes?.[index] ?? ''}` : ''\r\n\r\n let currentFilter = filter\r\n if (index > 0) currentFilter += delimiter\r\n return currentFilter + rangeStr\r\n }, '')\r\n}\r\n","/* eslint-disable import/first */\r\nimport { UseMutationResult } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\nimport { FacebookIcon, FacebookShareButton, TwitterIcon, TwitterShareButton } from 'react-share'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { CopyToClipboard } from '../../../main/components/copy-to-clipboard'\r\nimport {\r\n Dialog,\r\n DialogBody,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTrigger,\r\n useDialogState,\r\n} from '../../../main/components/dialog'\r\nimport { ErrorView } from '../../../main/components/error-view'\r\nimport { Loading } from '../../../main/components/loading'\r\nimport { Heading } from '../../../main/components/typography'\r\n\r\ninterface ShareResponse {\r\n imgUrl: string\r\n shareUrl: string\r\n}\r\n\r\ninterface ShareProps {\r\n state: UseMutationResult\r\n onShareClick: () => void\r\n className?: string\r\n}\r\n\r\nexport function Share(props: ShareProps) {\r\n const dialogState = useDialogState()\r\n\r\n return (\r\n <>\r\n \r\n Share map\r\n \r\n\r\n \r\n \r\n Share map\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\ninterface ShareDialogBodyProps {\r\n isError: boolean\r\n isLoading: boolean\r\n data?: ResponseType\r\n}\r\n\r\nfunction ShareDialogBody(props: ShareDialogBodyProps) {\r\n if (props.isLoading) {\r\n return (\r\n
    \r\n \r\n
    \r\n )\r\n }\r\n\r\n if (props.isError || !props.data) {\r\n return (\r\n
    \r\n \r\n There’s been an error sharing the map.\r\n
    \r\n Please try sharing the map again and if the problem persists, please contact support.\r\n \r\n }\r\n />\r\n
    \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {document.title}\r\n
    \r\n \r\n Copy and paste link in email, website, or forum\r\n \r\n }\r\n text={props.data.shareUrl}\r\n bottomLeftContent={\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 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","import logoBase64 from './assets/logo.png'\r\nimport { getTextFontFamily } from './getTextFontFamily'\r\nimport { isFirefoxDesktop } from './isMobile'\r\nimport { loadImage } from './loadImage'\r\nimport { getScaleRatio } from './retinafy'\r\n\r\nexport async function drawShareMap(canvasEl: HTMLCanvasElement, text: string[]) {\r\n const fontFamily = getTextFontFamily()\r\n\r\n const ratio = getScaleRatio()\r\n const width = canvasEl.width / ratio\r\n const height = canvasEl.height / ratio\r\n\r\n const canvas = document.createElement('canvas')\r\n const context = canvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n canvas.width = width\r\n canvas.height = height + 22\r\n\r\n // Background\r\n context.fillStyle = '#fff'\r\n context.fillRect(0, 0, width, height)\r\n\r\n // Logo\r\n const logo = await loadImage(logoBase64)\r\n context.drawImage(logo, 2, 4)\r\n\r\n // Labels\r\n const label = text.map((t) => t.toUpperCase())\r\n let x = width\r\n const y = 11\r\n\r\n context.textBaseline = 'middle'\r\n context.textAlign = 'right'\r\n context.font = '9pt ' + fontFamily\r\n for (let i = label.length - 1; i >= 0; i--) {\r\n const text = label[i]\r\n let textWidth = context.measureText(text).width\r\n\r\n context.fillStyle = '#4c5261'\r\n context.fillText(text, x, y)\r\n\r\n if (i > 0) {\r\n const divider = ' • '\r\n context.fillStyle = '#5faaf4'\r\n context.fillText(divider, x - textWidth, y)\r\n textWidth = textWidth + context.measureText(divider).width\r\n }\r\n\r\n x = x - textWidth\r\n }\r\n\r\n context.drawImage(canvasEl, 0, 0, width * ratio, height * ratio, 0, 22, width, height)\r\n\r\n return canvas.toDataURL()\r\n}\r\n","import { getDate } from '../header/utils'\r\n\r\n// Keep in sync with the original in charts repo in app/constants/common.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\n/*\r\n * Keep in sync with the original (Utils static method) in charts repo in app/utils.ts\r\n * See line 15, we use getDate instead of convertLocalToNyTime\r\n */\r\nexport function isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = getDate()\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\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\nimport { Icon } from './icon'\r\n\r\ninterface RedGreenTextProps {\r\n value?: number | null\r\n children: any\r\n rightContent?: React.ReactNode\r\n className?: string\r\n rightClass?: string\r\n}\r\n\r\n/**\r\n * Component which renders red/green text based on whether the value is positive or negative if value\r\n * is 0, it will not be colored and it will not display the guide triangle\r\n */\r\nexport function RedGreenText({ value, children, className, rightContent, rightClass }: RedGreenTextProps) {\r\n const hasValue = value && Number.isFinite(value)\r\n const showArrow = rightContent === undefined && hasValue && value !== 0\r\n\r\n return (\r\n 0,\r\n 'text-negative': hasValue && value < 0,\r\n })}\r\n >\r\n {children}\r\n \r\n {showArrow ? (\r\n 0 ? 'arrowUpShort' : 'arrowDownShort'} className=\"block\" />\r\n ) : null}\r\n {rightContent}\r\n \r\n \r\n )\r\n}\r\n\r\n/**\r\n * Used to position multiple lines of RedGreen text, this component will make sure all numbers are\r\n * in line with their `rightContent`\r\n */\r\nexport function RedGreenMultiline({ className, children, ...props }: React.PropsWithChildren) {\r\n return (\r\n
    \r\n {React.Children.map(children, (child: React.ReactElement) => {\r\n if (React.isValidElement(child) && child.type === RedGreenText) {\r\n return React.cloneElement(child, {\r\n className: classnames(child.props.className, 'table-row'),\r\n rightClass: 'table-cell align-middle',\r\n })\r\n }\r\n\r\n return child\r\n })}\r\n
    \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport const Table = React.forwardRef(\r\n (props: React.PropsWithChildren>, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableHead(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n\r\ninterface TableBodyProps extends React.HTMLProps {\r\n spacing?: 'regular' | 'large' | 'none'\r\n}\r\n\r\nexport const TableBody = React.forwardRef(\r\n (\r\n { spacing = 'none', ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n ) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableFooter(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","export enum TableAlign {\r\n Left,\r\n Center,\r\n Right,\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign } from './types'\r\n\r\nexport interface TableCellProps extends React.HTMLProps {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n hasLeading?: boolean\r\n}\r\n\r\nexport function TableCell({\r\n isFirst,\r\n isLast,\r\n align = TableAlign.Left,\r\n hasPadding = true,\r\n hasLeading = true,\r\n className,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { TableAlign } from './types'\r\n\r\nconst TABLE_HEADER_DEFAULT_ELEMENT = 'th'\r\n\r\ninterface SortProps {\r\n isActive: boolean\r\n direction: 1 | -1\r\n}\r\n\r\nfunction TableSortIndicator({ isActive, direction, className }: Partial & { className?: string }) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ninterface TableHeaderProps extends Omit, 'as'> {\r\n isActive?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n hasHover?: boolean\r\n}\r\n\r\nexport function TableHeader({\r\n as: asComponent,\r\n align,\r\n children,\r\n isActive,\r\n hasPadding = true,\r\n hasHover,\r\n ...props\r\n}: Omit, 'align'> & TableHeaderProps) {\r\n const componentToRender = asComponent ?? TABLE_HEADER_DEFAULT_ELEMENT\r\n\r\n return React.createElement(\r\n componentToRender,\r\n {\r\n ...props,\r\n className: classnames(\r\n props.className,\r\n 'whitespace-nowrap font-normal h-5 hover:first:rounded-l-md hover:last:rounded-r-md',\r\n {\r\n 'cursor-pointer hover:select-none hover:bg-gray-200/30 dark:hover:bg-gray-500/30':\r\n hasHover && !props.disabled,\r\n 'text-gray-500 dark:text-gray-300': props.disabled,\r\n 'text-gray-600 dark:text-gray-200': !isActive && !props.disabled,\r\n 'font-medium text-gray-800 dark:text-gray-50': isActive,\r\n 'text-left': align === TableAlign.Left,\r\n 'text-center': align === TableAlign.Center,\r\n 'text-right': align === TableAlign.Right,\r\n 'px-1': hasPadding,\r\n 'p-0': !hasPadding,\r\n }\r\n ),\r\n },\r\n children\r\n )\r\n}\r\n\r\nexport function TableHeaderSortable({\r\n direction,\r\n ...props\r\n}: Omit, 'align'> & Partial & TableHeaderProps) {\r\n const isDisabled = props.disabled === true\r\n\r\n return (\r\n \r\n \r\n {props.align === TableAlign.Right && (\r\n \r\n )}\r\n {props.children}\r\n {props.align !== TableAlign.Right && (\r\n \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\ninterface TableRowProps extends React.PropsWithChildren> {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n isHoverable?: boolean\r\n}\r\n\r\nexport const TableRow = React.forwardRef(\r\n ({ isFirst, isLast, isHoverable = true, ...props }: TableRowProps, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape, isSortByShape, useSortData } from '../../hooks/use-sort-data'\r\nimport { SortableValue } from '../../types'\r\nimport { SortByColumnOptions } from '../../util'\r\n\r\nexport enum SortDirection {\r\n Ascending = 1,\r\n Descending = -1,\r\n}\r\n\r\nexport interface TableSort {\r\n column: ColumnType\r\n direction: SortDirection\r\n}\r\n\r\n/**\r\n * Default sort getter which either gets column matching by `defaultSortId` or returns the first column\r\n */\r\nexport function getDefaultSort(\r\n columns: ColumnType[],\r\n defaultSort?: DefaultSort\r\n): TableSort {\r\n if (defaultSort === null) return { column: null as ColumnType, direction: SortDirection.Ascending }\r\n if (defaultSort && typeof defaultSort === 'object') return defaultSort as unknown as TableSort\r\n\r\n const foundColumn = columns.find((column) => isSortByShape(column) && column.id === defaultSort)\r\n\r\n return {\r\n column: foundColumn ?? (defaultSort as unknown as ColumnType | undefined) ?? columns[0],\r\n direction: SortDirection.Ascending,\r\n }\r\n}\r\n\r\n/**\r\n * Get default sorting from url when persisting sort\r\n */\r\nexport function getDefaultSortFromUrl, OrderType extends string | null>(\r\n columns: ColumnType[],\r\n order?: OrderType,\r\n idKey: keyof ColumnType = 'id'\r\n): TableSort {\r\n if (order === null) return { column: null as unknown as ColumnType, direction: SortDirection.Ascending }\r\n\r\n const isDesc = order?.startsWith('-')\r\n const queryParam = isDesc ? order?.substring(1) : order\r\n const column = columns.find((column) => column[idKey] === queryParam)\r\n\r\n if (column) {\r\n return { column, direction: isDesc ? SortDirection.Descending : SortDirection.Ascending }\r\n } else {\r\n return { column: columns[0], direction: SortDirection.Ascending }\r\n }\r\n}\r\n\r\nexport function saveSortToUrl>(\r\n prev: URLSearchParams,\r\n urlPersistKey: string,\r\n newSort: ColumnType | null,\r\n idKey: keyof ColumnType = 'id',\r\n defaultSort: unknown = null\r\n) {\r\n const newParams = new URLSearchParams(prev)\r\n const previousOrder = newParams.get(urlPersistKey) ?? defaultSort\r\n const isDescOrder = previousOrder?.toString().startsWith('-')\r\n\r\n if (newSort === null) {\r\n newParams.delete(urlPersistKey)\r\n } else {\r\n newParams.set(urlPersistKey, `${!isDescOrder && previousOrder === newSort[idKey] ? '-' : ''}${newSort[idKey]}`)\r\n }\r\n\r\n return newParams\r\n}\r\n\r\ninterface UseTableSortProps<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n> {\r\n data: DataType[]\r\n columns: ColumnType[]\r\n\r\n /**\r\n * You can either provide id of the column or whole shape\r\n * defaultSort: { column: columns[0], direction: -1 }\r\n * If your ids are constants (or enums), you will get name suggestions\r\n */\r\n defaultSort?: DefaultSort\r\n\r\n /**\r\n * Custom value getter. By default these can be defined on every column using `getValueForSort`\r\n */\r\n valueGetter?: (column: ColumnType) => (row: DataType) => SortableValue\r\n\r\n /**\r\n * Additional options for sorting, including ignoring null values or sorting null as last\r\n */\r\n options?: SortByColumnOptions\r\n}\r\n\r\n/**\r\n * This hook has multiple\r\n */\r\nexport function useTableSort<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n SortType extends DefaultSort extends null ? ColumnType | null : ColumnType,\r\n>({ data, columns, defaultSort, valueGetter, options }: UseTableSortProps) {\r\n const [sort, setSort] = React.useState(getDefaultSort(columns, defaultSort) as TableSort)\r\n\r\n const changeSort = React.useCallback((newSort: SortType, direction?: SortDirection) => {\r\n setSort((prevSort) => {\r\n if (newSort && direction) {\r\n return { column: newSort, direction }\r\n }\r\n\r\n if (newSort && prevSort.column?.id === newSort.id) {\r\n return { ...prevSort, direction: prevSort.direction * -1 }\r\n }\r\n\r\n return { column: newSort, direction: SortDirection.Ascending }\r\n })\r\n }, [])\r\n\r\n const sortedData = useSortData({ data, direction: sort.direction, sortBy: sort.column, valueGetter, options })\r\n\r\n return {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n }\r\n}\r\n\r\ninterface UseTableSortWithUrlProps<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n> extends UseTableSortProps {\r\n /**\r\n * When set, the sorting will be persisted in the URL. Loading the\r\n *\r\n * @default undefined\r\n */\r\n urlPersistKey?: string\r\n\r\n /**\r\n * Key to get value of the URL sort from a column\r\n * @deafult \"id\"\r\n */\r\n idKey?: keyof ColumnType\r\n}\r\n\r\nexport function useTableSortWithUrl<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n SortType extends DefaultSort extends null ? ColumnType | null : ColumnType,\r\n>({\r\n data,\r\n columns,\r\n defaultSort,\r\n valueGetter,\r\n urlPersistKey,\r\n idKey = 'id',\r\n options,\r\n}: UseTableSortWithUrlProps) {\r\n const {\r\n data: sortedData,\r\n changeSort: changeSortState,\r\n sort,\r\n } = useTableSort({ data, columns, defaultSort, valueGetter, options })\r\n const [searchParams, setSearchParams] = useSearchParams()\r\n const defaultSortRef = React.useRef(\r\n urlPersistKey && typeof defaultSort === 'string'\r\n ? getDefaultSortFromUrl(columns, searchParams.get(urlPersistKey) ?? defaultSort, idKey)\r\n : getDefaultSort(columns, defaultSort)\r\n )\r\n\r\n const changeSort = React.useCallback(\r\n (newSort: SortType) => {\r\n if (urlPersistKey) {\r\n const defaultSort: ColumnType | null = defaultSortRef.current.column\r\n setSearchParams(\r\n (prev) =>\r\n saveSortToUrl(prev, urlPersistKey, newSort, idKey, defaultSort === null ? null : defaultSort[idKey]),\r\n {\r\n preventScrollReset: true,\r\n }\r\n )\r\n }\r\n\r\n changeSortState(newSort)\r\n },\r\n [idKey, setSearchParams, urlPersistKey, changeSortState]\r\n )\r\n\r\n /**\r\n * Update sort from url\r\n */\r\n React.useEffect(() => {\r\n if (!urlPersistKey) return\r\n\r\n const newSort = searchParams.get(urlPersistKey)\r\n if (newSort) {\r\n const sort = getDefaultSortFromUrl(columns, newSort, idKey)\r\n changeSortState(sort.column, sort.direction)\r\n }\r\n }, [columns, idKey, searchParams, urlPersistKey, changeSortState])\r\n\r\n return {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n }\r\n}\r\n","import * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\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","import { link } from '../services/routing'\r\nimport { Delayed, DelayedProps } from './delayed'\r\nimport { ErrorView } from './error-view'\r\nimport { Spinner } from './spinner'\r\n\r\ntype LoadingProps = Pick\r\n\r\nexport function Loading({ delay, timeout, throwOnTimeout }: LoadingProps) {\r\n return (\r\n \r\n There’s been an error loading the application.\r\n
    \r\n Please make sure your internet connection is stable and refresh the page. If the error persists, please{' '}\r\n \r\n contact support\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\nexport function LoadingScreen(props: LoadingProps) {\r\n return (\r\n
    \r\n \r\n
    \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position?: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Dialog, useDialogState } from 'reakit/Dialog'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const state = useDialogState({ modal: false, animated: COMPONENT_ANIMATION_DURATION })\r\n const [notification, setNotification] = React.useState(null)\r\n const { isFullyClosed, isFullyOpened } = getExtendedDialogState(state)\r\n const { viewport, setViewport } = useVisualViewport({ enabled: !!notification })\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getVisualViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n state.show()\r\n },\r\n hide: state.hide,\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n {notification?.element}\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\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n /**\r\n * Default button text\r\n * @default Close\r\n */\r\n closeText?: string\r\n\r\n /**\r\n * Custom buttons. Overrides `closeText`\r\n */\r\n actions?: JSX.Element\r\n\r\n /**\r\n * When set, the notification will automatically close\r\n */\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification({\r\n className,\r\n closeText = 'Close',\r\n actions,\r\n timeoutInMs,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: NodeJS.Timeout\r\n if (timeoutInMs) {\r\n timeoutId = setTimeout(() => {\r\n notification.hide()\r\n }, timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, timeoutInMs])\r\n\r\n return (\r\n \r\n
    {children}
    \r\n
    \r\n {actions ?? (\r\n \r\n )}\r\n
    \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SortDirectionValue, SortableValue } from '../types'\r\nimport { SortByColumnOptions, sortByColumn } from '../util'\r\n\r\nexport interface SortByShape {\r\n id: IdType\r\n\r\n /**\r\n * Provide value calculation for sort when value is computed in column renderer\r\n */\r\n getValueForSort?: (row: DataType) => SortableValue\r\n}\r\n\r\nexport function isSortByShape(sortBy?: unknown): sortBy is SortByShape {\r\n return sortBy?.hasOwnProperty?.('id') === true\r\n}\r\n\r\n/**\r\n * Default value getter which gets row data by `getValueForSort` defined on the column\r\n * If no sort value getter is provided, it falls back to getting data by column.id or returns the whole row\r\n */\r\nexport function getDefaultValueGetter(column: SortBy) {\r\n return (row: DataType): SortableValue => {\r\n let value = null\r\n\r\n if (isSortByShape(column)) {\r\n if (typeof column.getValueForSort === 'function') value = column.getValueForSort(row)\r\n else if (typeof row === 'object') value = row?.[column.id as keyof typeof row]\r\n } else {\r\n value = row\r\n }\r\n\r\n return (value as SortableValue) ?? null\r\n }\r\n}\r\n\r\nexport function useSortData({\r\n data,\r\n sortBy,\r\n direction,\r\n valueGetter = getDefaultValueGetter,\r\n options,\r\n}: {\r\n data: DataType[]\r\n sortBy?: SortBy | null\r\n direction: SortDirectionValue\r\n valueGetter?: (sortBy: SortBy) => (row: DataType) => SortableValue\r\n options?: SortByColumnOptions\r\n}) {\r\n return React.useMemo(() => {\r\n if (!sortBy) return [...data]\r\n\r\n return [...data].sort((a, b) =>\r\n sortByColumn({\r\n ...options,\r\n a,\r\n b,\r\n direction,\r\n valueGetter: valueGetter(sortBy),\r\n })\r\n )\r\n }, [data, options, direction, valueGetter, sortBy])\r\n}\r\n","import classNames from 'classnames'\r\nimport * as dateFns from 'date-fns'\r\n\r\nimport { RedGreenMultiline, RedGreenText } from '../../../components/RedGreenText'\r\nimport { TableAlign } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, PortfolioSymbolType, PortfolioTransaction, RowKind, TableColumnDefinition } from '../types'\r\nimport { PORTFOLIO_DATE_FORMAT_VIEW, TRANSACTION_LABEL } from './general'\r\n\r\nexport const columnMap: Record = Object.freeze({\r\n [ColumnId.Spacer]: {\r\n id: ColumnId.Spacer,\r\n urlSort: '',\r\n name: '',\r\n renderColumn: () => null,\r\n },\r\n [ColumnId.Ticker]: {\r\n id: ColumnId.Ticker,\r\n urlSort: 'ticker',\r\n name: 'Ticker',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Group:\r\n case RowKind.Trade:\r\n if (args.row.type === PortfolioSymbolType.Stock && !args.row.isDelisted) {\r\n return (\r\n ev.stopPropagation()}\r\n >\r\n {args.row.ticker}\r\n \r\n )\r\n }\r\n\r\n return {args.row.ticker}\r\n default:\r\n return {args.row.ticker}\r\n }\r\n },\r\n },\r\n [ColumnId.Company]: {\r\n id: ColumnId.Company,\r\n urlSort: 'company',\r\n name: 'Company',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return null\r\n case RowKind.Summary:\r\n return (\r\n \r\n Summary:{' '}\r\n \r\n {args.row.tickers} Ticker{args.row.tickers === 1 ? '' : 's'}\r\n \r\n / \r\n \r\n {args.row.transactions} Transaction{args.row.transactions === 1 ? '' : 's'}\r\n \r\n \r\n )\r\n default:\r\n return
    {args.row.company}
    \r\n }\r\n },\r\n },\r\n [ColumnId.CostAvg]: {\r\n id: ColumnId.CostAvg,\r\n urlSort: 'costavg',\r\n name: 'Avg. Cost',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Trade: {\r\n if (args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.costAvg)\r\n }\r\n default:\r\n return formatNumber(args.row.costAvg)\r\n }\r\n },\r\n },\r\n [ColumnId.LastClose]: {\r\n id: ColumnId.LastClose,\r\n urlSort: 'price',\r\n name: 'Price',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n default:\r\n return formatNumber(args.row.lastClose)\r\n }\r\n },\r\n },\r\n [ColumnId.LastChange]: {\r\n id: ColumnId.LastChange,\r\n urlSort: 'lastchange',\r\n name: 'Change $',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => (args.kind === RowKind.Group ? args.row.lastClose - args.row.prevClose : null),\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n default:\r\n if (args.row.isDelisted) return '-'\r\n\r\n const lastChange = args.row.lastClose - args.row.prevClose\r\n return (\r\n \r\n {formatNumber(lastChange, {\r\n showPlusSign: true,\r\n fractions: args.row.lastClose < 1 ? 4 : 2,\r\n })}\r\n \r\n )\r\n }\r\n },\r\n },\r\n [ColumnId.LastChangePct]: {\r\n id: ColumnId.LastChangePct,\r\n urlSort: 'changepct',\r\n name: 'Change %',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return null\r\n default:\r\n return (\r\n \r\n {formatNumber(args.row.lastChangePct, { showPlusSign: true })}\r\n \r\n )\r\n }\r\n },\r\n },\r\n [ColumnId.LastVolume]: {\r\n id: ColumnId.LastVolume,\r\n urlSort: 'volume',\r\n name: 'Volume',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Group:\r\n case RowKind.Trade:\r\n return formatNumber(args.row.lastVolume, { fractions: 0 })\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Transaction]: {\r\n id: ColumnId.Transaction,\r\n urlSort: 'transaction',\r\n name: 'Transaction',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return TRANSACTION_LABEL[args.row.transaction]\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Date]: {\r\n id: ColumnId.Date,\r\n urlSort: 'date',\r\n name: 'Date',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return (\r\n \r\n {dateFns.format(new Date(args.row.date), PORTFOLIO_DATE_FORMAT_VIEW)}\r\n \r\n )\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Shares]: {\r\n id: ColumnId.Shares,\r\n urlSort: 'shares',\r\n name: 'Shares',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Trade: {\r\n if (args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.shares, { fractions: 0 })\r\n }\r\n default:\r\n return formatNumber(args.row.shares, { fractions: 0 })\r\n }\r\n },\r\n },\r\n [ColumnId.Price]: {\r\n id: ColumnId.Price,\r\n urlSort: 'cost',\r\n name: 'Cost / Share',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return formatNumber(args.row.price)\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.ValuePaid]: {\r\n id: ColumnId.ValuePaid,\r\n urlSort: 'totalcost',\r\n name: 'Total Cost',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.valuePaid)\r\n },\r\n },\r\n [ColumnId.Amount]: {\r\n id: ColumnId.Amount,\r\n urlSort: 'amount',\r\n name: 'Amount',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.valuePaid,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Trade && args.kind !== RowKind.Transaction) return null\r\n return formatNumber(args.row.price)\r\n },\r\n },\r\n [ColumnId.ValueMarket]: {\r\n id: ColumnId.ValueMarket,\r\n urlSort: 'marketvalue',\r\n name: 'Market Value',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.valueMarket)\r\n },\r\n },\r\n [ColumnId.GainMarketUsd]: {\r\n id: ColumnId.GainMarketUsd,\r\n urlSort: 'gainusd',\r\n name: 'Total Gain $',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainMarketUsd)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainMarketPct]: {\r\n id: ColumnId.GainMarketPct,\r\n urlSort: 'gainpct',\r\n name: 'Total Gain %',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainMarketPct)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainMarketCombined]: {\r\n id: ColumnId.GainMarketCombined,\r\n urlSort: 'gainmarket',\r\n name: 'Total Gain',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.gainMarketPct,\r\n renderColumn: (args) => (\r\n \r\n {formatNumber(args.row.gainMarketUsd)}\r\n \r\n {formatNumber(args.row.gainMarketPct)}\r\n \r\n \r\n ),\r\n },\r\n [ColumnId.GainTodayUsd]: {\r\n id: ColumnId.GainTodayUsd,\r\n urlSort: 'changeusd',\r\n name: 'Today’s Gain $',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainTodayUsd)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainTodayCombined]: {\r\n id: ColumnId.GainTodayCombined,\r\n urlSort: 'gaintoday',\r\n name: 'Today’s Gain',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.lastChangePct,\r\n renderColumn: (args) => (\r\n \r\n {formatNumber(args.row.gainTodayUsd)}\r\n \r\n {formatNumber(args.row.lastChangePct)}\r\n \r\n \r\n ),\r\n },\r\n [ColumnId.Order]: {\r\n id: ColumnId.Order,\r\n urlSort: 'order',\r\n name: 'Order',\r\n align: TableAlign.Right,\r\n renderColumn: () => null,\r\n },\r\n})\r\n\r\nexport const columns = Object.values(columnMap)\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { PortfolioEntryTransaction, PortfolioSymbolType, PortfolioTransaction } from '../types'\r\n\r\nexport const PORTFOLIO_CASH_SYMBOL = '$CASH'\r\n\r\nexport const PORTFOLIO_DATE_FORMAT_VIEW = 'MM-dd-yyyy'\r\nexport const PORTFOLIO_DATE_FORMAT_DATA = \"yyyy-MM-dd'T00:00:00'\"\r\n\r\nexport const PORTFOLIO_REFRESH_INTERVAL_ELITE = 20 * 1000\r\nexport const PORTFOLIO_REFRESH_INTERVAL_FREE = 60 * 1000\r\n\r\nexport const TRANSACTION_LABEL: Record = {\r\n [PortfolioTransaction.Watch]: 'Watch',\r\n\r\n // Stock transactions\r\n [PortfolioTransaction.Buy]: 'Buy',\r\n [PortfolioTransaction.Short]: 'Short Sell',\r\n\r\n // Cash transactions\r\n [PortfolioTransaction.CashDeposit]: 'Cash Deposit',\r\n [PortfolioTransaction.CashWithdraw]: 'Cash Withdraw',\r\n [PortfolioTransaction.CashIncome]: 'Income',\r\n [PortfolioTransaction.CashFee]: 'Fee',\r\n}\r\n\r\nexport const STOCK_TRANSACTIONS = [PortfolioTransaction.Buy, PortfolioTransaction.Short]\r\n\r\nexport const CASH_TRANSACTIONS = [\r\n PortfolioTransaction.CashDeposit,\r\n PortfolioTransaction.CashWithdraw,\r\n PortfolioTransaction.CashIncome,\r\n PortfolioTransaction.CashFee,\r\n]\r\n\r\nexport const EMPTY_FORM_ENTRY = {\r\n ticker: '',\r\n date: `${dateFns.format(new Date(), PORTFOLIO_DATE_FORMAT_DATA)}`,\r\n shares: undefined,\r\n price: undefined,\r\n transaction: PortfolioTransaction.Buy,\r\n}\r\n\r\nexport const EMPTY_TRANSACTION: Omit = {\r\n ...EMPTY_FORM_ENTRY,\r\n shares: 0,\r\n price: 0,\r\n type: PortfolioSymbolType.Stock,\r\n valuePaid: null,\r\n valueMarket: null,\r\n valueMarketPrev: null,\r\n gainMarket: null,\r\n gainMarketPct: null,\r\n gainMarketUsd: null,\r\n gainTodayUsd: null,\r\n lastChangePct: null,\r\n}\r\n\r\nexport const PORTFOLIO_INPUT_NAME = 'portfolio_name'\r\nexport const PORTFOLIO_INPUT_EMPTY_ERROR = 'Please enter portfolio name.'\r\nexport const PORTFOLIO_INPUT_EXISTS_ERROR = 'Portfolio with that name already exists.'\r\nexport const TICKERS_INPUT_NAME = 'tickers'\r\nexport const TICKERS_INPUT_FORMAT_TIP = 'Separate multiple tickers by a comma, e.g.: AAPL, MSFT, GOOG.'\r\n","import { getSanitizedTicker } from '../../../../app/shared/ticker-sanitizer'\r\nimport { ContentType, apiRequest } from '../../../services/api'\r\nimport { PORTFOLIO_CASH_SYMBOL } from '../constants/general'\r\nimport {\r\n PortfolioDefinition,\r\n PortfolioEntryBase,\r\n PortfolioFormGroup,\r\n PortfolioInitData,\r\n PortfolioSymbolType,\r\n PortfolioTransaction,\r\n PortfolioTransactionWatch,\r\n} from '../types'\r\nimport { getSymbolType } from '../utils'\r\n\r\nexport const EMPTY_RESPONSE: PortfolioInitData = {\r\n limit: 0,\r\n selectedPortfolio: 0,\r\n limitTransactions: 0,\r\n portfolio: [],\r\n news: [],\r\n portfolios: [],\r\n}\r\n\r\nexport function portfolioData(portfolioId?: string | number | null) {\r\n return apiRequest('/api/portfolio_data.ashx', { query: { pid: portfolioId ?? '' } })\r\n}\r\n\r\nexport function deletePortfolio(portfolioId?: string | number) {\r\n return apiRequest('/request_portfolio_delete.ashx', { query: { pid: portfolioId } })\r\n}\r\n\r\nexport function portfolioEntry(\r\n query?: Record,\r\n method?: string,\r\n body?: Omit, 'type'>\r\n) {\r\n return apiRequest(\r\n '/api/portfolio_entry.ashx',\r\n {\r\n query,\r\n method,\r\n body: JSON.stringify(body),\r\n },\r\n true\r\n )\r\n}\r\n\r\nexport const QUOTE_INVALID_TICKER_REQUEST = '_UNKNOWN'\r\nexport const QUOTE_INVALID_TICKER_RESPONSE = 'NA'\r\nexport const QUOTE_TICKER_DELIMITER = ','\r\n\r\nexport function quoteData(tickers: string[]) {\r\n return apiRequest('request_quote.ashx', {\r\n query: { t: tickers.filter((ticker) => ticker.length).join(',') },\r\n headers: { 'Content-Type': ContentType.Html },\r\n })\r\n}\r\n\r\nexport async function validateTickers(tickers: string[]) {\r\n const response = await apiRequest<{ tickers: string; specialSymbols: Record }>(\r\n '/portfolio_tickers.ashx',\r\n {\r\n query: { json: true },\r\n },\r\n true\r\n )\r\n\r\n const parsedTickers = response?.tickers.split('|') ?? []\r\n const specialTickers = Object.keys(response?.specialSymbols ?? [])\r\n\r\n return tickers.map((ticker) => [...specialTickers, ...parsedTickers].includes(ticker))\r\n}\r\n\r\nexport async function recalculatePortfolio(\r\n rows: PortfolioFormGroup[],\r\n totalValue = 100000.0\r\n): Promise {\r\n const tickers: string[] = []\r\n let numberOfTransactions = 0\r\n\r\n rows.forEach((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim(), false, [PORTFOLIO_CASH_SYMBOL])\r\n\r\n if (getSymbolType(ticker) === PortfolioSymbolType.Stock) numberOfTransactions += row.transactions.length\r\n tickers.push(ticker.length ? ticker : QUOTE_INVALID_TICKER_REQUEST)\r\n })\r\n\r\n const pricePerColumn = totalValue / numberOfTransactions\r\n\r\n const response = await quoteData(tickers)\r\n const prices = response?.split(QUOTE_TICKER_DELIMITER)\r\n\r\n if (prices?.length !== tickers.length) {\r\n window.Sentry?.captureMessage('Invalid recalculated data', {\r\n extra: {\r\n requestTickers: tickers,\r\n requestTickersLength: tickers.length,\r\n responseLength: prices?.length,\r\n },\r\n })\r\n\r\n return []\r\n }\r\n\r\n const tickerPrices = Object.fromEntries(\r\n prices.map((price, index) => {\r\n const tickerPrice = price === QUOTE_INVALID_TICKER_RESPONSE ? NaN : parseFloat(price)\r\n\r\n return [tickers[index], isNaN(tickerPrice) ? NaN : tickerPrice]\r\n })\r\n )\r\n\r\n return rows.map((row) => ({\r\n id: row.id,\r\n ticker: row.ticker,\r\n transactions: row.transactions.map((transaction) => {\r\n const price = tickerPrices[row.ticker]\r\n const shares = Math.round((pricePerColumn / price) * 10000) / 10000\r\n\r\n const calculatedPrice = isNaN(price) ? transaction.price : price\r\n const calculatedShares = isNaN(shares) ? transaction.shares : shares\r\n\r\n return {\r\n ...transaction,\r\n transaction:\r\n transaction.transaction === PortfolioTransaction.Watch ? PortfolioTransaction.Buy : transaction.transaction,\r\n price: transaction.type === PortfolioSymbolType.Cash ? 0 : calculatedPrice,\r\n shares: transaction.type === PortfolioSymbolType.Cash ? 0 : calculatedShares,\r\n }\r\n }),\r\n }))\r\n}\r\n\r\nexport function submitForm(data: URLSearchParams) {\r\n return apiRequest('/portfolio_submit.ashx', {\r\n method: 'POST',\r\n body: data.toString(),\r\n headers: { 'Content-Type': ContentType.FormUrlEncoded },\r\n })\r\n}\r\n\r\nexport type TickersApiResponse = {\r\n portfolioId: number\r\n message?: string\r\n portfolioEntries: Record>\r\n}\r\n\r\nexport enum ErrorSource {\r\n Portfolio,\r\n Tickers,\r\n}\r\n\r\nexport type TickersApiErrorResponse = {\r\n source: ErrorSource\r\n message: string\r\n isNotification?: boolean\r\n}\r\n\r\nexport function portfolioTickers({\r\n tickers,\r\n portfolioName,\r\n portfolioId,\r\n}: {\r\n tickers: string\r\n portfolioName?: string\r\n portfolioId?: number\r\n}) {\r\n const query = Object.assign(\r\n { tickers },\r\n typeof portfolioName !== 'undefined' && { portfolio_name: portfolioName },\r\n typeof portfolioId !== 'undefined' && { pid: portfolioId }\r\n )\r\n\r\n return apiRequest(\r\n '/api/portfolio_tickers.ashx',\r\n {\r\n method: 'POST',\r\n query,\r\n },\r\n true\r\n )\r\n}\r\n\r\nexport function submitEditForm(data: string | URLSearchParams) {\r\n return apiRequest('/portfolio_submit.ashx', {\r\n method: 'POST',\r\n body: data.toString(),\r\n headers: { 'Content-Type': ContentType.FormUrlEncoded },\r\n })\r\n}\r\n\r\nexport function reorderPortfolios(body: PortfolioDefinition[]) {\r\n return apiRequest('/api/portfolio_reorder.ashx', {\r\n method: 'PUT',\r\n body: JSON.stringify(body),\r\n })\r\n}\r\n","import { TableAlign } from '../../components/Table'\r\nimport { SortByShape } from '../../hooks/use-sort-data'\r\nimport { NullableNumbers } from '../../types'\r\n\r\nexport enum PortfolioQuery {\r\n View = 'v',\r\n TableView = 'tv',\r\n PortfolioId = 'pid',\r\n Order = 'o',\r\n Tickers = 't',\r\n Map = 'map',\r\n Size = 'mapSize',\r\n Subtype = 'subtype',\r\n Group = 'group',\r\n}\r\n\r\nexport enum PortfolioMapSizeKey {\r\n MarketValue = 'market',\r\n Gain = 'gain',\r\n}\r\n\r\nexport enum PortfolioView {\r\n View = '1',\r\n Edit = '2',\r\n}\r\n\r\nexport enum PortfolioTableView {\r\n Ticker = '1',\r\n Trade = '2',\r\n}\r\n\r\nexport const PortfolioTableViewLabels = {\r\n [PortfolioTableView.Ticker]: 'Tickers',\r\n [PortfolioTableView.Trade]: 'Trades',\r\n}\r\n\r\nexport enum PortfolioSymbolType {\r\n Stock = 'stock',\r\n Cash = 'cash',\r\n}\r\n\r\nexport enum PortfolioTransaction {\r\n Watch = 0,\r\n\r\n // Stock transactions\r\n Buy = 1,\r\n Short = 2,\r\n\r\n // Cash transactions\r\n CashDeposit = 200,\r\n CashWithdraw = 201,\r\n CashIncome = 202,\r\n CashFee = 203,\r\n}\r\n\r\nexport enum NumberOfShares {\r\n None = 0,\r\n /**\r\n * The usage of this is technically incorrect. The value for `PositiveNumber` is 1.\r\n * But we don’t care in this context, because we only want to differentiate betwen zero/non-zero values,\r\n * which helps us get correct types.\r\n *\r\n * # Don’t compare `entry.shares === NumberOfShares.PositiveNumber`\r\n */\r\n PositiveNumber = 1,\r\n}\r\n\r\nexport interface PortfolioEntryBase {\r\n id: number\r\n ticker: string\r\n date: string\r\n transaction: PortfolioTransaction\r\n shares: number\r\n price: number\r\n type: PortfolioSymbolType\r\n}\r\n\r\n/**\r\n * Base type which lists all common properties\r\n */\r\nexport interface PortfolioEntryComputed {\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketPrev: number\r\n gainMarket: number\r\n gainMarketPct: number\r\n gainMarketUsd: number\r\n gainTodayUsd: number\r\n lastChangePct: number\r\n}\r\n\r\n/**\r\n * Transaction with > 0 shares\r\n */\r\nexport interface PortfolioTransactionStake extends PortfolioEntryBase, PortfolioEntryComputed {\r\n shares: NumberOfShares.PositiveNumber\r\n}\r\n\r\n/**\r\n * Transaction with 0 shares\r\n */\r\nexport interface PortfolioTransactionWatch\r\n extends Omit,\r\n NullableNumbers {\r\n shares: NumberOfShares.None\r\n transaction: PortfolioTransaction\r\n}\r\n\r\nexport type PortfolioEntryTransaction = PortfolioTransactionStake | PortfolioTransactionWatch\r\n\r\nexport type PortfolioActionType = PortfolioEntryTransaction & { isNotification?: boolean; message?: string }\r\n\r\n/**\r\n * Top level portfolio entry\r\n */\r\nexport interface PortfolioGroup extends PortfolioEntryComputed {\r\n ticker: string\r\n shares: number\r\n industry: string\r\n country: string\r\n company: string\r\n marketCap: number\r\n prevClose: number\r\n lastClose: number\r\n lastVolume: number\r\n perfWeek: number\r\n costAvg: number\r\n transactions: PortfolioEntryTransaction[]\r\n order: number\r\n id: number\r\n date: string\r\n type: PortfolioSymbolType\r\n isDelisted?: true\r\n}\r\n\r\nexport type PortfolioTrade = Omit & PortfolioEntryTransaction\r\n\r\nexport type PortfolioMapEntry = Omit & PortfolioTransactionStake\r\n\r\n/**\r\n * Summary row for the whole portfolio\r\n */\r\nexport interface PortfolioSummary {\r\n tickers: number\r\n transactions: number\r\n shares: number\r\n lastChangePct: number\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketStocks: number\r\n valueMarketStocksPrev: number\r\n gainMarketUsd: number\r\n gainMarketPct: number\r\n gainTodayUsd: number\r\n}\r\n\r\nexport interface PortfolioDefinition {\r\n id: number\r\n name: string\r\n order: number\r\n}\r\n\r\nexport interface PortfolioInitData {\r\n limit: number\r\n limitTransactions: number\r\n selectedPortfolio: number\r\n portfolios: PortfolioDefinition[]\r\n portfolio: PortfolioGroup[]\r\n news: string[]\r\n version?: number\r\n}\r\n\r\nexport interface PortfolioFormEntry\r\n extends Pick,\r\n Partial> {\r\n uuid: string\r\n}\r\n\r\nexport interface PortfolioFormGroup extends Pick {\r\n id: string\r\n transactions: PortfolioFormEntry[]\r\n}\r\n\r\nexport enum ColumnId {\r\n Spacer = 'spacer',\r\n Ticker = 'ticker',\r\n Company = 'company',\r\n LastClose = 'lastClose',\r\n CostAvg = 'costAvg',\r\n LastChange = 'lastChange',\r\n LastChangePct = 'lastChangePct',\r\n LastVolume = 'lastVolume',\r\n Transaction = 'transaction',\r\n Date = 'date',\r\n Shares = 'shares',\r\n Price = 'price',\r\n ValuePaid = 'valuePaid',\r\n Amount = 'amount',\r\n ValueMarket = 'valueMarket',\r\n GainMarketUsd = 'gainMarketUsd',\r\n GainMarketPct = 'gainMarketPct',\r\n GainMarketCombined = 'gainMarketCombined',\r\n GainTodayUsd = 'gainTodayUsd',\r\n GainTodayCombined = 'gainTodayCombined',\r\n Order = 'order',\r\n}\r\n\r\nexport enum RowKind {\r\n Group, // A group of transactions\r\n Transaction, // A transaction made inside ticker\r\n Summary, // Portfolio summary\r\n Watchlist, // Charts portfolio watchlist table\r\n Trade,\r\n}\r\n\r\ninterface GroupProps {\r\n kind: RowKind.Group\r\n row: PortfolioGroup\r\n}\r\ninterface TradeProps {\r\n kind: RowKind.Trade\r\n row: PortfolioTrade\r\n}\r\n\r\ninterface TransactionProps {\r\n kind: RowKind.Transaction\r\n row: PortfolioEntryTransaction\r\n}\r\n\r\ninterface SummaryProps {\r\n kind: RowKind.Summary\r\n row: PortfolioSummary\r\n}\r\n\r\ninterface WatchlistProps {\r\n index: number\r\n kind: RowKind.Watchlist\r\n row: PortfolioGroup\r\n}\r\n\r\nexport interface TableColumnDefinition<\r\n PropsType = GroupProps | TradeProps | TransactionProps | SummaryProps | WatchlistProps,\r\n> extends SortByShape {\r\n urlSort: string\r\n name: string\r\n align?: TableAlign\r\n\r\n /**\r\n * Get the value of the column and render it\r\n */\r\n renderColumn: (props: PropsType) => React.ReactNode\r\n}\r\n\r\nexport enum ActionKind {\r\n AddTickers,\r\n RemoveTicker,\r\n AddTransaction,\r\n EditTransaction,\r\n RemoveTransaction,\r\n ReorderTickers,\r\n PortfoliosReorder,\r\n}\r\n\r\nexport interface Action {\r\n kind: ActionKind\r\n payload: PayloadType\r\n}\r\n\r\nexport type AddTickersError = {\r\n tickers?: string\r\n}\r\n\r\nexport interface CreatePortfolioErrors extends AddTickersError {\r\n portfolioName?: string\r\n}\r\n\r\nexport interface CreatePortfolioData {\r\n tickers: string\r\n portfolioName: string\r\n}\r\n\r\nexport type FormErrors = Partial>\r\n\r\nexport interface PortfolioBulkEditErrors {\r\n portfolioName: boolean\r\n rows: Record\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { MapDataNode, MapDataRoot, MapSubtypeId, PerfData } from '../../../app/maps/types'\r\nimport { getMapsRefreshInterval } from '../../../app/maps/utils'\r\nimport { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { parseInitData } from '../../../app/shared/utils'\r\nimport * as storage from '../../services/local-storage'\r\nimport { formatNumber, getUuid } from '../../util'\r\nimport { columnMap } from './constants/columns'\r\nimport {\r\n CASH_TRANSACTIONS,\r\n EMPTY_FORM_ENTRY,\r\n PORTFOLIO_CASH_SYMBOL,\r\n PORTFOLIO_DATE_FORMAT_DATA,\r\n PORTFOLIO_DATE_FORMAT_VIEW,\r\n PORTFOLIO_REFRESH_INTERVAL_ELITE,\r\n PORTFOLIO_REFRESH_INTERVAL_FREE,\r\n STOCK_TRANSACTIONS,\r\n} from './constants/general'\r\nimport * as api from './services/api'\r\nimport {\r\n ColumnId,\r\n FormErrors,\r\n PortfolioEntryBase,\r\n PortfolioEntryTransaction,\r\n PortfolioFormEntry,\r\n PortfolioFormGroup,\r\n PortfolioGroup,\r\n PortfolioInitData,\r\n PortfolioMapEntry,\r\n PortfolioMapSizeKey,\r\n PortfolioQuery,\r\n PortfolioSummary,\r\n PortfolioSymbolType,\r\n PortfolioTransaction,\r\n PortfolioTransactionStake,\r\n PortfolioView,\r\n} from './types'\r\n\r\nexport enum PortfolioDataKey {\r\n Cash = 'cash',\r\n LongGainers = 'longGainers',\r\n LongLosers = 'longLosers',\r\n ShortGainers = 'shortGainers',\r\n ShortLosers = 'shortLosers',\r\n}\r\n\r\nconst industryLabelKey = 'description'\r\n\r\nconst groupPrefix = {\r\n long: 'Long',\r\n short: 'Short',\r\n}\r\n\r\nconst groupLabel = {\r\n gainers: 'Gainers',\r\n losers: 'Losers',\r\n}\r\n\r\nexport const LOCAL_STORAGE_KEY = 'portfolio-map'\r\n\r\ntype PortfolioMapData = { [key in PortfolioDataKey]: MapDataNode[] }\r\n\r\nexport interface PortfolioSavedSettings {\r\n tableView: '1' | '2'\r\n showMap: boolean\r\n showIndustries: boolean\r\n subtype: MapSubtypeId\r\n tableOrder: string\r\n}\r\n\r\nexport const DEFAULT_SETTINGS: PortfolioSavedSettings = {\r\n tableView: '1',\r\n showMap: true,\r\n showIndustries: true,\r\n subtype: MapSubtypeId.PortfolioGainPct,\r\n tableOrder: columnMap[ColumnId.Order].urlSort,\r\n}\r\n\r\n/**\r\n * Map param in query/local storage is string but we need a boolean\r\n */\r\nexport function parseBoolFromValue(value?: string | null) {\r\n try {\r\n if (value) {\r\n return Boolean(JSON.parse(value))\r\n }\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function getMapSettingFromLocalStorage() {\r\n const savedSettings = storage.getValue(LOCAL_STORAGE_KEY, DEFAULT_SETTINGS)\r\n\r\n return { ...DEFAULT_SETTINGS, ...savedSettings }\r\n}\r\n\r\nexport function saveMapSettingToLocalStorage(\r\n key: keyof PortfolioSavedSettings,\r\n value: PortfolioSavedSettings[typeof key]\r\n) {\r\n storage.setValue(\r\n LOCAL_STORAGE_KEY,\r\n (prevState) => {\r\n const itemToStore = { ...prevState, [key]: value }\r\n // TODO: remove - temporary code to remove removed property from settings\r\n if ('customTickersOrder' in itemToStore) delete itemToStore.customTickersOrder\r\n return itemToStore\r\n },\r\n DEFAULT_SETTINGS\r\n )\r\n}\r\n\r\nconst SUMMARY_DEFAULT: PortfolioSummary = {\r\n tickers: 0,\r\n transactions: 0,\r\n shares: 0,\r\n lastChangePct: 0,\r\n valuePaid: 0,\r\n valueMarket: 0,\r\n valueMarketStocks: 0,\r\n valueMarketStocksPrev: 0,\r\n gainMarketUsd: 0,\r\n gainMarketPct: 0,\r\n gainTodayUsd: 0,\r\n}\r\n\r\nexport function getSummary(data: PortfolioGroup[]) {\r\n let transactions = 0\r\n\r\n const computed = data.reduce((prev, current) => {\r\n transactions += current.transactions.length || 1\r\n\r\n if (current.isDelisted) return prev\r\n\r\n const valueMarket = prev.valueMarket + current.valueMarket\r\n const valueMarketStocks =\r\n prev.valueMarketStocks + (current.type === PortfolioSymbolType.Cash ? 0 : current.valueMarket)\r\n const valueMarketStocksPrev =\r\n prev.valueMarketStocksPrev + (current.type === PortfolioSymbolType.Cash ? 0 : current.valueMarketPrev)\r\n const valuePaid = prev.valuePaid + current.valuePaid\r\n const lastChangePct = valueMarketStocksPrev <= 0 ? 0 : (valueMarketStocks / valueMarketStocksPrev - 1) * 100\r\n const gainMarketPct = valuePaid <= 0 ? 0 : (valueMarketStocks / valuePaid - 1) * 100\r\n\r\n return {\r\n ...prev,\r\n valueMarket: valueMarket,\r\n valueMarketStocks,\r\n valueMarketStocksPrev,\r\n lastChangePct,\r\n gainMarketPct,\r\n shares: prev.shares + current.shares,\r\n valuePaid: prev.valuePaid + current.valuePaid,\r\n gainMarketUsd: prev.gainMarketUsd + current.gainMarketUsd,\r\n gainTodayUsd: prev.gainTodayUsd + current.gainTodayUsd,\r\n }\r\n }, SUMMARY_DEFAULT)\r\n\r\n return {\r\n ...computed,\r\n transactions,\r\n tickers: data.length,\r\n }\r\n}\r\n\r\nfunction isMapTransaction(entry: PortfolioEntryTransaction): entry is PortfolioTransactionStake {\r\n return entry.shares > 0 || entry.type === PortfolioSymbolType.Cash\r\n}\r\n\r\n/**\r\n * Goes through all the items and merges them together so that we don’t end up\r\n * with multiple map tiles with same ticker & transaction\r\n */\r\nexport function flattenAndDedupe(data: PortfolioGroup[]) {\r\n const result: PortfolioMapEntry[] = []\r\n\r\n data.forEach((group) => {\r\n group.transactions.forEach((entry) => {\r\n if (!isMapTransaction(entry)) return\r\n\r\n const previouslyAdded = result.findIndex(\r\n (prev) =>\r\n prev.ticker === entry.ticker &&\r\n (entry.type === PortfolioSymbolType.Cash ? true : prev.transaction === entry.transaction)\r\n )\r\n\r\n if (previouslyAdded < 0) {\r\n const newEntry = { ...group, ...entry, transactions: undefined }\r\n delete newEntry.transactions\r\n result.push(newEntry)\r\n } else {\r\n const prevEntry = result[previouslyAdded]\r\n const valueMarket = prevEntry.valueMarket + entry.valueMarket\r\n const valuePaid = prevEntry.valuePaid + entry.valuePaid\r\n\r\n result[previouslyAdded] = {\r\n ...prevEntry,\r\n valuePaid,\r\n valueMarket,\r\n shares: prevEntry.shares + entry.shares,\r\n valueMarketPrev: prevEntry.valueMarketPrev + entry.valueMarketPrev,\r\n gainMarketUsd: prevEntry.gainMarketUsd + entry.gainMarketUsd,\r\n gainMarketPct: (valueMarket / valuePaid - 1) * 100,\r\n gainTodayUsd: prevEntry.gainTodayUsd + entry.gainTodayUsd,\r\n }\r\n }\r\n })\r\n })\r\n\r\n return Object.values(result)\r\n}\r\n\r\n/**\r\n * Checks if item is loser/gainer and returns the appropriate flag\r\n */\r\nfunction getEntryGroup(type: PortfolioSymbolType, gain: number, transaction: PortfolioTransaction) {\r\n if (type === PortfolioSymbolType.Cash) return PortfolioDataKey.Cash\r\n\r\n switch (transaction) {\r\n case PortfolioTransaction.Short: {\r\n return gain > 0 ? PortfolioDataKey.ShortGainers : PortfolioDataKey.ShortLosers\r\n }\r\n\r\n default:\r\n case PortfolioTransaction.Buy: {\r\n return gain >= 0 ? PortfolioDataKey.LongGainers : PortfolioDataKey.LongLosers\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates industry node with children\r\n */\r\nexport function getIndustries(industries: Record) {\r\n return Object.keys(industries).map((industry) => ({\r\n name: industry,\r\n children: industries[industry],\r\n }))\r\n}\r\n\r\n/**\r\n * Group items by key\r\n * @see https://stackoverflow.com/a/47385953\r\n */\r\nexport function groupByKey(list: Item[], key: keyof Item) {\r\n return list.reduce>((hash, obj) => {\r\n if (obj[key] === undefined) return hash\r\n return Object.assign(hash, { [obj[key] as string]: (hash[obj[key] as string] || []).concat(obj) })\r\n }, {})\r\n}\r\n\r\n/**\r\n * Creates long/short gainers/losers group with all the children, optionally grouping them by industry\r\n */\r\nfunction createGroup(key: PortfolioDataKey, data: PortfolioMapData, groupByIndustry = true) {\r\n let groupName = ''\r\n switch (key) {\r\n case PortfolioDataKey.Cash:\r\n groupName = 'Other'\r\n break\r\n default:\r\n const isLong = [PortfolioDataKey.LongGainers, PortfolioDataKey.LongLosers].includes(key)\r\n const isGainer = [PortfolioDataKey.LongGainers, PortfolioDataKey.ShortGainers].includes(key)\r\n const longPrefix = data.shortGainers.length || data.shortLosers.length ? `${groupPrefix.long}: ` : ''\r\n const shortPrefix = data.longGainers.length || data.longLosers.length ? `${groupPrefix.short}: ` : ''\r\n groupName = `${isLong ? longPrefix : shortPrefix}${isGainer ? groupLabel.gainers : groupLabel.losers}`\r\n break\r\n }\r\n\r\n if (groupByIndustry) {\r\n let children: Array<{ name: string; children: MapDataNode[] }> = []\r\n if (key === PortfolioDataKey.Cash && data[key].length) children = [{ name: 'Cash', children: data[key] }]\r\n else children = getIndustries(groupByKey(data[key], industryLabelKey))\r\n return { name: groupName, children }\r\n }\r\n\r\n return { name: groupName, children: data[key] }\r\n}\r\n\r\nexport function getPerfText(node: PortfolioMapEntry, subtype: MapSubtypeId) {\r\n switch (subtype) {\r\n case MapSubtypeId.PortfolioGainPct:\r\n return node.gainMarketPct\r\n case MapSubtypeId.PortfolioGainUsd:\r\n return node.gainMarketUsd\r\n case MapSubtypeId.PortfolioChangePct:\r\n return node.lastChangePct\r\n case MapSubtypeId.PortfolioChangeUsd:\r\n return node.gainTodayUsd\r\n }\r\n}\r\n\r\nfunction getPerfForTicker | any[]>(\r\n ticker: string,\r\n list?: ListType,\r\n group?: PortfolioDataKey\r\n) {\r\n if (Array.isArray(list)) {\r\n return list.find((item) => item.name === ticker && item.data?.group === group)?.perf\r\n }\r\n\r\n return list?.[ticker]\r\n}\r\n\r\n/**\r\n * Returns data for the map. This data is deduped and split into gainers/losers & industries\r\n */\r\nexport function getMapData({\r\n data,\r\n perfData,\r\n size,\r\n subtype,\r\n groupByIndustry,\r\n}: {\r\n data?: PortfolioGroup[]\r\n perfData?: PerfData\r\n size: PortfolioMapSizeKey\r\n subtype: MapSubtypeId\r\n groupByIndustry?: boolean\r\n}) {\r\n if (!data) return { hasData: false }\r\n\r\n const dedupedData = flattenAndDedupe(data)\r\n\r\n const isPortfolioSubtype = subtype.startsWith('portfolio')\r\n const parsedData = dedupedData.reduce(\r\n (prev: PortfolioMapData, current) => {\r\n const group = getEntryGroup(current.type, current.gainMarketPct / 100, current.transaction)\r\n // The map can’t display negative values so we need to Math.abs\r\n let value = Math.abs(size === PortfolioMapSizeKey.MarketValue ? current.valueMarket : current.gainMarketUsd)\r\n if (!Number.isFinite(value)) value = 0\r\n\r\n const subtypePerf = getPerfText(current, subtype)\r\n const perfText = isPortfolioSubtype ? subtypePerf : getPerfForTicker(current.ticker, perfData?.nodes, group)\r\n\r\n const entry = {\r\n name: current.ticker,\r\n value,\r\n perf: current.type === PortfolioSymbolType.Cash ? null : perfText ?? subtypePerf,\r\n additional:\r\n current.type === PortfolioSymbolType.Cash\r\n ? formatNumber(current.valueMarket)\r\n : getPerfForTicker(current.ticker, perfData?.additional, group),\r\n description: current.industry,\r\n data: { perfWeek: current.perfWeek, group },\r\n } as MapDataNode\r\n\r\n if (value > 0) {\r\n return { ...prev, [group]: [...prev[group], entry] }\r\n }\r\n\r\n return prev\r\n },\r\n {\r\n [PortfolioDataKey.Cash]: [],\r\n [PortfolioDataKey.LongGainers]: [],\r\n [PortfolioDataKey.LongLosers]: [],\r\n [PortfolioDataKey.ShortGainers]: [],\r\n [PortfolioDataKey.ShortLosers]: [],\r\n }\r\n )\r\n\r\n return {\r\n dataHash: `${isPortfolioSubtype || !perfData ? new Date().toString() : perfData.hash}-${groupByIndustry}`,\r\n hasData: Object.values(parsedData).some((arr) => arr.length > 0),\r\n data: {\r\n name: 'Portfolio',\r\n children: Object.keys(parsedData)\r\n .map((key) => createGroup(key as PortfolioDataKey, parsedData, groupByIndustry))\r\n .filter((category) => category.children.length),\r\n } as MapDataRoot,\r\n }\r\n}\r\n\r\nexport function parsePortfolioQuery(params: URLSearchParams, defaultPortfolioId: number) {\r\n const currentPortfolio = Number.parseInt(params.get(PortfolioQuery.PortfolioId) ?? '')\r\n const portfolioId =\r\n Number.isFinite(currentPortfolio) && currentPortfolio !== 0 ? currentPortfolio : defaultPortfolioId\r\n\r\n return {\r\n portfolioId,\r\n params: Object.fromEntries(params.entries()) as Record, // Re-export the original query as key/val\r\n view: params.get(PortfolioQuery.View) ?? PortfolioView.View,\r\n tableView: params.get(PortfolioQuery.TableView) ?? undefined,\r\n map: parseBoolFromValue(params.get(PortfolioQuery.Map)) ?? getMapSettingFromLocalStorage().showMap,\r\n size: (params.get(PortfolioQuery.Size) ?? PortfolioMapSizeKey.MarketValue) as PortfolioMapSizeKey,\r\n subtype: (params.get(PortfolioQuery.Subtype) ?? getMapSettingFromLocalStorage().subtype) as MapSubtypeId,\r\n group: params.get(PortfolioQuery.Group)?.toUpperCase().split(',') ?? [],\r\n tickers: params.get(PortfolioQuery.Tickers)?.split(',') ?? [],\r\n }\r\n}\r\n\r\nexport function getColumnsByKeys(keys: ColumnId[]) {\r\n return keys.map((key) => columnMap[key])\r\n}\r\n\r\nexport function getFormattedDate(format = PORTFOLIO_DATE_FORMAT_DATA) {\r\n return `${dateFns.format(new Date(), format)}`\r\n}\r\n\r\nexport function validateEditRow(\r\n state: Partial,\r\n dateFormat = PORTFOLIO_DATE_FORMAT_DATA,\r\n checkFormat = true\r\n) {\r\n const formErrors: FormErrors = {}\r\n\r\n if (state.ticker !== undefined && state.ticker.trim().length === 0) {\r\n formErrors.ticker = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (!state.date || !dateFns.isValid(parseInputAsDate({ input: state.date, format: dateFormat, checkFormat })))\r\n ) {\r\n formErrors.date = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (state.shares === undefined || isNaN(state.shares) || state.shares < 0)\r\n ) {\r\n formErrors.shares = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (state.price === undefined || isNaN(state.price) || state.price <= 0)\r\n ) {\r\n formErrors.price = true\r\n }\r\n\r\n return { isValid: Object.keys(formErrors).length === 0, errors: formErrors }\r\n}\r\n\r\nexport function parseInputAsDate({\r\n input,\r\n format = PORTFOLIO_DATE_FORMAT_VIEW,\r\n checkFormat = true,\r\n}: {\r\n input: Date | string\r\n format?: string\r\n checkFormat?: boolean\r\n}) {\r\n if (checkFormat && typeof input === 'string' && input.length !== format.length) {\r\n return new Date('Invalid Date')\r\n }\r\n if (input instanceof Date && dateFns.isValid(input)) return input\r\n\r\n return dateFns.parse(input.toString(), format, new Date())\r\n}\r\n\r\nexport const FORM_ENTRY_KEYS = Object.keys(EMPTY_FORM_ENTRY)\r\n\r\nfunction appendRowToFormData(serializer: URLSearchParams, row: Partial, index: number) {\r\n FORM_ENTRY_KEYS.forEach((key) => serializer.append(`${key}${index}`, `${row[key as keyof PortfolioEntryBase] ?? ''}`))\r\n}\r\n\r\nexport function getBulkEditData(\r\n data: Array,\r\n options: { resetCash?: boolean } = {}\r\n): Record {\r\n return data.reduce(\r\n (acc, row) => {\r\n const id = getUuid()\r\n const transactions =\r\n row.transactions.length === 0 || (options.resetCash && getSymbolType(row.ticker) === PortfolioSymbolType.Cash)\r\n ? [getNewTransaction(row.ticker, PortfolioTransaction.Watch)]\r\n : row.transactions.map((transaction) => ({\r\n ...transaction,\r\n uuid: transaction.id ? `${transaction.id}` : getUuid(),\r\n }))\r\n return {\r\n ...acc,\r\n [id]: { ...row, id, transactions },\r\n }\r\n },\r\n {} as Record\r\n )\r\n}\r\n\r\nexport function serializeFormData<\r\n EntryType extends { ticker: string; transactions?: Array> },\r\n>(entries: EntryType[]) {\r\n const serializer = new URLSearchParams()\r\n entries\r\n .flatMap((entry) => {\r\n if (!entry.transactions || entry.transactions?.length === 0) {\r\n return getNewTransaction(entry.ticker, PortfolioTransaction.Watch)\r\n }\r\n\r\n return entry.transactions\r\n })\r\n .forEach((entry, index) => {\r\n if (entry.ticker.length) appendRowToFormData(serializer, entry, index)\r\n })\r\n\r\n return serializer\r\n}\r\n\r\nexport async function validateFormData(data: PortfolioFormGroup[], validateFields = true) {\r\n if (data.length === 0) return { isValid: true, errors: {} }\r\n\r\n let isValid = true\r\n const errors: Record = {}\r\n\r\n try {\r\n const tickers = data.map((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim(), false, [PORTFOLIO_CASH_SYMBOL])\r\n return ticker.length ? ticker : api.QUOTE_INVALID_TICKER_REQUEST\r\n })\r\n const validatedTickers = await api.validateTickers(tickers)\r\n\r\n isValid = tickers.length === validatedTickers.length\r\n\r\n // Validate fields\r\n if (validateFields) {\r\n data.forEach((row, index) => {\r\n const validationResult = row.transactions.map((transaction) =>\r\n validateEditRow(transaction, PORTFOLIO_DATE_FORMAT_DATA, false)\r\n )\r\n\r\n const hasInvalidEntries = validationResult.some((result) => !result.isValid)\r\n const isInvalidTicker = validatedTickers[index] !== true\r\n\r\n if (hasInvalidEntries || isInvalidTicker) {\r\n isValid = false\r\n }\r\n\r\n errors[row.id] = validationResult.map((result) => ({ ...result.errors, ticker: isInvalidTicker }))\r\n })\r\n }\r\n } catch {\r\n return {\r\n isValid: false,\r\n errors: {},\r\n }\r\n }\r\n\r\n return { isValid, errors }\r\n}\r\n\r\nexport function getNumberValue(value?: number) {\r\n if (value === undefined || isNaN(value)) return NaN\r\n return value\r\n}\r\n\r\nexport function getNewTransaction(ticker: string, transaction = PortfolioTransaction.Buy): PortfolioFormEntry {\r\n const symbolType = getSymbolType(ticker)\r\n const allowedTransactions = getTransactionsForSymbolType(symbolType)\r\n\r\n return {\r\n ...EMPTY_FORM_ENTRY,\r\n uuid: getUuid() as string,\r\n ticker,\r\n type: getSymbolType(ticker),\r\n date: getFormattedDate(PORTFOLIO_DATE_FORMAT_DATA),\r\n transaction: [PortfolioTransaction.Watch, ...allowedTransactions].includes(transaction)\r\n ? transaction\r\n : allowedTransactions[0],\r\n shares: transaction === PortfolioTransaction.Watch || symbolType === PortfolioSymbolType.Cash ? 0 : undefined,\r\n price: transaction === PortfolioTransaction.Watch ? 0 : undefined,\r\n }\r\n}\r\n\r\nexport function getPortfolioInitData() {\r\n let returnData = { isInitData: false, initData: api.EMPTY_RESPONSE }\r\n const initDataElement = document.getElementById('portfolio-init-data')\r\n if (initDataElement) {\r\n const initData = parseInitData('portfolio-init-data')\r\n initDataElement.remove()\r\n returnData = { isInitData: !!initData, initData: initData ?? api.EMPTY_RESPONSE }\r\n }\r\n return returnData\r\n}\r\n\r\nconst EMPTY_TRANSACTION = { transaction: PortfolioTransaction.Watch, index: 0, price: 0 }\r\n\r\nexport function getTradesStructureData(portfolioData: PortfolioGroup[]) {\r\n return portfolioData\r\n .flatMap((ticker) => {\r\n const transactions = [...ticker.transactions]\r\n if (transactions.length === 0) {\r\n transactions.push(EMPTY_TRANSACTION as unknown as PortfolioEntryTransaction)\r\n }\r\n return transactions.map((transaction) => {\r\n const obj = { ...ticker } as Omit & {\r\n transactions?: PortfolioEntryTransaction[]\r\n }\r\n delete obj.transactions\r\n return { ...obj, ...transaction }\r\n })\r\n })\r\n .sort((a, b) => a.id - b.id)\r\n}\r\n\r\nexport function getSymbolType(symbol?: string) {\r\n if (symbol?.toUpperCase() === PORTFOLIO_CASH_SYMBOL) return PortfolioSymbolType.Cash\r\n\r\n return PortfolioSymbolType.Stock\r\n}\r\n\r\nexport function isStockTransaction(transaction: PortfolioTransaction) {\r\n return STOCK_TRANSACTIONS.includes(transaction)\r\n}\r\n\r\nexport function isCashTransaction(transaction: PortfolioTransaction) {\r\n return CASH_TRANSACTIONS.includes(transaction)\r\n}\r\n\r\nexport function getTransactionsForSymbolType(symbolType: PortfolioSymbolType) {\r\n switch (symbolType) {\r\n case PortfolioSymbolType.Cash:\r\n return CASH_TRANSACTIONS\r\n default:\r\n return STOCK_TRANSACTIONS\r\n }\r\n}\r\n\r\nexport function getPortfolioRefreshInterval() {\r\n return getMapsRefreshInterval({\r\n base: PORTFOLIO_REFRESH_INTERVAL_ELITE,\r\n free: PORTFOLIO_REFRESH_INTERVAL_FREE,\r\n })\r\n}\r\n","\"use strict\";\n\nvar deselectCurrent = require(\"toggle-selection\");\n\nvar clipboardToIE11Formatting = {\n \"text/plain\": \"Text\",\n \"text/html\": \"Url\",\n \"default\": \"Text\"\n}\n\nvar defaultMessage = \"Copy to clipboard: #{key}, Enter\";\n\nfunction format(message) {\n var copyKey = (/mac os x/i.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\") + \"+C\";\n return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\nfunction copy(text, options) {\n var debug,\n message,\n reselectPrevious,\n range,\n selection,\n mark,\n success = false;\n if (!options) {\n options = {};\n }\n debug = options.debug || false;\n try {\n reselectPrevious = deselectCurrent();\n\n range = document.createRange();\n selection = document.getSelection();\n\n mark = document.createElement(\"span\");\n mark.textContent = text;\n // reset user styles for span element\n mark.style.all = \"unset\";\n // prevents scrolling to the end of the page\n mark.style.position = \"fixed\";\n mark.style.top = 0;\n mark.style.clip = \"rect(0, 0, 0, 0)\";\n // used to preserve spaces and line breaks\n mark.style.whiteSpace = \"pre\";\n // do not inherit user-select (it may be `none`)\n mark.style.webkitUserSelect = \"text\";\n mark.style.MozUserSelect = \"text\";\n mark.style.msUserSelect = \"text\";\n mark.style.userSelect = \"text\";\n mark.addEventListener(\"copy\", function(e) {\n e.stopPropagation();\n if (options.format) {\n e.preventDefault();\n if (typeof e.clipboardData === \"undefined\") { // IE 11\n debug && console.warn(\"unable to use e.clipboardData\");\n debug && console.warn(\"trying IE specific stuff\");\n window.clipboardData.clearData();\n var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting[\"default\"]\n window.clipboardData.setData(format, text);\n } else { // all other browsers\n e.clipboardData.clearData();\n e.clipboardData.setData(options.format, text);\n }\n }\n if (options.onCopy) {\n e.preventDefault();\n options.onCopy(e.clipboardData);\n }\n });\n\n document.body.appendChild(mark);\n\n range.selectNodeContents(mark);\n selection.addRange(range);\n\n var successful = document.execCommand(\"copy\");\n if (!successful) {\n throw new Error(\"copy command was unsuccessful\");\n }\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using execCommand: \", err);\n debug && console.warn(\"trying IE specific stuff\");\n try {\n window.clipboardData.setData(options.format || \"text\", text);\n options.onCopy && options.onCopy(window.clipboardData);\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using clipboardData: \", err);\n debug && console.error(\"falling back to prompt\");\n message = format(\"message\" in options ? options.message : defaultMessage);\n window.prompt(message, text);\n }\n } finally {\n if (selection) {\n if (typeof selection.removeRange == \"function\") {\n selection.removeRange(range);\n } else {\n selection.removeAllRanges();\n }\n }\n\n if (mark) {\n document.body.removeChild(mark);\n }\n reselectPrevious();\n }\n\n return success;\n}\n\nmodule.exports = copy;\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","/** @license React v17.0.2\n * react-dom-server.browser.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\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'use strict';var l=require(\"object-assign\"),m=require(\"react\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;cK;K++)J[K]=K+1;J[15]=0;var oa=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,pa=Object.prototype.hasOwnProperty,qa={},ra={};\nfunction sa(a){if(pa.call(ra,a))return!0;if(pa.call(qa,a))return!1;if(oa.test(a))return ra[a]=!0;qa[a]=!0;return!1}function ta(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction ua(a,b,c,d){if(null===b||\"undefined\"===typeof b||ta(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function M(a,b,c,d,f,h,t){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=f;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=h;this.removeEmptyString=t}var N={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){N[a]=new M(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];N[b]=new M(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){N[a]=new M(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){N[a]=new M(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){N[a]=new M(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){N[a]=new M(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){N[a]=new M(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){N[a]=new M(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){N[a]=new M(a,5,!1,a.toLowerCase(),null,!1,!1)});var va=/[\\-:]([a-z])/g;function wa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(va,\nwa);N[b]=new M(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(va,wa);N[b]=new M(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(va,wa);N[b]=new M(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){N[a]=new M(a,1,!1,a.toLowerCase(),null,!1,!1)});\nN.xlinkHref=new M(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){N[a]=new M(a,1,!1,a.toLowerCase(),null,!0,!0)});var xa=/[\"'&<>]/;\nfunction O(a){if(\"boolean\"===typeof a||\"number\"===typeof a)return\"\"+a;a=\"\"+a;var b=xa.exec(a);if(b){var c=\"\",d,f=0;for(d=b.index;dV))throw Error(p(301));if(a===P)if(T=!0,a={action:c,next:null},null===U&&(U=new Map),c=U.get(b),void 0===c)U.set(b,a);else{for(b=c;null!==b.next;)b=b.next;b.next=a}}function Ja(){}\nvar X=null,Ka={readContext:function(a){var b=X.threadID;I(a,b);return a[b]},useContext:function(a){W();var b=X.threadID;I(a,b);return a[b]},useMemo:Ia,useReducer:Ga,useRef:function(a){P=W();R=Ca();var b=R.memoizedState;return null===b?(a={current:a},R.memoizedState=a):b},useState:function(a){return Ga(Fa,a)},useLayoutEffect:function(){},useCallback:function(a,b){return Ia(function(){return a},b)},useImperativeHandle:Ja,useEffect:Ja,useDebugValue:Ja,useDeferredValue:function(a){W();return a},useTransition:function(){W();\nreturn[function(a){a()},!1]},useOpaqueIdentifier:function(){return(X.identifierPrefix||\"\")+\"R:\"+(X.uniqueID++).toString(36)},useMutableSource:function(a,b){W();return b(a._source)}},La={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};function Ma(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}\nvar Na={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},Oa=l({menuitem:!0},Na),Y={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,\ngridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Pa=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(Y).forEach(function(a){Pa.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Y[b]=Y[a]})});\nvar Qa=/([A-Z])/g,Ra=/^ms-/,Z=m.Children.toArray,Sa=la.ReactCurrentDispatcher,Ta={listing:!0,pre:!0,textarea:!0},Ua=/^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/,Va={},Wa={};function Xa(a){if(void 0===a||null===a)return a;var b=\"\";m.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}var Ya=Object.prototype.hasOwnProperty,Za={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null,suppressHydrationWarning:null};function $a(a,b){if(void 0===a)throw Error(p(152,F(b)||\"Component\"));}\nfunction ab(a,b,c){function d(d,h){var e=h.prototype&&h.prototype.isReactComponent,f=na(h,b,c,e),t=[],g=!1,n={isMounted:function(){return!1},enqueueForceUpdate:function(){if(null===t)return null},enqueueReplaceState:function(a,c){g=!0;t=[c]},enqueueSetState:function(a,c){if(null===t)return null;t.push(c)}};if(e){if(e=new h(d.props,f,n),\"function\"===typeof h.getDerivedStateFromProps){var k=h.getDerivedStateFromProps.call(null,d.props,e.state);null!=k&&(e.state=l({},e.state,k))}}else if(P={},e=h(d.props,\nf,n),e=Da(h,d.props,e,f),null==e||null==e.render){a=e;$a(a,h);return}e.props=d.props;e.context=f;e.updater=n;n=e.state;void 0===n&&(e.state=n=null);if(\"function\"===typeof e.UNSAFE_componentWillMount||\"function\"===typeof e.componentWillMount)if(\"function\"===typeof e.componentWillMount&&\"function\"!==typeof h.getDerivedStateFromProps&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof h.getDerivedStateFromProps&&e.UNSAFE_componentWillMount(),t.length){n=t;var v=\ng;t=null;g=!1;if(v&&1===n.length)e.state=n[0];else{k=v?n[0]:e.state;var H=!0;for(v=v?1:0;v=g))throw Error(p(304));var e=new Uint16Array(g);e.set(d);J=e;J[0]=c+1;for(d=c;d=e.children.length){var L=e.footer;\"\"!==L&&(this.previousWasTextNode=!1);this.stack.pop();if(\"select\"===e.type)this.currentSelectValue=null;else if(null!=e.type&&null!=e.type.type&&e.type.type.$$typeof===B)this.popProvider(e.type);else if(e.type===D){this.suspenseDepth--;var G=h.pop();if(t){t=!1;var C=e.fallbackFrame;if(!C)throw Error(p(303));this.stack.push(C);h[this.suspenseDepth]+=\"\\x3c!--$!--\\x3e\";continue}else h[this.suspenseDepth]+=\nG}h[this.suspenseDepth]+=L}else{var n=e.children[e.childIndex++],k=\"\";try{k+=this.render(n,e.context,e.domNamespace)}catch(v){if(null!=v&&\"function\"===typeof v.then)throw Error(p(294));throw v;}finally{}h.length<=this.suspenseDepth&&h.push(\"\");h[this.suspenseDepth]+=k}}return h[0]}finally{Sa.current=c,X=b,Ea()}};b.render=function(a,b,f){if(\"string\"===typeof a||\"number\"===typeof a){f=\"\"+a;if(\"\"===f)return\"\";if(this.makeStaticMarkup)return O(f);if(this.previousWasTextNode)return\"\\x3c!-- --\\x3e\"+O(f);\nthis.previousWasTextNode=!0;return O(f)}b=ab(a,b,this.threadID);a=b.child;b=b.context;if(null===a||!1===a)return\"\";if(!m.isValidElement(a)){if(null!=a&&null!=a.$$typeof){f=a.$$typeof;if(f===q)throw Error(p(257));throw Error(p(258,f.toString()));}a=Z(a);this.stack.push({type:null,domNamespace:f,children:a,childIndex:0,context:b,footer:\"\"});return\"\"}var c=a.type;if(\"string\"===typeof c)return this.renderDOM(a,b,f);switch(c){case ka:case ja:case u:case z:case ca:case r:return a=Z(a.props.children),this.stack.push({type:null,\ndomNamespace:f,children:a,childIndex:0,context:b,footer:\"\"}),\"\";case D:throw Error(p(294));case ia:throw Error(p(343));}if(\"object\"===typeof c&&null!==c)switch(c.$$typeof){case ba:P={};var d=c.render(a.props,a.ref);d=Da(c.render,a.props,d,a.ref);d=Z(d);this.stack.push({type:null,domNamespace:f,children:d,childIndex:0,context:b,footer:\"\"});return\"\";case da:return a=[m.createElement(c.type,l({ref:a.ref},a.props))],this.stack.push({type:null,domNamespace:f,children:a,childIndex:0,context:b,footer:\"\"}),\n\"\";case B:return c=Z(a.props.children),f={type:a,domNamespace:f,children:c,childIndex:0,context:b,footer:\"\"},this.pushProvider(a),this.stack.push(f),\"\";case aa:c=a.type;d=a.props;var g=this.threadID;I(c,g);c=Z(d.children(c[g]));this.stack.push({type:a,domNamespace:f,children:c,childIndex:0,context:b,footer:\"\"});return\"\";case ha:throw Error(p(338));case ea:return c=a.type,d=c._init,c=d(c._payload),a=[m.createElement(c,l({ref:a.ref},a.props))],this.stack.push({type:null,domNamespace:f,children:a,childIndex:0,\ncontext:b,footer:\"\"}),\"\"}throw Error(p(130,null==c?c:typeof c,\"\"));};b.renderDOM=function(a,b,f){var c=a.type.toLowerCase();f===La.html&&Ma(c);if(!Va.hasOwnProperty(c)){if(!Ua.test(c))throw Error(p(65,c));Va[c]=!0}var d=a.props;if(\"input\"===c)d=l({type:void 0},d,{defaultChecked:void 0,defaultValue:void 0,value:null!=d.value?d.value:d.defaultValue,checked:null!=d.checked?d.checked:d.defaultChecked});else if(\"textarea\"===c){var g=d.value;if(null==g){g=d.defaultValue;var e=d.children;if(null!=e){if(null!=\ng)throw Error(p(92));if(Array.isArray(e)){if(!(1>=e.length))throw Error(p(93));e=e[0]}g=\"\"+e}null==g&&(g=\"\")}d=l({},d,{value:void 0,children:\"\"+g})}else if(\"select\"===c)this.currentSelectValue=null!=d.value?d.value:d.defaultValue,d=l({},d,{value:void 0});else if(\"option\"===c){e=this.currentSelectValue;var L=Xa(d.children);if(null!=e){var G=null!=d.value?d.value+\"\":L;g=!1;if(Array.isArray(e))for(var C=0;C\":(w+=\">\",g=\"\");a:{e=d.dangerouslySetInnerHTML;if(null!=e){if(null!=e.__html){e=e.__html;break a}}else if(e=d.children,\"string\"===typeof e||\"number\"===typeof e){e=O(e);break a}e=null}null!=e?(d=[],Ta.hasOwnProperty(c)&&\"\\n\"===e.charAt(0)&&(w+=\"\\n\"),w+=e):d=Z(d.children);a=a.type;f=null==f||\"http://www.w3.org/1999/xhtml\"===f?Ma(a):\"http://www.w3.org/2000/svg\"===\nf&&\"foreignObject\"===a?\"http://www.w3.org/1999/xhtml\":f;this.stack.push({domNamespace:f,type:c,children:d,childIndex:0,context:b,footer:g});this.previousWasTextNode=!1;return w};return a}();exports.renderToNodeStream=function(){throw Error(p(207));};exports.renderToStaticMarkup=function(a,b){a=new bb(a,!0,b);try{return a.read(Infinity)}finally{a.destroy()}};exports.renderToStaticNodeStream=function(){throw Error(p(208));};exports.renderToString=function(a,b){a=new bb(a,!1,b);try{return a.read(Infinity)}finally{a.destroy()}};\nexports.version=\"17.0.2\";\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-dom-server.browser.production.min.js');\n} else {\n module.exports = require('./cjs/react-dom-server.browser.development.js');\n}\n","/* global Map:readonly, Set:readonly, ArrayBuffer:readonly */\n\nvar hasElementType = typeof Element !== 'undefined';\nvar hasMap = typeof Map === 'function';\nvar hasSet = typeof Set === 'function';\nvar hasArrayBuffer = typeof ArrayBuffer === 'function' && !!ArrayBuffer.isView;\n\n// Note: We **don't** need `envHasBigInt64Array` in fde es6/index.js\n\nfunction equal(a, b) {\n // START: fast-deep-equal es6/index.js 3.1.1\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n // START: Modifications:\n // 1. Extra `has &&` helpers in initial condition allow es6 code\n // to co-exist with es5.\n // 2. Replace `for of` with es5 compliant iteration using `for`.\n // Basically, take:\n //\n // ```js\n // for (i of a.entries())\n // if (!b.has(i[0])) return false;\n // ```\n //\n // ... and convert to:\n //\n // ```js\n // it = a.entries();\n // while (!(i = it.next()).done)\n // if (!b.has(i.value[0])) return false;\n // ```\n //\n // **Note**: `i` access switches to `i.value`.\n var it;\n if (hasMap && (a instanceof Map) && (b instanceof Map)) {\n if (a.size !== b.size) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!b.has(i.value[0])) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!equal(i.value[1], b.get(i.value[0]))) return false;\n return true;\n }\n\n if (hasSet && (a instanceof Set) && (b instanceof Set)) {\n if (a.size !== b.size) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!b.has(i.value[0])) return false;\n return true;\n }\n // END: Modifications\n\n if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (a[i] !== b[i]) return false;\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n // END: fast-deep-equal\n\n // START: react-fast-compare\n // custom handling for DOM elements\n if (hasElementType && a instanceof Element) return false;\n\n // custom handling for React/Preact\n for (i = length; i-- !== 0;) {\n if ((keys[i] === '_owner' || keys[i] === '__v' || keys[i] === '__o') && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner\n // Preact-specific: avoid traversing Preact elements' __v and __o\n // __v = $_original / $_vnode\n // __o = $_owner\n // These properties contain circular references and are not needed when\n // comparing the actual elements (and not their owners)\n // .$$typeof and ._store on just reasonable markers of elements\n\n continue;\n }\n\n // all other properties should be traversed as usual\n if (!equal(a[keys[i]], b[keys[i]])) return false;\n }\n // END: react-fast-compare\n\n // START: fast-deep-equal\n return true;\n }\n\n return a !== a && b !== b;\n}\n// end fast-deep-equal\n\nmodule.exports = function isEqual(a, b) {\n try {\n return equal(a, b);\n } catch (error) {\n if (((error.message || '').match(/stack|recursion/i))) {\n // warn on circular references, don't crash\n // browsers give this different errors name and messages:\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\n // firefox: \"InternalError\", too much recursion\"\n // edge: \"Error\", \"Out of stack space\"\n console.warn('react-fast-compare cannot handle circular refs');\n return false;\n }\n // some other error. we should definitely know about these\n throw error;\n }\n};\n","import * as React from 'react';\n\n/**\n * Takes an argument and if it's an array, returns the first item in the array,\n * otherwise returns the argument. Used for Preact compatibility.\n */\nexport var unwrapArray = function unwrapArray(arg) {\n return Array.isArray(arg) ? arg[0] : arg;\n};\n/**\n * Takes a maybe-undefined function and arbitrary args and invokes the function\n * only if it is defined.\n */\n\nexport var safeInvoke = function safeInvoke(fn) {\n if (typeof fn === 'function') {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return fn.apply(void 0, args);\n }\n};\n/**\n * Sets a ref using either a ref callback or a ref object\n */\n\nexport var setRef = function setRef(ref, node) {\n // if its a function call it\n if (typeof ref === 'function') {\n return safeInvoke(ref, node);\n } // otherwise we should treat it as a ref object\n else if (ref != null) {\n ref.current = node;\n }\n};\n/**\n * Simple ponyfill for Object.fromEntries\n */\n\nexport var fromEntries = function fromEntries(entries) {\n return entries.reduce(function (acc, _ref) {\n var key = _ref[0],\n value = _ref[1];\n acc[key] = value;\n return acc;\n }, {});\n};\n/**\n * Small wrapper around `useLayoutEffect` to get rid of the warning on SSR envs\n */\n\nexport var useIsomorphicLayoutEffect = typeof window !== 'undefined' && window.document && window.document.createElement ? React.useLayoutEffect : React.useEffect;","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { createPopper as defaultCreatePopper } from '@popperjs/core';\nimport isEqual from 'react-fast-compare';\nimport { fromEntries, useIsomorphicLayoutEffect } from './utils';\nvar EMPTY_MODIFIERS = [];\nexport var usePopper = function usePopper(referenceElement, popperElement, options) {\n if (options === void 0) {\n options = {};\n }\n\n var prevOptions = React.useRef(null);\n var optionsWithDefaults = {\n onFirstUpdate: options.onFirstUpdate,\n placement: options.placement || 'bottom',\n strategy: options.strategy || 'absolute',\n modifiers: options.modifiers || EMPTY_MODIFIERS\n };\n\n var _React$useState = React.useState({\n styles: {\n popper: {\n position: optionsWithDefaults.strategy,\n left: '0',\n top: '0'\n },\n arrow: {\n position: 'absolute'\n }\n },\n attributes: {}\n }),\n state = _React$useState[0],\n setState = _React$useState[1];\n\n var updateStateModifier = React.useMemo(function () {\n return {\n name: 'updateState',\n enabled: true,\n phase: 'write',\n fn: function fn(_ref) {\n var state = _ref.state;\n var elements = Object.keys(state.elements);\n ReactDOM.flushSync(function () {\n setState({\n styles: fromEntries(elements.map(function (element) {\n return [element, state.styles[element] || {}];\n })),\n attributes: fromEntries(elements.map(function (element) {\n return [element, state.attributes[element]];\n }))\n });\n });\n },\n requires: ['computeStyles']\n };\n }, []);\n var popperOptions = React.useMemo(function () {\n var newOptions = {\n onFirstUpdate: optionsWithDefaults.onFirstUpdate,\n placement: optionsWithDefaults.placement,\n strategy: optionsWithDefaults.strategy,\n modifiers: [].concat(optionsWithDefaults.modifiers, [updateStateModifier, {\n name: 'applyStyles',\n enabled: false\n }])\n };\n\n if (isEqual(prevOptions.current, newOptions)) {\n return prevOptions.current || newOptions;\n } else {\n prevOptions.current = newOptions;\n return newOptions;\n }\n }, [optionsWithDefaults.onFirstUpdate, optionsWithDefaults.placement, optionsWithDefaults.strategy, optionsWithDefaults.modifiers, updateStateModifier]);\n var popperInstanceRef = React.useRef();\n useIsomorphicLayoutEffect(function () {\n if (popperInstanceRef.current) {\n popperInstanceRef.current.setOptions(popperOptions);\n }\n }, [popperOptions]);\n useIsomorphicLayoutEffect(function () {\n if (referenceElement == null || popperElement == null) {\n return;\n }\n\n var createPopper = options.createPopper || defaultCreatePopper;\n var popperInstance = createPopper(referenceElement, popperElement, popperOptions);\n popperInstanceRef.current = popperInstance;\n return function () {\n popperInstance.destroy();\n popperInstanceRef.current = null;\n };\n }, [referenceElement, popperElement, options.createPopper]);\n return {\n state: popperInstanceRef.current ? popperInstanceRef.current.state : null,\n styles: state.styles,\n attributes: state.attributes,\n update: popperInstanceRef.current ? popperInstanceRef.current.update : null,\n forceUpdate: popperInstanceRef.current ? popperInstanceRef.current.forceUpdate : null\n };\n};","/**\n * React Router DOM v6.16.0\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport * as React from 'react';\nimport { UNSAFE_mapRouteProperties, Router, UNSAFE_NavigationContext, useHref, useResolvedPath, useLocation, UNSAFE_DataRouterStateContext, useNavigate, createPath, UNSAFE_useRouteId, UNSAFE_RouteContext, useMatches, useNavigation, unstable_useBlocker, UNSAFE_DataRouterContext } from 'react-router';\nexport { AbortedDeferredError, Await, MemoryRouter, Navigate, NavigationType, Outlet, Route, Router, RouterProvider, Routes, UNSAFE_DataRouterContext, UNSAFE_DataRouterStateContext, UNSAFE_LocationContext, UNSAFE_NavigationContext, UNSAFE_RouteContext, UNSAFE_useRouteId, createMemoryRouter, createPath, createRoutesFromChildren, createRoutesFromElements, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, parsePath, redirect, redirectDocument, renderMatches, resolvePath, unstable_useBlocker, useActionData, useAsyncError, useAsyncValue, useHref, useInRouterContext, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes } from 'react-router';\nimport { stripBasename, UNSAFE_warning, createRouter, createBrowserHistory, createHashHistory, UNSAFE_ErrorResponseImpl, UNSAFE_invariant, joinPaths } from '@remix-run/router';\n\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n\nconst defaultMethod = \"get\";\nconst defaultEncType = \"application/x-www-form-urlencoded\";\nfunction isHtmlElement(object) {\n return object != null && typeof object.tagName === \"string\";\n}\nfunction isButtonElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\nfunction isFormElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\nfunction isInputElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n return event.button === 0 && (\n // Ignore everything but left clicks\n !target || target === \"_self\") &&\n // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event) // Ignore clicks with modifier keys\n ;\n}\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n * let searchParams = new URLSearchParams([\n * ['sort', 'name'],\n * ['sort', 'price']\n * ]);\n *\n * you can do:\n *\n * let searchParams = createSearchParams({\n * sort: ['name', 'price']\n * });\n */\nfunction createSearchParams(init) {\n if (init === void 0) {\n init = \"\";\n }\n return new URLSearchParams(typeof init === \"string\" || Array.isArray(init) || init instanceof URLSearchParams ? init : Object.keys(init).reduce((memo, key) => {\n let value = init[key];\n return memo.concat(Array.isArray(value) ? value.map(v => [key, v]) : [[key, value]]);\n }, []));\n}\nfunction getSearchParamsForLocation(locationSearch, defaultSearchParams) {\n let searchParams = createSearchParams(locationSearch);\n if (defaultSearchParams) {\n // Use `defaultSearchParams.forEach(...)` here instead of iterating of\n // `defaultSearchParams.keys()` to work-around a bug in Firefox related to\n // web extensions. Relevant Bugzilla tickets:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1414602\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1023984\n defaultSearchParams.forEach((_, key) => {\n if (!searchParams.has(key)) {\n defaultSearchParams.getAll(key).forEach(value => {\n searchParams.append(key, value);\n });\n }\n });\n }\n return searchParams;\n}\n// One-time check for submitter support\nlet _formDataSupportsSubmitter = null;\nfunction isFormDataSubmitterSupported() {\n if (_formDataSupportsSubmitter === null) {\n try {\n new FormData(document.createElement(\"form\"),\n // @ts-expect-error if FormData supports the submitter parameter, this will throw\n 0);\n _formDataSupportsSubmitter = false;\n } catch (e) {\n _formDataSupportsSubmitter = true;\n }\n }\n return _formDataSupportsSubmitter;\n}\nconst supportedFormEncTypes = new Set([\"application/x-www-form-urlencoded\", \"multipart/form-data\", \"text/plain\"]);\nfunction getFormEncType(encType) {\n if (encType != null && !supportedFormEncTypes.has(encType)) {\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(false, \"\\\"\" + encType + \"\\\" is not a valid `encType` for `
    `/`` \" + (\"and will default to \\\"\" + defaultEncType + \"\\\"\")) : void 0;\n return null;\n }\n return encType;\n}\nfunction getFormSubmissionInfo(target, basename) {\n let method;\n let action;\n let encType;\n let formData;\n let body;\n if (isFormElement(target)) {\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we'll\n // re-prefix in the router\n let attr = target.getAttribute(\"action\");\n action = attr ? stripBasename(attr, basename) : null;\n method = target.getAttribute(\"method\") || defaultMethod;\n encType = getFormEncType(target.getAttribute(\"enctype\")) || defaultEncType;\n formData = new FormData(target);\n } else if (isButtonElement(target) || isInputElement(target) && (target.type === \"submit\" || target.type === \"image\")) {\n let form = target.form;\n if (form == null) {\n throw new Error(\"Cannot submit a