{"version":3,"file":"home.5498f4b0.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/home/market_sentiment.tsx","webpack://@finviz/website/./js/app/home/refresh.ts","webpack://@finviz/website/./js/app/home/indices-data.ts","webpack://@finviz/website/./js/app/home/signals-switch/types.ts","webpack://@finviz/website/./js/app/home/signals-switch/EliteSwitch.tsx","webpack://@finviz/website/./js/app/home/signals-switch/FreeSwitch.tsx","webpack://@finviz/website/./js/app/home/signals-switch/index.tsx","webpack://@finviz/website/./js/app/home/index.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/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/types.ts","webpack://@finviz/website/./js/app/maps/utils.ts","webpack://@finviz/website/./js/app/screener/utils.ts","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/isStockFastRefreshAvailable.ts","webpack://@finviz/website/./js/app/shared/parseJSONFromScript.ts","webpack://@finviz/website/./js/main/components/delayed.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/../node_modules/flux/index.js","webpack://@finviz/website/../node_modules/flux/lib/Dispatcher.js","webpack://@finviz/website/../node_modules/flux/lib/invariant.js","webpack://@finviz/website/../node_modules/keymirror/index.js","webpack://@finviz/website/../node_modules/react-router-dom/dist/index.js"],"sourcesContent":["import { Component, MouseEvent } from 'react'\r\nimport ReactDOM from 'react-dom'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../main/services/api'\r\nimport { Instrument } from '../../main/types'\r\nimport {\r\n ChartElementType,\r\n ChartLayout,\r\n LayoutType,\r\n Quote,\r\n RootChartConfigObject,\r\n ScaleType,\r\n TIMEFRAME,\r\n Theme,\r\n} from '../charts-lib'\r\n\r\nconst ticker = 'market_sentiment'\r\n\r\ninterface MarketSentimentProps {}\r\n\r\nconst MARKET_SENTIMENT_WIDTH_PX = 160\r\nconst MARKET_SENTIMENT_HEIGHT_PX = 40\r\nconst marketSentimentChartConfig: RootChartConfigObject = {\r\n layout: LayoutType['1h1v'],\r\n theme: FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light,\r\n width: MARKET_SENTIMENT_WIDTH_PX,\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n charts: [\r\n {\r\n width: MARKET_SENTIMENT_WIDTH_PX,\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n timeframe: TIMEFRAME.i3,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n instrument: Instrument.MarketSentiment,\r\n refreshData: false,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n stretch: true,\r\n panes: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n elements: [\r\n {\r\n type: ChartElementType.MarketSentiment,\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n\r\ninterface MarketSentimentState {\r\n loading: boolean\r\n enabled: boolean\r\n chartConfig: RootChartConfigObject | null\r\n}\r\n\r\nclass MarketSentiment extends Component {\r\n state: MarketSentimentState = {\r\n loading: true,\r\n enabled: false,\r\n chartConfig: null,\r\n }\r\n\r\n _timer: number | null = null\r\n _lastRequest: CancelablePromise | null = null\r\n\r\n componentDidMount() {\r\n this._fetchData('', () => {\r\n this.setState({ chartConfig: marketSentimentChartConfig })\r\n })\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this._timer !== null) {\r\n this._lastRequest?.cancel?.()\r\n clearTimeout(this._timer)\r\n }\r\n }\r\n\r\n render() {\r\n const { loading, enabled, chartConfig } = this.state\r\n\r\n return (\r\n \r\n \r\n \r\n Click BULL for positive market sentiment
Click BEAR for negative market sentiment] offsetx=[-200] offsety=[20] delay=[100]\">\r\n {chartConfig && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n \r\n this._vote(e, 'bull')}\r\n >\r\n Bull\r\n \r\n \r\n this._vote(e, 'bear')}\r\n >\r\n Bear\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n _vote(e: MouseEvent, sentiment: string) {\r\n e.preventDefault()\r\n this.setState({ enabled: false })\r\n this._fetchData('?b=' + sentiment, undefined, false)\r\n }\r\n\r\n _fetchData = async (urlQuery = '', callback?: Function, setTimer = true) => {\r\n if (setTimer && this._timer !== null) clearTimeout(this._timer)\r\n\r\n if (document.hidden) {\r\n // console.log(`${+new Date()} Document is hidden, canceling refresh`)\r\n if (setTimer) this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), 1000)\r\n return\r\n }\r\n\r\n // console.log(`${+new Date()} Document is visible, refreshing`)\r\n\r\n this._lastRequest = apiRequest(`/api/market_sentiment.ashx${urlQuery}`)\r\n const json = await this._lastRequest\r\n if (json) {\r\n const quoteData = getData(json)\r\n const quote = Quote.findByAttribute('ticker', ticker)\r\n if (quote) {\r\n Quote.findByAttribute('ticker', ticker)!.updateAttributes(getData(json))\r\n } else {\r\n Quote.create(quoteData).save()\r\n }\r\n callback?.()\r\n\r\n this.setState({\r\n loading: false,\r\n enabled: json.enabled,\r\n })\r\n }\r\n\r\n if (setTimer) {\r\n this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), (json?.refresh ?? 30) * 1000)\r\n }\r\n }\r\n}\r\n\r\ninterface QuoteData {\r\n refresh: number\r\n enabled: boolean\r\n sum: number[]\r\n weight: number[]\r\n time: string\r\n visibleMinutes: number\r\n}\r\n\r\nfunction getData(data: QuoteData) {\r\n return {\r\n close: data.sum,\r\n volume: data.weight,\r\n date: Array.from('1'.repeat(data.sum.length)).map((x) => parseInt(x, 10)),\r\n ticker: ticker,\r\n timeframe: 'i3',\r\n instrument: 'market_sentiment',\r\n premarket: false,\r\n aftermarket: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: data.visibleMinutes,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nfunction mount() {\r\n const el = document.getElementById('js-market-sentiment')\r\n if (el) {\r\n ReactDOM.render(, el)\r\n }\r\n}\r\n\r\nfunction unmount() {\r\n const el = document.getElementById('js-market-sentiment')\r\n if (el) {\r\n ReactDOM.unmountComponentAtNode(el)\r\n }\r\n}\r\n\r\nmount()\r\n\r\nexport { mount, unmount }\r\n","import { ContentType, apiRequest } from '../../main/services/api'\r\nimport { mapPerf } from '../maps/services/api'\r\nimport mapActionCreators from '../maps/store/action-creators'\r\nimport { MapSubtypeId, MapTypeId } from '../maps/types'\r\nimport { getMapsRefreshInterval } from '../maps/utils'\r\nimport { intervalCallbackOnWindowVisible } from '../shared/documentVisibility'\r\nimport { isStockFastRefreshAvailable } from '../shared/isStockFastRefreshAvailable'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { Indices, updateIndices } from './indices-data'\r\n\r\ninterface RefreshInfo {\r\n userId: string\r\n version: number\r\n interval: number\r\n hasGeoMaps: boolean\r\n}\r\n\r\nconst refreshInfo = parseJSONFromScript('refresh-init')\r\n\r\nfunction refreshPage(newDocument: Document) {\r\n // Replace market stats\r\n const oldMarketStats = document.getElementsByClassName('market-stats')\r\n const newMarketStats = newDocument.getElementsByClassName('market-stats')\r\n if (oldMarketStats.length === newMarketStats.length) {\r\n Array.from(oldMarketStats).forEach((_, index) => {\r\n const oldElement = oldMarketStats.item(index)\r\n const newElement = newMarketStats.item(index)\r\n if (oldElement && newElement) {\r\n oldElement.innerHTML = newElement.innerHTML\r\n }\r\n })\r\n }\r\n\r\n replaceSignalTables(newDocument)\r\n\r\n // Replace bottom\r\n const oldHomepageBottom = document.getElementById('js-homepage_bottom')\r\n const newHomepageBottom = newDocument.getElementById('js-homepage_bottom')\r\n if (oldHomepageBottom && newHomepageBottom) {\r\n oldHomepageBottom.innerHTML = newHomepageBottom.innerHTML\r\n }\r\n\r\n if (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n import(/* webpackChunkName: \"recent_quotes\" */ '../shared/recent_quotes').then(({ RenderRecentQuotes }) => {\r\n RenderRecentQuotes()\r\n })\r\n }\r\n\r\n // Send refresh event to google analytics\r\n window.gtag?.('event', 'refresh', { event_category: 'page' })\r\n // Refresh any ads that might be on the page\r\n if (window.finvizBannersLoaded === true) {\r\n window.initFinvizBanners?.()\r\n } else if (typeof window.refreshAds === 'function') {\r\n window.refreshAds('#js-homepage_bottom [id*=IC_D_]')\r\n }\r\n}\r\n\r\nexport function replaceSignalTables(newDocument: Document) {\r\n // Replace left signals table\r\n const oldSignalsLeft = document.getElementById('js-signals_1')\r\n const newSignalsLeft = newDocument.getElementById('js-signals_1')\r\n if (oldSignalsLeft && newSignalsLeft) {\r\n oldSignalsLeft.innerHTML = newSignalsLeft.innerHTML\r\n }\r\n\r\n // Replace right signals table\r\n const oldSignalsRight = document.getElementById('js-signals_2')\r\n const newSignalsRight = newDocument.getElementById('js-signals_2')\r\n if (oldSignalsRight && newSignalsRight) {\r\n oldSignalsRight.innerHTML = newSignalsRight.innerHTML\r\n }\r\n}\r\n\r\nexport async function getRefreshData() {\r\n const data = await apiRequest(window.location.pathname, {\r\n headers: {\r\n 'Content-Type': ContentType.Html,\r\n 'X-Is-Ajax-Request': 'true',\r\n 'X-Theme': FinvizSettings.hasDarkTheme ? 'dark' : FinvizSettings.hasRedesignEnabled ? 'light' : 'legacy',\r\n },\r\n })\r\n\r\n if (!data) return undefined\r\n\r\n const newDocument = new DOMParser().parseFromString(data, 'text/html')\r\n const newRefreshInfo = parseJSONFromScript('refresh-init', newDocument)\r\n\r\n if (!refreshInfo || !newRefreshInfo || refreshInfo.userId !== newRefreshInfo.userId) return undefined\r\n\r\n if (refreshInfo.version !== newRefreshInfo.version) {\r\n window.location.reload()\r\n }\r\n\r\n return newDocument\r\n}\r\n\r\nfunction initRefresh(interval: number) {\r\n intervalCallbackOnWindowVisible(interval, async function handleRefresh() {\r\n const newDocument = await getRefreshData()\r\n\r\n if (newDocument) {\r\n refreshPage(newDocument)\r\n }\r\n })\r\n}\r\n\r\nenum IndicesPollingIntervalInMs {\r\n Default = 3000,\r\n Reduced = 60000,\r\n Free = 180000,\r\n}\r\n\r\nif (refreshInfo?.interval) {\r\n initRefresh(refreshInfo.interval * 1000)\r\n\r\n function getIndicesRefreshInterval() {\r\n if (!FinvizSettings.hasUserPremium) {\r\n return IndicesPollingIntervalInMs.Free\r\n }\r\n if (!isStockFastRefreshAvailable(false, false)) {\r\n return IndicesPollingIntervalInMs.Reduced\r\n }\r\n\r\n return IndicesPollingIntervalInMs.Default\r\n }\r\n\r\n intervalCallbackOnWindowVisible(getIndicesRefreshInterval, async function handleRefresh() {\r\n const newIndicesData = await apiRequest('/api/indices_data.ashx')\r\n\r\n if (newIndicesData) {\r\n updateIndices(newIndicesData)\r\n }\r\n })\r\n\r\n intervalCallbackOnWindowVisible(getMapsRefreshInterval, async function handleRefresh() {\r\n const perfDataSecReq = mapPerf(MapTypeId.Sector, MapSubtypeId.DayPerf)\r\n const perfDataGeoReq = refreshInfo.hasGeoMaps ? mapPerf(MapTypeId.World, MapSubtypeId.DayPerf) : null\r\n\r\n const [perfDataSec, perfDataGeo] = await Promise.all([perfDataSecReq, perfDataGeoReq])\r\n\r\n try {\r\n if (perfDataSec) {\r\n if (window.FinvizIndexSecMap.version !== perfDataSec.version) {\r\n window.location.reload()\r\n }\r\n mapActionCreators.updatePerfData(window.FinvizIndexSecMap, perfDataSec)\r\n }\r\n\r\n if (perfDataGeo) {\r\n if (window.FinvizIndexGeoMap.version !== perfDataGeo.version) {\r\n window.location.reload()\r\n }\r\n mapActionCreators.updatePerfData(window.FinvizIndexGeoMap, perfDataGeo)\r\n }\r\n } catch {}\r\n })\r\n}\r\n","import { Quote } from '../charts-lib'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\ninterface Index {\r\n ticker: string\r\n timeframe: string\r\n volume: number[]\r\n date: number[]\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n lastOpen: null\r\n lastHigh: null\r\n lastLow: null\r\n lastClose: number\r\n lastVolume: null\r\n lastDate: number\r\n prevClose: number\r\n afterClose: null\r\n afterChange: null\r\n relativeVolume: number\r\n}\r\n\r\nexport type Indices = Record\r\n\r\nexport function getData(index: string, ticker: string, indices: Indices) {\r\n return {\r\n ...indices[index],\r\n ticker: ticker, // use text?\r\n timeframe: 'i10',\r\n instrument: 'stock',\r\n premarket: false,\r\n aftermarket: false,\r\n hasChartEvents: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: 390,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nexport function updateIndices(indices: Indices) {\r\n const dowQ = Quote.findByAttribute('ticker', 'DOW')\r\n if (dowQ) dowQ.updateAttributes(getData('^DJI', 'DOW', indices))\r\n\r\n const nasdaqQ = Quote.findByAttribute('ticker', 'NASDAQ')\r\n if (nasdaqQ) nasdaqQ.updateAttributes(getData('^IXIC', 'NASDAQ', indices))\r\n\r\n const sap500Q = Quote.findByAttribute('ticker', 'S&P 500')\r\n if (sap500Q) sap500Q.updateAttributes(getData('^GSPC', 'S&P 500', indices))\r\n\r\n const rutQ = Quote.findByAttribute('ticker', 'RUSSELL 2000')\r\n if (rutQ) rutQ.updateAttributes(getData('^RUT', 'RUSSELL 2000', indices))\r\n\r\n if (!dowQ || !nasdaqQ || !sap500Q || !rutQ) {\r\n // Temporary code below\r\n // additional info gaining for https://finvizcom.sentry.io/issues/3963831382/?project=33153&referrer=issue-stream&statsPeriod=14d&stream_index=0\r\n window.Sentry?.captureMessage('indices-data.ts updateIndices', {\r\n extra: {\r\n allAvailableTickers: Quote.all()\r\n .reduce((acc: string[], cur: { ticker: string }) => {\r\n acc.push(cur.ticker)\r\n return acc\r\n }, [])\r\n .join(','),\r\n },\r\n })\r\n }\r\n}\r\n","export enum HPSignalInterval {\r\n intraday = 'intraday',\r\n daily = 'daily',\r\n}\r\n\r\nexport const HP_SIGNAL_LABELS: Record = {\r\n [HPSignalInterval.intraday]: 'Intraday',\r\n [HPSignalInterval.daily]: 'Daily',\r\n}\r\nexport const HP_SIGNAL_COOKIE = 'signalsInterval'\r\nexport const HP_SIGNAL_SWITCH_RENDER_SELECTOR = 'js-switches-root'\r\n","import classNames from 'classnames'\r\n\r\nimport { Icon, Select, SelectOption } from '../../../main/components'\r\nimport { HPSignalInterval, HP_SIGNAL_LABELS } from './types'\r\n\r\nconst IS_REDESIGN = FinvizSettings.hasRedesignEnabled\r\nconst OPTIONS = Object.entries(HP_SIGNAL_LABELS).map(([value, label]) => ({ value: value as HPSignalInterval, label }))\r\nconst ROUNDING = IS_REDESIGN ? undefined : 'none'\r\n\r\ntype EliteSwitchProps = {\r\n isLoading: boolean\r\n signal: HPSignalInterval\r\n onSignalChange: (signals: HPSignalInterval) => void\r\n}\r\n\r\nexport default function EliteSwitch({ isLoading, signal, onSignalChange }: EliteSwitchProps) {\r\n return (\r\n option.value === signal)}\r\n rightContent={}\r\n onChange={({ value }) => {\r\n onSignalChange(value)\r\n }}\r\n placement=\"bottom-end\"\r\n orientation=\"horizontal\"\r\n isLoading={isLoading}\r\n disabled={isLoading}\r\n gutter={IS_REDESIGN ? 0 : 1}\r\n // override height defined by button to not stretch old hp signal tables\r\n style={IS_REDESIGN ? undefined : { height: 'auto' }}\r\n >\r\n {OPTIONS.map((item) => (\r\n \r\n {item.label}\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button, Icon, Paragraph } from '../../../main/components'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../../../main/components/popover'\r\nimport { HPSignalInterval, HP_SIGNAL_LABELS } from './types'\r\n\r\nconst IS_REDESIGN = FinvizSettings.hasRedesignEnabled\r\n\r\nexport default function FreeSwitch() {\r\n const state = usePopoverState({\r\n placement: 'bottom-end',\r\n unstable_offset: IS_REDESIGN ? [0, 0] : [1, 1],\r\n })\r\n\r\n return (\r\n <>\r\n {IS_REDESIGN ? (\r\n \r\n {HP_SIGNAL_LABELS[HPSignalInterval.daily]}\r\n \r\n ) : (\r\n \r\n {HP_SIGNAL_LABELS[HPSignalInterval.daily]}\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n Get access to intraday data with Finviz*Elite.\r\n \r\n \r\n Subscribe\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\n\r\nimport { setCookieRequest } from '../../../main/services/api'\r\nimport { getCookie } from '../../shared/cookie'\r\nimport { getRefreshData, replaceSignalTables } from '../refresh'\r\nimport EliteSwitch from './EliteSwitch'\r\nimport FreeSwitch from './FreeSwitch'\r\nimport { HPSignalInterval, HP_SIGNAL_COOKIE } from './types'\r\n\r\nconst HEADER_SWITCH_SELECTOR = '.js-signal-switch'\r\nconst SWITCH_BUTTON_SELECTOR = '.js-signal-switch-button'\r\nconst signalSwitchesElements = Array.from(document.querySelectorAll(HEADER_SWITCH_SELECTOR))\r\n\r\nfunction getSignalsCookie() {\r\n const value = getCookie(HP_SIGNAL_COOKIE)\r\n let signal = HPSignalInterval.daily\r\n const castedValue = value as HPSignalInterval\r\n\r\n if (FinvizSettings.hasUserPremium && !!castedValue) signal = castedValue\r\n return signal\r\n}\r\n\r\nasync function handleSignalIntervalChange() {\r\n const newDocument = await getRefreshData()\r\n if (newDocument) {\r\n replaceSignalTables(newDocument)\r\n } else {\r\n document.location.reload()\r\n }\r\n}\r\n\r\nexport default function HomepageSignals() {\r\n const [signal, setSignal] = React.useState(getSignalsCookie())\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n // remove inlined buttons from html template\r\n document.querySelectorAll(SWITCH_BUTTON_SELECTOR).forEach((element) => {\r\n element.remove()\r\n })\r\n }, [])\r\n\r\n const handleSignalChange = async (changedSignal: HPSignalInterval) => {\r\n if (changedSignal !== signal) {\r\n setSignal(changedSignal)\r\n setIsLoading(true)\r\n try {\r\n await setCookieRequest(HP_SIGNAL_COOKIE, changedSignal)\r\n await handleSignalIntervalChange().catch()\r\n } catch {\r\n setSignal(signal)\r\n }\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {signalSwitchesElements.map((element) =>\r\n ReactDOM.createPortal(\r\n FinvizSettings.hasUserPremium ? (\r\n \r\n ) : (\r\n \r\n ),\r\n element\r\n )\r\n )}\r\n \r\n )\r\n}\r\n","import ReactDOM from 'react-dom'\r\n\r\nimport { SpecificChartFunctionality } from '../../main/constants'\r\nimport {\r\n ChartElementType,\r\n ChartLayout,\r\n Instrument,\r\n LayoutType,\r\n Quote,\r\n ScaleType,\r\n TIMEFRAME,\r\n Theme,\r\n} from '../charts-lib'\r\nimport { getCustomColorsFromCookies } from '../shared/chartLayoutConfig'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { ready } from '../shared/ready'\r\nimport type { Indices } from './indices-data'\r\nimport { getData } from './indices-data'\r\nimport './market_sentiment'\r\nimport './refresh'\r\nimport SignalIntervalSwitch from './signals-switch'\r\nimport { HP_SIGNAL_SWITCH_RENDER_SELECTOR } from './signals-switch/types'\r\n\r\nif (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n import(/* webpackChunkName: \"recent_quotes\" */ '../shared/recent_quotes').then(({ RenderRecentQuotes }) => {\r\n RenderRecentQuotes()\r\n })\r\n}\r\n\r\nfunction getChartConfig(ticker: string) {\r\n return {\r\n layout: LayoutType['1h1v'],\r\n width: 320,\r\n height: 190,\r\n barWidth: 3,\r\n barMargin: 1,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n colors: getCustomColorsFromCookies(),\r\n specificChartFunctionality: SpecificChartFunctionality.smallIndex,\r\n theme: FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light,\r\n charts: [\r\n {\r\n width: 0,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n height: 190,\r\n timeframe: TIMEFRAME.i10,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n // leftOffset: 0,\r\n instrument: Instrument.Stock,\r\n refreshData: false,\r\n // stretch: true,\r\n panes: [\r\n {\r\n height: 190,\r\n elements: [\r\n {\r\n type: ChartElementType.CandleStick,\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nfunction renderChart({ ticker, element }: { ticker: string; element: HTMLElement | null }) {\r\n if (element) {\r\n ReactDOM.render(\r\n
\r\n \r\n
,\r\n element\r\n )\r\n }\r\n}\r\n\r\nfunction renderSignalIntervalSwitch() {\r\n const signalSwitches = document.getElementById(HP_SIGNAL_SWITCH_RENDER_SELECTOR)\r\n\r\n if (signalSwitches) {\r\n ReactDOM.render(, signalSwitches)\r\n }\r\n}\r\n\r\nready(function () {\r\n const indices = parseJSONFromScript('js-indices')!\r\n\r\n Quote.create(getData('^DJI', 'DOW', indices)).save()\r\n Quote.create(getData('^IXIC', 'NASDAQ', indices)).save()\r\n Quote.create(getData('^GSPC', 'S&P 500', indices)).save()\r\n Quote.create(getData('^RUT', 'RUSSELL 2000', indices)).save()\r\n\r\n renderChart({ ticker: 'DOW', element: document.getElementById('dow') })\r\n renderChart({ ticker: 'NASDAQ', element: document.getElementById('nasdaq') })\r\n renderChart({ ticker: 'S&P 500', element: document.getElementById('sp500') })\r\n renderChart({ ticker: 'RUSSELL 2000', element: document.getElementById('rut') })\r\n\r\n renderSignalIntervalSwitch()\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. Stock 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_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 * 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) {\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).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) {\r\n return this._generateLayout(data, constants.ORDER_SCREENER, 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","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","import { SpecificChartFunctionality } from '../../main/constants'\r\nimport { ChartConfigChartPaneElement, Instrument, LayoutType, ScaleType, TIMEFRAME, Theme } from '../charts-lib'\r\nimport { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps extends ChartConfigChartPaneElement {\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n width?: number\r\n height?: number\r\n ticker: string\r\n timeframe: TIMEFRAME\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n theme?: Theme\r\n colors?: ReturnType\r\n refreshData?: boolean\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n width = 800,\r\n height = 400,\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n theme,\r\n colors = getCustomColorsFromCookies(),\r\n refreshData = false,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: LayoutType['1h1v'],\r\n width,\r\n height,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n theme,\r\n colors,\r\n charts: [\r\n {\r\n width: 0,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n height,\r\n timeframe,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: Instrument.Stock,\r\n refreshData,\r\n stretch: true,\r\n panes: [\r\n {\r\n height,\r\n elements: paneElements,\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n try {\r\n return JSON.parse(getParsedCookies('customColors') as string)\r\n } catch {\r\n return undefined\r\n }\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 function parseJSONFromScript(id: string, doc: Document = document): T | null {\r\n const el = doc.getElementById(id)\r\n const isValidElement = el && el.tagName === 'SCRIPT' && el.getAttribute('type') === 'application/json'\r\n\r\n if (!isValidElement) {\r\n window.Sentry?.captureMessage('parseJSONFromScript', {\r\n extra: {\r\n el: el ? 'yes' : 'no',\r\n tagName: el?.tagName,\r\n type: el?.getAttribute('type'),\r\n },\r\n })\r\n }\r\n\r\n if (!isValidElement) return null\r\n\r\n try {\r\n return JSON.parse(el.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return null\r\n }\r\n}\r\n","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 * 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 * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\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 [isOpen, setIsOpen] = React.useState(false)\r\n const [notification, setNotification] = React.useState(null)\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 setIsOpen(true)\r\n },\r\n hide: () => setIsOpen(false),\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 : Ariakit.Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {isOpen && (\r\n \r\n \r\n {notification?.element}\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 * as Ariakit from '@ariakit/react'\r\nimport 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: number\r\n if (timeoutInMs) {\r\n timeoutId = window.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","/**\n * Copyright (c) 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nmodule.exports.Dispatcher = require('./lib/Dispatcher')\n","/*\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Dispatcher\n * @typechecks\n */\n\n\"use strict\";\n\nvar invariant = require('./invariant');\n\nvar _lastID = 1;\nvar _prefix = 'ID_';\n\n/**\n * Dispatcher is used to broadcast payloads to registered callbacks. This is\n * different from generic pub-sub systems in two ways:\n *\n * 1) Callbacks are not subscribed to particular events. Every payload is\n * dispatched to every registered callback.\n * 2) Callbacks can be deferred in whole or part until other callbacks have\n * been executed.\n *\n * For example, consider this hypothetical flight destination form, which\n * selects a default city when a country is selected:\n *\n * var flightDispatcher = new Dispatcher();\n *\n * // Keeps track of which country is selected\n * var CountryStore = {country: null};\n *\n * // Keeps track of which city is selected\n * var CityStore = {city: null};\n *\n * // Keeps track of the base flight price of the selected city\n * var FlightPriceStore = {price: null}\n *\n * When a user changes the selected city, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'city-update',\n * selectedCity: 'paris'\n * });\n *\n * This payload is digested by `CityStore`:\n *\n * flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'city-update') {\n * CityStore.city = payload.selectedCity;\n * }\n * });\n *\n * When the user selects a country, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'country-update',\n * selectedCountry: 'australia'\n * });\n *\n * This payload is digested by both stores:\n *\n * CountryStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * CountryStore.country = payload.selectedCountry;\n * }\n * });\n *\n * When the callback to update `CountryStore` is registered, we save a reference\n * to the returned token. Using this token with `waitFor()`, we can guarantee\n * that `CountryStore` is updated before the callback that updates `CityStore`\n * needs to query its data.\n *\n * CityStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * // `CountryStore.country` may not be updated.\n * flightDispatcher.waitFor([CountryStore.dispatchToken]);\n * // `CountryStore.country` is now guaranteed to be updated.\n *\n * // Select the default city for the new country\n * CityStore.city = getDefaultCityForCountry(CountryStore.country);\n * }\n * });\n *\n * The usage of `waitFor()` can be chained, for example:\n *\n * FlightPriceStore.dispatchToken =\n * flightDispatcher.register(function(payload) {\n * switch (payload.actionType) {\n * case 'country-update':\n * flightDispatcher.waitFor([CityStore.dispatchToken]);\n * FlightPriceStore.price =\n * getFlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n *\n * case 'city-update':\n * FlightPriceStore.price =\n * FlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n * }\n * });\n *\n * The `country-update` payload will be guaranteed to invoke the stores'\n * registered callbacks in order: `CountryStore`, `CityStore`, then\n * `FlightPriceStore`.\n */\n\n function Dispatcher() {\n this.$Dispatcher_callbacks = {};\n this.$Dispatcher_isPending = {};\n this.$Dispatcher_isHandled = {};\n this.$Dispatcher_isDispatching = false;\n this.$Dispatcher_pendingPayload = null;\n }\n\n /**\n * Registers a callback to be invoked with every dispatched payload. Returns\n * a token that can be used with `waitFor()`.\n *\n * @param {function} callback\n * @return {string}\n */\n Dispatcher.prototype.register=function(callback) {\n var id = _prefix + _lastID++;\n this.$Dispatcher_callbacks[id] = callback;\n return id;\n };\n\n /**\n * Removes a callback based on its token.\n *\n * @param {string} id\n */\n Dispatcher.prototype.unregister=function(id) {\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.unregister(...): `%s` does not map to a registered callback.',\n id\n );\n delete this.$Dispatcher_callbacks[id];\n };\n\n /**\n * Waits for the callbacks specified to be invoked before continuing execution\n * of the current callback. This method should only be used by a callback in\n * response to a dispatched payload.\n *\n * @param {array} ids\n */\n Dispatcher.prototype.waitFor=function(ids) {\n invariant(\n this.$Dispatcher_isDispatching,\n 'Dispatcher.waitFor(...): Must be invoked while dispatching.'\n );\n for (var ii = 0; ii < ids.length; ii++) {\n var id = ids[ii];\n if (this.$Dispatcher_isPending[id]) {\n invariant(\n this.$Dispatcher_isHandled[id],\n 'Dispatcher.waitFor(...): Circular dependency detected while ' +\n 'waiting for `%s`.',\n id\n );\n continue;\n }\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.',\n id\n );\n this.$Dispatcher_invokeCallback(id);\n }\n };\n\n /**\n * Dispatches a payload to all registered callbacks.\n *\n * @param {object} payload\n */\n Dispatcher.prototype.dispatch=function(payload) {\n invariant(\n !this.$Dispatcher_isDispatching,\n 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.'\n );\n this.$Dispatcher_startDispatching(payload);\n try {\n for (var id in this.$Dispatcher_callbacks) {\n if (this.$Dispatcher_isPending[id]) {\n continue;\n }\n this.$Dispatcher_invokeCallback(id);\n }\n } finally {\n this.$Dispatcher_stopDispatching();\n }\n };\n\n /**\n * Is this Dispatcher currently dispatching.\n *\n * @return {boolean}\n */\n Dispatcher.prototype.isDispatching=function() {\n return this.$Dispatcher_isDispatching;\n };\n\n /**\n * Call the callback stored with the given id. Also do some internal\n * bookkeeping.\n *\n * @param {string} id\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_invokeCallback=function(id) {\n this.$Dispatcher_isPending[id] = true;\n this.$Dispatcher_callbacks[id](this.$Dispatcher_pendingPayload);\n this.$Dispatcher_isHandled[id] = true;\n };\n\n /**\n * Set up bookkeeping needed when dispatching.\n *\n * @param {object} payload\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_startDispatching=function(payload) {\n for (var id in this.$Dispatcher_callbacks) {\n this.$Dispatcher_isPending[id] = false;\n this.$Dispatcher_isHandled[id] = false;\n }\n this.$Dispatcher_pendingPayload = payload;\n this.$Dispatcher_isDispatching = true;\n };\n\n /**\n * Clear bookkeeping used for dispatching.\n *\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_stopDispatching=function() {\n this.$Dispatcher_pendingPayload = null;\n this.$Dispatcher_isDispatching = false;\n };\n\n\nmodule.exports = Dispatcher;\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule invariant\n */\n\n\"use strict\";\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n 'Invariant Violation: ' +\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n\"use strict\";\n\n/**\n * Constructs an enumeration with keys equal to their value.\n *\n * For example:\n *\n * var COLORS = keyMirror({blue: null, red: null});\n * var myColor = COLORS.blue;\n * var isColorValid = !!COLORS[myColor];\n *\n * The last line could not be performed if the values of the generated enum were\n * not equal to their keys.\n *\n * Input: {key1: val1, key2: val2}\n * Output: {key1: key1, key2: key2}\n *\n * @param {object} obj\n * @return {object}\n */\nvar keyMirror = function(obj) {\n var ret = {};\n var key;\n if (!(obj instanceof Object && !Array.isArray(obj))) {\n throw new Error('keyMirror(...): Argument must be an object.');\n }\n for (key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n ret[key] = key;\n }\n return ret;\n};\n\nmodule.exports = keyMirror;\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