{"version":3,"file":"map.a0cf56b1.js","mappings":"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","sources":["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/Topbar.tsx","webpack://@finviz/website/./js/app/maps/hooks/use-map-data.ts","webpack://@finviz/website/./js/app/maps/hooks/use-map-type.ts","webpack://@finviz/website/./js/app/maps/components/MapTypeList.tsx","webpack://@finviz/website/./js/app/maps/App.tsx","webpack://@finviz/website/./js/app/maps/treemap-canvas.tsx","webpack://@finviz/website/./js/app/maps/treemap-small.tsx","webpack://@finviz/website/./js/app/shared/components/Ads.tsx","webpack://@finviz/website/./js/app/shared/components/Share.tsx","webpack://@finviz/website/./js/app/shared/drawShareMap.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/components/error-view.tsx","webpack://@finviz/website/./js/main/components/loading.tsx"],"sourcesContent":["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\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 {props.children}\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 Treemap from '../treemap'\r\nimport { MapDataNode } from '../types'\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(treemap?: Treemap) {\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(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(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 Treemap from '../../treemap'\r\nimport { MapDataRoot } from '../../types'\r\nimport * as mapUtils from '../../utils'\r\n\r\ninterface ExpandProps {\r\n treemap: Treemap\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 onExpand = React.useCallback(() => {\r\n if (!props.treemap) 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 updatedLayout = mapUtils.getTreemapLayout(\r\n props.data,\r\n props.treemap.type,\r\n props.treemap.settings,\r\n false,\r\n props.layoutOptions\r\n )\r\n props.treemap.zoom.scale(1)\r\n mapActionCreators.updateLayout(props.treemap, updatedLayout)\r\n\r\n window.scrollTo(0, 0)\r\n }, [props])\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 * as React from 'react'\r\nimport { useMutation } from 'react-query'\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 Treemap from '../../treemap'\r\nimport { MapSubtype, MapType } from '../../types'\r\n\r\ninterface ShareMapProps {\r\n treemap: Treemap\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 uploadImage = useMutation(api.uploadMap)\r\n\r\n const onShareClick = React.useCallback(async () => {\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: props.treemap.type, subtype: props.treemap.subtype, data })\r\n }\r\n }, [props.mapType, props.subtype, props.treemap, uploadImage])\r\n\r\n return \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 * as React from 'react'\r\nimport { useQuery, useQueryClient } from 'react-query'\r\n\r\nimport { MAP_DATA_FETCH_INTERVAL } from '../constants/constants'\r\nimport * as api from '../services/api'\r\nimport mapActionCreators from '../store/action-creators'\r\nimport Treemap from '../treemap'\r\nimport { MapDataRoot, MapSubtypeId, MapTypeId } 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 treemap?: Treemap,\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 mapActionCreators.updatePerfData(treemap, 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: () => fetchPerfData(type, subtype),\r\n // Keep previous data if the map type hasn’t changed\r\n keepPreviousData: prevType.current === type,\r\n refetchInterval: MAP_DATA_FETCH_INTERVAL,\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 if (prevType.current === type) {\r\n // Update perf data if the map type has not changed\r\n mapActionCreators.updatePerfData(treemap, data)\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 classnames from 'classnames'\r\nimport { NavLink } from 'react-router-dom'\r\n\r\nimport { Delayed } from '../../../main/components/delayed'\r\nimport { Spinner } from '../../../main/components/spinner'\r\nimport * as tracking from '../../shared/tracking'\r\nimport { MAP_TYPES } from '../constants/constants'\r\nimport { MapSubtypeId, MapTypeId } from '../types'\r\n\r\ninterface MapTypeProps {\r\n activeType: MapTypeId\r\n activeSubtype: MapSubtypeId\r\n isLoading: boolean\r\n linkClassName?: string\r\n}\r\n\r\nexport function MapTypeList(props: MapTypeProps) {\r\n const linkClass = props.linkClassName ?? ''\r\n\r\n return (\r\n
      \r\n {MAP_TYPES.map((map) => {\r\n const isActiveTreemap = props.activeType === map.type\r\n const query = new URLSearchParams({ t: map.type })\r\n if (props.activeSubtype !== MapSubtypeId.DayPerf) {\r\n query.append('st', props.activeSubtype)\r\n }\r\n\r\n return (\r\n
    • \r\n \r\n classnames('text-xs leading-7', {\r\n [linkClass]: !isActiveTreemap,\r\n 'font-bold text-white': isActiveTreemap,\r\n })\r\n }\r\n onClick={() => {\r\n document.title = map.pageTitle\r\n tracking.trackPageView({ query: `t=${map.type}` })\r\n }}\r\n >\r\n \r\n {map.name}\r\n {isActiveTreemap && props.isLoading && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n
    • \r\n )\r\n })}\r\n
    \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { Button } from '../../main/components/button'\r\nimport { DefaultErrorBoundary } from '../../main/components/error-view'\r\nimport { Paragraph } from '../../main/components/typography'\r\nimport { ScreenerQuery, ScreenerView } from '../screener/utils'\r\nimport { AdTag, useInvestingChannelAds } from '../shared/components/Ads'\r\nimport * as tracking from '../shared/tracking'\r\nimport { Map } from './components/Map'\r\nimport { MapSelect } from './components/MapSelect'\r\nimport { MapTypeList } from './components/MapTypeList'\r\nimport { SearchInput, SearchResult, useSearch } from './components/Search'\r\nimport { Topbar } from './components/Topbar'\r\nimport { Expand } from './components/Topbar/Expand'\r\nimport { Share } from './components/Topbar/Share'\r\nimport { Zoom } from './components/Topbar/Zoom'\r\nimport { useMapData } from './hooks/use-map-data'\r\nimport { useMapType } from './hooks/use-map-type'\r\nimport Treemap from './treemap'\r\nimport { MapDataIndustry, MapDataNode, MapDataRoot, MapDataSector, MapSubtypeId, MapTypeId } from './types'\r\n\r\nconst linkClassName = 'text-blue-400 hover:text-white'\r\n\r\nexport interface MapInitProps {\r\n initData?: MapDataRoot\r\n cacheBuster: number\r\n generate?: boolean\r\n}\r\n\r\nfunction App(props: MapInitProps) {\r\n // Store the treemap itself here as we need it for some of the components\r\n const [treemap, setTreemap] = React.useState()\r\n const navigate = useNavigate()\r\n const { type, subtype } = useMapType()\r\n const mapData = useMapData(type.type, subtype.id, props.cacheBuster, props.initData, treemap)\r\n const search = useSearch(treemap)\r\n // Make sure all ads are refreshed on type/subtype change (page navigation)\r\n const hasInvestingChannelAds = useInvestingChannelAds([type, subtype])\r\n\r\n /**\r\n * Set new subtype to be false on perf data load so we don’t display loading state when fetching\r\n * new perf data for the same type\r\n */\r\n const [isNewSubtype, setIsNewSubtype] = React.useState(false)\r\n React.useEffect(() => {\r\n if (!mapData.perfDataQuery.isFetching) {\r\n setIsNewSubtype(false)\r\n }\r\n }, [mapData.perfDataQuery.isFetching])\r\n\r\n const isLoading = mapData.baseDataQuery.isLoading || mapData.perfDataQuery.isLoading\r\n const isFetchingNewPerf = isNewSubtype && !mapData.perfDataQuery.isLoading && mapData.perfDataQuery.isFetching\r\n\r\n const onNodeClick = React.useCallback(\r\n (_, node?: MapDataNode, industry?: MapDataIndustry, sector?: MapDataSector) => {\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 (type.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 = type.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 [type]\r\n )\r\n\r\n return (\r\n <>\r\n \r\n

    View

    \r\n \r\n \r\n \r\n }\r\n mapControls={\r\n treemap && (\r\n <>\r\n {mapData.data && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n \r\n \r\n )\r\n }\r\n >\r\n \r\n {type.description}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n

    Map Filter

    \r\n \r\n
    \r\n ({ label: subtype.name, value: subtype.id }))}\r\n onChange={(item) => {\r\n const newSubtype = type.subtypes.find((subtype) => subtype.id === item.value)\r\n if (newSubtype) {\r\n const query = new URLSearchParams(window.location.search)\r\n if (newSubtype.id === MapSubtypeId.DayPerf) {\r\n query.delete('st')\r\n } else {\r\n query.set('st', newSubtype.id)\r\n }\r\n\r\n setIsNewSubtype(true)\r\n const stringQuery = query.toString()\r\n navigate({ pathname: window.location.pathname, search: stringQuery }, { replace: true })\r\n tracking.trackPageView({ query: stringQuery })\r\n }\r\n }}\r\n />\r\n
    \r\n
    \r\n\r\n {treemap && (\r\n <>\r\n
    \r\n \r\n
    \r\n
      \r\n {search.results.map((result) => (\r\n \r\n ))}\r\n
    \r\n \r\n )}\r\n\r\n {hasInvestingChannelAds && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n\r\n \r\n
    \r\n \r\n {hasInvestingChannelAds && }\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n )\r\n}\r\n\r\nexport default App\r\n","import * as ReactDOM from 'react-dom'\r\n\r\nimport App, { MapInitProps } from './App'\r\nimport { MapContext } from './components/MapContext'\r\n\r\nwindow['FinvizInitCanvas'] = async function initCanvas(props: MapInitProps) {\r\n const root = document.getElementById('root')\r\n\r\n ReactDOM.render(\r\n \r\n \r\n ,\r\n root\r\n )\r\n}\r\n","import ReactDOM from 'react-dom'\r\n\r\nimport Canvas from './components/Canvas'\r\nimport { SettingsSmall, SettingsSmallGeo } from './constants/settings'\r\nimport Treemap from './treemap'\r\nimport { MapDataRoot, MapSubtypeId, MapTypeId, PerfData, ScaleId } from './types'\r\nimport * as mapUtils from './utils'\r\n\r\nconst CANVAS_WIDTH = 400\r\nconst CANVAS_HEIGHT_GEO = 235\r\nconst CANVAS_HEIGHT = 300\r\n\r\nwindow['FinvizInitIndexMaps'] = async function (props: {\r\n perfDataSec: PerfData\r\n perfDataGeo: PerfData\r\n cacheBuster: number\r\n baseData: {\r\n jsonSecData: MapDataRoot\r\n jsonGeoData: MapDataRoot\r\n }\r\n}) {\r\n let precomputedData\r\n try {\r\n precomputedData = await mapUtils.fetchBaseData('hp.json', props.cacheBuster)\r\n } catch {\r\n return\r\n }\r\n\r\n if (props.perfDataSec) {\r\n const initData = mapUtils.getMapData(precomputedData.sec, props.perfDataSec)\r\n const treemap = new Treemap({\r\n data: initData,\r\n width: CANVAS_WIDTH,\r\n height: CANVAS_HEIGHT,\r\n scaleId: ScaleId.DayPerf,\r\n countIndustryPerf: false,\r\n countSectorPerf: true,\r\n settings: SettingsSmall,\r\n type: MapTypeId.Sector,\r\n subtype: MapSubtypeId.DayPerf,\r\n isSmall: true,\r\n zoomLevels: [1],\r\n })\r\n\r\n window.FinvizIndexSecMap = treemap\r\n\r\n ReactDOM.render(\r\n ,\r\n document.getElementById('treemap-small')\r\n )\r\n }\r\n\r\n if (props.perfDataGeo) {\r\n const initData = mapUtils.getMapData(precomputedData.geo, props.perfDataGeo)\r\n const treemap = new Treemap({\r\n data: initData,\r\n width: CANVAS_WIDTH,\r\n height: CANVAS_HEIGHT_GEO,\r\n scaleId: ScaleId.DayPerf,\r\n countIndustryPerf: true,\r\n countSectorPerf: false,\r\n settings: SettingsSmallGeo,\r\n type: MapTypeId.World,\r\n subtype: MapSubtypeId.DayPerf,\r\n isSmall: true,\r\n zoomLevels: [1],\r\n })\r\n\r\n window.FinvizIndexGeoMap = treemap\r\n\r\n ReactDOM.render(\r\n ,\r\n document.getElementById('treemap-small-geo')\r\n )\r\n }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport * as tracking from '../tracking'\r\n\r\nexport const IC_PUBLISHER_ID = 'df0d0d52-cc7f-11e8-82a5-0abbb61c4a6a'\r\n\r\nenum AdTagName {\r\n IC_TickerInContent = 'IC_D_3x3',\r\n IC_MapsLeftRail = 'IC_D_125x125',\r\n IC_Statements = 'IC_D_300x60',\r\n IC_Groups = 'IC_D_300x250',\r\n}\r\n\r\nconst tagDefinition = {\r\n [AdTagName.IC_TickerInContent]: { placements: 3, style: { width: 970, minHeight: 250 } },\r\n [AdTagName.IC_MapsLeftRail]: { placements: 2, style: { width: 125, minHeight: 125 } },\r\n [AdTagName.IC_Statements]: { placements: 1, style: { width: 300, minHeight: 60 } },\r\n [AdTagName.IC_Groups]: { placements: 1, style: { width: 336, minHeight: 280 } },\r\n}\r\n\r\nconst hasInvestingChannelAds = tracking.getAdsProvider() === tracking.AdsProvider.InvestingChannel\r\n\r\n/**\r\n * Get create/destroy methods to control ads insertion\r\n */\r\nexport function getInvestingChannelPage() {\r\n var page: ICPageReturn\r\n\r\n function create() {\r\n try {\r\n if (hasInvestingChannelAds) {\r\n window.InvestingChannelQueue?.push(() => {\r\n page = window.InvestingChannel?.UAT.Run(IC_PUBLISHER_ID)\r\n })\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n }\r\n\r\n function destroy() {\r\n try {\r\n if (hasInvestingChannelAds) {\r\n window.InvestingChannelQueue?.push(() => {\r\n page?.destroy()\r\n })\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n }\r\n\r\n return { create, destroy }\r\n}\r\n\r\n/**\r\n * Hook which recreates ads on deps change (SPA navigation,…)\r\n */\r\nexport function useInvestingChannelAds(deps: unknown[] = []) {\r\n React.useLayoutEffect(() => {\r\n const page = getInvestingChannelPage()\r\n\r\n page.create()\r\n\r\n return () => page.destroy()\r\n // eslint cannot statically check the dependencies and complains about it\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, deps)\r\n\r\n return hasInvestingChannelAds\r\n}\r\n\r\ninterface AdTagProps extends Omit, 'name'> {\r\n /**\r\n * Name of the ad tag\r\n */\r\n name: keyof typeof AdTagName\r\n\r\n /**\r\n * Manually set the placement position for this tag\r\n *\r\n * @default 1\r\n */\r\n position?: number\r\n\r\n /**\r\n * Additional class names for the wrapper div\r\n */\r\n className?: string\r\n}\r\n\r\nexport function AdTag({ name, position = 1, ...props }: AdTagProps) {\r\n const tagName = AdTagName[name]\r\n const tagProps = tagDefinition[tagName]\r\n const placementName = `${tagName}_${Math.min(Math.max(position, 1), tagProps.placements)}`\r\n\r\n if (!hasInvestingChannelAds) return null\r\n\r\n return
    \r\n}\r\n","/* eslint-disable import/first */\r\nimport * as React from 'react'\r\nimport { UseMutationResult } from 'react-query'\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 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\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 close the dialog and try again.\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 logoBase64 from './assets/logo.png'\r\nimport { getTextFontFamily } from './getTextFontFamily'\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')!\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","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 * as Sentry from '@sentry/browser'\r\nimport { ReactNode, useEffect } from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\n\r\nimport { link } from '../services/routing'\r\nimport { Button } from './button'\r\nimport { Heading, Paragraph } from './typography'\r\n\r\ninterface ErrorViewProps {\r\n /**\r\n * Title of the message\r\n */\r\n title?: ReactNode\r\n\r\n /**\r\n * Body text\r\n */\r\n message?: ReactNode\r\n\r\n /**\r\n * Show contact support text under the message\r\n *\r\n * @default true\r\n */\r\n showContact?: boolean\r\n\r\n /**\r\n * Show refresh page button under the text\r\n *\r\n * @default true\r\n */\r\n showRefresh?: boolean\r\n}\r\n\r\nexport function ErrorView({ title, message, showContact = true, showRefresh = true }: ErrorViewProps) {\r\n return (\r\n
    \r\n {title}\r\n {message}\r\n\r\n {showContact && (\r\n \r\n Our development team has been notified of this. If the error persists, please{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n )}\r\n\r\n {showRefresh && (\r\n \r\n )}\r\n
    \r\n )\r\n}\r\n\r\nexport function DefaultErrorBoundary(props: FallbackProps) {\r\n useEffect(() => {\r\n Sentry.captureException(props.error)\r\n }, [props.error])\r\n\r\n return \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"],"names":["MapContext","props","fallback","className","BrowserRouter","children","filterItems","stocks","input","filter","stock","name","indexOf","description","toUpperCase","sort","a","b","slice","useSearch","treemap","value","setValue","React","results","setResults","nodes","onInputChange","event","target","onItemClick","node","cx","x","dx","cy","y","dy","diffX","width","diffY","height","MapActionCreators","getLastZoomLevel","onResultMouseLeave","undefined","SearchInput","Input","theme","rounding","placeholder","leftContent","onChange","SearchResult","result","onClick","onMouseLeave","Button","size","classnames","contentClass","Expand","onExpand","document","body","classList","contains","EXPANDED_MAP_BODY_CLASSS","remove","window","gtag","event_category","add","updatedLayout","mapUtils","data","type","settings","layoutOptions","zoom","scale","mapActionCreators","scrollTo","isMobile","isIpad","Share","uploadImage","useMutation","api","onShareClick","async","canvas","mapStore","drawShareMap","mapType","subtype","getFormattedDateString","mutate","state","Topbar","navContent","mapControls","useMapData","cacheBuster","mapBaseData","fetchBaseData","fetchPerfData","queryClient","useQueryClient","dataVersion","prevType","perfData","setQueryData","current","baseDataQuery","useQuery","queryKey","queryFn","initialData","cacheTime","Infinity","staleTime","perfDataQuery","keepPreviousData","refetchInterval","MAP_DATA_FETCH_INTERVAL","onSuccess","version","location","reload","restoredData","useMapType","query","URLSearchParams","useLocation","search","typeFromQuery","get","subtypeFromQuery","MAP_TYPES","t","subtypes","find","id","MapTypeList","linkClass","linkClassName","map","isActiveTreemap","activeType","activeSubtype","MapSubtypeId","append","NavLink","to","title","pageTitle","tracking","isLoading","Delayed","Spinner","setTreemap","navigate","useNavigate","mapData","initData","hasInvestingChannelAds","useInvestingChannelAds","isNewSubtype","setIsNewSubtype","isFetching","isFetchingNewPerf","onNodeClick","_","industry","sector","open","set","ScreenerQuery","ScreenerView","MapTypeId","tickers","flatMap","length","join","replace","toLowerCase","as","href","Zoom","Paragraph","MapSelect","buttonContent","items","label","item","newSubtype","delete","stringQuery","toString","pathname","Search","inputClass","position","ErrorBoundary","resetKeys","FallbackComponent","DefaultErrorBoundary","Map","isLoadingTreemap","isLoadingData","root","getElementById","ReactDOM","precomputedData","perfDataSec","sec","Treemap","scaleId","ScaleId","countIndustryPerf","countSectorPerf","SettingsSmall","isSmall","zoomLevels","FinvizIndexSecMap","Canvas","tooltip","hover","legend","alt","perfDataGeo","geo","SettingsSmallGeo","FinvizIndexGeoMap","AdTagName","tagDefinition","IC_TickerInContent","placements","style","minHeight","IC_MapsLeftRail","IC_Statements","IC_Groups","getInvestingChannelPage","page","create","InvestingChannelQueue","push","InvestingChannel","UAT","Run","e","console","error","destroy","deps","AdTag","tagName","tagProps","placementName","Math","min","max","dialogState","useDialogState","DialogTrigger","Dialog","DialogHeader","onCloseClick","hide","DialogBody","ShareDialogBody","isError","DialogFooter","showRefresh","message","src","imgUrl","CopyToClipboard","Heading","level","text","shareUrl","bottomLeftContent","url","round","via","canvasEl","fontFamily","getTextFontFamily","ratio","getScaleRatio","createElement","context","getContext","fillStyle","fillRect","logo","loadImage","logoBase64","drawImage","textBaseline","textAlign","font","i","textWidth","measureText","fillText","divider","toDataURL","AdsProvider","getAdsProvider","FinvizSettings","hasUserPremium","None","adsProvider","Freestar","trackPageView","freestarPageView","freestar","queue","trackPageview","ErrorView","showContact","link","useEffect","Sentry","Loading","delay","timeout","throwOnTimeout","delayComponent","timeoutComponent","LoadingScreen"],"sourceRoot":""}