{"version":3,"file":"2176.c74bce3b.js","mappings":"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","sources":["webpack://@finviz/website/./js/main/components/keystats/KeyStat.tsx","webpack://@finviz/website/./js/main/components/keystats/KeyStats.tsx","webpack://@finviz/website/./js/main/modules/earnings-common/charts/PerformanceTooltip.tsx","webpack://@finviz/website/./js/main/modules/earnings-common/charts/utils.ts","webpack://@finviz/website/./js/main/modules/earnings-common/charts/RedGreenDot.tsx","webpack://@finviz/website/./js/main/modules/earnings-common/charts/EarningsChart.tsx","webpack://@finviz/website/./js/main/modules/earnings-common/useTableColumns.tsx","webpack://@finviz/website/./js/main/modules/earnings-common/EarningsWidget.tsx","webpack://@finviz/website/./js/main/modules/earnings-common/WidgetHeader.tsx","webpack://@finviz/website/./js/main/modules/earnings-common/constants.ts","webpack://@finviz/website/./js/main/modules/earnings-common/types.ts","webpack://@finviz/website/./js/main/modules/earnings-common/utils.ts","webpack://@finviz/website/./js/main/modules/earnings/HighlightedBox.tsx","webpack://@finviz/website/./js/main/modules/earnings/constants.ts","webpack://@finviz/website/./js/main/modules/earnings/types.ts","webpack://@finviz/website/./js/main/modules/earnings/RsiValue.tsx","webpack://@finviz/website/./js/main/modules/earnings/utils.tsx","webpack://@finviz/website/../node_modules/date-fns/esm/parseISO/index.js"],"sourcesContent":["import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport enum KeyStatVariant {\r\n Default,\r\n Positive,\r\n Negative,\r\n}\r\n\r\ntype KeyStatProps = {\r\n datapoint: React.ReactNode\r\n label: React.ReactNode\r\n subdatapoint?: React.ReactNode\r\n sublabel?: React.ReactNode\r\n variant?: KeyStatVariant\r\n}\r\n\r\nexport function KeyStat({ datapoint, label, subdatapoint, sublabel, variant = KeyStatVariant.Default }: KeyStatProps) {\r\n return (\r\n
\r\n {label}\r\n \r\n {datapoint}\r\n {subdatapoint && (\r\n \r\n {subdatapoint}\r\n \r\n )}\r\n \r\n {sublabel && {sublabel}}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { PropsWithChildren } from 'react'\r\n\r\nexport enum KeyStatsVariant {\r\n Compact,\r\n Stretched,\r\n}\r\n\r\ntype KeyStatsProps = {\r\n className?: string\r\n variant?: KeyStatsVariant\r\n}\r\n\r\nexport function KeyStats({ children, className, variant = KeyStatsVariant.Compact }: PropsWithChildren) {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport React from 'react'\r\n\r\nimport { RedGreenText } from '../../../components/RedGreenText'\r\nimport { formatNumber, shortFormatNumber } from '../../../util'\r\nimport { EarningReportReaction, EarningsEstimateType, PriceReactionWhen } from '../types'\r\nimport { marketHoursSuffix } from '../utils'\r\nimport { ChartYearData } from './EarningsChart'\r\n\r\nconst ESTIMATE_TYPE_LABELS: { [K in EarningsEstimateType]: string } = {\r\n [EarningsEstimateType.eps]: 'EPS',\r\n [EarningsEstimateType.epsGaap]: 'GAAP EPS',\r\n [EarningsEstimateType.sales]: 'Revenue',\r\n}\r\n\r\ntype DailyChangeProps = {\r\n dateClassName?: string\r\n reportReaction: EarningReportReaction\r\n when: PriceReactionWhen\r\n}\r\n\r\nfunction DailyChange({ dateClassName, reportReaction, when }: DailyChangeProps) {\r\n const reaction = reportReaction.reactions[when]\r\n if (!reaction || !reaction.price || !reaction.prevPrice) {\r\n return null\r\n }\r\n const date = dateFns.parseISO(reaction.date)\r\n const diff = reaction.price - reaction.prevPrice\r\n return (\r\n <>\r\n
{dateFns.format(date, 'MMM dd')}
\r\n
\r\n \r\n {formatNumber(diff)} ({formatNumber(Math.abs(reaction.priceDiff))}%)\r\n \r\n
\r\n \r\n )\r\n}\r\n\r\ntype PerformanceTooltipProps = {\r\n data: ChartYearData | undefined\r\n estimateType: EarningsEstimateType\r\n isActive: boolean\r\n}\r\n\r\nexport function PerformanceTooltip({ data, estimateType, isActive }: PerformanceTooltipProps) {\r\n if (!estimateType || !isActive || !data || !data.reportReaction) return null\r\n\r\n const reportReaction = data.reportReaction\r\n const earningsDate = dateFns.parseISO(reportReaction.reportDate)\r\n const fiscalEndDate = reportReaction.fiscalEndDate ? dateFns.parseISO(reportReaction.fiscalEndDate) : null\r\n\r\n let estimate\r\n let reported\r\n switch (estimateType) {\r\n case EarningsEstimateType.eps:\r\n estimate = data.epsEstimate\r\n reported = data.epsActual\r\n break\r\n case EarningsEstimateType.epsGaap:\r\n estimate = data.epsReportedEstimate\r\n reported = data.epsReportedActual\r\n break\r\n case EarningsEstimateType.sales:\r\n estimate = data.salesEstimate\r\n reported = data.salesActual\r\n break\r\n default:\r\n return null\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
{ESTIMATE_TYPE_LABELS[estimateType]}
\r\n
Report Date
\r\n
\r\n {dateFns.format(earningsDate, 'MMM dd, yyy')} {marketHoursSuffix(earningsDate)}\r\n
\r\n
Fiscal Period
\r\n
{`${reportReaction.fiscalPeriod.substring(4, 6)} ${reportReaction.fiscalPeriod.substring(0, 4)}`}
\r\n
Period Ending
\r\n
{fiscalEndDate && dateFns.format(fiscalEndDate, 'MMM yyyy')}
\r\n
 
\r\n
Estimate
\r\n
{shortFormatNumber(estimate)}
\r\n
Reported
\r\n
{shortFormatNumber(reported)}
\r\n
Surprise
\r\n
\r\n {data.surprise !== null && estimate && (\r\n \r\n {shortFormatNumber(data.surprise)} ({formatNumber(Math.abs((data.surprise / estimate) * 100))}%)\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n
Daily Change
\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\n","import { ColorVariant } from '../../../components'\r\nimport { getColor } from '../utils'\r\n\r\nexport function getSurpriseDotColor(value: number) {\r\n let color = ColorVariant.gray\r\n if (value > 0) {\r\n color = ColorVariant.green\r\n } else if (value < 0) {\r\n color = ColorVariant.red\r\n }\r\n\r\n return getColor(color)\r\n}\r\n","import React from 'react'\r\nimport { Dot, DotProps } from 'recharts'\r\n\r\nimport { ColorVariant } from '../../../components'\r\nimport { getColor } from '../utils'\r\nimport { getSurpriseDotColor } from './utils'\r\n\r\ntype Props = DotProps & { value?: number; isActive?: boolean }\r\n\r\nexport function RedGreenDot(props: Props) {\r\n const { cx, cy, value, isActive, onMouseEnter, onMouseLeave } = props\r\n\r\n if (typeof value === 'number') {\r\n const size = isActive ? 6 : 5\r\n\r\n return (\r\n \r\n )\r\n }\r\n\r\n return <>\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\nimport { Bar, Cell, ComposedChart, Line, Rectangle, RectangleProps, Tooltip, YAxis } from 'recharts'\r\n\r\nimport { ColorVariant } from '../../../components'\r\nimport {\r\n BAR_GAP,\r\n BAR_WIDTH,\r\n BAR_WIDTH_NARROW,\r\n CHART_HEIGHT,\r\n CHART_MARGINS,\r\n CURSOR_STYLE,\r\n EXTRA_WIDTH,\r\n LABELS_MARGIN,\r\n LABELS_WIDTH,\r\n TICK_STYLE,\r\n TOOLTIP_WRAPPER_STYLE,\r\n TRANSPARENT_CURSOR,\r\n} from '../constants'\r\nimport { EarningReportReaction, EarningValueProperty, EarningsDataType, EarningsEstimateType } from '../types'\r\nimport { getColor, tickFormatter } from '../utils'\r\nimport { PerformanceTooltip } from './PerformanceTooltip'\r\nimport { RedGreenDot } from './RedGreenDot'\r\n\r\ninterface CustomCursorProps extends Partial> {\r\n barWithGapWidth: number\r\n isActive: boolean\r\n points?: [{ x: number }]\r\n}\r\n\r\nfunction CustomCursor({ barWithGapWidth, points, ...props }: CustomCursorProps) {\r\n const x = points![0].x - barWithGapWidth / 2\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport type Props = {\r\n annualData: EarningsDataType[]\r\n estimateType: EarningsEstimateType\r\n isCompact: boolean\r\n reportReactions: EarningReportReaction[]\r\n}\r\n\r\nexport type ChartYearData = {\r\n year: string\r\n isEstimate: boolean\r\n reportReaction: EarningReportReaction | undefined\r\n} & Record\r\n\r\nconst CHART_GRID_COMMON_PROPS = 'absolute right-8 border-t border-dashed border-secondary'\r\n\r\nexport function EarningsChart({ annualData, estimateType, isCompact, reportReactions }: Props) {\r\n const [isActive, setIsActive] = React.useState(false)\r\n const [activeIndex, setActiveIndex] = React.useState(-1)\r\n const [reverseTooltipDirection, setReverseTooltipDirection] = React.useState(true)\r\n const columnsCount = annualData[0].values.length\r\n const barWidth = isCompact ? BAR_WIDTH_NARROW : BAR_WIDTH\r\n const { estimateColumnsCount, hasBarChart, hasLineChart } = React.useMemo(\r\n () => ({\r\n estimateColumnsCount: annualData[0].values.filter(({ isEstimate }) => isEstimate).length,\r\n hasLineChart: annualData.some(({ id, isSelected }) => id === EarningValueProperty.Surprise && isSelected),\r\n hasBarChart: annualData.some(({ id, isSelected }) => id !== EarningValueProperty.Surprise && isSelected),\r\n }),\r\n [annualData]\r\n )\r\n const chartData = React.useMemo(() => {\r\n const data: Record = {}\r\n annualData.forEach(({ id, values }) => {\r\n values.forEach(({ value, year, isEstimate }) => {\r\n const fiscalPeriod = `20${year.substring(4, 6)}${year.substring(0, 2)}`\r\n const reportReaction = reportReactions.find((reaction) => reaction.fiscalPeriod === fiscalPeriod)\r\n data[year] = { ...data[year], year, isEstimate, [id]: value, reportReaction }\r\n })\r\n })\r\n return Object.values(data)\r\n }, [annualData, reportReactions])\r\n\r\n const chartWidth = columnsCount * barWidth + (columnsCount - 1) * BAR_GAP + EXTRA_WIDTH + LABELS_WIDTH * 1.5\r\n const estimateAreaWidth = estimateColumnsCount * barWidth + estimateColumnsCount * BAR_GAP\r\n const barLessChartYMargin = barWidth / 2 + BAR_GAP / 2\r\n\r\n const chartGridCommonLeftProps = {\r\n 'left-8': hasLineChart,\r\n 'left-0': !hasLineChart,\r\n }\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 setIsActive(true)\r\n }}\r\n onMouseLeave={() => {\r\n setIsActive(false)\r\n }}\r\n >\r\n {\r\n if (typeof props.activeTooltipIndex === 'number' && props.activeTooltipIndex !== activeIndex) {\r\n setActiveIndex(props.activeTooltipIndex)\r\n }\r\n setReverseTooltipDirection(mouseEvent.clientX > window.innerWidth / 2)\r\n }}\r\n onMouseLeave={() => {\r\n setActiveIndex(-1)\r\n }}\r\n >\r\n \r\n \r\n }\r\n content={() => (\r\n \r\n )}\r\n />\r\n {annualData.map(({ id, label, isSelected, color }) => {\r\n if (!isSelected) return null\r\n\r\n if (id !== EarningValueProperty.Surprise) {\r\n return (\r\n \r\n {chartData.map((row, index) => (\r\n \r\n ))}\r\n \r\n )\r\n }\r\n\r\n return (\r\n }\r\n strokeDasharray=\"3 3\"\r\n activeDot={ {}} onMouseLeave={() => {}} />}\r\n stroke={getColor(color)}\r\n isAnimationActive={false}\r\n connectNulls={false}\r\n />\r\n )\r\n })}\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { RedGreenText } from '../../components/RedGreenText'\r\nimport { TableAlign } from '../../components/Table'\r\nimport { shortFormatNumber } from '../../util'\r\nimport { EarningValueProperty, EarningsColumnsType, EarningsDataEnum } from './types'\r\n\r\nconst getColumns = (yearKeys: string[], isCompact: boolean) => {\r\n const commonClassName = classNames('px-4 last:pr-11', {\r\n 'w-22 last:w-29.5': !isCompact,\r\n 'w-17 last:w-24.5': isCompact,\r\n })\r\n\r\n const columns: EarningsColumnsType['columns'] = yearKeys.map((year) => ({\r\n id: year,\r\n name: year,\r\n align: TableAlign.Right,\r\n className: commonClassName,\r\n renderColumn: (data) => {\r\n const annualDividend = data.values.find((annualDividend) => annualDividend.year === year)\r\n const annualDividendValue = annualDividend?.value ?? null\r\n const annualDividendValuePercent = annualDividend?.percentageValue ?? null\r\n if (typeof annualDividendValue !== 'number') return \r\n if (data.id === EarningValueProperty.Surprise) {\r\n return (\r\n \r\n {shortFormatNumber(annualDividendValue, { defaultValue: '—' })}\r\n {typeof annualDividendValuePercent === 'number' && (\r\n <>\r\n
\r\n {shortFormatNumber(annualDividendValuePercent, { fractions: 2 })}%\r\n \r\n )}\r\n
\r\n )\r\n }\r\n const value = shortFormatNumber(annualDividendValue, { fractions: 2 })\r\n return {value}\r\n },\r\n }))\r\n\r\n const subColumns: EarningsColumnsType['subColumns'] = {\r\n [EarningsDataEnum.analysts]: yearKeys.map((year) => ({\r\n id: year,\r\n name: year,\r\n align: TableAlign.Right,\r\n className: commonClassName,\r\n renderColumn: (data) => {\r\n const annualDividend = data.values.find((annualDividend) => annualDividend.year === year)\r\n const annualDividendValue = annualDividend?.value ?? null\r\n return {annualDividendValue?.toFixed(0) ?? '—'}\r\n },\r\n })),\r\n [EarningsDataEnum.yoyChange]: yearKeys.map((year) => ({\r\n id: year,\r\n name: year,\r\n align: TableAlign.Right,\r\n className: commonClassName,\r\n renderColumn: (data) => {\r\n const annualDividend = data.values.find((annualDividend) => annualDividend.year === year)\r\n const annualDividendValue = annualDividend?.value ?? null\r\n return (\r\n \r\n {shortFormatNumber(annualDividendValue, { defaultValue: '—' })}\r\n \r\n )\r\n },\r\n })),\r\n [EarningsDataEnum.yoyChangePct]: yearKeys.map((year) => ({\r\n id: year,\r\n name: year,\r\n align: TableAlign.Right,\r\n className: commonClassName,\r\n renderColumn: (data) => {\r\n const annualDividend = data.values.find((annualDividend) => annualDividend.year === year)\r\n const annualDividendValue = annualDividend?.value ?? null\r\n return (\r\n \r\n {annualDividendValue?.toFixed(2) ?? '—'}\r\n \r\n )\r\n },\r\n })),\r\n }\r\n return { columns, subColumns }\r\n}\r\n\r\nexport function useTableColumns(yearKeys: string[], isCompact: boolean) {\r\n return React.useMemo(() => getColumns(yearKeys, isCompact), [yearKeys, isCompact])\r\n}\r\n","import React from 'react'\r\n\r\nimport { TableAlign, TableHead, TableHeader } from '../../components/Table'\r\nimport { FinancialsWidget, getIsCompact } from '../../components/financials-table'\r\nimport { EarningsSettings } from '../earnings/types'\r\nimport { ForecastSettings } from '../forecast/types'\r\nimport WidgetHeader from './WidgetHeader'\r\nimport { EarningsChart } from './charts/EarningsChart'\r\nimport { BAR_WIDTH, EARNINGS_WIDGET_LABELS, EarningsWidgetCategory } from './constants'\r\nimport { EarningReportReaction, EarningsCommonData, EarningsDataEnum, EarningsEstimateType } from './types'\r\nimport { useTableColumns } from './useTableColumns'\r\nimport { mapData } from './utils'\r\n\r\nconst widgetToEstimateType: { [K in EarningsWidgetCategory]: EarningsEstimateType } = {\r\n [EarningsWidgetCategory.Eps]: EarningsEstimateType.eps,\r\n [EarningsWidgetCategory.EpsGaap]: EarningsEstimateType.epsGaap,\r\n [EarningsWidgetCategory.Revenue]: EarningsEstimateType.sales,\r\n}\r\n\r\ninterface Props {\r\n data: EarningsCommonData\r\n earningsWidgetCategory: EarningsWidgetCategory\r\n priceReactionData: EarningReportReaction[]\r\n settings: EarningsSettings | ForecastSettings\r\n}\r\n\r\nexport function EarningsWidget({ data, earningsWidgetCategory, priceReactionData, settings }: Props) {\r\n const [annualData, setAnnualData] = React.useState(() =>\r\n data ? mapData(data, settings.earningsTimeframe, earningsWidgetCategory) : []\r\n )\r\n\r\n const yearKeys = React.useMemo(\r\n () =>\r\n annualData\r\n .flatMap(({ values }) => values.map(({ year }) => year))\r\n .filter((year, index, arr) => arr.indexOf(year) === index),\r\n [annualData]\r\n )\r\n const label = EARNINGS_WIDGET_LABELS[earningsWidgetCategory] || ''\r\n const estimateType = widgetToEstimateType[earningsWidgetCategory]\r\n const [isCompact, setIsCompact] = React.useState(getIsCompact(yearKeys.length, 22))\r\n const { columns, subColumns } = useTableColumns(yearKeys, isCompact)\r\n\r\n React.useEffect(() => {\r\n // Remove min-height from react root element which is set on BE because of CLS\r\n document.getElementById('root')?.style.removeProperty('min-height')\r\n\r\n const onResize = () => {\r\n setIsCompact(getIsCompact(yearKeys.length, BAR_WIDTH))\r\n }\r\n\r\n onResize()\r\n\r\n window.addEventListener('resize', onResize)\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize)\r\n }\r\n }, [yearKeys])\r\n\r\n React.useEffect(() => {\r\n setAnnualData(mapData(data, settings.earningsTimeframe, earningsWidgetCategory))\r\n }, [data, settings.earningsTimeframe, earningsWidgetCategory])\r\n\r\n const onVisibilityChange = (id: string, isSelected: boolean) => {\r\n setAnnualData(\r\n annualData.map((item) =>\r\n item.id === id\r\n ? {\r\n ...item,\r\n isSelected,\r\n }\r\n : item\r\n )\r\n )\r\n }\r\n\r\n const shownSubdata = (id: string) =>\r\n id === EarningsDataEnum.analysts ||\r\n (id === EarningsDataEnum.yoyChange &&\r\n EarningsDataEnum.yoyChange in settings &&\r\n settings[EarningsDataEnum.yoyChange]) ||\r\n (id === EarningsDataEnum.yoyChangePct &&\r\n EarningsDataEnum.yoyChangePct in settings &&\r\n settings[EarningsDataEnum.yoyChangePct])\r\n\r\n return (\r\n \r\n ({\r\n ...revenue,\r\n subData: revenue.subData.filter(({ id }) => shownSubdata(id)),\r\n }))}\r\n header={}\r\n tableHead={\r\n \r\n Currency: USD\r\n\r\n {columns.map((column) => (\r\n \r\n {column.name}\r\n \r\n ))}\r\n \r\n }\r\n columns={columns}\r\n subColumns={subColumns}\r\n onVisibilityChange={onVisibilityChange}\r\n >\r\n \r\n \r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Heading } from '../../components/typography'\r\n\r\ninterface Props {\r\n label: string\r\n}\r\n\r\nexport default function WidgetHeader({ label }: Props) {\r\n return (\r\n \r\n {label}\r\n \r\n )\r\n}\r\n","import colors from '../../../../../config/colors'\r\n\r\nexport enum EarningsWidgetCategory {\r\n Eps,\r\n EpsGaap,\r\n Revenue,\r\n}\r\n\r\nexport const EARNINGS_WIDGET_LABELS: Record = {\r\n [EarningsWidgetCategory.Eps]: 'EPS Performance and Forecast',\r\n [EarningsWidgetCategory.EpsGaap]: 'GAAP EPS Performance and Forecast',\r\n [EarningsWidgetCategory.Revenue]: 'Revenue Performance and Forecast',\r\n}\r\n\r\nexport const BAR_WIDTH = 72\r\nexport const CHART_HEIGHT = 250\r\nexport const LABELS_WIDTH = 28\r\nexport const LABELS_MARGIN = 22\r\nexport const BAR_WIDTH_NARROW = 52\r\nexport const BAR_GAP = 16\r\nexport const EXTRA_WIDTH = 44\r\nexport const CHART_MARGINS = { top: 2, right: 0, bottom: 0, left: 0 }\r\nexport const TICK_STYLE = { fontSize: 10, fontWeight: 500, textAnchor: 'end' }\r\nexport const TOOLTIP_WRAPPER_STYLE = { outline: 'none', zIndex: 10 }\r\nexport const CURSOR_STYLE = {\r\n border: 0,\r\n stroke: 0,\r\n fill: FinvizSettings.hasDarkTheme ? colors.gray[700] : colors.gray[50],\r\n opacity: 0.65,\r\n}\r\nexport const TRANSPARENT_CURSOR = { opacity: 0 }\r\n","// These values match keys which come from BE so don't change them\r\nimport { FinancialsColumnDefinition, FinancialsRowDataType } from '../../components/financials-table/types'\r\n\r\nexport enum EarningValueProperty {\r\n EpsActual = 'epsActual',\r\n EpsAnalysts = 'epsAnalysts',\r\n EpsEstimate = 'epsEstimate',\r\n EpsReportedActual = 'epsReportedActual',\r\n EpsReportedAnalysts = 'epsReportedAnalysts',\r\n EpsReportedEstimate = 'epsReportedEstimate',\r\n SalesActual = 'salesActual',\r\n SalesAnalysts = 'salesAnalysts',\r\n SalesEstimate = 'salesEstimate',\r\n Surprise = 'surprise',\r\n}\r\n\r\nexport type Earning = {\r\n earningsDate: string | null\r\n epsActual: number | null\r\n epsEstimate: number | null\r\n fiscalEndDate: string\r\n fiscalPeriod: string\r\n ticker: string\r\n} & Record\r\n\r\nexport interface EarningsDataType extends Omit {\r\n id: EarningValueProperty\r\n values: Array<{ year: string; value: number | null; isEstimate: boolean }>\r\n isEstimate?: boolean\r\n}\r\n\r\nexport enum EarningsEstimateType {\r\n eps = 'E',\r\n epsGaap = 'R',\r\n sales = 'S',\r\n}\r\n\r\nexport enum EarningsDataEnum {\r\n analysts = 'analysts',\r\n yoyChange = 'yoyChange',\r\n yoyChangePct = 'yoyChangePct',\r\n}\r\n\r\nexport enum EarningsTimeframeEnum {\r\n annual = 'annual',\r\n quarterly = 'quarterly',\r\n}\r\n\r\ntype EarningRowDataType = Omit & {\r\n values: Array<{ year: string; value: number | null; percentageValue: number | null; isEstimate?: boolean }>\r\n}\r\n\r\nexport type EarningsColumnsType = {\r\n columns: FinancialsColumnDefinition[]\r\n subColumns: Record\r\n}\r\n\r\nexport type EarningPriceReaction = {\r\n date: string\r\n prevPrice: number\r\n price: number\r\n priceDiff: number\r\n spyPriceDiff: number\r\n}\r\n\r\nexport type EarningPriceReactions = {\r\n [K: string]: EarningPriceReaction\r\n}\r\n\r\nexport type EarningReportReaction = {\r\n ticker: string\r\n reportDate: string\r\n fiscalPeriod: string\r\n fiscalEndDate: string | null\r\n chartStartDate: string\r\n chartEndDate: string\r\n rsi: number | null\r\n reactions: EarningPriceReactions\r\n}\r\n\r\nexport enum PriceReactionWhen {\r\n MINUS_DAYS_3 = 'minus_3_days',\r\n MINUS_DAYS_2 = 'minus_2_days',\r\n MINUS_DAYS_1 = 'minus_1_day',\r\n OPEN = 'open',\r\n HIGH = 'high',\r\n LOW = 'low',\r\n CLOSE = 'close',\r\n PLUS_DAYS_1 = 'plus_1_day',\r\n PLUS_DAYS_2 = 'plus_2_days',\r\n PLUS_DAYS_3 = 'plus_3_days',\r\n PLUS_WEEK_1 = 'plus_1_week',\r\n MINUS_WEEK_1 = 'minus_1_week',\r\n}\r\n\r\nexport interface EarningsCommonData {\r\n earningsDate: string | null\r\n earningsAnnualData: Earning[]\r\n earningsData: Earning[]\r\n priceReactionData: EarningReportReaction[]\r\n}\r\n","import colors from '../../../../../config/colors'\r\nimport { ColorVariant } from '../../components'\r\nimport { getYoYData } from '../../components/financials-table'\r\nimport { shortFormatNumber } from '../../util'\r\nimport { getIsEarningEstimate, getIsSemiAnnualEarning } from '../earnings/utils'\r\nimport { EarningsWidgetCategory } from './constants'\r\nimport {\r\n EarningValueProperty,\r\n EarningsCommonData,\r\n EarningsDataEnum,\r\n EarningsDataType,\r\n EarningsTimeframeEnum,\r\n} from './types'\r\n\r\nexport function getColor(color: ColorVariant) {\r\n switch (color) {\r\n case ColorVariant.dark:\r\n return FinvizSettings.hasDarkTheme ? colors.gray[300] : colors.gray[700]\r\n case ColorVariant.violet:\r\n return colors.violet[400]\r\n case ColorVariant.orange:\r\n return colors.orange[300]\r\n case ColorVariant.blue:\r\n return colors.blue[400]\r\n case ColorVariant.green:\r\n return colors.green[300]\r\n case ColorVariant.gray:\r\n return FinvizSettings.hasDarkTheme ? colors.gray[700] : colors.gray[100]\r\n case ColorVariant.red:\r\n return colors.red[400]\r\n case ColorVariant.default:\r\n default:\r\n return FinvizSettings.hasDarkTheme ? colors.finviz['blue-gray'] : colors.white\r\n }\r\n}\r\n\r\nexport function tickFormatter(value: any) {\r\n return shortFormatNumber(value, { fractions: Math.abs(value) >= 1_000 ? 0 : 2 })\r\n}\r\n\r\nexport function marketHoursSuffix(date: Date) {\r\n if (date.getHours() >= 16) {\r\n return 'AMC'\r\n } else if (date.getHours() <= 9) {\r\n return 'BMO'\r\n }\r\n return ''\r\n}\r\n\r\nfunction getEarningsDataTemplate(\r\n earningsWidgetCategory: EarningsWidgetCategory\r\n): Array> {\r\n if (earningsWidgetCategory === EarningsWidgetCategory.Revenue) {\r\n return [\r\n {\r\n label: 'Estimate',\r\n id: EarningValueProperty.SalesEstimate,\r\n color: ColorVariant.gray,\r\n isSelected: true,\r\n isEstimate: true,\r\n },\r\n { label: 'Reported', id: EarningValueProperty.SalesActual, color: ColorVariant.violet, isSelected: true },\r\n { label: 'Surprise', id: EarningValueProperty.Surprise, color: ColorVariant.dark, isSelected: false },\r\n ]\r\n }\r\n\r\n const isGaap = earningsWidgetCategory === EarningsWidgetCategory.EpsGaap\r\n return [\r\n {\r\n label: 'Estimate',\r\n id: isGaap ? EarningValueProperty.EpsReportedEstimate : EarningValueProperty.EpsEstimate,\r\n color: ColorVariant.gray,\r\n isSelected: true,\r\n isEstimate: true,\r\n },\r\n {\r\n label: 'Reported',\r\n id: isGaap ? EarningValueProperty.EpsReportedActual : EarningValueProperty.EpsActual,\r\n color: isGaap ? ColorVariant.orange : ColorVariant.blue,\r\n isSelected: true,\r\n },\r\n { label: 'Surprise', id: EarningValueProperty.Surprise, color: ColorVariant.dark, isSelected: false },\r\n ]\r\n}\r\n\r\nexport function mapData(\r\n data: EarningsCommonData,\r\n earningsTimeframe: EarningsTimeframeEnum,\r\n earningsWidgetCategory: EarningsWidgetCategory\r\n) {\r\n const isQuarterlyTimeframe = earningsTimeframe === EarningsTimeframeEnum.quarterly // EarningsTimeframeEnum.quarterly is used for both quarterly & semiannual\r\n const dataValues = isQuarterlyTimeframe ? data.earningsData : data.earningsAnnualData\r\n const isSemiAnnualEarning = isQuarterlyTimeframe && getIsSemiAnnualEarning(data.earningsData)\r\n const earningsArray = getEarningsDataTemplate(earningsWidgetCategory).map((category) => {\r\n let numOfEstimates = 0\r\n return {\r\n ...category,\r\n labelColumnClassName: 'align-top',\r\n values: dataValues\r\n .map((periodDataRaw) => {\r\n const periodData = {\r\n ...periodDataRaw,\r\n [EarningValueProperty.SalesActual]: periodDataRaw.salesActual && periodDataRaw.salesActual * 1_000_000,\r\n [EarningValueProperty.SalesEstimate]:\r\n periodDataRaw.salesEstimate && periodDataRaw.salesEstimate * 1_000_000,\r\n }\r\n const yearPeriod =\r\n earningsTimeframe === EarningsTimeframeEnum.quarterly\r\n ? `${periodData.fiscalPeriod.substring(4, 6)} '${periodData.fiscalPeriod.substring(2, 4)}` // eg. Q2 '23\r\n : periodData.fiscalPeriod.substring(0, 4) // eg. 2024\r\n let value = periodData[category.id]\r\n // percentageValue is used in Surprise row\r\n let percentageValue: number | null = null\r\n const {\r\n [EarningValueProperty.SalesActual]: salesActual,\r\n [EarningValueProperty.EpsReportedActual]: epsReportedActual,\r\n [EarningValueProperty.EpsActual]: epsActual,\r\n } = periodData\r\n\r\n if (category.id === EarningValueProperty.Surprise) {\r\n let actualValue: number | null = null\r\n let estimateValue: number | null = null\r\n\r\n if (earningsWidgetCategory === EarningsWidgetCategory.Revenue) {\r\n actualValue = salesActual\r\n estimateValue = periodData[EarningValueProperty.SalesEstimate]\r\n } else if (earningsWidgetCategory === EarningsWidgetCategory.EpsGaap) {\r\n actualValue = epsReportedActual\r\n estimateValue = periodData[EarningValueProperty.EpsReportedEstimate]\r\n } else if (earningsWidgetCategory === EarningsWidgetCategory.Eps) {\r\n actualValue = epsActual\r\n estimateValue = periodData[EarningValueProperty.EpsEstimate]\r\n }\r\n\r\n if (actualValue !== null && estimateValue !== null) {\r\n value = actualValue - estimateValue\r\n percentageValue = (value / estimateValue) * 100\r\n }\r\n }\r\n\r\n let analysts: number | null = null\r\n if (earningsWidgetCategory === EarningsWidgetCategory.Revenue) {\r\n analysts = periodData[EarningValueProperty.SalesAnalysts]\r\n } else if (earningsWidgetCategory === EarningsWidgetCategory.EpsGaap) {\r\n analysts = periodData[EarningValueProperty.EpsReportedAnalysts]\r\n } else if (earningsWidgetCategory === EarningsWidgetCategory.Eps) {\r\n analysts = periodData[EarningValueProperty.EpsAnalysts]\r\n }\r\n\r\n return {\r\n year: yearPeriod,\r\n percentageValue,\r\n value,\r\n isEstimate: getIsEarningEstimate(periodData),\r\n analysts,\r\n }\r\n })\r\n .filter(({ isEstimate }) => {\r\n if (isEstimate) {\r\n numOfEstimates += 1\r\n return numOfEstimates <= 4\r\n }\r\n return true\r\n })\r\n .slice(-12),\r\n }\r\n })\r\n\r\n return earningsArray.map((earningsCategory) => {\r\n const yoyData = earningsCategory.id === EarningValueProperty.Surprise ? null : getYoYData(earningsCategory.values)\r\n\r\n let yoyGrowthLabel = 'YoY Growth'\r\n\r\n if (isQuarterlyTimeframe) {\r\n yoyGrowthLabel = isSemiAnnualEarning ? 'SoS Growth' : 'QoQ Growth'\r\n }\r\n\r\n return {\r\n ...earningsCategory,\r\n subData: [\r\n ...(earningsCategory.isEstimate\r\n ? [\r\n {\r\n id: EarningsDataEnum.analysts,\r\n label: '# of Analysts',\r\n values: earningsCategory.values.map((anualDividend) => ({\r\n ...anualDividend,\r\n value: anualDividend.analysts,\r\n })),\r\n },\r\n ]\r\n : []),\r\n ...(yoyData\r\n ? [\r\n {\r\n id: EarningsDataEnum.yoyChange,\r\n label: yoyGrowthLabel,\r\n values: earningsCategory.values.map((anualDividend) => ({\r\n ...anualDividend,\r\n value: yoyData.change[anualDividend.year] ?? null,\r\n })),\r\n },\r\n {\r\n id: EarningsDataEnum.yoyChangePct,\r\n label: `${yoyGrowthLabel} %`,\r\n values: earningsCategory.values.map((anualDividend) => ({\r\n ...anualDividend,\r\n value: yoyData.changePct[anualDividend.year] ?? null,\r\n })),\r\n },\r\n ]\r\n : []),\r\n ],\r\n }\r\n })\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { PropsWithChildren } from 'react'\r\n\r\nimport colors from '../../../../../config/colors'\r\n\r\nexport enum HighlightedBoxColor {\r\n DarkRed,\r\n MediumRed,\r\n LightRed,\r\n Neutral,\r\n LightGreen,\r\n MediumGreen,\r\n DarkGreen,\r\n}\r\n\r\nconst LIGHT_BG_COLORS: string[] = [\r\n colors.red[200],\r\n colors.red[100],\r\n colors.red[50],\r\n colors.gray[50],\r\n colors.green[50],\r\n colors.green[100],\r\n colors.green[200],\r\n]\r\n\r\nconst DARK_BG_COLORS: string[] = [\r\n colors.red[500],\r\n colors.red[600],\r\n colors.red[700],\r\n colors.gray[700],\r\n colors.green[700],\r\n colors.green[600],\r\n colors.green[500],\r\n]\r\n\r\nconst LIGHT_TEXT_COLORS: string[] = [\r\n colors.red[700],\r\n colors.red[600],\r\n colors.red[500],\r\n colors.gray[600],\r\n colors.green[500],\r\n colors.green[600],\r\n colors.green[700],\r\n]\r\n\r\nconst DARK_TEXT_COLORS: string[] = [\r\n colors.white,\r\n colors.red[200],\r\n colors.red[300],\r\n colors.gray[200],\r\n colors.green[300],\r\n colors.green[200],\r\n colors.white,\r\n]\r\n\r\ninterface HighlightedBoxProps {\r\n className?: string\r\n color: HighlightedBoxColor\r\n}\r\n\r\nexport function HighlightedBox({ children, className, color }: PropsWithChildren) {\r\n const bgColorsList = FinvizSettings.hasDarkTheme ? DARK_BG_COLORS : LIGHT_BG_COLORS\r\n const textColorsList = FinvizSettings.hasDarkTheme ? DARK_TEXT_COLORS : LIGHT_TEXT_COLORS\r\n\r\n return (\r\n \r\n {children}\r\n
\r\n )\r\n}\r\n","import { EarningsDataEnum, EarningsEstimateType, EarningsTimeframeEnum } from '../earnings-common/types'\r\nimport { EarningsSettings } from './types'\r\n\r\nexport enum EarningsColor {\r\n cursor = 'cursor',\r\n downBar = 'downBar',\r\n downRevision = 'downRevision',\r\n estimate = 'estimate',\r\n lowHigh = 'lowHigh',\r\n price = 'price',\r\n upBar = 'upBar',\r\n upRevision = 'upRevision',\r\n}\r\n\r\nexport const EarningsEstimateTypeLabels: { [key in EarningsEstimateType]: string } = {\r\n [EarningsEstimateType.eps]: 'EPS',\r\n [EarningsEstimateType.epsGaap]: 'GAAP EPS',\r\n [EarningsEstimateType.sales]: 'Sales',\r\n}\r\n\r\nexport const EARNINGS_DATE_FORMAT = 'MMM dd, yyy'\r\n\r\nexport const PRICE_REVISIONS_CHART_WIDTH = 1218\r\nexport const PRICE_REVISIONS_CHART_HEIGHT = 296\r\nexport const REVISIONS_LEFT_TICK_STYLE = { fontSize: 10, fontWeight: 400, textAnchor: 'end' }\r\nexport const REVISIONS_RIGHT_TICK_STYLE = { fontSize: 10, fontWeight: 400, textAnchor: 'start' }\r\nexport const PRICE_REVISIONS_YAXIS_WIDTH = 40\r\nexport const PRICE_REVISIONS_TICK_COUNT = 6\r\n\r\nexport const UPDOWN_REVISIONS_CHART_HEIGHT = 135\r\nexport const UPDOWN_REVISIONS_TICK_COUNT = 7\r\n\r\nexport const FISCAL_YEAR_MARK = 'FY'\r\n\r\nexport const SETTINGS_COOKIE_KEY = 'earningsSettings'\r\n\r\nexport const DEFAULT_SETTINGS: EarningsSettings = {\r\n [EarningsDataEnum.yoyChange]: false,\r\n [EarningsDataEnum.yoyChangePct]: false,\r\n estimateType: EarningsEstimateType.eps,\r\n fiscalPeriod: '',\r\n earningsTimeframe: EarningsTimeframeEnum.quarterly,\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { TableAlign } from '../../components/Table'\r\nimport {\r\n EarningsCommonData,\r\n EarningsDataEnum,\r\n EarningsEstimateType,\r\n EarningsTimeframeEnum,\r\n PriceReactionWhen,\r\n} from '../earnings-common/types'\r\n\r\nexport type EarningRevision = {\r\n ticker: string\r\n fiscalPeriod: string\r\n estimateType: EarningsEstimateType\r\n estimateDate: string\r\n relativeFiscalPeriod: number\r\n estimates: number\r\n upRevisions: number\r\n downRevisions: number\r\n mean: number\r\n high: number\r\n low: number\r\n price: number\r\n}\r\n\r\nexport type EarningRevisionWithDate = EarningRevision & { date: Date; negDownRevisions?: number }\r\n\r\nexport interface EarningsData extends EarningsCommonData {\r\n earningsRevisionsData: EarningRevision[]\r\n}\r\n\r\nexport type EarningsRevisionsByType = {\r\n [estimateType in EarningsEstimateType]: {\r\n quarters: { [quarter: string]: EarningRevisionWithDate[] }\r\n years: { [year: string]: EarningRevisionWithDate[] }\r\n }\r\n}\r\n\r\nexport type EarningsSettings = {\r\n [EarningsDataEnum.yoyChange]: boolean\r\n [EarningsDataEnum.yoyChangePct]: boolean\r\n estimateType: EarningsEstimateType\r\n fiscalPeriod: string\r\n earningsTimeframe: EarningsTimeframeEnum\r\n}\r\n\r\nexport enum PriceReactionDataEnum {\r\n priceDiff = 'priceDiff',\r\n spyPriceDiff = 'spyPriceDiff',\r\n}\r\n\r\nexport type PriceReactionSubRowDataType = {\r\n id: string\r\n label: string\r\n labelElement?: React.ReactNode\r\n labelColumnClassName?: string\r\n values: Array<{ when: PriceReactionWhen; value: number | null }>\r\n}\r\n\r\nexport type PriceReactionRowDataType = PriceReactionSubRowDataType & {\r\n subData: PriceReactionSubRowDataType[]\r\n}\r\n\r\ntype PriceReactionColumnDefinitionBase = {\r\n id: string\r\n name: string\r\n align?: TableAlign\r\n className?: string\r\n getColumnClassName?: (data: RowDataType) => string | null | undefined\r\n renderColumn: (data: RowDataType) => React.ReactNode\r\n}\r\n\r\nexport type PriceReactionColumnDefinition = PriceReactionColumnDefinitionBase & {\r\n bottomBorderClassName?: string\r\n hasLeftBorder?: boolean\r\n hasLeftSeparator?: boolean\r\n hasRightBorder?: boolean\r\n hasRightSeparator?: boolean\r\n headerClassName?: string\r\n isSeparator?: boolean\r\n leftBorderClassName?: string\r\n rightBorderClassName?: string\r\n topBorderClassName?: string\r\n}\r\n\r\nexport type PriceReactionSubColumnDefinition = PriceReactionColumnDefinitionBase\r\n\r\nexport type PriceReactionColumnsType = {\r\n columns: PriceReactionColumnDefinition[]\r\n subColumns: Record\r\n}\r\n\r\ntype RevisionsChartItem = EarningRevisionWithDate & {\r\n lowHigh: [number, number]\r\n timestamp: number\r\n}\r\n\r\nexport type RevisionsChartData = RevisionsChartItem[]\r\n","import * as React from 'react'\r\nimport { PropsWithChildren } from 'react'\r\n\r\nimport { HighlightedBox, HighlightedBoxColor } from './HighlightedBox'\r\n\r\nfunction getColorForValue(value: number): HighlightedBoxColor {\r\n if (value <= 10) {\r\n return HighlightedBoxColor.DarkGreen\r\n } else if (value <= 20) {\r\n return HighlightedBoxColor.MediumGreen\r\n } else if (value <= 30) {\r\n return HighlightedBoxColor.LightGreen\r\n } else if (value < 70) {\r\n return HighlightedBoxColor.Neutral\r\n } else if (value < 80) {\r\n return HighlightedBoxColor.LightRed\r\n } else if (value < 90) {\r\n return HighlightedBoxColor.MediumRed\r\n } else {\r\n return HighlightedBoxColor.DarkRed\r\n }\r\n}\r\n\r\ninterface RsiValueProps {\r\n className?: string\r\n value?: number | null\r\n}\r\n\r\nexport function RsiValue({ children, className, value }: PropsWithChildren) {\r\n if (!Number.isFinite(value)) {\r\n return null\r\n }\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport colors from '../../../../../config/colors'\r\nimport { encodeQueryString } from '../../../app/queryString'\r\nimport { Button, Icon } from '../../components'\r\nimport { TIMEFRAME } from '../../constants'\r\nimport {\r\n Earning,\r\n EarningReportReaction,\r\n EarningValueProperty,\r\n EarningsEstimateType,\r\n PriceReactionWhen,\r\n} from '../earnings-common/types'\r\nimport { marketHoursSuffix } from '../earnings-common/utils'\r\nimport { RsiValue } from './RsiValue'\r\nimport { EARNINGS_DATE_FORMAT, EarningsColor, FISCAL_YEAR_MARK } from './constants'\r\nimport { PriceReactionDataEnum, PriceReactionRowDataType } from './types'\r\n\r\nexport function getEarningsColor(color: EarningsColor): string {\r\n switch (color) {\r\n case EarningsColor.cursor:\r\n return FinvizSettings.hasDarkTheme ? colors.gray[200] : colors.gray[500]\r\n case EarningsColor.downBar:\r\n return colors.red[400]\r\n case EarningsColor.downRevision:\r\n return colors.red[500]\r\n case EarningsColor.estimate:\r\n return colors.amber[300]\r\n case EarningsColor.lowHigh:\r\n return FinvizSettings.hasDarkTheme ? colors.orange[500] : colors.amber[100]\r\n case EarningsColor.price:\r\n return colors.blue[400]\r\n case EarningsColor.upBar:\r\n return colors.green[400]\r\n case EarningsColor.upRevision:\r\n return colors.green[500]\r\n default:\r\n return FinvizSettings.hasDarkTheme ? colors.white : colors.black\r\n }\r\n}\r\n\r\nexport function getIsEarningEstimate(\r\n earning: Pick<\r\n Earning,\r\n EarningValueProperty.SalesActual | EarningValueProperty.EpsReportedActual | EarningValueProperty.EpsActual\r\n >\r\n) {\r\n const {\r\n [EarningValueProperty.SalesActual]: salesActual,\r\n [EarningValueProperty.EpsReportedActual]: epsReportedActual,\r\n [EarningValueProperty.EpsActual]: epsActual,\r\n } = earning\r\n\r\n return [salesActual, epsReportedActual, epsActual].every((value) => value === null)\r\n}\r\n\r\nfunction getChartLink(ticker: string, chartStartDate: Date, chartEndDate: Date) {\r\n // see: custom-date-range-utils.ts: getTimeframeFromDateRange\r\n const range = `range_${dateFns.format(chartStartDate, 'MM-dd-yyyy')}x${dateFns.format(chartEndDate, 'MM-dd-yyyy')}`\r\n const anchorDate = new Date()\r\n const startToReferenceDateNumOfDays = dateFns.differenceInCalendarDays(anchorDate, chartStartDate) + 1\r\n const timeframe = startToReferenceDateNumOfDays <= 200 ? TIMEFRAME.i30 : TIMEFRAME.d\r\n return `/charts?${encodeQueryString({\r\n t: ticker,\r\n p: timeframe,\r\n r: range,\r\n l: '1h1v',\r\n })}`\r\n}\r\n\r\nexport function mapPriceReactionData(priceReactionData: EarningReportReaction[]) {\r\n const result: PriceReactionRowDataType[] = []\r\n\r\n for (const reportReaction of priceReactionData) {\r\n const earningsDate = dateFns.parseISO(reportReaction.reportDate)\r\n const fiscalEndDate = reportReaction.fiscalEndDate ? dateFns.parseISO(reportReaction.fiscalEndDate) : null\r\n\r\n const data: PriceReactionRowDataType = {\r\n label: reportReaction.reportDate,\r\n labelElement: (\r\n
\r\n
\r\n {dateFns.format(earningsDate, EARNINGS_DATE_FORMAT)} {marketHoursSuffix(earningsDate)}\r\n
\r\n \r\n \r\n \r\n
\r\n ),\r\n id: reportReaction.fiscalPeriod,\r\n values: Object.keys(reportReaction.reactions).map((when) => ({\r\n year: when,\r\n when: when as PriceReactionWhen,\r\n value: reportReaction.reactions[when].price,\r\n })),\r\n subData: [\r\n {\r\n id: PriceReactionDataEnum.priceDiff,\r\n label: '',\r\n labelElement: (\r\n
\r\n
\r\n {formatQuarterName(reportReaction.fiscalPeriod)}\r\n {fiscalEndDate && ({dateFns.format(fiscalEndDate, 'MMM ‘yy')})}\r\n
\r\n
{reportReaction.ticker} %
\r\n
\r\n ),\r\n values: Object.keys(reportReaction.reactions).map((when) => ({\r\n year: when,\r\n when: when as PriceReactionWhen,\r\n value: reportReaction.reactions[when].priceDiff,\r\n })),\r\n },\r\n {\r\n id: PriceReactionDataEnum.spyPriceDiff,\r\n label: '',\r\n labelElement: (\r\n
\r\n
\r\n
RSI
\r\n \r\n {reportReaction.rsi && Math.round(reportReaction.rsi)}\r\n \r\n
\r\n
SPY %
\r\n
\r\n ),\r\n values: Object.keys(reportReaction.reactions).map((when) => ({\r\n year: when,\r\n when: when as PriceReactionWhen,\r\n value: reportReaction.reactions[when].spyPriceDiff,\r\n })),\r\n },\r\n ],\r\n }\r\n\r\n result.push(data)\r\n }\r\n\r\n return result\r\n}\r\n\r\nconst QUARTAL_DELIMITER = 'Q'\r\nconst SEMI_ANNUAL_DELIMITER = 'S'\r\n\r\nexport function getIsSemiAnnualEarning(earnings: Earning[]) {\r\n return !!earnings[0]?.fiscalPeriod.includes(SEMI_ANNUAL_DELIMITER)\r\n}\r\n\r\nexport function getYearAndPeriodInt(periodString: string | null, isSemiAnnualEarning: boolean) {\r\n const [yearStr, periodStr] =\r\n periodString?.split(isSemiAnnualEarning ? SEMI_ANNUAL_DELIMITER : QUARTAL_DELIMITER) ?? []\r\n const year = Number.parseInt(yearStr)\r\n const period = Number.parseInt(periodStr)\r\n\r\n if (isNaN(year) || isNaN(period)) {\r\n return { year: null, period: null }\r\n }\r\n\r\n return { year, period }\r\n}\r\n\r\nexport function getFormattedPeriodValue(periodString: string | null, isSemiAnnualEarning: boolean) {\r\n const { year, period } = getYearAndPeriodInt(periodString, isSemiAnnualEarning)\r\n\r\n if (year === null || period === null) {\r\n return null\r\n }\r\n\r\n return `${isSemiAnnualEarning ? SEMI_ANNUAL_DELIMITER : QUARTAL_DELIMITER}${period} ${year}`\r\n}\r\n\r\nexport function formatQuarterName(fiscalPeriod: string) {\r\n return `${fiscalPeriod.substring(4, 6)} ‘${fiscalPeriod.substring(2, 4)}`\r\n}\r\n\r\nexport function formatYearName(fiscalPeriod: string) {\r\n return `FY ‘${fiscalPeriod.substring(2, 4)}`\r\n}\r\n\r\nexport function formatFiscalName(fiscalPeriod: string) {\r\n return fiscalPeriod.endsWith(FISCAL_YEAR_MARK) ? formatYearName(fiscalPeriod) : formatQuarterName(fiscalPeriod)\r\n}\r\n\r\nexport function adjustEstimate(value: number, estimateType: EarningsEstimateType) {\r\n return estimateType === EarningsEstimateType.sales ? value * 1_000_000 : value\r\n}\r\n","import { millisecondsInHour, millisecondsInMinute } from \"../constants/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nimport toInteger from \"../_lib/toInteger/index.js\";\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @param {String} argument - the value to convert\n * @param {Object} [options] - an object with options.\n * @param {0|1|2} [options.additionalDigits=2] - the additional number of digits in the extended year format\n * @returns {Date} the parsed date in the local time zone\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport default function parseISO(argument, options) {\n var _options$additionalDi;\n requiredArgs(1, arguments);\n var additionalDigits = toInteger((_options$additionalDi = options === null || options === void 0 ? void 0 : options.additionalDigits) !== null && _options$additionalDi !== void 0 ? _options$additionalDi : 2);\n if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) {\n throw new RangeError('additionalDigits must be 0, 1 or 2');\n }\n if (!(typeof argument === 'string' || Object.prototype.toString.call(argument) === '[object String]')) {\n return new Date(NaN);\n }\n var dateStrings = splitDateString(argument);\n var date;\n if (dateStrings.date) {\n var parseYearResult = parseYear(dateStrings.date, additionalDigits);\n date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n }\n if (!date || isNaN(date.getTime())) {\n return new Date(NaN);\n }\n var timestamp = date.getTime();\n var time = 0;\n var offset;\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (isNaN(time)) {\n return new Date(NaN);\n }\n }\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n if (isNaN(offset)) {\n return new Date(NaN);\n }\n } else {\n var dirtyDate = new Date(timestamp + time);\n // js parsed string assuming it's in UTC timezone\n // but we need it to be parsed in our timezone\n // so we use utc values to build date in our timezone.\n // Year values from 0 to 99 map to the years 1900 to 1999\n // so set year explicitly with setFullYear.\n var result = new Date(0);\n result.setFullYear(dirtyDate.getUTCFullYear(), dirtyDate.getUTCMonth(), dirtyDate.getUTCDate());\n result.setHours(dirtyDate.getUTCHours(), dirtyDate.getUTCMinutes(), dirtyDate.getUTCSeconds(), dirtyDate.getUTCMilliseconds());\n return result;\n }\n return new Date(timestamp + time + offset);\n}\nvar patterns = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/\n};\nvar dateRegex = /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nvar timeRegex = /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nvar timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\nfunction splitDateString(dateString) {\n var dateStrings = {};\n var array = dateString.split(patterns.dateTimeDelimiter);\n var timeString;\n\n // The regex match should only return at maximum two array elements.\n // [date], [time], or [date, time].\n if (array.length > 2) {\n return dateStrings;\n }\n if (/:/.test(array[0])) {\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n timeString = dateString.substr(dateStrings.date.length, dateString.length);\n }\n }\n if (timeString) {\n var token = patterns.timezone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], '');\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n return dateStrings;\n}\nfunction parseYear(dateString, additionalDigits) {\n var regex = new RegExp('^(?:(\\\\d{4}|[+-]\\\\d{' + (4 + additionalDigits) + '})|(\\\\d{2}|[+-]\\\\d{' + (2 + additionalDigits) + '})$)');\n var captures = dateString.match(regex);\n // Invalid ISO-formatted year\n if (!captures) return {\n year: NaN,\n restDateString: ''\n };\n var year = captures[1] ? parseInt(captures[1]) : null;\n var century = captures[2] ? parseInt(captures[2]) : null;\n\n // either year or century is null, not both\n return {\n year: century === null ? year : century * 100,\n restDateString: dateString.slice((captures[1] || captures[2]).length)\n };\n}\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) return new Date(NaN);\n var captures = dateString.match(dateRegex);\n // Invalid ISO-formatted string\n if (!captures) return new Date(NaN);\n var isWeekDate = !!captures[4];\n var dayOfYear = parseDateUnit(captures[1]);\n var month = parseDateUnit(captures[2]) - 1;\n var day = parseDateUnit(captures[3]);\n var week = parseDateUnit(captures[4]);\n var dayOfWeek = parseDateUnit(captures[5]) - 1;\n if (isWeekDate) {\n if (!validateWeekDate(year, week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n } else {\n var date = new Date(0);\n if (!validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear)) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n return date;\n }\n}\nfunction parseDateUnit(value) {\n return value ? parseInt(value) : 1;\n}\nfunction parseTime(timeString) {\n var captures = timeString.match(timeRegex);\n if (!captures) return NaN; // Invalid ISO-formatted time\n\n var hours = parseTimeUnit(captures[1]);\n var minutes = parseTimeUnit(captures[2]);\n var seconds = parseTimeUnit(captures[3]);\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n return hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000;\n}\nfunction parseTimeUnit(value) {\n return value && parseFloat(value.replace(',', '.')) || 0;\n}\nfunction parseTimezone(timezoneString) {\n if (timezoneString === 'Z') return 0;\n var captures = timezoneString.match(timezoneRegex);\n if (!captures) return 0;\n var sign = captures[1] === '+' ? -1 : 1;\n var hours = parseInt(captures[2]);\n var minutes = captures[3] && parseInt(captures[3]) || 0;\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n var date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n var fourthOfJanuaryDay = date.getUTCDay() || 7;\n var diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nvar daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;\n}\nfunction validateDate(year, month, date) {\n return month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28));\n}\nfunction validateDayOfYearDate(year, dayOfYear) {\n return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\nfunction validateWeekDate(_year, week, day) {\n return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\nfunction validateTime(hours, minutes, seconds) {\n if (hours === 24) {\n return minutes === 0 && seconds === 0;\n }\n return seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25;\n}\nfunction validateTimezone(_hours, minutes) {\n return minutes >= 0 && minutes <= 59;\n}"],"names":["KeyStatVariant","KeyStat","_ref","datapoint","label","subdatapoint","sublabel","variant","Default","_jsxs","className","children","_jsx","classnames","Positive","Negative","KeyStatsVariant","KeyStats","Compact","Stretched","ESTIMATE_TYPE_LABELS","EarningsEstimateType","eps","epsGaap","sales","DailyChange","dateClassName","reportReaction","when","reaction","reactions","price","prevPrice","date","dateFns","diff","_Fragment","RedGreenText","value","rightContent","formatNumber","Math","abs","priceDiff","PerformanceTooltip","_ref2","data","estimateType","isActive","earningsDate","reportDate","fiscalEndDate","estimate","reported","epsEstimate","epsActual","epsReportedEstimate","epsReportedActual","salesEstimate","salesActual","marketHoursSuffix","fiscalPeriod","substring","shortFormatNumber","surprise","PriceReactionWhen","MINUS_DAYS_3","MINUS_DAYS_2","MINUS_DAYS_1","CLOSE","PLUS_DAYS_1","PLUS_DAYS_2","PLUS_DAYS_3","getSurpriseDotColor","color","ColorVariant","gray","green","red","getColor","RedGreenDot","props","cx","cy","onMouseEnter","onMouseLeave","size","Dot","r","fill","stroke","default","strokeWidth","CustomCursor","barWithGapWidth","points","x","Rectangle","width","CURSOR_STYLE","TRANSPARENT_CURSOR","CHART_GRID_COMMON_PROPS","EarningsChart","annualData","isCompact","reportReactions","setIsActive","React","activeIndex","setActiveIndex","reverseTooltipDirection","setReverseTooltipDirection","columnsCount","values","length","barWidth","BAR_WIDTH_NARROW","BAR_WIDTH","estimateColumnsCount","hasBarChart","hasLineChart","filter","_ref3","isEstimate","some","_ref4","id","isSelected","EarningValueProperty","Surprise","_ref5","chartData","forEach","_ref6","_ref7","year","find","Object","chartWidth","BAR_GAP","EXTRA_WIDTH","LABELS_WIDTH","estimateAreaWidth","barLessChartYMargin","chartGridCommonLeftProps","style","classNames","right","ComposedChart","height","CHART_HEIGHT","margin","CHART_MARGINS","left","stackOffset","onMouseMove","mouseEvent","activeTooltipIndex","clientX","window","innerWidth","YAxis","yAxisId","tick","TICK_STYLE","tickLine","axisLine","tickFormatter","tickMargin","interval","orientation","LABELS_MARGIN","Tooltip","wrapperStyle","TOOLTIP_WRAPPER_STYLE","position","y","allowEscapeViewBox","reverseDirection","offset","isAnimationActive","cursor","content","map","_ref8","Bar","name","dataKey","row","index","Cell","radius","EpsEstimate","EpsReportedEstimate","SalesEstimate","includes","Line","type","dot","strokeDasharray","activeDot","connectNulls","getColumns","yearKeys","commonClassName","columns","align","TableAlign","Right","renderColumn","_annualDividend$value","_annualDividend$perce","annualDividend","annualDividendValue","annualDividendValuePercent","percentageValue","defaultValue","fractions","subColumns","EarningsDataEnum","analysts","_annualDividend$value2","_annualDividendValue$","toFixed","yoyChange","_annualDividend$value3","yoyChangePct","_annualDividend$value4","_annualDividendValue$2","widgetToEstimateType","EarningsWidgetCategory","Eps","EpsGaap","Revenue","EarningsWidget","earningsWidgetCategory","priceReactionData","settings","setAnnualData","mapData","earningsTimeframe","flatMap","arr","indexOf","EARNINGS_WIDGET_LABELS","setIsCompact","getIsCompact","useTableColumns","_document$getElementB","document","getElementById","removeProperty","onResize","addEventListener","removeEventListener","minWidth","undefined","FinancialsWidget","revenue","subData","shownSubdata","header","WidgetHeader","tableHead","TableHead","TableHeader","Left","column","onVisibilityChange","item","Heading","level","top","bottom","fontSize","fontWeight","textAnchor","outline","zIndex","border","FinvizSettings","hasDarkTheme","colors","opacity","EarningsTimeframeEnum","dark","violet","orange","blue","getHours","isQuarterlyTimeframe","quarterly","dataValues","earningsData","earningsAnnualData","isSemiAnnualEarning","getIsSemiAnnualEarning","earningsArray","SalesActual","isGaap","EpsReportedActual","EpsActual","getEarningsDataTemplate","category","numOfEstimates","labelColumnClassName","periodDataRaw","periodData","yearPeriod","actualValue","estimateValue","SalesAnalysts","EpsReportedAnalysts","EpsAnalysts","getIsEarningEstimate","slice","earningsCategory","yoyData","getYoYData","yoyGrowthLabel","anualDividend","_yoyData$change$anual","change","_yoyData$changePct$an","changePct","HighlightedBoxColor","LIGHT_BG_COLORS","DARK_BG_COLORS","LIGHT_TEXT_COLORS","DARK_TEXT_COLORS","HighlightedBox","bgColorsList","textColorsList","backgroundColor","EarningsColor","EarningsEstimateTypeLabels","EARNINGS_DATE_FORMAT","PRICE_REVISIONS_CHART_WIDTH","PRICE_REVISIONS_CHART_HEIGHT","REVISIONS_LEFT_TICK_STYLE","REVISIONS_RIGHT_TICK_STYLE","PRICE_REVISIONS_YAXIS_WIDTH","PRICE_REVISIONS_TICK_COUNT","UPDOWN_REVISIONS_CHART_HEIGHT","UPDOWN_REVISIONS_TICK_COUNT","FISCAL_YEAR_MARK","SETTINGS_COOKIE_KEY","DEFAULT_SETTINGS","PriceReactionDataEnum","getColorForValue","DarkGreen","MediumGreen","LightGreen","Neutral","LightRed","MediumRed","DarkRed","RsiValue","Number","isFinite","getEarningsColor","downBar","downRevision","lowHigh","upBar","upRevision","earning","every","getChartLink","ticker","chartStartDate","chartEndDate","range","anchorDate","Date","timeframe","TIMEFRAME","i30","d","encodeQueryString","t","p","l","mapPriceReactionData","result","labelElement","Button","padding","theme","as","href","target","Icon","keys","formatQuarterName","spyPriceDiff","rsi","round","push","QUARTAL_DELIMITER","SEMI_ANNUAL_DELIMITER","earnings","_earnings$","getYearAndPeriodInt","periodString","_periodString$split","yearStr","periodStr","split","parseInt","period","isNaN","getFormattedPeriodValue","formatYearName","formatFiscalName","endsWith","adjustEstimate","parseISO","argument","options","_options$additionalDi","arguments","additionalDigits","RangeError","prototype","toString","call","NaN","dateStrings","dateString","timeString","array","patterns","dateTimeDelimiter","test","timeZoneDelimiter","substr","token","timezone","exec","time","replace","splitDateString","parseYearResult","regex","RegExp","captures","match","restDateString","century","parseYear","dateRegex","isWeekDate","dayOfYear","parseDateUnit","month","day","week","dayOfWeek","_year","validateWeekDate","isoWeekYear","setUTCFullYear","fourthOfJanuaryDay","getUTCDay","setUTCDate","getUTCDate","dayOfISOWeekYear","daysInMonths","isLeapYearIndex","validateDate","validateDayOfYearDate","max","parseDate","getTime","timestamp","timeRegex","hours","parseTimeUnit","minutes","seconds","validateTime","parseTime","dirtyDate","setFullYear","getUTCFullYear","getUTCMonth","setHours","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","timezoneString","timezoneRegex","sign","_hours","validateTimezone","parseTimezone","parseFloat"],"sourceRoot":""}