{"version":3,"file":"home.6c15b4ec.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}\r\n\r\nif (refreshInfo?.interval) {\r\n initRefresh(refreshInfo.interval * 1000)\r\n\r\n function getIndicesRefreshInterval() {\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 classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Dialog, useDialogState } from 'reakit/Dialog'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const state = useDialogState({ modal: false, animated: COMPONENT_ANIMATION_DURATION })\r\n const [notification, setNotification] = React.useState(null)\r\n const { isFullyClosed, isFullyOpened } = getExtendedDialogState(state)\r\n const { viewport, setViewport } = useVisualViewport({ enabled: !!notification })\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getVisualViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n state.show()\r\n },\r\n hide: state.hide,\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n /**\r\n * Default button text\r\n * @default Close\r\n */\r\n closeText?: string\r\n\r\n /**\r\n * Custom buttons. Overrides `closeText`\r\n */\r\n actions?: JSX.Element\r\n\r\n /**\r\n * When set, the notification will automatically close\r\n */\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification({\r\n className,\r\n closeText = 'Close',\r\n actions,\r\n timeoutInMs,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: NodeJS.Timeout\r\n if (timeoutInMs) {\r\n timeoutId = setTimeout(() => {\r\n notification.hide()\r\n }, timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, timeoutInMs])\r\n\r\n return (\r\n \r\n
{children}
\r\n
\r\n {actions ?? (\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","/**\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