{"version":3,"file":"home.334a219d.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\nimport React from 'react'\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. Size represents market cap.',\r\n type: MapTypeId.Screener,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n}\r\n\r\nexport const MAP_TYPE_ETF_HOLDINGS_WIDGET = {\r\n name: 'ETF Holdings',\r\n pageTitle: '',\r\n description: '',\r\n type: MapTypeId.ETFHoldings,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n}\r\n","export type MapOrder = Record\r\n\r\nexport const MAP_MIN_WIDTH = 700\r\nexport const MAP_MIN_HEIGHT = 388\r\nexport const SECTOR_MIN_HEIGHT = 5\r\nexport const LEGEND_HEIGHT = 79\r\n\r\nexport const LARGE_MAP_HEIGHT_RATIO = 1.8\r\nexport const SMALL_MAP_GEO_HEIGHT_RATIO = 1.7\r\nexport const SMALL_MAP_HEIGHT_RATIO = 1.085 // old design ratio - 1.33\r\n\r\n// Minimal size of node to display header\r\nexport const LARGE_NODE_SIZE = {\r\n dx: 40,\r\n dy: 12,\r\n}\r\n\r\n// Don't display header if node height - header is smaller than this\r\nexport const LARGE_NODE_MIN_HEIGHT = 5\r\n\r\nexport const ORDER_SP500: MapOrder = {\r\n Technology: 10,\r\n Financial: 11,\r\n 'Communication Services': 9,\r\n Healthcare: 4,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n\r\n // Industries\r\n 'Software - Infrastructure': 2,\r\n Semiconductors: 1,\r\n}\r\n\r\nexport const ORDER_SEC_ALL: MapOrder = {\r\n Financial: 10,\r\n Technology: 9,\r\n 'Communication Services': 8,\r\n 'Consumer Cyclical': 7,\r\n 'Consumer Defensive': 6,\r\n Healthcare: 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n\r\n // Industries\r\n 'Software - Infrastructure': 2,\r\n Semiconductors: 1,\r\n}\r\nexport const ORDER_ETF: MapOrder = {\r\n US: 11,\r\n 'US Sector': 10,\r\n 'US Large Cap': 9,\r\n 'US Mid Cap': 8,\r\n 'US Small Cap': 7,\r\n 'US Volatility': 6,\r\n Global: 5,\r\n International: 3,\r\n 'Fixed Income': 2,\r\n Commodity: 4,\r\n Strategy: 1,\r\n Forex: 0,\r\n}\r\n\r\nexport const ORDER_SCREENER: MapOrder = {\r\n Technology: 10,\r\n Financial: 9,\r\n 'Communication Services': 8,\r\n Healthcare: 7,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n}\r\n\r\nexport const ORDER_SCREENER_ETF: MapOrder = {\r\n ...ORDER_SCREENER,\r\n Financial: 1000,\r\n}\r\n\r\nexport const ORDER_WORLD: MapOrder = {\r\n Ireland: 20,\r\n 'United Kingdom': 19,\r\n Spain: 18,\r\n France: 17,\r\n Belgium: 16,\r\n Netherlands: 15,\r\n Switzerland: 14,\r\n\r\n China: 21,\r\n Japan: 20,\r\n India: 19,\r\n 'Hong Kong': 18,\r\n 'South Korea': 15,\r\n Taiwan: 14,\r\n\r\n Colombia: 30,\r\n Chile: 29,\r\n Argentina: 28,\r\n}\r\n\r\nexport const WORLD_INDUSTRIES = [\r\n {\r\n x: 4,\r\n y: 0,\r\n dx: 240,\r\n dy: 226,\r\n name: 'Canada',\r\n countries: ['Canada'],\r\n },\r\n {\r\n x: 4,\r\n y: 230,\r\n dx: 240,\r\n dy: 135,\r\n name: 'Mexico',\r\n countries: ['Cayman Islands', 'Bermuda', 'Mexico'],\r\n },\r\n {\r\n x: 4,\r\n y: 375,\r\n dx: 240,\r\n dy: 170,\r\n name: 'South America',\r\n countries: ['Netherlands Antilles', 'Panama', 'Peru', 'Argentina', 'Colombia', 'Chile', 'Brazil'],\r\n },\r\n {\r\n x: 730,\r\n y: 380,\r\n dx: 108,\r\n dy: 80,\r\n name: 'South Africa',\r\n countries: ['South Africa'],\r\n },\r\n {\r\n x: 725,\r\n y: 180,\r\n dx: 108,\r\n dy: 81,\r\n name: 'Israel',\r\n countries: ['Israel'],\r\n },\r\n {\r\n x: 1055,\r\n y: 420,\r\n dx: 144,\r\n dy: 80,\r\n name: 'Australia',\r\n countries: ['Australia'],\r\n },\r\n {\r\n x: 871,\r\n y: 0,\r\n dx: 336,\r\n dy: 396,\r\n name: 'Asia',\r\n countries: [\r\n 'Malaysia',\r\n 'Russia',\r\n 'Philippines',\r\n 'Indonesia',\r\n 'Singapore',\r\n 'South Korea',\r\n 'Taiwan',\r\n 'India',\r\n 'Hong Kong',\r\n 'Japan',\r\n 'China',\r\n ],\r\n },\r\n {\r\n x: 324,\r\n y: 0,\r\n dx: 374,\r\n dy: 428,\r\n name: 'Europe',\r\n countries: [\r\n 'Cyprus',\r\n 'Channel Islands',\r\n 'Greece',\r\n 'Luxembourg',\r\n 'Germany',\r\n 'Belgium',\r\n 'Spain',\r\n 'France',\r\n 'Ireland',\r\n 'Switzerland',\r\n 'Netherlands',\r\n 'United Kingdom',\r\n ],\r\n },\r\n {\r\n x: 697,\r\n y: 75,\r\n dx: 144,\r\n dy: 51,\r\n name: 'Frozen',\r\n countries: ['Finland', 'Sweden', 'Norway', 'Denmark'],\r\n },\r\n {\r\n x: 542,\r\n y: 414,\r\n dx: 102,\r\n dy: 68,\r\n name: 'Italy',\r\n countries: ['Italy'],\r\n },\r\n]\r\n","import tailwindColors from '../../../../../config/colors'\r\nimport { ScaleId } from '../types'\r\n\r\nexport interface ISettings {\r\n padding: { top: number; right: number; bottom: number; left: number }\r\n background: string\r\n industry: ISettingsSection\r\n sector: ISettingsSection\r\n scaleFontSizes: Record\r\n fontSizePadding: Record\r\n fontSizePairs: Record\r\n}\r\n\r\nexport interface ISettingsSection {\r\n padding: { top: number; right: number; bottom: number; left: number }\r\n background: string | null\r\n border: string | null\r\n header: ISettingsSectionHeader\r\n hover?: ISettingsSectionHeader\r\n}\r\n\r\nexport interface ISettingsSectionHeader extends ISettingsSectionFont {\r\n background: string | null\r\n border: string | null\r\n height: number\r\n margin: { top: number; right: number; bottom: number; left: number }\r\n}\r\n\r\nexport interface ISettingsSectionFont {\r\n color: string\r\n fontSize: number\r\n fontWeight: 'bold' | 'normal'\r\n padding: { top: number; right: number; left: number }\r\n}\r\n\r\nexport const scaleMinMax: Record = {\r\n [ScaleId.DayPerf]: [-3, 3],\r\n _5: [-6, 6],\r\n _10: [-10, 10],\r\n _15: [-18, 18],\r\n _20: [-24, 24],\r\n _25: [-30, 30],\r\n _relvol: [0, 3],\r\n _pe: [0, 30],\r\n _fpe: [0, 30],\r\n _peg: [0, 3],\r\n _ps: [0, 5],\r\n _pb: [0, 5],\r\n _div: [0, 5],\r\n _eps5y: [-50, 50],\r\n _short: [0, 15],\r\n _rec: [5, 1],\r\n _earndate: [30, -30],\r\n // Portfolio — values are just placeholders, the real value is computed from data\r\n _portfolioPct: [-1, 1],\r\n _portfolioUsd: [-1, 1],\r\n}\r\n\r\nexport const scaleStepFormat: Record = {\r\n [ScaleId.DayPerf]: '%N%',\r\n _5: '%N%',\r\n _10: '%N%',\r\n _15: '%N%',\r\n _20: '%N%',\r\n _25: '%N%',\r\n _relvol: '%N',\r\n _pe: '%N',\r\n _fpe: '%N',\r\n _peg: '%N',\r\n _ps: '%N',\r\n _pb: '%N',\r\n _div: '%N%',\r\n _eps5y: '%N%',\r\n _short: '%N%',\r\n _rec: { 1: '%N Strong Buy', 2: '%N Buy', 3: '%N Hold', 4: '%N Sell', 5: '%N Strong Sell' },\r\n _earndate: {\r\n '-30': '%N Days',\r\n '-15': '%N Days',\r\n '-1': 'After Earnings',\r\n 1: 'Before Earnings',\r\n 15: '%N Days',\r\n 30: '%N Days',\r\n },\r\n _portfolioPct: '%N%',\r\n _portfolioUsd: '$%N',\r\n}\r\n\r\nexport const Settings: ISettings = {\r\n padding: { top: 0, right: 0, bottom: 1, left: 1 },\r\n background: tailwindColors.finviz['blue-gray'],\r\n sector: {\r\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\r\n background: null,\r\n border: null,\r\n header: {\r\n color: '#fff',\r\n background: null,\r\n border: null,\r\n height: 14.5,\r\n fontSize: 13,\r\n fontWeight: 'bold',\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n padding: { top: -1, right: 4, left: 4 },\r\n },\r\n },\r\n industry: {\r\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\r\n background: null,\r\n border: null,\r\n header: {\r\n color: '#fff',\r\n background: null,\r\n border: tailwindColors.finviz['blue-gray'],\r\n height: 12,\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n margin: { top: 0, right: 0.5, bottom: 0, left: -0.5 },\r\n padding: { top: -0.5, right: 4, left: 4 },\r\n },\r\n hover: {\r\n color: '#6b5811',\r\n background: '#ffd614',\r\n border: '#ffd614',\r\n height: 12,\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n padding: { top: -0.5, right: 3, left: 4 },\r\n },\r\n },\r\n scaleFontSizes: {\r\n 1: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8],\r\n 1.5: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n 2.25: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n 3: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n },\r\n fontSizePadding: {\r\n 36: 30,\r\n 30: 25,\r\n 24: 20,\r\n 20: 14,\r\n 18: 12,\r\n 14: 9,\r\n 13: 7,\r\n 12: 7,\r\n 11: 4,\r\n 10: 3,\r\n 9: 3,\r\n 8: 2.5,\r\n 6: 0,\r\n 4: 1,\r\n },\r\n fontSizePairs: {\r\n 36: [18, 14, 13, 12],\r\n 30: [14, 13, 12, 11, 10],\r\n 24: [14, 13, 12, 11, 10],\r\n 20: [12, 11, 10, 9, 8, 6],\r\n 18: [11, 10, 9, 8, 6],\r\n 14: [9, 8, 6, 4],\r\n 13: [9, 8, 6, 4],\r\n 12: [9, 8, 6, 4],\r\n 11: [8, 6, 4],\r\n 10: [10, 9, 8, 6, 4],\r\n 9: [9, 8, 6, 4],\r\n 8: [8, 6, 4],\r\n 6: [6, 4],\r\n 4: [4],\r\n },\r\n}\r\n\r\nexport const SettingsSmall: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\r\n background: '#343842',\r\n sector: {\r\n ...Settings.industry,\r\n padding: { top: 0.5, right: 0, bottom: 0, left: 2 },\r\n border: '#e0e0e0',\r\n header: {\r\n ...Settings.industry.header,\r\n margin: { top: 0, right: 0.5, bottom: 0, left: -1.5 },\r\n padding: { top: 0.5, right: 1, left: 1 },\r\n border: '#343842',\r\n fontSize: 9,\r\n },\r\n },\r\n industry: {\r\n ...Settings.industry,\r\n padding: { top: 0, right: 1, bottom: 1, left: 0 },\r\n header: {\r\n ...Settings.industry.header,\r\n height: 0,\r\n },\r\n },\r\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\r\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 2, 6: 0, 4: 0 },\r\n fontSizePairs: {\r\n 14: [9, 8, 6],\r\n 13: [9, 8, 6],\r\n 12: [6],\r\n 11: [6],\r\n 10: [6],\r\n 9: [6],\r\n 8: [6],\r\n 6: [6],\r\n },\r\n}\r\n\r\nexport const SettingsSmallDark: ISettings = {\r\n ...SettingsSmall,\r\n sector: {\r\n ...SettingsSmall.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n header: {\r\n ...SettingsSmall.sector.header,\r\n padding: { top: 0.5, right: 2, left: 2 },\r\n margin: { top: 0, right: 1.5, bottom: 0, left: -0.5 },\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n industry: {\r\n ...SettingsSmall.industry,\r\n header: {\r\n ...SettingsSmall.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsSmallGeo: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\r\n background: '#a7c4d3',\r\n industry: {\r\n ...Settings.industry,\r\n background: '#e0e0e0',\r\n header: {\r\n ...Settings.industry.header,\r\n height: 9,\r\n fontSize: 8,\r\n border: '#e0e0e0',\r\n margin: { top: -0.5, right: 0.5, bottom: 0, left: -0.5 },\r\n padding: { top: -1, right: 0, left: 1 },\r\n },\r\n },\r\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\r\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 1, 6: 0, 4: 0 },\r\n fontSizePairs: {\r\n 14: [9, 8, 6],\r\n 13: [9, 8, 6],\r\n 12: [6],\r\n 11: [6],\r\n 10: [6],\r\n 9: [6],\r\n 8: [6],\r\n 6: [6],\r\n },\r\n}\r\n\r\nexport const SettingsSmallGeoDark: ISettings = {\r\n ...SettingsSmallGeo,\r\n background: tailwindColors.gray[800],\r\n sector: {\r\n ...SettingsSmallGeo.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n },\r\n industry: {\r\n ...SettingsSmallGeo.industry,\r\n border: tailwindColors.gray[800],\r\n background: tailwindColors.gray[800],\r\n header: {\r\n ...SettingsSmallGeo.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsScreener: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\r\n sector: {\r\n ...Settings.sector,\r\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\r\n background: '#363a46',\r\n border: '#d3d3d3',\r\n header: {\r\n ...Settings.sector.header,\r\n height: 20,\r\n padding: { top: 2.5, right: 4, left: 4 },\r\n },\r\n },\r\n industry: {\r\n ...Settings.industry,\r\n header: {\r\n ...Settings.industry.header,\r\n border: '#363a46',\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsScreenerDark: ISettings = {\r\n ...SettingsScreener,\r\n sector: {\r\n ...SettingsScreener.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n },\r\n industry: {\r\n ...SettingsScreener.industry,\r\n header: {\r\n ...SettingsScreener.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport * as constants from './constants/generator'\r\nimport { ISettings } from './constants/settings'\r\nimport { MapDataIndustry, MapDataNode, MapDataRoot, MapDataRow, MapDataSector, MapTypeId, NodeDepth } from './types'\r\n\r\nexport default class LayoutGenerator {\r\n width: number\r\n height: number\r\n settings: ISettings\r\n layout?: Array>\r\n sectors: MapDataSector[] = []\r\n industries: MapDataIndustry[] = []\r\n nodes: MapDataNode[] = []\r\n isSmall: boolean\r\n type: MapTypeId\r\n minSectorHeight: number\r\n\r\n static smallIndustryPadding = {\r\n top: 4,\r\n right: 1,\r\n bottom: 1,\r\n left: 1,\r\n }\r\n\r\n static smallIndustryGeoPadding = {\r\n top: 4,\r\n right: 1,\r\n bottom: 1,\r\n left: 1,\r\n }\r\n\r\n static getSizeRatio = (type: MapTypeId, isSmall: boolean) => {\r\n if (isSmall) {\r\n if (type === MapTypeId.World) {\r\n return constants.SMALL_MAP_GEO_HEIGHT_RATIO\r\n }\r\n return constants.SMALL_MAP_HEIGHT_RATIO\r\n }\r\n\r\n return constants.LARGE_MAP_HEIGHT_RATIO\r\n }\r\n\r\n static calculateHeight = (\r\n width: number,\r\n type: MapTypeId,\r\n isSmall: boolean,\r\n ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n ) => ~~(width / ratio)\r\n\r\n static calculateWidth = (height: number, type: MapTypeId, isSmall: boolean) => {\r\n const ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n\r\n return Math.round(height * ratio)\r\n }\r\n\r\n static isNodeHeaderVisible(node: any, settings: ISettings) {\r\n const deltaX = node.dx ?? Math.round(node.x1) - Math.round(node.x0)\r\n const deltaY = node.dy ?? Math.round(node.y1) - Math.round(node.y0)\r\n\r\n const isLargeNode = deltaX >= constants.LARGE_NODE_SIZE.dx && deltaY >= constants.LARGE_NODE_SIZE.dy\r\n const showHeader =\r\n deltaY - settings.industry.padding.top - settings.industry.header.height > constants.LARGE_NODE_MIN_HEIGHT\r\n\r\n return isLargeNode && showHeader\r\n }\r\n\r\n constructor(width: number, height: number, type: MapTypeId, settings: ISettings, isSmall: boolean = false) {\r\n this.width = width\r\n this.height = height\r\n this.settings = settings\r\n this.isSmall = isSmall\r\n this.type = type\r\n this.minSectorHeight = settings.sector.padding.top + settings.sector.header.height + constants.SECTOR_MIN_HEIGHT\r\n }\r\n\r\n getExportData() {\r\n let mapRoot: MapDataRoot\r\n if (this.type === MapTypeId.World) {\r\n mapRoot = this._rootsToRoot(this.industries)\r\n } else {\r\n mapRoot = this.layout?.find((node) => node.data.name === 'Root') as unknown as MapDataRoot\r\n }\r\n\r\n // Save some file size by filtering out small nodes on maps where hover is not a concern\r\n if (this.isSmall) {\r\n mapRoot.children = this.filterVisibleNodes(mapRoot.children)\r\n }\r\n\r\n const stringified = JSON.stringify(mapRoot, (key, value) => (key === 'parent' ? '[Circular]' : value))\r\n\r\n return JSON.parse(stringified)\r\n }\r\n\r\n getLayoutData() {\r\n return {\r\n nodes: this.nodes,\r\n sectors: this.sectors,\r\n industries: this.industries,\r\n }\r\n }\r\n\r\n filterVisibleNodes = (arr: T[]) =>\r\n arr.filter((node) => {\r\n const isVisible = this.isNodeVisible(node)\r\n if (isVisible && node.children?.length) {\r\n node.children = this.filterVisibleNodes(node.children)\r\n }\r\n return isVisible\r\n })\r\n\r\n isNodeVisible(d: MapDataRow) {\r\n if (!d.depth || d.depth < NodeDepth.Industry) return true\r\n\r\n return d.dx > 0 && d.dy > 0\r\n }\r\n\r\n getLayout(data: MapDataRoot, options: Record = {}) {\r\n this.nodes = []\r\n this.sectors = []\r\n this.industries = []\r\n\r\n switch (this.type) {\r\n case MapTypeId.Sector:\r\n this.layout = this._generateSP500(data).descendants()\r\n break\r\n case MapTypeId.SectorFull:\r\n this.layout = this._generateFull(data).descendants()\r\n break\r\n case MapTypeId.Portfolio:\r\n case MapTypeId.Screener:\r\n case MapTypeId.ETFHoldings:\r\n this.layout = this._generateScreener(data, options).descendants()\r\n break\r\n case MapTypeId.World:\r\n this.layout = this._generateWorld(data)\r\n break\r\n case MapTypeId.ETF:\r\n this.layout = this._generateETF(data).descendants()\r\n break\r\n }\r\n\r\n this.layout?.forEach((d: any) => {\r\n this._transformNode(d)\r\n\r\n if (!this.isNodeVisible(d)) return\r\n\r\n if (!d.children) {\r\n this.nodes.push(d)\r\n } else if (d.parent && !d.parent.parent) {\r\n this.sectors.push(d)\r\n } else if (d.parent && !!d.parent.parent && d.children) {\r\n this.industries.push(d)\r\n }\r\n })\r\n\r\n return this.getLayoutData()\r\n }\r\n\r\n _transformNode(d: d3.HierarchyRectangularNode) {\r\n Object.assign(d, {\r\n name: d.data.name,\r\n description: d.data.description,\r\n perf: d.data.perf,\r\n additional: d.data.additional,\r\n x: d.x0,\r\n y: d.y0,\r\n dx: d.x1 - d.x0,\r\n dy: d.y1 - d.y0,\r\n })\r\n }\r\n\r\n _rootsToRoot(roots: any) {\r\n return {\r\n name: 'Root',\r\n children: [\r\n {\r\n name: 'World',\r\n children: roots,\r\n },\r\n ],\r\n duplicateTickers: 0,\r\n } as MapDataRoot\r\n }\r\n\r\n _getPadding = (d: d3.HierarchyRectangularNode) => {\r\n // Root\r\n if (d.depth === NodeDepth.Root) {\r\n return [\r\n this.settings.padding.top,\r\n this.settings.padding.right,\r\n this.settings.padding.bottom,\r\n this.settings.padding.left,\r\n ]\r\n }\r\n\r\n // Industries\r\n if (d.depth === NodeDepth.Industry) {\r\n if (this.isSmall || LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\r\n return [\r\n this.settings.industry.padding.top + this.settings.industry.header.height,\r\n this.settings.industry.padding.right,\r\n this.settings.industry.padding.bottom,\r\n this.settings.industry.padding.left,\r\n ]\r\n }\r\n\r\n return [\r\n LayoutGenerator.smallIndustryPadding.top,\r\n LayoutGenerator.smallIndustryPadding.right,\r\n LayoutGenerator.smallIndustryPadding.bottom,\r\n LayoutGenerator.smallIndustryPadding.left,\r\n ]\r\n }\r\n\r\n // Sectors\r\n return [\r\n this.settings.sector.padding.top + this.settings.sector.header.height,\r\n this.settings.sector.padding.right,\r\n this.settings.sector.padding.bottom,\r\n this.settings.sector.padding.left,\r\n ]\r\n }\r\n\r\n _getPaddingGeo = (d: d3.HierarchyRectangularNode) => {\r\n // Root\r\n if (d.depth === NodeDepth.Root) {\r\n return [\r\n this.settings.padding.top,\r\n this.settings.padding.right,\r\n this.settings.padding.bottom,\r\n this.settings.padding.left,\r\n ]\r\n }\r\n\r\n // Industries\r\n if (d.depth === NodeDepth.Industry) {\r\n if (LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\r\n return [\r\n this.settings.industry.padding.top + this.settings.industry.header.height,\r\n this.settings.industry.padding.right,\r\n this.settings.industry.padding.bottom,\r\n this.settings.industry.padding.left,\r\n ]\r\n }\r\n\r\n return [\r\n LayoutGenerator.smallIndustryGeoPadding.top,\r\n LayoutGenerator.smallIndustryGeoPadding.right,\r\n LayoutGenerator.smallIndustryGeoPadding.bottom,\r\n LayoutGenerator.smallIndustryGeoPadding.left,\r\n ]\r\n }\r\n\r\n // Sectors\r\n return [\r\n this.settings.sector.padding.top + this.settings.sector.header.height,\r\n this.settings.sector.padding.right,\r\n this.settings.sector.padding.bottom,\r\n this.settings.sector.padding.left,\r\n ]\r\n }\r\n\r\n _getHierarchySort = <\r\n Datum extends { y0?: number; y1?: number; value?: number; data: { name: string }; depth?: number },\r\n >(\r\n a: Datum,\r\n b: Datum,\r\n order: constants.MapOrder\r\n ): number => {\r\n // Sort small sectors (works only when layout is recalculated)\r\n const heightB = b.y1! - b.y0!\r\n if (b.depth === NodeDepth.Sector && Number.isFinite(heightB) && heightB < this.minSectorHeight) {\r\n return b.value! - a.value!\r\n }\r\n\r\n if (order.hasOwnProperty(a.data.name) && order.hasOwnProperty(b.data.name)) {\r\n return order[b.data.name] - order[a.data.name]\r\n }\r\n return b.value! - a.value!\r\n }\r\n\r\n _getHierarchy = (data: MapDataRoot, order: constants.MapOrder) =>\r\n d3\r\n .hierarchy(data as unknown as MapDataNode)\r\n .sum((d) => d.value)\r\n .sort((a, b) => this._getHierarchySort(a, b, order))\r\n\r\n _getTreemap = (width: number, height: number) => {\r\n const paddingFn = this.type === MapTypeId.World ? this._getPaddingGeo : this._getPadding\r\n\r\n return d3\r\n .treemap()\r\n .size([width, height])\r\n .round(true)\r\n .tile(d3.treemapSquarify.ratio(1))\r\n .paddingTop((d) => paddingFn(d)[0])\r\n .paddingRight((d) => paddingFn(d)[1])\r\n .paddingBottom((d) => paddingFn(d)[2])\r\n .paddingLeft((d) => paddingFn(d)[3])\r\n }\r\n\r\n _getIndustriesRoots(data: MapDataRoot, industries: string[]) {\r\n return data.children[0].children.filter(function (d) {\r\n return industries.some((i) => i === d.name)\r\n })\r\n }\r\n\r\n _getSectorsRoots(data: MapDataRoot, sectors: string[]) {\r\n return data.children.filter(function (d) {\r\n return sectors.some((s) => s === d.name)\r\n })\r\n }\r\n\r\n _generateLayout(data: MapDataRoot, order: constants.MapOrder, recountSectors = false) {\r\n const treemapHeight = LayoutGenerator.calculateHeight(this.width, this.type, false)\r\n const treemap = this._getTreemap(this.width, treemapHeight)\r\n const hierarchy = this._getHierarchy(data, order)\r\n const recalculateHeight = this.height !== treemapHeight\r\n\r\n // Calculate the base layout\r\n let nodes = treemap(hierarchy)\r\n\r\n // Recalculate for custom height\r\n if (this.height !== treemapHeight) {\r\n treemap.tile(d3.treemapResquarify).size([this.width, this.height])\r\n }\r\n\r\n // Run layout again so that possible small sectors are reordered\r\n // This also applies the recalculateHeight option\r\n if (recountSectors || recalculateHeight) {\r\n nodes = treemap(nodes.sort((a, b) => this._getHierarchySort(a, b, order)))\r\n }\r\n\r\n return nodes\r\n }\r\n\r\n _generateSP500(data: MapDataRoot) {\r\n const nodes = this._generateLayout(data, constants.ORDER_SP500)\r\n\r\n // Switch financial and technology sector\r\n const financialSector = nodes.find((node) => node.data.name === 'Financial')!\r\n const technologySector = nodes.find((node) => node.data.name === 'Technology')!\r\n const financialHeight = financialSector.y1 - financialSector.y0\r\n const technologyHeight = technologySector.y1 - technologySector.y0\r\n\r\n financialSector.eachAfter((node) => {\r\n if (node.y1 - node.y0 < 1) return\r\n node.y0 += technologyHeight\r\n node.y1 += technologyHeight\r\n })\r\n\r\n technologySector.eachAfter((node) => {\r\n if (node.y1 - node.y0 < 1) return\r\n node.y0 -= financialHeight\r\n node.y1 -= financialHeight\r\n })\r\n\r\n return nodes\r\n }\r\n\r\n _generateFull(data: MapDataRoot) {\r\n const layout = this._generateLayout(data, constants.ORDER_SEC_ALL)\r\n\r\n // Swap Technology and financial sectors\r\n const technologySector = layout.find((node) => node.depth === NodeDepth.Sector && node.data.name === 'Technology')!\r\n const financialSector = layout.find((node) => node.depth === NodeDepth.Sector && node.data.name === 'Financial')!\r\n\r\n const financialHeight = financialSector.y1 - financialSector.y0\r\n technologySector.each((node) => {\r\n node.y0 -= financialHeight\r\n node.y1 -= financialHeight\r\n })\r\n\r\n const technologyHeight = technologySector.y1 - technologySector.y0\r\n financialSector.each((node) => {\r\n node.y0 += technologyHeight\r\n node.y1 += technologyHeight\r\n })\r\n\r\n return layout\r\n }\r\n\r\n _generateScreener(data: MapDataRoot, { showETF }: Record) {\r\n const order = showETF ? constants.ORDER_SCREENER_ETF : constants.ORDER_SCREENER\r\n\r\n return this._generateLayout(data, order, true)\r\n }\r\n\r\n _generateETF(data: MapDataRoot) {\r\n return this._generateLayout(data, constants.ORDER_ETF)\r\n }\r\n\r\n _generateWorld = (data: MapDataRoot) => {\r\n const originalWidth = 1211\r\n const ratio = this.width / originalWidth\r\n let nodes: Array> = []\r\n\r\n for (let industryIndex = 0; industryIndex < constants.WORLD_INDUSTRIES.length; industryIndex++) {\r\n const industry = constants.WORLD_INDUSTRIES[industryIndex]\r\n const industryX = Math.round(industry.x * ratio)\r\n const industryY = Math.round(industry.y * ratio)\r\n const industryWidth = Math.round(industry.dx * ratio)\r\n const industryHeight = Math.round(industry.dy * ratio)\r\n\r\n const countriesRoots = this._getIndustriesRoots(data, industry.countries)\r\n const root = this._rootsToRoot(countriesRoots)\r\n const hierarchy = this._getHierarchy(root, constants.ORDER_WORLD)\r\n const treemap = this._getTreemap(industryWidth, industryHeight)\r\n const treemapNodes = treemap(hierarchy)\r\n\r\n treemapNodes.each((d) => {\r\n d.x0 += industryX\r\n d.x1 += industryX\r\n d.y0 += industryY\r\n d.y1 += industryY\r\n })\r\n\r\n // SWITCH BRAZIL AND OTHERS\r\n if (industry.name === 'South America') {\r\n const brazil = treemapNodes.find((d) => d.data.name === 'Brazil')!\r\n const colombia = treemapNodes.find((d) => d.data.name === 'Colombia')!\r\n const brazilWidth = brazil.x1 - brazil.x0\r\n const colombiaWidth = colombia.x1 - colombia.x0\r\n\r\n treemapNodes.each((d) => {\r\n if ([d.parent?.data.name, d.data.name].includes('Brazil')) {\r\n d.x0 += colombiaWidth\r\n d.x1 += colombiaWidth\r\n } else {\r\n d.x0 -= brazilWidth\r\n d.x1 -= brazilWidth\r\n }\r\n })\r\n }\r\n\r\n nodes = nodes.concat(treemapNodes.descendants())\r\n }\r\n\r\n return nodes\r\n }\r\n}\r\n","import { ContentType, apiRequest } from '../../../main/services/api'\r\nimport { MapDataRoot, MapSubtypeId, MapTypeId, PerfData } from '../types'\r\n\r\nexport function mapBaseData(type: MapTypeId, cacheBuster: number) {\r\n return apiRequest(`/maps/${type}.json`, { query: { rev: cacheBuster } }, true)\r\n}\r\n\r\nexport function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\r\n return apiRequest(`/api/map_perf.ashx`, { query: { t: type, st: subtype } })\r\n}\r\n\r\nexport function mapPerfScreener(query = window.location.search) {\r\n return apiRequest(`/api/map_perf_screener.ashx${query}`)\r\n}\r\n\r\nexport interface UploadMapResponse {\r\n imgUrl: string\r\n shareUrl: string\r\n}\r\n\r\nexport function uploadMap({ type, subtype, data }: { type: MapTypeId; subtype: MapSubtypeId; data: string }) {\r\n return apiRequest(`/publish_map_submit.ashx`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': ContentType.FormUrlEncoded,\r\n },\r\n body: new URLSearchParams({\r\n file: data.replace('data:image/png;base64,', ''),\r\n type,\r\n subtype,\r\n }),\r\n })\r\n}\r\n","import debounce from 'lodash.debounce'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../../main/services/api'\r\nimport Treemap from '../treemap'\r\nimport { MapData, MapDataNode, MapTypeId, PerfData, Scale } from '../types'\r\nimport { getVisibleTooltipTickers } from '../utils'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport mapStore from './mapStore'\r\n\r\nvar _targetScale = 1\r\nfunction zoomIn(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n _targetScale = scale\r\n animate()\r\n function animate() {\r\n treemap.zoom.scale(+(treemap.zoom.scale() + 0.05).toFixed(2), { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n if (treemap.zoom.scale() + 0.05 < _targetScale + 0.00001) {\r\n requestAnimationFrame(animate)\r\n }\r\n }\r\n}\r\n\r\nfunction zoomOut(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n _targetScale = scale\r\n animate()\r\n function animate() {\r\n treemap.zoom.scale(+(treemap.zoom.scale() - 0.05).toFixed(2), { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n if (treemap.zoom.scale() - 0.05 > _targetScale - 0.00001) {\r\n requestAnimationFrame(animate)\r\n }\r\n }\r\n}\r\n\r\nfunction updateVisibleSparklines(treemap: Treemap) {\r\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n if (hoveredNode) {\r\n const tickersToLoad = getVisibleTooltipTickers(hoveredNode)\r\n\r\n if (!tickersToLoad.includes(hoveredNode.name)) {\r\n tickersToLoad.push(hoveredNode.name)\r\n }\r\n\r\n if (tickersToLoad.length) {\r\n debouncedLoadSparklines(tickersToLoad, treemap.type)\r\n }\r\n }\r\n}\r\n\r\nlet _lastSparklinesRequest: CancelablePromise | null = null\r\nasync function loadSparklines(tickers: string[], mapType: string) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.LOAD_SPARKLINES_STARTED,\r\n })\r\n _lastSparklinesRequest?.cancel?.()\r\n _lastSparklinesRequest = apiRequest(\r\n '/api/map_sparklines.ashx',\r\n { query: { t: tickers.join(','), ty: mapType } },\r\n true\r\n )\r\n\r\n try {\r\n const data = await _lastSparklinesRequest\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.LOAD_SPARKLINES_COMPLETED,\r\n data: data,\r\n })\r\n } catch (error) {\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.LOAD_SPARKLINES_FAILED,\r\n error,\r\n })\r\n }\r\n}\r\n\r\nconst debouncedLoadSparklines = debounce(loadSparklines, 200, { trailing: true })\r\n\r\nconst actions = {\r\n setHoveredNode(mapNodeId: string, node: MapDataNode | undefined) {\r\n if (!node) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.RESET_SPARKLINE_DATA,\r\n })\r\n }\r\n\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_HOVERED_NODE,\r\n node,\r\n mapNodeId,\r\n })\r\n },\r\n\r\n loadSparklineData(tickers: string[], mapType: MapTypeId) {\r\n if (tickers) {\r\n debouncedLoadSparklines(tickers, mapType)\r\n }\r\n },\r\n\r\n loadSparklinesCancel() {\r\n _lastSparklinesRequest?.cancel?.()\r\n },\r\n\r\n resetSparklineData() {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.RESET_SPARKLINE_DATA,\r\n })\r\n },\r\n\r\n changeTranslate(treemap: Treemap, tx: number, ty: number) {\r\n treemap.zoom.translate([tx, ty])\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.CHANGE_TRANSLATE,\r\n })\r\n },\r\n\r\n zoom(treemap: Treemap, direction: number, offsetX: number, offsetY: number) {\r\n if (direction > 0) {\r\n const zoomLevel = treemap.getNextZoomLevel()\r\n if (zoomLevel !== treemap.zoom.scale()) {\r\n zoomIn(treemap, zoomLevel, offsetX, offsetY)\r\n }\r\n } else {\r\n const zoomLevel = treemap.getPreviousZoomLevel()\r\n if (zoomLevel !== treemap.zoom.scale()) {\r\n zoomOut(treemap, zoomLevel, offsetX, offsetY)\r\n }\r\n }\r\n },\r\n\r\n render() {\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n },\r\n\r\n zoomAndTranslate(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n treemap.zoom.scale(1, { x: tx, y: ty })\r\n treemap.zoom.scale(scale, { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n },\r\n\r\n updateLayout(\r\n treemap: Treemap,\r\n props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }\r\n ) {\r\n treemap.updateData(props)\r\n treemap.zoom.updateDimensions(props)\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n\r\n // Update hovered node if any\r\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n if (hoveredNode) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_HOVERED_NODE,\r\n node: treemap.nodes.find((node) => node.name === hoveredNode.name),\r\n mapNodeId: treemap.mapNodeId,\r\n })\r\n updateVisibleSparklines(treemap)\r\n }\r\n },\r\n\r\n updatePerfData(treemap?: Treemap, data?: PerfData) {\r\n if (!treemap || !data) return\r\n\r\n treemap.updatePerf(data)\r\n AppDispatcher.handleServerAction({ type: ActionTypes.UPDATE_DATA, version: data.version })\r\n\r\n updateVisibleSparklines(treemap)\r\n },\r\n\r\n _setOnPublish(getPublishCanvas: () => HTMLCanvasElement) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_PUBLISH_CANVAS,\r\n getPublishCanvas,\r\n })\r\n },\r\n\r\n setupWidget() {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_WIDGET,\r\n isWidget: true,\r\n })\r\n },\r\n}\r\n\r\nexport default actions\r\n","import { Dispatcher } from 'flux'\r\n\r\nimport { PayloadSources } from './constants'\r\n\r\nclass AppDispatcher extends Dispatcher {\r\n handleServerAction(action: any) {\r\n var payload = {\r\n source: PayloadSources.SERVER_ACTION,\r\n action: action,\r\n }\r\n //console.log(action, payload);\r\n this.dispatch(payload)\r\n }\r\n\r\n handleViewAction(action: any) {\r\n var payload = {\r\n source: PayloadSources.VIEW_ACTION,\r\n action: action,\r\n }\r\n //console.log(action, payload);\r\n this.dispatch(payload)\r\n }\r\n}\r\n\r\nexport default new AppDispatcher()\r\n","import keyMirror from 'keymirror'\r\n\r\nconst ActionTypes = keyMirror({\r\n RENDER_TREEMAP: null,\r\n CHANGE_TRANSLATE: null,\r\n SET_HOVERED_NODE: null,\r\n\r\n LOAD_SPARKLINES_STARTED: null,\r\n LOAD_SPARKLINES_COMPLETED: null,\r\n LOAD_SPARKLINES_FAILED: null,\r\n RESET_SPARKLINE_DATA: null,\r\n\r\n INIT_STARTED: null,\r\n INIT_FAILED: null,\r\n\r\n UPDATE_DATA: null,\r\n\r\n SET_PUBLISH_CANVAS: null,\r\n\r\n SET_WIDGET: null,\r\n})\r\n\r\nconst PayloadSources = keyMirror({\r\n SERVER_ACTION: null,\r\n VIEW_ACTION: null,\r\n})\r\n\r\nexport { ActionTypes, PayloadSources }\r\n","import { EventEmitter } from 'events'\r\n\r\nclass Store extends EventEmitter {\r\n static CHANGE_EVENT = 'change'\r\n\r\n emitChange() {\r\n this.emit(Store.CHANGE_EVENT)\r\n }\r\n\r\n addChangeListener(callback: (...args: any[]) => void) {\r\n this.on(Store.CHANGE_EVENT, callback)\r\n }\r\n\r\n removeChangeListener(callback: (...args: any[]) => void) {\r\n this.removeListener(Store.CHANGE_EVENT, callback)\r\n }\r\n}\r\n\r\nexport default Store\r\n","import { MapDataNode } from '../types'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport Store from './store'\r\n\r\nlet _hoveredNode: MapDataNode\r\nlet _mapNodeId: string\r\nlet _sparklinesData: Record = {}\r\nlet _dataVersion: number\r\nlet _isWidget = false\r\nlet _getPublishCanvas: () => HTMLCanvasElement\r\n\r\nclass MapStore extends Store {\r\n getHoveredNode(mapNodeId: string) {\r\n if (mapNodeId === _mapNodeId) return _hoveredNode\r\n return undefined\r\n }\r\n\r\n getSparklines() {\r\n return _sparklinesData\r\n }\r\n\r\n getDataVersion() {\r\n return _dataVersion\r\n }\r\n\r\n isWidget() {\r\n return _isWidget\r\n }\r\n\r\n getPublishCanvas() {\r\n return _getPublishCanvas()\r\n }\r\n}\r\n\r\nvar mapStore = new MapStore()\r\n\r\n// @ts-ignore\r\nmapStore.dispatchToken = AppDispatcher.register(function (payload: any) {\r\n var action = payload.action\r\n\r\n switch (action.type) {\r\n case ActionTypes.RENDER_TREEMAP:\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_HOVERED_NODE:\r\n if (action.node !== _hoveredNode) {\r\n _hoveredNode = action.node\r\n _mapNodeId = action.mapNodeId\r\n mapStore.emitChange()\r\n }\r\n break\r\n\r\n case ActionTypes.CHANGE_TRANSLATE:\r\n // @ts-ignore\r\n _hoveredNode = undefined\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.LOAD_SPARKLINES_STARTED:\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.LOAD_SPARKLINES_COMPLETED:\r\n _sparklinesData = { ..._sparklinesData, ...action.data }\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.RESET_SPARKLINE_DATA:\r\n case ActionTypes.LOAD_SPARKLINES_FAILED:\r\n _sparklinesData = {}\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.UPDATE_DATA:\r\n _dataVersion = action.version\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_PUBLISH_CANVAS:\r\n _getPublishCanvas = action.getPublishCanvas\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_WIDGET:\r\n _isWidget = action.isWidget\r\n mapStore.emitChange()\r\n break\r\n }\r\n})\r\n\r\nexport default mapStore\r\n","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