{"version":3,"file":"819.00ff12ec.js","mappings":"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","sources":["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/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/utils.ts","webpack://@finviz/website/./js/app/screener/utils.ts"],"sourcesContent":["import { MapSubtype, MapSubtypeId, MapType, MapTypeId, ScaleId } from '../types'\r\n\r\nexport const MAP_DATA_FETCH_INTERVAL = (FinvizSettings.hasUserPremium ? 20 : 120) * 1000\r\nexport const EXPANDED_MAP_BODY_CLASSS = 'is-map-expanded'\r\n\r\nexport const MAP_SUBTYPES_COMPANIES: MapSubtype[] = [\r\n {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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: MapSubtype[] = [\r\n {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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_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","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: 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_SEC_ALL: 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_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 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 { 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: '#262931',\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: '#262931',\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: '#22262f',\r\n border: '#22262f',\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: '#22262f',\r\n },\r\n },\r\n industry: {\r\n ...SettingsSmall.industry,\r\n header: {\r\n ...SettingsSmall.industry.header,\r\n border: '#22262f',\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: '#22262f',\r\n sector: {\r\n ...SettingsSmallGeo.sector,\r\n background: '#22262f',\r\n border: '#22262f',\r\n },\r\n industry: {\r\n ...SettingsSmallGeo.industry,\r\n border: '#22262f',\r\n background: '#22262f',\r\n header: {\r\n ...SettingsSmallGeo.industry.header,\r\n border: '#22262f',\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: '#22262f',\r\n border: '#22262f',\r\n },\r\n industry: {\r\n ...SettingsScreener.industry,\r\n header: {\r\n ...SettingsScreener.industry.header,\r\n border: '#22262f',\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 = (width: number, type: MapTypeId, isSmall: boolean) => {\r\n const ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n\r\n return ~~(width / ratio)\r\n }\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 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.name === 'Root') {\r\n this.sectors.push(d)\r\n } else if (d.parent && d.parent.name !== 'Root' && 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: Record\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: Record) =>\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: any, 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 return this._generateLayout(data, constants.ORDER_SP500)\r\n }\r\n\r\n _generateFull(data: MapDataRoot) {\r\n return this._generateLayout(data, constants.ORDER_SEC_ALL)\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 debounce from 'lodash.debounce'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../../main/services/api'\r\nimport { getDate } from '../../header/utils'\r\nimport Treemap from '../treemap'\r\nimport { MapData, MapDataNode, MapTypeId, PerfData } 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()\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(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 })\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(treemap: Treemap, props: { width: number; height: number; data: MapData }) {\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()\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 })\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({\r\n type: ActionTypes.UPDATE_DATA,\r\n version: data.version,\r\n timestamp: getDate(),\r\n })\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 _sparklinesData: Record = {}\r\nlet _dataVersion: number\r\nlet _dataTimestamp: Date\r\nlet _isWidget = false\r\nlet _getPublishCanvas: () => HTMLCanvasElement\r\n\r\nclass MapStore extends Store {\r\n getHoveredNode() {\r\n return _hoveredNode\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 getDataTimestamp() {\r\n return _dataTimestamp\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 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 _dataTimestamp = action.timestamp\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 * as React from 'react'\r\n\r\nimport { ScreenerQuery, ScreenerView } from '../screener/utils'\r\nimport { isMobile } from '../shared/isMobile'\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 { MapDataIndustry, MapDataNode, MapDataRoot, MapDataRow, MapDataSector, MapTypeId, PerfData } 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 const response = await fetch(`/maps/${filename}?rev=${cacheBuster}`)\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 && window.innerWidth < 1450 && !document.body.classList.contains('is-screener')\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 return {\r\n width,\r\n height: LayoutGenerator.calculateHeight(width, type, isSmall),\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 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 version: 1,\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","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"],"names":["MAP_DATA_FETCH_INTERVAL","FinvizSettings","hasUserPremium","EXPANDED_MAP_BODY_CLASSS","MAP_SUBTYPES_COMPANIES","id","MapSubtypeId","name","scaleId","ScaleId","tooltip","countIndustryPerf","countSectorPerf","MAP_SUBTYPES_ETF","MAP_TYPES","pageTitle","description","type","MapTypeId","subtypes","nameShort","MAP_TYPE_SCREENER","MAP_MIN_WIDTH","MAP_MIN_HEIGHT","SECTOR_MIN_HEIGHT","LEGEND_HEIGHT","LARGE_MAP_HEIGHT_RATIO","SMALL_MAP_GEO_HEIGHT_RATIO","SMALL_MAP_HEIGHT_RATIO","LARGE_NODE_SIZE","dx","dy","LARGE_NODE_MIN_HEIGHT","ORDER_SP500","Technology","Financial","Healthcare","Industrials","Energy","Utilities","ORDER_SEC_ALL","ORDER_ETF","US","Global","International","Commodity","Strategy","Forex","ORDER_SCREENER","ORDER_SCREENER_ETF","ORDER_WORLD","Ireland","Spain","France","Belgium","Netherlands","Switzerland","India","Taiwan","Colombia","Chile","Argentina","WORLD_INDUSTRIES","x","y","countries","scaleMinMax","_5","_10","_15","_20","_25","_relvol","_pe","_fpe","_peg","_ps","_pb","_div","_eps5y","_short","_rec","_earndate","_portfolioPct","_portfolioUsd","scaleStepFormat","Settings","padding","top","right","bottom","left","background","sector","border","header","color","height","fontSize","fontWeight","margin","industry","hover","scaleFontSizes","fontSizePadding","fontSizePairs","SettingsSmall","SettingsSmallDark","SettingsSmallGeo","SettingsSmallGeoDark","SettingsScreener","SettingsScreenerDark","LayoutGenerator","static","node","settings","_node$dx","_node$dy","deltaX","Math","round","x1","x0","deltaY","y1","y0","isLargeNode","constants","showHeader","constructor","width","isSmall","arguments","length","undefined","_defineProperty","arr","filter","_node$children","isVisible","this","isNodeVisible","children","filterVisibleNodes","d","depth","NodeDepth","isNodeHeaderVisible","smallIndustryPadding","smallIndustryGeoPadding","a","b","order","heightB","Number","isFinite","minSectorHeight","value","hasOwnProperty","data","d3","sum","sort","_getHierarchySort","paddingFn","_getPaddingGeo","_getPadding","size","tile","paddingTop","paddingRight","paddingBottom","paddingLeft","ratio","nodes","industryIndex","industryX","industryY","industryWidth","industryHeight","countriesRoots","_getIndustriesRoots","root","_rootsToRoot","hierarchy","_getHierarchy","treemapNodes","_getTreemap","treemap","each","brazil","find","colombia","brazilWidth","colombiaWidth","_d$parent","parent","includes","concat","descendants","getExportData","mapRoot","_this$layout","industries","layout","stringified","JSON","stringify","key","parse","getLayoutData","sectors","getLayout","_this$layout2","options","_generateSP500","_generateFull","_generateScreener","_generateWorld","_generateETF","forEach","_transformNode","push","Object","assign","perf","additional","roots","duplicateTickers","some","i","_getSectorsRoots","s","_generateLayout","recountSectors","treemapHeight","calculateHeight","recalculateHeight","_ref","showETF","getSizeRatio","_targetScale","updateVisibleSparklines","hoveredNode","mapStore","tickersToLoad","getVisibleTooltipTickers","debouncedLoadSparklines","_lastSparklinesRequest","debounce","async","tickers","mapType","_lastSparklinesReques","_lastSparklinesReques2","AppDispatcher","ActionTypes","cancel","call","apiRequest","query","t","join","ty","error","trailing","setHoveredNode","loadSparklineData","loadSparklinesCancel","_lastSparklinesReques3","_lastSparklinesReques4","resetSparklineData","changeTranslate","tx","zoom","translate","direction","offsetX","offsetY","zoomLevel","getNextZoomLevel","scale","animate","toFixed","requestAnimationFrame","zoomIn","getPreviousZoomLevel","zoomOut","render","zoomAndTranslate","updateLayout","props","updateData","updateDimensions","updatePerfData","updatePerf","version","timestamp","getDate","_setOnPublish","getPublishCanvas","setupWidget","isWidget","Dispatcher","handleServerAction","action","payload","source","PayloadSources","dispatch","handleViewAction","keyMirror","RENDER_TREEMAP","CHANGE_TRANSLATE","SET_HOVERED_NODE","LOAD_SPARKLINES_STARTED","LOAD_SPARKLINES_COMPLETED","LOAD_SPARKLINES_FAILED","RESET_SPARKLINE_DATA","INIT_STARTED","INIT_FAILED","UPDATE_DATA","SET_PUBLISH_CANVAS","SET_WIDGET","SERVER_ACTION","VIEW_ACTION","Store","EventEmitter","emitChange","emit","CHANGE_EVENT","addChangeListener","callback","on","removeChangeListener","removeListener","_hoveredNode","_dataVersion","_dataTimestamp","_getPublishCanvas","_sparklinesData","_isWidget","getHoveredNode","getSparklines","getDataVersion","getDataTimestamp","dispatchToken","getOffset","e","rect","currentTarget","getBoundingClientRect","clientX","clientY","getIsSmall","URLSearchParams","window","location","search","get","getSettingsForMapType","restoreDataKeys","perfData","map","row","newRow","getMapData","mapData","_mapData$children","_sector$children","_industry$children","company","splitData","fetchBaseData","filename","cacheBuster","fetch","json","getRatioSizeForWidth","mapWidth","max","getSize","element","canvasWrapper","document","getElementById","has","body","classList","contains","wrapper","style","removeProperty","clientWidth","elementHeight","innerHeight","newWidth","maxWidth","getSizeForExpandedMap","scrollbarWidth","innerWidth","documentElement","getSizeRatioBasedMap","getDefaultZoomLevels","isMobile","test","navigator","userAgent","parseInitDataAsPerf","industryTickers","rowHeight","visibleRows","floor","slice","min","n","onNodeClick","open","set","ScreenerQuery","ScreenerView","flatMap","replace","toLowerCase","ScreenerFilter","ScreenerAddtionalQuery","eventListenerRegister","el","eventName","handler","addEventListener","removeEventListener","textContent","innerText","ScreenerRenderCustomModal","select","getAttribute","customWrapper","display","input","_select$getAttribute$","_select$getAttribute","split","result","len","option","j","optionEl","ScreenerGetOptionsList","DATE_REGEX","getIsOptionDateRange","from","to","isValidFromDate","isValidToDate","isNaN","Date","getTime","getInitialDateFromSelectedValues","selectedValues","initialDate","date","dateRangeToFilterString","getQueryForView","view","_query$get$match","_query$get","allowedParams","baseQuery","allowList","values","keys","Array","delete","originalView","View","match","parseScreenerFilters","filtersString","Filters","fromEntries","f","lastUnderscore","lastIndexOf","substring","stringifyScreenerFilters","filters","entries","_ref2","String","_ref3"],"sourceRoot":""}