{"version":3,"file":"4015.4db38c2e.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/crypto/currencyUtils.ts","webpack://@finviz/website/./js/app/header/market-badge.tsx","webpack://@finviz/website/./js/app/header/time.tsx","webpack://@finviz/website/./js/app/header/utils.ts","webpack://@finviz/website/./js/app/shared/cookie.ts","webpack://@finviz/website/./js/app/shared/isMobile.ts","webpack://@finviz/website/./js/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-switch/button-switch.tsx","webpack://@finviz/website/./js/main/components/button.tsx","webpack://@finviz/website/./js/main/components/checkbox.tsx","webpack://@finviz/website/./js/main/components/color-picker/draggable.tsx","webpack://@finviz/website/./js/main/components/color-picker/pointer.tsx","webpack://@finviz/website/./js/main/components/color-picker/util.ts","webpack://@finviz/website/./js/main/components/color-picker/alpha.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-palette.tsx","webpack://@finviz/website/./js/main/components/color-picker/hue-saturation.tsx","webpack://@finviz/website/./js/main/components/color-picker/lightness.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-preview.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-input.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-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/copy-to-clipboard/copy-to-clipboard.tsx","webpack://@finviz/website/./js/main/components/dialog/hooks.ts","webpack://@finviz/website/./js/main/components/dropdown/dropdown.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-item.tsx","webpack://@finviz/website/./js/main/components/dropdown/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/context-menu/context-menu.tsx","webpack://@finviz/website/./js/main/components/grid/grid.tsx","webpack://@finviz/website/./js/main/components/inner-state/inner-state.tsx","webpack://@finviz/website/./js/main/components/range.tsx","webpack://@finviz/website/./js/main/components/toolbar/interfaces.ts","webpack://@finviz/website/./js/main/components/toolbar/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/toolbar.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-button.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-group.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-item.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-divider.tsx","webpack://@finviz/website/./js/main/components/tour/step-content.tsx","webpack://@finviz/website/./js/main/components/tour/utils.ts","webpack://@finviz/website/./js/main/components/tour/hooks.tsx","webpack://@finviz/website/./js/main/components/tabs/tab.tsx","webpack://@finviz/website/./js/main/components/tabs/tab-list.tsx","webpack://@finviz/website/./js/main/components/tabs/tab-panel.tsx","webpack://@finviz/website/./js/main/components/tabs/tabs.tsx","webpack://@finviz/website/./js/main/components/badge.tsx","webpack://@finviz/website/./js/main/components/tag.tsx","webpack://@finviz/website/./js/main/components/input.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./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/social-share/DownloadImageButton.tsx","webpack://@finviz/website/./js/main/components/social-share/SocialShare.tsx","webpack://@finviz/website/./js/main/components/spinner.tsx","webpack://@finviz/website/./js/main/components/tooltip-input.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/tooltip/tooltip-arrow.tsx","webpack://@finviz/website/./js/main/components/tooltip/types.ts","webpack://@finviz/website/./js/main/components/typography.tsx","webpack://@finviz/website/./js/main/context.ts","webpack://@finviz/website/./js/main/hooks/use-resize-observer.ts","webpack://@finviz/website/./js/main/hooks/usePopoverPlacement.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.tsx","webpack://@finviz/website/../charts/app/utils/ticker-sanitizer.ts"],"sourcesContent":["import { ObjectHash } from '../queryString'\r\n\r\nexport const DEFAULT_ACTIVE_CURRENCY = 'USD'\r\nexport const TILE_WIDTH = 240\r\n\r\nexport const CURRENCIES_LAYOUT: Record = {\r\n USD: [\r\n ['BTCUSD', 'ETHUSD', 'SOLUSD', 'BNBUSD', 'XRPUSD'],\r\n ['DOGEUSD', 'ADAUSD', 'TRXUSD', 'AVAXUSD', 'XLMUSD'],\r\n ['DOTUSD', 'LINKUSD', 'BCHUSD', 'SUIUSD', 'NEARUSD'],\r\n ['LTCUSD', 'APTUSD', 'EGLDUSD', 'OPUSD', 'AAVEUSD'],\r\n ],\r\n USDT: [\r\n ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT', 'XRPUSDT'],\r\n ['DOGEUSDT', 'ADAUSDT', 'TRXUSDT', 'AVAXUSDT', 'XLMUSDT'],\r\n ['DOTUSDT', 'LINKUSDT', 'BCHUSDT', 'SUIUSDT', 'NEARUSDT'],\r\n ['LTCUSDT', 'APTUSDT', 'EGLDUSDT', 'OPUSDT', 'SUSDT'],\r\n ],\r\n EUR: [\r\n ['BTCEUR', 'ETHEUR', 'SOLEUR', 'BNBEUR', 'XRPEUR'],\r\n ['DOGEEUR', 'ADAEUR', 'TRXEUR', 'AVAXEUR', 'XLMEUR'],\r\n ['DOTEUR', 'LINKEUR', 'BCHEUR', 'SUIEUR', 'NEAREUR'],\r\n ['LTCEUR', 'APTEUR', 'EGLDEUR', 'OPEUR', 'SEUR'],\r\n ],\r\n BTC: [\r\n ['BTCUSD', 'ETHBTC', 'SOLBTC', 'BNBBTC', 'XRPBTC'],\r\n ['DOGEBTC', 'ADABTC', 'TRXBTC', 'AVAXBTC', 'XLMBTC'],\r\n ['DOTBTC', 'LINKBTC', 'BCHBTC', 'SUIBTC', 'NEARBTC'],\r\n ['LTCBTC', 'APTBTC', 'EGLDBTC', 'OPBTC', 'SBTC'],\r\n ],\r\n}\r\n\r\n// NOTE: all tickers that are not visible at main 'crypto.ashx' but\r\n// we wanna keep them displayed as sparkline in the detail of ticker\r\nexport const TICKERS_NOT_IN_DASHBOARD: Record = {\r\n USDT: ['AAVEUSDT', 'TRUMPUSDT'],\r\n BTC: ['AAVEBTC'],\r\n}\r\n\r\nexport const CURRENCIES_LIST = Object.keys(CURRENCIES_LAYOUT)\r\n\r\nexport const CRYPTO_TICKERS = [\r\n ...Object.values(CURRENCIES_LAYOUT).flat(2),\r\n ...Object.values(TICKERS_NOT_IN_DASHBOARD).flat(1),\r\n]\r\n\r\nexport function getCurrency(ticker: string): string {\r\n if (ticker.endsWith('USD')) {\r\n return 'USD'\r\n } else if (ticker.endsWith('USDT')) {\r\n return 'USDT'\r\n } else if (ticker.endsWith('EUR')) {\r\n return 'EUR'\r\n } else if (ticker.endsWith('BTC')) {\r\n return 'BTC'\r\n }\r\n return DEFAULT_ACTIVE_CURRENCY\r\n}\r\n\r\nexport function getActiveCurrency(queryString: ObjectHash) {\r\n const activeCurrency = (queryString['c'] || DEFAULT_ACTIVE_CURRENCY).toUpperCase()\r\n return CURRENCIES_LIST.includes(activeCurrency) ? activeCurrency : DEFAULT_ACTIVE_CURRENCY\r\n}\r\n\r\nexport function getActiveCurrencySparklineTickers(activeCurrency: string) {\r\n return [...CURRENCIES_LAYOUT[activeCurrency].flat(1), ...(TICKERS_NOT_IN_DASHBOARD[activeCurrency] ?? [])]\r\n}\r\n\r\nexport function getCurrencyLongName(currency: string): string {\r\n switch (currency.toLowerCase()) {\r\n case 'btc':\r\n return 'Bitcoin'\r\n case 'eth':\r\n return 'Ethereum'\r\n case 'bnb':\r\n return 'Binance Coin'\r\n case 'sol':\r\n return 'Solana'\r\n case 'xrp':\r\n return 'Ripple'\r\n case 'doge':\r\n return 'Dogecoin'\r\n case 'ada':\r\n return 'Cardano'\r\n case 'trx':\r\n return 'TRON'\r\n case 'avax':\r\n return 'Avalanche'\r\n case 'dot':\r\n return 'Polkadot'\r\n case 'bch':\r\n return 'Bitcoin Cash'\r\n case 'near':\r\n return 'NEAR Protocol'\r\n case 'ltc':\r\n return 'Litecoin'\r\n case 'icp':\r\n return 'Internet Computer'\r\n case 'apt':\r\n return 'Aptos'\r\n case 'xlm':\r\n return 'Stellar'\r\n case 'link':\r\n return 'Chainlink'\r\n case 'shib':\r\n return 'Shiba Inu'\r\n case 'etc':\r\n return 'Ethereum Classic'\r\n case 'uni':\r\n return 'Uniswap'\r\n case 'fet':\r\n return 'Fetch.ai'\r\n case 'egld':\r\n return 'MultiversX'\r\n case 's':\r\n return 'Sonic'\r\n case 'op':\r\n return 'Optimism'\r\n case 'sui':\r\n return 'Sui'\r\n case 'aave':\r\n return 'Aave'\r\n case 'trump':\r\n return 'Trump'\r\n case 'usd':\r\n return 'US Dollar'\r\n case 'eur':\r\n return 'Euro'\r\n case 'usdt':\r\n return 'Tether'\r\n default:\r\n return currency\r\n }\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { isAftermarket, isHoliday, isPremarket } from './utils'\r\n\r\nexport enum MarketBadgeType {\r\n None,\r\n Open,\r\n Closed,\r\n Premarket,\r\n Aftermarket,\r\n}\r\n\r\nexport function getMarketBadgeText(type: MarketBadgeType, _date?: Date) {\r\n switch (type) {\r\n case MarketBadgeType.Open:\r\n return {\r\n label: 'Markets Open',\r\n }\r\n case MarketBadgeType.Closed:\r\n // const holiday = getHoliday(date)\r\n\r\n return {\r\n label: 'Markets Closed',\r\n // description: holiday && (\r\n // <>\r\n // The markets observe U.S. holidays and are closed on\r\n //
\r\n // {holiday.label}\r\n // \r\n // ),\r\n }\r\n case MarketBadgeType.Premarket:\r\n return {\r\n label: 'Premarket',\r\n // description: (\r\n // <>\r\n // An additional time window when trading is possible.\r\n //
\r\n // We report it as the time between 7:00 AM and 9:30 AM\r\n // \r\n // ),\r\n }\r\n case MarketBadgeType.Aftermarket:\r\n return {\r\n label: 'Aftermarket',\r\n // description: (\r\n // <>\r\n // An additional time window when trading is still possible.\r\n //
\r\n // We report it as the time between 4:00 PM and 6:30 PM\r\n // \r\n // ),\r\n }\r\n }\r\n}\r\n\r\nexport function getMarketBadgeType(time: Date, hasUserPremium?: boolean) {\r\n if (isHoliday(time)) return MarketBadgeType.Closed\r\n if (isPremarket(time, hasUserPremium)) return MarketBadgeType.Premarket\r\n if (isAftermarket(time, hasUserPremium)) return MarketBadgeType.Aftermarket\r\n // if (isMarketOpen(time, hasUserPremium)) return MarketBadgeType.Open\r\n\r\n return MarketBadgeType.None\r\n}\r\n\r\nexport interface MarketBadgeProps {\r\n badge: MarketBadgeType\r\n className?: string\r\n}\r\n\r\nexport function MarketBadge({ badge, className }: MarketBadgeProps) {\r\n if (badge === MarketBadgeType.None) return null\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nimport { Tooltip, TooltipTrigger, useTooltipState } from '../../main/components/tooltip'\r\nimport { Heading } from '../../main/components/typography'\r\nimport { useResizeObserver } from '../../main/hooks/use-resize-observer'\r\nimport { MarketBadge, MarketBadgeProps, getMarketBadgeText, getMarketBadgeType } from './market-badge'\r\nimport { TimeFormatType, getDate, getFormattedDateString } from './utils'\r\n\r\nconst UPDATE_INTERVAL = 10000\r\n\r\nenum TimeBreakpointMode {\r\n container,\r\n window,\r\n}\r\n\r\nexport interface TimeBreakpoint {\r\n minWidth: number\r\n marketBadgeText: boolean\r\n timeFormat: TimeFormatType\r\n}\r\n\r\nconst BREAKPOINTS: TimeBreakpoint[] = [\r\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\r\n { minWidth: 140, marketBadgeText: false, timeFormat: 'short' },\r\n { minWidth: 180, marketBadgeText: false, timeFormat: 'long' },\r\n { minWidth: 255, marketBadgeText: true, timeFormat: 'long' },\r\n]\r\n\r\nfunction getTimeState(fixedTime?: string | Date, hasUserPremium: boolean = FinvizSettings.hasUserPremium) {\r\n const time = getDate(fixedTime)\r\n const badge = getMarketBadgeType(time, hasUserPremium)\r\n\r\n return { time, badge }\r\n}\r\n\r\nfunction TooltipBadge(props: MarketBadgeProps & { time: Date }) {\r\n const state = useTooltipState({ placement: 'bottom' })\r\n const badge = getMarketBadgeText(props.badge, props.time)\r\n\r\n if (!badge) return null\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n {badge.label}\r\n \r\n {/* {badge.description && {badge.description}} */}\r\n \r\n \r\n )\r\n}\r\n\r\nfunction StaticBadge(props: MarketBadgeProps & { time: Date }) {\r\n const badge = getMarketBadgeText(props.badge, props.time)\r\n\r\n if (!badge) return null\r\n\r\n return (\r\n <>\r\n \r\n {`${badge.label} · `}\r\n \r\n )\r\n}\r\n\r\n/**\r\n * Find matching breakpoint or return the last (largest) one\r\n */\r\nfunction findMatchingBreakpoint(compareWidth: number | undefined, breakpoints: TimeBreakpoint[]) {\r\n if (typeof compareWidth !== 'number') return breakpoints[breakpoints.length - 1]\r\n\r\n const matchingBreakpoints = breakpoints.filter((breakpoint) => compareWidth >= breakpoint.minWidth)\r\n\r\n return matchingBreakpoints.pop() ?? breakpoints[breakpoints.length - 1]\r\n}\r\n\r\nfunction getCurrentWidth(mode: TimeBreakpointMode, element: HTMLElement | null) {\r\n return mode === TimeBreakpointMode.window ? window.innerWidth : (element?.clientWidth ?? 0)\r\n}\r\n\r\ninterface TimeProps extends React.HTMLProps {\r\n /**\r\n * Set custom time to display\r\n */\r\n fixedTime?: string | Date\r\n\r\n /**\r\n * What to measure the breakpoints to\r\n * - `container` parent element\r\n * - `window` window\r\n *\r\n * @default \"container\"\r\n */\r\n breakpointMode?: keyof typeof TimeBreakpointMode\r\n\r\n /**\r\n * Defines what information is visible at which breakpoint. Local mode measures\r\n * the component wrapper div and global mode measures window width. The definitions\r\n * must be ascending in width\r\n */\r\n breakpoints?: TimeBreakpoint[]\r\n}\r\n\r\nexport function Time({\r\n className,\r\n fixedTime,\r\n breakpointMode = 'container',\r\n breakpoints = BREAKPOINTS,\r\n ...props\r\n}: TimeProps) {\r\n const ResizeObserver = useResizeObserver()\r\n const rootRef = React.useRef(null)\r\n const [state, setState] = React.useState(getTimeState(fixedTime))\r\n const [currentBreakpoint, setBreakpoint] = React.useState(null)\r\n\r\n React.useEffect(() => {\r\n const interval = setInterval(() => setState(getTimeState(fixedTime)), UPDATE_INTERVAL)\r\n return () => clearInterval(interval)\r\n }, [fixedTime])\r\n\r\n React.useEffect(() => {\r\n if (!ResizeObserver || !rootRef.current) return\r\n\r\n if (!currentBreakpoint) {\r\n const currentWidth = getCurrentWidth(TimeBreakpointMode[breakpointMode], rootRef.current)\r\n setBreakpoint(findMatchingBreakpoint(currentWidth, breakpoints))\r\n }\r\n\r\n const handleResize = throttle(() => {\r\n const currentWidth = getCurrentWidth(TimeBreakpointMode[breakpointMode], rootRef.current)\r\n const foundBreakpoint = findMatchingBreakpoint(currentWidth, breakpoints)\r\n\r\n if (foundBreakpoint !== currentBreakpoint) setBreakpoint(foundBreakpoint)\r\n }, 150)\r\n\r\n const observer = new ResizeObserver((entries) => {\r\n window.requestAnimationFrame(() => {\r\n if (Array.isArray(entries) && entries.length > 0) handleResize()\r\n })\r\n })\r\n\r\n observer.observe(rootRef.current)\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n observer.disconnect()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [ResizeObserver, currentBreakpoint, breakpoints, breakpointMode])\r\n\r\n return (\r\n
\r\n {currentBreakpoint && (\r\n
\r\n {currentBreakpoint.marketBadgeText ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {getFormattedDateString(state.time, currentBreakpoint.timeFormat)}\r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\n/**\r\n * Check if a given date is DST in the US\r\n * - begins on the second Sunday in March\r\n * - ends on the first Sunday in November\r\n *\r\n * Keep in sync with https://github.com/finvizhq/charts/blob/master/app/utils.ts\r\n */\r\nexport function getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nexport function getDate(seed?: string | number | Date | null) {\r\n var date = seed != null ? new Date(seed) : new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n\r\n if (isDst) {\r\n dateAsNY.setUTCHours(dateAsNY.getUTCHours() + 1)\r\n }\r\n\r\n return dateAsNY\r\n}\r\n\r\nfunction getWeekDay(date: Date) {\r\n return date.toLocaleDateString('en-US', { weekday: 'short' })\r\n}\r\n\r\nfunction getMonth(date: Date, uppercase = true) {\r\n const name = date.toLocaleDateString('en-US', { month: 'short' })\r\n return uppercase ? name.toUpperCase() : name\r\n}\r\n\r\nfunction getDay(date: Date) {\r\n return date.getDate().toString().padStart(2, '0')\r\n}\r\n\r\nfunction getTime(date: Date) {\r\n return date.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true })\r\n}\r\n\r\nenum TimeFormat {\r\n long,\r\n short,\r\n dateOnly,\r\n timeOnly,\r\n}\r\n\r\nexport type TimeFormatType = keyof typeof TimeFormat\r\n\r\nexport function getFormattedDateString(date: Date = getDate(), format: TimeFormatType = 'long') {\r\n switch (TimeFormat[format]) {\r\n case TimeFormat.long:\r\n return `${getWeekDay(date)} ${getMonth(date)} ${getDay(date)} ${date.getFullYear()} ${getTime(date)} ET`\r\n case TimeFormat.short:\r\n return `${getWeekDay(date)} ${getMonth(date)} ${getDay(date)} ${getTime(date)}`\r\n case TimeFormat.dateOnly:\r\n return `${getMonth(date, false)} ${getDay(date)}`\r\n case TimeFormat.timeOnly:\r\n return getTime(date)\r\n }\r\n}\r\n\r\nexport function formatDate(value: Date | unknown, inputOrOutputFormat: string, outputFormat?: string): string {\r\n return dateFns.format(\r\n dateFns.isDate(value) ? (value as Date) : dateFns.parse(`${value}`, inputOrOutputFormat, new Date()),\r\n outputFormat ?? inputOrOutputFormat\r\n )\r\n}\r\n\r\nexport function isPremarket(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n const dayOfWeek = date.getDay()\r\n const min = date.getMinutes()\r\n const hours = date.getHours()\r\n\r\n if (isPremium && dayOfWeek !== 0 && dayOfWeek !== 6 && (hours === 7 || hours === 8 || (hours === 9 && min < 30))) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nexport function isAftermarket(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n const dayOfWeek = date.getDay()\r\n const min = date.getMinutes()\r\n\r\n if (\r\n isPremium &&\r\n dayOfWeek !== 0 &&\r\n dayOfWeek !== 6 &&\r\n (date.getHours() === 16 || date.getHours() === 17 || (date.getHours() === 18 && min < 30))\r\n ) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * https://www.nyse.com/markets/hours-calendars\r\n */\r\nconst HOLIDAY_DATES = [\r\n {\r\n label: \"New Year's Day\",\r\n test: (day: number, month: number) => month === 1 && day === 1,\r\n },\r\n {\r\n label: 'National Day of Mourning',\r\n test: (day: number, month: number) => month === 1 && day === 9,\r\n },\r\n {\r\n label: 'Martin Luther King, Jr. Day',\r\n test: (day: number, month: number) => month === 1 && day === 20,\r\n },\r\n {\r\n label: 'Presidents Day',\r\n test: (day: number, month: number) => month === 2 && day === 17,\r\n },\r\n {\r\n label: 'Good Friday',\r\n test: (day: number, month: number) => month === 4 && day === 18,\r\n },\r\n {\r\n label: 'Memorial Day',\r\n test: (day: number, month: number) => month === 5 && day === 26,\r\n },\r\n {\r\n label: 'Juneteenth Holiday',\r\n test: (day: number, month: number) => month === 6 && day === 19,\r\n },\r\n {\r\n label: 'Day before Independence Day (closed from 1 PM)',\r\n test: (day: number, month: number, hours: number) => month === 7 && day === 3 && hours >= 13,\r\n },\r\n {\r\n label: 'Independence Day',\r\n test: (day: number, month: number) => month === 7 && day === 4,\r\n },\r\n {\r\n label: 'Labor Day',\r\n test: (day: number, month: number) => month === 9 && day === 1,\r\n },\r\n {\r\n label: 'Thanksgiving Day',\r\n test: (day: number, month: number) => month === 11 && day === 27,\r\n },\r\n {\r\n label: 'Day after Thanksgiving (closed from 1 PM)',\r\n test: (day: number, month: number, hours: number) => month === 11 && day === 28 && hours >= 13,\r\n },\r\n {\r\n label: 'Day before Christmas (closed from 1 PM)',\r\n test: (day: number, month: number, hours: number) => month === 12 && day === 24 && hours >= 13,\r\n },\r\n {\r\n label: 'Christmas Day',\r\n test: (day: number, month: number) => month === 12 && day === 25,\r\n },\r\n]\r\n\r\nexport function getHoliday(date: Date = getDate()) {\r\n var day = date.getDate()\r\n var month = date.getMonth() + 1\r\n var hours = date.getHours()\r\n\r\n return HOLIDAY_DATES.find((holiday) => holiday.test(day, month, hours))\r\n}\r\n\r\nexport function isHoliday(date: Date = getDate()) {\r\n return !!getHoliday(date)\r\n}\r\n\r\nexport function isMarketOpen(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n if (isPremarket(date, isPremium) || isAftermarket(date, isPremium) || isHoliday(date)) {\r\n return false\r\n }\r\n\r\n const dayOfWeek = date.getDay()\r\n const hour = date.getHours()\r\n const minute = date.getMinutes()\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n // Day starts at 9:30\r\n const dayStarted = hour === 9 ? minute >= 30 : hour >= 10\r\n // Ends at 16:00\r\n const dayEnded = hour >= 16\r\n\r\n return !isWeekend && dayStarted && !dayEnded\r\n}\r\n","export function getParsedCookies(cookieName: string) {\r\n const parseCookies = document.cookie\r\n .split(';')\r\n .map((cookieString) => cookieString.split('='))\r\n .reduce(\r\n (acc, v) => {\r\n acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())\r\n return acc\r\n },\r\n {} as Record\r\n )\r\n\r\n return cookieName ? parseCookies[cookieName] : parseCookies\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n var re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n}\r\n\r\nexport function setCookie(name: string, value: string, expires: Date) {\r\n var cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (/\\bfinviz\\b/.test(document.location.hostname)) {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n}\r\n","// OS Matches\r\nconst matchesAndroid = navigator.userAgent.match(/Android/i)\r\nconst matchesWebOS = navigator.userAgent.match(/webOS/i)\r\nconst matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\nconst matchesiPad = navigator.userAgent.match(/iPad/i)\r\nconst matchesIPod = navigator.userAgent.match(/iPod/i)\r\nconst matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\r\nconst matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\r\nconst matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n// Browser Matches\r\nconst matchesFirefox = !!navigator.userAgent.match(/firefox/i)\r\nconst matchesSafariDesktopLike =\r\n /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && navigator.maxTouchPoints === 0\r\n\r\nconst isMobileDevice =\r\n matchesAndroid ||\r\n matchesWebOS ||\r\n matchesIPhone ||\r\n matchesiPad ||\r\n matchesIPod ||\r\n matchesBlackBerry ||\r\n matchesWindowsPhone ||\r\n matchesIOSLike\r\n\r\nexport function isMobile() {\r\n return !!isMobileDevice\r\n}\r\n\r\nexport function isIphone() {\r\n return !!(matchesIPhone && !matchesiPad)\r\n}\r\n\r\nexport function isIpad() {\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesiPad\r\n}\r\n\r\nexport function isSafariDesktop() {\r\n return matchesSafariDesktopLike\r\n}\r\n\r\nexport function isIos() {\r\n return !!matchesIOSLike && !isSafariDesktop()\r\n}\r\n\r\nexport function isFirefox() {\r\n return matchesFirefox\r\n}\r\n\r\nexport function isFirefoxDesktop() {\r\n return isFirefox() && !isMobile()\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { SearchApiResult } from '../../services/api'\r\nimport { ComboBoxItem, ComboBoxItemProps } from '../combo-box'\r\nimport { Highlight } from '../highlight'\r\nimport { PropsWithAs } from '../types'\r\n\r\ninterface SearchItemProps extends Pick, Partial> {\r\n item: SearchApiResult\r\n dataTestId?: string\r\n}\r\n\r\nexport function TickerSearchItem({ item, dataTestId, ...props }: SearchItemProps) {\r\n const value = props.state!.useState('value')\r\n const isTickerWide = item.ticker.length > 7\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {item.exchange}\r\n \r\n )\r\n}\r\n","import { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { link } from '../../services/routing'\r\nimport { Instrument } from '../../types'\r\nimport { cleanTicker, getInstrumentForTicker } from '../../util'\r\n\r\nexport function getRedirectForTicker(tickerRaw: string) {\r\n const ticker = getSanitizedTicker(tickerRaw, true)\r\n const instrument = cleanTicker(ticker) ? getInstrumentForTicker(ticker) : null\r\n let redirectLink = ''\r\n\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n redirectLink = link.toQuote(ticker)\r\n break\r\n case Instrument.Forex:\r\n redirectLink = link.toForexChartDetail(ticker)\r\n break\r\n case Instrument.Futures:\r\n redirectLink = link.toFuturesChartDetail(ticker)\r\n break\r\n case Instrument.Crypto:\r\n redirectLink = link.toCryptoChartDetail(ticker)\r\n break\r\n default:\r\n return link.toSearch(ticker)\r\n }\r\n\r\n return redirectLink + (FinvizSettings.quoteSearchExt ?? '')\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport { useQuery } from '@tanstack/react-query'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { searchApiRequest } from '../../services/api'\r\nimport { link } from '../../services/routing'\r\nimport { Button } from '../button'\r\nimport { IconNameType } from '../icon'\r\nimport { InputSize, InputTheme } from '../input'\r\nimport { Search, SearchProps, useSearchComboboxState } from '../search'\r\nimport { TickerSearchItem } from './TickerSearchItem'\r\nimport { getRedirectForTicker } from './util'\r\n\r\ninterface Props extends Omit {\r\n /**\r\n * Whether the input should automatically receive focus when mounted\r\n */\r\n autoFocus?: boolean\r\n\r\n /**\r\n * Initial value for the input field\r\n */\r\n defaultValue?: string\r\n\r\n /**\r\n * Default placement position of the combobox popover\r\n * Inherits placement options from Ariakit ComboboxStore\r\n */\r\n defaultPlacement?: Ariakit.ComboboxStoreProps['placement']\r\n\r\n /**\r\n * Placeholder text shown when the input is empty\r\n */\r\n placeholder?: string\r\n\r\n /**\r\n * Visual theme variant for the input\r\n * References predefined styles from InputTheme\r\n */\r\n theme?: keyof typeof InputTheme\r\n\r\n /**\r\n * Size variant for the input\r\n * References predefined sizes from InputSize\r\n */\r\n size?: keyof typeof InputSize\r\n\r\n /**\r\n * Additional CSS class name for the input element\r\n */\r\n inputClass?: string\r\n\r\n /**\r\n * ChartIndex used for data-testid\r\n */\r\n chartIndex?: number\r\n\r\n /**\r\n * Whether to show the \"Show All\" option\r\n *\r\n * @default true\r\n */\r\n isShowAllVisible?: boolean\r\n\r\n /**\r\n * Whether search items should be rendered as links\r\n *\r\n * @default true\r\n */\r\n isSearchItemLink?: boolean\r\n\r\n /**\r\n * Content to show on the right side of the input (icon or custom element)\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Callback function triggered when a ticker is selected\r\n *\r\n * @param ticker - The selected ticker string\r\n */\r\n onTickerSelected?: (ticker: string) => void\r\n}\r\n\r\nexport function TickerSearch({ isShowAllVisible = true, isSearchItemLink = true, chartIndex, ...props }: Props) {\r\n const searchComboboxState = useSearchComboboxState({\r\n defaultValue: props.defaultValue,\r\n placement: props.defaultPlacement ?? 'bottom-start',\r\n setSelectedValue: (value) => {\r\n if (isSearchItemLink) {\r\n window.location.href = getRedirectForTicker(value as string)\r\n } else {\r\n props.onTickerSelected?.(getSanitizedTicker(value as string))\r\n // We have to reset the value (clear the input) in next tick otherwise it doesn't work\r\n setTimeout(() => searchComboboxState.setValue(''))\r\n }\r\n },\r\n })\r\n\r\n const value = searchComboboxState.useState('value')\r\n const activeValue = searchComboboxState.useState('activeValue')\r\n const { data, error, isLoading, refetch } = useQuery(['search', value], () => searchApiRequest(value), {\r\n enabled: value.length > 0,\r\n keepPreviousData: true,\r\n cacheTime: Infinity,\r\n staleTime: Infinity,\r\n })\r\n\r\n return (\r\n \r\n Show All Results\r\n \r\n ) : undefined\r\n }\r\n isLoading={isLoading}\r\n isError={!!error}\r\n onErrorRetry={refetch}\r\n {...props}\r\n >\r\n
\r\n {data?.map((item) => (\r\n \r\n ))}\r\n
\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport enum BoxRounding {\r\n none = '',\r\n regular = 'rounded-md', // 6px\r\n}\r\n\r\nexport enum BoxTheme {\r\n none = '',\r\n light = 'bg-white dark:bg-gray-800 border border-gray-100 dark:border-gray-600',\r\n dark = 'bg-gray-800 border border-gray-600',\r\n}\r\n\r\nexport interface BoxProps extends Omit, 'ref'> {\r\n 'data-testid'?: string\r\n rounding?: keyof typeof BoxRounding\r\n theme?: keyof typeof BoxTheme\r\n}\r\n\r\nexport const Box = React.forwardRef(function Box(\r\n { rounding = 'regular', theme = 'light', ...props }: BoxProps,\r\n ref: React.ForwardedRef\r\n) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n})\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonRoundingType, ButtonSizeType, ButtonThemeType } from '../button'\r\nimport { ButtonGroup, ButtonGroupProps } from '../button-group'\r\nimport { SelectItem } from '../select/types'\r\n\r\nexport type ButtonSwitchItem = Pick, 'value' | 'label' | 'disabled'>\r\n\r\nexport interface ButtonSwitchProps> extends ButtonGroupProps {\r\n /**\r\n * Label to display above the select\r\n */\r\n label?: string\r\n\r\n /**\r\n * Class names for label\r\n */\r\n labelClassNames?: string\r\n\r\n /**\r\n * Array of items to display as button options\r\n */\r\n items: ItemType[]\r\n\r\n /**\r\n * Currently selected value\r\n */\r\n value?: ValueType\r\n\r\n /**\r\n * Default value when uncontrolled\r\n */\r\n defaultValue?: ValueType\r\n\r\n /**\r\n * Callback when item changes. Called for both controlled and uncontrolled selects\r\n */\r\n onChange?: (value: ItemType) => void\r\n\r\n /**\r\n * Optional className for the ButtonGroup wrapper\r\n */\r\n className?: string\r\n\r\n /**\r\n * Set the button theme when it is selected\r\n */\r\n activeTheme?: ButtonThemeType\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 * Data test id\r\n *\r\n * @default \"\"\r\n */\r\n 'data-testid'?: string\r\n\r\n groupRounding?: ButtonRoundingType\r\n}\r\n\r\nexport function ButtonSwitch>(\r\n props: Omit, 'children'>\r\n) {\r\n const {\r\n items,\r\n value: controlledValue,\r\n label,\r\n defaultValue,\r\n onChange,\r\n className = 'flex p-0.5',\r\n size,\r\n labelClassNames,\r\n rounding = 'regular',\r\n groupRounding = 'regular',\r\n activeTheme = 'blue',\r\n ...restProps\r\n } = props\r\n const [internalValue, setInternalValue] = React.useState(defaultValue)\r\n const value = controlledValue !== undefined ? controlledValue : internalValue\r\n\r\n const handleChange = React.useCallback(\r\n (newValue: ItemType) => {\r\n setInternalValue(newValue.value)\r\n onChange?.(newValue)\r\n },\r\n [onChange]\r\n )\r\n\r\n return (\r\n
\r\n \r\n {items.map((option, index) => (\r\n handleChange(option)}\r\n >\r\n {option.label}\r\n \r\n ))}\r\n \r\n {label && {label}}\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 large = 'rounded-lg', // 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-200 hover:border-gray-300 dark:hover:border-gray-400 dark:border-primary': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.chip:\r\n return {\r\n button: classnames('border text-default 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-gray-200 dark: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 classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef } from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\nexport enum ColorVariant {\r\n violet = 'violet',\r\n emerald = 'emerald',\r\n orange = 'orange',\r\n teal = 'teal',\r\n pink = 'pink',\r\n lime = 'lime',\r\n purple = 'purple',\r\n green = 'green',\r\n yellow = 'yellow',\r\n blue = 'blue',\r\n red = 'red',\r\n gray = 'gray',\r\n default = 'default',\r\n darkGray = 'darkGray',\r\n}\r\n\r\nexport enum CheckboxSize {\r\n none = '', // Do not set fixed size\r\n small = 'min-h-6 text-2xs', // 24px\r\n regular = 'min-h-7 text-sm', // 28px\r\n}\r\nexport type CheckboxSizeType = keyof typeof CheckboxSize\r\n\r\ninterface CheckboxProps extends Omit, 'label' | 'size'> {\r\n /**\r\n * Text that gets displayed on the right side of the checkbox\r\n */\r\n label?: ReactNode\r\n\r\n checked: boolean\r\n\r\n /**\r\n * Size of the checkbox\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: CheckboxSizeType\r\n\r\n /**\r\n * Color of the checkbox\r\n *\r\n * @default \"default\"\r\n */\r\n color?: ColorVariant\r\n}\r\n\r\nfunction CheckboxComponent(\r\n {\r\n className,\r\n label,\r\n size = 'regular',\r\n color = ColorVariant.default,\r\n children,\r\n ...props\r\n }: PropsWithChildren,\r\n ref: ForwardedRef\r\n) {\r\n const checked = props.checked ?? props.defaultChecked\r\n\r\n return (\r\n \r\n
\r\n \r\n {checked && (\r\n \r\n )}\r\n
\r\n {label ?? children}\r\n \r\n )\r\n}\r\n\r\nexport const Checkbox = forwardRef(CheckboxComponent)\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren, memo, useCallback, useLayoutEffect, useRef, useState } from 'react'\r\n\r\nexport interface Interaction {\r\n left: number\r\n top: number\r\n}\r\n\r\n/**\r\n * Clamp value between two bounds\r\n */\r\nfunction clamp(num: number, min = 0, max = 1) {\r\n return num > max ? max : num < min ? min : num\r\n}\r\n\r\n/**\r\n * Check if an event was triggered by touch\r\n */\r\nfunction isTouch(event: MouseEvent | TouchEvent): event is TouchEvent {\r\n return 'touches' in event\r\n}\r\n\r\n/**\r\n * Returns a relative position of the pointer inside the node's bounding box\r\n */\r\nfunction getRelativePosition(node: HTMLDivElement, event: MouseEvent | TouchEvent): Interaction {\r\n const rect = node.getBoundingClientRect()\r\n\r\n // Get user's pointer position from `touches` array if it's a `TouchEvent`\r\n const pointer = isTouch(event) ? event.touches[0] : (event as MouseEvent)\r\n\r\n return {\r\n left: clamp((pointer.pageX - (rect.left + window.pageXOffset)) / rect.width),\r\n top: clamp((pointer.pageY - (rect.top + window.pageYOffset)) / rect.height),\r\n }\r\n}\r\n\r\n/**\r\n * Browsers introduced an intervention, making touch events passive by default.\r\n * This workaround removes `preventDefault` call from the touch handlers.\r\n * @see https://github.com/facebook/react/issues/19651\r\n */\r\nfunction preventDefaultMove(event: MouseEvent | TouchEvent) {\r\n !isTouch(event) && event.preventDefault()\r\n}\r\n\r\ninterface Props {\r\n onMove: (interaction: Interaction) => void\r\n onKey: (offset: Interaction) => void\r\n}\r\n\r\nfunction DraggablePickerComponent({\r\n onMove,\r\n onKey,\r\n className,\r\n ...props\r\n}: PropsWithChildren & HTMLProps) {\r\n const container = useRef(null)\r\n const hasTouched = useRef(false)\r\n const [isDragging, setDragging] = useState(false)\r\n\r\n /**\r\n * Prevent mobile browsers from handling mouse events (conflicting with touch ones).\r\n * If we detected a touch interaction before, we prefer reacting to touch events only.\r\n */\r\n const isValid = useRef((event: MouseEvent | TouchEvent): boolean => {\r\n if (hasTouched.current && !isTouch(event)) return false\r\n if (!hasTouched.current) hasTouched.current = isTouch(event)\r\n return true\r\n })\r\n\r\n const handleMove = useCallback(\r\n (event: MouseEvent | TouchEvent) => {\r\n preventDefaultMove(event)\r\n\r\n // If user moves the pointer outside of the window or iframe bounds and release it there,\r\n // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor\r\n // after the user has moved the mouse/finger back to the document, we check `event.buttons`\r\n // and `event.touches`. It allows us to detect that the user is just moving his pointer\r\n // without pressing it down\r\n const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0\r\n\r\n if (isDown && container.current) {\r\n onMove(getRelativePosition(container.current, event))\r\n } else {\r\n setDragging(false)\r\n }\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleMoveStart = useCallback(\r\n ({ nativeEvent }: React.MouseEvent | React.TouchEvent) => {\r\n preventDefaultMove(nativeEvent)\r\n\r\n if (!isValid.current(nativeEvent)) return\r\n\r\n // The node/ref must actually exist when user start an interaction.\r\n // We won't suppress the ESLint warning though, as it should probably be something to be aware of.\r\n onMove(getRelativePosition(container.current!, nativeEvent))\r\n setDragging(true)\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n const keyCode = event.which || event.keyCode\r\n\r\n // Ignore all keys except arrow ones\r\n if (keyCode < 37 || keyCode > 40) return\r\n // Do not scroll page by arrow keys when document is focused on the element\r\n event.preventDefault()\r\n // Send relative offset to the parent component.\r\n // We use codes (37←, 38↑, 39→, 40↓) instead of keys ('ArrowRight', 'ArrowDown', etc)\r\n // to reduce the size of the library\r\n onKey({\r\n left: keyCode === 39 ? 0.05 : keyCode === 37 ? -0.05 : 0,\r\n top: keyCode === 40 ? 0.05 : keyCode === 38 ? -0.05 : 0,\r\n })\r\n },\r\n [onKey]\r\n )\r\n\r\n const handleMoveEnd = useCallback(() => setDragging(false), [])\r\n\r\n const toggleDocumentEvents = useCallback(\r\n (state: boolean) => {\r\n // add or remove additional pointer event listeners\r\n const toggleEvent = state ? window.addEventListener : window.removeEventListener\r\n toggleEvent(hasTouched.current ? 'touchmove' : 'mousemove', handleMove)\r\n toggleEvent(hasTouched.current ? 'touchend' : 'mouseup', handleMoveEnd)\r\n },\r\n [handleMove, handleMoveEnd]\r\n )\r\n\r\n useLayoutEffect(() => {\r\n toggleDocumentEvents(isDragging)\r\n return () => {\r\n isDragging && toggleDocumentEvents(false)\r\n }\r\n }, [isDragging, toggleDocumentEvents])\r\n\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport const DraggablePicker = memo(DraggablePickerComponent)\r\n","interface PointerProps {\r\n className?: string\r\n top?: number\r\n left: number\r\n color: string\r\n}\r\n\r\nexport function Pointer({ color, left, top = 0.5 }: PointerProps) {\r\n return (\r\n \r\n
\r\n
\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `app/utils/colors.ts` in charts repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string) {\r\n const isRgb = getIsRgb(strColor)\r\n\r\n if (isRgb) {\r\n return rgbaToHexString(rgbaStringToObject(strColor), true)\r\n }\r\n\r\n return strColor\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Alpha({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, a: 1 - pos.left }), [onChange, color])\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ ...color, a: 1 })\r\n const gradientTo = hsvaToHEXString({ ...color, a: 0 }, true)\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n // Don’t recalculate when alpha changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [color.h, color.s, color.v])\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { Icon } from '../icon'\r\nimport { HSVA, hexStringToHSVA } from './util'\r\n\r\nconst DEFAULT_COLORS = [\r\n { title: 'Rose', value: '#f43f5e' },\r\n { title: 'Pink', value: '#db2777' },\r\n { title: 'Fuchsia', value: '#c026d3' },\r\n { title: 'Purple', value: '#9333ea' },\r\n { title: 'Violet', value: '#7c3aed' },\r\n { title: 'Indigo', value: '#4f46e5' },\r\n { title: 'Blue', value: '#2563eb' },\r\n { title: 'Light Blue', value: '#0284c7' },\r\n { title: 'Cyan', value: '#0891b2' },\r\n { title: 'Teal', value: '#0d9488' },\r\n { title: 'Emerald', value: '#059669' },\r\n { title: 'Green', value: '#16a34a' },\r\n { title: 'Lime', value: '#65a30d' },\r\n { title: 'Yellow', value: '#eab308' },\r\n { title: 'Amber', value: '#d97706' },\r\n { title: 'Red', value: '#dc2626' },\r\n]\r\n\r\ninterface ColorItem {\r\n /**\r\n * Name of the color\r\n */\r\n title: string\r\n\r\n /**\r\n * Hex value\r\n */\r\n value: string\r\n}\r\n\r\ninterface ColorPaletteProps {\r\n /**\r\n * Current selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * List of colors to display in the palette\r\n *\r\n * @default DEFAULT_COLORS\r\n */\r\n colors?: ColorItem[]\r\n\r\n /**\r\n * Callback when user picks a color\r\n */\r\n onChange: (color: string, originalColor: HSVA) => void\r\n}\r\n\r\nexport function ColorPalette({ color, colors = DEFAULT_COLORS, onChange }: ColorPaletteProps) {\r\n const lowerCaseColor = color.toLowerCase()\r\n\r\n return (\r\n
\r\n {colors.map((colorObj) => {\r\n const isSelected = lowerCaseColor.startsWith(colorObj.value)\r\n return (\r\n onChange(colorObj.value, hexStringToHSVA(colorObj.value))}\r\n >\r\n {isSelected && }\r\n
\r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface HueSaturationProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nfunction getPositionFromHSLA(color: HSVA) {\r\n return {\r\n left: color.h / 360,\r\n top: 1 - color.s,\r\n }\r\n}\r\n\r\nexport function HueSaturation({ color, onChange }: HueSaturationProps) {\r\n const position = useMemo(() => getPositionFromHSLA(color), [color])\r\n\r\n const colorPreview = useMemo(() => hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 }), [color.h, color.s])\r\n\r\n const changeSaturation = useCallback(\r\n (pos: Interaction) =>\r\n onChange({\r\n h: Math.round(pos.left * 360),\r\n s: 1 - pos.top,\r\n v: 1,\r\n a: color.a,\r\n }),\r\n [color.a, onChange]\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","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Lightness({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, v: 1 - pos.left }), [onChange, color])\r\n\r\n const colorPreview = useMemo(\r\n () => hsvaToHEXString({ h: color.h, s: color.s, v: color.v, a: 1 }),\r\n [color.h, color.s, color.v]\r\n )\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 })\r\n const gradientTo = hsvaToHEXString({ h: color.h, s: color.s, v: 0, a: 1 })\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n }, [color.h, color.s])\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { getIsColorTooLightOrTransparent, hexStringToRGBA } from './util'\r\n\r\ninterface ColorPreviewProps {\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * One or more colors to show in the preview\r\n */\r\n color: string | string[]\r\n\r\n /**\r\n * Wrapper classname\r\n */\r\n className?: string\r\n}\r\n\r\nexport function ColorPreview({ icon, color, className }: ColorPreviewProps) {\r\n const colors = Array.isArray(color) ? color : [color]\r\n const isTooLight = getIsColorTooLightOrTransparent(hexStringToRGBA(colors[0]))\r\n return (\r\n \r\n {icon && (\r\n
\r\n {isValidIconName(icon) ? (\r\n \r\n ) : (\r\n icon\r\n )}\r\n
\r\n )}\r\n {colors.map((color, index) => (\r\n //   has to be there because of a bug on safari which ignores h-full when empty element\r\n
\r\n  \r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ForwardedRef, useCallback, useEffect, useState } from 'react'\r\n\r\nimport { Input, InputComponentProps } from '../input'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPickerProps } from './picker'\r\nimport * as colorUtil from './util'\r\n\r\ninterface PickerInputProps extends Omit {\r\n color: ColorPickerProps['color']\r\n onChange: ColorPickerProps['onChange']\r\n\r\n /*\r\n * Is color preview square visible\r\n *\r\n * @default true\r\n * */\r\n hasColorPreview?: boolean\r\n}\r\nexport const PickerInput = React.forwardRef(\r\n (\r\n { color, inputClass, hasColorPreview = true, onChange, ...props }: PickerInputProps,\r\n ref: ForwardedRef\r\n ) => {\r\n const [colorInput, setColorInput] = useState(colorUtil.removeHashSymbol(color))\r\n const isRgba = colorUtil.getIsRgb(colorInput)\r\n\r\n useEffect(() => {\r\n setColorInput(colorUtil.removeHashSymbol(color))\r\n }, [color])\r\n\r\n const handleColorInputChange = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n const value = colorUtil.removeHashSymbol(event.currentTarget.value)\r\n const isRgba = value.startsWith('rgba')\r\n const colorValue = isRgba ? value : `#${value}`\r\n\r\n setColorInput(value)\r\n if ((value.length >= 6 || (isRgba && value.length >= 16)) && colorUtil.isValidColor(colorValue)) {\r\n onChange(colorValue, colorUtil.hexStringToHSVA(colorValue))\r\n }\r\n },\r\n [onChange]\r\n )\r\n return (\r\n \r\n {hasColorPreview && (\r\n
\r\n \r\n
\r\n )}\r\n {!isRgba && #}\r\n
\r\n }\r\n onChange={handleColorInputChange}\r\n />\r\n )\r\n }\r\n)\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button } from '../button'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Alpha } from './alpha'\r\nimport { ColorPalette } from './color-palette'\r\nimport { HueSaturation } from './hue-saturation'\r\nimport { Lightness } from './lightness'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\nexport interface ColorPickerProps {\r\n /**\r\n * The selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * Whether or not the user is able to select custom color\r\n *\r\n * @default true\r\n */\r\n canSelectCustom?: boolean\r\n\r\n /**\r\n * Whether or not the user is able to change alpha channel. Only applicable\r\n * when `canSelectCustom` is true\r\n *\r\n * @default true\r\n */\r\n canSelectAlpha?: boolean\r\n\r\n /**\r\n * Sets the output format for the color picker\r\n *\r\n * @default 'hex'\r\n */\r\n outputFormat?: 'hex' | 'rgba'\r\n\r\n /**\r\n * Callback when user changes color. Use the second parameter to do color space\r\n * conversions otherwise the color could differ due to rounding\r\n */\r\n onChange: (color: string, originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Callback when user clicks on a palette item. Used to close popover\r\n */\r\n onPaletteItemClick?: () => void\r\n}\r\n\r\nexport function ColorPicker({\r\n color,\r\n canSelectCustom = true,\r\n canSelectAlpha = true,\r\n outputFormat = 'hex',\r\n onChange,\r\n onPaletteItemClick,\r\n}: ColorPickerProps) {\r\n const cachedColor = useRef(color)\r\n const [hsvaColor, setColor] = useState(colorUtil.getHSVAFromColor(color))\r\n const popover = Ariakit.usePopoverContext()\r\n const input = popover?.useState('disclosureElement')\r\n\r\n /**\r\n * Update state if the color from outside changed\r\n */\r\n useEffect(() => {\r\n const currentColor = colorUtil.removeHashSymbol(cachedColor.current)\r\n const newColor = colorUtil.removeHashSymbol(color)\r\n\r\n if (currentColor === newColor || !colorUtil.isValidColor(newColor)) return\r\n\r\n cachedColor.current = color\r\n setColor(colorUtil.getHSVAFromColor(color))\r\n }, [color])\r\n\r\n /**\r\n * Handle color change\r\n * 1. update cache so we can correctly check when outside color updates\r\n * 2. Update internal color representation\r\n * 3. call onChange with string color\r\n */\r\n const onChangeCallback = useCallback(\r\n (color: colorUtil.HSVA) => {\r\n const stringColor = colorUtil.stringifyHSVAColor(color, outputFormat, canSelectAlpha)\r\n cachedColor.current = stringColor\r\n onChange(stringColor, color)\r\n setColor(color)\r\n },\r\n [onChange, canSelectAlpha, outputFormat]\r\n )\r\n\r\n const onSetCustomCodeClick = useCallback(() => {\r\n const value = prompt('Enter a color code')?.trim()\r\n\r\n if (!value) return\r\n\r\n const isValid = colorUtil.isValidColor(value)\r\n\r\n if (!isValid) {\r\n return alert('The code is not a valid color')\r\n }\r\n\r\n onChangeCallback(colorUtil.getHSVAFromColor(value))\r\n }, [onChangeCallback])\r\n\r\n return (\r\n
\r\n {canSelectCustom && (\r\n <>\r\n {isMobile() && (\r\n \r\n )}\r\n \r\n \r\n\r\n {canSelectAlpha && }\r\n \r\n )}\r\n\r\n \r\n {\r\n input?.focus({ preventScroll: true })\r\n onPaletteItemClick?.()\r\n onChangeCallback({ ...orignalColor, a: hsvaColor.a })\r\n }}\r\n />\r\n
\r\n \r\n )\r\n}\r\n\r\ninterface InputColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for the input\r\n */\r\n label?: ReactNode\r\n inputDataTestId?: string\r\n}\r\n\r\nexport function InputColorPicker({ label, inputDataTestId, onChange, ...props }: InputColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const canSelectCustom = props.canSelectCustom !== false\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n \r\n }\r\n />\r\n \r\n \r\n {\r\n if (canSelectCustom) return\r\n popoverState.hide()\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button, ButtonComponentProps, ButtonRounding, ButtonSizeType } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { IconNameType } from '../icon'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPicker, ColorPickerProps } from './picker'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\ninterface MultiColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n}\r\n\r\nexport function MultiColorPicker({\r\n colorInputLabel,\r\n onChange,\r\n canSelectCustom = true,\r\n ...props\r\n}: MultiColorPickerProps) {\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n {canSelectCustom && !isMobileDevice && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n {}} />\r\n \r\n \r\n )\r\n}\r\n\r\ninterface ColorTabButtonProps extends ButtonComponentProps {\r\n /*\r\n * Preview color\r\n * */\r\n color: string\r\n}\r\n\r\nexport function ColorTabButton({ color, children, ...props }: ColorTabButtonProps) {\r\n return (\r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n\r\ntype ButtonColorProperties = { color: string; label: string }\r\n\r\ninterface ButtonColorPickerProps\r\n extends Omit {\r\n /**\r\n * Temporary prop to enable/disable multi picker funcionality,\r\n * in the future we'll only use secondaryColor prop to decide if the picker is multi picker or not\r\n *\r\n * @default undefined\r\n */\r\n isMultiPicker?: boolean\r\n\r\n /**\r\n * Button classname\r\n */\r\n className?: string\r\n\r\n /**\r\n * Array of objects with color and value\r\n */\r\n colors: ColorType[]\r\n\r\n /**\r\n * Color onchange callback\r\n */\r\n onChange: (colors: ColorType[], originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Button size\r\n *\r\n * @default undefined\r\n */\r\n size?: ButtonSizeType\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Identifier for e2e testing\r\n *\r\n * @default undefined\r\n */\r\n buttonPickerDataTestId?: string\r\n}\r\n\r\nexport function ButtonColorPicker({\r\n size,\r\n icon,\r\n colors,\r\n className,\r\n onChange,\r\n buttonPickerDataTestId,\r\n ...props\r\n}: ButtonColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const isOpen = popoverState.useState('open')\r\n const isMultiPicker = !!props.isMultiPicker && colors.length > 1\r\n const [activeColorIndex, setActiveColorIndex] = React.useState(0)\r\n const handleColorChange = React.useCallback(\r\n (color: string, originalColor: colorUtil.HSVA) => {\r\n onChange(\r\n colors.map((colorObject, index) => (index === activeColorIndex ? { ...colorObject, color } : colorObject)),\r\n originalColor\r\n )\r\n },\r\n [activeColorIndex, colors, onChange]\r\n )\r\n return (\r\n <>\r\n \r\n color)}\r\n className={classnames('h-full w-full', ButtonRounding.small)}\r\n />\r\n \r\n \r\n {isMultiPicker && (\r\n
\r\n \r\n {colors.map(({ color, label }, index) => (\r\n setActiveColorIndex(index)}\r\n >\r\n {label}\r\n \r\n ))}\r\n \r\n
\r\n )}\r\n \r\n
\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 { 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 copy from 'copy-to-clipboard'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { InputProps, Textarea } from '../input'\r\n\r\ninterface Props extends Pick {\r\n className?: string\r\n text: string\r\n bottomLeftContent?: React.ReactNode\r\n}\r\n\r\nexport const CopyToClipboard: React.FC = ({ className, label, text, bottomLeftContent }) => {\r\n const [isCopied, setIsCopied] = React.useState(false)\r\n\r\n const handleCopyToClipboard = React.useCallback(() => {\r\n setIsCopied(true)\r\n copy(text)\r\n }, [text])\r\n\r\n React.useEffect(() => {\r\n let timeout: number\r\n const resetTimer = () => {\r\n if (!timeout) return\r\n clearTimeout(timeout)\r\n }\r\n if (isCopied) {\r\n resetTimer()\r\n timeout = window.setTimeout(() => {\r\n setIsCopied(false)\r\n }, 2000)\r\n }\r\n\r\n return () => {\r\n resetTimer()\r\n }\r\n }, [isCopied])\r\n\r\n return (\r\n
\r\n e.currentTarget.select()}\r\n inputClass=\"h-12\"\r\n data-testid=\"copy-to-clipboard-textarea\"\r\n value={text}\r\n />\r\n
\r\n {bottomLeftContent &&
{bottomLeftContent}
}\r\n \r\n {isCopied ? 'Copied' : 'Copy'}\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 { 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 Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { usePrevious } from '../../hooks/use-previous'\r\nimport { usePopoverPlacement } from '../../hooks/usePopoverPlacement'\r\nimport { blurWithoutScroll, focusWithoutScroll, preventDefault } from '../../util'\r\n\r\nenum DropdownRounding {\r\n none = '',\r\n regular = 'rounded-lg',\r\n}\r\n\r\nenum DropdownTheme {\r\n none = '',\r\n default = 'border border-primary bg-primary',\r\n}\r\n\r\ninterface StatelessDropdownProps\r\n extends Omit, 'ref'>,\r\n Pick {\r\n /**\r\n * Trigger button for the dropdown\r\n */\r\n trigger: JSX.Element | null\r\n\r\n /**\r\n * Disable interaction with other page elements when the dropdown is open\r\n *\r\n * @default true\r\n */\r\n modal?: boolean\r\n\r\n /**\r\n * When true, the dropdown will show when dropdown is hovered. Combine with\r\n * `backdrop={false}` to make the popover hide on mouse out\r\n */\r\n showOnHover?: boolean\r\n\r\n /**\r\n * Placement of the dropdown\r\n *\r\n */\r\n placement?: Ariakit.MenuProviderProps['placement']\r\n\r\n /**\r\n * Orientation in which the items are laid out. Changes which arrows control next/prev item\r\n *\r\n * @default vertical\r\n */\r\n orientation?: 'vertical' | 'horizontal'\r\n\r\n /**\r\n * Set rounding for the dropdown list\r\n *\r\n * @default regular\r\n */\r\n rounding?: keyof typeof DropdownRounding\r\n\r\n /**\r\n * Dropdown theme\r\n *\r\n * @default default\r\n */\r\n theme?: keyof typeof DropdownTheme\r\n\r\n /**\r\n * The amount of space between button and its popover\r\n *\r\n * @default 4\r\n */\r\n gutter?: number\r\n\r\n /**\r\n * Show backdrop on the dialog. Provide your own element if you want to add background or animation\r\n *\r\n */\r\n backdrop?: false | JSX.Element\r\n\r\n /**\r\n * Do not render the items when the popover is not visible\r\n *\r\n * @default true\r\n */\r\n unmountOnHide?: boolean\r\n\r\n /**\r\n * If true, the dropdown will overlay the trigger if necessary instead of going\r\n * out of bounds and overflowing\r\n */\r\n overlap?: boolean\r\n\r\n /**\r\n * Callback before the menu starts hiding. Event can be prevented which keeps the menu open\r\n * This callback isn’t called on backdrop click. Use `backdrop={
}` to react on backdrop clicks\r\n */\r\n onClose?: (ev: Event) => void\r\n\r\n /**\r\n * Used to provide virtual anchor, useful for context menu, etc\r\n */\r\n getAnchorRect?: () => { x: number; y: number }\r\n\r\n /**\r\n * Set which element gets focus when the dialog visibility changes. If `false`, the focus stays on the previous element.\r\n * Defaults to focusing without scrolling the page or keeping the focus on trigger if input-like.\r\n */\r\n autoFocusOnShow?: false | ((element: HTMLElement) => boolean)\r\n\r\n /**\r\n * Set which element gets focus when the dialog visibility changes. If `false`, the focus stays on the previous element.\r\n * Defaults to focusing without scrolling the page or keeping the focus on trigger if input-like.\r\n */\r\n autoFocusOnHide?: false | ((element: HTMLElement) => boolean)\r\n\r\n /**\r\n * Callback which is called when the dialog opens and all animations complete\r\n */\r\n onFullyOpen?: () => void\r\n\r\n /**\r\n * Callback which is called when the dialog closes and all animations complete\r\n */\r\n onFullyClosed?: () => void\r\n}\r\n\r\nexport const StatelessDropdown = React.forwardRef(function DropdownComponent(\r\n {\r\n trigger,\r\n modal = true,\r\n rounding = 'regular',\r\n theme = 'default',\r\n gutter,\r\n unmountOnHide = true,\r\n children,\r\n backdrop,\r\n showOnHover,\r\n hideOnInteractOutside,\r\n autoFocusOnShow,\r\n autoFocusOnHide,\r\n onFullyOpen,\r\n onFullyClosed,\r\n ...props\r\n }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n const store = Ariakit.useMenuContext()\r\n const { placement, zIndex, updatePosition } = usePopoverPlacement(store)\r\n const isOpen = store?.useState('open')\r\n const [isFullyOpen, setIsFullyOpen] = React.useState(false)\r\n const isMounted = store?.useState('mounted')\r\n const wasMounted = usePrevious(isMounted)\r\n const menuGutter = gutter ?? (store?.parent ? 6 : 4)\r\n\r\n React.useEffect(() => {\r\n if (wasMounted && !isMounted) {\r\n onFullyClosed?.()\r\n }\r\n // We want to call it only on isMounted change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isMounted])\r\n\r\n return (\r\n <>\r\n {trigger && (\r\n \r\n )}\r\n }\r\n // Update zIndex when popover position changes\r\n updatePosition={updatePosition}\r\n // E2E tests don’t wait for transitions to complete and it could lead to bugs with other popover components (ResizeObserver loop exceeded)\r\n // or visual diffs due a screenshot being captured while the dropdown still in transition\r\n // If you encounter this problem, just do `cy.get('[data-fully-open=true]').should('exist')` before continuing to wait for the dropdown\r\n data-fully-open={isFullyOpen}\r\n className={classNames(\r\n props.className,\r\n zIndex,\r\n DropdownRounding[rounding],\r\n DropdownTheme[theme],\r\n 'custom-scrollbar absolute flex flex-col overflow-hidden shadow-modal outline-none dark:shadow-modal-dark',\r\n // These are set by popper, we just need to make sure we don’t encroach on the safe insets\r\n 'min-w-[--popover-anchor-width] max-w-[--popover-available-width]',\r\n // Animations\r\n 'opacity-0 transition duration-[250ms] data-[enter]:translate-y-0 data-[enter]:opacity-100',\r\n {\r\n // When in combobox mode, the padding is smaller so we can render a gradient under the combobox input.\r\n // Change the custom scrollbar offset so the top of the first item fits the top of our scrollbar\r\n '[--scrollbar-radius:0]': DropdownRounding[rounding] === DropdownRounding.none,\r\n // Direction based styles\r\n 'max-h-[calc(var(--popover-available-height)-env(safe-area-inset-bottom))] motion-safe:-translate-y-1':\r\n placement?.startsWith('bottom'),\r\n 'max-h-[calc(var(--popover-available-height)-env(safe-area-inset-top))] motion-safe:translate-y-1':\r\n placement?.startsWith('top'),\r\n }\r\n )}\r\n onTransitionEnd={(ev) => {\r\n if (ev.target === ev.currentTarget && isOpen) {\r\n setIsFullyOpen(true)\r\n onFullyOpen?.()\r\n }\r\n }}\r\n >\r\n \r\n {children}\r\n
\r\n \r\n \r\n )\r\n})\r\n\r\nexport interface DropdownProps extends StatelessDropdownProps {\r\n state?: Ariakit.MenuStore\r\n}\r\n\r\nexport const Dropdown = React.forwardRef(\r\n (\r\n { state, placement, orientation = 'vertical', ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\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 { OptionButton, OptionButtonProps } from '../OptionButton'\r\nimport { BUTTON_DEFAULT_ELEMENT } from '../button'\r\nimport { PropsWithAs } from '../types'\r\n\r\ninterface DropdownItemProps extends OptionButtonProps {\r\n store?: Ariakit.MenuStore\r\n\r\n subtitle?: React.ReactNode\r\n\r\n /**\r\n * Whether clicking the item should also close the dropdown. Only applies to\r\n * items without a submenu\r\n *\r\n * @default true\r\n */\r\n hideOnClick?: boolean\r\n}\r\n\r\nfunction DropdownItemComponent(\r\n { as: asComponent, ...props }: PropsWithAs & DropdownItemProps,\r\n ref: React.ForwardedRef\r\n) {\r\n return } />\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 DropdownItem = React.forwardRef(DropdownItemComponent) as <\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & DropdownItemProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\nexport const useDropdownState = Ariakit.useMenuStore\r\n","import * as Sentry from '@sentry/browser'\r\nimport { ReactNode, useEffect } from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\nimport { useRouteError } from 'react-router-dom'\r\n\r\nimport { link } from '../services/routing'\r\nimport { Button } from './button'\r\nimport { Heading, Paragraph } from './typography'\r\n\r\ninterface ErrorViewProps {\r\n /**\r\n * Title of the message\r\n */\r\n title?: ReactNode\r\n\r\n /**\r\n * Body text\r\n */\r\n message?: ReactNode\r\n\r\n /**\r\n * Show contact support text under the message\r\n *\r\n * @default true\r\n */\r\n showContact?: boolean\r\n\r\n /**\r\n * Show refresh page button under the text\r\n *\r\n * @default true\r\n */\r\n showRefresh?: boolean\r\n}\r\n\r\nexport function ErrorView({ title, message, showContact = true, showRefresh = true }: ErrorViewProps) {\r\n return (\r\n
\r\n {title}\r\n {message}\r\n\r\n {showContact && (\r\n \r\n Our development team has been notified of this. If the error persists, please{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n )}\r\n\r\n {showRefresh && (\r\n \r\n Refresh page\r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\nexport function DefaultErrorBoundary({\r\n error,\r\n title = 'Application error',\r\n message = 'We’re sorry but an unknown error occured.',\r\n ...props\r\n}: Partial) {\r\n useEffect(() => {\r\n // Ignore webpack chunk loading errors\r\n if (error?.name === 'ChunkLoadError') return\r\n // Otherwise log to Sentry\r\n Sentry.captureException(error, { level: 'fatal' })\r\n // so we can see error in logs\r\n console.error('ErrorBoundary:', JSON.stringify(error))\r\n }, [error])\r\n\r\n return \r\n}\r\n\r\nexport function RouterErrorElement() {\r\n const error = useRouteError() as Error\r\n return \r\n}\r\n","import { useMemo } from 'react'\r\n\r\ninterface HighlightProps {\r\n /**\r\n * Search string that will be highlighted\r\n */\r\n highlight: string\r\n /**\r\n * Text to be highlighted\r\n */\r\n text: string\r\n}\r\n\r\nexport function Highlight({ highlight, text }: HighlightProps) {\r\n const index = text.toLowerCase().indexOf(highlight.toLowerCase())\r\n\r\n const processedText = useMemo(\r\n () => ({\r\n before: text.substring(0, index),\r\n highlight: text.substring(index, index + highlight.length),\r\n after: text.substring(index + highlight.length),\r\n }),\r\n [highlight.length, index, text]\r\n )\r\n\r\n if (index < 0 || highlight.length < 1) return {text}\r\n\r\n return (\r\n <>\r\n {processedText.before}\r\n {!!processedText.highlight.length && (\r\n \r\n {processedText.highlight}\r\n \r\n )}\r\n {processedText.after}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { IconNameType, iconList } from '.'\r\nimport { SVGProps } from './svg'\r\n\r\nexport interface IconProps extends SVGProps {\r\n /**\r\n * Icon name\r\n */\r\n name?: IconNameType\r\n\r\n /**\r\n * Alternative way to pass icon to render if you want to render a custom component\r\n * or use `iconList` object lookup\r\n */\r\n as?: React.FC\r\n}\r\n\r\nexport function Icon({ name, as: asComponent, className, width = 16, height = width, ...props }: IconProps) {\r\n if (name && asComponent) {\r\n throw new Error('Specifying both \"name\" and \"as\" on Icon component is not supported')\r\n }\r\n\r\n if (!name && !asComponent) {\r\n throw new Error('No icon specified')\r\n }\r\n\r\n if (name) {\r\n if (iconList[name] === undefined) {\r\n throw new Error('Icon not found')\r\n }\r\n\r\n const fileName = ['icons', iconList[name]].filter(Boolean).join('_')\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const Component = asComponent!\r\n return \r\n}\r\n","// Export the Icon component itself\r\nexport * from './icon'\r\n\r\nexport function isValidIconName(name?: unknown): name is IconNameType {\r\n if (!name || typeof name !== 'string') return false\r\n\r\n return iconList[name as IconNameType] !== undefined\r\n}\r\n\r\nexport type IconNameType = keyof typeof iconList\r\n\r\nconst root = ''\r\nconst chartLayouts = 'chart-layouts'\r\nconst chartTools = 'chart-tools'\r\nconst chartTypes = 'chart-types'\r\nconst screener = 'screener'\r\n\r\n// Export list of icon components\r\nexport const iconList = {\r\n // Main icons\r\n add: root,\r\n arrowBackward: root,\r\n arrowDownShort: root,\r\n arrowForward: root,\r\n arrowUpShort: root,\r\n briefcase: root,\r\n calendar: root,\r\n caretDown: root,\r\n caretLeft: root,\r\n caretRight: root,\r\n caretUp: root,\r\n caretVertical: root,\r\n chartBar: root,\r\n chartBubble: root,\r\n chartPie: root,\r\n chartTable: root,\r\n chartTreemap: root,\r\n checkboxTick: root,\r\n chevronDown: root,\r\n chevronLeft: root,\r\n chevronRight: root,\r\n chevronUp: 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 import: root,\r\n info: root,\r\n interval: root,\r\n lightMode: root,\r\n link: root,\r\n lock: root,\r\n lockOpened: root,\r\n menuClose: root,\r\n minus: root,\r\n more: root,\r\n note: root,\r\n openInNew: root,\r\n palette: root,\r\n profile: root,\r\n publish: root,\r\n refresh: root,\r\n remove: root,\r\n restore: root,\r\n search: root,\r\n settings: root,\r\n settingsWheel: root,\r\n share: root,\r\n signOut: root,\r\n star: root,\r\n starOutlined: root,\r\n switchHorizontal: root,\r\n switchVertical: root,\r\n tabKey: root,\r\n template: root,\r\n trashCan: root,\r\n trendingDown: root,\r\n trendingUp: root,\r\n triangle: root,\r\n triangleOutlineDown: root,\r\n triangleOutlineUp: root,\r\n warning: root,\r\n\r\n // Chart layouts\r\n layout1h1v: chartLayouts,\r\n layout1h2v: chartLayouts,\r\n layout1h3v: chartLayouts,\r\n layout1l2r: chartLayouts,\r\n layout1t2b: chartLayouts,\r\n layout2h1v: chartLayouts,\r\n layout2h2v: chartLayouts,\r\n layout3h1v: chartLayouts,\r\n layout3h2v: chartLayouts,\r\n\r\n // Chart tools\r\n drawingActionDelete: chartTools,\r\n drawingSettingAutosaveOff: chartTools,\r\n drawingSettingAutosaveOn: chartTools,\r\n drawingSettingAutosaveSaving: chartTools,\r\n drawingSettingDrawingMode: chartTools,\r\n drawingSettingDrawingModeActive: chartTools,\r\n drawingSettingHide: chartTools,\r\n drawingSettingLock: chartTools,\r\n drawingSettingPreserveDrawings: chartTools,\r\n drawingSettingPreserveDrawingsActive: chartTools,\r\n drawingSettingShow: chartTools,\r\n drawingSettingUnlock: chartTools,\r\n toolArrow: chartTools,\r\n toolAVWAP: chartTools,\r\n toolBrush: chartTools,\r\n toolCallout: chartTools,\r\n toolCurve: chartTools,\r\n toolElliottWave: chartTools,\r\n toolEllipse: chartTools,\r\n toolExpand: chartTools,\r\n toolFibonacci: chartTools,\r\n toolLine: chartTools,\r\n toolMeasure: chartTools,\r\n toolMidLineH: chartTools,\r\n toolMidLineV: chartTools,\r\n toolMouse: chartTools,\r\n toolPitchfork: chartTools,\r\n toolPolygon: chartTools,\r\n toolPosition: chartTools,\r\n toolRect: chartTools,\r\n toolRectRotated: chartTools,\r\n toolText: chartTools,\r\n toolTriangle: chartTools,\r\n toolXABCD: chartTools,\r\n\r\n // Chart types\r\n candleBarBasic: chartTypes,\r\n candleBarHeikinAshi: chartTypes,\r\n candleBarHollow: chartTypes,\r\n lineChartType: chartTypes,\r\n ohlcChartType: chartTypes,\r\n\r\n // Screener\r\n above: screener,\r\n aboveEqual: screener,\r\n abovePercent: screener,\r\n below: screener,\r\n belowEqual: screener,\r\n belowPercent: screener,\r\n between: screener,\r\n crosses: screener,\r\n crossesDown: screener,\r\n crossesUp: screener,\r\n equal: screener,\r\n outside: screener,\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { PartialBy } from '../../types'\r\nimport { MenuGroup } from '../MenuGroup'\r\nimport { Dropdown, DropdownItem, DropdownProps } from '../dropdown'\r\nimport { ObjectHash } from '../types'\r\n\r\nexport interface IContextMenuOption {\r\n type?: never\r\n id: string\r\n label: React.ReactNode\r\n onClick?: () => void\r\n options?: ContextMenuItem[]\r\n gtag?: ObjectHash\r\n}\r\n\r\ninterface IContextMenuDivider {\r\n type: 'divider'\r\n label?: React.ReactNode\r\n}\r\n\r\nexport type ContextMenuItem = IContextMenuOption | IContextMenuDivider\r\n\r\ninterface ContextMenuInnerProps extends PartialBy {\r\n /**\r\n * Items visible in the menu\r\n */\r\n items: ContextMenuItem[]\r\n}\r\n\r\nexport function ContextMenuInner(\r\n { trigger, items, onClose, ...props }: ContextMenuInnerProps,\r\n ref: React.ForwardedRef\r\n) {\r\n return (\r\n ev.preventDefault()}\r\n >\r\n {items?.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return \r\n }\r\n\r\n if (item?.options !== undefined) {\r\n return (\r\n \r\n {item.label}\r\n \r\n }\r\n />\r\n )\r\n }\r\n\r\n return (\r\n {\r\n item.onClick?.()\r\n window.gtag?.('event', 'context-menu', Object.assign({ menu_option: item.id }, item.gtag))\r\n }}\r\n data-testid={`dropdown-menu-${item.id}`}\r\n >\r\n {item.label}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nexport const ContextMenu = React.forwardRef(ContextMenuInner)\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\ninterface GridLayoutProps extends React.HTMLProps {\r\n /**\r\n * Number of columns\r\n */\r\n columns?: number\r\n\r\n /**\r\n * Number of rows\r\n */\r\n rows?: number\r\n\r\n /**\r\n * Whether or not a border is rendered between and around items. eg. charts\r\n * on HP won’t have a border\r\n *\r\n * @default false\r\n */\r\n border?: boolean\r\n}\r\n\r\nexport const ChartGridCell = React.forwardRef(\r\n ({ children, gridArea, className, ...props }, ref) => (\r\n \r\n {children}\r\n \r\n )\r\n)\r\n\r\ninterface ChartGridCellProps extends React.HTMLProps {\r\n /**\r\n * Css grid-area value\r\n */\r\n gridArea?: string\r\n}\r\n\r\nexport function GridLayout({ columns = 1, rows = 1, border = false, children, className, ...props }: GridLayoutProps) {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\ninterface ChartGridProps extends GridLayoutProps {\r\n isResizable?: boolean\r\n}\r\n\r\nexport const ChartGrid: React.FC = (props) => \r\n","import * as React from 'react'\r\n\r\nimport { PropsWithAs, RequireByKey } from '../types'\r\n\r\nconst defaultValueAccessor: ValueAccessor = (data) => data\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst DEFAULT_VALUE_KEY = 'value'\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst DEFAULT_CHANGE_KEY = 'onChange'\r\n\r\ntype ValueAccessor<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n> = (...args: Parameters[ChangeKey]>) => React.ComponentProps[ValueKey]\r\n\r\nexport type InnerStateProps<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps,\r\n ChangeKey extends keyof React.ComponentProps,\r\n> = RequireByKey, 'as'> & {\r\n valueKey?: ValueKey\r\n changeKey?: ChangeKey\r\n valueAccessor?: ValueAccessor\r\n}\r\n\r\nexport function InnerState<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n>({\r\n as: asComponent,\r\n valueKey = 'value' as ValueKey,\r\n changeKey = 'onChange' as ChangeKey,\r\n valueAccessor = defaultValueAccessor,\r\n ...props\r\n}: InnerStateProps) {\r\n const { [valueKey]: value, [changeKey]: onChange } = props\r\n const [state, setState] = React.useState[ValueKey]>(value)\r\n\r\n const handleChange = React.useCallback>(\r\n (...args) => {\r\n setState(valueAccessor(...args))\r\n onChange(...args)\r\n },\r\n [onChange, valueAccessor]\r\n )\r\n\r\n return React.createElement(asComponent, {\r\n ...props,\r\n [valueKey]: state,\r\n [changeKey]: handleChange,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react'\r\n\r\nimport { Label } from './typography'\r\n\r\nexport enum RangeSize {\r\n small = 'sm:h-6', // 24px height\r\n regular = 'sm:h-7', // 28px height\r\n medium = 'sm:h-8', // 32px height\r\n large = 'sm:h-9', // 36px height\r\n}\r\n\r\ntype InputProps = HTMLProps\r\n\r\ninterface RangeSliderProps extends Omit {\r\n /**\r\n * Label which is rendered above the select\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Range size. All inputs have forced height on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof RangeSize\r\n\r\n /**\r\n * Element which will be rendered on the left side of the slider\r\n */\r\n leftContent?: ReactNode\r\n\r\n /**\r\n * Element which will be rendered on the right side of the slider\r\n */\r\n rightContent?: ReactNode\r\n\r\n /**\r\n * Class name for the wrapper element\r\n */\r\n className?: string\r\n\r\n /**\r\n * Class name for the input element\r\n */\r\n inputClassName?: string\r\n\r\n /**\r\n * Min value for the input\r\n *\r\n * @default 0\r\n */\r\n min?: number\r\n\r\n /**\r\n * Max value for the input\r\n *\r\n * @default 100\r\n */\r\n max?: number\r\n\r\n /**\r\n * Step value for the input\r\n *\r\n * @default 1\r\n */\r\n step?: number\r\n\r\n /**\r\n * Current value\r\n */\r\n value: number\r\n\r\n /**\r\n * Callback when value changes\r\n */\r\n onChange: InputProps['onChange']\r\n}\r\n\r\nexport function RangeSlider({\r\n label,\r\n size = 'regular',\r\n leftContent,\r\n rightContent,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n className,\r\n inputClassName,\r\n ...props\r\n}: RangeSliderProps) {\r\n const [hasTrack, setHasTrack] = useState(false)\r\n const trackRef = useRef(null)\r\n const thumbRef = useRef(null)\r\n\r\n useEffect(() => {\r\n setHasTrack(Boolean(trackRef.current && thumbRef.current))\r\n }, [])\r\n\r\n const thumbLeft = useMemo(() => {\r\n const track = trackRef.current\r\n const thumb = thumbRef.current\r\n const valuePercent = (props.value - min) / (max - min)\r\n\r\n if (!hasTrack || !track || !thumb) return\r\n\r\n const trackBox = track.getBoundingClientRect()\r\n const thumbBox = thumb.getBoundingClientRect()\r\n\r\n return ((valuePercent * (trackBox.width - thumbBox.width)) / trackBox.width) * 100\r\n }, [min, max, props.value, hasTrack])\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { ButtonRoundingType, ButtonThemeType } from '../button'\r\nimport { IconNameType } from '../icon'\r\n\r\nexport enum ToolbarTheme {\r\n chipTransparent, // (default)\r\n alternative,\r\n}\r\n\r\nexport enum ToolbarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n\r\nexport type ToolbarDirectionType = keyof typeof ToolbarDirection\r\n\r\nexport interface IButtonThemeSettings {\r\n className?: string\r\n theme: ButtonThemeType\r\n rounding: ButtonRoundingType\r\n}\r\n\r\nexport interface IToolbarItem {\r\n id: string\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport type ToolbarThemeType = keyof typeof ToolbarTheme\r\n","import * as React from 'react'\r\n\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\nexport interface IToolbarContext {\r\n direction: ToolbarDirection\r\n theme: ToolbarTheme\r\n isWrapped: boolean\r\n isStretched: boolean\r\n isMobile: boolean\r\n}\r\n\r\nexport const ToolbarContext = React.createContext({\r\n direction: ToolbarDirection.vertical,\r\n theme: ToolbarTheme.chipTransparent,\r\n isWrapped: false,\r\n isStretched: false,\r\n isMobile: false,\r\n})\r\n\r\nexport function useToolbarContext() {\r\n return React.useContext(ToolbarContext)\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport React from 'react'\r\n\r\nimport { isSafariDesktop } from '../../../app/shared/isMobile'\r\nimport { StatelessDropdown } from '../dropdown'\r\nimport { IToolbarContext, ToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarDirectionType, ToolbarTheme, ToolbarThemeType } from './interfaces'\r\n\r\nconst getToolbarSettings = ({\r\n direction,\r\n isWrapped,\r\n isMobile,\r\n theme,\r\n}: IToolbarContext): React.HTMLProps => {\r\n switch (isWrapped) {\r\n case true:\r\n return {\r\n className: classnames('shrink-0 items-center bg-white dark:bg-gray-800', {\r\n 'flex flex-wrap justify-between': direction === ToolbarDirection.vertical,\r\n 'grid border border-gray-100 dark:border-gray-600 p-1.5 gap-1 border-box rounded-md grid-cols-2':\r\n FinvizSettings.hasRedesignEnabled,\r\n }),\r\n }\r\n\r\n default:\r\n return {\r\n className: classnames('flex shrink-0 items-center bg-white dark:bg-gray-800', {\r\n 'p-1.5': !isMobile,\r\n 'space-x-1.5 px-1.5': direction === ToolbarDirection.horizontal && FinvizSettings.hasRedesignEnabled,\r\n 'flex-col overflow-hidden overflow-y-auto [--inset-l:0.5rem] landscape-primary:pl-inset-left':\r\n direction === ToolbarDirection.vertical,\r\n 'space-y-2': direction === ToolbarDirection.vertical && !isMobile,\r\n 'pb-inset-bottom [--inset-b:0.5rem]': theme !== ToolbarTheme.alternative && !isMobile,\r\n 'w-screen space-x-2 overflow-hidden overflow-x-auto':\r\n direction === ToolbarDirection.horizontal && theme !== ToolbarTheme.alternative,\r\n 'overflow-x-hidden': theme === ToolbarTheme.alternative,\r\n }),\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarProps {\r\n /**\r\n * Toolbar direction\r\n *\r\n * @default vertical\r\n */\r\n direction?: ToolbarDirectionType\r\n\r\n /**\r\n * Toolbar buttons theme\r\n *\r\n * @default light\r\n */\r\n theme?: ToolbarThemeType\r\n\r\n /**\r\n * Charts mobile design\r\n *\r\n * @default false\r\n */\r\n isMobile?: boolean\r\n\r\n className?: string\r\n}\r\n\r\nexport function Toolbar({\r\n direction = 'vertical',\r\n theme = 'chipTransparent',\r\n isMobile = false,\r\n children,\r\n className,\r\n}: React.PropsWithChildren) {\r\n const hasFocusRings = React.useRef(false)\r\n const toolbarRef = React.useRef(null)\r\n const contextProviderValue = React.useMemo(\r\n () => ({\r\n direction: ToolbarDirection[direction],\r\n theme: ToolbarTheme[theme],\r\n isWrapped:\r\n ToolbarDirection[direction] === ToolbarDirection.vertical && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isStretched:\r\n ToolbarDirection[direction] === ToolbarDirection.horizontal && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isMobile,\r\n }),\r\n [direction, theme, isMobile]\r\n )\r\n const toolbarSettings = getToolbarSettings(contextProviderValue)\r\n\r\n React.useLayoutEffect(() => {\r\n // Workaround for Safari scrollbar bug https://github.com/finvizhq/charts/issues/1038\r\n // Safari injects scrollbar after layout render and doesn't trigger reflow\r\n if (ToolbarTheme[theme] !== ToolbarTheme.alternative && isSafariDesktop()) {\r\n const forceReflow = throttle(() => {\r\n if (toolbarRef.current !== null) {\r\n const originalWidth = toolbarRef.current.style.width\r\n toolbarRef.current.style.width = '0'\r\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\r\n toolbarRef.current.offsetWidth\r\n toolbarRef.current.style.width = originalWidth\r\n }\r\n }, 200)\r\n\r\n forceReflow()\r\n window.addEventListener('resize', forceReflow)\r\n\r\n return () => {\r\n window.removeEventListener('resize', forceReflow)\r\n }\r\n }\r\n }, [theme])\r\n\r\n return (\r\n \r\n \r\n {children}\r\n {\r\n hasFocusRings.current = !!document.querySelector('[data-focus-visible]')\r\n return true\r\n }}\r\n autoFocusOnHide={(el: HTMLElement) => {\r\n // Only call focus when we previously had focus rings to prevent sticky focus rings\r\n if (hasFocusRings.current) el.focus({ preventScroll: true })\r\n hasFocusRings.current = false\r\n return false\r\n }}\r\n />\r\n \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 { Button, ButtonHTMLProps, ButtonProps } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon } from '../icon'\r\nimport { Spinner } from '../spinner'\r\nimport { PropsWithAs } from '../types'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\n\r\nfunction getButtonThemeSettings({\r\n className,\r\n theme,\r\n isActive,\r\n isStretched,\r\n isInAction,\r\n}: {\r\n className: string\r\n theme: ToolbarTheme\r\n isStretched: boolean\r\n isActive?: boolean\r\n isInAction?: boolean\r\n}): Omit & ButtonProps {\r\n const includeRedesign = FinvizSettings.hasRedesignEnabled\r\n switch (theme) {\r\n case ToolbarTheme.alternative:\r\n return {\r\n className: classnames(\r\n className,\r\n {\r\n grow: isStretched,\r\n 'h-10 w-10': !isStretched && !includeRedesign,\r\n 'animate-pulse': isInAction,\r\n },\r\n\r\n !includeRedesign && {\r\n 'active:bg-white disabled:bg-white disabled:text-gray-300 disabled:hover:text-gray-300': true,\r\n 'border border-white text-gray-500 hover:border-gray-100 hover:text-gray-900': !isActive,\r\n 'border border-gray-900 text-gray-900': isActive,\r\n }\r\n ),\r\n theme: includeRedesign ? 'chipTransparent' : 'transparent',\r\n rounding: includeRedesign ? undefined : 'none',\r\n size: isStretched || includeRedesign ? undefined : 'none',\r\n }\r\n default:\r\n return {\r\n className: classnames(\r\n className,\r\n 'border dark:disabled:bg-gray-800 dark:disabled:text-gray-600 disabled:text-gray-300 disabled:bg-white dark:disabled:hover:bg-gray-800 dark:disabled:hover:text-gray-600 disabled:hover:text-gray-300 disabled:hover:bg-white',\r\n {\r\n 'animate-pulse': isInAction,\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 !isActive,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': isActive,\r\n }\r\n ),\r\n theme: 'transparent',\r\n rounding: 'small',\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarButtonProps extends Omit {\r\n rowId?: number\r\n item: IToolbarItem\r\n disabledTooltip?: string\r\n isInAction?: boolean\r\n isLoading?: boolean\r\n}\r\n\r\nexport const ToolbarButton = React.forwardRef(function ToolbarButton(\r\n { item, disabledTooltip, isInAction: isInActionProp, isLoading, ...props }: PropsWithAs & ToolbarButtonProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const context = Ariakit.useMenuContext()\r\n const { theme, isStretched } = useToolbarContext()\r\n const isInAction = isInActionProp && item.iconAction !== undefined\r\n const buttonSettings = getButtonThemeSettings({\r\n className: props.className,\r\n theme,\r\n isStretched,\r\n isActive: props.active,\r\n isInAction: isInAction,\r\n })\r\n\r\n const getMainIcon = () => (\r\n \r\n )\r\n\r\n return (\r\n }\r\n store={context?.menubar || undefined}\r\n blurOnHoverEnd\r\n render={\r\n \r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {props.children ??\r\n (isInAction ? (\r\n \r\n \r\n \r\n ) : (\r\n getMainIcon()\r\n ))}\r\n \r\n )}\r\n \r\n }\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 { isMobile } from '../../../app/shared/isMobile'\r\nimport { DropdownItem } from '../dropdown'\r\nimport { Icon } from '../icon'\r\nimport { NativeSelect } from '../select/NativeSelect'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\nimport { ToolbarButton } from './toolbar-button'\r\n\r\nconst isMobileBrowser = isMobile()\r\n\r\nexport interface ToolbarGroupProps {\r\n /**\r\n * Main button item\r\n */\r\n defaultItem: IToolbarItem\r\n\r\n /**\r\n * Shows spinner instead of icon\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Current selected item id\r\n */\r\n isActive: boolean\r\n\r\n /**\r\n * Should indicate some action in progress\r\n */\r\n isInAction?: boolean\r\n\r\n /**\r\n * Array of items\r\n */\r\n groupItems: IToolbarItem[]\r\n\r\n /**\r\n * Expand group button label\r\n */\r\n groupTitle?: string\r\n\r\n /**\r\n * On item select callback\r\n */\r\n onChange: (id: string, trigger: 'button' | 'select' | 'group') => void\r\n\r\n /**\r\n * Use native select for mobile devices\r\n *\r\n * @default true\r\n */\r\n useNativeSelect?: boolean\r\n\r\n /**\r\n * Is item disabled\r\n */\r\n disabled?: boolean\r\n\r\n /**\r\n * Tooltip message if item is disabled\r\n */\r\n disabledTooltip?: string\r\n\r\n rowId?: number\r\n}\r\n\r\nexport const ToolbarGroup = React.forwardRef(function ToolbarGroup(\r\n {\r\n defaultItem,\r\n isActive,\r\n isLoading,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect = isMobileBrowser,\r\n disabled,\r\n disabledTooltip,\r\n rowId,\r\n }: ToolbarGroupProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const [selectedItem, setSelectedItem] = React.useState(defaultItem)\r\n const groupId = groupTitle?.replace(/\\s/g, '-').toLocaleLowerCase()\r\n const isAlternativeTheme = theme === ToolbarTheme.alternative\r\n\r\n // Setup states, pass Menubar context to this menu so we can control the shared menu\r\n const context = Ariakit.useMenuContext()\r\n const menu = Ariakit.useMenuStore({ store: context })\r\n\r\n // We have multiple menu triggers but just one shared menu so we need a way to know which button has been hovered\r\n const [menuButton, setMenuButton] = React.useState(null)\r\n const open = menu.useState((state) => state.mounted && state.anchorElement === menuButton)\r\n\r\n // Find the element to render the menu into using Portal\r\n const parentMenu = menu.useState('contentElement')\r\n const menuContentElement = React.useMemo(() => parentMenu?.querySelector('div'), [parentMenu])\r\n\r\n /**\r\n * Charts prevent bubling mouseover so we need to hide the menu manually\r\n */\r\n const hideMenu = menu.hide\r\n React.useEffect(() => {\r\n const onMouseLeave = () => hideMenu()\r\n\r\n parentMenu?.addEventListener('mouseleave', onMouseLeave)\r\n return () => parentMenu?.removeEventListener('mouseleave', onMouseLeave)\r\n }, [hideMenu, parentMenu])\r\n\r\n const showMenu = menu.show\r\n const handleMenuOpen = React.useCallback(\r\n (ev: React.SyntheticEvent) => {\r\n menu.setDisclosureElement(ev.currentTarget)\r\n menu.setAnchorElement(ev.currentTarget)\r\n showMenu()\r\n },\r\n [menu, showMenu]\r\n )\r\n\r\n const trigger = (\r\n \r\n \r\n \r\n \r\n )\r\n\r\n if (useNativeSelect) {\r\n return (\r\n \r\n {trigger}\r\n ({ value: item.id, label: item.title }))}\r\n onChange={(option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }}\r\n onClick={() => onChange(selectedItem.id, 'select')}\r\n />\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n ) => {\r\n // Preventing this means the dropdown will only open on hover not by a click\r\n ev.preventDefault()\r\n }}\r\n onPointerDown={(ev: React.PointerEvent) => {\r\n // Finally, pre-select the current group tool\r\n onChange(selectedItem.id, 'group')\r\n handleMenuOpen(ev)\r\n }}\r\n />\r\n {open && (\r\n // Render this menu's contents into the parent menu.\r\n }>\r\n {groupItems.map((item) => (\r\n }\r\n data-testid={`toolbar-group-${groupId}-${item.id}`}\r\n rounding={theme === ToolbarTheme.alternative && !FinvizSettings.hasRedesignEnabled ? 'none' : undefined}\r\n onPointerDown={() => {\r\n setSelectedItem(item)\r\n onChange(item.id, 'select')\r\n }}\r\n >\r\n {item.title}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n )\r\n})\r\n","import { PartialBy } from '../../types'\r\nimport { ToolbarButton } from './toolbar-button'\r\nimport { ToolbarGroup, ToolbarGroupProps } from './toolbar-group'\r\n\r\nexport function ToolbarItem({\r\n defaultItem,\r\n isLoading,\r\n isActive,\r\n isInAction,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect,\r\n disabled,\r\n disabledTooltip,\r\n rowId,\r\n}: PartialBy) {\r\n const isItemActive = isActive && !disabled\r\n\r\n if (!!groupItems?.length) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n {\r\n onChange(defaultItem.id, 'button')\r\n }}\r\n />\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { useToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\ntype ToolbarDividerProps = {\r\n className?: string\r\n}\r\n\r\nexport function ToolbarDivider({ className }: ToolbarDividerProps) {\r\n const { direction, theme } = useToolbarContext()\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Box } from '../box'\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { TourStep } from './types'\r\n\r\nexport function StepContent({ step }: { step: TourStep }) {\r\n return (\r\n \r\n {step.title && (\r\n \r\n {step.title}\r\n \r\n )}\r\n {step.body && {step.body}}\r\n \r\n )\r\n}\r\n","import { offset, shift } from '@floating-ui/dom'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as ReactDOM from 'react-dom/server'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport {\r\n BUTTON_BASE_CLASS,\r\n BUTTON_FOCUS_STYLES,\r\n ButtonPadding,\r\n ButtonRounding,\r\n ButtonSize,\r\n ButtonTheme,\r\n getButtonTheme,\r\n} from '../button'\r\nimport { StepContent } from './step-content'\r\nimport { TourDefinition, TourStep } from './types'\r\n\r\ntype ExcludesFalse = (x: T | false) => x is T\r\n\r\n/**\r\n * Async load Shepherd module when we need it\r\n */\r\nlet shepherdLibrary: typeof Shepherd\r\nexport async function loadShepherdLibrary(setLoading: (state: boolean) => void) {\r\n if (shepherdLibrary) return shepherdLibrary\r\n\r\n try {\r\n setLoading(true)\r\n const shepherdPromise = await import('shepherd.js')\r\n shepherdLibrary = shepherdPromise.default\r\n setLoading(false)\r\n\r\n return shepherdLibrary\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Get buttons based on index in the step array\r\n */\r\nconst buttonClasses = classnames(BUTTON_BASE_CLASS, BUTTON_FOCUS_STYLES, ButtonSize.regular, ButtonRounding.regular)\r\nfunction getStepButtons(tour: Shepherd.Tour, step: TourStep, index: number, arr: TourStep[]) {\r\n return [\r\n {\r\n action: tour.complete,\r\n classes: classnames(\r\n buttonClasses,\r\n 'mr-auto',\r\n getButtonTheme({ theme: ButtonTheme.light }).button,\r\n ButtonPadding.regular\r\n ),\r\n text: 'Exit',\r\n },\r\n index > 0 && {\r\n action: tour.back,\r\n classes: classnames(buttonClasses, getButtonTheme({ theme: ButtonTheme.light }).button, ButtonPadding.regular),\r\n text: step.backButton ?? 'Back',\r\n },\r\n {\r\n classes: classnames(buttonClasses, getButtonTheme({ theme: ButtonTheme.blue }).button, ButtonPadding.regular),\r\n action: tour.next,\r\n text: step.nextButton ?? (index === arr.length - 1 ? 'Finish' : 'Next'),\r\n },\r\n ].filter(Boolean as unknown as ExcludesFalse)\r\n}\r\n\r\n/**\r\n * Convert tour steps to Shepherd steps\r\n */\r\nexport function processSteps(tour: Shepherd.Tour, steps: TourStep[]): Shepherd.StepOptions[] {\r\n return steps.map((step, index) => ({\r\n attachTo: { element: step.target, on: step.placement ?? 'auto' },\r\n classes: 'z-dialog bg-transparent m-0',\r\n floatingUIOptions: {\r\n middleware: [shift({ padding: 10 }), offset(step.offset ?? { mainAxis: 10, crossAxis: 0 })],\r\n },\r\n // Render the body\r\n text: ReactDOM.renderToString(React.createElement(StepContent, { step })),\r\n // Add buttons\r\n buttons: getStepButtons(tour, step, index, steps),\r\n modalOverlayOpeningRadius: step.overlayRadius ?? 8,\r\n modalOverlayOpeningPadding: step.overlayPadding ?? 0,\r\n }))\r\n}\r\n\r\nexport function getTourKey() {\r\n return `tour${window.location.pathname.replace(/[/.]/g, '-')}`\r\n}\r\n\r\nexport function getStepsForUser(tours: TourDefinition[]) {\r\n const lastFinishedTour = localStorage?.getItem(getTourKey())\r\n const lastTourIndex = tours.findIndex((tour) => tour.id === lastFinishedTour)\r\n const allToursViewed = lastTourIndex === tours.length - 1 || tours.slice(lastTourIndex + 1).every((item) => item.skip)\r\n const toursToView = allToursViewed ? tours : tours.slice(lastTourIndex + 1)\r\n const userTour = toursToView.reduce(\r\n (acc, current) =>\r\n current.skip\r\n ? acc\r\n : {\r\n ...acc,\r\n id: current.id,\r\n steps: [...acc.steps, ...current.steps],\r\n },\r\n { id: 'tour', steps: [], initialTour: toursToView[0].id }\r\n )\r\n\r\n return { hasNewTours: !allToursViewed, tour: userTour }\r\n}\r\n\r\nexport function completeTour(key: string) {\r\n localStorage?.setItem(getTourKey(), key)\r\n}\r\n","import * as React from 'react'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport { TourDefinition } from './types'\r\nimport * as tourUtils from './utils'\r\n\r\nexport const DEFAULT_OPTIONS = {\r\n exitOnEsc: true,\r\n useModalOverlay: true,\r\n}\r\n\r\n/**\r\n * Hook which controls shepherd.js. The library is lazy-loaded when the tour starts\r\n *\r\n * Returns:\r\n * - `isLoading`: state of the library loading\r\n * - `currentTour`: tour object, only defined after library has loaded\r\n * - `startTour`: load the library and start tour. Returns `currentTour`\r\n * - `getStepsForUser`: returns a list of tour steps based on tours the user finished\r\n * - `completeTour`: persists the last finished tour to local storage\r\n */\r\nexport function useTour(options?: Shepherd.TourOptions) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [currentTour, setTour] = React.useState(null)\r\n\r\n /**\r\n * We’re loading shepherd asynchronously and want to have loading state so we use\r\n * AbortController to check if the component is still mounted.\r\n */\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const loadingSetter = React.useRef((state: boolean) => {\r\n if (controller.current?.signal.aborted) return\r\n\r\n setIsLoading(state)\r\n })\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n const startTour = React.useCallback(\r\n async (definition: TourDefinition, setComplete = true) => {\r\n const shepherdLibrary = await tourUtils.loadShepherdLibrary(loadingSetter.current)\r\n\r\n if (shepherdLibrary && !controller.current?.signal.aborted) {\r\n const tour = currentTour ?? new shepherdLibrary.Tour({ ...DEFAULT_OPTIONS, ...options })\r\n\r\n if (!currentTour) setTour(tour)\r\n\r\n // Reset the tour steps in case they were updated\r\n Array.from(tour.steps).forEach((step) => tour.removeStep(step.id))\r\n\r\n const processedSteps = tourUtils.processSteps(tour, definition.steps)\r\n tour.addSteps(processedSteps)\r\n\r\n if (setComplete) {\r\n tourUtils.completeTour(definition.id)\r\n }\r\n\r\n void tour.start()\r\n window.gtag?.('event', 'tour-start', { event_label: definition.initialTour ?? definition.id })\r\n\r\n return tour\r\n }\r\n },\r\n [currentTour, options]\r\n )\r\n\r\n return {\r\n isLoading,\r\n currentTour,\r\n startTour,\r\n getStepsForUser: tourUtils.getStepsForUser,\r\n completeTour: tourUtils.completeTour,\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-duplicate-enum-values */\r\nimport * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps } from '../button'\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum TabSpacing {\r\n xxsmall = 'space-x-0.5', // 2px spacing\r\n xsmall = 'space-x-1', // 4px spacing\r\n none = 'space-x-1.5', // 6px spacing\r\n small = 'space-x-1.5', // 6px spacing\r\n regular = 'space-x-1.5', // 6px spacing\r\n medium = 'space-x-2', // 8px spacing\r\n large = 'space-x-2', // 8px spacing\r\n xlarge = 'space-x-2', // 8px spacing\r\n}\r\n\r\nfunction getRightContent(content: JSX.Element | IconNameType | undefined, isActive: boolean) {\r\n if (isValidIconName(content)) return \r\n else if (React.isValidElement(content))\r\n return React.cloneElement(content as React.ReactElement<{ active: boolean }>, {\r\n active: isActive,\r\n })\r\n else return content\r\n}\r\n\r\nconst InternalTab = React.forwardRef(function InternalTab<\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n {\r\n rounding = 'none',\r\n theme = 'tab',\r\n size = 'medium',\r\n 'aria-selected': ariaSelected,\r\n children,\r\n ...props\r\n }: Omit, 'theme'>,\r\n ref: React.ForwardedRef\r\n) {\r\n const spacing = TabSpacing[size]\r\n const active = Boolean(ariaSelected)\r\n const rightContent = getRightContent(props.rightContent, active)\r\n\r\n return (\r\n )}\r\n ref={ref}\r\n active={active}\r\n theme={theme}\r\n size={size}\r\n rounding={rounding}\r\n rightContent={undefined}\r\n className={classNames('group/badge', props.className)}\r\n contentClass={classNames(spacing, 'flex', props.contentClass)}\r\n >\r\n {children}\r\n {rightContent}\r\n \r\n )\r\n})\r\n\r\nexport function Tab(\r\n props: React.PropsWithChildren>\r\n) {\r\n return } />\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\n\r\nexport function TabList(props: Ariakit.TabListProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function TabPanel(props: Ariakit.TabPanelProps) {\r\n return \r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function Tabs({ children }: React.PropsWithChildren) {\r\n return (\r\n \r\n
{children}
\r\n
\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nenum BadgeSize {\r\n small = 'h-4 min-w-4', // 16px height\r\n medium = 'h-5 min-w-5', // 20px height\r\n}\r\ntype BadgeSizeType = keyof typeof BadgeSize\r\n\r\nenum BadgePadding {\r\n small = 'px-2 py-0', // 16px height\r\n medium = 'px-1.5 py-0.5', // 20px height\r\n}\r\ntype BadgePaddingType = keyof typeof BadgePadding\r\n\r\ntype BadgeProps = {\r\n className?: string\r\n size?: BadgeSizeType\r\n padding?: BadgePaddingType\r\n active?: boolean\r\n}\r\n\r\nexport function Badge({\r\n className,\r\n size = 'medium',\r\n padding = size,\r\n active,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const badgePadding = BadgePadding[padding]\r\n const badgeSize = BadgeSize[size]\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nenum TagSize {\r\n small = 'h-4 min-w-4', // 16px height\r\n medium = 'h-5 min-w-5', // 20px height\r\n large = 'min-w-5',\r\n}\r\ntype TagSizeType = keyof typeof TagSize\r\n\r\nenum TagPadding {\r\n small = 'px-[5px] py-0', // 16px height\r\n medium = 'px-1.5 py-0.5', // 20px height\r\n large = 'p-3',\r\n}\r\ntype TagPaddingType = keyof typeof TagPadding\r\n\r\nenum TagFont {\r\n small = 'text-3xs leading-3', // 10px/12px\r\n medium = 'text-2xs leading-4', // 12px/16px\r\n large = 'text-sm',\r\n}\r\n\r\nenum TagVariant {\r\n filled = 'border border-bg-primary bg-gray-50 text-gray-600 font-medium dark:bg-gray-600 dark:text-gray-50',\r\n bordered = 'border border-primary text-muted',\r\n}\r\n\r\ntype TagVariantType = keyof typeof TagVariant\r\n\r\nenum TagRounding {\r\n small = 'rounded-sm',\r\n // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\r\n medium = 'rounded-sm',\r\n large = 'rounded-md',\r\n}\r\n\r\ntype TagProps = {\r\n size?: TagSizeType\r\n padding?: TagPaddingType\r\n variant?: TagVariantType\r\n className?: string\r\n}\r\n\r\nexport function Tag({\r\n className,\r\n size = 'medium',\r\n padding = size,\r\n variant = 'filled',\r\n children,\r\n}: React.PropsWithChildren) {\r\n const tagPadding = TagPadding[padding]\r\n const tagSize = TagSize[size]\r\n const tagFont = TagFont[size]\r\n const tagRounding = TagRounding[size]\r\n const tagVariant = TagVariant[variant]\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\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-gray-200 dark: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 * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position?: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const [notification, setNotification] = React.useState(null)\r\n const { viewport, setViewport } = useVisualViewport({ enabled: !!notification })\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getVisualViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n setIsOpen(true)\r\n },\r\n hide: () => setIsOpen(false),\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Ariakit.Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {isOpen && (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\nexport enum NotificationTheme {\r\n default,\r\n success,\r\n failure,\r\n}\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n /**\r\n * Default button text\r\n * @default Close\r\n */\r\n closeText?: string\r\n\r\n theme?: NotificationTheme\r\n\r\n /**\r\n * Custom buttons. Overrides `closeText`\r\n */\r\n actions?: JSX.Element\r\n\r\n /**\r\n * When set, the notification will automatically close\r\n */\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification({\r\n className,\r\n closeText = 'Close',\r\n actions,\r\n timeoutInMs,\r\n theme = NotificationTheme.default,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: number\r\n if (timeoutInMs) {\r\n timeoutId = window.setTimeout(() => {\r\n notification.hide()\r\n }, timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, timeoutInMs])\r\n\r\n return (\r\n \r\n
{children}
\r\n
\r\n {actions ?? (\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren } from 'react'\r\n\r\nexport function Centered(props: PropsWithChildren>) {\r\n return
\r\n}\r\n","import { link } from '../../services/routing'\r\nimport { Button } from '../button'\r\nimport { Centered } from '../centered'\r\nimport { Icon } from '../icon'\r\nimport { Heading, Paragraph } from '../typography'\r\n\r\ninterface Props {\r\n onRetry?: () => void\r\n}\r\n\r\nexport function SearchError({ onRetry }: Props) {\r\n return (\r\n \r\n \r\n \r\n Error fetching the results\r\n \r\n \r\n There’s been an error fetching your results. Please try again or{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n {onRetry && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport { Link, useInRouterContext } from 'react-router-dom'\r\n\r\nimport { ComboBoxItem, ComboBoxProps } from '../combo-box'\r\nimport { Highlight } from '../highlight'\r\nimport { PropsWithAs } from '../types'\r\nimport { SearchListItem } from './constants'\r\n\r\ninterface SearchItemProps extends Pick, Partial> {\r\n item: SearchListItem\r\n}\r\n\r\nfunction getItemHrefProps(item: SearchListItem, inRouterContext?: boolean) {\r\n if (item.href) {\r\n if (inRouterContext) return { as: Link, to: item.href, reloadDocument: item.reloadDocument, target: item.target }\r\n else return { as: 'a' as React.ElementType, href: item.href, target: item.target }\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nexport function SearchItem({ item, state, ...props }: SearchItemProps) {\r\n const value = state.useState('value')\r\n const isInRouterContext = useInRouterContext()\r\n\r\n const itemProps = getItemHrefProps(item, isInRouterContext)\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n {item.subtitle && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { Centered } from '../centered'\r\nimport { Spinner } from '../spinner'\r\nimport { SearchListItem } from './constants'\r\nimport { SearchItem } from './search-item'\r\n\r\ninterface SearchListProps {\r\n /**\r\n * Ariakit combobox store for managing the search list state\r\n */\r\n state: Ariakit.ComboboxStore\r\n\r\n /**\r\n * Array of items to display in the search list\r\n */\r\n items?: SearchListItem[]\r\n\r\n /**\r\n * Custom footer content shown at the bottom of the search list\r\n */\r\n footer?: React.ReactNode\r\n\r\n /**\r\n * Whether the list is currently loading\r\n *\r\n * @default false\r\n */\r\n isLoading?: boolean\r\n}\r\n\r\nexport function SearchList({\r\n state,\r\n children,\r\n items,\r\n footer,\r\n isLoading = false,\r\n}: React.PropsWithChildren) {\r\n const isOpen = state.useState('open')\r\n const hasContent = React.Children.count(children) > 0 || (items?.length ?? 0) > 0 || !!footer || isLoading\r\n const { hide } = state\r\n\r\n React.useEffect(() => {\r\n if (!hasContent && isOpen) {\r\n hide()\r\n }\r\n }, [hide, hasContent, isOpen])\r\n\r\n if (isLoading) {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n
\r\n
\r\n {children ?? items?.map((item) => )}\r\n
\r\n {footer}\r\n
\r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { SearchProps } from './search'\r\n\r\ninterface Props extends Pick {\r\n children: React.ReactNode\r\n}\r\n\r\nfunction getSelectedItem({\r\n value,\r\n items,\r\n}: {\r\n value?: Ariakit.ComboboxStoreProps['selectedValue']\r\n items: SearchProps['items']\r\n}) {\r\n return items?.find((item) => item.value === value)\r\n}\r\n\r\nexport function SearchNavigationWrapperInRouterContext({ state, children, items }: Props) {\r\n const navigate = useNavigate()\r\n const selectedValue = state.useState('selectedValue')\r\n React.useEffect(() => {\r\n const { href, reloadDocument } = getSelectedItem({ value: selectedValue, items }) ?? {}\r\n if (href) {\r\n if (reloadDocument) {\r\n window.location.href = href\r\n } else {\r\n navigate(href)\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectedValue])\r\n\r\n return children\r\n}\r\n\r\nexport function SearchNavigationWrapperOutsideRouterContext({ state, children, items }: Props) {\r\n const selectedValue = state.useState('selectedValue')\r\n React.useEffect(() => {\r\n const href = getSelectedItem({ value: selectedValue, items })?.href\r\n\r\n if (href) {\r\n window.location.href = href\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectedValue])\r\n\r\n return children\r\n}\r\n","import * as React from 'react'\r\nimport { useInRouterContext } from 'react-router-dom'\r\n\r\nimport { ComboBox, ComboBoxProps } from '../combo-box'\r\nimport { IconNameType } from '../icon'\r\nimport { SearchListItem } from './constants'\r\nimport { SearchError } from './search-error'\r\nimport { SearchList } from './search-list'\r\nimport {\r\n SearchNavigationWrapperInRouterContext,\r\n SearchNavigationWrapperOutsideRouterContext,\r\n} from './search-navigation-wrapper'\r\n\r\nexport interface SearchProps\r\n extends Pick<\r\n ComboBoxProps,\r\n 'state' | 'autoFocus' | 'inputProps' | 'popoverProps' | 'aria-label' | 'inputTestId' | 'getInputValue'\r\n > {\r\n /**\r\n * Array of items to display in the search list\r\n */\r\n items?: SearchListItem[]\r\n\r\n /**\r\n * Minimum length of input value before showing results\r\n *\r\n * @default 1\r\n */\r\n minValueLength?: number\r\n\r\n /**\r\n * Placeholder text for the search input\r\n */\r\n placeholder?: string\r\n\r\n /**\r\n * Content to show on the right side of the input (icon or custom element)\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Custom footer content shown at the bottom of the search results\r\n */\r\n footer?: React.ReactNode\r\n\r\n /**\r\n * Whether to show the search icon in the input\r\n *\r\n * @default true\r\n */\r\n hasSearchIcon?: boolean\r\n\r\n /**\r\n * Whether to match the width of the input and its dropdown box\r\n */\r\n isMatchInputAndBoxWidth?: boolean\r\n\r\n /**\r\n * Whether the search is currently loading results\r\n *\r\n * @default false\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Whether there was an error loading the search results\r\n *\r\n * @default false\r\n */\r\n isError?: boolean\r\n\r\n /**\r\n * Callback function to retry when there's an error\r\n */\r\n onErrorRetry?: () => void\r\n}\r\n\r\nexport function Search({\r\n state,\r\n children,\r\n items,\r\n footer,\r\n 'aria-label': ariaLabel,\r\n inputProps,\r\n popoverProps,\r\n inputTestId,\r\n minValueLength = 1,\r\n hasSearchIcon = true,\r\n isLoading = false,\r\n isError = false,\r\n onErrorRetry,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const isInRouterContext = useInRouterContext()\r\n const isMounted = state.useState('mounted')\r\n\r\n const Wrapper = isInRouterContext\r\n ? SearchNavigationWrapperInRouterContext\r\n : SearchNavigationWrapperOutsideRouterContext\r\n\r\n return (\r\n \r\n {\r\n // prevent combobox from setting input value on input blur\r\n e.preventDefault()\r\n },\r\n leftContent: hasSearchIcon ? 'search' : undefined,\r\n ...inputProps,\r\n }}\r\n popoverProps={{\r\n sameWidth: props.isMatchInputAndBoxWidth,\r\n fitViewport: !props.isMatchInputAndBoxWidth,\r\n ...popoverProps,\r\n }}\r\n inputTestId={inputTestId}\r\n getInputValue={props.getInputValue}\r\n >\r\n {isMounted &&\r\n (isError ? (\r\n \r\n ) : (\r\n \r\n {children}\r\n \r\n ))}\r\n \r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\nimport { useComboBoxState } from '../combo-box'\r\n\r\nexport function useSearchComboboxState(props: Ariakit.ComboboxStoreProps = {}) {\r\n return useComboBoxState({\r\n placement: 'bottom-start',\r\n defaultSelectedValue: '',\r\n ...props,\r\n })\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { Icon } from '../icon'\r\n\r\nconst imgFromUrlToBase64 = (url: string) =>\r\n fetch(url).then(async (response) => URL.createObjectURL(await response.blob()))\r\n\r\nexport interface DownloadImageButtonProps {\r\n /**\r\n * The URL of the image to download. If not provided, button will be disabled\r\n */\r\n downloadUrl?: string | null\r\n\r\n /**\r\n * Optional base64 encoded image data. If provided, this will be used instead of downloadUrl\r\n */\r\n base64ImageData?: string | null\r\n}\r\n\r\nexport function DownloadImageButton({ downloadUrl, base64ImageData: dataUrl }: DownloadImageButtonProps) {\r\n const fileName = React.useMemo(() => {\r\n const name = downloadUrl?.split(/[/?#]/).pop() ?? 'image'\r\n return name.includes('.') ? name : `${name}.png`\r\n }, [downloadUrl])\r\n\r\n const [imageUri, setImageUri] = React.useState(null)\r\n React.useEffect(() => {\r\n const val = dataUrl || downloadUrl\r\n if (!val) return\r\n imgFromUrlToBase64(val)\r\n .then(setImageUri)\r\n .catch(() => {})\r\n }, [dataUrl, downloadUrl])\r\n\r\n return (\r\n imageUri && (\r\n {\r\n window.gtag?.('event', 'click', { event_category: 'social-share-image-download' })\r\n }}\r\n size=\"small\"\r\n contentClass=\"flex items-center\"\r\n leftContent={}\r\n >\r\n Download\r\n \r\n )\r\n )\r\n}\r\n","import { FacebookIcon, FacebookShareButton, TwitterIcon, TwitterShareButton } from 'react-share'\r\n\r\nimport { Button } from '../button'\r\nimport { CopyToClipboard } from '../copy-to-clipboard'\r\nimport { Heading } from '../typography'\r\nimport { DownloadImageButton } from './DownloadImageButton'\r\n\r\nexport function SocialShare({\r\n shareUrl,\r\n title,\r\n imageToDownloadURL,\r\n imageToDownloadBase64Data,\r\n}: {\r\n shareUrl: string\r\n title: string\r\n imageToDownloadURL?: string\r\n imageToDownloadBase64Data?: string | null\r\n}) {\r\n return (\r\n \r\n Copy and paste link in email, website, or forum\r\n \r\n }\r\n text={shareUrl}\r\n bottomLeftContent={\r\n
\r\n \r\n {\r\n window.gtag?.('event', 'click', { event_category: 'social-share-facebook-button' })\r\n }}\r\n leftContent={}\r\n >\r\n Share\r\n \r\n \r\n \r\n {\r\n window.gtag?.('event', 'click', { event_category: 'social-share-twitter-button' })\r\n }}\r\n leftContent={}\r\n >\r\n Twitter\r\n \r\n \r\n {imageToDownloadURL && (\r\n \r\n )}\r\n
\r\n }\r\n />\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","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { usePrevious } from '../hooks/use-previous'\r\nimport { Input, InputComponentProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipProps, TooltipTrigger } from './tooltip'\r\n\r\ninterface TooltipSettingsProps\r\n extends Pick,\r\n Pick {\r\n color?: keyof typeof TooltipColor\r\n}\r\n\r\ninterface TooltipInputProps extends InputComponentProps {\r\n /**\r\n * Settings for Tooltip component and useTooltipStore\r\n */\r\n tooltipSettings?: TooltipSettingsProps\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n { tooltipSettings, name, children, ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n const { color, gutter, placement = 'bottom', isPointerEventsEnabled } = tooltipSettings ?? {}\r\n const prevMessage = usePrevious(children, true)\r\n\r\n const [isFocused, setIsFocused] = React.useState(false)\r\n const handleFocus = React.useRef(() => setIsFocused(true))\r\n const handleBlur = React.useRef(() => setIsFocused(false))\r\n\r\n const input = \r\n if (!children && !prevMessage) return input\r\n\r\n return (\r\n \r\n \r\n \r\n {children ?? prevMessage}\r\n \r\n \r\n )\r\n}\r\n\r\nexport const TooltipInput = React.forwardRef(TooltipInputComponent)\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\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 | 'custom'\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 = color !== 'custom' ? TooltipColor[color] : null\r\n\r\n return (\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\nimport React, { ComponentProps, ElementType, HTMLProps, PropsWithChildren, ReactNode } from 'react'\r\n\r\nimport { PropsWithAs } from './types'\r\n\r\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6\r\n\r\ninterface HeadingProps {\r\n /**\r\n * Heading level\r\n */\r\n level: HeadingLevel\r\n}\r\n\r\nfunction getHeadingElement(level: HeadingLevel) {\r\n switch (level) {\r\n case 1:\r\n return 'h1'\r\n case 2:\r\n return 'h2'\r\n case 3:\r\n return 'h3'\r\n case 4:\r\n return 'h4'\r\n case 5:\r\n return 'h5'\r\n default:\r\n return 'h6'\r\n }\r\n}\r\n\r\nexport function Heading({\r\n as: asComponent,\r\n level,\r\n children,\r\n ...props\r\n}: PropsWithAs & PropsWithChildren) {\r\n return React.createElement(\r\n asComponent ?? getHeadingElement(level),\r\n {\r\n ...props,\r\n className: classnames(props.className, 'font-bold', {\r\n 'text-3xl': level === 1,\r\n 'text-2xl': level === 2,\r\n 'text-xl': level === 3,\r\n // We don't want to set any specific fontsize because it's used e.g. in DialogHeader\r\n // where it uses font-size: inherit; and is different on old/redesign versions\r\n 'leading-[1.375]': level === 4,\r\n 'text-sm': level === 5,\r\n 'text-2xs': level === 6,\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface ParagraphProps extends Omit>, 'size' | 'as'> {\r\n /**\r\n * Determines which element the text should render to\r\n *\r\n * @default p\r\n */\r\n as?: ElementType\r\n\r\n /**\r\n * Font size for the paragraph\r\n * - tiny - 10px\r\n * - small - 12px\r\n * - default - 14px\r\n * - medium - 16px\r\n * - large - 18px\r\n *\r\n * @default default\r\n */\r\n size?: 'tiny' | 'small' | 'default' | 'medium' | 'large'\r\n\r\n /**\r\n * Paragraph font weight\r\n */\r\n medium?: boolean\r\n}\r\n\r\nexport function Paragraph({\r\n as = 'p',\r\n size = 'default',\r\n medium,\r\n children,\r\n ...props\r\n}: PropsWithChildren>) {\r\n return React.createElement(\r\n as,\r\n {\r\n ...props,\r\n className: classnames(props.className, {\r\n 'font-medium': medium,\r\n 'text-lg': size === 'large',\r\n 'text-sm': size === 'default',\r\n 'text-2xs': size === 'small',\r\n 'text-3xs': size === 'tiny',\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface LabelProps extends Omit, 'title'> {\r\n title?: ReactNode\r\n titleClassName?: string\r\n isHorizontal?: boolean\r\n}\r\n\r\nexport function Label({ title, titleClassName, isHorizontal, children, ...props }: PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","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 hasEliteRedesign: 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 void 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 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 void 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 * as Sentry from '@sentry/browser'\r\n\r\nimport { PortfolioDefinition } from '../modules/portfolio/types'\r\nimport { PortfolioApiFields } from '../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: [PortfolioApiFields.UserPortfolios],\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: [PortfolioApiFields.TransactionLimit, PortfolioApiFields.NumberOfTransactions],\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 keepalive: true,\r\n query: {\r\n cookie: name,\r\n ...(value !== undefined && {\r\n value: value,\r\n }),\r\n },\r\n },\r\n true\r\n )\r\n}\r\n","import * as pathToRegexp from 'path-to-regexp'\r\n\r\nimport { getCurrency } from '../../app/crypto/currencyUtils'\r\nimport { cleanTicker } from '../util'\r\n\r\n/**\r\n * Compile route path by applying parameters to it\r\n *\r\n * @example\r\n * // Outputs /route/1?query=foo\r\n * compilePath('/route/:id?query=:query', { id: 1, query: 'foo' })\r\n */\r\nfunction compilePath(\r\n path: string,\r\n params?: pathToRegexp.ParamData,\r\n options?: pathToRegexp.ParseOptions & pathToRegexp.CompileOptions\r\n) {\r\n return pathToRegexp.compile(path, options)(params)\r\n}\r\n\r\nexport const path = {\r\n home: '/',\r\n news: '/news.ashx',\r\n screener: '/screener.ashx',\r\n charts: '/charts',\r\n groups: '/groups.ashx',\r\n portfolio: '/portfolio.ashx',\r\n insider: '/insidertrading.ashx',\r\n elite: '/elite.ashx',\r\n search: '/search.ashx\\\\?p=:ticker',\r\n quote: '/quote.ashx\\\\?t=:ticker',\r\n contact: '/contact.ashx',\r\n\r\n alerts: '/alerts.ashx',\r\n help: '/help/screener.ashx',\r\n account: '/myaccount.ashx',\r\n login: '/login.ashx',\r\n logout: '/logout.ashx',\r\n\r\n // Maps\r\n maps: '/map.ashx',\r\n bubbles: '/bubbles.ashx',\r\n\r\n // Futures\r\n futures: '/futures.ashx',\r\n futuresPerf: '/futures_performance.ashx',\r\n futuresCharts: '/futures_charts.ashx',\r\n futuresChartDetail: '/futures_charts.ashx\\\\?t=:ticker',\r\n\r\n // Forex\r\n forex: '/forex.ashx',\r\n forexPerf: '/forex_performance.ashx',\r\n forexCharts: '/forex_charts.ashx',\r\n forexChartDetail: '/forex_charts.ashx\\\\?t=:ticker',\r\n\r\n // Crypto\r\n crypto: '/crypto.ashx',\r\n cryptoPerf: '/crypto_performance.ashx',\r\n cryptoCharts: '/crypto_charts.ashx',\r\n cryptoChartDetail: '/crypto_charts.ashx\\\\?t=:ticker&c=:currency',\r\n\r\n // Backtsest\r\n backtests: '/backtests.ashx',\r\n backtestCreate: '/backtest_create.ashx',\r\n backtestDetail: '/backtest_detail.ashx\\\\?id=:backtestId',\r\n backtestPresets: 'backtests.ashx\\\\?presets=1',\r\n}\r\n\r\nexport const link = {\r\n toHome: () => path.home,\r\n toNews: () => path.news,\r\n toScreener: () => path.screener,\r\n toCharts: () => path.charts,\r\n toGroups: () => path.groups,\r\n toPortfolio: () => path.portfolio,\r\n toInsider: () => path.insider,\r\n toElite: () => path.elite,\r\n toSearch: (ticker: string) => compilePath(path.search, { ticker }),\r\n toQuote: (ticker: string) => compilePath(path.quote, { ticker }),\r\n toContact: () => path.contact,\r\n\r\n toAlerts: () => path.alerts,\r\n toHelp: () => path.help,\r\n toAccount: () => path.account,\r\n toLogin: () => path.login,\r\n toLogout: () => path.logout,\r\n\r\n toMaps: () => path.maps,\r\n toBubbles: () => path.bubbles,\r\n\r\n toFutures: () => path.futures,\r\n toFuturesPerf: () => path.futuresPerf,\r\n toFuturesCharts: () => path.futuresCharts,\r\n toFuturesChartDetail: (ticker: string) => compilePath(path.futuresChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toForex: () => path.forex,\r\n toForexPerf: () => path.forexPerf,\r\n toForexCharts: () => path.forexCharts,\r\n toForexChartDetail: (ticker: string) => compilePath(path.forexChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toCrypto: () => path.crypto,\r\n toCryptoPerf: () => path.cryptoPerf,\r\n toCryptoCharts: () => path.cryptoCharts,\r\n toCryptoChartDetail: (ticker: string) =>\r\n compilePath(path.cryptoChartDetail, { ticker: cleanTicker(ticker), currency: getCurrency(cleanTicker(ticker)) }),\r\n\r\n toBacktests: () => path.backtests,\r\n toBacktestCreate: () => path.backtestCreate,\r\n toBacktestDetail: (backtestId: string | number) =>\r\n compilePath(path.backtestDetail, { backtestId: String(backtestId) }),\r\n toBacktestPresets: () => path.backtestPresets,\r\n}\r\n","// Do not import anything in this file\r\n\r\nexport 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\r\nexport enum PortfolioApiFields {\r\n News = 'news',\r\n // User Portfolios\r\n UserPortfolios = 'portfolios',\r\n PortfolioLimit = 'limit',\r\n // Portfolio Detail\r\n SelectedPortfolioId = 'selectedPortfolio',\r\n SelectedPortfolio = 'portfolio',\r\n TransactionLimit = 'limitTransactions',\r\n TickerGroupsOnly = 'groupsOnly',\r\n NumberOfTransactions = 'transactions',\r\n}\r\n","import isPlainObject from 'lodash.isplainobject'\r\n\r\nimport { CRYPTO_TICKERS } from '../app/crypto/currencyUtils'\r\nimport { getCookie } from '../app/shared/cookie'\r\nimport { 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 getDecimalPlacesForValue(value: number, instrument: Instrument = Instrument.Stock) {\r\n if (value >= 100000) {\r\n return 0\r\n } else if (value >= 10000) {\r\n return 1\r\n } else if (instrument === Instrument.Stock && value < 1) {\r\n return 4\r\n } else if (value === undefined) {\r\n // if lastClose is not defined we'll always display 2 decimpal places, e.g. backtests, screener stats\r\n return 2\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nexport const FORMAT_PERCENT = { suffix: '%' }\r\nexport const FORMAT_PERCENT_CHANGE = { ...FORMAT_PERCENT, showPlusSign: true }\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 getNumberValue(value?: number) {\r\n if (value === undefined || isNaN(value)) return NaN\r\n return value\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 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":["DEFAULT_ACTIVE_CURRENCY","TILE_WIDTH","CURRENCIES_LAYOUT","USD","USDT","EUR","BTC","TICKERS_NOT_IN_DASHBOARD","CURRENCIES_LIST","Object","keys","CRYPTO_TICKERS","values","flat","getCurrency","ticker","endsWith","getActiveCurrency","queryString","activeCurrency","toUpperCase","includes","getActiveCurrencySparklineTickers","_TICKERS_NOT_IN_DASHB","getCurrencyLongName","currency","toLowerCase","MarketBadgeType","getMarketBadgeText","type","_date","Open","label","Closed","Premarket","Aftermarket","MarketBadge","_ref","badge","className","None","_jsx","classnames","UPDATE_INTERVAL","TimeBreakpointMode","BREAKPOINTS","minWidth","Infinity","marketBadgeText","timeFormat","getTimeState","fixedTime","hasUserPremium","arguments","length","undefined","FinvizSettings","time","getDate","isHoliday","isPremarket","isAftermarket","getMarketBadgeType","TooltipBadge","props","state","useTooltipState","placement","_jsxs","_Fragment","children","TooltipTrigger","Tooltip","Heading","level","StaticBadge","findMatchingBreakpoint","compareWidth","breakpoints","_matchingBreakpoints$","filter","breakpoint","pop","getCurrentWidth","mode","element","_element$clientWidth","window","innerWidth","clientWidth","Time","breakpointMode","ResizeObserver","useResizeObserver","rootRef","React","setState","currentBreakpoint","setBreakpoint","interval","setInterval","clearInterval","current","currentWidth","handleResize","throttle","foundBreakpoint","observer","entries","requestAnimationFrame","Array","isArray","observe","addEventListener","disconnect","removeEventListener","ref","getFormattedDateString","seed","date","Date","dateAsNY","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","isDst","dayNumber","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","setUTCHours","getWeekDay","toLocaleDateString","weekday","uppercase","name","month","toString","padStart","getTime","toLocaleString","hour","minute","hour12","TimeFormat","long","getFullYear","short","dateOnly","timeOnly","formatDate","value","inputOrOutputFormat","outputFormat","dateFns","isPremium","dayOfWeek","min","getMinutes","hours","getHours","HOLIDAY_DATES","test","day","find","holiday","getHoliday","getParsedCookies","cookieName","parseCookies","document","cookie","split","map","cookieString","reduce","acc","v","decodeURIComponent","trim","getCookie","re","RegExp","replace","setCookie","expires","toUTCString","location","hostname","matchesAndroid","navigator","userAgent","match","matchesWebOS","matchesIPhone","matchesiPad","matchesIPod","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","maxTouchPoints","matchesFirefox","matchesSafariDesktopLike","isMobileDevice","isMobile","isIphone","isIpad","isSafariDesktop","isIos","isFirefoxDesktop","TickerSearchItem","item","dataTestId","useState","isTickerWide","ComboBoxItem","contentClass","classNames","Highlight","text","highlight","company","exchange","getRedirectForTicker","tickerRaw","_FinvizSettings$quote","getSanitizedTicker","redirectLink","cleanTicker","getInstrumentForTicker","Instrument","Stock","link","toQuote","Forex","toForexChartDetail","Futures","toFuturesChartDetail","Crypto","toCryptoChartDetail","toSearch","quoteSearchExt","TickerSearch","_props$defaultPlaceme","_props$placeholder","isShowAllVisible","isSearchItemLink","chartIndex","searchComboboxState","useSearchComboboxState","defaultValue","defaultPlacement","setSelectedValue","_props$onTickerSelect","href","onTickerSelected","call","setTimeout","setValue","activeValue","data","error","isLoading","refetch","useQuery","searchApiRequest","enabled","keepPreviousData","cacheTime","staleTime","Search","inputProps","theme","maxLength","hasFocusStyle","size","placeholder","inputClass","rightContent","popoverProps","isMatchInputAndBoxWidth","inputTestId","footer","Button","as","isError","onErrorRetry","BoxRounding","BoxTheme","Box","rounding","ButtonSwitch","items","controlledValue","onChange","labelClassNames","groupRounding","activeTheme","restProps","internalValue","setInternalValue","handleChange","newValue","ButtonGroup","hasDivider","option","index","disabled","onClick","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","ButtonPadding","ButtonAlign","ButtonSquareSize","ButtonRounding","ButtonTheme","getButtonTheme","active","light","button","lightTransparent","dark","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","ColorVariant","CheckboxSize","CheckboxComponent","_props$checked","color","default","checked","defaultChecked","emerald","orange","teal","pink","lime","purple","green","yellow","gray","darkGray","width","Checkbox","forwardRef","clamp","num","max","isTouch","event","getRelativePosition","node","rect","getBoundingClientRect","pointer","touches","pageX","pageXOffset","top","pageY","pageYOffset","height","preventDefaultMove","preventDefault","DraggablePickerComponent","onMove","onKey","container","useRef","hasTouched","isDragging","setDragging","isValid","handleMove","useCallback","buttons","handleMoveStart","nativeEvent","handleKeyDown","keyCode","which","handleMoveEnd","toggleDocumentEvents","toggleEvent","useLayoutEffect","onTouchStart","onMouseDown","onKeyDown","tabIndex","DraggablePicker","memo","Pointer","style","backgroundColor","hexStringToRGBA","hexString","hexColor","removeHashSymbol","r","g","b","a","Number","Math","round","hexStringToHSVA","rgbaToHSVA","alphaToHex","alpha","rgbaToHexString","hsvaToHEXString","hsvaToRGBA","c","h","s","f","n","k","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","slice","String","parseInt","parseFloat","strColor","isValidColor","isRgb","startsWith","Option","convertColorToHEX","getIsRgb","rgbKeys","push","some","getHSVAFromColor","Alpha","changeLightness","pos","gradientPreview","useMemo","backgroundImage","DEFAULT_COLORS","title","ColorPalette","colors","lowerCaseColor","colorObj","isSelected","HueSaturation","position","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","isTooLight","getLumaFromRGBA","getIsColorTooLightOrTransparent","PickerInput","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","useEffect","handleColorInputChange","currentTarget","colorValue","Input","ColorPicker","canSelectCustom","canSelectAlpha","onPaletteItemClick","cachedColor","hsvaColor","setColor","popover","Ariakit","input","currentColor","newColor","onChangeCallback","stringColor","output","onSetCustomCodeClick","_prompt","prompt","alert","_hex","orignalColor","focus","preventScroll","InputColorPicker","inputDataTestId","popoverState","usePopoverState","PopoverTrigger","render","Popover","hideOnInteractOutside","backdrop","hide","MultiColorPicker","colorInputLabel","ColorTabButton","ButtonColorPicker","_ref3","buttonPickerDataTestId","isOpen","isMultiPicker","activeColorIndex","setActiveColorIndex","handleColorChange","originalColor","colorObject","_ref4","childComponent","_ref5","ComboBox","_props$autoFocus","ariaLabel","minValueLength","getInputValue","isMounted","inputValue","store","autoFocus","ev","_inputProps$onKeyDown","key","portal","gutter","unmountOnHide","DEFAULT_ELEMENT","ComboBoxItemButton","dataActiveItem","ComboBoxItemButtonWithRef","useComboBoxState","CopyToClipboard","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","timeout","resetTimer","clearTimeout","Textarea","readOnly","e","select","ZIndexContext","useZIndex","_React$useContext","useDialogState","settings","DialogDragContext","handleRef","boxPosition","x","y","resetBoxPosition","setBoxPosition","useDrag","dragging","handleElement","boxPositionRef","dragDiff","scrollX","scrollY","onMouseUp","onMouseMove","body","DropdownRounding","DropdownTheme","StatelessDropdown","trigger","modal","showOnHover","autoFocusOnShow","autoFocusOnHide","onFullyOpen","onFullyClosed","zIndex","updatePosition","usePopoverPlacement","isFullyOpen","setIsFullyOpen","wasMounted","usePrevious","menuGutter","parent","focusable","hideOnHoverOutside","preventBodyScroll","focusWithoutScroll","blurWithoutScroll","onTransitionEnd","target","Dropdown","orientation","focusLoop","virtualFocus","DropdownItemComponent","OptionButton","DropdownItem","useDropdownState","ErrorView","message","showContact","showRefresh","Paragraph","toContact","origin","pathname","search","DefaultErrorBoundary","Sentry","console","JSON","stringify","RouterErrorElement","useRouteError","indexOf","processedText","before","substring","after","Error","iconList","fileName","Boolean","join","isFinite","versionImages","Component","root","chartLayouts","chartTools","chartTypes","screener","add","arrowBackward","arrowDownShort","arrowForward","arrowUpShort","briefcase","calendar","caretDown","caretLeft","caretRight","caretUp","caretVertical","chartBar","chartBubble","chartPie","chartTable","chartTreemap","checkboxTick","chevronDown","chevronLeft","chevronRight","chevronUp","close","darkMode","diamondOutlined","done","drag","draw","empty","exitFullscreen","flash","fullscreen","gesture","gift","hamburger","help","idea","ideaLoad","ideaSave","import","info","lightMode","lock","lockOpened","menuClose","minus","more","note","openInNew","palette","profile","publish","refresh","remove","restore","settingsWheel","share","signOut","star","starOutlined","switchHorizontal","switchVertical","tabKey","template","trashCan","trendingDown","trendingUp","triangle","triangleOutlineDown","triangleOutlineUp","warning","layout1h1v","layout1h2v","layout1h3v","layout1l2r","layout1t2b","layout2h1v","layout2h2v","layout3h1v","layout3h2v","drawingActionDelete","drawingSettingAutosaveOff","drawingSettingAutosaveOn","drawingSettingAutosaveSaving","drawingSettingDrawingMode","drawingSettingDrawingModeActive","drawingSettingHide","drawingSettingLock","drawingSettingPreserveDrawings","drawingSettingPreserveDrawingsActive","drawingSettingShow","drawingSettingUnlock","toolArrow","toolAVWAP","toolBrush","toolCallout","toolCurve","toolElliottWave","toolEllipse","toolExpand","toolFibonacci","toolLine","toolMeasure","toolMidLineH","toolMidLineV","toolMouse","toolPitchfork","toolPolygon","toolPosition","toolRect","toolRectRotated","toolText","toolTriangle","toolXABCD","candleBarBasic","candleBarHeikinAshi","candleBarHollow","lineChartType","ohlcChartType","above","aboveEqual","abovePercent","below","belowEqual","belowPercent","between","crosses","crossesDown","crossesUp","equal","outside","ContextMenuInner","onClose","onContextMenu","MenuGroup","options","id","_item$onClick","_window$gtag","_window","gtag","assign","menu_option","ContextMenu","ChartGridCell","gridArea","GridLayout","columns","rows","border","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","InnerState","valueKey","changeKey","valueAccessor","RangeSize","RangeSlider","step","inputClassName","hasTrack","setHasTrack","trackRef","thumbRef","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","Label","ToolbarTheme","ToolbarDirection","ToolbarContext","direction","vertical","isWrapped","isStretched","useToolbarContext","getToolbarSettings","hasRedesignEnabled","horizontal","alternative","Toolbar","hasFocusRings","toolbarRef","contextProviderValue","toolbarSettings","forceReflow","originalWidth","offsetWidth","showTimeout","hideTimeout","Provider","querySelector","el","ToolbarButton","_props$appearance","_buttonSettings$size","_props$children","disabledTooltip","isInAction","isInActionProp","context","iconAction","buttonSettings","isActive","includeRedesign","grow","getButtonThemeSettings","getMainIcon","iconActive","menubar","blurOnHoverEnd","titleActive","Delayed","delay","delayComponent","Spinner","isMobileBrowser","ToolbarGroup","defaultItem","groupItems","groupTitle","useNativeSelect","rowId","selectedItem","setSelectedItem","groupId","toLocaleLowerCase","isAlternativeTheme","menu","menuButton","setMenuButton","open","mounted","anchorElement","parentMenu","menuContentElement","hideMenu","onMouseLeave","showMenu","show","handleMenuOpen","setDisclosureElement","setAnchorElement","NativeSelect","findIndex","onFocusVisible","onPointerDown","portalElement","ToolbarItem","isItemActive","ToolbarDivider","StepContent","shepherdLibrary","async","loadShepherdLibrary","setLoading","shepherdPromise","buttonClasses","getStepButtons","tour","arr","_step$backButton","_step$nextButton","action","complete","classes","back","backButton","next","nextButton","getTourKey","getStepsForUser","tours","_localStorage","lastFinishedTour","localStorage","getItem","lastTourIndex","allToursViewed","every","skip","toursToView","hasNewTours","steps","initialTour","completeTour","_localStorage2","setItem","DEFAULT_OPTIONS","exitOnEsc","useModalOverlay","useTour","setIsLoading","currentTour","setTour","controller","AbortController","loadingSetter","_controller$current","signal","aborted","_controller$current2","abort","startTour","definition","_controller$current3","setComplete","tourUtils","_definition$initialTo","Tour","from","forEach","removeStep","processedSteps","_step$placement","_step$offset","_step$overlayRadius","_step$overlayPadding","attachTo","on","floatingUIOptions","middleware","shift","offset","mainAxis","crossAxis","ReactDOM","modalOverlayOpeningRadius","overlayRadius","modalOverlayOpeningPadding","overlayPadding","addSteps","start","event_label","TabSpacing","InternalTab","ariaSelected","spacing","content","Tab","TabList","TabPanel","Tabs","BadgeSize","BadgePadding","Badge","badgePadding","badgeSize","TagSize","TagPadding","TagFont","TagVariant","TagRounding","Tag","variant","tagPadding","tagSize","tagFont","tagRounding","tagVariant","InputTheme","InputRounding","InputSize","getInputTheme","navigationBar","InputComponent","isHorizontalLabel","labelClassName","showNumberStepper","caption","isMobileStyleEnabled","inputTheme","isLeftStringIcon","isRightStringIcon","inputSize","commonSideContentClassnames","isHorizontal","InputCaption","TextareaComponent","textareaTheme","NotificationPosition","NotificationContext","useNotification","NotificationWrapper","setIsOpen","notification","setNotification","viewport","setViewport","useVisualViewport","getVisualViewport","visualViewport","positionClass","_notification$options","BottomLeft","TopLeft","TopRight","BottomRight","WrapperComponent","inline","role","hideOnEscape","transform","scale","willChange","withNotificationContext","WrappedComponent","_WrappedComponent$dis","displayName","WithNotificationContext","notificationContext","NotificationTheme","Notification","closeText","actions","timeoutInMs","timeoutId","success","failure","Centered","SearchError","onRetry","SearchItem","itemProps","inRouterContext","Link","to","reloadDocument","getItemHrefProps","useInRouterContext","subtitle","SearchList","_items$length","hasContent","count","getSelectedItem","SearchNavigationWrapperInRouterContext","navigate","useNavigate","selectedValue","_getSelectedItem","SearchNavigationWrapperOutsideRouterContext","_getSelectedItem2","hasSearchIcon","isInRouterContext","Wrapper","autoComplete","autoCorrect","autoCapitalize","onBlur","sameWidth","fitViewport","defaultSelectedValue","imgFromUrlToBase64","url","fetch","then","URL","createObjectURL","response","blob","DownloadImageButton","downloadUrl","base64ImageData","dataUrl","_downloadUrl$split$po","imageUri","setImageUri","val","catch","download","event_category","SocialShare","shareUrl","imageToDownloadURL","imageToDownloadBase64Data","FacebookShareButton","FacebookIcon","TwitterShareButton","via","_window$gtag2","_window2","TwitterIcon","isProgressBar","progress","radius","strokeWidth","circleXY","circumference","PI","viewBox","xmlns","cx","cy","strokeDasharray","strokeDashoffset","strokeLinecap","TooltipInputComponent","tooltipSettings","isPointerEventsEnabled","prevMessage","isFocused","setIsFocused","handleFocus","handleBlur","hideOnBlur","onFocus","TooltipInput","TooltipBox","tooltipColor","TooltipColor","isIosBrowser","TOOLTIP_WRAPPER_PROPS","stateObject","wrapperProps","TooltipArrow","isHideOnClick","onMouseEnter","TooltipProvider","transformMap","auto","right","bottom","positionMain","arrowColor","d","getHeadingElement","titleClassName","SETTINGS_CONTEXT_DEFAULT","nodeChartsDomain","email","hasDarkTheme","hasEliteRedesign","SettingsContext","createContext","useSettings","useContext","setResizeObserver","loadResizeObserverPolyfill","polyfill","getPlacementZIndex","changeZIndex","computedZIndex","removeProperty","classList","popoverElement","contextZIndex","overlayElement","previousElementSibling","dataset","ContentType","ThrowableError","constructor","status","extra","super","_defineProperty","this","isServerError","apiRequest","_ContentType","query","headers","throwOnAllErrors","requestUrl","URLSearchParams","requestOptions","ApplicationJson","cancelableRequest","textResponse","responseContentType","get","Html","parsedResponse","contentType","ApplicationJsonUTF","FormUrlEncoded","parse","parseResponseForContentType","ok","statusText","rayId","scope","setContext","cancel","portfoliosRequest","fields","PortfolioApiFields","UserPortfolios","lastCloseRequest","t","portfolioLimitRequest","portfolioId","pid","TransactionLimit","NumberOfTransactions","setCookieRequest","keepalive","compilePath","path","params","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","cleanedTicker","resizeObserverPolyfill","getIsBrave","brave","isBrave","deserializeFeatureFlags","flags","fromEntries","serializeFeatureFlags","ChildPosition","getFlexAlignClasses","topLeft","bottomLeft","leftCenter","topCenter","bottomCenter","topRight","bottomRight","rightCenter","intlCache","dollarIntlCache","getIntl","fractions","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","getDollarIntl","shortFormatNumber","showPlusSign","multiply","suffix","extraSuffix","absValue","abs","format","shortFormatDollar","getDecimalPlacesForValue","instrument","FORMAT_PERCENT","FORMAT_PERCENT_CHANGE","formatNumber","fixedValue","toFixed","signPrefix","formatDollar","formatted","sortByColumn","localeCompare","sortNullAsLast","ignoreNullForComparison","moveItemInArray","sourceIndex","destinationIndex","removed","splice","getUuid","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","getRandomValues","Uint8Array","ariaHasPopup","getNavigationLinkUrl","preservedKeys","removeQueryKeys","additionalQueryValues","newUrl","searchParams","delete","set","getElitePageLink","campaign","getNumberValue","isNaN","NaN","dateStrToDate","dateStr","dateStrToTimestamp","getEarningsDateSuffix","getSanitizedSingleTicker","rawTicker","specialTickers"],"sourceRoot":""}