{"version":3,"file":"main.f9609d52.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/crypto/currencyUtils.ts","webpack://@finviz/website/./js/app/header/market-badge.tsx","webpack://@finviz/website/./js/app/header/time.tsx","webpack://@finviz/website/./js/app/header/utils.ts","webpack://@finviz/website/./js/app/shared/cookie.ts","webpack://@finviz/website/./js/app/shared/isMobile.ts","webpack://@finviz/website/./js/app/shared/sentry/constants.ts","webpack://@finviz/website/./js/app/shared/sentry/init.ts","webpack://@finviz/website/./js/main/components/TickerSearch/TickerSearchItem.tsx","webpack://@finviz/website/./js/main/components/TickerSearch/util.ts","webpack://@finviz/website/./js/main/components/TickerSearch/TickerSearch.tsx","webpack://@finviz/website/./js/main/components/box.tsx","webpack://@finviz/website/./js/main/components/button.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box-item.tsx","webpack://@finviz/website/./js/main/components/combo-box/hooks.ts","webpack://@finviz/website/./js/main/components/dialog/hooks.ts","webpack://@finviz/website/./js/main/components/error-view.tsx","webpack://@finviz/website/./js/main/components/highlight.tsx","webpack://@finviz/website/./js/main/components/icon/icon.tsx","webpack://@finviz/website/./js/main/components/icon/index.tsx","webpack://@finviz/website/./js/main/components/input.tsx","webpack://@finviz/website/./js/main/components/loading.tsx","webpack://@finviz/website/./js/main/components/centered.tsx","webpack://@finviz/website/./js/main/components/search/search-error.tsx","webpack://@finviz/website/./js/main/components/search/search-item.tsx","webpack://@finviz/website/./js/main/components/search/search-list.tsx","webpack://@finviz/website/./js/main/components/search/search-navigation-wrapper.tsx","webpack://@finviz/website/./js/main/components/search/search.tsx","webpack://@finviz/website/./js/main/components/search/useSearchComboboxState.ts","webpack://@finviz/website/./js/main/components/spinner.tsx","webpack://@finviz/website/./js/main/components/tooltip/types.ts","webpack://@finviz/website/./js/main/components/tooltip/tooltip-arrow.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip-box.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip-trigger.tsx","webpack://@finviz/website/./js/main/components/tooltip/TooltipProvider.tsx","webpack://@finviz/website/./js/main/components/tooltip/hooks.ts","webpack://@finviz/website/./js/main/components/typography.tsx","webpack://@finviz/website/./js/main/constants.ts","webpack://@finviz/website/./js/main/context.ts","webpack://@finviz/website/./js/main/hooks/use-resize-observer.ts","webpack://@finviz/website/./js/main/hooks/useCachedLoaderData.tsx","webpack://@finviz/website/./js/main/hooks/usePopoverPlacement.ts","webpack://@finviz/website/./js/main/components/ScrollRestore.tsx","webpack://@finviz/website/./js/main/modules/insider-trading/components/LoadingScreen.tsx","webpack://@finviz/website/./js/main/modules/insider-trading/index.tsx","webpack://@finviz/website/./js/main/modules/portfolio/index.ts","webpack://@finviz/website/./js/main/modules/quote/index.tsx","webpack://@finviz/website/./js/main/index.tsx","webpack://@finviz/website/./js/main/modules/insider-trading/constants.ts","webpack://@finviz/website/./js/main/modules/insider-trading/hooks/useInsiderTradingRouter.ts","webpack://@finviz/website/./js/main/modules/quote/types.ts","webpack://@finviz/website/./js/main/modules/quote/utils.ts","webpack://@finviz/website/./js/main/services/api.ts","webpack://@finviz/website/./js/main/services/routing.ts","webpack://@finviz/website/./js/main/types.ts","webpack://@finviz/website/./js/main/util-routing.tsx","webpack://@finviz/website/./js/main/util.tsx","webpack://@finviz/website/../charts/app/utils/ticker-sanitizer.ts","webpack://@finviz/website/../node_modules/date-fns/esm/parseISO/index.js"],"sourcesContent":["import { ObjectHash } from '../queryString'\r\n\r\nexport const DEFAULT_ACTIVE_CURRENCY = 'USD'\r\nexport const TILE_WIDTH = 240\r\n\r\nexport const CURRENCIES_LAYOUT: Record = {\r\n USD: [\r\n ['BTCUSD', 'ETHUSD', 'SOLUSD', 'BNBUSD', 'XRPUSD'],\r\n ['DOGEUSD', 'ADAUSD', 'TRXUSD', 'AVAXUSD', 'XLMUSD'],\r\n ['DOTUSD', 'LINKUSD', 'BCHUSD', 'SUIUSD', 'NEARUSD'],\r\n ['LTCUSD', 'APTUSD', 'EGLDUSD', 'OPUSD', 'AAVEUSD'],\r\n ],\r\n USDT: [\r\n ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT', 'XRPUSDT'],\r\n ['DOGEUSDT', 'ADAUSDT', 'TRXUSDT', 'AVAXUSDT', 'XLMUSDT'],\r\n ['DOTUSDT', 'LINKUSDT', 'BCHUSDT', 'SUIUSDT', 'NEARUSDT'],\r\n ['LTCUSDT', 'APTUSDT', 'EGLDUSDT', 'OPUSDT', 'SUSDT'],\r\n ],\r\n EUR: [\r\n ['BTCEUR', 'ETHEUR', 'SOLEUR', 'BNBEUR', 'XRPEUR'],\r\n ['DOGEEUR', 'ADAEUR', 'TRXEUR', 'AVAXEUR', 'XLMEUR'],\r\n ['DOTEUR', 'LINKEUR', 'BCHEUR', 'SUIEUR', 'NEAREUR'],\r\n ['LTCEUR', 'APTEUR', 'EGLDEUR', 'OPEUR', 'SEUR'],\r\n ],\r\n BTC: [\r\n ['BTCUSD', 'ETHBTC', 'SOLBTC', 'BNBBTC', 'XRPBTC'],\r\n ['DOGEBTC', 'ADABTC', 'TRXBTC', 'AVAXBTC', 'XLMBTC'],\r\n ['DOTBTC', 'LINKBTC', 'BCHBTC', 'SUIBTC', 'NEARBTC'],\r\n ['LTCBTC', 'APTBTC', 'EGLDBTC', 'OPBTC', 'SBTC'],\r\n ],\r\n}\r\n\r\n// NOTE: all tickers that are not visible at main 'crypto.ashx' but\r\n// we wanna keep them displayed as sparkline in the detail of ticker\r\nexport const TICKERS_NOT_IN_DASHBOARD: Record = {\r\n USDT: ['AAVEUSDT', 'TRUMPUSDT'],\r\n BTC: ['AAVEBTC'],\r\n}\r\n\r\nexport const CURRENCIES_LIST = Object.keys(CURRENCIES_LAYOUT)\r\n\r\nexport const CRYPTO_TICKERS = [\r\n ...Object.values(CURRENCIES_LAYOUT).flat(2),\r\n ...Object.values(TICKERS_NOT_IN_DASHBOARD).flat(1),\r\n]\r\n\r\nexport function getCurrency(ticker: string): string {\r\n if (ticker.endsWith('USD')) {\r\n return 'USD'\r\n } else if (ticker.endsWith('USDT')) {\r\n return 'USDT'\r\n } else if (ticker.endsWith('EUR')) {\r\n return 'EUR'\r\n } else if (ticker.endsWith('BTC')) {\r\n return 'BTC'\r\n }\r\n return DEFAULT_ACTIVE_CURRENCY\r\n}\r\n\r\nexport function getActiveCurrency(queryString: ObjectHash) {\r\n const activeCurrency = (queryString['c'] || DEFAULT_ACTIVE_CURRENCY).toUpperCase()\r\n return CURRENCIES_LIST.includes(activeCurrency) ? activeCurrency : DEFAULT_ACTIVE_CURRENCY\r\n}\r\n\r\nexport function getActiveCurrencySparklineTickers(activeCurrency: string) {\r\n return [...CURRENCIES_LAYOUT[activeCurrency].flat(1), ...(TICKERS_NOT_IN_DASHBOARD[activeCurrency] ?? [])]\r\n}\r\n\r\nexport function getCurrencyLongName(currency: string): string {\r\n switch (currency.toLowerCase()) {\r\n case 'btc':\r\n return 'Bitcoin'\r\n case 'eth':\r\n return 'Ethereum'\r\n case 'bnb':\r\n return 'Binance Coin'\r\n case 'sol':\r\n return 'Solana'\r\n case 'xrp':\r\n return 'Ripple'\r\n case 'doge':\r\n return 'Dogecoin'\r\n case 'ada':\r\n return 'Cardano'\r\n case 'trx':\r\n return 'TRON'\r\n case 'avax':\r\n return 'Avalanche'\r\n case 'dot':\r\n return 'Polkadot'\r\n case 'bch':\r\n return 'Bitcoin Cash'\r\n case 'near':\r\n return 'NEAR Protocol'\r\n case 'ltc':\r\n return 'Litecoin'\r\n case 'icp':\r\n return 'Internet Computer'\r\n case 'apt':\r\n return 'Aptos'\r\n case 'xlm':\r\n return 'Stellar'\r\n case 'link':\r\n return 'Chainlink'\r\n case 'shib':\r\n return 'Shiba Inu'\r\n case 'etc':\r\n return 'Ethereum Classic'\r\n case 'uni':\r\n return 'Uniswap'\r\n case 'fet':\r\n return 'Fetch.ai'\r\n case 'egld':\r\n return 'MultiversX'\r\n case 's':\r\n return 'Sonic'\r\n case 'op':\r\n return 'Optimism'\r\n case 'sui':\r\n return 'Sui'\r\n case 'aave':\r\n return 'Aave'\r\n case 'trump':\r\n return 'Trump'\r\n case 'usd':\r\n return 'US Dollar'\r\n case 'eur':\r\n return 'Euro'\r\n case 'usdt':\r\n return 'Tether'\r\n default:\r\n return currency\r\n }\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { isAftermarket, isHoliday, isPremarket } from './utils'\r\n\r\nexport enum MarketBadgeType {\r\n None,\r\n Open,\r\n Closed,\r\n Premarket,\r\n Aftermarket,\r\n}\r\n\r\nexport function getMarketBadgeText(type: MarketBadgeType, _date?: Date) {\r\n switch (type) {\r\n case MarketBadgeType.Open:\r\n return {\r\n label: 'Markets Open',\r\n }\r\n case MarketBadgeType.Closed:\r\n // const holiday = getHoliday(date)\r\n\r\n return {\r\n label: 'Markets Closed',\r\n // description: holiday && (\r\n // <>\r\n // The markets observe U.S. holidays and are closed on\r\n //
\r\n // {holiday.label}\r\n // \r\n // ),\r\n }\r\n case MarketBadgeType.Premarket:\r\n return {\r\n label: 'Premarket',\r\n // description: (\r\n // <>\r\n // An additional time window when trading is possible.\r\n //
\r\n // We report it as the time between 7:00 AM and 9:30 AM\r\n // \r\n // ),\r\n }\r\n case MarketBadgeType.Aftermarket:\r\n return {\r\n label: 'Aftermarket',\r\n // description: (\r\n // <>\r\n // An additional time window when trading is still possible.\r\n //
\r\n // We report it as the time between 4:00 PM and 6:30 PM\r\n // \r\n // ),\r\n }\r\n }\r\n}\r\n\r\nexport function getMarketBadgeType(time: Date, hasUserPremium?: boolean) {\r\n if (isHoliday(time)) return MarketBadgeType.Closed\r\n if (isPremarket(time, hasUserPremium)) return MarketBadgeType.Premarket\r\n if (isAftermarket(time, hasUserPremium)) return MarketBadgeType.Aftermarket\r\n // if (isMarketOpen(time, hasUserPremium)) return MarketBadgeType.Open\r\n\r\n return MarketBadgeType.None\r\n}\r\n\r\nexport interface MarketBadgeProps {\r\n badge: MarketBadgeType\r\n className?: string\r\n}\r\n\r\nexport function MarketBadge({ badge, className }: MarketBadgeProps) {\r\n if (badge === MarketBadgeType.None) return null\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nimport { Tooltip, TooltipTrigger, useTooltipState } from '../../main/components/tooltip'\r\nimport { Heading } from '../../main/components/typography'\r\nimport { useResizeObserver } from '../../main/hooks/use-resize-observer'\r\nimport { MarketBadge, MarketBadgeProps, getMarketBadgeText, getMarketBadgeType } from './market-badge'\r\nimport { TimeFormatType, getDate, getFormattedDateString } from './utils'\r\n\r\nconst UPDATE_INTERVAL = 10000\r\n\r\nenum TimeBreakpointMode {\r\n container,\r\n window,\r\n}\r\n\r\nexport interface TimeBreakpoint {\r\n minWidth: number\r\n marketBadgeText: boolean\r\n timeFormat: TimeFormatType\r\n}\r\n\r\nconst BREAKPOINTS: TimeBreakpoint[] = [\r\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\r\n { minWidth: 140, marketBadgeText: false, timeFormat: 'short' },\r\n { minWidth: 180, marketBadgeText: false, timeFormat: 'long' },\r\n { minWidth: 255, marketBadgeText: true, timeFormat: 'long' },\r\n]\r\n\r\nfunction getTimeState(fixedTime?: string | Date, hasUserPremium: boolean = FinvizSettings.hasUserPremium) {\r\n const time = getDate(fixedTime)\r\n const badge = getMarketBadgeType(time, hasUserPremium)\r\n\r\n return { time, badge }\r\n}\r\n\r\nfunction TooltipBadge(props: MarketBadgeProps & { time: Date }) {\r\n const state = useTooltipState({ placement: 'bottom' })\r\n const badge = getMarketBadgeText(props.badge, props.time)\r\n\r\n if (!badge) return null\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n {badge.label}\r\n \r\n {/* {badge.description && {badge.description}} */}\r\n \r\n \r\n )\r\n}\r\n\r\nfunction StaticBadge(props: MarketBadgeProps & { time: Date }) {\r\n const badge = getMarketBadgeText(props.badge, props.time)\r\n\r\n if (!badge) return null\r\n\r\n return (\r\n <>\r\n \r\n {`${badge.label} · `}\r\n \r\n )\r\n}\r\n\r\n/**\r\n * Find matching breakpoint or return the last (largest) one\r\n */\r\nfunction findMatchingBreakpoint(compareWidth: number | undefined, breakpoints: TimeBreakpoint[]) {\r\n if (typeof compareWidth !== 'number') return breakpoints[breakpoints.length - 1]\r\n\r\n const matchingBreakpoints = breakpoints.filter((breakpoint) => compareWidth >= breakpoint.minWidth)\r\n\r\n return matchingBreakpoints.pop() ?? breakpoints[breakpoints.length - 1]\r\n}\r\n\r\nfunction getCurrentWidth(mode: TimeBreakpointMode, element: HTMLElement | null) {\r\n return mode === TimeBreakpointMode.window ? window.innerWidth : (element?.clientWidth ?? 0)\r\n}\r\n\r\ninterface TimeProps extends React.HTMLProps {\r\n /**\r\n * Set custom time to display\r\n */\r\n fixedTime?: string | Date\r\n\r\n /**\r\n * What to measure the breakpoints to\r\n * - `container` parent element\r\n * - `window` window\r\n *\r\n * @default \"container\"\r\n */\r\n breakpointMode?: keyof typeof TimeBreakpointMode\r\n\r\n /**\r\n * Defines what information is visible at which breakpoint. Local mode measures\r\n * the component wrapper div and global mode measures window width. The definitions\r\n * must be ascending in width\r\n */\r\n breakpoints?: TimeBreakpoint[]\r\n}\r\n\r\nexport function Time({\r\n className,\r\n fixedTime,\r\n breakpointMode = 'container',\r\n breakpoints = BREAKPOINTS,\r\n ...props\r\n}: TimeProps) {\r\n const ResizeObserver = useResizeObserver()\r\n const rootRef = React.useRef(null)\r\n const [state, setState] = React.useState(getTimeState(fixedTime))\r\n const [currentBreakpoint, setBreakpoint] = React.useState(null)\r\n\r\n React.useEffect(() => {\r\n const interval = setInterval(() => setState(getTimeState(fixedTime)), UPDATE_INTERVAL)\r\n return () => clearInterval(interval)\r\n }, [fixedTime])\r\n\r\n React.useEffect(() => {\r\n if (!ResizeObserver || !rootRef.current) return\r\n\r\n if (!currentBreakpoint) {\r\n const currentWidth = getCurrentWidth(TimeBreakpointMode[breakpointMode], rootRef.current)\r\n setBreakpoint(findMatchingBreakpoint(currentWidth, breakpoints))\r\n }\r\n\r\n const handleResize = throttle(() => {\r\n const currentWidth = getCurrentWidth(TimeBreakpointMode[breakpointMode], rootRef.current)\r\n const foundBreakpoint = findMatchingBreakpoint(currentWidth, breakpoints)\r\n\r\n if (foundBreakpoint !== currentBreakpoint) setBreakpoint(foundBreakpoint)\r\n }, 150)\r\n\r\n const observer = new ResizeObserver((entries) => {\r\n window.requestAnimationFrame(() => {\r\n if (Array.isArray(entries) && entries.length > 0) handleResize()\r\n })\r\n })\r\n\r\n observer.observe(rootRef.current)\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n observer.disconnect()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [ResizeObserver, currentBreakpoint, breakpoints, breakpointMode])\r\n\r\n return (\r\n
\r\n {currentBreakpoint && (\r\n
\r\n {currentBreakpoint.marketBadgeText ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {getFormattedDateString(state.time, currentBreakpoint.timeFormat)}\r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\n/**\r\n * Check if a given date is DST in the US\r\n * - begins on the second Sunday in March\r\n * - ends on the first Sunday in November\r\n *\r\n * Keep in sync with https://github.com/finvizhq/charts/blob/master/app/utils.ts\r\n */\r\nexport function getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nexport function getDate(seed?: string | number | Date | null) {\r\n var date = seed != null ? new Date(seed) : new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n\r\n if (isDst) {\r\n dateAsNY.setUTCHours(dateAsNY.getUTCHours() + 1)\r\n }\r\n\r\n return dateAsNY\r\n}\r\n\r\nfunction getWeekDay(date: Date) {\r\n return date.toLocaleDateString('en-US', { weekday: 'short' })\r\n}\r\n\r\nfunction getMonth(date: Date, uppercase = true) {\r\n const name = date.toLocaleDateString('en-US', { month: 'short' })\r\n return uppercase ? name.toUpperCase() : name\r\n}\r\n\r\nfunction getDay(date: Date) {\r\n return date.getDate().toString().padStart(2, '0')\r\n}\r\n\r\nfunction getTime(date: Date) {\r\n return date.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true })\r\n}\r\n\r\nenum TimeFormat {\r\n long,\r\n short,\r\n dateOnly,\r\n timeOnly,\r\n}\r\n\r\nexport type TimeFormatType = keyof typeof TimeFormat\r\n\r\nexport function getFormattedDateString(date: Date = getDate(), format: TimeFormatType = 'long') {\r\n switch (TimeFormat[format]) {\r\n case TimeFormat.long:\r\n return `${getWeekDay(date)} ${getMonth(date)} ${getDay(date)} ${date.getFullYear()} ${getTime(date)} ET`\r\n case TimeFormat.short:\r\n return `${getWeekDay(date)} ${getMonth(date)} ${getDay(date)} ${getTime(date)}`\r\n case TimeFormat.dateOnly:\r\n return `${getMonth(date, false)} ${getDay(date)}`\r\n case TimeFormat.timeOnly:\r\n return getTime(date)\r\n }\r\n}\r\n\r\nexport function formatDate(value: Date | unknown, inputOrOutputFormat: string, outputFormat?: string): string {\r\n return dateFns.format(\r\n dateFns.isDate(value) ? (value as Date) : dateFns.parse(`${value}`, inputOrOutputFormat, new Date()),\r\n outputFormat ?? inputOrOutputFormat\r\n )\r\n}\r\n\r\nexport function isPremarket(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n const dayOfWeek = date.getDay()\r\n const min = date.getMinutes()\r\n const hours = date.getHours()\r\n\r\n if (isPremium && dayOfWeek !== 0 && dayOfWeek !== 6 && (hours === 7 || hours === 8 || (hours === 9 && min < 30))) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nexport function isAftermarket(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n const dayOfWeek = date.getDay()\r\n const min = date.getMinutes()\r\n\r\n if (\r\n isPremium &&\r\n dayOfWeek !== 0 &&\r\n dayOfWeek !== 6 &&\r\n (date.getHours() === 16 || date.getHours() === 17 || (date.getHours() === 18 && min < 30))\r\n ) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * https://www.nyse.com/markets/hours-calendars\r\n */\r\nconst HOLIDAY_DATES = [\r\n {\r\n label: \"New Year's Day\",\r\n test: (day: number, month: number) => month === 1 && day === 1,\r\n },\r\n {\r\n label: 'National Day of Mourning',\r\n test: (day: number, month: number) => month === 1 && day === 9,\r\n },\r\n {\r\n label: 'Martin Luther King, Jr. Day',\r\n test: (day: number, month: number) => month === 1 && day === 20,\r\n },\r\n {\r\n label: 'Presidents Day',\r\n test: (day: number, month: number) => month === 2 && day === 17,\r\n },\r\n {\r\n label: 'Good Friday',\r\n test: (day: number, month: number) => month === 4 && day === 18,\r\n },\r\n {\r\n label: 'Memorial Day',\r\n test: (day: number, month: number) => month === 5 && day === 26,\r\n },\r\n {\r\n label: 'Juneteenth Holiday',\r\n test: (day: number, month: number) => month === 6 && day === 19,\r\n },\r\n {\r\n label: 'Day before Independence Day (closed from 1 PM)',\r\n test: (day: number, month: number, hours: number) => month === 7 && day === 3 && hours >= 13,\r\n },\r\n {\r\n label: 'Independence Day',\r\n test: (day: number, month: number) => month === 7 && day === 4,\r\n },\r\n {\r\n label: 'Labor Day',\r\n test: (day: number, month: number) => month === 9 && day === 1,\r\n },\r\n {\r\n label: 'Thanksgiving Day',\r\n test: (day: number, month: number) => month === 11 && day === 27,\r\n },\r\n {\r\n label: 'Day after Thanksgiving (closed from 1 PM)',\r\n test: (day: number, month: number, hours: number) => month === 11 && day === 28 && hours >= 13,\r\n },\r\n {\r\n label: 'Day before Christmas (closed from 1 PM)',\r\n test: (day: number, month: number, hours: number) => month === 12 && day === 24 && hours >= 13,\r\n },\r\n {\r\n label: 'Christmas Day',\r\n test: (day: number, month: number) => month === 12 && day === 25,\r\n },\r\n]\r\n\r\nexport function getHoliday(date: Date = getDate()) {\r\n var day = date.getDate()\r\n var month = date.getMonth() + 1\r\n var hours = date.getHours()\r\n\r\n return HOLIDAY_DATES.find((holiday) => holiday.test(day, month, hours))\r\n}\r\n\r\nexport function isHoliday(date: Date = getDate()) {\r\n return !!getHoliday(date)\r\n}\r\n\r\nexport function isMarketOpen(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n if (isPremarket(date, isPremium) || isAftermarket(date, isPremium) || isHoliday(date)) {\r\n return false\r\n }\r\n\r\n const dayOfWeek = date.getDay()\r\n const hour = date.getHours()\r\n const minute = date.getMinutes()\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n // Day starts at 9:30\r\n const dayStarted = hour === 9 ? minute >= 30 : hour >= 10\r\n // Ends at 16:00\r\n const dayEnded = hour >= 16\r\n\r\n return !isWeekend && dayStarted && !dayEnded\r\n}\r\n","export function getParsedCookies(cookieName: string) {\r\n const parseCookies = document.cookie\r\n .split(';')\r\n .map((cookieString) => cookieString.split('='))\r\n .reduce(\r\n (acc, v) => {\r\n acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())\r\n return acc\r\n },\r\n {} as Record\r\n )\r\n\r\n return cookieName ? parseCookies[cookieName] : parseCookies\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n var re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n}\r\n\r\nexport function setCookie(name: string, value: string, expires: Date) {\r\n var cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (/\\bfinviz\\b/.test(document.location.hostname)) {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n}\r\n","// OS Matches\r\nconst matchesAndroid = navigator.userAgent.match(/Android/i)\r\nconst matchesWebOS = navigator.userAgent.match(/webOS/i)\r\nconst matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\nconst matchesiPad = navigator.userAgent.match(/iPad/i)\r\nconst matchesIPod = navigator.userAgent.match(/iPod/i)\r\nconst matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\r\nconst matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\r\nconst matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n// Browser Matches\r\nconst matchesFirefox = !!navigator.userAgent.match(/firefox/i)\r\nconst matchesSafariDesktopLike =\r\n /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && navigator.maxTouchPoints === 0\r\n\r\nconst isMobileDevice =\r\n matchesAndroid ||\r\n matchesWebOS ||\r\n matchesIPhone ||\r\n matchesiPad ||\r\n matchesIPod ||\r\n matchesBlackBerry ||\r\n matchesWindowsPhone ||\r\n matchesIOSLike\r\n\r\nexport function isMobile() {\r\n return !!isMobileDevice\r\n}\r\n\r\nexport function isIphone() {\r\n return !!(matchesIPhone && !matchesiPad)\r\n}\r\n\r\nexport function isIpad() {\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesiPad\r\n}\r\n\r\nexport function isSafariDesktop() {\r\n return matchesSafariDesktopLike\r\n}\r\n\r\nexport function isIos() {\r\n return !!matchesIOSLike && !isSafariDesktop()\r\n}\r\n\r\nexport function isFirefox() {\r\n return matchesFirefox\r\n}\r\n\r\nexport function isFirefoxDesktop() {\r\n return isFirefox() && !isMobile()\r\n}\r\n","import {\r\n dedupeIntegration,\r\n extraErrorDataIntegration,\r\n httpClientIntegration,\r\n thirdPartyErrorFilterIntegration,\r\n} from '@sentry/browser'\r\n\r\nexport const sentryOptions = {\r\n dsn: 'https://11de51e753454212a2845e5899a38cae@sentry.io/33153',\r\n allowUrls: [/finviz\\.com/, /www\\.finviz\\.com/, /elite\\.finviz\\.com/],\r\n release: typeof window !== 'undefined' && 'FinvizSentrySettings' in window ? FinvizSentrySettings.release : undefined,\r\n environment:\r\n typeof window !== 'undefined' && 'FinvizSentrySettings' in window ? FinvizSentrySettings.environment : undefined,\r\n sendDefaultPii: true,\r\n integrations: [\r\n dedupeIntegration(),\r\n extraErrorDataIntegration(),\r\n httpClientIntegration({ failedRequestTargets: [/finviz\\.com/] }),\r\n thirdPartyErrorFilterIntegration({\r\n filterKeys: ['finviz'], //NOTE: same application keys as specified in Sentry bundle plugin `webpack.config.js` -> `sentryWebpackPlugin`\r\n behaviour: 'apply-tag-if-exclusively-contains-third-party-frames',\r\n }),\r\n ],\r\n /**\r\n * Ignore if error message matches\r\n * For ignoring specific files, or errors in specific files use `ignoreStack` below\r\n */\r\n ignoreErrors: [\r\n 'AbortError: The operation was aborted.',\r\n 'TypeError: Failed to fetch',\r\n 'TypeError: NetworkError when attempting to fetch resource.',\r\n 'ChunkLoadError: Loading chunk',\r\n 'Error: Loading CSS chunk',\r\n /^TypeError: Load failed$/,\r\n ],\r\n /**\r\n * Ignore error if a script name in the stack matches any of these\r\n * For global ignore pattenrs use `ignoreErrors` above\r\n */\r\n ignoreStack: [\r\n // Ignore all quantserve scripts\r\n 'quantcount.com',\r\n 'quantserve.com',\r\n // Ignore network errors from cmp script\r\n 'investingchannel.com',\r\n ['cmp2.js', /(AbortError|NetworkError|aborted|network)/i],\r\n ] satisfies Array,\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { ThrowableError } from '../../../main/services/api'\r\nimport { sentryOptions } from './constants'\r\n\r\nif ('FinvizSentrySettings' in window && !('sentryDisabled' in window)) {\r\n Sentry.init({\r\n ...sentryOptions,\r\n beforeSend(event: Sentry.ErrorEvent, hint: Sentry.EventHint) {\r\n const originalError = hint.originalException as Error | null\r\n const exception = event.exception?.values?.[0]\r\n const errorFrames = exception?.stacktrace?.frames ?? []\r\n\r\n const mechanism = exception?.mechanism?.type ?? hint.mechanism?.type\r\n const message = originalError?.message ?? exception?.value\r\n\r\n /**\r\n * Ignore scripts matching `ignoreStack`.\r\n * - If pattern is string, only the script url is matched. In case of `http.client`, the url is matched\r\n * - If pattern is array, both url and and error message must match\r\n */\r\n const isIgnoredError = sentryOptions.ignoreStack.some((ignorePattern) => {\r\n const [ignoreSource, ignoreMessage] = Array.isArray(ignorePattern) ? ignorePattern : [ignorePattern]\r\n const isIgnoredScript =\r\n errorFrames.some((frame) => frame?.filename?.includes(ignoreSource)) ||\r\n (mechanism === 'http.client' && event.request?.url?.includes(ignoreSource))\r\n\r\n if (!ignoreMessage) return isIgnoredScript\r\n\r\n return message?.match(ignoreMessage)\r\n })\r\n\r\n if (isIgnoredError) return null\r\n\r\n // Completely ignore 524 errors, track other network errors as `info` if the status is 520+\r\n const statusCode =\r\n originalError instanceof ThrowableError ? originalError.status : (event.contexts?.response?.status_code ?? -1)\r\n if (statusCode === 500) {\r\n return { ...event, level: 'error', fingerprint: ['500'] }\r\n } else if (statusCode > 500 && statusCode < 520) {\r\n return { ...event, level: 'info', fingerprint: ['500+'] }\r\n } else if (statusCode > 520) {\r\n // Completely ignore 524 errors\r\n if (statusCode === 524) return null\r\n return { ...event, level: 'info', fingerprint: ['520+'] }\r\n }\r\n\r\n return event\r\n },\r\n })\r\n\r\n if (FinvizSentrySettings.id > 0) {\r\n Sentry.setUser({ id: String(FinvizSentrySettings.id) })\r\n }\r\n\r\n try {\r\n Sentry.setTags({\r\n dpr: window.devicePixelRatio,\r\n redesign: window.FinvizSettings?.hasRedesignEnabled,\r\n dark: window.FinvizSettings?.hasDarkTheme,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n } catch {}\r\n}\r\n\r\nwindow['Sentry'] = {\r\n captureException: Sentry.captureException,\r\n captureMessage: Sentry.captureMessage,\r\n withScope: Sentry.withScope,\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { SearchApiResult } from '../../services/api'\r\nimport { ComboBoxItem, ComboBoxItemProps } from '../combo-box'\r\nimport { Highlight } from '../highlight'\r\nimport { PropsWithAs } from '../types'\r\n\r\ninterface SearchItemProps extends Pick, Partial> {\r\n item: SearchApiResult\r\n dataTestId?: string\r\n}\r\n\r\nexport function TickerSearchItem({ item, dataTestId, ...props }: SearchItemProps) {\r\n const value = props.state!.useState('value')\r\n const isTickerWide = item.ticker.length > 7\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {item.exchange}\r\n \r\n )\r\n}\r\n","import { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { link } from '../../services/routing'\r\nimport { Instrument } from '../../types'\r\nimport { cleanTicker, getInstrumentForTicker } from '../../util'\r\n\r\nexport function getRedirectForTicker(tickerRaw: string) {\r\n const ticker = getSanitizedTicker(tickerRaw, true)\r\n const instrument = cleanTicker(ticker) ? getInstrumentForTicker(ticker) : null\r\n let redirectLink = ''\r\n\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n redirectLink = link.toQuote(ticker)\r\n break\r\n case Instrument.Forex:\r\n redirectLink = link.toForexChartDetail(ticker)\r\n break\r\n case Instrument.Futures:\r\n redirectLink = link.toFuturesChartDetail(ticker)\r\n break\r\n case Instrument.Crypto:\r\n redirectLink = link.toCryptoChartDetail(ticker)\r\n break\r\n default:\r\n return link.toSearch(ticker)\r\n }\r\n\r\n return redirectLink + (FinvizSettings.quoteSearchExt ?? '')\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport { useQuery } from '@tanstack/react-query'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { searchApiRequest } from '../../services/api'\r\nimport { link } from '../../services/routing'\r\nimport { Button } from '../button'\r\nimport { IconNameType } from '../icon'\r\nimport { InputSize, InputTheme } from '../input'\r\nimport { Search, SearchProps, useSearchComboboxState } from '../search'\r\nimport { TickerSearchItem } from './TickerSearchItem'\r\nimport { getRedirectForTicker } from './util'\r\n\r\ninterface Props extends Omit {\r\n /**\r\n * Whether the input should automatically receive focus when mounted\r\n */\r\n autoFocus?: boolean\r\n\r\n /**\r\n * Initial value for the input field\r\n */\r\n defaultValue?: string\r\n\r\n /**\r\n * Default placement position of the combobox popover\r\n * Inherits placement options from Ariakit ComboboxStore\r\n */\r\n defaultPlacement?: Ariakit.ComboboxStoreProps['placement']\r\n\r\n /**\r\n * Placeholder text shown when the input is empty\r\n */\r\n placeholder?: string\r\n\r\n /**\r\n * Visual theme variant for the input\r\n * References predefined styles from InputTheme\r\n */\r\n theme?: keyof typeof InputTheme\r\n\r\n /**\r\n * Size variant for the input\r\n * References predefined sizes from InputSize\r\n */\r\n size?: keyof typeof InputSize\r\n\r\n /**\r\n * Additional CSS class name for the input element\r\n */\r\n inputClass?: string\r\n\r\n /**\r\n * ChartIndex used for data-testid\r\n */\r\n chartIndex?: number\r\n\r\n /**\r\n * Whether to show the \"Show All\" option\r\n *\r\n * @default true\r\n */\r\n isShowAllVisible?: boolean\r\n\r\n /**\r\n * Whether search items should be rendered as links\r\n *\r\n * @default true\r\n */\r\n isSearchItemLink?: boolean\r\n\r\n /**\r\n * Content to show on the right side of the input (icon or custom element)\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Callback function triggered when a ticker is selected\r\n *\r\n * @param ticker - The selected ticker string\r\n */\r\n onTickerSelected?: (ticker: string) => void\r\n}\r\n\r\nexport function TickerSearch({ isShowAllVisible = true, isSearchItemLink = true, chartIndex, ...props }: Props) {\r\n const searchComboboxState = useSearchComboboxState({\r\n defaultValue: props.defaultValue,\r\n placement: props.defaultPlacement ?? 'bottom-start',\r\n setSelectedValue: (value) => {\r\n if (isSearchItemLink) {\r\n window.location.href = getRedirectForTicker(value as string)\r\n } else {\r\n props.onTickerSelected?.(getSanitizedTicker(value as string))\r\n // We have to reset the value (clear the input) in next tick otherwise it doesn't work\r\n setTimeout(() => searchComboboxState.setValue(''))\r\n }\r\n },\r\n })\r\n\r\n const value = searchComboboxState.useState('value')\r\n const activeValue = searchComboboxState.useState('activeValue')\r\n const { data, error, isLoading, refetch } = useQuery(['search', value], () => searchApiRequest(value), {\r\n enabled: value.length > 0,\r\n keepPreviousData: true,\r\n cacheTime: Infinity,\r\n staleTime: Infinity,\r\n })\r\n\r\n return (\r\n \r\n Show All Results\r\n \r\n ) : undefined\r\n }\r\n isLoading={isLoading}\r\n isError={!!error}\r\n onErrorRetry={refetch}\r\n {...props}\r\n >\r\n
\r\n {data?.map((item) => (\r\n \r\n ))}\r\n
\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport enum BoxRounding {\r\n none = '',\r\n regular = 'rounded-md', // 6px\r\n}\r\n\r\nexport enum BoxTheme {\r\n none = '',\r\n light = 'bg-white dark:bg-gray-800 border border-gray-100 dark:border-gray-600',\r\n dark = 'bg-gray-800 border border-gray-600',\r\n}\r\n\r\nexport interface BoxProps extends Omit, 'ref'> {\r\n 'data-testid'?: string\r\n rounding?: keyof typeof BoxRounding\r\n theme?: keyof typeof BoxTheme\r\n}\r\n\r\nexport const Box = React.forwardRef(function Box(\r\n { rounding = 'regular', theme = 'light', ...props }: BoxProps,\r\n ref: React.ForwardedRef\r\n) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n})\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { PropsWithAs } from './types'\r\n\r\nexport const BUTTON_DEFAULT_ELEMENT = 'button'\r\n\r\nexport const BUTTON_BASE_CLASS =\r\n 'group/button flex shrink-0 items-center justify-center font-medium whitespace-nowrap focus:outline-none'\r\nexport const BUTTON_SQUARE_BASE_CLASS = 'shrink-0 justify-center'\r\nexport const BUTTON_FOCUS_STYLES = 'focus-visible:ring-2 ring-gray-200 dark:ring-gray-500'\r\n\r\nexport enum ButtonSize {\r\n none = '', // Do not set fixed dimensions\r\n xxsmall = 'text-info h-4 min-w-4', // 16px height\r\n xsmall = 'text-2xs h-5 min-w-5', // 20px height\r\n small = 'text-2xs h-6 min-w-6', // 24px height\r\n regular = 'text-2xs h-7 min-w-7', // 28px height\r\n medium = 'text-sm h-8 min-w-8', // 32px height\r\n large = 'text-sm h-9 min-w-9', // 36px height\r\n xlarge = 'text-sm h-11 min-w-9', // 44px height\r\n}\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum ButtonPadding {\r\n none = '',\r\n xxsmall = 'px-0.5', // 2px padding\r\n xsmall = 'px-1', // 4px padding\r\n small = 'px-1.5', // 6px padding\r\n regular = 'px-2', // 8px padding\r\n medium = 'px-2.5', // 10px padding\r\n large = 'px-3', // 12px padding\r\n xlarge = 'px-3.5', // 14px padding\r\n}\r\n\r\nexport enum ButtonAlign {\r\n none = '',\r\n left = 'text-left',\r\n center = 'text-center',\r\n right = 'text-right',\r\n}\r\n\r\nexport type ButtonSizeType = keyof typeof ButtonSize\r\n\r\nexport enum ButtonSquareSize {\r\n none = '', // Do not set fixed dimensions\r\n xxsmall = 'h-4 w-4', // 16x16px\r\n xsmall = 'h-5 w-5', // 20x20px\r\n small = 'h-6 w-6', // 24x24px\r\n regular = 'h-7 w-7', // 28x28px\r\n medium = 'h-8 w-8', // 32x32px\r\n large = 'h-9 w-9', // 36x36px\r\n xlarge = 'h-11 w-11', // 44x44px\r\n}\r\n\r\nexport enum ButtonRounding {\r\n none = '',\r\n small = 'rounded', // 4px\r\n regular = 'rounded-md', // 6px\r\n full = 'rounded-full', // 9999px\r\n}\r\n\r\nexport type ButtonRoundingType = keyof typeof ButtonRounding\r\n\r\nexport enum ButtonTheme {\r\n transparent, // Only basic shape is rendered\r\n light,\r\n lightTransparent,\r\n dark,\r\n blue,\r\n violet,\r\n blueHover,\r\n red,\r\n headerItem,\r\n menuItem,\r\n menuItemTransparent,\r\n menuItemDark,\r\n opacity,\r\n outline,\r\n chipTransparent,\r\n chip,\r\n chipOutline,\r\n link,\r\n linkText,\r\n tab,\r\n}\r\n\r\nexport type ButtonThemeType = keyof typeof ButtonTheme\r\n\r\n/**\r\n * Get button theme\r\n */\r\nexport function getButtonTheme({\r\n theme,\r\n active = false,\r\n size = 'regular',\r\n}: {\r\n theme: ButtonTheme\r\n active?: boolean\r\n size?: ButtonSizeType\r\n}) {\r\n switch (theme) {\r\n case ButtonTheme.light: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-gray-200/90 disabled:bg-gray-200/30 disabled:text-gray-400 disabled:hover:bg-gray-200/30 disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-gray-200/30 hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n 'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.lightTransparent: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-gray-200/90 disabled:bg-transparent disabled:text-gray-400 disabled:hover:bg-transparent disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-transparent hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n 'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.dark: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-gray-50 active:bg-gray-500/90 disabled:bg-gray-500/30 disabled:text-gray-300 disabled:hover:bg-gray-500/30 disabled:hover:text-gray-300',\r\n {\r\n 'bg-gray-500/30 hover:bg-gray-500/50': !active,\r\n 'bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blue: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white hover:text-white active:bg-blue-600 disabled:bg-blue-200 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-blue-400 hover:bg-blue-500': !active,\r\n 'bg-blue-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.violet: {\r\n return {\r\n button: classnames(\r\n 'text-white hover:text-white focus:text-white disabled:bg-violet-200 dark:disabled:text-gray-300 disabled:hover:bg-violet-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-violet-500 hover:bg-violet-600': !active,\r\n 'bg-violet-700': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blueHover: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-blue-600 disabled:bg-blue-200 disabled:text-gray-400 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 disabled:hover:text-gray-400 dark:disabled:hover:text-gray-300',\r\n {\r\n 'text-blue-600 hover:bg-blue-400 hover:text-white dark:text-blue-500 dark:hover:text-white': !active,\r\n 'bg-blue-400 text-white': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.red: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white active:bg-red-600 disabled:bg-red-200 disabled:text-gray-300 disabled:hover:bg-red-200 disabled:hover:text-gray-300',\r\n {\r\n 'bg-red-400 hover:bg-red-500': !active,\r\n 'bg-red-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.headerItem: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent bg-gray-800 text-gray-300 hover:bg-gray-900 hover:text-white disabled:hover:text-gray-300 disabled:bg-gray-700 disabled:hover:bg-gray-700' // Base\r\n ),\r\n icon: 'text-white',\r\n }\r\n }\r\n case ButtonTheme.menuItem: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent dark:disabled:hover:bg-transparent disabled:hover:bg-transparent',\r\n {\r\n 'hover:bg-gray-200/30 disabled:text-gray-400 disabled:hover:text-gray-400 dark:hover:bg-gray-500/30':\r\n !active,\r\n 'bg-gray-200/30 dark:bg-gray-500/30': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.menuItemTransparent: {\r\n return {\r\n button: 'border border-transparent disabled:text-gray-400',\r\n }\r\n }\r\n case ButtonTheme.menuItemDark: {\r\n return {\r\n button: classnames('border border-transparent text-white dark:disabled:hover:bg-transparent', {\r\n 'hover:bg-gray-700': !active,\r\n 'bg-gray-700': active,\r\n }),\r\n }\r\n }\r\n case ButtonTheme.opacity:\r\n return {\r\n button: classnames(\r\n 'border border-transparent disabled:opacity-50 disabled:hover:opacity-50 dark:text-gray-400',\r\n {\r\n 'opacity-70 hover:opacity-100': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.outline:\r\n return {\r\n button: classnames(\r\n // Base styles\r\n 'bg-primary border disabled:border-gray-100 disabled:bg-gray-50 disabled:text-gray-500 disabled:hover:border-gray-100 disabled:hover:bg-gray-50 disabled:hover:text-gray-500',\r\n // Dark styles\r\n 'dark:bg-gray-800 dark:text-gray-50 dark:disabled:border-transparent dark:disabled:bg-gray-700 dark:disabled:text-gray-400 dark:disabled:hover:border-transparent dark:disabled:hover:bg-gray-700 dark:disabled:hover:text-gray-400',\r\n {\r\n 'border-blue-400 dark:border-blue-400': active,\r\n 'border-gray-100 hover:border-gray-300 dark:hover:border-gray-400 dark:border-gray-600': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.chip:\r\n return {\r\n button: classnames('border dark:disabled:hover:bg-gray-700 disabled:hover:bg-gray-50', {\r\n 'border-transparent bg-gray-200/30 hover:bg-gray-200/30 dark:bg-gray-700 dark:hover:bg-gray-500/30': !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:border-blue-400 dark:bg-gray-500/30 dark:text-white': active,\r\n }),\r\n }\r\n case ButtonTheme.chipOutline:\r\n return {\r\n button: classnames(\r\n // Base styles\r\n 'border text-gray-600 disabled:text-gray-400 disabled:hover:border-gray-200 disabled:hover:bg-primary disabled:hover:text-gray-400',\r\n // Dark styles\r\n 'dark:text-gray-200 dark:disabled:text-gray-400 dark:disabled:hover:text-gray-400 dark:disabled:hover:border-gray-600 dark:disabled:hover:bg-primary',\r\n {\r\n 'bg-primary border-primary hover:text-default hover:border-gray-300 hover:bg-gray-50 dark:hover:text-default dark:hover:bg-gray-900 dark:hover:border-gray-400':\r\n !active,\r\n 'text-default border-blue-400 bg-blue-50 dark:bg-blue-700 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.chipTransparent:\r\n return {\r\n button: classnames(\r\n 'border dark:disabled:hover:bg-transparent disabled:hover:bg-transparent dark:disabled:hover:text-gray-400 disabled:hover:text-gray-500', // Base styles\r\n {\r\n 'border-transparent text-gray-500 hover:bg-gray-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-500/30 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.link: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent disabled:text-blue-500/50 disabled:hover:text-blue-500/50', // Light\r\n 'dark:disabled:text-blue-300/50 dark:disabled:hover:text-blue-300/50', // Dark\r\n {\r\n 'text-blue-500 hover:text-blue-600 dark:text-blue-300 dark:hover:text-blue-200': !active,\r\n 'bg-blue-50 text-blue-600 dark:bg-blue-700 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.linkText: {\r\n return {\r\n button:\r\n 'text-inherit font-normal hover:text-blue-600 dark:hover:text-blue-200 no-underline hover:underline disabled:opacity-50 disabled:hover:opacity-50',\r\n }\r\n }\r\n case ButtonTheme.tab: {\r\n return {\r\n button: classnames('border-b', {\r\n 'border-b-gray-100 text-default dark:border-b-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 dark:hover:border-b-gray-600':\r\n !active,\r\n 'text-blue-500 border-b-blue-400 shadow-blue-400 dark:text-blue-300': active,\r\n 'shadow-[inset_0_-1px_0]': active && size !== 'xlarge',\r\n 'shadow-[inset_0_-3px_0]': active && size === 'xlarge',\r\n }),\r\n }\r\n }\r\n default:\r\n return {}\r\n }\r\n}\r\n\r\n/**\r\n * Export Button html props type so we don’t always have to omit\r\n */\r\nexport type ButtonHTMLProps = Omit<\r\n React.HTMLProps,\r\n 'ref' | 'type' | 'size' | 'content' | 'align' | 'as'\r\n>\r\n\r\nexport interface ButtonProps {\r\n /**\r\n * Visual appearance of the button\r\n */\r\n theme?: ButtonThemeType\r\n\r\n /**\r\n * Sets if button is square or normal.\r\n *\r\n * @default 'regular'\r\n */\r\n appearance?: 'regular' | 'square'\r\n\r\n /**\r\n * Size of the button\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: ButtonSizeType\r\n\r\n /**\r\n * Override align of the text for a button\r\n *\r\n * @default center, left when `leftContent` or `rightContent` are defined\r\n */\r\n align?: keyof typeof ButtonAlign\r\n\r\n /**\r\n * Override button padding\r\n *\r\n * @default undefined\r\n */\r\n padding?: keyof typeof ButtonPadding\r\n\r\n /**\r\n * Render button in an active state (darker background, etc.)\r\n */\r\n active?: boolean\r\n\r\n /**\r\n * Sets if the button has focus ring\r\n *\r\n * @default true\r\n */\r\n focusRing?: boolean\r\n\r\n /**\r\n * Sets rounded corners for the button\r\n *\r\n * @default regular\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n /**\r\n * Class for the content wrapper\r\n */\r\n contentClass?: string\r\n\r\n /**\r\n * Name of left icon\r\n */\r\n leftContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Name of right icon\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n}\r\n\r\nexport type ButtonComponentProps =\r\n PropsWithAs & ButtonProps\r\n\r\nfunction ButtonComponent(\r\n {\r\n as: asComponent,\r\n theme = 'light',\r\n size = 'regular',\r\n rounding = 'regular',\r\n focusRing = true,\r\n appearance = 'regular',\r\n align,\r\n padding = size, // same as size\r\n active,\r\n contentClass,\r\n leftContent,\r\n rightContent,\r\n className,\r\n children,\r\n ...props\r\n }: ButtonComponentProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const isSquare = appearance === 'square'\r\n const buttonTheme = React.useMemo(\r\n () => getButtonTheme({ theme: ButtonTheme[theme], active, size }),\r\n [theme, active, size]\r\n )\r\n const buttonPadding = React.useMemo(() => (isSquare ? null : ButtonPadding[padding]), [isSquare, padding])\r\n const buttonSize = isSquare ? ButtonSquareSize[size] : ButtonSize[size]\r\n const buttonRounding = ButtonRounding[rounding]\r\n const hasIcons = leftContent || rightContent\r\n\r\n return React.createElement(\r\n asComponent ?? BUTTON_DEFAULT_ELEMENT,\r\n {\r\n ...props,\r\n ref,\r\n className: classnames(\r\n BUTTON_BASE_CLASS,\r\n buttonTheme.button,\r\n buttonPadding,\r\n buttonSize,\r\n buttonRounding,\r\n {\r\n [BUTTON_SQUARE_BASE_CLASS]: isSquare,\r\n [BUTTON_FOCUS_STYLES]: focusRing,\r\n },\r\n className\r\n ),\r\n },\r\n <>\r\n {leftContent && (\r\n
\r\n {isValidIconName(leftContent) ? : leftContent}\r\n
\r\n )}\r\n {children && !isSquare ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n children\r\n )}\r\n {rightContent && (\r\n
\r\n {isValidIconName(rightContent) ? : rightContent}\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const Button = React.forwardRef(ButtonComponent) as <\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & ButtonProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Box } from '../box'\r\nimport { Input, InputProps } from '../input'\r\n\r\nexport interface ComboBoxProps extends Partial> {\r\n /**\r\n * The returned object from `useComboBoxState`\r\n */\r\n state: Ariakit.ComboboxStore\r\n\r\n /**\r\n * Additional props for the input\r\n */\r\n inputProps?: Partial & Omit, 'size'>\r\n\r\n /**\r\n * Additional props for the popover\r\n */\r\n popoverProps?: Partial\r\n\r\n /**\r\n * Id for testing purposes\r\n */\r\n inputTestId?: string\r\n\r\n /**\r\n * Minimum num of chars in input to show the popover\r\n */\r\n minValueLength?: number\r\n\r\n /**\r\n * Inut value getter\r\n */\r\n getInputValue?: (activeValue: string | undefined, value: string) => string\r\n}\r\n\r\nexport function ComboBox({\r\n state,\r\n children,\r\n inputProps,\r\n popoverProps,\r\n inputTestId,\r\n 'aria-label': ariaLabel,\r\n minValueLength = 0,\r\n getInputValue,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const isMounted = state.useState('mounted')\r\n const value = state.useState('value')\r\n const activeValue = state.useState('activeValue')\r\n const placement = state.useState('currentPlacement')\r\n\r\n const inputValue = React.useMemo(() => {\r\n if (getInputValue) return getInputValue(activeValue, value)\r\n\r\n return activeValue || value\r\n }, [getInputValue, value, activeValue])\r\n\r\n return (\r\n <>\r\n ) => {\r\n if (ev.key === 'Enter') {\r\n state.setSelectedValue(value)\r\n }\r\n inputProps?.onKeyDown?.(ev)\r\n }}\r\n />\r\n }\r\n {...props}\r\n />\r\n {isMounted && value.length >= minValueLength && (\r\n }\r\n store={state}\r\n aria-label={ariaLabel}\r\n {...popoverProps}\r\n className={classnames(\r\n 'z-dialog flex flex-col items-stretch space-y-px p-2 opacity-0 outline-none transition duration-[250ms] will-change-transform data-[enter]:translate-x-0 data-[enter]:translate-y-0 data-[enter]:opacity-100 motion-safe:transform',\r\n {\r\n 'motion-safe:translate-y-1': placement.startsWith('top'),\r\n 'motion-safe:-translate-x-1': placement.startsWith('right'),\r\n 'motion-safe:-translate-y-1': placement.startsWith('bottom'),\r\n 'motion-safe:translate-x-1': placement.startsWith('left'),\r\n },\r\n popoverProps?.className\r\n )}\r\n >\r\n {children}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","// Disable rule as the component is external\r\nimport * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonProps } from '../button'\r\nimport { PropsWithAs } from '../types'\r\n\r\nconst DEFAULT_ELEMENT = 'button'\r\n\r\nexport interface ComboBoxItemProps extends ButtonProps {\r\n /**\r\n * The returned object from `useComboBoxState`\r\n */\r\n state?: Ariakit.ComboboxStore\r\n\r\n /**\r\n * Value for the combo box item\r\n */\r\n value: string\r\n}\r\n\r\nfunction ComboBoxItemButton(\r\n { as: asComponent, children, 'data-active-item': dataActiveItem, ...props }: PropsWithAs & ButtonProps,\r\n ref: React.ForwardedRef\r\n) {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport const ComboBoxItemButtonWithRef = React.forwardRef(ComboBoxItemButton) as <\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & ButtonProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n\r\nexport function ComboBoxItem({\r\n as: asComponent,\r\n state,\r\n children,\r\n contentClass,\r\n ...props\r\n}: PropsWithAs & ComboBoxItemProps) {\r\n return (\r\n \r\n {children}\r\n \r\n }\r\n />\r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\nexport const useComboBoxState = Ariakit.useComboboxStore\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\n\r\nexport const ZIndexContext = React.createContext(null)\r\n\r\nexport function useZIndex(defaultValue: string | null = 'z-50') {\r\n return React.useContext(ZIndexContext) ?? defaultValue\r\n}\r\n\r\nexport type DialogStateProps = Ariakit.DialogStoreProps\r\nexport type DialogStateReturn = ReturnType\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function useDialogState(settings?: DialogStateProps) {\r\n return Ariakit.useDialogStore(settings)\r\n}\r\n\r\nexport const DialogDragContext = React.createContext<{\r\n enabled?: boolean\r\n handleRef?: React.RefObject\r\n boxPosition: { x: number; y: number }\r\n resetBoxPosition: () => void\r\n setBoxPosition: React.Dispatch>\r\n}>({\r\n enabled: false,\r\n handleRef: undefined,\r\n boxPosition: { x: 0, y: 0 },\r\n resetBoxPosition: () => {},\r\n setBoxPosition: () => {},\r\n})\r\n\r\n/**\r\n * Hook which allows an element on the page to become draggable\r\n */\r\nexport function useDrag(enabled?: boolean) {\r\n const dragging = React.useRef(false)\r\n const handleRef = React.useRef(null)\r\n const handleElement = handleRef.current\r\n\r\n /**\r\n * Set box position in both state for the component to re-render and as a ref\r\n * so that we don’t have to re-run the whole effect on every change\r\n */\r\n const [boxPosition, setBoxPosition] = React.useState({ x: 0, y: 0 })\r\n const boxPositionRef = React.useRef({ x: 0, y: 0 })\r\n const dragDiff = React.useRef({ x: 0, y: 0 })\r\n\r\n const { current: resetBoxPosition } = React.useRef(() => {\r\n setBoxPosition({ x: 0, y: 0 })\r\n })\r\n\r\n React.useEffect(() => {\r\n boxPositionRef.current = { ...boxPosition }\r\n }, [boxPosition])\r\n\r\n React.useEffect(() => {\r\n if (!enabled || !handleElement || isMobile()) return\r\n\r\n const onMouseDown = (ev: MouseEvent) => {\r\n dragging.current = true\r\n\r\n dragDiff.current = {\r\n x: ev.pageX - boxPositionRef.current.x - window.scrollX,\r\n y: ev.pageY - boxPositionRef.current.y - window.scrollY,\r\n }\r\n }\r\n\r\n const onMouseUp = () => {\r\n dragging.current = false\r\n }\r\n\r\n const onMouseMove = (ev: MouseEvent) => {\r\n if (!dragging.current) return\r\n\r\n const x = ev.pageX - dragDiff.current.x - window.scrollX\r\n const y = ev.pageY - dragDiff.current.y - window.scrollY\r\n\r\n setBoxPosition({ x, y })\r\n }\r\n\r\n handleElement.addEventListener('pointerdown', onMouseDown)\r\n handleElement.addEventListener('dblclick', resetBoxPosition)\r\n window.addEventListener('pointerup', onMouseUp)\r\n document.body.addEventListener('pointermove', onMouseMove)\r\n\r\n return () => {\r\n handleElement.removeEventListener('pointerdown', onMouseDown)\r\n handleElement.removeEventListener('dblclick', resetBoxPosition)\r\n window.removeEventListener('pointerup', onMouseUp)\r\n document.body.removeEventListener('pointermove', onMouseMove)\r\n }\r\n }, [enabled, handleElement, resetBoxPosition])\r\n\r\n return {\r\n enabled,\r\n handleRef,\r\n boxPosition,\r\n setBoxPosition,\r\n resetBoxPosition,\r\n }\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\nimport { ReactNode, useEffect } from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\nimport { useRouteError } from 'react-router-dom'\r\n\r\nimport { link } from '../services/routing'\r\nimport { Button } from './button'\r\nimport { Heading, Paragraph } from './typography'\r\n\r\ninterface ErrorViewProps {\r\n /**\r\n * Title of the message\r\n */\r\n title?: ReactNode\r\n\r\n /**\r\n * Body text\r\n */\r\n message?: ReactNode\r\n\r\n /**\r\n * Show contact support text under the message\r\n *\r\n * @default true\r\n */\r\n showContact?: boolean\r\n\r\n /**\r\n * Show refresh page button under the text\r\n *\r\n * @default true\r\n */\r\n showRefresh?: boolean\r\n}\r\n\r\nexport function ErrorView({ title, message, showContact = true, showRefresh = true }: ErrorViewProps) {\r\n return (\r\n
\r\n {title}\r\n {message}\r\n\r\n {showContact && (\r\n \r\n Our development team has been notified of this. If the error persists, please{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n )}\r\n\r\n {showRefresh && (\r\n \r\n Refresh page\r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\nexport function DefaultErrorBoundary({\r\n error,\r\n title = 'Application error',\r\n message = 'We’re sorry but an unknown error occured.',\r\n ...props\r\n}: Partial) {\r\n useEffect(() => {\r\n // Ignore webpack chunk loading errors\r\n if (error?.name === 'ChunkLoadError') return\r\n // Otherwise log to Sentry\r\n Sentry.captureException(error, { level: 'fatal' })\r\n // so we can see error in logs\r\n console.error('ErrorBoundary:', JSON.stringify(error))\r\n }, [error])\r\n\r\n return \r\n}\r\n\r\nexport function RouterErrorElement() {\r\n const error = useRouteError() as Error\r\n return \r\n}\r\n","import { useMemo } from 'react'\r\n\r\ninterface HighlightProps {\r\n /**\r\n * Search string that will be highlighted\r\n */\r\n highlight: string\r\n /**\r\n * Text to be highlighted\r\n */\r\n text: string\r\n}\r\n\r\nexport function Highlight({ highlight, text }: HighlightProps) {\r\n const index = text.toLowerCase().indexOf(highlight.toLowerCase())\r\n\r\n const processedText = useMemo(\r\n () => ({\r\n before: text.substring(0, index),\r\n highlight: text.substring(index, index + highlight.length),\r\n after: text.substring(index + highlight.length),\r\n }),\r\n [highlight.length, index, text]\r\n )\r\n\r\n if (index < 0 || highlight.length < 1) return {text}\r\n\r\n return (\r\n <>\r\n {processedText.before}\r\n {!!processedText.highlight.length && (\r\n \r\n {processedText.highlight}\r\n \r\n )}\r\n {processedText.after}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { IconNameType, iconList } from '.'\r\nimport { SVGProps } from './svg'\r\n\r\nexport interface IconProps extends SVGProps {\r\n /**\r\n * Icon name\r\n */\r\n name?: IconNameType\r\n\r\n /**\r\n * Alternative way to pass icon to render if you want to render a custom component\r\n * or use `iconList` object lookup\r\n */\r\n as?: React.FC\r\n}\r\n\r\nexport function Icon({ name, as: asComponent, className, width = 16, height = width, ...props }: IconProps) {\r\n if (name && asComponent) {\r\n throw new Error('Specifying both \"name\" and \"as\" on Icon component is not supported')\r\n }\r\n\r\n if (!name && !asComponent) {\r\n throw new Error('No icon specified')\r\n }\r\n\r\n if (name) {\r\n if (iconList[name] === undefined) {\r\n throw new Error('Icon not found')\r\n }\r\n\r\n const fileName = ['icons', iconList[name]].filter(Boolean).join('_')\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const Component = asComponent!\r\n return \r\n}\r\n","// Export the Icon component itself\r\nexport * from './icon'\r\n\r\nexport function isValidIconName(name?: unknown): name is IconNameType {\r\n if (!name || typeof name !== 'string') return false\r\n\r\n return iconList[name as IconNameType] !== undefined\r\n}\r\n\r\nexport type IconNameType = keyof typeof iconList\r\n\r\nconst root = ''\r\nconst chartLayouts = 'chart-layouts'\r\nconst chartTools = 'chart-tools'\r\nconst chartTypes = 'chart-types'\r\nconst screener = 'screener'\r\n\r\n// Export list of icon components\r\nexport const iconList = {\r\n // Main icons\r\n add: root,\r\n arrowBackward: root,\r\n arrowDownShort: root,\r\n arrowForward: root,\r\n arrowUpShort: root,\r\n briefcase: root,\r\n calendar: root,\r\n caretDown: root,\r\n caretLeft: root,\r\n caretRight: root,\r\n caretUp: root,\r\n caretVertical: root,\r\n chartBar: root,\r\n chartBubble: root,\r\n chartPie: root,\r\n chartTable: root,\r\n chartTreemap: root,\r\n checkboxTick: root,\r\n chevronDown: root,\r\n chevronRight: root,\r\n close: root,\r\n darkMode: root,\r\n diamondOutlined: root,\r\n done: root,\r\n drag: root,\r\n draw: root,\r\n empty: root,\r\n exitFullscreen: root,\r\n flash: root,\r\n fullscreen: root,\r\n gesture: root,\r\n gift: root,\r\n hamburger: root,\r\n help: root,\r\n idea: root,\r\n ideaLoad: root,\r\n ideaSave: root,\r\n info: root,\r\n interval: root,\r\n lightMode: root,\r\n lock: root,\r\n lockOpened: root,\r\n menuClose: root,\r\n minus: root,\r\n more: root,\r\n note: root,\r\n openInNew: root,\r\n palette: root,\r\n profile: root,\r\n publish: root,\r\n refresh: root,\r\n remove: root,\r\n restore: root,\r\n search: root,\r\n settings: root,\r\n settingsWheel: root,\r\n share: root,\r\n signOut: root,\r\n star: root,\r\n starOutlined: root,\r\n switchHorizontal: root,\r\n switchVertical: root,\r\n tabKey: root,\r\n template: root,\r\n trashCan: root,\r\n trendingDown: root,\r\n trendingUp: root,\r\n triangle: root,\r\n triangleOutlineDown: root,\r\n triangleOutlineUp: root,\r\n warning: root,\r\n\r\n // Chart layouts\r\n layout1h1v: chartLayouts,\r\n layout1h2v: chartLayouts,\r\n layout1h3v: chartLayouts,\r\n layout1l2r: chartLayouts,\r\n layout1t2b: chartLayouts,\r\n layout2h1v: chartLayouts,\r\n layout2h2v: chartLayouts,\r\n layout3h1v: chartLayouts,\r\n layout3h2v: chartLayouts,\r\n\r\n // Chart tools\r\n drawingActionDelete: chartTools,\r\n drawingSettingAutosaveOff: chartTools,\r\n drawingSettingAutosaveOn: chartTools,\r\n drawingSettingAutosaveSaving: chartTools,\r\n drawingSettingDrawingMode: chartTools,\r\n drawingSettingDrawingModeActive: chartTools,\r\n drawingSettingHide: chartTools,\r\n drawingSettingLock: chartTools,\r\n drawingSettingPreserveDrawings: chartTools,\r\n drawingSettingPreserveDrawingsActive: chartTools,\r\n drawingSettingShow: chartTools,\r\n drawingSettingUnlock: chartTools,\r\n toolArrow: chartTools,\r\n toolAVWAP: chartTools,\r\n toolBrush: chartTools,\r\n toolCallout: chartTools,\r\n toolCurve: chartTools,\r\n toolElliottWave: chartTools,\r\n toolEllipse: chartTools,\r\n toolExpand: chartTools,\r\n toolFibonacci: chartTools,\r\n toolLine: chartTools,\r\n toolMeasure: chartTools,\r\n toolMidLineH: chartTools,\r\n toolMidLineV: chartTools,\r\n toolMouse: chartTools,\r\n toolPitchfork: chartTools,\r\n toolPolygon: chartTools,\r\n toolPosition: chartTools,\r\n toolRect: chartTools,\r\n toolRectRotated: chartTools,\r\n toolText: chartTools,\r\n toolTriangle: chartTools,\r\n toolXABCD: chartTools,\r\n\r\n // Chart types\r\n candleBarBasic: chartTypes,\r\n candleBarHeikinAshi: chartTypes,\r\n candleBarHollow: chartTypes,\r\n lineChartType: chartTypes,\r\n ohlcChartType: chartTypes,\r\n\r\n // Screener\r\n above: screener,\r\n aboveEqual: screener,\r\n abovePercent: screener,\r\n below: screener,\r\n belowEqual: screener,\r\n belowPercent: screener,\r\n between: screener,\r\n crosses: screener,\r\n crossesDown: screener,\r\n crossesUp: screener,\r\n equal: screener,\r\n outside: screener,\r\n}\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef, useMemo } from 'react'\r\n\r\nimport { ButtonPadding } from './button'\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { Label } from './typography'\r\n\r\nexport enum InputTheme {\r\n none,\r\n light,\r\n dark,\r\n navigationBar,\r\n}\r\n\r\nexport enum InputRounding {\r\n none = '',\r\n regular = 'rounded-md',\r\n}\r\n\r\n/**\r\n * Enum for input size. Only set size on larger viewports to avoid page zooming\r\n */\r\nexport enum InputSize {\r\n small = 'h-6 text-2xs', // 24px height\r\n regular = 'h-7 text-2xs', // 28px height\r\n medium = 'h-8 text-sm', // 32px height\r\n large = 'h-9 text-sm', // 36px height\r\n}\r\n\r\nfunction getInputTheme({\r\n theme,\r\n isError,\r\n hasFocusStyle,\r\n isSelected,\r\n}: {\r\n theme: InputTheme\r\n isError: boolean\r\n hasFocusStyle: boolean\r\n isSelected: boolean\r\n}) {\r\n switch (theme) {\r\n case InputTheme.none:\r\n return {}\r\n case InputTheme.dark:\r\n return {\r\n input: classnames('border bg-gray-800 text-gray-50 disabled:bg-gray-700 disabled:text-gray-400', {\r\n 'border-gray-600 hover:border-gray-400 disabled:border-gray-700': !isError,\r\n 'border-red-400': isError,\r\n 'focus:border-blue-400 focus:hover:border-blue-400': !isError && hasFocusStyle,\r\n }),\r\n icon: classnames({\r\n 'text-gray-500': !isError,\r\n 'text-red-400': isError,\r\n 'group-focus-within:text-blue-400': !isError && hasFocusStyle,\r\n }),\r\n }\r\n case InputTheme.navigationBar:\r\n return {\r\n input: classnames(\r\n 'border bg-transparent disabled:border-gray-700 disabled:bg-gray-700 disabled:text-gray-400',\r\n {\r\n 'border-gray-100 dark:border-gray-600 text-gray-750 dark:text-gray-50':\r\n !isError && !FinvizSettings.hasUserPremium,\r\n 'border-gray-600 text-gray-50': !isError && FinvizSettings.hasUserPremium,\r\n 'border-red-400': isError,\r\n }\r\n ),\r\n icon: classnames({\r\n 'text-gray-500': !isError,\r\n 'text-red-400': isError,\r\n }),\r\n }\r\n default:\r\n return {\r\n input: classnames(\r\n 'border', // Base styles\r\n 'disabled:bg-secondary disabled:text-gray-500', // Light\r\n 'dark:disabled:bg-gray-700 dark:disabled:text-gray-400', // Dark\r\n {\r\n 'bg-primary': !isSelected,\r\n 'border-primary hover:border-gray-300 disabled:hover:border-gray-100 dark:hover:border-gray-400 dark:disabled:border-gray-700':\r\n !isError && !isSelected,\r\n 'border-red-400': isError,\r\n 'focus:border-blue-400 hover:focus:border-blue-400 dark:focus:border-blue-400 dark:hover:focus:border-blue-400':\r\n !isError && !isSelected && hasFocusStyle,\r\n 'bg-blue-50 border-blue-400 dark:bg-blue-700': isSelected,\r\n }\r\n ),\r\n icon: classnames({\r\n 'text-gray-300 dark:text-gray-500': !isError && !isSelected,\r\n 'text-red-400': isError,\r\n 'group-focus-within:text-blue-400': !isError && !isSelected && hasFocusStyle,\r\n 'text-blue-400': isSelected,\r\n }),\r\n }\r\n }\r\n}\r\n\r\ntype OmitNativeProps = Omit, 'label' | 'size'>\r\n\r\nexport interface InputProps {\r\n /**\r\n * Label which is rendered above the input\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Optional label layout switch\r\n */\r\n isHorizontalLabel?: boolean\r\n\r\n /**\r\n * Optional label className override\r\n */\r\n labelClassName?: string\r\n\r\n /**\r\n * Theme for the input\r\n *\r\n * @default light\r\n */\r\n theme?: keyof typeof InputTheme\r\n\r\n /**\r\n * Input size. This setting is ignored on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof InputSize\r\n\r\n /**\r\n * Border radius of the input\r\n *\r\n * @default regular\r\n */\r\n rounding?: keyof typeof InputRounding\r\n\r\n /**\r\n * Hide value stepper for number inputs\r\n */\r\n showNumberStepper?: boolean\r\n\r\n /**\r\n * Element to display on left the side of the input or name of the icon\r\n */\r\n leftContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Element to display on right the side of the input or name of the icon\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Additional class names for the input\r\n */\r\n inputClass?: string\r\n\r\n /**\r\n * Error label to display under the input\r\n */\r\n error?: ReactNode\r\n\r\n /**\r\n * Additional info to display under the input\r\n */\r\n caption?: ReactNode\r\n\r\n /**\r\n * Disables setting text size to 16px on mobile. Only use for pages which aren’t\r\n * responsive\r\n */\r\n isMobileStyleEnabled?: boolean\r\n\r\n /**\r\n * Toggle for component focus styles\r\n *\r\n * @default true\r\n */\r\n hasFocusStyle?: boolean\r\n\r\n /**\r\n * Toggle for selected styles\r\n *\r\n * @default true\r\n */\r\n isSelected?: boolean\r\n}\r\n\r\nexport type InputHTMLProps = OmitNativeProps\r\n\r\nexport type InputComponentProps = InputProps & InputHTMLProps\r\n\r\nfunction InputComponent(\r\n {\r\n label,\r\n isHorizontalLabel,\r\n labelClassName,\r\n size = 'regular',\r\n theme = 'light',\r\n rounding = 'regular',\r\n type,\r\n showNumberStepper = type === 'number',\r\n leftContent,\r\n rightContent,\r\n inputClass,\r\n error,\r\n caption,\r\n className,\r\n isMobileStyleEnabled = true,\r\n hasFocusStyle = true,\r\n isSelected = false,\r\n ...props\r\n }: InputComponentProps,\r\n ref: ForwardedRef\r\n) {\r\n const inputTheme = useMemo(\r\n () => getInputTheme({ theme: InputTheme[theme], isError: !!error, hasFocusStyle, isSelected }),\r\n [theme, error, hasFocusStyle, isSelected]\r\n )\r\n const isLeftStringIcon = isValidIconName(leftContent)\r\n const isRightStringIcon = isValidIconName(rightContent)\r\n const inputSize = InputSize[size]\r\n\r\n const commonSideContentClassnames = useMemo(\r\n () => ({\r\n 'flex absolute w-3 items-center justify-center': true,\r\n 'text-gray-500 dark:text-gray-600': theme === 'light',\r\n 'text-gray-600': theme === 'dark',\r\n }),\r\n [theme]\r\n )\r\n\r\n return (\r\n
\r\n
\r\n \r\n {caption && typeof caption !== 'boolean' && (\r\n {caption}\r\n )}\r\n {error && typeof error !== 'boolean' && {error}}\r\n \r\n )\r\n}\r\n\r\ninterface InputCaptionProps extends Omit, 'size'> {\r\n size?: keyof typeof InputSize\r\n}\r\n\r\nfunction InputCaption({ size = 'regular', ...props }: PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ntype TextareaProps = Omit & OmitNativeProps\r\n\r\nfunction TextareaComponent(\r\n {\r\n label,\r\n theme = 'light',\r\n rounding = 'regular',\r\n inputClass,\r\n error,\r\n caption,\r\n className,\r\n hasFocusStyle = true,\r\n isSelected = false,\r\n ...props\r\n }: TextareaProps,\r\n ref: ForwardedRef\r\n) {\r\n const textareaTheme = useMemo(\r\n () => getInputTheme({ theme: InputTheme[theme], isError: !!error, hasFocusStyle, isSelected }),\r\n [theme, error, hasFocusStyle, isSelected]\r\n )\r\n\r\n return (\r\n
\r\n \r\n {caption && typeof caption !== 'boolean' && (\r\n {caption}\r\n )}\r\n {error && typeof error !== 'boolean' && {error}}\r\n
\r\n )\r\n}\r\n\r\nexport const Input = forwardRef(InputComponent)\r\nexport const Textarea = forwardRef(TextareaComponent)\r\n","import { link } from '../services/routing'\r\nimport { Delayed, DelayedProps } from './delayed'\r\nimport { ErrorView } from './error-view'\r\nimport { Spinner } from './spinner'\r\n\r\ntype LoadingProps = Pick\r\n\r\nexport function Loading({ delay, timeout, throwOnTimeout }: LoadingProps) {\r\n return (\r\n \r\n There’s been an error loading the application.\r\n
\r\n Please make sure your internet connection is stable and refresh the page. If the error persists, please{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n }\r\n />\r\n }\r\n >\r\n \r\n \r\n )\r\n}\r\n\r\nexport function LoadingScreen(props: LoadingProps) {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren } from 'react'\r\n\r\nexport function Centered(props: PropsWithChildren>) {\r\n return
\r\n}\r\n","import { link } from '../../services/routing'\r\nimport { Button } from '../button'\r\nimport { Centered } from '../centered'\r\nimport { Icon } from '../icon'\r\nimport { Heading, Paragraph } from '../typography'\r\n\r\ninterface Props {\r\n onRetry?: () => void\r\n}\r\n\r\nexport function SearchError({ onRetry }: Props) {\r\n return (\r\n \r\n \r\n \r\n Error fetching the results\r\n \r\n \r\n There’s been an error fetching your results. Please try again or{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n {onRetry && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport { Link, useInRouterContext } from 'react-router-dom'\r\n\r\nimport { ComboBoxItem, ComboBoxProps } from '../combo-box'\r\nimport { Highlight } from '../highlight'\r\nimport { PropsWithAs } from '../types'\r\nimport { SearchListItem } from './constants'\r\n\r\ninterface SearchItemProps extends Pick, Partial> {\r\n item: SearchListItem\r\n}\r\n\r\nfunction getItemHrefProps(item: SearchListItem, inRouterContext?: boolean) {\r\n if (item.href) {\r\n if (inRouterContext) return { as: Link, to: item.href, reloadDocument: item.reloadDocument, target: item.target }\r\n else return { as: 'a' as React.ElementType, href: item.href, target: item.target }\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nexport function SearchItem({ item, state, ...props }: SearchItemProps) {\r\n const value = state.useState('value')\r\n const isInRouterContext = useInRouterContext()\r\n\r\n const itemProps = getItemHrefProps(item, isInRouterContext)\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n {item.subtitle && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { Centered } from '../centered'\r\nimport { Spinner } from '../spinner'\r\nimport { SearchListItem } from './constants'\r\nimport { SearchItem } from './search-item'\r\n\r\ninterface SearchListProps {\r\n /**\r\n * Ariakit combobox store for managing the search list state\r\n */\r\n state: Ariakit.ComboboxStore\r\n\r\n /**\r\n * Array of items to display in the search list\r\n */\r\n items?: SearchListItem[]\r\n\r\n /**\r\n * Custom footer content shown at the bottom of the search list\r\n */\r\n footer?: React.ReactNode\r\n\r\n /**\r\n * Whether the list is currently loading\r\n *\r\n * @default false\r\n */\r\n isLoading?: boolean\r\n}\r\n\r\nexport function SearchList({\r\n state,\r\n children,\r\n items,\r\n footer,\r\n isLoading = false,\r\n}: React.PropsWithChildren) {\r\n const isOpen = state.useState('open')\r\n const hasContent = React.Children.count(children) > 0 || (items?.length ?? 0) > 0 || !!footer || isLoading\r\n const { hide } = state\r\n\r\n React.useEffect(() => {\r\n if (!hasContent && isOpen) {\r\n hide()\r\n }\r\n }, [hide, hasContent, isOpen])\r\n\r\n if (isLoading) {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n
\r\n
\r\n {children ?? items?.map((item) => )}\r\n
\r\n {footer}\r\n
\r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { SearchProps } from './search'\r\n\r\ninterface Props extends Pick {\r\n children: React.ReactNode\r\n}\r\n\r\nfunction getSelectedItem({\r\n value,\r\n items,\r\n}: {\r\n value?: Ariakit.ComboboxStoreProps['selectedValue']\r\n items: SearchProps['items']\r\n}) {\r\n return items?.find((item) => item.value === value)\r\n}\r\n\r\nexport function SearchNavigationWrapperInRouterContext({ state, children, items }: Props) {\r\n const navigate = useNavigate()\r\n const selectedValue = state.useState('selectedValue')\r\n React.useEffect(() => {\r\n const { href, reloadDocument } = getSelectedItem({ value: selectedValue, items }) ?? {}\r\n if (href) {\r\n if (reloadDocument) {\r\n window.location.href = href\r\n } else {\r\n navigate(href)\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectedValue])\r\n\r\n return children\r\n}\r\n\r\nexport function SearchNavigationWrapperOutsideRouterContext({ state, children, items }: Props) {\r\n const selectedValue = state.useState('selectedValue')\r\n React.useEffect(() => {\r\n const href = getSelectedItem({ value: selectedValue, items })?.href\r\n\r\n if (href) {\r\n window.location.href = href\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectedValue])\r\n\r\n return children\r\n}\r\n","import * as React from 'react'\r\nimport { useInRouterContext } from 'react-router-dom'\r\n\r\nimport { ComboBox, ComboBoxProps } from '../combo-box'\r\nimport { IconNameType } from '../icon'\r\nimport { SearchListItem } from './constants'\r\nimport { SearchError } from './search-error'\r\nimport { SearchList } from './search-list'\r\nimport {\r\n SearchNavigationWrapperInRouterContext,\r\n SearchNavigationWrapperOutsideRouterContext,\r\n} from './search-navigation-wrapper'\r\n\r\nexport interface SearchProps\r\n extends Pick<\r\n ComboBoxProps,\r\n 'state' | 'autoFocus' | 'inputProps' | 'popoverProps' | 'aria-label' | 'inputTestId' | 'getInputValue'\r\n > {\r\n /**\r\n * Array of items to display in the search list\r\n */\r\n items?: SearchListItem[]\r\n\r\n /**\r\n * Minimum length of input value before showing results\r\n *\r\n * @default 1\r\n */\r\n minValueLength?: number\r\n\r\n /**\r\n * Placeholder text for the search input\r\n */\r\n placeholder?: string\r\n\r\n /**\r\n * Content to show on the right side of the input (icon or custom element)\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Custom footer content shown at the bottom of the search results\r\n */\r\n footer?: React.ReactNode\r\n\r\n /**\r\n * Whether to show the search icon in the input\r\n *\r\n * @default true\r\n */\r\n hasSearchIcon?: boolean\r\n\r\n /**\r\n * Whether to match the width of the input and its dropdown box\r\n */\r\n isMatchInputAndBoxWidth?: boolean\r\n\r\n /**\r\n * Whether the search is currently loading results\r\n *\r\n * @default false\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Whether there was an error loading the search results\r\n *\r\n * @default false\r\n */\r\n isError?: boolean\r\n\r\n /**\r\n * Callback function to retry when there's an error\r\n */\r\n onErrorRetry?: () => void\r\n}\r\n\r\nexport function Search({\r\n state,\r\n children,\r\n items,\r\n footer,\r\n 'aria-label': ariaLabel,\r\n inputProps,\r\n popoverProps,\r\n inputTestId,\r\n minValueLength = 1,\r\n hasSearchIcon = true,\r\n isLoading = false,\r\n isError = false,\r\n onErrorRetry,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const isInRouterContext = useInRouterContext()\r\n const isMounted = state.useState('mounted')\r\n\r\n const Wrapper = isInRouterContext\r\n ? SearchNavigationWrapperInRouterContext\r\n : SearchNavigationWrapperOutsideRouterContext\r\n\r\n return (\r\n \r\n {\r\n // prevent combobox from setting input value on input blur\r\n e.preventDefault()\r\n },\r\n leftContent: hasSearchIcon ? 'search' : undefined,\r\n ...inputProps,\r\n }}\r\n popoverProps={{\r\n sameWidth: props.isMatchInputAndBoxWidth,\r\n fitViewport: !props.isMatchInputAndBoxWidth,\r\n ...popoverProps,\r\n }}\r\n inputTestId={inputTestId}\r\n getInputValue={props.getInputValue}\r\n >\r\n {isMounted &&\r\n (isError ? (\r\n \r\n ) : (\r\n \r\n {children}\r\n \r\n ))}\r\n \r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\nimport { useComboBoxState } from '../combo-box'\r\n\r\nexport function useSearchComboboxState(props: Ariakit.ComboboxStoreProps = {}) {\r\n return useComboBoxState({\r\n placement: 'bottom-start',\r\n defaultSelectedValue: '',\r\n ...props,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\n\r\ninterface SpinnerProps {\r\n /**\r\n * Spinner as progress bar\r\n * @default false\r\n */\r\n isProgressBar?: boolean\r\n\r\n /**\r\n * Progress number in percent\r\n * @default 0\r\n */\r\n progress?: number\r\n\r\n /**\r\n * Spinner box width\r\n *\r\n * @default 28\r\n */\r\n width?: number\r\n}\r\n\r\nexport function Spinner({ isProgressBar = false, progress = 0, width = 28 }: SpinnerProps) {\r\n const radius = (3 * width) / 7\r\n const strokeWidth = radius / 3\r\n const circleXY = radius + strokeWidth / 2\r\n const circumference = radius * 2 * Math.PI\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","export enum TooltipColor {\r\n none,\r\n green,\r\n red,\r\n orange,\r\n blue,\r\n dark,\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { PopoverPlacement } from '../popover'\r\nimport { TooltipColor } from './types'\r\n\r\ntype PositionMain = 'auto' | 'top' | 'bottom' | 'left' | 'right'\r\n\r\nconst transformMap: Record = {\r\n auto: '',\r\n top: 'rotateZ(180deg)',\r\n right: 'rotateZ(-90deg)',\r\n bottom: 'rotateZ(360deg)',\r\n left: 'rotateZ(90deg)',\r\n}\r\n\r\ninterface TooltipArrowProps {\r\n color?: keyof typeof TooltipColor\r\n placement?: PopoverPlacement\r\n className?: string\r\n}\r\n\r\n/**\r\n * Custom arrow for the dropdown\r\n */\r\nexport function TooltipArrow({ placement, color = 'none', className }: TooltipArrowProps) {\r\n const positionMain = (placement?.split('-')[0] as PositionMain) ?? 'auto'\r\n const arrowColor = TooltipColor[color]\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipColor } from './types'\r\n\r\nexport interface TooltipBoxProps extends Omit, 'ref'> {\r\n /**\r\n * Color of the tooltip. If se to `none`, the tooltip will have default color\r\n * based on light/dark theme\r\n *\r\n * @default 'none'\r\n */\r\n color?: keyof typeof TooltipColor\r\n}\r\n\r\nexport const TooltipBox = React.forwardRef(function TooltipBox(\r\n { color = 'none', ...props }: TooltipBoxProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const tooltipColor = TooltipColor[color]\r\n\r\n return (\r\n \r\n {props.children}\r\n
\r\n )\r\n})\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isIos } from '../../../app/shared/isMobile'\r\nimport { usePopoverPlacement } from '../../hooks/usePopoverPlacement'\r\nimport { TooltipStateReturn } from './hooks'\r\nimport { TooltipArrow } from './tooltip-arrow'\r\nimport { TooltipBox, TooltipBoxProps } from './tooltip-box'\r\n\r\nconst isIosBrowser = isIos()\r\n\r\nconst TOOLTIP_WRAPPER_PROPS = {\r\n className: 'pointer-events-none',\r\n}\r\n\r\nexport interface TooltipProps\r\n extends TooltipBoxProps,\r\n Pick {\r\n // State is intentionally not marked as optional so you get error when you don’t provide it\r\n /**\r\n * Returned state from `useTooltipState`. Set `undefined` if you use a `PopoverProvider` wrapper (eg. TooltipInput)\r\n */\r\n state: TooltipStateReturn | undefined\r\n\r\n /**\r\n * Determines whether or not the tooltip receives mouse events\r\n *\r\n * @default true\r\n */\r\n isPointerEventsEnabled?: boolean\r\n}\r\n\r\nexport function Tooltip({\r\n state,\r\n children,\r\n gutter = 4,\r\n hideOnHoverOutside = true,\r\n isPointerEventsEnabled = true,\r\n color = 'none',\r\n onClose,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const context = Ariakit.useTooltipContext()\r\n const stateObject = state ?? context\r\n const { placement, zIndex, updatePosition } = usePopoverPlacement(stateObject)\r\n\r\n return (\r\n isn't always rendered and way of events\r\n // firing by iOS Safari\r\n unmountOnHide={!isIosBrowser}\r\n className={classnames(\r\n zIndex,\r\n 'cursor-default opacity-0 outline-none transition duration-[250ms] will-change-transform data-[enter]:translate-x-0 data-[enter]:translate-y-0 data-[enter]:opacity-100',\r\n {\r\n 'motion-safe:translate-y-1': placement?.startsWith('top'),\r\n 'motion-safe:-translate-x-1': placement?.startsWith('right'),\r\n 'motion-safe:-translate-y-1': placement?.startsWith('bottom'),\r\n 'motion-safe:translate-x-1': placement?.startsWith('left'),\r\n }\r\n )}\r\n // Update zIndex when popover position changes\r\n updatePosition={updatePosition}\r\n >\r\n \r\n \r\n \r\n \r\n {children}\r\n \r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipStateReturn } from './hooks'\r\n\r\ninterface TooltipButtonProps extends Omit {\r\n // State is intentionally not marked as optional so you get error when you don’t provide it\r\n /**\r\n * Returned state from `useTooltipState`. Set `undefined` if you use a `TooltipProvider` wrapper (eg. TooltipInput)\r\n */\r\n state: TooltipStateReturn | undefined\r\n\r\n /**\r\n * Hides tooltip on trigger click\r\n *\r\n * @default false\r\n */\r\n isHideOnClick?: boolean\r\n\r\n /**\r\n * Whether or not the tooltip should be visible when user hovers over the trigger element\r\n *\r\n * @default true\r\n */\r\n showOnHover?: boolean\r\n\r\n /**\r\n * Whether or not the tooltip should hide when the element is blurred\r\n */\r\n hideOnBlur?: boolean\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const TooltipTrigger = React.forwardRef(\r\n (\r\n {\r\n state,\r\n isHideOnClick,\r\n showOnHover = true,\r\n hideOnBlur,\r\n onClick,\r\n onMouseEnter,\r\n onMouseLeave,\r\n ...props\r\n }: TooltipButtonProps,\r\n ref: React.ForwardedRef\r\n ) => {\r\n const context = Ariakit.useTooltipContext()\r\n const stateObject = state ?? context\r\n\r\n return (\r\n {\r\n if (isHideOnClick) stateObject?.hide()\r\n onClick?.(ev)\r\n }}\r\n showOnHover={showOnHover}\r\n onMouseEnter={(ev) => {\r\n if (showOnHover === false) ev.preventDefault()\r\n onMouseEnter?.(ev)\r\n }}\r\n onMouseLeave={(ev) => {\r\n if (showOnHover === false) ev.preventDefault()\r\n onMouseLeave?.(ev)\r\n }}\r\n onBlur={() => {\r\n if (hideOnBlur) stateObject?.hide()\r\n }}\r\n {...props}\r\n >\r\n {props.children}\r\n \r\n )\r\n }\r\n)\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\ninterface TooltipProviderProps extends Omit {\r\n state?: Ariakit.TooltipProviderProps['store']\r\n}\r\n\r\nexport function TooltipProvider({ state, ...props }: TooltipProviderProps) {\r\n return \r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\n/**\r\n * Hook which provides state to tooltips\r\n */\r\nexport function useTooltipState({ showTimeout = 0, hideTimeout = 0, ...settings }: Ariakit.TooltipStoreProps = {}) {\r\n return Ariakit.useTooltipStore({\r\n ...settings,\r\n showTimeout,\r\n hideTimeout,\r\n })\r\n}\r\n\r\nexport type TooltipStateReturn = ReturnType\r\n","import classnames from 'classnames'\r\nimport React, { ComponentProps, ElementType, HTMLProps, PropsWithChildren, ReactNode } from 'react'\r\n\r\nimport { PropsWithAs } from './types'\r\n\r\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6\r\n\r\ninterface HeadingProps {\r\n /**\r\n * Heading level\r\n */\r\n level: HeadingLevel\r\n}\r\n\r\nfunction getHeadingElement(level: HeadingLevel) {\r\n switch (level) {\r\n case 1:\r\n return 'h1'\r\n case 2:\r\n return 'h2'\r\n case 3:\r\n return 'h3'\r\n case 4:\r\n return 'h4'\r\n case 5:\r\n return 'h5'\r\n default:\r\n return 'h6'\r\n }\r\n}\r\n\r\nexport function Heading({\r\n as: asComponent,\r\n level,\r\n children,\r\n ...props\r\n}: PropsWithAs & PropsWithChildren) {\r\n return React.createElement(\r\n asComponent ?? getHeadingElement(level),\r\n {\r\n ...props,\r\n className: classnames(props.className, 'font-bold', {\r\n 'text-3xl': level === 1,\r\n 'text-2xl': level === 2,\r\n 'text-xl': level === 3,\r\n // We don't want to set any specific fontsize because it's used e.g. in DialogHeader\r\n // where it uses font-size: inherit; and is different on old/redesign versions\r\n 'leading-[1.375]': level === 4,\r\n 'text-sm': level === 5,\r\n 'text-2xs': level === 6,\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface ParagraphProps extends Omit>, 'size' | 'as'> {\r\n /**\r\n * Determines which element the text should render to\r\n *\r\n * @default p\r\n */\r\n as?: ElementType\r\n\r\n /**\r\n * Font size for the paragraph\r\n * - tiny - 10px\r\n * - small - 12px\r\n * - default - 14px\r\n * - medium - 16px\r\n * - large - 18px\r\n *\r\n * @default default\r\n */\r\n size?: 'tiny' | 'small' | 'default' | 'medium' | 'large'\r\n\r\n /**\r\n * Paragraph font weight\r\n */\r\n medium?: boolean\r\n}\r\n\r\nexport function Paragraph({\r\n as = 'p',\r\n size = 'default',\r\n medium,\r\n children,\r\n ...props\r\n}: PropsWithChildren>) {\r\n return React.createElement(\r\n as,\r\n {\r\n ...props,\r\n className: classnames(props.className, {\r\n 'font-medium': medium,\r\n 'text-lg': size === 'large',\r\n 'text-sm': size === 'default',\r\n 'text-2xs': size === 'small',\r\n 'text-3xs': size === 'tiny',\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface LabelProps extends Omit, 'title'> {\r\n title?: ReactNode\r\n titleClassName?: string\r\n isHorizontal?: boolean\r\n}\r\n\r\nexport function Label({ title, titleClassName, isHorizontal, children, ...props }: PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","// Keep in sync with the copy in Charts repo - app/constants/common.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n quoteFinancials = 'quoteFinancials',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\n// @TODO: Reuse across the app (website & charts)\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n","import { createContext, useContext } from 'react'\r\n\r\nexport const SETTINGS_CONTEXT_DEFAULT = {\r\n versionImages: 0,\r\n nodeChartsDomain: '',\r\n hasUserPremium: false,\r\n name: '',\r\n email: '',\r\n hasDarkTheme: false,\r\n}\r\n\r\nexport const SettingsContext = createContext(SETTINGS_CONTEXT_DEFAULT)\r\n\r\nexport function useSettings() {\r\n return useContext(SettingsContext)\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { loadResizeObserverPolyfill } from '../util'\r\n\r\nexport function useResizeObserver() {\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const [ResizeObserver, setResizeObserver] = React.useState(\r\n () => window.ResizeObserver\r\n )\r\n\r\n React.useEffect(() => {\r\n if (typeof ResizeObserver === 'undefined') {\r\n loadResizeObserverPolyfill().then((polyfill) => {\r\n if (!controller.current?.signal.aborted) {\r\n setResizeObserver(() => polyfill)\r\n }\r\n })\r\n }\r\n }, [ResizeObserver])\r\n\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n return ResizeObserver\r\n}\r\n","import * as React from 'react'\r\nimport { ReactNode } from 'react'\r\nimport { useLoaderData } from 'react-router-dom'\r\n\r\nexport type CachedLoaderDataContextType = ReturnType\r\n\r\nexport const CachedLoaderDataContext = React.createContext<{\r\n data: any\r\n isCached: boolean\r\n} | null>(null)\r\n\r\nexport function useCachedLoaderData() {\r\n const context = React.useContext<{ data: DataType; isCached: boolean } | null>(CachedLoaderDataContext)\r\n\r\n if (context === null) {\r\n throw new Error(\r\n 'Error! Extracting context without wrapping your component with the CachedLoaderDataContextProvider'\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\ninterface CachedLoaderDataContextProviderProps {\r\n children: ReactNode\r\n isNullValidData?: boolean\r\n}\r\nexport function CachedLoaderDataContextProvider({\r\n children,\r\n isNullValidData = false,\r\n}: CachedLoaderDataContextProviderProps) {\r\n const loaderData = useLoaderData() as DataType\r\n const dataCacheRef = React.useRef(loaderData)\r\n\r\n const value = React.useMemo(() => {\r\n if (loaderData !== undefined && (loaderData !== null || isNullValidData)) {\r\n dataCacheRef.current = loaderData\r\n }\r\n return { data: dataCacheRef.current, isCached: !loaderData }\r\n }, [loaderData, isNullValidData])\r\n\r\n return {children}\r\n}\r\n","import React from 'react'\r\n\r\nimport { PopoverPlacement } from '../components'\r\nimport { useZIndex } from '../components/dialog/hooks'\r\n\r\nfunction getPlacementZIndex(placement: PopoverPlacement) {\r\n return placement!.startsWith('top') ? 'z-dialog' : 'z-50'\r\n}\r\n\r\nfunction changeZIndex(element: HTMLElement | null, placement: PopoverPlacement, computedZIndex = '') {\r\n if (!element) return\r\n element.style.removeProperty('z-index')\r\n element.classList.remove('z-50', 'z-dialog', computedZIndex)\r\n element.classList.add(getPlacementZIndex(placement))\r\n}\r\n\r\nexport function usePopoverPlacement(context: any) {\r\n const popoverElement: HTMLDivElement | null = context.useState('popoverElement')\r\n const placement: PopoverPlacement = context.useState('currentPlacement')\r\n const contextZIndex = useZIndex(null)\r\n const computedZIndex = getPlacementZIndex(placement)\r\n\r\n const updatePosition = React.useCallback(\r\n (props: { updatePosition: () => Promise }) => {\r\n if (!popoverElement) return\r\n\r\n const overlayElement = popoverElement?.previousElementSibling as HTMLElement | null\r\n\r\n if (!contextZIndex) {\r\n changeZIndex(popoverElement, placement, computedZIndex)\r\n if (overlayElement && overlayElement.dataset.backdrop) changeZIndex(overlayElement, placement, computedZIndex)\r\n }\r\n\r\n props.updatePosition()\r\n },\r\n [popoverElement, contextZIndex, computedZIndex, placement]\r\n )\r\n\r\n return {\r\n zIndex: contextZIndex ?? computedZIndex,\r\n placement,\r\n updatePosition,\r\n }\r\n}\r\n","import React from 'react'\r\nimport { ScrollRestoration, useLocation } from 'react-router-dom'\r\n\r\nconst DEFAULT_RESTORE_KEY = 'default'\r\n\r\n/**\r\n * Get type of last navigation\r\n * https://caniuse.com/mdn-api_performance_getentriesbytype\r\n */\r\nfunction getIsInitiallyRendered() {\r\n const navTypes = window.performance\r\n ?.getEntriesByType?.('navigation')\r\n .map((nav) => (nav as PerformanceNavigationTiming).type)\r\n\r\n return navTypes?.includes('reload') || navTypes?.includes('back_forward')\r\n}\r\n\r\n/**\r\n * Some of our views are based on query params (unsupported by router),\r\n * which creates problems with scroll restore navigating between pages (eg. quote)\r\n *\r\n * In order to work around this, we need to only restore the scroll on page reload\r\n * and not on navigation. But at the same time, we need to write the scroll position,\r\n * so we can restore it if we need to.\r\n *\r\n * We can’t simply render the component conditionally, because it’d restore scroll\r\n * on mount, so we need a way of restoring scroll only on reload, while preserving\r\n * the saving functionality, which we do by switching the key in an effect after the component has rendered\r\n */\r\nexport function ScrollRestore() {\r\n const loc = useLocation()\r\n const [resetKey, setKey] = React.useState(() =>\r\n getIsInitiallyRendered()\r\n ? DEFAULT_RESTORE_KEY\r\n : loc.key === DEFAULT_RESTORE_KEY\r\n ? Math.random().toString(16)\r\n : loc.key\r\n )\r\n\r\n React.useEffect(() => setKey(() => DEFAULT_RESTORE_KEY), [])\r\n\r\n return resetKey} />\r\n}\r\n","import { LoadingScreen as SharedLoadingScreen } from '../../../components/loading'\r\nimport { InsiderView } from '../constants'\r\nimport { useInsiderTradingRouter } from '../hooks/useInsiderTradingRouter'\r\n\r\nexport function LoadingScreen() {\r\n const insiderTradingRouter = useInsiderTradingRouter()\r\n\r\n // On index page we only use top bar from the module, min height (44px) is precalculated correctly\r\n // and there's another content already rendered on BE. SharedLoadingScreen has min height\r\n // which is way more than 44px but in this case even spinner doesn't look good so we're not rendering anything\r\n if (insiderTradingRouter.viewParams.view === InsiderView.Index) {\r\n return null\r\n }\r\n\r\n return \r\n}\r\n","import { Suspense } from 'react'\r\n\r\nimport { LazyRouteDefinition, createRouteViewSwitch, lazyLoadComponent } from '../../util-routing'\r\nimport { LoadingScreen } from './components/LoadingScreen'\r\nimport { InsiderView, InsiderViewParam } from './constants'\r\n\r\nconst { loader, action, ViewSwitch } = createRouteViewSwitch({\r\n defaultView: InsiderView.Index,\r\n viewParam: InsiderViewParam.View,\r\n views: {\r\n '': {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-index',\r\n load: () => import(/* webpackChunkName: \"insider-index\" */ './routes/Index'),\r\n }),\r\n },\r\n [InsiderView.Managers]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-managers',\r\n load: () => import(/* webpackChunkName: \"insider-managers\" */ './routes/Managers'),\r\n }),\r\n },\r\n [InsiderView.ManagerDetails]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-manager-details',\r\n load: () => import(/* webpackChunkName: \"insider-manager-details\" */ './routes/ManagerDetails'),\r\n }),\r\n },\r\n [InsiderView.ManagerHoldings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-manager-holdings',\r\n load: () => import(/* webpackChunkName: \"insider-manager-holdings\" */ './routes/ManagerHoldings'),\r\n }),\r\n },\r\n [InsiderView.Funds]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-funds',\r\n load: () => import(/* webpackChunkName: \"insider-funds\" */ './routes/Funds'),\r\n }),\r\n },\r\n [InsiderView.FundDetails]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-fund-details',\r\n load: () => import(/* webpackChunkName: \"insider-fund-details\" */ './routes/FundDetails'),\r\n }),\r\n },\r\n [InsiderView.FundHoldings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-fund-holdings',\r\n load: () => import(/* webpackChunkName: \"insider-fund-holdings\" */ './routes/FundHoldings'),\r\n }),\r\n },\r\n [InsiderView.NotFound]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-not-found',\r\n load: () => import(/* webpackChunkName: \"insider-not-found\" */ './routes/NotFound'),\r\n }),\r\n },\r\n },\r\n})\r\n\r\nexport const insiderTradingModule: LazyRouteDefinition[] = [\r\n {\r\n path: '/insidertrading.ashx',\r\n loader,\r\n action,\r\n element: (\r\n }>\r\n \r\n \r\n ),\r\n },\r\n]\r\n","import { revalidateOnQueryChange } from '../../util-routing'\r\nimport { lazyLoadComponent } from '../../util-routing'\r\n\r\nexport const portfolioModule = [\r\n {\r\n path: '/portfolio.ashx',\r\n shouldRevalidate: revalidateOnQueryChange(['pid']),\r\n loaderBundle: () => import(/* webpackChunkName: \"portfolio-view-loaders\" */ './routes/View/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'portfolio-view',\r\n load: () => import(/* webpackChunkName: \"portfolio-view\" */ './routes/View/Route'),\r\n }),\r\n },\r\n {\r\n path: '/create_new_portfolio.ashx',\r\n loaderBundle: () => import(/* webpackChunkName: \"portfolio-empty-loaders\" */ './routes/EmptyView/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'portfolio-empty',\r\n load: () => import(/* webpackChunkName: \"portfolio-empty\" */ './routes/EmptyView/Route'),\r\n }),\r\n },\r\n {\r\n path: '/portfolio_edit.ashx',\r\n loaderBundle: () => import(/* webpackChunkName: \"portfolio-edit-loaders\" */ './routes/BulkEdit/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'portfolio-edit',\r\n load: () => import(/* webpackChunkName: \"portfolio-edit\" */ './routes/BulkEdit/Route'),\r\n }),\r\n },\r\n]\r\n","import * as React from 'react'\r\nimport { ShouldRevalidateFunction } from 'react-router-dom'\r\n\r\nimport { shouldRevalidateOnQueryChange } from '../../util-routing'\r\nimport { LazyRouteDefinition, createRouteViewSwitch, lazyLoadComponent } from '../../util-routing'\r\nimport { QuoteQuery, QuoteSubview } from './types'\r\nimport { getQuoteSubview } from './utils'\r\n\r\nconst QuoteSharedWrapper = lazyLoadComponent({\r\n chunkName: 'quote-portal-components',\r\n load: () => import(/* webpackChunkName: \"quote-portal-components\" */ './components/QuoteSharedWrapper'),\r\n})\r\n\r\nexport function getShouldRevalidateQuoteRoute(): ShouldRevalidateFunction {\r\n return (args) => {\r\n const route = getQuoteSubview(args.currentUrl.searchParams.get('ty') as QuoteSubview)\r\n\r\n switch (route) {\r\n case QuoteSubview.OptionsChain:\r\n case QuoteSubview.OptionsVolatility:\r\n return shouldRevalidateOnQueryChange(args, ['e', 's', 'ov'])\r\n\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nconst optionsBundle = {\r\n loader: () => import(/* webpackChunkName: \"options-loaders\" */ '../options/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'options',\r\n load: () => import(/* webpackChunkName: \"options\" */ '../options'),\r\n }),\r\n}\r\n\r\nconst { loader, action, ViewSwitch } = createRouteViewSwitch({\r\n defaultView: '',\r\n viewParam: QuoteQuery.Type,\r\n views: {\r\n [QuoteSubview.OptionsChain]: optionsBundle,\r\n [QuoteSubview.OptionsVolatility]: optionsBundle,\r\n [QuoteSubview.Revenue]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'revenue',\r\n load: () => import(/* webpackChunkName: \"revenue\" */ '../revenue'),\r\n }),\r\n },\r\n [QuoteSubview.Dividends]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'dividends',\r\n load: () => import(/* webpackChunkName: \"dividends\" */ '../dividends'),\r\n }),\r\n },\r\n [QuoteSubview.Earnings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'earnings',\r\n load: () => import(/* webpackChunkName: \"earnings\" */ '../earnings'),\r\n }),\r\n },\r\n [QuoteSubview.Forecast]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'forecast',\r\n load: () => import(/* webpackChunkName: \"forecast\" */ '../forecast'),\r\n }),\r\n },\r\n [QuoteSubview.ShortInterest]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'short-interest',\r\n load: () => import(/* webpackChunkName: \"short-interest\" */ '../short-interest'),\r\n }),\r\n },\r\n [QuoteSubview.Traffic]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'traffic',\r\n load: () => import(/* webpackChunkName: \"traffic\" */ '../traffic'),\r\n }),\r\n },\r\n [QuoteSubview.LatestFilings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'latest-filings',\r\n load: () => import(/* webpackChunkName: \"latest-filings\" */ '../latest-filings'),\r\n }),\r\n },\r\n },\r\n})\r\n\r\nexport const quoteModule: LazyRouteDefinition[] = [\r\n {\r\n path: '/quote.ashx',\r\n loader,\r\n action,\r\n shouldRevalidate: getShouldRevalidateQuoteRoute(),\r\n Component: function QuoteRoot() {\r\n React.useEffect(() => {\r\n if (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n import(/* webpackChunkName: \"recent_quotes\" */ '../../../app/shared/recent_quotes')\r\n .then(({ RenderRecentQuotes }) => {\r\n RenderRecentQuotes()\r\n })\r\n .catch()\r\n }\r\n }, [])\r\n\r\n return (\r\n <>\r\n {/* Intentionally do not trigger upper router loading boundary, these components use portals */}\r\n \r\n \r\n \r\n\r\n \r\n \r\n )\r\n },\r\n },\r\n]\r\n","import '../app/shared/sentry/init'\r\n\r\nimport { Suspense } from 'react'\r\nimport * as ReactDOM from 'react-dom/client'\r\nimport { Outlet, RouterProvider, createBrowserRouter } from 'react-router-dom'\r\n\r\nimport '../../styles/charts.css'\r\nimport '../../styles/modal.css'\r\nimport '../../styles/tailwind.css'\r\nimport '../../styles/timeframe-bar.css'\r\nimport { ScrollRestore } from './components/ScrollRestore'\r\nimport { RouterErrorElement } from './components/error-view'\r\nimport { LoadingScreen } from './components/loading'\r\nimport { NotificationWrapper } from './components/notification'\r\nimport { SettingsContext } from './context'\r\nimport { useTrackPageView } from './hooks/use-track-pageview'\r\nimport { insiderTradingModule } from './modules/insider-trading'\r\nimport { portfolioModule } from './modules/portfolio'\r\nimport { quoteModule } from './modules/quote'\r\nimport { lazyLoadComponent } from './util-routing'\r\nimport { defineLazyRoutes } from './util-routing'\r\n\r\nconst router = createBrowserRouter([\r\n {\r\n path: '/',\r\n Component: () => {\r\n useTrackPageView()\r\n\r\n return (\r\n }>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n },\r\n ErrorBoundary: RouterErrorElement,\r\n children: defineLazyRoutes([\r\n ...insiderTradingModule,\r\n ...portfolioModule,\r\n ...quoteModule,\r\n {\r\n path: '/charts',\r\n Component: lazyLoadComponent({\r\n chunkName: 'charts',\r\n load: () => import(/* webpackChunkName: \"charts\" */ './modules/charts'),\r\n }),\r\n },\r\n {\r\n path: '/save_to_portfolio.ashx',\r\n Component: lazyLoadComponent({\r\n chunkName: 'save-to-portfolio',\r\n load: () => import(/* webpackChunkName: \"save-to-portfolio\" */ './modules/save-to-portfolio/Route'),\r\n }),\r\n },\r\n {\r\n path: '/create_alert.ashx',\r\n Component: lazyLoadComponent({\r\n chunkName: 'create-alert',\r\n load: () => import(/* webpackChunkName: \"create-alert\" */ './modules/create-alert/Route'),\r\n }),\r\n },\r\n ]),\r\n },\r\n])\r\n\r\nconst rootEl = document.getElementById('root')\r\nconst root = ReactDOM.createRoot(rootEl!)\r\n\r\nroot.render()\r\n","import { MapDataRoot } from '../../../app/maps/types'\r\nimport { ChartBoxoverEntry } from '../../../app/shared/components/ChartBoxover'\r\nimport { ColorVariant } from '../../components'\r\nimport type { ApiPaginatedResponse } from '../../types'\r\n\r\nexport const SEGMENT_COLORS = Object.keys(ColorVariant).filter(\r\n (c) => ![ColorVariant.gray, ColorVariant.default, ColorVariant.darkGray].includes(c as ColorVariant)\r\n) as ColorVariant[]\r\n\r\nexport enum InvestorType {\r\n Manager = 'manager_13f',\r\n OtherManager = 'other_manager_13f',\r\n Fund = 'nport_fund',\r\n}\r\n\r\nexport enum InsiderView {\r\n Index = '',\r\n Managers = 'managers',\r\n ManagerDetails = 'manager-details',\r\n ManagerHoldings = 'manager-holdings',\r\n Funds = 'funds',\r\n FundDetails = 'fund-details',\r\n FundHoldings = 'fund-holdings',\r\n NotFound = 'not-found',\r\n}\r\n\r\nexport enum InsiderViewParam {\r\n View = 'view',\r\n Page = 'page',\r\n Search = 'search',\r\n InvestorId = 'investorId',\r\n ReportEndDate = 'reportEndDate',\r\n TransactionType = 'transactionType',\r\n OptionType = 'optionType',\r\n AssetCategory = 'assetCategory',\r\n Sort = 'sort',\r\n InvestorType = 'investorType',\r\n}\r\n\r\nexport enum HoldingOptionType {\r\n Any = 'any',\r\n Share = 'share',\r\n Put = 'put',\r\n Call = 'call',\r\n}\r\n\r\nexport const InsiderViewHasParams: Record = {\r\n [InsiderView.Index]: [InsiderViewParam.View],\r\n [InsiderView.Managers]: [\r\n InsiderViewParam.View,\r\n InsiderViewParam.Page,\r\n InsiderViewParam.Search,\r\n InsiderViewParam.Sort,\r\n ],\r\n [InsiderView.ManagerDetails]: [InsiderViewParam.View, InsiderViewParam.InvestorId, InsiderViewParam.ReportEndDate],\r\n [InsiderView.ManagerHoldings]: [\r\n InsiderViewParam.View,\r\n InsiderViewParam.InvestorId,\r\n InsiderViewParam.ReportEndDate,\r\n InsiderViewParam.TransactionType,\r\n InsiderViewParam.OptionType,\r\n InsiderViewParam.Page,\r\n InsiderViewParam.Sort,\r\n ],\r\n [InsiderView.Funds]: [InsiderViewParam.View, InsiderViewParam.Page, InsiderViewParam.Search, InsiderViewParam.Sort],\r\n [InsiderView.FundDetails]: [InsiderViewParam.View, InsiderViewParam.InvestorId, InsiderViewParam.ReportEndDate],\r\n [InsiderView.FundHoldings]: [\r\n InsiderViewParam.View,\r\n InsiderViewParam.InvestorId,\r\n InsiderViewParam.ReportEndDate,\r\n InsiderViewParam.TransactionType,\r\n InsiderViewParam.AssetCategory,\r\n InsiderViewParam.Page,\r\n InsiderViewParam.Sort,\r\n ],\r\n [InsiderView.NotFound]: [InsiderViewParam.View, InsiderViewParam.InvestorType],\r\n}\r\n\r\nexport interface InsiderViewsParams {\r\n [InsiderView.Index]: Record\r\n [InsiderView.Managers]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.Page]: number\r\n [InsiderViewParam.Search]?: string\r\n [InsiderViewParam.Sort]?: string\r\n }\r\n [InsiderView.ManagerDetails]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.InvestorId]: string\r\n [InsiderViewParam.ReportEndDate]?: string\r\n }\r\n [InsiderView.ManagerHoldings]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.InvestorId]: string\r\n [InsiderViewParam.ReportEndDate]?: string\r\n [InsiderViewParam.TransactionType]?: HoldingTransactionType\r\n [InsiderViewParam.OptionType]?: HoldingOptionType\r\n [InsiderViewParam.Page]: number\r\n [InsiderViewParam.Sort]?: string\r\n }\r\n [InsiderView.Funds]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.Page]: number\r\n [InsiderViewParam.Search]?: string\r\n [InsiderViewParam.Sort]?: string\r\n }\r\n [InsiderView.FundDetails]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.InvestorId]: string\r\n [InsiderViewParam.ReportEndDate]?: string\r\n }\r\n [InsiderView.FundHoldings]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.InvestorId]: string\r\n [InsiderViewParam.ReportEndDate]?: string\r\n [InsiderViewParam.TransactionType]?: HoldingTransactionType\r\n [InsiderViewParam.AssetCategory]?: string\r\n [InsiderViewParam.Page]: number\r\n [InsiderViewParam.Sort]?: string\r\n }\r\n [InsiderView.NotFound]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.InvestorType]: InvestorType\r\n }\r\n}\r\n\r\nexport const INSIDER_VIEW_LABELS = {\r\n [InsiderView.Index]: 'Insiders',\r\n [InsiderView.Managers]: 'Managers',\r\n [InsiderView.Funds]: 'Funds',\r\n}\r\n\r\nexport interface ManagerSearchItemData {\r\n investorId: string\r\n name: string\r\n seriesName?: string\r\n portfolioManager?: string\r\n}\r\n\r\nexport interface InstOwnFiler {\r\n investorId: string\r\n filerName: string\r\n filerCik?: number\r\n seriesName?: string | null\r\n investorType: InvestorType\r\n otherManagerName?: string\r\n hasOwnHoldings?: boolean\r\n portfolioManager?: string\r\n}\r\n\r\ninterface InstOwnLatestSummary {\r\n reportDate: string\r\n totalSumOfUsdValue: number\r\n turnoverPerc: number\r\n}\r\n\r\nexport interface TopInvestmentType {\r\n ticker?: string\r\n name?: string\r\n value: number\r\n putCall: HoldingOptionType\r\n boxoverData: ChartBoxoverEntry | null\r\n}\r\n\r\nexport interface ManagerFundItemData {\r\n filer: InstOwnFiler\r\n topInvestments: Array\r\n latestSummaries: InstOwnLatestSummary[]\r\n}\r\n\r\ninterface ManagerFundSummary {\r\n investorId: string\r\n reportDate: string\r\n totalCountOfInvestments: number\r\n totalSumOfUsdValue: number\r\n totalSumOfUsdValuePrevQ: number | null\r\n countOfNewPurchased: number\r\n countOfSoldOut: number\r\n countOfAddedTo: number\r\n countOfReduced: number\r\n percOfPortfolioOfTop10: number\r\n turnoverPerc: number\r\n timeHeldTop10: number\r\n timeHeldTop20: number\r\n timeHeldAll: number\r\n isConfidentialOmitted: boolean\r\n}\r\n\r\nexport interface SectorAllocation {\r\n quarter: string\r\n sector: string\r\n pctAllocation: number\r\n usdAllocation: number\r\n}\r\n\r\nexport type IndividualManagers = Array<{ name: string; investorId: string | null }>\r\n\r\nexport interface ManagerData {\r\n filer: InstOwnFiler\r\n latestSummary: ManagerFundSummary\r\n topBuysUsd: TopInvestmentType[]\r\n topSellsUsd: TopInvestmentType[]\r\n topBuysPct: TopInvestmentType[]\r\n topSellsPct: TopInvestmentType[]\r\n individualManagers: IndividualManagers\r\n mapData: MapDataRoot\r\n sectorAllocations: SectorAllocation[]\r\n}\r\n\r\nexport interface InitialManagerDetailsData {\r\n initialManagerDetailsData: ManagerData\r\n initialManagerReportDates: string[]\r\n}\r\n\r\nexport interface CountryAllocation {\r\n quarter: string\r\n country: string\r\n pctAllocation: number\r\n usdAllocation: number\r\n}\r\n\r\nexport interface FundData {\r\n filer: InstOwnFiler\r\n latestSummary: ManagerFundSummary\r\n topBuysUsd: TopInvestmentType[]\r\n topSellsUsd: TopInvestmentType[]\r\n topBuysPct: TopInvestmentType[]\r\n topSellsPct: TopInvestmentType[]\r\n individualManagers: IndividualManagers\r\n mapData: MapDataRoot\r\n countryAllocations: CountryAllocation[]\r\n}\r\n\r\nexport interface InitialFundDetailsData {\r\n initialFundDetailsData: FundData\r\n initialFundReportDates: string[]\r\n}\r\n\r\nexport interface ManagerHolding {\r\n issuerTicker: string\r\n issuerName: string\r\n putCall: HoldingOptionType\r\n sector: string\r\n subAdvisorFlag: boolean\r\n shares: number\r\n valueUsd: number\r\n percentageOfPortfolio: number\r\n previousPercentageOfPortfolio: number\r\n changeInShares: number\r\n percentChangeFromPrevious: number\r\n lastClose: number\r\n firstQtrOwned: string\r\n percOwnership: number | null\r\n weightedAvgPrice: number | null\r\n boxoverData: ChartBoxoverEntry | null\r\n}\r\n\r\nexport interface InitialManagerHoldingsData {\r\n initialManagerHoldingsFiler: InstOwnFiler | null\r\n initialManagerHoldingsData: ApiPaginatedResponse\r\n initialManagerReportDates: string[]\r\n initialLatestSummary: {\r\n isConfidentialOmitted: boolean\r\n }\r\n}\r\n\r\nexport interface FundHolding {\r\n boxoverData: ChartBoxoverEntry | null\r\n issuerName: string\r\n issuerTicker: string\r\n assetCategory: string\r\n investmentCountry: string\r\n payOffProfile: string\r\n percentChangeFromPrevious: number // % Chng. balance\r\n percentageOfPortfolio: number\r\n previousPercentageOfPortfolio: number\r\n shareType: string // Units\r\n shares: number // Balance\r\n valueUsd: number\r\n}\r\n\r\nexport interface InitialFundHoldingsData {\r\n initialFundHoldingsFiler: InstOwnFiler | null\r\n initialFundHoldingsData: ApiPaginatedResponse\r\n initialFundReportDates: string[]\r\n initialFundAssetCategories: Record\r\n}\r\n\r\nexport enum ManagerFundSortEnum {\r\n MostPopular = 'most_popular',\r\n PortfolioValue = 'portfolio_value',\r\n NumInvestments = 'num_investments',\r\n NewPurchased = 'new_purchased',\r\n SoldOut = 'sold_out',\r\n Added = 'added',\r\n Reduced = 'reduced',\r\n TopTenConcentration = 'top_ten_concentration',\r\n Turnover = 'turnover',\r\n TimeHeldTop10 = 'time_held_top10',\r\n TimeHeldAll = 'time_held_all',\r\n}\r\n\r\nexport const ManagerFundSortLabel = {\r\n [ManagerFundSortEnum.MostPopular]: 'Most Popular',\r\n [ManagerFundSortEnum.PortfolioValue]: 'Portfolio Value',\r\n [ManagerFundSortEnum.NumInvestments]: 'Number of Investments',\r\n [ManagerFundSortEnum.NewPurchased]: 'New Purchased',\r\n [ManagerFundSortEnum.SoldOut]: 'Sold Out',\r\n [ManagerFundSortEnum.Added]: 'Added',\r\n [ManagerFundSortEnum.Reduced]: 'Reduced',\r\n [ManagerFundSortEnum.TopTenConcentration]: 'Top 10 Concentration',\r\n [ManagerFundSortEnum.Turnover]: 'Turnover',\r\n [ManagerFundSortEnum.TimeHeldTop10]: 'Time Held (Top 10)',\r\n [ManagerFundSortEnum.TimeHeldAll]: 'Time Held (All)',\r\n} as const\r\n\r\nexport const DEFAULT_QUERY_CACHE_TIME_IN_MS = 1000\r\n\r\nexport enum ChangeTypeEnum {\r\n Usd,\r\n Percentage,\r\n}\r\n\r\nexport enum HoldingColumnEnum {\r\n ticker = 'issuerTicker',\r\n name = 'issuerName',\r\n type = 'putCall',\r\n sector = 'sector',\r\n sharesHeld = 'shares',\r\n marketValue = 'valueUsd',\r\n portfolioPercentage = 'percentageOfPortfolio',\r\n previousPortfolioPercentage = 'previousPercentageOfPortfolio',\r\n changeInShares = 'changeInShares',\r\n changeInSharesPercentage = 'percentChangeFromPrevious',\r\n ownershipPercentage = 'percOwnership',\r\n averagePrice = 'weightedAvgPrice',\r\n currentPrice = 'currentPrice',\r\n quarterFirstOwned = 'firstQtrOwned',\r\n}\r\n\r\nexport enum FundHoldingColumnEnum {\r\n issuerTicker = 'issuerTicker',\r\n issuerName = 'issuerName',\r\n assetCategory = 'assetCategory',\r\n balance = 'shares',\r\n units = 'shareType',\r\n valueUsd = 'valueUsd',\r\n portfolioPercentage = 'percentageOfPortfolio',\r\n previousPortfolioPercentage = 'previousPercentageOfPortfolio',\r\n percentChangeFromPrevious = 'percentChangeFromPrevious',\r\n payOffProfile = 'payOffProfile',\r\n investmentCountry = 'investmentCountry',\r\n}\r\n\r\nexport enum HoldingTransactionType {\r\n Any = 'any',\r\n New = 'new',\r\n ClosedOut = 'closed_out',\r\n Added = 'added',\r\n Reduced = 'reduced',\r\n NoChange = 'no_change',\r\n}\r\n\r\nexport const HoldingTransactionTypeLabelMap = {\r\n [HoldingTransactionType.Any]: 'Any',\r\n [HoldingTransactionType.New]: 'New',\r\n [HoldingTransactionType.Added]: 'Added',\r\n [HoldingTransactionType.Reduced]: 'Reduced',\r\n [HoldingTransactionType.ClosedOut]: 'Closed Out',\r\n [HoldingTransactionType.NoChange]: 'No Change',\r\n}\r\n\r\nexport const HoldingTransactionTypes = [\r\n HoldingTransactionType.Any,\r\n HoldingTransactionType.New,\r\n HoldingTransactionType.Added,\r\n HoldingTransactionType.Reduced,\r\n HoldingTransactionType.ClosedOut,\r\n HoldingTransactionType.NoChange,\r\n]\r\n\r\nexport const HoldingOptionTypeLabelMap = {\r\n [HoldingOptionType.Any]: 'Any',\r\n [HoldingOptionType.Share]: 'Share',\r\n [HoldingOptionType.Put]: 'Put',\r\n [HoldingOptionType.Call]: 'Call',\r\n}\r\n\r\nexport const HoldingOptionTypes = [\r\n HoldingOptionType.Any,\r\n HoldingOptionType.Share,\r\n HoldingOptionType.Put,\r\n HoldingOptionType.Call,\r\n]\r\n","import { isValid, parseISO } from 'date-fns'\r\nimport * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { ObjectHash, encodeQueryString } from '../../../../app/queryString'\r\nimport {\r\n HoldingOptionType,\r\n HoldingTransactionType,\r\n InsiderView,\r\n InsiderViewHasParams,\r\n InsiderViewParam,\r\n InsiderViewsParams,\r\n InvestorType,\r\n} from '../constants'\r\n\r\nfunction getInsiderViewSpecificParams<\r\n T extends InsiderView,\r\n ParamsType extends Partial = Partial,\r\n>(params: ParamsType, view: T) {\r\n return Object.keys(params).reduce(\r\n (acc, key) =>\r\n InsiderViewHasParams[view]?.includes(key as InsiderViewParam)\r\n ? { ...acc, [key]: params[key as keyof ParamsType] }\r\n : acc,\r\n {} as ParamsType\r\n )\r\n}\r\n\r\nexport function useInsiderTradingRouter() {\r\n const [params] = useSearchParams()\r\n\r\n return React.useMemo(() => {\r\n const view = (params.get(InsiderViewParam.View) || InsiderView.Index) as T\r\n const reportEndDate = params.get(InsiderViewParam.ReportEndDate)\r\n\r\n const parsedParams: InsiderViewsParams[T] = {\r\n [InsiderViewParam.View]: view,\r\n [InsiderViewParam.Page]: Number(params.get(InsiderViewParam.Page) || '1'),\r\n [InsiderViewParam.Search]: params.get(InsiderViewParam.Search) ?? undefined,\r\n [InsiderViewParam.InvestorId]: params.get(InsiderViewParam.InvestorId) ?? '',\r\n [InsiderViewParam.ReportEndDate]: reportEndDate && isValid(parseISO(reportEndDate)) ? reportEndDate : undefined,\r\n [InsiderViewParam.TransactionType]:\r\n (params.get(InsiderViewParam.TransactionType) as HoldingTransactionType) ?? undefined,\r\n [InsiderViewParam.OptionType]: (params.get(InsiderViewParam.OptionType) as HoldingOptionType) ?? undefined,\r\n [InsiderViewParam.AssetCategory]: params.get(InsiderViewParam.AssetCategory) ?? undefined,\r\n [InsiderViewParam.Sort]: params.get(InsiderViewParam.Sort) ?? undefined,\r\n [InsiderViewParam.InvestorType]: params.get(InsiderViewParam.InvestorType) as InvestorType,\r\n }\r\n\r\n return {\r\n params,\r\n viewParams: getInsiderViewSpecificParams(parsedParams, view),\r\n getInsiderTradingLink: ({\r\n view,\r\n params = {},\r\n additionalQueryParams,\r\n }: {\r\n view: View\r\n params?: Partial\r\n additionalQueryParams?: ObjectHash\r\n }) =>\r\n `/insidertrading.ashx?${encodeQueryString({\r\n ...getInsiderViewSpecificParams({ ...params, view }, view),\r\n ...additionalQueryParams,\r\n })}`,\r\n }\r\n }, [params])\r\n}\r\n","// Do not import any file here. It might end up in the main bundle\r\n\r\nexport enum QuoteQuery {\r\n Ticker = 't',\r\n Type = 'ty',\r\n Period = 'p',\r\n DateRange = 'r',\r\n BackToScreener = 'b',\r\n}\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport enum QuoteView {\r\n // Default subviews for views\r\n ChartDetail = 'c',\r\n Financials = 'dv',\r\n Options = 'oc',\r\n}\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport enum QuoteSubview {\r\n ComparePerf = 'p',\r\n OptionsChain = 'oc',\r\n OptionsVolatility = 'ocv',\r\n Dividends = 'dv',\r\n Earnings = 'ea',\r\n Forecast = 'fc',\r\n Revenue = 'rv',\r\n ShortInterest = 'si',\r\n Traffic = 'tr',\r\n LatestFilings = 'lf',\r\n}\r\n","// Do not import any other file here, it might end up in the main bundle\r\nimport { QuoteSubview, QuoteView } from './types'\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport function getQuoteSubview(type: QuoteSubview | QuoteView) {\r\n return Object.values(QuoteSubview).find((value) => value === type) ?? null\r\n}\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport function getQuoteView(type: QuoteView | QuoteSubview) {\r\n switch (getQuoteSubview(type)) {\r\n case QuoteSubview.Dividends:\r\n case QuoteSubview.Earnings:\r\n case QuoteSubview.Forecast:\r\n case QuoteSubview.Revenue:\r\n return QuoteView.Financials\r\n case QuoteSubview.OptionsChain:\r\n case QuoteSubview.OptionsVolatility:\r\n return QuoteView.Options\r\n case null:\r\n return QuoteView.ChartDetail // No subview is active == chart detail\r\n default:\r\n return null // Eg. Short interest doesn’t belong to any parent group\r\n }\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { PortfolioDefinition } from '../modules/portfolio/types'\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/charts/blob/master/app/utils/fetch_api.ts\r\n// START\r\nexport enum ContentType {\r\n ApplicationJson = 'application/json',\r\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n switch (contentType) {\r\n case ContentType.ApplicationJson:\r\n case ContentType.ApplicationJsonUTF:\r\n case ContentType.FormUrlEncoded:\r\n return JSON.parse(response)\r\n default:\r\n return response\r\n }\r\n}\r\n// END\r\n\r\nexport class ThrowableError extends Error {\r\n status: number\r\n isServerError = false\r\n body: unknown\r\n extra: Record = {}\r\n\r\n constructor(status: number, message = 'ThrowableError', body = '', extra: Record = {}) {\r\n super(`${status} ${message}`)\r\n this.status = status\r\n this.isServerError = status >= 500\r\n this.body = body\r\n this.extra = extra\r\n }\r\n}\r\n\r\nexport interface CancelablePromise extends Promise {\r\n aborted?: boolean\r\n cancel?: () => void\r\n}\r\n\r\n/**\r\n * General api fetch utility which returns a cancelable promise\r\n */\r\nexport function apiRequest(\r\n url: string,\r\n { query, headers = {}, ...options }: RequestInit & { query?: Record } = {},\r\n throwOnAllErrors = false\r\n): CancelablePromise {\r\n const controller = 'AbortController' in window ? new AbortController() : undefined\r\n const requestUrl = query ? `${url}?${new URLSearchParams(query)}` : url\r\n const contentType: ContentType = (headers as any)['Content-Type'] ?? ContentType.ApplicationJson\r\n\r\n const requestOptions = {\r\n ...options,\r\n headers: {\r\n 'Content-Type': contentType,\r\n ...headers,\r\n },\r\n }\r\n const request = fetch(requestUrl, { ...requestOptions, signal: controller?.signal })\r\n\r\n const cancelableRequest: CancelablePromise = request\r\n .then(async (response) => {\r\n const textResponse = await response.text()\r\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n\r\n try {\r\n const parsedResponse = parseResponseForContentType(textResponse, responseContentType)\r\n if (!response.ok || response.status >= 500) {\r\n throw new ThrowableError(response.status, response.statusText, parsedResponse, {\r\n rayId: response.headers.get('cf-ray'),\r\n })\r\n }\r\n\r\n return parsedResponse\r\n } catch (error: any) {\r\n if (error instanceof ThrowableError) {\r\n throw error\r\n }\r\n throw new ThrowableError(response.status, error.message, textResponse, {\r\n rayId: response.headers.get('cf-ray'),\r\n })\r\n }\r\n })\r\n .catch((error: ThrowableError) => {\r\n if (error.status >= 500) {\r\n Sentry.withScope((scope) => {\r\n scope.setContext('Cloudflare', error.extra)\r\n\r\n if (error.status === 500) {\r\n Sentry.captureException(error)\r\n } else {\r\n Sentry.captureMessage(`${error.status} ${error.message}`)\r\n }\r\n })\r\n }\r\n if (throwOnAllErrors) {\r\n throw error\r\n }\r\n })\r\n\r\n if (controller) {\r\n cancelableRequest.cancel = () => {\r\n controller.abort()\r\n cancelableRequest.aborted = true\r\n }\r\n }\r\n\r\n return cancelableRequest\r\n}\r\n\r\nexport interface SearchApiResult {\r\n ticker: string\r\n company: string\r\n exchange: string\r\n}\r\n\r\nexport function searchApiRequest(input = '') {\r\n return apiRequest('/api/suggestions.ashx', { query: { input } }, true)\r\n}\r\n\r\nexport function portfoliosRequest() {\r\n return apiRequest<{ portfolios: PortfolioDefinition[] }>('/api/portfolio_data.ashx', {\r\n query: {\r\n fields: 'portfolios',\r\n },\r\n })\r\n}\r\n\r\nexport function lastCloseRequest(ticker: string) {\r\n return apiRequest('/request_quote.ashx', {\r\n query: {\r\n t: ticker,\r\n },\r\n })\r\n}\r\n\r\ninterface PortfolioLimitResult {\r\n transactions: number\r\n limitTransactions: number\r\n}\r\n\r\nexport function portfolioLimitRequest(portfolioId: number) {\r\n return apiRequest('/api/portfolio_data.ashx', {\r\n query: {\r\n pid: portfolioId,\r\n fields: 'transactions,limitTransactions',\r\n },\r\n })\r\n}\r\n\r\nexport function setCookieRequest(name: string, value?: unknown) {\r\n return apiRequest(\r\n '/api/set_cookie.ashx',\r\n {\r\n query: {\r\n cookie: name,\r\n ...(value !== undefined && {\r\n value: value,\r\n }),\r\n },\r\n },\r\n true\r\n )\r\n}\r\n","import * as pathToRegexp from 'path-to-regexp'\r\n\r\nimport { getCurrency } from '../../app/crypto/currencyUtils'\r\nimport { cleanTicker } from '../util'\r\n\r\n/**\r\n * Compile route path by applying parameters to it\r\n *\r\n * @example\r\n * // Outputs /route/1?query=foo\r\n * compilePath('/route/:id?query=:query', { id: 1, query: 'foo' })\r\n */\r\nfunction compilePath(\r\n path: string,\r\n params?: pathToRegexp.ParamData,\r\n options?: pathToRegexp.ParseOptions & pathToRegexp.CompileOptions\r\n) {\r\n return pathToRegexp.compile(path, options)(params)\r\n}\r\n\r\nexport const path = {\r\n home: '/',\r\n news: '/news.ashx',\r\n screener: '/screener.ashx',\r\n charts: '/charts',\r\n groups: '/groups.ashx',\r\n portfolio: '/portfolio.ashx',\r\n insider: '/insidertrading.ashx',\r\n elite: '/elite.ashx',\r\n search: '/search.ashx\\\\?p=:ticker',\r\n quote: '/quote.ashx\\\\?t=:ticker',\r\n contact: '/contact.ashx',\r\n\r\n alerts: '/alerts.ashx',\r\n help: '/help/screener.ashx',\r\n account: '/myaccount.ashx',\r\n login: '/login.ashx',\r\n logout: '/logout.ashx',\r\n\r\n // Maps\r\n maps: '/map.ashx',\r\n bubbles: '/bubbles.ashx',\r\n\r\n // Futures\r\n futures: '/futures.ashx',\r\n futuresPerf: '/futures_performance.ashx',\r\n futuresCharts: '/futures_charts.ashx',\r\n futuresChartDetail: '/futures_charts.ashx\\\\?t=:ticker',\r\n\r\n // Forex\r\n forex: '/forex.ashx',\r\n forexPerf: '/forex_performance.ashx',\r\n forexCharts: '/forex_charts.ashx',\r\n forexChartDetail: '/forex_charts.ashx\\\\?t=:ticker',\r\n\r\n // Crypto\r\n crypto: '/crypto.ashx',\r\n cryptoPerf: '/crypto_performance.ashx',\r\n cryptoCharts: '/crypto_charts.ashx',\r\n cryptoChartDetail: '/crypto_charts.ashx\\\\?t=:ticker&c=:currency',\r\n\r\n // Backtsest\r\n backtests: '/backtests.ashx',\r\n backtestCreate: '/backtest_create.ashx',\r\n backtestDetail: '/backtest_detail.ashx\\\\?id=:backtestId',\r\n backtestPresets: 'backtests.ashx\\\\?presets=1',\r\n}\r\n\r\nexport const link = {\r\n toHome: () => path.home,\r\n toNews: () => path.news,\r\n toScreener: () => path.screener,\r\n toCharts: () => path.charts,\r\n toGroups: () => path.groups,\r\n toPortfolio: () => path.portfolio,\r\n toInsider: () => path.insider,\r\n toElite: () => path.elite,\r\n toSearch: (ticker: string) => compilePath(path.search, { ticker }),\r\n toQuote: (ticker: string) => compilePath(path.quote, { ticker }),\r\n toContact: () => path.contact,\r\n\r\n toAlerts: () => path.alerts,\r\n toHelp: () => path.help,\r\n toAccount: () => path.account,\r\n toLogin: () => path.login,\r\n toLogout: () => path.logout,\r\n\r\n toMaps: () => path.maps,\r\n toBubbles: () => path.bubbles,\r\n\r\n toFutures: () => path.futures,\r\n toFuturesPerf: () => path.futuresPerf,\r\n toFuturesCharts: () => path.futuresCharts,\r\n toFuturesChartDetail: (ticker: string) => compilePath(path.futuresChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toForex: () => path.forex,\r\n toForexPerf: () => path.forexPerf,\r\n toForexCharts: () => path.forexCharts,\r\n toForexChartDetail: (ticker: string) => compilePath(path.forexChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toCrypto: () => path.crypto,\r\n toCryptoPerf: () => path.cryptoPerf,\r\n toCryptoCharts: () => path.cryptoCharts,\r\n toCryptoChartDetail: (ticker: string) =>\r\n compilePath(path.cryptoChartDetail, { ticker: cleanTicker(ticker), currency: getCurrency(cleanTicker(ticker)) }),\r\n\r\n toBacktests: () => path.backtests,\r\n toBacktestCreate: () => path.backtestCreate,\r\n toBacktestDetail: (backtestId: string | number) =>\r\n compilePath(path.backtestDetail, { backtestId: String(backtestId) }),\r\n toBacktestPresets: () => path.backtestPresets,\r\n}\r\n","export enum Instrument {\r\n Stock = 'stock',\r\n Forex = 'forex',\r\n Crypto = 'crypto',\r\n Futures = 'futures',\r\n MarketSentiment = 'market_sentiment',\r\n Group = 'group',\r\n}\r\n\r\nexport type RecordType = Record\r\n\r\nexport type PartialBy = Omit & Partial>\r\n\r\nexport type NullableNumbers = { [K in keyof Obj]: Obj[K] extends number ? number | null : Obj[K] }\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport type SortableValue = string | null | number | Date\r\nexport enum SortDirection {\r\n Ascending = 1,\r\n Descending = -1,\r\n}\r\n\r\nexport enum FeatureFlag {\r\n RedesignedPages = 'redesign',\r\n PortfolioRedesign = 'redesignpfo',\r\n OptionsGreeks = 'greeks',\r\n TrafficPage = 'trafficPage',\r\n ScreenerAddFilter = 'screeneraddfilter',\r\n}\r\n\r\nexport interface ApiPaginatedResponse {\r\n items: T\r\n page: number\r\n pageSize: number\r\n totalItemsCount: number\r\n totalPages: number\r\n}\r\n","import React, { ComponentType, LazyExoticComponent, lazy } from 'react'\r\nimport {\r\n ActionFunction,\r\n ActionFunctionArgs,\r\n LoaderFunction,\r\n LoaderFunctionArgs,\r\n type RouteObject,\r\n type ShouldRevalidateFunction,\r\n type ShouldRevalidateFunctionArgs,\r\n useSearchParams,\r\n} from 'react-router-dom'\r\n\r\nimport { parseInitData } from '../app/shared/utils'\r\nimport { CachedLoaderDataContextProvider } from './hooks/useCachedLoaderData'\r\n\r\n/**\r\n * This fn creates a revalidator rule which always revalidates loader when the\r\n * specified keys change but ignores changes to other keys. It also allows\r\n * `revalidator.revalidate` to work even if the query didn’t\r\n */\r\n\r\nexport function revalidateOnQueryChange(keys: string[]): ShouldRevalidateFunction {\r\n return (args) => {\r\n const prevParams = args.currentUrl.searchParams\r\n const nextParams = args.nextUrl.searchParams\r\n const requiredChanged = keys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n const otherChanged = [...prevParams.keys(), ...nextParams.keys()].some(\r\n (key, index, arr) =>\r\n // Get unique keys\r\n !keys.includes(key) &&\r\n arr.indexOf(key) === index &&\r\n // Check changed keys\r\n prevParams.get(key) !== nextParams.get(key)\r\n )\r\n\r\n if (!requiredChanged && otherChanged) {\r\n return false\r\n }\r\n\r\n return args.defaultShouldRevalidate\r\n }\r\n}\r\n\r\n/**\r\n * This fn does the same as `revalidateOnQueryChange`\r\n * except you need to provide `ShouldRevalidateFunctionArgs` manually\r\n */\r\n\r\nexport function shouldRevalidateOnQueryChange(args: ShouldRevalidateFunctionArgs, keys: string[]) {\r\n return revalidateOnQueryChange(keys)(args)\r\n}\r\n\r\nexport function parseRouteInitData({\r\n elementId = 'route-init-data',\r\n fallback = null,\r\n removeElement = true,\r\n}: { elementId?: string; fallback?: DataType | null; removeElement?: boolean } = {}): DataType | null {\r\n const element = document.getElementById(elementId)\r\n let initialData = fallback\r\n\r\n if (!element) return fallback\r\n\r\n try {\r\n const parsedData = parseInitData(elementId)\r\n if (removeElement) element.remove()\r\n\r\n if (parsedData) initialData = parsedData\r\n } catch {\r\n initialData = fallback\r\n }\r\n\r\n return initialData\r\n}\r\n\r\n/**\r\n * Function which wraps React.lazy and checks whether a chunk is preloaded\r\n * from async-manifest. If yes, kick in the promise resolve early so we can\r\n * instantly render the component\r\n */\r\nexport function lazyLoadComponent({\r\n chunkName,\r\n load,\r\n}: {\r\n chunkName: string\r\n load: () => Promise<{ default: ComponentType }>\r\n}): LazyExoticComponent> {\r\n // Resolve earlier if prefetch element is present\r\n const hasPreloadElement = document.querySelector(`[data-chunk-id=${chunkName}]`)\r\n\r\n if (hasPreloadElement) {\r\n const componentLoader = load()\r\n\r\n return lazy(() => componentLoader)\r\n }\r\n\r\n return lazy(load)\r\n}\r\n\r\nexport type LazyRouteDefinition = Omit & {\r\n loaderBundle?: () => Promise<{ loader?: LoaderFunction; action?: ActionFunction }>\r\n Component?: ReturnType | (() => JSX.Element)\r\n}\r\n\r\n/**\r\n * Transforms top level async routes and their loaders to react router route definitions.\r\n * - `loaderBundle` must return promise module with exports `{ loader?, action? }`\r\n * - `Component` can be a react component or `lazyLoadComponent`.\r\n *\r\n * If `loaderBundle` and `Component` is set, the component is automatically wrapped in\r\n * ``\r\n *\r\n * Do not use this for query param routes\r\n */\r\nexport function defineLazyRoutes(routes: LazyRouteDefinition[]): RouteObject[] {\r\n return routes.map(({ loaderBundle, Component, ...props }) => {\r\n const loader =\r\n props.loader ??\r\n (loaderBundle ? (args: LoaderFunctionArgs) => loaderBundle().then((mod) => mod.loader?.(args)) : undefined)\r\n\r\n const action =\r\n props.action ??\r\n (loaderBundle ? (args: ActionFunctionArgs) => loaderBundle().then((mod) => mod.action?.(args)) : undefined)\r\n\r\n return {\r\n ...props,\r\n loader,\r\n action,\r\n lazy: async () => ({\r\n // We’re rewriting Component if we have a loader\r\n Component: loader && Component ? undefined : Component,\r\n // Wrap each route in its own provider so they don’t share loader cache\r\n element:\r\n loader && Component ? (\r\n \r\n \r\n \r\n ) : undefined,\r\n }),\r\n children: defineLazyRoutes((props.children as any) ?? []),\r\n } as RouteObject\r\n })\r\n}\r\n\r\n/**\r\n * Argument to `createModuleViewSwitch` when manually specifying the route\r\n */\r\ntype ObjectRoute = {\r\n useDefaultLoader?: boolean\r\n Component: ReturnType\r\n loader?: () => Promise<{ loader: LoaderFunction }>\r\n action?: () => Promise<{ action: ActionFunction }>\r\n}\r\n\r\n/**\r\n * A very thin and naive abstraction over react router which allows routing\r\n * by (single) query params\r\n */\r\nexport function createRouteViewSwitch(options: {\r\n viewParam: ViewParamType\r\n defaultView: ViewType | null\r\n views: Record\r\n}) {\r\n /**\r\n * Load the module (should probably be replaced with our async utils code or\r\n * react query so we get retry). Needs to stay `async`, so we can await in\r\n * action/loader switch even if the module is of `ObjectModule` type\r\n */\r\n function getModuleFromURL(search: URLSearchParams): ObjectRoute | null {\r\n const viewQueryParam = (search.get(options.viewParam) as ViewType) ?? options.defaultView\r\n return options.views[viewQueryParam] ?? options.views[options.defaultView!]\r\n }\r\n\r\n function action(args: ActionFunctionArgs): ReturnType {\r\n const url = new URL(args.request.url)\r\n const route = getModuleFromURL(url.searchParams)\r\n if (!route?.action) return null\r\n return route.action().then((actionModule) => actionModule.action(args))\r\n }\r\n\r\n function loader(args: LoaderFunctionArgs): ReturnType {\r\n const url = new URL(args.request.url)\r\n const route = getModuleFromURL(url.searchParams)\r\n\r\n // Use default loader if none is defined\r\n if (!route?.loader) return parseRouteInitData()\r\n\r\n return route.loader().then((loaderModule) => loaderModule.loader(args))\r\n }\r\n\r\n // Handle the actual view switching\r\n function ViewSwitch() {\r\n const [searchParams] = useSearchParams()\r\n const Component = getModuleFromURL(searchParams)?.Component\r\n\r\n return {Component && }\r\n }\r\n\r\n return {\r\n defaultView: options.defaultView,\r\n action,\r\n loader,\r\n ViewSwitch,\r\n }\r\n}\r\n","import isPlainObject from 'lodash.isplainobject'\r\n\r\nimport { CRYPTO_TICKERS } from '../app/crypto/currencyUtils'\r\nimport { getCookie } from '../app/shared/cookie'\r\nimport { MONTHS } from './constants'\r\nimport { FeatureFlag, Instrument, SortDirection, SortableValue } from './types'\r\nimport { RecordType } from './types'\r\n\r\nconst isObject = (value: any): value is RecordType => isPlainObject(value)\r\n\r\n/**\r\n * Parse text as JSON\r\n */\r\nexport function parseAsJSON(value: unknown | Shape): Shape | undefined {\r\n if (isObject(value)) {\r\n return value as Shape\r\n }\r\n\r\n let parsedValue\r\n try {\r\n if (typeof value === 'string') {\r\n parsedValue = JSON.parse(value)\r\n }\r\n } catch {\r\n return\r\n }\r\n return parsedValue\r\n}\r\n\r\n/**\r\n * remove @ symbol from a ticker\r\n */\r\nexport function cleanTicker(ticker: string) {\r\n return ticker.startsWith('@') ? ticker.substring(1) : ticker\r\n}\r\n\r\n/**\r\n * Get instrument for a ticker.\r\n *\r\n * - If ticker doesn’t start with `@` - stock\r\n * - Otherwise\r\n * - one of `CRYPTO_TICKERS` - crypto\r\n * - has length of 6 - forex\r\n * - none of above - future\r\n *\r\n * NOTE: counterpart in charts 'charts/app/utils/chart.js'\r\n */\r\n\r\nexport function getInstrumentForTicker(ticker: string): Instrument {\r\n if (!ticker?.startsWith('@')) return Instrument.Stock\r\n\r\n const cleanedTicker = cleanTicker(ticker)\r\n\r\n if (CRYPTO_TICKERS.includes(cleanedTicker.toUpperCase())) return Instrument.Crypto\r\n if (cleanedTicker.length === 6) return Instrument.Forex\r\n\r\n return Instrument.Futures\r\n}\r\n\r\n/**\r\n * Async load Resize observer polyfill when we need it\r\n */\r\nlet resizeObserverPolyfill: typeof window.ResizeObserver\r\n\r\nexport async function loadResizeObserverPolyfill() {\r\n if (typeof window.ResizeObserver === 'undefined') {\r\n const polyfill = await import('resize-observer-polyfill')\r\n resizeObserverPolyfill = polyfill.default\r\n window.ResizeObserver = resizeObserverPolyfill\r\n return resizeObserverPolyfill as typeof window.ResizeObserver\r\n }\r\n}\r\n\r\nexport async function getIsBrave() {\r\n return (navigator.brave && (await navigator.brave.isBrave())) || false\r\n}\r\n\r\nexport function deserializeFeatureFlags(): Partial> | undefined {\r\n try {\r\n const cookie = decodeURIComponent(getCookie('featureFlags'))\r\n const flags = cookie.split('_').map((value) => {\r\n const [key, val] = value.split(':')\r\n return [key, val === '1']\r\n })\r\n\r\n return Object.fromEntries(flags)\r\n } catch {\r\n return\r\n }\r\n}\r\n\r\nexport function serializeFeatureFlags(flags: Partial>) {\r\n return Object.entries(flags)\r\n .map(([key, val]) => `${key}:${Number(val)}`)\r\n .join('_')\r\n}\r\n\r\nexport enum ChildPosition {\r\n topLeft,\r\n topRight,\r\n bottomLeft,\r\n bottomRight,\r\n center,\r\n topCenter,\r\n rightCenter,\r\n bottomCenter,\r\n leftCenter,\r\n}\r\n\r\nexport function getFlexAlignClasses(position: ChildPosition) {\r\n return {\r\n 'justify-start': [ChildPosition.topLeft, ChildPosition.bottomLeft, ChildPosition.leftCenter].includes(position),\r\n 'justify-center': [ChildPosition.center, ChildPosition.topCenter, ChildPosition.bottomCenter].includes(position),\r\n 'justify-end': [ChildPosition.topRight, ChildPosition.bottomRight, ChildPosition.rightCenter].includes(position),\r\n 'items-start': [ChildPosition.topLeft, ChildPosition.topRight, ChildPosition.topCenter].includes(position),\r\n 'items-center': [ChildPosition.center, ChildPosition.rightCenter, ChildPosition.leftCenter].includes(position),\r\n 'items-end': [ChildPosition.bottomLeft, ChildPosition.bottomRight, ChildPosition.bottomCenter].includes(position),\r\n }\r\n}\r\n\r\ninterface NumberFormatOptions {\r\n fractions: number\r\n multiply: number\r\n showPlusSign: boolean\r\n defaultValue: string\r\n prefix: string\r\n suffix: string\r\n withSpace: boolean\r\n}\r\n\r\nconst intlCache: { [key: number]: Intl.NumberFormat } = {}\r\nconst dollarIntlCache: { [key: number]: Intl.NumberFormat } = {}\r\n\r\nfunction getIntl(fractions: number) {\r\n if (!intlCache[fractions])\r\n intlCache[fractions] = new Intl.NumberFormat('en-US', {\r\n minimumFractionDigits: fractions,\r\n maximumFractionDigits: fractions,\r\n })\r\n return intlCache[fractions]\r\n}\r\n\r\nfunction getDollarIntl(fractions: number) {\r\n if (!dollarIntlCache[fractions])\r\n dollarIntlCache[fractions] = new Intl.NumberFormat('en-US', {\r\n minimumFractionDigits: fractions,\r\n maximumFractionDigits: fractions,\r\n style: 'currency',\r\n currency: 'USD',\r\n })\r\n return dollarIntlCache[fractions]\r\n}\r\n\r\nexport function shortFormatNumber(\r\n value: number | null | undefined,\r\n {\r\n fractions = 2,\r\n showPlusSign = false,\r\n defaultValue = '-',\r\n multiply = 1,\r\n suffix: extraSuffix = '',\r\n }: Partial = {}\r\n) {\r\n let num = value\r\n if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n num *= multiply\r\n\r\n let suffix = ''\r\n const absValue = Math.abs(num)\r\n if (absValue >= 1e9) {\r\n num /= 1e9\r\n suffix = 'B'\r\n } else if (absValue >= 1e6) {\r\n num /= 1e6\r\n suffix = 'M'\r\n } else if (absValue >= 1000) {\r\n num /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n const formatted = getIntl(fractions).format(num)\r\n\r\n return (showPlusSign && num > 0 ? '+' : '') + formatted + suffix + extraSuffix\r\n}\r\n\r\nexport function shortFormatDollar(\r\n value: number | null | undefined,\r\n {\r\n fractions = 2,\r\n showPlusSign = false,\r\n defaultValue = '-',\r\n multiply = 1,\r\n suffix: extraSuffix = '',\r\n }: Partial = {}\r\n) {\r\n let num = value\r\n if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n num *= multiply\r\n\r\n let suffix = ''\r\n const absValue = Math.abs(num)\r\n if (absValue >= 1e9) {\r\n num /= 1e9\r\n suffix = 'B'\r\n } else if (absValue >= 1e6) {\r\n num /= 1e6\r\n suffix = 'M'\r\n } else if (absValue >= 1000) {\r\n num /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n const formatted = getDollarIntl(fractions).format(num)\r\n\r\n return (showPlusSign && num > 0 ? '+' : '') + formatted + suffix + extraSuffix\r\n}\r\n\r\nexport function formatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-', suffix = '' }: Partial = {}\r\n) {\r\n if (value === undefined || value === null) return defaultValue\r\n\r\n const fixedValue = value.toFixed(fractions)\r\n const signPrefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n return {signPrefix + fixedValue + suffix}\r\n }\r\n\r\n const formatted = getIntl(fractions).format(value)\r\n\r\n return signPrefix + formatted + suffix\r\n}\r\n\r\nexport function formatDollar(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-', suffix = '' }: Partial = {}\r\n) {\r\n if (value === undefined || value === null) return defaultValue\r\n\r\n const fixedValue = value.toFixed(fractions)\r\n const signPrefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n const formatted = getDollarIntl(fractions).format(value)\r\n\r\n if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n return {signPrefix + formatted + suffix}\r\n }\r\n\r\n return signPrefix + formatted + suffix\r\n}\r\n\r\nexport interface SortByColumnOptions {\r\n /**\r\n * Change order of `null` values.\r\n * - `false` Force sort null as first (asc) and last (desc)\r\n * - `true` Always sort null as last regardless of order\r\n * @default false\r\n */\r\n sortNullAsLast?: boolean\r\n\r\n /**\r\n * When true, null values will not be treated as special values\r\n * @default false\r\n */\r\n ignoreNullForComparison?: boolean\r\n}\r\n\r\nexport function sortByColumn(\r\n options: SortByColumnOptions & {\r\n a: SortableValue\r\n b: SortableValue\r\n direction: SortDirection\r\n }\r\n) {\r\n if (options.a === options.b) return 0\r\n\r\n // Compare as strings\r\n if (typeof options.a === 'string' && typeof options.b === 'string')\r\n return options.a.localeCompare(options.b) * options.direction\r\n\r\n // Always sort null last if enabled\r\n if (options.sortNullAsLast && options.a === null) return Infinity\r\n if (options.sortNullAsLast && options.b === null) return -Infinity\r\n\r\n // Sort null first/last depending on direction\r\n if (!options.ignoreNullForComparison && options.a === null) return -options.direction\r\n if (!options.ignoreNullForComparison && options.b === null) return options.direction\r\n\r\n // Compare as numbers\r\n return (Number(options.a) - Number(options.b)) * options.direction\r\n}\r\n\r\nexport function moveItemInArray(arr: ItemType[], sourceIndex: number, destinationIndex: number) {\r\n // make sure sourceIndex and destinationIndex are inside of arr\r\n const from = Math.max(0, Math.min(sourceIndex, arr.length - 1))\r\n const to = Math.min(arr.length - 1, Math.max(destinationIndex, 0))\r\n\r\n const items = [...arr]\r\n const [removed] = items.splice(from, 1)\r\n items.splice(to, 0, removed)\r\n\r\n return items\r\n}\r\n\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n/**\r\n * Used as a callback to autoFocusOnShow/autoFocusOnHide to make sure the page\r\n * doesn’t jump when focusing the element\r\n */\r\nexport function focusWithoutScroll(element: HTMLElement | null) {\r\n requestAnimationFrame(() => {\r\n element?.focus({ preventScroll: element.ariaHasPopup !== null })\r\n })\r\n\r\n return !element\r\n}\r\n\r\nexport function blurWithoutScroll(element: HTMLElement | null) {\r\n element?.focus({ preventScroll: true })\r\n\r\n return !element\r\n}\r\n\r\n/**\r\n * Can be used as a callback for events if you just need to prevent the default action\r\n */\r\nexport function preventDefault(ev: React.MouseEvent) {\r\n ev.preventDefault()\r\n}\r\n\r\nexport function getNavigationLinkUrl(\r\n url: URL,\r\n preservedKeys?: string[],\r\n removeQueryKeys?: string[],\r\n additionalQueryValues: Record = {}\r\n) {\r\n const newUrl = new URL(url)\r\n\r\n if (preservedKeys?.length) {\r\n for (const key of url.searchParams.keys()) {\r\n if (!preservedKeys.includes(key)) newUrl.searchParams.delete(key)\r\n }\r\n }\r\n\r\n removeQueryKeys?.forEach((key) => {\r\n newUrl.searchParams.delete(key)\r\n })\r\n\r\n Object.entries(additionalQueryValues).forEach(([key, value]) => {\r\n newUrl.searchParams.set(key, value as string)\r\n })\r\n\r\n return newUrl\r\n}\r\n\r\nexport function getElitePageLink(campaign?: string) {\r\n const url = '/elite.ashx'\r\n const query = new URLSearchParams('utm_source=finviz&utm_medium=banner')\r\n\r\n if (campaign) {\r\n query.set('utm_campaign', campaign)\r\n\r\n return `${url}?${query.toString()}`\r\n }\r\n\r\n return url\r\n}\r\n\r\nexport function dateStrToDate(dateStr: string) {\r\n return new Date(`${dateStr}T00:00:00`)\r\n}\r\n\r\nexport function dateStrToTimestamp(dateStr: string) {\r\n return dateStrToDate(dateStr).getTime()\r\n}\r\n\r\nexport function formatMonth(timestamp: number, isShort?: boolean) {\r\n const localDate = new Date(timestamp)\r\n const month = localDate.getMonth()\r\n if (month === 0) {\r\n return localDate.getFullYear().toString().slice(-2)\r\n }\r\n return isShort ? MONTHS[month].substring(0, 1) : MONTHS[month]\r\n}\r\n\r\nexport function getEarningsDateSuffix(date: Date | null) {\r\n if (!date) {\r\n return ''\r\n }\r\n const hours = date.getHours()\r\n if (hours <= 9) {\r\n return 'BMO'\r\n }\r\n if (hours >= 16) {\r\n return 'AMC'\r\n }\r\n return ''\r\n}\r\n","function getSanitizedSingleTicker(rawTicker: string, specialTickers: string[] = []) {\r\n return rawTicker\r\n .replace(/\\.+/gi, '-')\r\n .split('-')\r\n .map((x) => {\r\n if (specialTickers.includes(x.toUpperCase())) return x\r\n return x.replace(/([^a-z0-9@-])+/gi, '')\r\n })\r\n .filter((x) => !!x)\r\n .join('-')\r\n .toUpperCase()\r\n}\r\n\r\nexport function getSanitizedTicker(rawTicker: string, isMulti = false, specialTickers: string[] = []) {\r\n if (isMulti) {\r\n return rawTicker\r\n .replace(/ /g, ',')\r\n .split(',')\r\n .map((x) => getSanitizedSingleTicker(x, specialTickers))\r\n .filter((x) => !!x)\r\n .join(',')\r\n }\r\n\r\n return getSanitizedSingleTicker(rawTicker, specialTickers)\r\n}\r\n","import { millisecondsInHour, millisecondsInMinute } from \"../constants/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nimport toInteger from \"../_lib/toInteger/index.js\";\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @param {String} argument - the value to convert\n * @param {Object} [options] - an object with options.\n * @param {0|1|2} [options.additionalDigits=2] - the additional number of digits in the extended year format\n * @returns {Date} the parsed date in the local time zone\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport default function parseISO(argument, options) {\n var _options$additionalDi;\n requiredArgs(1, arguments);\n var additionalDigits = toInteger((_options$additionalDi = options === null || options === void 0 ? void 0 : options.additionalDigits) !== null && _options$additionalDi !== void 0 ? _options$additionalDi : 2);\n if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) {\n throw new RangeError('additionalDigits must be 0, 1 or 2');\n }\n if (!(typeof argument === 'string' || Object.prototype.toString.call(argument) === '[object String]')) {\n return new Date(NaN);\n }\n var dateStrings = splitDateString(argument);\n var date;\n if (dateStrings.date) {\n var parseYearResult = parseYear(dateStrings.date, additionalDigits);\n date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n }\n if (!date || isNaN(date.getTime())) {\n return new Date(NaN);\n }\n var timestamp = date.getTime();\n var time = 0;\n var offset;\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (isNaN(time)) {\n return new Date(NaN);\n }\n }\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n if (isNaN(offset)) {\n return new Date(NaN);\n }\n } else {\n var dirtyDate = new Date(timestamp + time);\n // js parsed string assuming it's in UTC timezone\n // but we need it to be parsed in our timezone\n // so we use utc values to build date in our timezone.\n // Year values from 0 to 99 map to the years 1900 to 1999\n // so set year explicitly with setFullYear.\n var result = new Date(0);\n result.setFullYear(dirtyDate.getUTCFullYear(), dirtyDate.getUTCMonth(), dirtyDate.getUTCDate());\n result.setHours(dirtyDate.getUTCHours(), dirtyDate.getUTCMinutes(), dirtyDate.getUTCSeconds(), dirtyDate.getUTCMilliseconds());\n return result;\n }\n return new Date(timestamp + time + offset);\n}\nvar patterns = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/\n};\nvar dateRegex = /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nvar timeRegex = /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nvar timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\nfunction splitDateString(dateString) {\n var dateStrings = {};\n var array = dateString.split(patterns.dateTimeDelimiter);\n var timeString;\n\n // The regex match should only return at maximum two array elements.\n // [date], [time], or [date, time].\n if (array.length > 2) {\n return dateStrings;\n }\n if (/:/.test(array[0])) {\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n timeString = dateString.substr(dateStrings.date.length, dateString.length);\n }\n }\n if (timeString) {\n var token = patterns.timezone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], '');\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n return dateStrings;\n}\nfunction parseYear(dateString, additionalDigits) {\n var regex = new RegExp('^(?:(\\\\d{4}|[+-]\\\\d{' + (4 + additionalDigits) + '})|(\\\\d{2}|[+-]\\\\d{' + (2 + additionalDigits) + '})$)');\n var captures = dateString.match(regex);\n // Invalid ISO-formatted year\n if (!captures) return {\n year: NaN,\n restDateString: ''\n };\n var year = captures[1] ? parseInt(captures[1]) : null;\n var century = captures[2] ? parseInt(captures[2]) : null;\n\n // either year or century is null, not both\n return {\n year: century === null ? year : century * 100,\n restDateString: dateString.slice((captures[1] || captures[2]).length)\n };\n}\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) return new Date(NaN);\n var captures = dateString.match(dateRegex);\n // Invalid ISO-formatted string\n if (!captures) return new Date(NaN);\n var isWeekDate = !!captures[4];\n var dayOfYear = parseDateUnit(captures[1]);\n var month = parseDateUnit(captures[2]) - 1;\n var day = parseDateUnit(captures[3]);\n var week = parseDateUnit(captures[4]);\n var dayOfWeek = parseDateUnit(captures[5]) - 1;\n if (isWeekDate) {\n if (!validateWeekDate(year, week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n } else {\n var date = new Date(0);\n if (!validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear)) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n return date;\n }\n}\nfunction parseDateUnit(value) {\n return value ? parseInt(value) : 1;\n}\nfunction parseTime(timeString) {\n var captures = timeString.match(timeRegex);\n if (!captures) return NaN; // Invalid ISO-formatted time\n\n var hours = parseTimeUnit(captures[1]);\n var minutes = parseTimeUnit(captures[2]);\n var seconds = parseTimeUnit(captures[3]);\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n return hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000;\n}\nfunction parseTimeUnit(value) {\n return value && parseFloat(value.replace(',', '.')) || 0;\n}\nfunction parseTimezone(timezoneString) {\n if (timezoneString === 'Z') return 0;\n var captures = timezoneString.match(timezoneRegex);\n if (!captures) return 0;\n var sign = captures[1] === '+' ? -1 : 1;\n var hours = parseInt(captures[2]);\n var minutes = captures[3] && parseInt(captures[3]) || 0;\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n var date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n var fourthOfJanuaryDay = date.getUTCDay() || 7;\n var diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nvar daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;\n}\nfunction validateDate(year, month, date) {\n return month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28));\n}\nfunction validateDayOfYearDate(year, dayOfYear) {\n return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\nfunction validateWeekDate(_year, week, day) {\n return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\nfunction validateTime(hours, minutes, seconds) {\n if (hours === 24) {\n return minutes === 0 && seconds === 0;\n }\n return seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25;\n}\nfunction validateTimezone(_hours, minutes) {\n return minutes >= 0 && minutes <= 59;\n}"],"names":["DEFAULT_ACTIVE_CURRENCY","TILE_WIDTH","CURRENCIES_LAYOUT","USD","USDT","EUR","BTC","TICKERS_NOT_IN_DASHBOARD","CURRENCIES_LIST","Object","keys","CRYPTO_TICKERS","values","flat","getCurrency","ticker","endsWith","getActiveCurrency","queryString","activeCurrency","toUpperCase","includes","getActiveCurrencySparklineTickers","_TICKERS_NOT_IN_DASHB","getCurrencyLongName","currency","toLowerCase","MarketBadgeType","getMarketBadgeText","type","_date","Open","label","Closed","Premarket","Aftermarket","MarketBadge","_ref","badge","className","None","_jsx","classnames","UPDATE_INTERVAL","TimeBreakpointMode","BREAKPOINTS","minWidth","Infinity","marketBadgeText","timeFormat","getTimeState","fixedTime","hasUserPremium","arguments","length","undefined","FinvizSettings","time","getDate","isHoliday","isPremarket","isAftermarket","getMarketBadgeType","TooltipBadge","props","state","useTooltipState","placement","_jsxs","_Fragment","children","TooltipTrigger","Tooltip","Heading","level","StaticBadge","findMatchingBreakpoint","compareWidth","breakpoints","_matchingBreakpoints$","filter","breakpoint","pop","getCurrentWidth","mode","element","_element$clientWidth","window","innerWidth","clientWidth","Time","breakpointMode","ResizeObserver","useResizeObserver","rootRef","React","setState","currentBreakpoint","setBreakpoint","interval","setInterval","clearInterval","current","currentWidth","handleResize","throttle","foundBreakpoint","observer","entries","requestAnimationFrame","Array","isArray","observe","addEventListener","disconnect","removeEventListener","ref","getFormattedDateString","seed","date","Date","dateAsNY","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","isDst","dayNumber","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","setUTCHours","getWeekDay","toLocaleDateString","weekday","uppercase","name","month","toString","padStart","getTime","toLocaleString","hour","minute","hour12","TimeFormat","long","getFullYear","short","dateOnly","timeOnly","formatDate","value","inputOrOutputFormat","outputFormat","dateFns","isPremium","dayOfWeek","min","getMinutes","hours","getHours","HOLIDAY_DATES","test","day","find","holiday","getHoliday","getParsedCookies","cookieName","parseCookies","document","cookie","split","map","cookieString","reduce","acc","v","decodeURIComponent","trim","getCookie","re","RegExp","replace","setCookie","expires","toUTCString","location","hostname","matchesAndroid","navigator","userAgent","match","matchesWebOS","matchesIPhone","matchesiPad","matchesIPod","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","maxTouchPoints","matchesFirefox","matchesSafariDesktopLike","isMobileDevice","isMobile","isIphone","isIpad","isSafariDesktop","isIos","isFirefoxDesktop","sentryOptions","dsn","allowUrls","release","FinvizSentrySettings","environment","sendDefaultPii","integrations","dedupeIntegration","extraErrorDataIntegration","httpClientIntegration","failedRequestTargets","thirdPartyErrorFilterIntegration","filterKeys","behaviour","ignoreErrors","ignoreStack","Sentry","beforeSend","event","hint","_event$exception","_exception$stacktrace","_exception$stacktrace2","_exception$mechanism$","_exception$mechanism","_hint$mechanism","_originalError$messag","_event$contexts$respo","_event$contexts","originalError","originalException","exception","errorFrames","stacktrace","frames","mechanism","message","some","ignorePattern","_event$request","ignoreSource","ignoreMessage","isIgnoredScript","frame","_frame$filename","filename","request","url","statusCode","ThrowableError","status","contexts","response","status_code","fingerprint","id","String","_window$FinvizSetting","_window$FinvizSetting2","dpr","devicePixelRatio","redesign","hasRedesignEnabled","dark","hasDarkTheme","innerHeight","captureException","captureMessage","withScope","TickerSearchItem","item","dataTestId","useState","isTickerWide","ComboBoxItem","contentClass","classNames","Highlight","text","highlight","company","exchange","getRedirectForTicker","tickerRaw","_FinvizSettings$quote","getSanitizedTicker","redirectLink","cleanTicker","getInstrumentForTicker","Instrument","Stock","link","toQuote","Forex","toForexChartDetail","Futures","toFuturesChartDetail","Crypto","toCryptoChartDetail","toSearch","quoteSearchExt","TickerSearch","_props$defaultPlaceme","_props$placeholder","isShowAllVisible","isSearchItemLink","chartIndex","searchComboboxState","useSearchComboboxState","defaultValue","defaultPlacement","setSelectedValue","_props$onTickerSelect","href","onTickerSelected","call","setTimeout","setValue","activeValue","data","error","isLoading","refetch","useQuery","searchApiRequest","enabled","keepPreviousData","cacheTime","staleTime","Search","inputProps","theme","maxLength","hasFocusStyle","size","placeholder","inputClass","rightContent","popoverProps","isMatchInputAndBoxWidth","inputTestId","footer","Button","as","isError","onErrorRetry","BoxRounding","BoxTheme","Box","rounding","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","ButtonPadding","ButtonAlign","ButtonSquareSize","ButtonRounding","ButtonTheme","getButtonTheme","active","light","button","lightTransparent","blue","violet","blueHover","red","headerItem","icon","menuItem","menuItemTransparent","menuItemDark","opacity","outline","chip","chipOutline","chipTransparent","linkText","tab","ButtonComponent","_ref2","asComponent","focusRing","appearance","align","padding","leftContent","isSquare","buttonTheme","buttonPadding","buttonSize","buttonRounding","hasIcons","isValidIconName","Icon","left","center","xxsmall","xsmall","none","small","regular","medium","large","xlarge","ComboBox","_props$autoFocus","ariaLabel","minValueLength","getInputValue","isMounted","inputValue","Ariakit","store","autoFocus","render","Input","onKeyDown","ev","_inputProps$onKeyDown","key","portal","gutter","unmountOnHide","startsWith","DEFAULT_ELEMENT","ComboBoxItemButton","dataActiveItem","ComboBoxItemButtonWithRef","useComboBoxState","ZIndexContext","useZIndex","_React$useContext","useDialogState","settings","DialogDragContext","handleRef","boxPosition","x","y","resetBoxPosition","setBoxPosition","useDrag","dragging","handleElement","boxPositionRef","dragDiff","onMouseDown","pageX","scrollX","pageY","scrollY","onMouseUp","onMouseMove","body","ErrorView","title","showContact","showRefresh","Paragraph","toContact","origin","pathname","search","DefaultErrorBoundary","useEffect","console","JSON","stringify","RouterErrorElement","useRouteError","index","indexOf","processedText","useMemo","before","substring","after","width","height","Error","iconList","fileName","Boolean","join","Number","isFinite","versionImages","Component","root","chartLayouts","chartTools","chartTypes","screener","add","arrowBackward","arrowDownShort","arrowForward","arrowUpShort","briefcase","calendar","caretDown","caretLeft","caretRight","caretUp","caretVertical","chartBar","chartBubble","chartPie","chartTable","chartTreemap","checkboxTick","chevronDown","chevronRight","close","darkMode","diamondOutlined","done","drag","draw","empty","exitFullscreen","flash","fullscreen","gesture","gift","hamburger","help","idea","ideaLoad","ideaSave","info","lightMode","lock","lockOpened","menuClose","minus","more","note","openInNew","palette","profile","publish","refresh","remove","restore","settingsWheel","share","signOut","star","starOutlined","switchHorizontal","switchVertical","tabKey","template","trashCan","trendingDown","trendingUp","triangle","triangleOutlineDown","triangleOutlineUp","warning","layout1h1v","layout1h2v","layout1h3v","layout1l2r","layout1t2b","layout2h1v","layout2h2v","layout3h1v","layout3h2v","drawingActionDelete","drawingSettingAutosaveOff","drawingSettingAutosaveOn","drawingSettingAutosaveSaving","drawingSettingDrawingMode","drawingSettingDrawingModeActive","drawingSettingHide","drawingSettingLock","drawingSettingPreserveDrawings","drawingSettingPreserveDrawingsActive","drawingSettingShow","drawingSettingUnlock","toolArrow","toolAVWAP","toolBrush","toolCallout","toolCurve","toolElliottWave","toolEllipse","toolExpand","toolFibonacci","toolLine","toolMeasure","toolMidLineH","toolMidLineV","toolMouse","toolPitchfork","toolPolygon","toolPosition","toolRect","toolRectRotated","toolText","toolTriangle","toolXABCD","candleBarBasic","candleBarHeikinAshi","candleBarHollow","lineChartType","ohlcChartType","above","aboveEqual","abovePercent","below","belowEqual","belowPercent","between","crosses","crossesDown","crossesUp","equal","outside","InputTheme","InputRounding","InputSize","getInputTheme","isSelected","input","navigationBar","InputComponent","isHorizontalLabel","labelClassName","showNumberStepper","caption","isMobileStyleEnabled","inputTheme","isLeftStringIcon","isRightStringIcon","inputSize","commonSideContentClassnames","Label","isHorizontal","InputCaption","_ref3","TextareaComponent","_ref4","textareaTheme","forwardRef","Textarea","Loading","delay","timeout","throwOnTimeout","Delayed","delayComponent","timeoutComponent","Spinner","LoadingScreen","Centered","SearchError","onRetry","onClick","SearchItem","itemProps","inRouterContext","Link","to","reloadDocument","target","getItemHrefProps","useInRouterContext","subtitle","SearchList","_items$length","items","isOpen","hasContent","count","hide","getSelectedItem","SearchNavigationWrapperInRouterContext","navigate","useNavigate","selectedValue","_getSelectedItem","SearchNavigationWrapperOutsideRouterContext","_getSelectedItem2","hasSearchIcon","isInRouterContext","Wrapper","autoComplete","autoCorrect","autoCapitalize","onBlur","e","preventDefault","sameWidth","fitViewport","defaultSelectedValue","isProgressBar","progress","radius","strokeWidth","circleXY","circumference","Math","PI","viewBox","xmlns","style","cx","cy","r","strokeDasharray","strokeDashoffset","strokeLinecap","TooltipColor","transformMap","auto","top","right","bottom","TooltipArrow","color","positionMain","arrowColor","transform","orange","green","d","TooltipBox","tooltipColor","isIosBrowser","TOOLTIP_WRAPPER_PROPS","hideOnHoverOutside","isPointerEventsEnabled","onClose","context","stateObject","zIndex","updatePosition","usePopoverPlacement","focusable","wrapperProps","isHideOnClick","showOnHover","hideOnBlur","onMouseEnter","onMouseLeave","TooltipProvider","showTimeout","hideTimeout","getHeadingElement","titleClassName","TIMEFRAME","SpecificChartFunctionality","MONTHS","SETTINGS_CONTEXT_DEFAULT","nodeChartsDomain","email","SettingsContext","createContext","useSettings","useContext","controller","AbortController","setResizeObserver","loadResizeObserverPolyfill","then","polyfill","_controller$current","signal","aborted","_controller$current2","abort","CachedLoaderDataContext","useCachedLoaderData","CachedLoaderDataContextProvider","isNullValidData","loaderData","useLoaderData","dataCacheRef","isCached","Provider","getPlacementZIndex","changeZIndex","computedZIndex","removeProperty","classList","popoverElement","contextZIndex","overlayElement","previousElementSibling","dataset","backdrop","DEFAULT_RESTORE_KEY","ScrollRestore","loc","useLocation","resetKey","setKey","_window$performance","_window$performance$g","navTypes","performance","getEntriesByType","nav","getIsInitiallyRendered","random","ScrollRestoration","getKey","useInsiderTradingRouter","viewParams","view","InsiderView","Index","SharedLoadingScreen","loader","action","ViewSwitch","createRouteViewSwitch","defaultView","viewParam","InsiderViewParam","View","views","lazyLoadComponent","chunkName","load","Managers","ManagerDetails","ManagerHoldings","Funds","FundDetails","FundHoldings","NotFound","insiderTradingModule","path","Suspense","fallback","portfolioModule","shouldRevalidate","revalidateOnQueryChange","loaderBundle","QuoteSharedWrapper","optionsBundle","QuoteQuery","Type","QuoteSubview","OptionsChain","OptionsVolatility","Revenue","Dividends","Earnings","Forecast","ShortInterest","Traffic","LatestFilings","quoteModule","args","getQuoteSubview","currentUrl","searchParams","get","shouldRevalidateOnQueryChange","RenderRecentQuotes","catch","router","createBrowserRouter","useTrackPageView","NotificationWrapper","Outlet","ErrorBoundary","defineLazyRoutes","rootEl","getElementById","ReactDOM","RouterProvider","SEGMENT_COLORS","ColorVariant","c","gray","default","darkGray","InvestorType","HoldingOptionType","InsiderViewHasParams","Page","Sort","InvestorId","ReportEndDate","TransactionType","OptionType","AssetCategory","INSIDER_VIEW_LABELS","ManagerFundSortEnum","ManagerFundSortLabel","MostPopular","PortfolioValue","NumInvestments","NewPurchased","SoldOut","Added","Reduced","TopTenConcentration","Turnover","TimeHeldTop10","TimeHeldAll","DEFAULT_QUERY_CACHE_TIME_IN_MS","ChangeTypeEnum","HoldingColumnEnum","FundHoldingColumnEnum","HoldingTransactionType","HoldingTransactionTypeLabelMap","Any","New","ClosedOut","NoChange","HoldingTransactionTypes","HoldingOptionTypeLabelMap","Share","Put","Call","HoldingOptionTypes","getInsiderViewSpecificParams","params","_InsiderViewHasParams","useSearchParams","_params$get","_params$get2","_params$get3","_params$get4","reportEndDate","parsedParams","isValid","parseISO","getInsiderTradingLink","additionalQueryParams","encodeQueryString","QuoteView","_Object$values$find","getQuoteView","Financials","Options","ChartDetail","ContentType","constructor","extra","super","_defineProperty","this","isServerError","apiRequest","_ContentType","query","headers","options","throwOnAllErrors","requestUrl","URLSearchParams","requestOptions","ApplicationJson","cancelableRequest","fetch","async","textResponse","responseContentType","Html","parsedResponse","contentType","ApplicationJsonUTF","FormUrlEncoded","parse","parseResponseForContentType","ok","statusText","rayId","scope","setContext","cancel","portfoliosRequest","fields","lastCloseRequest","t","portfolioLimitRequest","portfolioId","pid","setCookieRequest","compilePath","pathToRegexp","toHome","toNews","toScreener","toCharts","toGroups","toPortfolio","toInsider","toElite","toAlerts","toHelp","toAccount","toLogin","toLogout","toMaps","toBubbles","toFutures","toFuturesPerf","toFuturesCharts","toForex","toForexPerf","toForexCharts","toCrypto","toCryptoPerf","toCryptoCharts","toBacktests","toBacktestCreate","toBacktestDetail","backtestId","toBacktestPresets","DateRangeType","SortDirection","FeatureFlag","prevParams","nextParams","nextUrl","requiredChanged","otherChanged","arr","defaultShouldRevalidate","parseRouteInitData","elementId","removeElement","initialData","parsedData","parseInitData","querySelector","componentLoader","lazy","routes","_props$loader","_props$action","mod","_mod$loader","_mod$action","getModuleFromURL","_options$views$viewQu","viewQueryParam","route","URL","actionModule","loaderModule","_getModuleFromURL","cleanedTicker","resizeObserverPolyfill","getIsBrave","brave","isBrave","deserializeFeatureFlags","flags","val","fromEntries","serializeFeatureFlags","ChildPosition","getFlexAlignClasses","position","topLeft","bottomLeft","leftCenter","topCenter","bottomCenter","topRight","bottomRight","rightCenter","intlCache","dollarIntlCache","getIntl","fractions","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","getDollarIntl","shortFormatNumber","showPlusSign","multiply","suffix","extraSuffix","num","absValue","abs","format","shortFormatDollar","formatNumber","fixedValue","toFixed","signPrefix","parseFloat","formatDollar","formatted","sortByColumn","a","b","localeCompare","direction","sortNullAsLast","ignoreNullForComparison","moveItemInArray","sourceIndex","destinationIndex","from","max","removed","splice","getUuid","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","getRandomValues","Uint8Array","focusWithoutScroll","focus","preventScroll","ariaHasPopup","blurWithoutScroll","getNavigationLinkUrl","preservedKeys","removeQueryKeys","additionalQueryValues","newUrl","delete","forEach","set","getElitePageLink","campaign","dateStrToDate","dateStr","dateStrToTimestamp","formatMonth","timestamp","isShort","localDate","slice","getEarningsDateSuffix","getSanitizedSingleTicker","rawTicker","specialTickers","argument","_options$additionalDi","additionalDigits","RangeError","prototype","NaN","dateStrings","dateString","timeString","array","patterns","dateTimeDelimiter","timeZoneDelimiter","substr","token","timezone","exec","splitDateString","parseYearResult","regex","captures","year","restDateString","parseInt","century","parseYear","dateRegex","isWeekDate","dayOfYear","parseDateUnit","week","_year","validateWeekDate","isoWeekYear","setUTCFullYear","fourthOfJanuaryDay","getUTCDay","diff","setUTCDate","dayOfISOWeekYear","daysInMonths","isLeapYearIndex","validateDate","validateDayOfYearDate","parseDate","isNaN","offset","timeRegex","parseTimeUnit","minutes","seconds","validateTime","parseTime","dirtyDate","result","setFullYear","setHours","getUTCMilliseconds","timezoneString","timezoneRegex","sign","_hours","validateTimezone","parseTimezone"],"sourceRoot":""}