{"version":3,"file":"main.110c199b.js","mappings":"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","sources":["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"],"sourcesContent":["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: 'Martin Luther King, Jr. Day',\r\n test: (day: number, month: number) => month === 1 && day === 15,\r\n },\r\n {\r\n label: 'Presidents Day',\r\n test: (day: number, month: number) => month === 2 && day === 19,\r\n },\r\n {\r\n label: 'Good Friday',\r\n test: (day: number, month: number) => month === 3 && day === 29,\r\n },\r\n {\r\n label: 'Memorial Day',\r\n test: (day: number, month: number) => month === 5 && day === 27,\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: 'Early Close',\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 === 2,\r\n },\r\n {\r\n label: 'Thanksgiving Day',\r\n test: (day: number, month: number) => month === 11 && day === 28,\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 === 29 && 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 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\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 {data?.map((item) => (\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 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 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
\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}\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 '': 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","export const CRYPTO_TICKERS = [\r\n 'BTCUSD',\r\n 'LTCUSD',\r\n 'ETHUSD',\r\n 'XRPUSD',\r\n 'BCHUSD',\r\n 'BTCEUR',\r\n 'LTCEUR',\r\n 'ETHEUR',\r\n 'XRPEUR',\r\n 'BCHEUR',\r\n 'LTCBTC',\r\n 'ETHBTC',\r\n 'XRPBTC',\r\n 'BCHBTC',\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}\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}\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 }>\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 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.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 * 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\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]: params.get(InsiderViewParam.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}\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 { 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',\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) => compilePath(path.cryptoChartDetail, { ticker: 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 { getCookie } from '../app/shared/cookie'\r\nimport { CRYPTO_TICKERS, 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"],"names":["MarketBadgeType","getMarketBadgeText","type","_date","Open","label","Closed","Premarket","Aftermarket","MarketBadge","_ref","badge","className","None","_jsx","classnames","includes","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","filter","breakpoint","pop","getCurrentWidth","mode","element","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","toUpperCase","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","originalError","originalException","exception","values","errorFrames","stacktrace","frames","mechanism","message","some","ignorePattern","ignoreSource","ignoreMessage","isIgnoredScript","frame","filename","request","url","statusCode","ThrowableError","status","contexts","response","status_code","fingerprint","id","String","dpr","devicePixelRatio","redesign","hasRedesignEnabled","dark","hasDarkTheme","innerHeight","captureException","captureMessage","withScope","TickerSearchItem","item","dataTestId","useState","ComboBoxItem","ticker","contentClass","Highlight","text","highlight","company","exchange","getRedirectForTicker","tickerRaw","getSanitizedTicker","redirectLink","cleanTicker","getInstrumentForTicker","Instrument","Stock","link","toQuote","Forex","toForexChartDetail","Futures","toFuturesChartDetail","Crypto","toCryptoChartDetail","toSearch","quoteSearchExt","TickerSearch","isShowAllVisible","isSearchItemLink","chartIndex","searchComboboxState","useSearchComboboxState","defaultValue","defaultPlacement","setSelectedValue","href","onTickerSelected","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","ariaLabel","minValueLength","getInputValue","isMounted","inputValue","Ariakit","store","autoFocus","render","Input","onKeyDown","ev","key","portal","gutter","unmountOnHide","startsWith","DEFAULT_ELEMENT","ComboBoxItemButton","dataActiveItem","ComboBoxItemButtonWithRef","useComboBoxState","ZIndexContext","useZIndex","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","toLowerCase","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","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","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","isOpen","hasContent","count","hide","getSelectedItem","SearchNavigationWrapperInRouterContext","navigate","useNavigate","selectedValue","SearchNavigationWrapperOutsideRouterContext","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","CRYPTO_TICKERS","TIMEFRAME","SpecificChartFunctionality","MONTHS","SETTINGS_CONTEXT_DEFAULT","nodeChartsDomain","email","SettingsContext","createContext","useSettings","useContext","controller","AbortController","setResizeObserver","loadResizeObserverPolyfill","then","polyfill","signal","aborted","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","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","Object","keys","ColorVariant","c","gray","default","darkGray","InvestorType","HoldingOptionType","InsiderViewHasParams","Page","Sort","InvestorId","ReportEndDate","TransactionType","OptionType","AssetCategory","INSIDER_VIEW_LABELS","ManagerFundSortEnum","ManagerFundSortLabel","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","useSearchParams","parsedParams","getInsiderTradingLink","additionalQueryParams","encodeQueryString","QuoteView","getQuoteView","Financials","Options","ChartDetail","ContentType","isServerError","extra","constructor","super","this","apiRequest","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","mod","getModuleFromURL","viewQueryParam","route","URL","actionModule","loaderModule","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","currency","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","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"],"sourceRoot":""}