{"version":3,"file":"map.08dfe256.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/parseJSONFromScript.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\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(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 { 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, { width: generator.width, height: generator.height, data: layout })\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 * 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 { 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 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 { 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 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: () => 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 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 { AdTag, useInvestingChannelAds } from '../shared/components/Ads'\r\nimport * as tracking from '../shared/tracking'\r\nimport { Map, useMapContext } from './components/Map'\r\nimport { MapSelect } from './components/MapSelect'\r\nimport { MapTypeList } from './components/MapTypeList'\r\nimport { SearchInput, SearchResult, useSearch } from './components/Search'\r\nimport { Topbar } from './components/Topbar'\r\nimport { Expand } from './components/Topbar/Expand'\r\nimport { Share } from './components/Topbar/Share'\r\nimport { Zoom } from './components/Topbar/Zoom'\r\nimport { useMapData } from './hooks/use-map-data'\r\nimport { useMapType } from './hooks/use-map-type'\r\nimport { MapDataRoot, MapSubtypeId } from './types'\r\nimport * as mapUtils from './utils'\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 const { treemap } = useMapContext()\r\n const navigate = useNavigate()\r\n const { type, subtype } = useMapType()\r\n const mapData = useMapData(type.type, subtype.id, props.cacheBuster, props.initData)\r\n const search = useSearch()\r\n // Make sure all ads are refreshed on type/subtype change (page navigation)\r\n const hasInvestingChannelAds = useInvestingChannelAds([type, subtype])\r\n\r\n /**\r\n * Set new subtype to be false on perf data load so we don’t display loading state when fetching\r\n * new perf data for the same type\r\n */\r\n const [isNewSubtype, setIsNewSubtype] = React.useState(false)\r\n React.useEffect(() => {\r\n if (!mapData.perfDataQuery.isFetching) {\r\n setIsNewSubtype(false)\r\n }\r\n }, [mapData.perfDataQuery.isFetching])\r\n\r\n const isLoadingInitialBaseData = !mapData.baseDataQuery.isPreviousData && mapData.baseDataQuery.isLoading\r\n const isLoadingInitialPerf = !mapData.perfDataQuery.isPreviousData && mapData.perfDataQuery.isLoading\r\n const isInitialLoading = isLoadingInitialBaseData || isLoadingInitialPerf\r\n const isFetchingNewPerf = isNewSubtype && !mapData.perfDataQuery.isLoading && mapData.perfDataQuery.isFetching\r\n\r\n return (\r\n <>\r\n \r\n

    View

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

    Map Filter

    \r\n \r\n
    \r\n ({ 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
    \r\n \r\n
    \r\n
      \r\n {search.results.map((result) => (\r\n \r\n ))}\r\n
    \r\n\r\n {hasInvestingChannelAds && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n\r\n \r\n
    \r\n \r\n {hasInvestingChannelAds && }\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n )\r\n}\r\n\r\nexport default App\r\n","import * as ReactDOM from 'react-dom'\r\n\r\nimport App, { MapInitProps } from './App'\r\nimport { MapContext } from './components/MapContext'\r\n\r\nwindow['FinvizInitCanvas'] = async function initCanvas(props: MapInitProps) {\r\n const root = document.getElementById('root')\r\n\r\n ReactDOM.render(\r\n \r\n \r\n ,\r\n root\r\n )\r\n}\r\n","import ReactDOM from 'react-dom'\r\n\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport Canvas from './components/Canvas'\r\nimport { SettingsSmall, SettingsSmallGeo } from './constants/settings'\r\nimport Treemap from './treemap'\r\nimport { 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\nasync function renderTreemaps(props: { perfDataSec: PerfData; perfDataGeo: PerfData; cacheBuster: number }) {\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\r\nconst mapProps = parseJSONFromScript<{ perfDataSec: PerfData; perfDataGeo: PerfData; cacheBuster: number }>('map-data')\r\nif (mapProps) renderTreemaps(mapProps)\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 function parseJSONFromScript(id: string, doc: Document = document): T | null {\r\n const el = doc.getElementById(id)\r\n const isValidElement = el && el.tagName === 'SCRIPT' && el.getAttribute('type') === 'application/json'\r\n\r\n if (!isValidElement) return null\r\n\r\n try {\r\n return JSON.parse(el.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return null\r\n }\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","import * 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","useMapContext","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","generator","onExpand","data","document","body","classList","contains","EXPANDED_MAP_BODY_CLASSS","remove","window","gtag","event_category","add","containerElement","getElementById","mapUtils","type","isSmall","zoom","scale","layout","getLayout","showETF","layoutOptions","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","navigate","useNavigate","mapData","initData","hasInvestingChannelAds","useInvestingChannelAds","isNewSubtype","setIsNewSubtype","isFetching","isLoadingInitialBaseData","isPreviousData","isLoadingInitialPerf","isInitialLoading","isFetchingNewPerf","as","href","Zoom","Paragraph","MapSelect","buttonContent","items","label","item","newSubtype","delete","set","stringQuery","toString","pathname","replace","Search","inputClass","position","ErrorBoundary","resetKeys","FallbackComponent","DefaultErrorBoundary","Map","isFetchingPerf","isLoadingData","onNodeClick","root","ReactDOM","mapProps","parseJSONFromScript","precomputedData","perfDataSec","sec","Treemap","scaleId","ScaleId","countIndustryPerf","countSectorPerf","settings","SettingsSmall","MapTypeId","zoomLevels","FinvizIndexSecMap","Canvas","tooltip","hover","legend","alt","perfDataGeo","geo","SettingsSmallGeo","FinvizIndexGeoMap","renderTreemaps","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","length","textWidth","measureText","fillText","divider","toDataURL","doc","el","isValidElement","getAttribute","JSON","parse","textContent","Sentry","captureException","AdsProvider","getAdsProvider","FinvizSettings","hasUserPremium","None","adsProvider","Freestar","trackPageView","freestarPageView","freestar","queue","trackPageview","ErrorView","showContact","link","useEffect","Loading","delay","timeout","throwOnTimeout","delayComponent","timeoutComponent","LoadingScreen"],"sourceRoot":""}