{"version":3,"file":"home.680c8e60.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/home/market_sentiment.tsx","webpack://@finviz/website/./js/app/home/refresh.ts","webpack://@finviz/website/./js/app/home/indices-data.ts","webpack://@finviz/website/./js/app/home/signals-switch/types.ts","webpack://@finviz/website/./js/app/home/signals-switch/EliteSwitch.tsx","webpack://@finviz/website/./js/app/home/signals-switch/FreeSwitch.tsx","webpack://@finviz/website/./js/app/home/signals-switch/index.tsx","webpack://@finviz/website/./js/app/home/index.tsx","webpack://@finviz/website/./js/app/maps/services/api.ts","webpack://@finviz/website/./js/app/maps/store/action-creators.ts","webpack://@finviz/website/./js/app/maps/store/appDispatcher.ts","webpack://@finviz/website/./js/app/maps/store/constants.ts","webpack://@finviz/website/./js/app/maps/store/store.ts","webpack://@finviz/website/./js/app/maps/store/mapStore.ts","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/parseJSONFromScript.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/components/button-switch/button-switch.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/copy-to-clipboard/copy-to-clipboard.tsx","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/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/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/social-share/DownloadImageButton.tsx","webpack://@finviz/website/./js/main/components/social-share/SocialShare.tsx","webpack://@finviz/website/./js/main/components/tooltip-input.tsx","webpack://@finviz/website/./js/main/hooks/use-track-pageview.ts","webpack://@finviz/website/../charts/app/constants/common.ts","webpack://@finviz/website/../charts/app/utils.ts","webpack://@finviz/website/../charts/app/utils/helpers.ts"],"sourcesContent":["import { Component, MouseEvent } from 'react'\r\nimport ReactDOM from 'react-dom/client'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../main/services/api'\r\nimport { Instrument } from '../../main/types'\r\nimport {\r\n  ChartElementType,\r\n  ChartLayout,\r\n  LayoutType,\r\n  Quote,\r\n  RootChartConfigObject,\r\n  ScaleType,\r\n  TIMEFRAME,\r\n  Theme,\r\n} from '../charts-lib'\r\n\r\nconst ticker = 'market_sentiment'\r\n\r\nconst MARKET_SENTIMENT_WIDTH_PX = 160\r\nconst MARKET_SENTIMENT_HEIGHT_PX = 40\r\nconst marketSentimentChartConfig: RootChartConfigObject = {\r\n  layout: LayoutType['1h1v'],\r\n  theme: FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light,\r\n  width: MARKET_SENTIMENT_WIDTH_PX,\r\n  height: MARKET_SENTIMENT_HEIGHT_PX,\r\n  scrollable: false,\r\n  editable: false,\r\n  cross: false,\r\n  charts: [\r\n    {\r\n      width: MARKET_SENTIMENT_WIDTH_PX,\r\n      height: MARKET_SENTIMENT_HEIGHT_PX,\r\n      timeframe: TIMEFRAME.i3,\r\n      scale: ScaleType.Linear,\r\n      ticker: ticker,\r\n      instrument: Instrument.MarketSentiment,\r\n      refreshData: false,\r\n      premarket: false,\r\n      aftermarket: false,\r\n      dateRange: null,\r\n      stretch: true,\r\n      panes: [\r\n        {\r\n          height: MARKET_SENTIMENT_HEIGHT_PX,\r\n          elements: [\r\n            {\r\n              type: ChartElementType.MarketSentiment,\r\n              overlays: [],\r\n            },\r\n          ],\r\n        },\r\n      ],\r\n    },\r\n  ],\r\n}\r\n\r\ninterface MarketSentimentState {\r\n  loading: boolean\r\n  enabled: boolean\r\n  chartConfig: RootChartConfigObject | null\r\n}\r\n\r\nclass MarketSentiment extends Component {\r\n  state: MarketSentimentState = {\r\n    loading: true,\r\n    enabled: false,\r\n    chartConfig: null,\r\n  }\r\n\r\n  _timer: number | null = null\r\n  _lastRequest: CancelablePromise<any> | null = null\r\n\r\n  componentDidMount() {\r\n    void this._fetchData('', () => {\r\n      this.setState({ chartConfig: marketSentimentChartConfig })\r\n    })\r\n  }\r\n\r\n  componentWillUnmount() {\r\n    if (this._timer !== null) {\r\n      this._lastRequest?.cancel?.()\r\n      clearTimeout(this._timer)\r\n    }\r\n  }\r\n\r\n  render() {\r\n    const { loading, enabled, chartConfig } = this.state\r\n\r\n    return (\r\n      <table\r\n        width=\"221\"\r\n        cellPadding=\"0\"\r\n        cellSpacing=\"0\"\r\n        // @ts-ignore\r\n        border=\"0\"\r\n        style={{ visibility: loading ? 'hidden' : 'visible' }}\r\n      >\r\n        <tbody>\r\n          <tr>\r\n            <td data-boxover=\"cssbody=[tooltip_bdy] cssheader=[tooltip_hdr] header=[Where will S&P 500 be in the next 5 minutes?] body=[<table width=300><tr><td class='tooltip_tab'>Click <b>BULL</b> for positive market sentiment<br>Click <b>BEAR</b> for negative market sentiment</td></tr></table>] offsetx=[-200] offsety=[20] delay=[100]\">\r\n              {chartConfig && (\r\n                <div id=\"js-market-sentiment-chart\" style={{ width: 160, height: 40 }}>\r\n                  <ChartLayout config={chartConfig} />\r\n                </div>\r\n              )}\r\n            </td>\r\n            <td valign=\"top\">\r\n              <button\r\n                id=\"msb_bull\"\r\n                className=\"market-sentiment_bull\"\r\n                disabled={!enabled}\r\n                onClick={(e) => this._vote(e, 'bull')}\r\n              >\r\n                Bull\r\n              </button>\r\n              <img\r\n                src=\"gfx/home/msb_separator.gif\"\r\n                width=\"61\"\r\n                height=\"1\"\r\n                alt=\"\"\r\n                // @ts-ignore\r\n                border=\"0\"\r\n                style={{ display: FinvizSettings.hasRedesignEnabled ? 'none' : 'block' }}\r\n              />\r\n              <button\r\n                id=\"msb_bear\"\r\n                className=\"market-sentiment_bear\"\r\n                disabled={!enabled}\r\n                onClick={(e) => this._vote(e, 'bear')}\r\n              >\r\n                Bear\r\n              </button>\r\n            </td>\r\n          </tr>\r\n        </tbody>\r\n      </table>\r\n    )\r\n  }\r\n\r\n  _vote(e: MouseEvent, sentiment: string) {\r\n    e.preventDefault()\r\n    this.setState({ enabled: false })\r\n    void this._fetchData('?b=' + sentiment, undefined, false)\r\n  }\r\n\r\n  _fetchData = async (urlQuery = '', callback?: () => void, setTimer = true) => {\r\n    if (setTimer && this._timer !== null) clearTimeout(this._timer)\r\n\r\n    if (document.hidden) {\r\n      // console.log(`${+new Date()} Document is hidden, canceling refresh`)\r\n      if (setTimer) this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), 1000)\r\n      return\r\n    }\r\n\r\n    // console.log(`${+new Date()} Document is visible, refreshing`)\r\n\r\n    this._lastRequest = apiRequest<QuoteData>(`/api/market_sentiment.ashx${urlQuery}`)\r\n    const json = await this._lastRequest\r\n    if (json) {\r\n      const quoteData = getData(json)\r\n      const quote = Quote.findByAttribute('ticker', ticker)\r\n      if (quote) {\r\n        Quote.findByAttribute('ticker', ticker)!.updateAttributes(getData(json))\r\n      } else {\r\n        Quote.create(quoteData).save()\r\n      }\r\n      callback?.()\r\n\r\n      this.setState({\r\n        loading: false,\r\n        enabled: json.enabled,\r\n      })\r\n    }\r\n\r\n    if (setTimer) {\r\n      this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), (json?.refresh ?? 30) * 1000)\r\n    }\r\n  }\r\n}\r\n\r\ninterface QuoteData {\r\n  refresh: number\r\n  enabled: boolean\r\n  sum: number[]\r\n  weight: number[]\r\n  time: string\r\n  visibleMinutes: number\r\n}\r\n\r\nfunction getData(data: QuoteData) {\r\n  return {\r\n    close: data.sum,\r\n    volume: data.weight,\r\n    date: Array.from('1'.repeat(data.sum.length)).map((x) => parseInt(x, 10)),\r\n    ticker: ticker,\r\n    timeframe: 'i3',\r\n    instrument: 'market_sentiment',\r\n    premarket: false,\r\n    aftermarket: false,\r\n    afterChange: null,\r\n    afterClose: null,\r\n    drawMinutesPerDay: data.visibleMinutes,\r\n    marketStartMinutes: 570,\r\n    premarketLengthMinutes: 0,\r\n    aftermarketLengthMinutes: 0,\r\n  }\r\n}\r\n\r\nlet root: ReactDOM.Root\r\nfunction mount() {\r\n  const rootEl = document.getElementById('js-market-sentiment')\r\n  root = ReactDOM.createRoot(rootEl!)\r\n  root.render(<MarketSentiment />)\r\n}\r\n\r\nfunction unmount() {\r\n  root.unmount?.()\r\n}\r\n\r\nmount()\r\n\r\nexport { mount, unmount }\r\n","import { ContentType, apiRequest } from '../../main/services/api'\r\nimport { mapPerf } from '../maps/services/api'\r\nimport mapActionCreators from '../maps/store/action-creators'\r\nimport { MapSubtypeId, MapTypeId } from '../maps/types'\r\nimport { getMapsRefreshInterval } from '../maps/utils'\r\nimport { intervalCallbackOnWindowVisible } from '../shared/documentVisibility'\r\nimport { isStockFastRefreshAvailable } from '../shared/isStockFastRefreshAvailable'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { Indices, updateIndices } from './indices-data'\r\n\r\ninterface RefreshInfo {\r\n  userId: string\r\n  version: number\r\n  interval: number\r\n  hasGeoMaps: boolean\r\n}\r\n\r\nconst refreshInfo = parseJSONFromScript<RefreshInfo>('refresh-init')\r\n\r\nfunction refreshPage(newDocument: Document) {\r\n  // Replace market stats\r\n  const oldMarketStats = document.getElementsByClassName('market-stats')\r\n  const newMarketStats = newDocument.getElementsByClassName('market-stats')\r\n  if (oldMarketStats.length === newMarketStats.length) {\r\n    Array.from(oldMarketStats).forEach((_, index) => {\r\n      const oldElement = oldMarketStats.item(index)\r\n      const newElement = newMarketStats.item(index)\r\n      if (oldElement && newElement) {\r\n        oldElement.innerHTML = newElement.innerHTML\r\n      }\r\n    })\r\n  }\r\n\r\n  replaceSignalTables(newDocument)\r\n\r\n  // Replace bottom\r\n  const oldHomepageBottom = document.getElementById('js-homepage_bottom')\r\n  const newHomepageBottom = newDocument.getElementById('js-homepage_bottom')\r\n  if (oldHomepageBottom && newHomepageBottom) {\r\n    oldHomepageBottom.innerHTML = newHomepageBottom.innerHTML\r\n  }\r\n\r\n  if (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n    void import(/* webpackChunkName: \"recent_quotes\" */ '../shared/recent_quotes').then(({ RenderRecentQuotes }) => {\r\n      RenderRecentQuotes()\r\n    })\r\n  }\r\n\r\n  // Send refresh event to google analytics\r\n  window.gtag?.('event', 'refresh', { event_category: 'page' })\r\n  // Refresh any ads that might be on the page\r\n  if (window.finvizBannersLoaded === true) {\r\n    window.initFinvizBanners?.()\r\n  } else if (typeof window.refreshAds === 'function') {\r\n    window.refreshAds('#js-homepage_bottom [id*=IC_D_]')\r\n  }\r\n}\r\n\r\nexport function replaceSignalTables(newDocument: Document) {\r\n  // Replace left signals table\r\n  const oldSignalsLeft = document.getElementById('js-signals_1')\r\n  const newSignalsLeft = newDocument.getElementById('js-signals_1')\r\n  if (oldSignalsLeft && newSignalsLeft) {\r\n    oldSignalsLeft.innerHTML = newSignalsLeft.innerHTML\r\n  }\r\n\r\n  // Replace right signals table\r\n  const oldSignalsRight = document.getElementById('js-signals_2')\r\n  const newSignalsRight = newDocument.getElementById('js-signals_2')\r\n  if (oldSignalsRight && newSignalsRight) {\r\n    oldSignalsRight.innerHTML = newSignalsRight.innerHTML\r\n  }\r\n}\r\n\r\nexport async function getRefreshData() {\r\n  const data = await apiRequest<string>(window.location.pathname, {\r\n    headers: {\r\n      'Content-Type': ContentType.Html,\r\n      'X-Is-Ajax-Request': 'true',\r\n      'X-Theme': FinvizSettings.hasDarkTheme ? 'dark' : FinvizSettings.hasRedesignEnabled ? 'light' : 'legacy',\r\n    },\r\n  })\r\n\r\n  if (!data) return undefined\r\n\r\n  const newDocument = new DOMParser().parseFromString(data, 'text/html')\r\n  const newRefreshInfo = parseJSONFromScript<RefreshInfo>('refresh-init', newDocument)\r\n\r\n  if (!refreshInfo || !newRefreshInfo || refreshInfo.userId !== newRefreshInfo.userId) return undefined\r\n\r\n  if (refreshInfo.version !== newRefreshInfo.version) {\r\n    window.location.reload()\r\n  }\r\n\r\n  return newDocument\r\n}\r\n\r\nfunction initRefresh(interval: number) {\r\n  intervalCallbackOnWindowVisible({ interval }, async function handleRefresh() {\r\n    const newDocument = await getRefreshData()\r\n\r\n    if (newDocument) {\r\n      refreshPage(newDocument)\r\n    }\r\n  })\r\n}\r\n\r\nenum IndicesPollingIntervalInMs {\r\n  Default = 3000,\r\n  Reduced = 60000,\r\n  Free = 30000,\r\n}\r\n\r\nif (refreshInfo?.interval) {\r\n  initRefresh(refreshInfo.interval * 1000)\r\n\r\n  function getIndicesRefreshInterval() {\r\n    if (!FinvizSettings.hasUserPremium) {\r\n      return IndicesPollingIntervalInMs.Free\r\n    }\r\n    if (!isStockFastRefreshAvailable(false, false)) {\r\n      return IndicesPollingIntervalInMs.Reduced\r\n    }\r\n\r\n    return IndicesPollingIntervalInMs.Default\r\n  }\r\n\r\n  intervalCallbackOnWindowVisible({ interval: getIndicesRefreshInterval }, async function handleRefresh() {\r\n    const newIndicesData = await apiRequest<Indices>('/api/indices_data.ashx')\r\n\r\n    if (newIndicesData) {\r\n      updateIndices(newIndicesData)\r\n    }\r\n  })\r\n\r\n  intervalCallbackOnWindowVisible({ interval: getMapsRefreshInterval }, async function handleRefresh() {\r\n    const perfDataSecReq = mapPerf(MapTypeId.Sector, MapSubtypeId.DayPerf)\r\n    const perfDataGeoReq = refreshInfo.hasGeoMaps ? mapPerf(MapTypeId.World, MapSubtypeId.DayPerf) : null\r\n\r\n    const [perfDataSec, perfDataGeo] = await Promise.all([perfDataSecReq, perfDataGeoReq])\r\n\r\n    try {\r\n      if (perfDataSec) {\r\n        if (window.FinvizIndexSecMap.version !== perfDataSec.version) {\r\n          window.location.reload()\r\n        }\r\n        mapActionCreators.updatePerfData(window.FinvizIndexSecMap, perfDataSec)\r\n      }\r\n\r\n      if (perfDataGeo) {\r\n        if (window.FinvizIndexGeoMap.version !== perfDataGeo.version) {\r\n          window.location.reload()\r\n        }\r\n        mapActionCreators.updatePerfData(window.FinvizIndexGeoMap, perfDataGeo)\r\n      }\r\n    } catch {}\r\n  })\r\n}\r\n","import { Quote } from '../charts-lib'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\ninterface Index {\r\n  ticker: string\r\n  timeframe: string\r\n  volume: number[]\r\n  date: number[]\r\n  open: number[]\r\n  high: number[]\r\n  low: number[]\r\n  close: number[]\r\n  lastOpen: null\r\n  lastHigh: null\r\n  lastLow: null\r\n  lastClose: number\r\n  lastVolume: null\r\n  lastDate: number\r\n  prevClose: number\r\n  afterClose: null\r\n  afterChange: null\r\n  relativeVolume: number\r\n}\r\n\r\nexport type Indices = Record<string, Index>\r\n\r\nexport function getData(index: string, ticker: string, indices: Indices) {\r\n  return {\r\n    ...indices[index],\r\n    ticker: ticker, // use text?\r\n    timeframe: 'i10',\r\n    instrument: 'stock',\r\n    premarket: false,\r\n    aftermarket: false,\r\n    hasChartEvents: false,\r\n    afterChange: null,\r\n    afterClose: null,\r\n    drawMinutesPerDay: 390,\r\n    marketStartMinutes: 570,\r\n    premarketLengthMinutes: 0,\r\n    aftermarketLengthMinutes: 0,\r\n  }\r\n}\r\n\r\nexport function updateIndices(indices: Indices) {\r\n  const dowQ = Quote.findByAttribute('ticker', 'DOW')\r\n  if (dowQ) dowQ.updateAttributes(getData('^DJI', 'DOW', indices))\r\n\r\n  const nasdaqQ = Quote.findByAttribute('ticker', 'NASDAQ')\r\n  if (nasdaqQ) nasdaqQ.updateAttributes(getData('^IXIC', 'NASDAQ', indices))\r\n\r\n  const sap500Q = Quote.findByAttribute('ticker', 'S&P 500')\r\n  if (sap500Q) sap500Q.updateAttributes(getData('^GSPC', 'S&P 500', indices))\r\n\r\n  const rutQ = Quote.findByAttribute('ticker', 'RUSSELL 2000')\r\n  if (rutQ) rutQ.updateAttributes(getData('^RUT', 'RUSSELL 2000', indices))\r\n\r\n  if (!dowQ || !nasdaqQ || !sap500Q || !rutQ) {\r\n    // Temporary code below\r\n    // additional info gaining for https://finvizcom.sentry.io/issues/3963831382/?project=33153&referrer=issue-stream&statsPeriod=14d&stream_index=0\r\n    window.Sentry?.captureMessage('indices-data.ts updateIndices', {\r\n      extra: {\r\n        allAvailableTickers: Quote.all()\r\n          .reduce((acc: string[], cur: { ticker: string }) => {\r\n            acc.push(cur.ticker)\r\n            return acc\r\n          }, [])\r\n          .join(','),\r\n      },\r\n    })\r\n  }\r\n}\r\n","export enum HPSignalInterval {\r\n  intraday = 'intraday',\r\n  daily = 'daily',\r\n}\r\n\r\nexport const HP_SIGNAL_LABELS: Record<HPSignalInterval, string> = {\r\n  [HPSignalInterval.intraday]: 'Intraday',\r\n  [HPSignalInterval.daily]: 'Daily',\r\n}\r\nexport const HP_SIGNAL_COOKIE = 'signalsInterval'\r\nexport const HP_SIGNAL_SWITCH_RENDER_SELECTOR = 'js-switches-root'\r\n","import classNames from 'classnames'\r\n\r\nimport { Icon, Select, SelectOption } from '../../../main/components'\r\nimport { HPSignalInterval, HP_SIGNAL_LABELS } from './types'\r\n\r\nconst IS_REDESIGN = FinvizSettings.hasRedesignEnabled\r\nconst OPTIONS = Object.entries(HP_SIGNAL_LABELS).map(([value, label]) => ({ value: value as HPSignalInterval, label }))\r\nconst ROUNDING = IS_REDESIGN ? undefined : 'none'\r\n\r\ntype EliteSwitchProps = {\r\n  isLoading: boolean\r\n  signal: HPSignalInterval\r\n  onSignalChange: (signals: HPSignalInterval) => void\r\n}\r\n\r\nexport default function EliteSwitch({ isLoading, signal, onSignalChange }: EliteSwitchProps) {\r\n  return (\r\n    <Select\r\n      aria-label=\"Signals interval\"\r\n      theme={IS_REDESIGN ? 'link' : 'transparent'}\r\n      size={IS_REDESIGN ? 'xsmall' : 'xxsmall'}\r\n      rounding={ROUNDING}\r\n      className={classNames({ 'text-link hover:underline': !IS_REDESIGN, 'ml-1': IS_REDESIGN, 'ml-0.5': !IS_REDESIGN })}\r\n      value={OPTIONS.find((option) => option.value === signal)}\r\n      rightContent={<Icon name=\"chevronDown\" width={IS_REDESIGN ? 16 : 14} />}\r\n      onChange={({ value }) => {\r\n        onSignalChange(value)\r\n      }}\r\n      placement=\"bottom-end\"\r\n      orientation=\"horizontal\"\r\n      isLoading={isLoading}\r\n      disabled={isLoading}\r\n      gutter={IS_REDESIGN ? 0 : 1}\r\n      // override height defined by button to not stretch old hp signal tables\r\n      style={IS_REDESIGN ? undefined : { height: 'auto' }}\r\n    >\r\n      {OPTIONS.map((item) => (\r\n        <SelectOption\r\n          size=\"small\"\r\n          key={item.value}\r\n          rounding={ROUNDING}\r\n          activeTheme=\"chipTransparent\"\r\n          active={signal === item.value || undefined}\r\n          value={item}\r\n        >\r\n          {item.label}\r\n        </SelectOption>\r\n      ))}\r\n    </Select>\r\n  )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button, Icon, Paragraph } from '../../../main/components'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../../../main/components/popover'\r\nimport { HPSignalInterval, HP_SIGNAL_LABELS } from './types'\r\n\r\nconst IS_REDESIGN = FinvizSettings.hasRedesignEnabled\r\n\r\nexport default function FreeSwitch() {\r\n  const state = usePopoverState({ placement: 'bottom-end' })\r\n  const isOpen = state.useState('open')\r\n\r\n  return (\r\n    <>\r\n      {IS_REDESIGN ? (\r\n        <Button\r\n          as={PopoverTrigger}\r\n          state={state}\r\n          theme=\"link\"\r\n          rightContent=\"chevronDown\"\r\n          title=\"Signals interval\"\r\n          size=\"xsmall\"\r\n          active={isOpen}\r\n          className=\"ml-1\"\r\n        >\r\n          {HP_SIGNAL_LABELS[HPSignalInterval.daily]}\r\n        </Button>\r\n      ) : (\r\n        <Button\r\n          as={PopoverTrigger}\r\n          state={state}\r\n          title=\"Signals interval\"\r\n          theme=\"link\"\r\n          size=\"none\"\r\n          className=\"tab-link ml-1 border-none hover:underline\"\r\n          style={{ fontSize: 11 }}\r\n          contentClass=\"flex items-center\"\r\n        >\r\n          {HP_SIGNAL_LABELS[HPSignalInterval.daily]}\r\n          <Icon name=\"chevronDown\" className=\"mx-px\" width={IS_REDESIGN ? 16 : 14} />\r\n        </Button>\r\n      )}\r\n      <Popover\r\n        state={state}\r\n        aria-label=\"Switch interval\"\r\n        className=\"w-40 p-1 font-sans\"\r\n        rounding={IS_REDESIGN ? 'regular' : 'none'}\r\n        gutter={IS_REDESIGN ? 0 : 1}\r\n      >\r\n        <div className=\"flex flex-col items-center space-y-2 p-2\">\r\n          <Paragraph size=\"small\" className=\"leading-snug font-medium\">\r\n            Get access to intraday data with Finviz*Elite.\r\n          </Paragraph>\r\n          <Button\r\n            as=\"a\"\r\n            href=\"/elite.ashx?utm_source=finviz&utm_medium=banner&utm_campaign=intraday-signals\"\r\n            theme=\"violet\"\r\n            leftContent=\"lockOpened\"\r\n            size=\"small\"\r\n          >\r\n            Subscribe\r\n          </Button>\r\n        </div>\r\n      </Popover>\r\n    </>\r\n  )\r\n}\r\n","import React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\n\r\nimport { setCookieRequest } from '../../../main/services/api'\r\nimport { getCookie } from '../../shared/cookie'\r\nimport { getRefreshData, replaceSignalTables } from '../refresh'\r\nimport EliteSwitch from './EliteSwitch'\r\nimport FreeSwitch from './FreeSwitch'\r\nimport { HPSignalInterval, HP_SIGNAL_COOKIE } from './types'\r\n\r\nconst HEADER_SWITCH_SELECTOR = '.js-signal-switch'\r\nconst SWITCH_BUTTON_SELECTOR = '.js-signal-switch-button'\r\nconst signalSwitchesElements = Array.from(document.querySelectorAll<HTMLElement>(HEADER_SWITCH_SELECTOR))\r\n\r\nfunction getSignalsCookie() {\r\n  const value = getCookie(HP_SIGNAL_COOKIE)\r\n  let signal = HPSignalInterval.daily\r\n  const castedValue = value as HPSignalInterval\r\n\r\n  if (FinvizSettings.hasUserPremium && !!castedValue) signal = castedValue\r\n  return signal\r\n}\r\n\r\nasync function handleSignalIntervalChange() {\r\n  const newDocument = await getRefreshData()\r\n  if (newDocument) {\r\n    replaceSignalTables(newDocument)\r\n  } else {\r\n    document.location.reload()\r\n  }\r\n}\r\n\r\nexport default function HomepageSignals() {\r\n  const [signal, setSignal] = React.useState(getSignalsCookie())\r\n  const [isLoading, setIsLoading] = React.useState(false)\r\n\r\n  React.useEffect(() => {\r\n    // remove inlined buttons from html template\r\n    document.querySelectorAll(SWITCH_BUTTON_SELECTOR).forEach((element) => {\r\n      element.remove()\r\n    })\r\n  }, [])\r\n\r\n  const handleSignalChange = async (changedSignal: HPSignalInterval) => {\r\n    if (changedSignal !== signal) {\r\n      setSignal(changedSignal)\r\n      setIsLoading(true)\r\n      try {\r\n        await setCookieRequest(HP_SIGNAL_COOKIE, changedSignal)\r\n        await handleSignalIntervalChange().catch()\r\n      } catch {\r\n        setSignal(signal)\r\n      }\r\n      setIsLoading(false)\r\n    }\r\n  }\r\n\r\n  return (\r\n    <>\r\n      {signalSwitchesElements.map((element) =>\r\n        ReactDOM.createPortal(\r\n          FinvizSettings.hasUserPremium ? (\r\n            <EliteSwitch isLoading={isLoading} signal={signal} onSignalChange={handleSignalChange} />\r\n          ) : (\r\n            <FreeSwitch />\r\n          ),\r\n          element\r\n        )\r\n      )}\r\n    </>\r\n  )\r\n}\r\n","import ReactDOMClient from 'react-dom/client'\r\n\r\nimport { SpecificChartFunctionality } from '../../main/constants/common'\r\nimport {\r\n  ChartElementType,\r\n  ChartLayout,\r\n  Instrument,\r\n  LayoutType,\r\n  Quote,\r\n  ScaleType,\r\n  TIMEFRAME,\r\n  Theme,\r\n} from '../charts-lib'\r\nimport { getCustomColorsFromCookies } from '../shared/chartLayoutConfig'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { ready } from '../shared/ready'\r\nimport type { Indices } from './indices-data'\r\nimport { getData } from './indices-data'\r\nimport './market_sentiment'\r\nimport './refresh'\r\nimport SignalIntervalSwitch from './signals-switch'\r\nimport { HP_SIGNAL_SWITCH_RENDER_SELECTOR } from './signals-switch/types'\r\n\r\nif (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n  void import(/* webpackChunkName: \"recent_quotes\" */ '../shared/recent_quotes').then(({ RenderRecentQuotes }) => {\r\n    RenderRecentQuotes()\r\n  })\r\n}\r\n\r\nfunction getChartConfig(ticker: string) {\r\n  return {\r\n    layout: LayoutType['1h1v'],\r\n    width: 320,\r\n    height: 190,\r\n    barWidth: 3,\r\n    barMargin: 1,\r\n    scrollable: false,\r\n    editable: false,\r\n    cross: false,\r\n    colors: getCustomColorsFromCookies(),\r\n    specificChartFunctionality: SpecificChartFunctionality.smallIndex,\r\n    theme: FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light,\r\n    charts: [\r\n      {\r\n        width: 0,\r\n        premarket: false,\r\n        aftermarket: false,\r\n        dateRange: null,\r\n        height: 190,\r\n        timeframe: TIMEFRAME.i10,\r\n        scale: ScaleType.Linear,\r\n        ticker: ticker,\r\n        // leftOffset: 0,\r\n        instrument: Instrument.Stock,\r\n        refreshData: false,\r\n        // stretch: true,\r\n        panes: [\r\n          {\r\n            height: 190,\r\n            elements: [\r\n              {\r\n                type: ChartElementType.CandleStick,\r\n                overlays: [],\r\n              },\r\n            ],\r\n          },\r\n        ],\r\n      },\r\n    ],\r\n  }\r\n}\r\n\r\nfunction renderSignalIntervalSwitch() {\r\n  const signalSwitches = document.getElementById(HP_SIGNAL_SWITCH_RENDER_SELECTOR)\r\n\r\n  if (signalSwitches) {\r\n    const root = ReactDOMClient.createRoot(signalSwitches)\r\n    root.render(<SignalIntervalSwitch />)\r\n  }\r\n}\r\n\r\nready(function () {\r\n  const indices = parseJSONFromScript<Indices>('js-indices')!\r\n  const root = ReactDOMClient.createRoot(document.getElementById('home_indexes')!)\r\n\r\n  Quote.create(getData('^DJI', 'DOW', indices)).save()\r\n  Quote.create(getData('^IXIC', 'NASDAQ', indices)).save()\r\n  Quote.create(getData('^GSPC', 'S&P 500', indices)).save()\r\n  Quote.create(getData('^RUT', 'RUSSELL 2000', indices)).save()\r\n\r\n  root.render(\r\n    <>\r\n      <div className=\"hp_chart\">\r\n        <ChartLayout config={getChartConfig('DOW')} />\r\n      </div>\r\n      <div className=\"hp_chart\">\r\n        <ChartLayout config={getChartConfig('NASDAQ')} />\r\n      </div>\r\n      <div className=\"hp_chart\">\r\n        <ChartLayout config={getChartConfig('S&P 500')} />\r\n      </div>\r\n      <div className=\"hp_chart hidden 3xl:block\">\r\n        <ChartLayout config={getChartConfig('RUSSELL 2000')} />\r\n      </div>\r\n    </>\r\n  )\r\n\r\n  renderSignalIntervalSwitch()\r\n})\r\n","import { ContentType, apiRequest } from '../../../main/services/api'\r\nimport { MapSubtypeId, MapTypeId, PerfData } from '../types'\r\n\r\nexport function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\r\n  return apiRequest<PerfData>(`/api/map_perf.ashx`, { query: { t: type, st: subtype } })\r\n}\r\n\r\nexport function mapPerfScreener(query = window.location.search) {\r\n  return apiRequest<PerfData>(`/api/map_perf_screener.ashx${query}`)\r\n}\r\n\r\nexport interface UploadMapResponse {\r\n  imgUrl: string\r\n  shareUrl: string\r\n}\r\n\r\nexport function uploadMap({ type, subtype, data }: { type: MapTypeId; subtype: MapSubtypeId; data: string }) {\r\n  return apiRequest<UploadMapResponse>(`/publish_map_submit.ashx`, {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': ContentType.FormUrlEncoded,\r\n    },\r\n    body: new URLSearchParams({\r\n      file: data.replace('data:image/png;base64,', ''),\r\n      type,\r\n      subtype,\r\n    }),\r\n  })\r\n}\r\n","import debounce from 'lodash.debounce'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../../main/services/api'\r\nimport Treemap from '../treemap'\r\nimport { MapData, MapDataNode, MapTypeId, PerfData, Scale } from '../types'\r\nimport { getVisibleTooltipNodes } from '../utils'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport mapStore from './mapStore'\r\n\r\nvar _targetScale = 1\r\nfunction zoomIn(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n  _targetScale = scale\r\n  animate()\r\n  function animate() {\r\n    treemap.zoom.scale(+(treemap.zoom.scale() + 0.05).toFixed(2), { x: tx, y: ty })\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n    if (treemap.zoom.scale() + 0.05 < _targetScale + 0.00001) {\r\n      requestAnimationFrame(animate)\r\n    }\r\n  }\r\n}\r\n\r\nfunction zoomOut(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n  _targetScale = scale\r\n  animate()\r\n  function animate() {\r\n    treemap.zoom.scale(+(treemap.zoom.scale() - 0.05).toFixed(2), { x: tx, y: ty })\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n    if (treemap.zoom.scale() - 0.05 > _targetScale - 0.00001) {\r\n      requestAnimationFrame(animate)\r\n    }\r\n  }\r\n}\r\n\r\nfunction updateVisibleSparklines(treemap: Treemap) {\r\n  const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n  const visibleNodes = getVisibleTooltipNodes(hoveredNode)\r\n\r\n  if (!visibleNodes.length) return\r\n\r\n  const tickersToLoad = visibleNodes.map((node) => node!.name)\r\n  if (hoveredNode && !tickersToLoad.includes(hoveredNode?.name)) {\r\n    tickersToLoad.push(hoveredNode.name)\r\n  }\r\n\r\n  void debouncedLoadSparklines(tickersToLoad, treemap.type)\r\n}\r\n\r\nlet _lastSparklinesRequest: CancelablePromise<any> | null = null\r\nasync function loadSparklines(tickers: string[], mapType: string) {\r\n  AppDispatcher.handleViewAction({\r\n    type: ActionTypes.LOAD_SPARKLINES_STARTED,\r\n  })\r\n  _lastSparklinesRequest?.cancel?.()\r\n  _lastSparklinesRequest = apiRequest(\r\n    '/api/map_sparklines.ashx',\r\n    { query: { t: tickers.join(','), ty: mapType } },\r\n    true\r\n  )\r\n\r\n  try {\r\n    const data = await _lastSparklinesRequest\r\n    AppDispatcher.handleServerAction({\r\n      type: ActionTypes.LOAD_SPARKLINES_COMPLETED,\r\n      data: data,\r\n    })\r\n  } catch (error) {\r\n    // This just means we canceled the previous request\r\n    if (_lastSparklinesRequest.aborted) return\r\n\r\n    AppDispatcher.handleServerAction({\r\n      type: ActionTypes.LOAD_SPARKLINES_FAILED,\r\n      error,\r\n    })\r\n  }\r\n}\r\n\r\nconst debouncedLoadSparklines = debounce(loadSparklines, 200, { trailing: true })\r\n\r\nconst actions = {\r\n  setHoveredNode(mapNodeId: string, node: MapDataNode | undefined) {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.SET_HOVERED_NODE,\r\n      node,\r\n      mapNodeId,\r\n    })\r\n  },\r\n\r\n  loadSparklineData(tickers: string[], mapType: MapTypeId) {\r\n    if (tickers.length > 0) {\r\n      void debouncedLoadSparklines(tickers, mapType)\r\n    }\r\n  },\r\n\r\n  loadSparklinesCancel() {\r\n    _lastSparklinesRequest?.cancel?.()\r\n  },\r\n\r\n  resetSparklineData() {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.RESET_SPARKLINE_DATA,\r\n    })\r\n  },\r\n\r\n  changeTranslate(treemap: Treemap, tx: number, ty: number) {\r\n    treemap.zoom.translate([tx, ty])\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.CHANGE_TRANSLATE,\r\n    })\r\n  },\r\n\r\n  zoom(treemap: Treemap, direction: number, offsetX: number, offsetY: number) {\r\n    if (direction > 0) {\r\n      const zoomLevel = treemap.getNextZoomLevel()\r\n      if (zoomLevel !== treemap.zoom.scale()) {\r\n        zoomIn(treemap, zoomLevel, offsetX, offsetY)\r\n      }\r\n    } else {\r\n      const zoomLevel = treemap.getPreviousZoomLevel()\r\n      if (zoomLevel !== treemap.zoom.scale()) {\r\n        zoomOut(treemap, zoomLevel, offsetX, offsetY)\r\n      }\r\n    }\r\n  },\r\n\r\n  render() {\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n  },\r\n\r\n  zoomAndTranslate(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n    treemap.zoom.scale(1, { x: tx, y: ty })\r\n    treemap.zoom.scale(scale, { x: tx, y: ty })\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n  },\r\n\r\n  updateLayout(\r\n    treemap: Treemap,\r\n    props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }\r\n  ) {\r\n    treemap.updateData(props)\r\n    treemap.zoom.updateDimensions(props)\r\n    AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n\r\n    // Update hovered node if any\r\n    const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n    if (hoveredNode) {\r\n      AppDispatcher.handleViewAction({\r\n        type: ActionTypes.SET_HOVERED_NODE,\r\n        node: treemap.nodes.find((node) => node.name === hoveredNode.name),\r\n        mapNodeId: treemap.mapNodeId,\r\n      })\r\n      updateVisibleSparklines(treemap)\r\n    }\r\n  },\r\n\r\n  updatePerfData(treemap?: Treemap, data?: PerfData) {\r\n    if (!treemap || !data) return\r\n\r\n    treemap.updatePerf(data)\r\n    AppDispatcher.handleServerAction({ type: ActionTypes.UPDATE_DATA, version: data.version })\r\n\r\n    updateVisibleSparklines(treemap)\r\n  },\r\n\r\n  _setOnPublish(getPublishCanvas: () => HTMLCanvasElement) {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.SET_PUBLISH_CANVAS,\r\n      getPublishCanvas,\r\n    })\r\n  },\r\n\r\n  setupWidget() {\r\n    AppDispatcher.handleViewAction({\r\n      type: ActionTypes.SET_WIDGET,\r\n      isWidget: true,\r\n    })\r\n  },\r\n}\r\n\r\nexport default actions\r\n","import { Dispatcher } from 'flux'\r\n\r\nimport { PayloadSources } from './constants'\r\n\r\nclass AppDispatcher extends Dispatcher<any> {\r\n  handleServerAction(action: any) {\r\n    var payload = {\r\n      source: PayloadSources.SERVER_ACTION,\r\n      action: action,\r\n    }\r\n    //console.log(action, payload);\r\n    this.dispatch(payload)\r\n  }\r\n\r\n  handleViewAction(action: any) {\r\n    var payload = {\r\n      source: PayloadSources.VIEW_ACTION,\r\n      action: action,\r\n    }\r\n    //console.log(action, payload);\r\n    this.dispatch(payload)\r\n  }\r\n}\r\n\r\nconst dispatcher = new AppDispatcher()\r\nexport default dispatcher\r\n","import keyMirror from 'keymirror'\r\n\r\nconst ActionTypes = keyMirror({\r\n  RENDER_TREEMAP: null,\r\n  CHANGE_TRANSLATE: null,\r\n  SET_HOVERED_NODE: null,\r\n\r\n  LOAD_SPARKLINES_STARTED: null,\r\n  LOAD_SPARKLINES_COMPLETED: null,\r\n  LOAD_SPARKLINES_FAILED: null,\r\n  RESET_SPARKLINE_DATA: null,\r\n\r\n  INIT_STARTED: null,\r\n  INIT_FAILED: null,\r\n\r\n  UPDATE_DATA: null,\r\n\r\n  SET_PUBLISH_CANVAS: null,\r\n\r\n  SET_WIDGET: null,\r\n})\r\n\r\nconst PayloadSources = keyMirror({\r\n  SERVER_ACTION: null,\r\n  VIEW_ACTION: null,\r\n})\r\n\r\nexport { ActionTypes, PayloadSources }\r\n","import { EventEmitter } from 'events'\r\n\r\nclass Store extends EventEmitter {\r\n  static CHANGE_EVENT = 'change'\r\n\r\n  emitChange() {\r\n    this.emit(Store.CHANGE_EVENT)\r\n  }\r\n\r\n  addChangeListener(callback: (...args: any[]) => void) {\r\n    this.on(Store.CHANGE_EVENT, callback)\r\n  }\r\n\r\n  removeChangeListener(callback: (...args: any[]) => void) {\r\n    this.removeListener(Store.CHANGE_EVENT, callback)\r\n  }\r\n}\r\n\r\nexport default Store\r\n","import { MapDataNode } from '../types'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport Store from './store'\r\n\r\nlet _hoveredNode: MapDataNode\r\nlet _mapNodeId: string\r\nlet _sparklinesData: Record<string, number[]> = {}\r\nlet _dataVersion: number\r\nlet _isWidget = false\r\nlet _getPublishCanvas: () => HTMLCanvasElement\r\n\r\nclass MapStore extends Store {\r\n  getHoveredNode(mapNodeId: string) {\r\n    if (mapNodeId === _mapNodeId) return _hoveredNode\r\n    return undefined\r\n  }\r\n\r\n  getSparklines() {\r\n    return _sparklinesData\r\n  }\r\n\r\n  getDataVersion() {\r\n    return _dataVersion\r\n  }\r\n\r\n  isWidget() {\r\n    return _isWidget\r\n  }\r\n\r\n  getPublishCanvas() {\r\n    return _getPublishCanvas()\r\n  }\r\n}\r\n\r\nvar mapStore = new MapStore()\r\n\r\n// @ts-ignore\r\nmapStore.dispatchToken = AppDispatcher.register(function (payload: any) {\r\n  var action = payload.action\r\n\r\n  switch (action.type) {\r\n    case ActionTypes.RENDER_TREEMAP:\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.SET_HOVERED_NODE:\r\n      if (action.node !== _hoveredNode) {\r\n        _hoveredNode = action.node\r\n        _mapNodeId = action.mapNodeId\r\n        mapStore.emitChange()\r\n      }\r\n      break\r\n\r\n    case ActionTypes.CHANGE_TRANSLATE:\r\n      // @ts-ignore\r\n      _hoveredNode = undefined\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.LOAD_SPARKLINES_STARTED:\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.LOAD_SPARKLINES_COMPLETED:\r\n      _sparklinesData = { ..._sparklinesData, ...action.data }\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.RESET_SPARKLINE_DATA:\r\n    case ActionTypes.LOAD_SPARKLINES_FAILED:\r\n      _sparklinesData = {}\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.UPDATE_DATA:\r\n      _dataVersion = action.version\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.SET_PUBLISH_CANVAS:\r\n      _getPublishCanvas = action.getPublishCanvas\r\n      mapStore.emitChange()\r\n      break\r\n\r\n    case ActionTypes.SET_WIDGET:\r\n      _isWidget = action.isWidget\r\n      mapStore.emitChange()\r\n      break\r\n  }\r\n})\r\n\r\nexport default mapStore\r\n","import { SpecificChartFunctionality } from '../../main/constants/common'\r\nimport { ChartConfigChartPaneElement, Instrument, LayoutType, ScaleType, TIMEFRAME, Theme } from '../charts-lib'\r\nimport { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps extends ChartConfigChartPaneElement {\r\n  label?: string\r\n  fromDate?: string\r\n  toDate?: string\r\n  min?: number\r\n  tickers: string[]\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n  width?: number\r\n  height?: number\r\n  ticker: string\r\n  timeframe: TIMEFRAME\r\n  paneElements: PaneElementProps[]\r\n  specificChartFunctionality?: SpecificChartFunctionality\r\n  colorsOverride?: Array<string>\r\n  theme?: Theme\r\n  colors?: ReturnType<typeof getCustomColorsFromCookies>\r\n  refreshData?: boolean\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n  width = 800,\r\n  height = 400,\r\n  ticker,\r\n  timeframe,\r\n  paneElements,\r\n  specificChartFunctionality = SpecificChartFunctionality.default,\r\n  colorsOverride,\r\n  theme,\r\n  colors = getCustomColorsFromCookies(),\r\n  refreshData = false,\r\n}: StaticChartConfigProps) {\r\n  return {\r\n    layout: LayoutType['1h1v'],\r\n    width,\r\n    height,\r\n    barWidth: 1,\r\n    barMargin: 0,\r\n    scrollable: false,\r\n    editable: false,\r\n    specificChartFunctionality,\r\n    colorsOverride,\r\n    theme,\r\n    colors,\r\n    charts: [\r\n      {\r\n        width: 0,\r\n        premarket: false,\r\n        aftermarket: false,\r\n        dateRange: null,\r\n        height,\r\n        timeframe,\r\n        scale: ScaleType.Linear,\r\n        ticker: ticker,\r\n        leftOffset: 0,\r\n        instrument: Instrument.Stock,\r\n        refreshData,\r\n        stretch: true,\r\n        panes: [\r\n          {\r\n            height,\r\n            elements: paneElements,\r\n          },\r\n        ],\r\n      },\r\n    ],\r\n  }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n  try {\r\n    return JSON.parse(getParsedCookies('customColors') as string)\r\n  } catch {\r\n    return undefined\r\n  }\r\n}\r\n","export function parseJSONFromScript<T>(id: string, doc: Document = document): T | null {\r\n  const el = doc.getElementById(id)\r\n  const isValidElement = el && el.tagName === 'SCRIPT' && el.getAttribute('type') === 'application/json'\r\n\r\n  if (!isValidElement) {\r\n    window.Sentry?.captureMessage('parseJSONFromScript', {\r\n      extra: {\r\n        el: el ? 'yes' : 'no',\r\n        tagName: el?.tagName,\r\n        type: el?.getAttribute('type'),\r\n      },\r\n    })\r\n  }\r\n\r\n  if (!isValidElement) return null\r\n\r\n  try {\r\n    return JSON.parse(el.textContent!)\r\n  } catch (e) {\r\n    Sentry.captureException(e)\r\n    return null\r\n  }\r\n}\r\n","export enum AdsProvider {\r\n  None,\r\n  InvestingChannel,\r\n  Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n  if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n  if (FinvizSettings.adsProvider === 2) {\r\n    return AdsProvider.Freestar\r\n  }\r\n\r\n  return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n  const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n  window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n  window.gtag?.('event', 'page_view')\r\n\r\n  if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n    window.freestar?.queue.push(() => freestar.trackPageview())\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<ValueType> = Pick<SelectItem<ValueType>, 'value' | 'label' | 'disabled'>\r\n\r\nexport interface ButtonSwitchProps<ValueType, ItemType extends ButtonSwitchItem<ValueType>> 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<ValueType, ItemType extends ButtonSwitchItem<ValueType>>(\r\n  props: Omit<ButtonSwitchProps<ValueType, ItemType>, '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<ValueType | undefined>(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    <div className=\"inline-flex items-center gap-1\">\r\n      <ButtonGroup {...restProps} rounding={groupRounding} className={className} hasDivider={false}>\r\n        {items.map((option, index) => (\r\n          <Button\r\n            key={`button-${index}`}\r\n            data-testid={props['data-testid'] && `${props['data-testid']}-button-${index}`}\r\n            contentClass=\"flex justify-center\"\r\n            size={size}\r\n            type=\"button\"\r\n            rounding={rounding}\r\n            disabled={option.disabled}\r\n            theme={value === option.value ? activeTheme : undefined}\r\n            onClick={() => handleChange(option)}\r\n          >\r\n            {option.label}\r\n          </Button>\r\n        ))}\r\n      </ButtonGroup>\r\n      {label && <span className={classNames('select-none text-2xs', labelClassNames)}>{label}</span>}\r\n    </div>\r\n  )\r\n}\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<HTMLProps<HTMLInputElement>, '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<CheckboxProps>,\r\n  ref: ForwardedRef<HTMLInputElement>\r\n) {\r\n  const checked = props.checked ?? props.defaultChecked\r\n\r\n  return (\r\n    <label\r\n      className={classnames(className, CheckboxSize[size], 'group/checkbox flex items-center', {\r\n        'text-gray-400 dark:text-gray-500': props.disabled,\r\n      })}\r\n    >\r\n      <div className=\"relative mr-2 flex\">\r\n        <input\r\n          {...props}\r\n          ref={ref}\r\n          type=\"checkbox\"\r\n          className={classnames(\r\n            'h-4 w-4 cursor-pointer appearance-none rounded-sm border ring-gray-300 focus:outline-none focus-visible:ring-2', // Base\r\n            'border-gray-200 bg-white dark:border-gray-600 dark:bg-gray-800', // Normal\r\n            'group-hover/checkbox:border-gray-400', // Hover\r\n            'disabled:border-gray-100 disabled:bg-gray-100 disabled:checked:border-gray-400 disabled:checked:bg-gray-400 dark:disabled:bg-gray-600 dark:disabled:checked:border-gray-600 dark:disabled:checked:bg-gray-600 dark:disabled:group-hover/checkbox:border-gray-600', // Disabled\r\n            // Checked color styles\r\n            {\r\n              'checked:border-violet-400 checked:bg-violet-400 group-hover/checkbox:checked:border-violet-500 group-hover/checkbox:checked:bg-violet-500 dark:checked:border-violet-400 dark:checked:bg-violet-400 dark:group-hover/checkbox:checked:border-violet-300 dark:group-hover/checkbox:checked:bg-violet-300':\r\n                color === ColorVariant.violet,\r\n              'checked:border-emerald-400 checked:bg-emerald-400 group-hover/checkbox:checked:border-emerald-500 group-hover/checkbox:checked:bg-emerald-500 dark:checked:border-emerald-300 dark:checked:bg-emerald-300 dark:group-hover/checkbox:checked:border-emerald-200 dark:group-hover/checkbox:checked:bg-emerald-200':\r\n                color === ColorVariant.emerald,\r\n              'checked:border-orange-300 checked:bg-orange-300 group-hover/checkbox:checked:border-orange-400 group-hover/checkbox:checked:bg-orange-400 dark:checked:border-orange-300 dark:checked:bg-orange-300 dark:group-hover/checkbox:checked:border-orange-200 dark:group-hover/checkbox:checked:bg-orange-200':\r\n                color === ColorVariant.orange,\r\n              'checked:border-teal-400 checked:bg-teal-400 group-hover/checkbox:checked:border-teal-500 group-hover/checkbox:checked:bg-teal-500 dark:checked:border-teal-300 dark:checked:bg-teal-300 dark:group-hover/checkbox:checked:border-teal-200 dark:group-hover/checkbox:checked:bg-teal-200':\r\n                color === ColorVariant.teal,\r\n              'checked:border-pink-400 checked:bg-pink-400 group-hover/checkbox:checked:border-pink-500 group-hover/checkbox:checked:bg-pink-500 dark:checked:border-pink-400 dark:checked:bg-pink-400 dark:group-hover/checkbox:checked:border-pink-300 dark:group-hover/checkbox:checked:bg-pink-300':\r\n                color === ColorVariant.pink,\r\n              'checked:border-lime-400 checked:bg-lime-400 group-hover/checkbox:checked:border-lime-500 group-hover/checkbox:checked:bg-lime-500 dark:checked:border-lime-300 dark:checked:bg-lime-300 dark:group-hover/checkbox:checked:border-lime-200 dark:group-hover/checkbox:checked:bg-lime-200':\r\n                color === ColorVariant.lime,\r\n              'checked:border-purple-400 checked:bg-purple-400 group-hover/checkbox:checked:border-purple-500 group-hover/checkbox:checked:bg-purple-500 dark:checked:border-purple-400 dark:checked:bg-purple-400 dark:group-hover/checkbox:checked:border-purple-300 dark:group-hover/checkbox:checked:bg-purple-300':\r\n                color === ColorVariant.purple,\r\n              'checked:border-green-400 checked:bg-green-400 group-hover/checkbox:checked:border-green-500 group-hover/checkbox:checked:bg-green-500 dark:checked:border-green-400 dark:checked:bg-green-400 dark:group-hover/checkbox:checked:border-green-300 dark:group-hover/checkbox:checked:bg-green-300':\r\n                color === ColorVariant.green,\r\n              'checked:border-yellow-300 checked:bg-yellow-300 group-hover/checkbox:checked:border-yellow-400 group-hover/checkbox:checked:bg-yellow-400 dark:checked:border-yellow-200 dark:checked:bg-yellow-200 dark:group-hover/checkbox:checked:border-yellow-100 dark:group-hover/checkbox:checked:bg-yellow-100':\r\n                color === ColorVariant.yellow,\r\n              'checked:border-blue-400 checked:bg-blue-400 group-hover/checkbox:checked:border-blue-500 group-hover/checkbox:checked:bg-blue-500 dark:checked:border-blue-300 dark:checked:bg-blue-300 dark:group-hover/checkbox:checked:border-blue-200 dark:group-hover/checkbox:checked:bg-blue-200':\r\n                color === ColorVariant.blue,\r\n              'checked:border-red-400 checked:bg-red-400 group-hover/checkbox:checked:border-red-500 group-hover/checkbox:checked:bg-red-500 dark:checked:border-red-400 dark:checked:bg-red-400 dark:group-hover/checkbox:checked:border-red-300 dark:group-hover/checkbox:checked:bg-red-300':\r\n                color === ColorVariant.red,\r\n              'checked:border-gray-400 checked:bg-gray-400 group-hover/checkbox:checked:border-gray-500 group-hover/checkbox:checked:bg-gray-500 dark:checked:border-gray-400 dark:checked:bg-gray-400 dark:group-hover/checkbox:checked:border-gray-300 dark:group-hover/checkbox:checked:bg-gray-300':\r\n                color === ColorVariant.gray,\r\n              'checked:border-gray-700 checked:bg-gray-700 group-hover/checkbox:checked:border-gray-800 group-hover/checkbox:checked:bg-gray-800 dark:checked:border-gray-200 dark:checked:bg-gray-200 dark:group-hover/checkbox:checked:border-gray-100 dark:group-hover/checkbox:checked:bg-gray-100':\r\n                color === ColorVariant.darkGray,\r\n              'checked:border-blue-400 checked:bg-blue-400 group-hover/checkbox:checked:border-blue-500 group-hover/checkbox:checked:bg-blue-500 dark:checked:border-blue-400 dark:checked:bg-blue-400 dark:group-hover/checkbox:checked:border-blue-500':\r\n                color === ColorVariant.default,\r\n            }\r\n          )}\r\n        />\r\n        {checked && (\r\n          <Icon\r\n            name=\"checkboxTick\"\r\n            className={classnames('absolute left-0.5 top-0.5', {\r\n              'text-gray-50': color === ColorVariant.default,\r\n              'text-white dark:text-gray-800': color !== ColorVariant.default,\r\n            })}\r\n            width={12}\r\n          />\r\n        )}\r\n      </div>\r\n      {label ?? children}\r\n    </label>\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<Props> & HTMLProps<HTMLDivElement>) {\r\n  const container = useRef<HTMLDivElement>(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    <div\r\n      {...props}\r\n      ref={container}\r\n      className={classnames(className, 'relative outline-none')}\r\n      onTouchStart={handleMoveStart}\r\n      onMouseDown={handleMoveStart}\r\n      onKeyDown={handleKeyDown}\r\n      tabIndex={0}\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    <div\r\n      className=\"absolute -m-3 h-6 w-6 rounded-full bg-white bg-checkerboard bg-fixed shadow sm:-m-2 sm:h-4 sm:w-4\"\r\n      style={{\r\n        top: `${top * 100}%`,\r\n        left: `${left * 100}%`,\r\n      }}\r\n    >\r\n      <div className=\"h-full w-full rounded-full border-2 border-white\" style={{ backgroundColor: color }} />\r\n    </div>\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    <DraggablePicker onMove={changeLightness} onKey={changeLightness} aria-label=\"Alpha\">\r\n      <div className=\"flex h-4 overflow-hidden rounded-md bg-white bg-checkerboard bg-fixed\">\r\n        <div className=\"grow\" style={{ backgroundImage: gradientPreview }} />\r\n      </div>\r\n      <Pointer top={0.5} left={1 - color.a} color={hsvaToHEXString(color, true)} />\r\n    </DraggablePicker>\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    <div className=\"grid grid-cols-8 gap-3\" data-testid=\"color-palette\">\r\n      {colors.map((colorObj) => {\r\n        const isSelected = lowerCaseColor.startsWith(colorObj.value)\r\n        return (\r\n          <div\r\n            key={colorObj.value}\r\n            className=\"flex h-5 w-full items-center justify-center rounded\"\r\n            title={colorObj.title}\r\n            style={{ backgroundColor: colorObj.value }}\r\n            onClick={() => onChange(colorObj.value, hexStringToHSVA(colorObj.value))}\r\n          >\r\n            {isSelected && <Icon name=\"checkboxTick\" className=\"text-gray-50\" />}\r\n          </div>\r\n        )\r\n      })}\r\n    </div>\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    <DraggablePicker\r\n      onMove={changeSaturation}\r\n      onKey={changeSaturation}\r\n      aria-label=\"Color\"\r\n      className=\"flex grow flex-col\"\r\n    >\r\n      <div className=\"flex h-full flex-1 flex-col overflow-hidden rounded-md bg-gradient-hue\">\r\n        <div className=\"h-full flex-1 bg-white-fade-in\" />\r\n      </div>\r\n      <Pointer top={position.top} left={position.left} color={colorPreview} />\r\n    </DraggablePicker>\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    <DraggablePicker onMove={changeLightness} onKey={changeLightness} aria-label=\"Lightness\">\r\n      <div className=\"flex h-4 rounded-md\" style={{ backgroundImage: gradientPreview }} />\r\n      <Pointer top={0.5} left={1 - color.v} color={colorPreview} />\r\n    </DraggablePicker>\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    <div\r\n      className={classnames(\r\n        'relative flex h-full w-full overflow-hidden border border-gray-100 bg-white bg-checkerboard dark:border-gray-700',\r\n        className\r\n      )}\r\n    >\r\n      {icon && (\r\n        <div className=\"absolute bottom-0 left-0 right-0 top-0 flex items-center justify-center p-0.5\">\r\n          {isValidIconName(icon) ? (\r\n            <Icon name={icon} className=\"shrink-0\" color={isTooLight ? 'black' : 'white'} width=\"100%\" height=\"100%\" />\r\n          ) : (\r\n            icon\r\n          )}\r\n        </div>\r\n      )}\r\n      {colors.map((color, index) => (\r\n        // &nbsp has to be there because of a bug on safari which ignores h-full when empty element\r\n        <div key={index} className=\"h-full flex-1\" style={{ backgroundColor: color }}>\r\n          &nbsp;\r\n        </div>\r\n      ))}\r\n    </div>\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<InputComponentProps, 'onChange'> {\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<HTMLInputElement>\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<HTMLInputElement>) => {\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      <Input\r\n        {...props}\r\n        ref={ref}\r\n        value={colorInput}\r\n        inputClass={classnames(\r\n          'text-left',\r\n          {\r\n            'pl-6.5': !hasColorPreview && !isRgba,\r\n            'pl-1': !hasColorPreview && isRgba,\r\n            'pl-12': hasColorPreview && !isRgba,\r\n            'pl-8': hasColorPreview && isRgba,\r\n          },\r\n          inputClass\r\n        )}\r\n        leftContent={\r\n          <div className={classnames('flex items-center', { 'ml-4 pl-1': hasColorPreview })}>\r\n            {hasColorPreview && (\r\n              <div className=\"h-5 w-5\">\r\n                <ColorPreview color={color} className=\"rounded\" />\r\n              </div>\r\n            )}\r\n            {!isRgba && <span className={classnames({ 'ml-2': hasColorPreview })}>#</span>}\r\n          </div>\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    <div className=\"flex h-full w-full flex-col space-y-4 sm:space-y-2\">\r\n      {canSelectCustom && (\r\n        <>\r\n          {isMobile() && (\r\n            <Button onClick={onSetCustomCodeClick} className=\"-mb-2 sm:mb-0\" contentClass=\"text-center\">\r\n              Paste color code\r\n            </Button>\r\n          )}\r\n          <HueSaturation color={hsvaColor} onChange={onChangeCallback} />\r\n          <Lightness color={hsvaColor} onChange={onChangeCallback} />\r\n\r\n          {canSelectAlpha && <Alpha color={hsvaColor} onChange={onChangeCallback} />}\r\n        </>\r\n      )}\r\n\r\n      <div\r\n        className={classnames({\r\n          '-mx-2 border-t border-gray-200 px-2 pt-3 dark:border-gray-700 sm:pt-2': canSelectCustom,\r\n        })}\r\n      >\r\n        <ColorPalette\r\n          color={color}\r\n          onChange={(_hex, orignalColor) => {\r\n            input?.focus({ preventScroll: true })\r\n            onPaletteItemClick?.()\r\n            onChangeCallback({ ...orignalColor, a: hsvaColor.a })\r\n          }}\r\n        />\r\n      </div>\r\n    </div>\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      <PopoverTrigger\r\n        state={popoverState}\r\n        render={\r\n          <PickerInput\r\n            color={props.color}\r\n            label={label}\r\n            type={isMobileDevice || !canSelectCustom ? 'button' : 'text'}\r\n            data-testid={inputDataTestId}\r\n            onChange={onChange}\r\n          />\r\n        }\r\n      />\r\n      <Popover state={popoverState} hideOnInteractOutside aria-label=\"Color picker\" backdrop={false}>\r\n        <div\r\n          className={classnames(\r\n            'w-64 p-2',\r\n            canSelectCustom && {\r\n              'h-72': isMobileDevice,\r\n              'h-64': !isMobileDevice,\r\n            }\r\n          )}\r\n        >\r\n          <ColorPicker\r\n            {...props}\r\n            onChange={onChange}\r\n            onPaletteItemClick={() => {\r\n              if (canSelectCustom) return\r\n              popoverState.hide()\r\n            }}\r\n          />\r\n        </div>\r\n      </Popover>\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        <div className=\"p-2 pb-0\">\r\n          <PickerInput\r\n            data-testid=\"color-picker-input\"\r\n            label={colorInputLabel}\r\n            color={props.color}\r\n            hasColorPreview={false}\r\n            onChange={onChange}\r\n          />\r\n        </div>\r\n      )}\r\n      <div\r\n        className={classnames(\r\n          'w-full min-w-64 p-2',\r\n          canSelectCustom && {\r\n            'h-72': isMobileDevice,\r\n            'h-64': !isMobileDevice,\r\n          }\r\n        )}\r\n      >\r\n        <ColorPicker {...props} canSelectCustom={canSelectCustom} onChange={onChange} onPaletteItemClick={() => {}} />\r\n      </div>\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    <Button\r\n      leftContent={<ColorPreview color={color} className={classnames('h-4 w-4', ButtonRounding.small)} />}\r\n      {...props}\r\n    >\r\n      {children}\r\n    </Button>\r\n  )\r\n}\r\n\r\ntype ButtonColorProperties = { color: string; label: string }\r\n\r\ninterface ButtonColorPickerProps<ColorType extends ButtonColorProperties>\r\n  extends Omit<ColorPickerProps, 'color' | 'onChange'> {\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<ColorType extends ButtonColorProperties>({\r\n  size,\r\n  icon,\r\n  colors,\r\n  className,\r\n  onChange,\r\n  buttonPickerDataTestId,\r\n  ...props\r\n}: ButtonColorPickerProps<ColorType>) {\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      <Button\r\n        state={popoverState}\r\n        as={PopoverTrigger}\r\n        data-testid={buttonPickerDataTestId}\r\n        theme=\"outline\"\r\n        className={classnames('p-0.5', className)}\r\n        rounding=\"regular\"\r\n        appearance=\"square\"\r\n        size={size}\r\n        active={isOpen}\r\n      >\r\n        <ColorPreview\r\n          icon={icon}\r\n          color={colors.map(({ color }) => color)}\r\n          className={classnames('h-full w-full', ButtonRounding.small)}\r\n        />\r\n      </Button>\r\n      <Popover state={popoverState} aria-label=\"Color picker\">\r\n        {isMultiPicker && (\r\n          <div className=\"flex justify-center p-2 pb-0\">\r\n            <ButtonGroup childComponent={ColorTabButton} hasDivider={false}>\r\n              {colors.map(({ color, label }, index) => (\r\n                <ColorTabButton\r\n                  key={index}\r\n                  color={color}\r\n                  active={activeColorIndex === index}\r\n                  onClick={() => setActiveColorIndex(index)}\r\n                >\r\n                  {label}\r\n                </ColorTabButton>\r\n              ))}\r\n            </ButtonGroup>\r\n          </div>\r\n        )}\r\n        <MultiColorPicker\r\n          key={activeColorIndex}\r\n          {...props}\r\n          color={colors[activeColorIndex].color}\r\n          onChange={handleColorChange}\r\n        />\r\n      </Popover>\r\n    </>\r\n  )\r\n}\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<InputProps, 'label'> {\r\n  className?: string\r\n  text: string\r\n  bottomLeftContent?: React.ReactNode\r\n}\r\n\r\nexport const CopyToClipboard: React.FC<Props> = ({ 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    <div className={className}>\r\n      <Textarea\r\n        label={label}\r\n        readOnly\r\n        onClick={(e) => e.currentTarget.select()}\r\n        inputClass=\"h-12\"\r\n        data-testid=\"copy-to-clipboard-textarea\"\r\n        value={text}\r\n      />\r\n      <div className=\"mt-1 flex flex-wrap\">\r\n        {bottomLeftContent && <div>{bottomLeftContent}</div>}\r\n        <Button\r\n          className=\"ml-auto flex-none\"\r\n          theme=\"blue\"\r\n          onClick={handleCopyToClipboard}\r\n          disabled={isCopied}\r\n          leftContent={isCopied ? 'checkboxTick' : undefined}\r\n          data-testid=\"copy-to-clipboard-copy-button\"\r\n        >\r\n          {isCopied ? 'Copied' : 'Copy'}\r\n        </Button>\r\n      </div>\r\n    </div>\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<React.HTMLProps<HTMLDivElement>, 'ref'>,\r\n    Pick<Ariakit.MenuProps, 'hideOnInteractOutside'> {\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={<div onMouseDown={…} />}` 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<StatelessDropdownProps>,\r\n  ref: React.ForwardedRef<HTMLButtonElement>\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        <Ariakit.MenuButton\r\n          ref={ref}\r\n          // @ts-expect-error - TS is correct here MenuButton doesn’t have `active` prop,\r\n          // but we want to pass it to the rendered component\r\n          active={store?.parent ? undefined : isOpen}\r\n          showOnHover={showOnHover}\r\n          render={trigger}\r\n        />\r\n      )}\r\n      <Ariakit.Menu\r\n        {...props}\r\n        focusable={false}\r\n        // Render in a portal to escape overflow\r\n        portal\r\n        modal={modal || showOnHover === false}\r\n        hideOnHoverOutside={showOnHover}\r\n        hideOnInteractOutside={hideOnInteractOutside}\r\n        preventBodyScroll={false}\r\n        // Do not keep the children mounted when the popover is closed\r\n        unmountOnHide={unmountOnHide}\r\n        // Space between button and popover\r\n        gutter={menuGutter}\r\n        // Manage the focus ourselves so we can prevent scrolling when focusing the disclosure element\r\n        // We can’t focus if using `showOnHover`.\r\n        autoFocusOnShow={autoFocusOnShow ?? focusWithoutScroll}\r\n        autoFocusOnHide={autoFocusOnHide ?? blurWithoutScroll}\r\n        // Custom event prevents scrolling issues\r\n        // See website PR #1968\r\n        backdrop={backdrop ?? <div onMouseDown={preventDefault} data-testid=\"dropdown-backdrop\" />}\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        <div\r\n          tabIndex={-1}\r\n          className=\"flex max-h-[500px] grow scroll-py-1.5 flex-col overflow-y-auto overscroll-contain p-1.5 outline-none\"\r\n        >\r\n          {children}\r\n        </div>\r\n      </Ariakit.Menu>\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<DropdownProps>,\r\n    ref: React.ForwardedRef<HTMLButtonElement>\r\n  ) => (\r\n    <Ariakit.MenuProvider store={state} focusLoop virtualFocus placement={placement} orientation={orientation}>\r\n      <StatelessDropdown ref={ref} {...props} />\r\n    </Ariakit.MenuProvider>\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<TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT>(\r\n  { as: asComponent, ...props }: PropsWithAs<TagType> & DropdownItemProps,\r\n  ref: React.ForwardedRef<HTMLDivElement>\r\n) {\r\n  return <Ariakit.MenuItem ref={ref} {...props} render={<OptionButton as={asComponent} />} />\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<TagType> & DropdownItemProps & { ref?: React.ForwardedRef<HTMLElement> }\r\n) => ReturnType<typeof DropdownItemComponent>\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\nexport const useDropdownState = Ariakit.useMenuStore\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<DropdownProps, 'trigger'> {\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<HTMLButtonElement>\r\n) {\r\n  return (\r\n    <Dropdown\r\n      ref={ref}\r\n      {...props}\r\n      aria-label=\"Context Menu\"\r\n      trigger={trigger!}\r\n      onClose={onClose}\r\n      // Props are passed to the underlying dropdown menu div, this disables context menu on options\r\n      onContextMenu={(ev) => ev.preventDefault()}\r\n    >\r\n      {items?.map((item, index) => {\r\n        if (item.type === 'divider') {\r\n          return <MenuGroup key={index} label={item.label} />\r\n        }\r\n\r\n        if (item?.options !== undefined) {\r\n          return (\r\n            <ContextMenuInner\r\n              items={item.options}\r\n              onClose={onClose}\r\n              trigger={\r\n                <DropdownItem rightContent=\"caretRight\" data-testid={`dropdown-menu-${item.id}`}>\r\n                  {item.label}\r\n                </DropdownItem>\r\n              }\r\n            />\r\n          )\r\n        }\r\n\r\n        return (\r\n          <DropdownItem\r\n            key={index}\r\n            onClick={() => {\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          </DropdownItem>\r\n        )\r\n      })}\r\n    </Dropdown>\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<HTMLDivElement> {\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<HTMLDivElement, ChartGridCellProps>(\r\n  ({ children, gridArea, className, ...props }, ref) => (\r\n    <div\r\n      {...props}\r\n      ref={ref}\r\n      className={classnames(className, 'flex flex-1 flex-col overflow-hidden')}\r\n      style={{ gridArea }}\r\n    >\r\n      {children}\r\n    </div>\r\n  )\r\n)\r\n\r\ninterface ChartGridCellProps extends React.HTMLProps<HTMLDivElement> {\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    <div\r\n      {...props}\r\n      className={classnames(className, 'grid grow gap-px', {\r\n        'border border-gray-100 bg-gray-100 dark:border-gray-700 dark:bg-gray-700': border,\r\n      })}\r\n      style={{ gridTemplateColumns: `repeat(${columns}, 1fr)`, gridTemplateRows: `repeat(${rows}, 1fr)` }}\r\n    >\r\n      {children}\r\n    </div>\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<ChartGridProps> = (props) => <GridLayout {...props} />\r\n","import * as React from 'react'\r\n\r\nimport { PropsWithAs, RequireByKey } from '../types'\r\n\r\nconst defaultValueAccessor: ValueAccessor<any, any, any> = (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<TagType> = typeof DEFAULT_VALUE_KEY,\r\n  ChangeKey extends keyof React.ComponentProps<TagType> = typeof DEFAULT_CHANGE_KEY,\r\n> = (...args: Parameters<React.ComponentProps<TagType>[ChangeKey]>) => React.ComponentProps<TagType>[ValueKey]\r\n\r\nexport type InnerStateProps<\r\n  TagType extends React.ElementType,\r\n  ValueKey extends keyof React.ComponentProps<TagType>,\r\n  ChangeKey extends keyof React.ComponentProps<TagType>,\r\n> = RequireByKey<PropsWithAs<TagType>, 'as'> & {\r\n  valueKey?: ValueKey\r\n  changeKey?: ChangeKey\r\n  valueAccessor?: ValueAccessor<TagType, ValueKey, ChangeKey>\r\n}\r\n\r\nexport function InnerState<\r\n  TagType extends React.ElementType,\r\n  ValueKey extends keyof React.ComponentProps<TagType> = typeof DEFAULT_VALUE_KEY,\r\n  ChangeKey extends keyof React.ComponentProps<TagType> = 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<TagType, ValueKey, ChangeKey>) {\r\n  const { [valueKey]: value, [changeKey]: onChange } = props\r\n  const [state, setState] = React.useState<React.ComponentProps<TagType>[ValueKey]>(value)\r\n\r\n  const handleChange = React.useCallback<ValueAccessor<TagType, ValueKey, ChangeKey>>(\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<HTMLInputElement>\r\n\r\ninterface RangeSliderProps extends Omit<InputProps, 'label' | 'size'> {\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<HTMLDivElement>(null)\r\n  const thumbRef = useRef<HTMLSpanElement>(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    <Label title={label} className={className}>\r\n      <div className={classnames(RangeSize[size], 'group flex h-8 items-center space-x-3')}>\r\n        {leftContent}\r\n\r\n        <div ref={trackRef} className=\"relative grow\">\r\n          <div className=\"group w-full\">\r\n            <div\r\n              className={classnames('h-0.5 overflow-hidden rounded bg-gray-200 dark:bg-gray-600', {\r\n                'opacity-0': !hasTrack,\r\n              })}\r\n            >\r\n              <div\r\n                className=\"h-full origin-top-left bg-blue-400 group-hover:bg-blue-500\"\r\n                style={{ width: `${thumbLeft}%` }}\r\n              />\r\n            </div>\r\n\r\n            <span\r\n              ref={thumbRef}\r\n              className={classnames(\r\n                'absolute top-1/2 -mt-3 h-6 w-6 rounded-full border-2 border-blue-400 bg-white shadow transition-transform duration-200 group-hover:scale-110 group-hover:border-blue-500 dark:bg-gray-600 sm:-mt-2 sm:h-4 sm:w-4',\r\n                { 'opacity-0': !hasTrack }\r\n              )}\r\n              style={{ left: `${thumbLeft}%` }}\r\n            />\r\n          </div>\r\n\r\n          <input\r\n            {...props}\r\n            type=\"range\"\r\n            min={min}\r\n            max={max}\r\n            step={step}\r\n            className={classnames(inputClassName, 'absolute top-0 h-full w-full cursor-pointer opacity-0')}\r\n          />\r\n        </div>\r\n\r\n        {rightContent}\r\n      </div>\r\n    </Label>\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<IToolbarContext>({\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<HTMLDivElement> => {\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<ToolbarProps>) {\r\n  const hasFocusRings = React.useRef(false)\r\n  const toolbarRef = React.useRef<HTMLDivElement>(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    <Ariakit.Menubar\r\n      ref={toolbarRef}\r\n      focusable={false}\r\n      id=\"toolbar\"\r\n      data-testid=\"toolbar\"\r\n      className={classnames(toolbarSettings.className, className)}\r\n      orientation={\r\n        contextProviderValue.isWrapped ? 'both' : contextProviderValue.isStretched ? 'horizontal' : 'vertical'\r\n      }\r\n    >\r\n      <Ariakit.MenuProvider\r\n        showTimeout={100}\r\n        hideTimeout={200}\r\n        placement={contextProviderValue.isStretched ? 'bottom' : 'right-start'}\r\n      >\r\n        <ToolbarContext.Provider value={contextProviderValue}>{children}</ToolbarContext.Provider>\r\n        <StatelessDropdown\r\n          // This is where all the group items will be rendered and the trigger will be assigned programmatically\r\n          trigger={null}\r\n          modal={false}\r\n          backdrop={false}\r\n          rounding={\r\n            contextProviderValue.theme === ToolbarTheme.alternative && !FinvizSettings.hasRedesignEnabled\r\n              ? 'none'\r\n              : undefined\r\n          }\r\n          autoFocusOnShow={() => {\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      </Ariakit.MenuProvider>\r\n    </Ariakit.Menubar>\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<ButtonHTMLProps, 'as'> & 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<ButtonProps, 'theme'> {\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<TagType extends React.ElementType = 'button'>(\r\n  { item, disabledTooltip, isInAction: isInActionProp, isLoading, ...props }: PropsWithAs<TagType> & ToolbarButtonProps,\r\n  ref: React.ForwardedRef<HTMLElement>\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    <Icon name={(props.active && item.iconActive) || item.icon} width={32} className=\"shrink-0\" />\r\n  )\r\n\r\n  return (\r\n    <Ariakit.MenuItem\r\n      {...props}\r\n      // Ariakit defines the element to be a div, but we know we are rendering a button\r\n      ref={ref as React.ForwardedRef<HTMLDivElement>}\r\n      store={context?.menubar || undefined}\r\n      blurOnHoverEnd\r\n      render={\r\n        <Button\r\n          {...buttonSettings}\r\n          className={buttonSettings.className}\r\n          appearance={props.appearance ?? 'square'}\r\n          title={props.disabled && disabledTooltip ? disabledTooltip : (props.active && item.titleActive) || item.title}\r\n          size={\r\n            buttonSettings.size ??\r\n            (theme === ToolbarTheme.chipTransparent || FinvizSettings.hasRedesignEnabled ? 'medium' : 'large')\r\n          }\r\n        >\r\n          {isLoading ? (\r\n            <Delayed delay={100} delayComponent={getMainIcon()}>\r\n              <Spinner width={16} />\r\n            </Delayed>\r\n          ) : (\r\n            <>\r\n              {props.children ??\r\n                (isInAction ? (\r\n                  <Delayed delay={100} delayComponent={getMainIcon()}>\r\n                    <Icon name={item.iconAction} width={32} className=\"shrink-0\" />\r\n                  </Delayed>\r\n                ) : (\r\n                  getMainIcon()\r\n                ))}\r\n            </>\r\n          )}\r\n        </Button>\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<HTMLButtonElement>\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<HTMLDivElement | null>(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<HTMLElement, Event>) => {\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    <ToolbarButton\r\n      ref={ref}\r\n      rowId={rowId}\r\n      className=\"relative\"\r\n      data-testid={`toolbar-group-${groupId}-expand`}\r\n      item={selectedItem}\r\n      active={isActive}\r\n      disabled={disabled}\r\n      title={groupTitle}\r\n      disabledTooltip={disabledTooltip}\r\n      isLoading={isLoading}\r\n    >\r\n      <Icon name={(isActive && selectedItem.iconActive) || selectedItem.icon} width={32} className=\"shrink-0\" />\r\n      <Icon name=\"toolExpand\" width={32} className=\"absolute flex\" />\r\n    </ToolbarButton>\r\n  )\r\n\r\n  if (useNativeSelect) {\r\n    return (\r\n      <label\r\n        className={classnames('relative flex', {\r\n          grow: isAlternativeTheme && isStretched,\r\n        })}\r\n      >\r\n        {trigger}\r\n        <NativeSelect\r\n          className=\"pointer-events-none\"\r\n          items={groupItems.map((item) => ({ 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      </label>\r\n    )\r\n  }\r\n\r\n  return (\r\n    <Ariakit.MenuProvider store={menu} parent={null} focusLoop virtualFocus>\r\n      <Ariakit.MenuButton\r\n        ref={setMenuButton}\r\n        showOnHover\r\n        render={trigger}\r\n        onFocusVisible={handleMenuOpen}\r\n        onClick={(ev: React.MouseEvent<HTMLButtonElement>) => {\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<HTMLButtonElement>) => {\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        <Ariakit.Portal portalElement={menuContentElement} render={<React.Fragment />}>\r\n          {groupItems.map((item) => (\r\n            <DropdownItem\r\n              key={item.id}\r\n              store={menu}\r\n              leftContent={<Icon name={item.icon} className=\"mr-1.5 shrink-0\" width={28} />}\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            </DropdownItem>\r\n          ))}\r\n        </Ariakit.Portal>\r\n      )}\r\n    </Ariakit.MenuProvider>\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<ToolbarGroupProps, 'groupItems'>) {\r\n  const isItemActive = isActive && !disabled\r\n\r\n  if (!!groupItems?.length) {\r\n    return (\r\n      <ToolbarGroup\r\n        rowId={rowId}\r\n        groupTitle={groupTitle}\r\n        groupItems={groupItems}\r\n        defaultItem={defaultItem}\r\n        disabled={disabled}\r\n        isActive={isItemActive}\r\n        isLoading={isLoading}\r\n        onChange={onChange}\r\n        useNativeSelect={useNativeSelect}\r\n        disabledTooltip={disabledTooltip}\r\n      />\r\n    )\r\n  }\r\n\r\n  return (\r\n    <ToolbarButton\r\n      rowId={rowId}\r\n      data-testid={`toolbar-item-${defaultItem.id}`}\r\n      item={defaultItem}\r\n      active={isItemActive}\r\n      isLoading={isLoading}\r\n      isInAction={isInAction}\r\n      disabled={disabled}\r\n      disabledTooltip={disabledTooltip}\r\n      onClick={() => {\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    <div\r\n      className={classnames(\r\n        'bg-gray-100 dark:bg-gray-600',\r\n        {\r\n          'col-span-2 min-h-[1px] w-full': direction === ToolbarDirection.vertical,\r\n          'mx-2 min-w-[1px]': direction === ToolbarDirection.horizontal,\r\n          'my-2': direction === ToolbarDirection.vertical && theme === ToolbarTheme.alternative,\r\n          'h-full': direction === ToolbarDirection.horizontal && theme !== ToolbarTheme.alternative,\r\n          'h-8': direction === ToolbarDirection.horizontal && theme === ToolbarTheme.alternative,\r\n        },\r\n        className\r\n      )}\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    <Box className=\"w-64 p-4 pb-14\">\r\n      {step.title && (\r\n        <Heading level={5} className=\"mb-2\">\r\n          {step.title}\r\n        </Heading>\r\n      )}\r\n      {step.body && <Paragraph>{step.body}</Paragraph>}\r\n    </Box>\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 = <T>(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<Shepherd.Tour | null>(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 <Icon name={content} />\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<ButtonComponentProps<TagType>, 'theme'>,\r\n  ref: React.ForwardedRef<HTMLElement>\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    <Button\r\n      // TS thinks the Omit type (due to spread above) doesn’t satisfy button props\r\n      {...(props as ButtonComponentProps<TagType>)}\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      <span>{children}</span>\r\n      {rightContent}\r\n    </Button>\r\n  )\r\n})\r\n\r\nexport function Tab<TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT>(\r\n  props: React.PropsWithChildren<ButtonComponentProps<TagType>>\r\n) {\r\n  return <Ariakit.Tab {...props} render={<InternalTab />} />\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    <Ariakit.TabList\r\n      {...props}\r\n      className={classNames(props.className, 'flex shadow-[inset_0_-1px_0] shadow-gray-100 dark:shadow-gray-700')}\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 <Ariakit.TabPanel {...props} />\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function Tabs({ children }: React.PropsWithChildren<Ariakit.TabProviderProps>) {\r\n  return (\r\n    <Ariakit.TabProvider>\r\n      <div className=\"w-full space-y-1\">{children}</div>\r\n    </Ariakit.TabProvider>\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<BadgeProps>) {\r\n  const badgePadding = BadgePadding[padding]\r\n  const badgeSize = BadgeSize[size]\r\n\r\n  return (\r\n    <span\r\n      className={classNames(\r\n        className,\r\n        'inline-flex justify-center rounded-full text-2xs leading-4 font-medium',\r\n        badgePadding,\r\n        badgeSize,\r\n        {\r\n          'bg-blue-500 text-blue-50 dark:text-white': active,\r\n          'bg-gray-200/30 text-default group-hover/badge:bg-gray-200/50 hover:bg-gray-200/50 dark:bg-gray-500/30 dark:group-hover/badge:bg-gray-200/50 dark:hover:bg-gray-200/50':\r\n            !active,\r\n        }\r\n      )}\r\n    >\r\n      {children}\r\n    </span>\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<TagProps>) {\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    <span\r\n      className={classNames(\r\n        className,\r\n        'inline-flex items-center justify-center',\r\n        tagPadding,\r\n        tagRounding,\r\n        tagVariant,\r\n        tagSize,\r\n        tagFont\r\n      )}\r\n    >\r\n      {children}\r\n    </span>\r\n  )\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType<typeof useNotification>\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<NotificationOptions>\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren<any>) {\r\n  const [isOpen, setIsOpen] = React.useState(false)\r\n  const [notification, setNotification] = React.useState<NotificationState | null>(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<NotificationOptions> = {}) => {\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    <NotificationContext.Provider value={context.current}>\r\n      {props.children}\r\n      {isOpen && (\r\n        <WrapperComponent>\r\n          <Ariakit.Dialog\r\n            role=\"alert\"\r\n            aria-label=\"Notification\"\r\n            className={classnames(\r\n              positionClass,\r\n              'pointer-events-none fixed left-0 top-0 z-notification flex origin-top-left p-2 opacity-0 transition-opacity data-[enter]:opacity-100 data-[leave]:transition-none sm:p-5'\r\n            )}\r\n            unmountOnHide\r\n            // Manually control the state\r\n            open={isOpen}\r\n            onClose={context.current.hide}\r\n            // Disable modal settings so that we can still interact with other elements\r\n            modal={false}\r\n            backdrop={false}\r\n            // Disable focus on the dialog element itself\r\n            focusable={false}\r\n            // Disable interactions\r\n            hideOnEscape={false}\r\n            hideOnInteractOutside={false}\r\n            autoFocusOnShow={false}\r\n            autoFocusOnHide={false}\r\n            // Set viewport styles so that notifications are visible on mobile zoom\r\n            style={{\r\n              width: viewport.width,\r\n              height: viewport.height,\r\n              transform: `translate(${viewport.left}px, ${viewport.top}px) scale(${viewport.scale})`,\r\n              willChange: 'auto',\r\n            }}\r\n          >\r\n            {notification?.element}\r\n          </Ariakit.Dialog>\r\n        </WrapperComponent>\r\n      )}\r\n    </NotificationContext.Provider>\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<T extends { notificationContext: NotificationContextType }>(\r\n  WrappedComponent: React.ComponentType<T>\r\n) {\r\n  const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n  const WithNotificationContext = (props: Omit<T, 'notificationContext'>) => {\r\n    const notification = useNotification()\r\n    return <WrappedComponent {...(props as T)} notificationContext={notification} />\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<NotificationProps>) {\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    <div\r\n      className={classnames(\r\n        className,\r\n        'pointer-events-auto flex space-x-4 rounded-md border border-transparent px-3 py-2 shadow-modal dark:shadow-modal-dark',\r\n        {\r\n          'bg-gray-800 dark:border-gray-600': theme === NotificationTheme.default,\r\n          'bg-green-500 text-green-100 dark:border-green-500 dark:bg-green-800': theme === NotificationTheme.success,\r\n          'bg-red-500 text-red-100 dark:border-red-500 dark:bg-red-800': theme === NotificationTheme.failure,\r\n        }\r\n      )}\r\n    >\r\n      <div className=\"text-left text-white\">{children}</div>\r\n      <div>\r\n        {actions ?? (\r\n          <Button as={Ariakit.DialogDismiss} theme=\"dark\">\r\n            {closeText}\r\n          </Button>\r\n        )}\r\n      </div>\r\n    </div>\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<string | null>(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      <Button\r\n        as=\"a\"\r\n        href={imageUri}\r\n        download={fileName}\r\n        onClick={() => {\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={<Icon name=\"import\" width={16} />}\r\n      >\r\n        Download\r\n      </Button>\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    <CopyToClipboard\r\n      label={\r\n        // m-0 class can be removed after removing old css from stock detail\r\n        <Heading level={5} className=\"m-0\">\r\n          Copy and paste link in email, website, or forum\r\n        </Heading>\r\n      }\r\n      text={shareUrl}\r\n      bottomLeftContent={\r\n        <div className=\"flex space-x-1\">\r\n          <FacebookShareButton url={shareUrl}>\r\n            <Button\r\n              as=\"span\"\r\n              size=\"small\"\r\n              contentClass=\"flex items-center\"\r\n              onClick={() => {\r\n                window.gtag?.('event', 'click', { event_category: 'social-share-facebook-button' })\r\n              }}\r\n              leftContent={<FacebookIcon size={16} round={true} className=\"shrink-0\" />}\r\n            >\r\n              Share\r\n            </Button>\r\n          </FacebookShareButton>\r\n          <TwitterShareButton url={shareUrl} via=\"FINVIZ_com\" title={title}>\r\n            <Button\r\n              as=\"span\"\r\n              size=\"small\"\r\n              contentClass=\"flex items-center\"\r\n              onClick={() => {\r\n                window.gtag?.('event', 'click', { event_category: 'social-share-twitter-button' })\r\n              }}\r\n              leftContent={<TwitterIcon size={16} round={true} className=\"shrink-0\" />}\r\n            >\r\n              Twitter\r\n            </Button>\r\n          </TwitterShareButton>\r\n          {imageToDownloadURL && (\r\n            <DownloadImageButton downloadUrl={imageToDownloadURL} base64ImageData={imageToDownloadBase64Data} />\r\n          )}\r\n        </div>\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<TooltipProps, 'gutter' | 'isPointerEventsEnabled'>,\r\n    Pick<Ariakit.TooltipStoreProps, 'placement'> {\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<TooltipInputProps>,\r\n  ref: React.ForwardedRef<HTMLInputElement>\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 = <Input {...props} ref={ref} name={name} />\r\n  if (!children && !prevMessage) return input\r\n\r\n  return (\r\n    <Ariakit.TooltipProvider placement={placement} open={isFocused && !!children}>\r\n      <TooltipTrigger\r\n        state={undefined}\r\n        hideOnBlur\r\n        showOnHover={false}\r\n        render={input}\r\n        onFocus={handleFocus.current}\r\n        onBlur={handleBlur.current}\r\n      />\r\n      <Tooltip\r\n        state={undefined}\r\n        isPointerEventsEnabled={isPointerEventsEnabled}\r\n        id={name}\r\n        color={color}\r\n        gutter={gutter}\r\n        className=\"px-2.5\"\r\n        hideOnHoverOutside={false}\r\n        data-testid={name?.length ? `${name}-tooltip` : undefined}\r\n      >\r\n        {children ?? prevMessage}\r\n      </Tooltip>\r\n    </Ariakit.TooltipProvider>\r\n  )\r\n}\r\n\r\nexport const TooltipInput = React.forwardRef(TooltipInputComponent)\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport * as tracking from '../../app/shared/tracking'\r\n\r\nexport function useTrackPageView(props?: { trackInitial?: boolean; trackAutomatically?: boolean }) {\r\n  const { trackInitial = false, trackAutomatically = true } = props ?? {}\r\n  const initialRender = React.useRef(trackInitial)\r\n  const location = useLocation()\r\n\r\n  const handleTrackView = React.useCallback(() => {\r\n    tracking.trackPageView({ pathname: location.pathname, query: location.search })\r\n  }, [location.pathname, location.search])\r\n\r\n  React.useEffect(() => {\r\n    if (!trackAutomatically) return\r\n    if (initialRender.current) handleTrackView()\r\n    initialRender.current = true\r\n  }, [trackAutomatically, handleTrackView, trackInitial])\r\n\r\n  return handleTrackView\r\n}\r\n","export const FONT_SIZE = {\r\n  XXS: 5,\r\n  XS: 7,\r\n  S: 8,\r\n  M: 10,\r\n  L: 11,\r\n  XXL: 18,\r\n  XXXL: 23,\r\n}\r\nexport const LINE_HEIGHT = {\r\n  XS: 7,\r\n  S: 8,\r\n  M: 10,\r\n}\r\nexport const PADDING = {\r\n  XXXS: 1,\r\n  XXS: 2,\r\n  XS: 3,\r\n  S: 5,\r\n}\r\nexport const MARGIN = {\r\n  XS: 4,\r\n}\r\nexport const CHART_MARGIN = {\r\n  S: 15,\r\n  M: 30,\r\n  L: 35,\r\n  XL: 38,\r\n  XXL: 48,\r\n}\r\nexport const SETTINGS_HEIGHT = 44\r\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\r\nexport const OFFSET = {\r\n  XXS: 2,\r\n  XS: 4,\r\n  S: 6,\r\n  M: 8,\r\n  XXL: 20,\r\n}\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nexport enum ChartEditorEnum {\r\n  publish = 'publish',\r\n  tools = 'tools',\r\n  ideas = 'ideas',\r\n  settings = 'settings',\r\n  timeframe = 'timeframe',\r\n}\r\n\r\nexport enum LayoutType {\r\n  '1h1v' = '1h1v',\r\n  '1h2v' = '1h2v',\r\n  '1h3v' = '1h3v',\r\n  '2h1v' = '2h1v',\r\n  '2h2v' = '2h2v',\r\n  '3h1v' = '3h1v',\r\n  '3h2v' = '3h2v',\r\n  '1l2r' = '1l2r',\r\n  '1t2b' = '1t2b',\r\n}\r\n\r\nexport enum CanvasElementType {\r\n  arrow = 'canvas/arrow',\r\n  avwapV1 = 'canvas/avwap/avwap_v1',\r\n  brushV1 = 'canvas/brush/brush_v1',\r\n  calloutV1 = 'canvas/callout/callout_v1',\r\n  curve = 'canvas/curve',\r\n  element = 'canvas/element',\r\n  elliottWaves = 'canvas/elliott_waves/elliott_waves',\r\n  ellipse = 'canvas/ellipse',\r\n  ellipseV1 = 'canvas/ellipse/ellipse_v1',\r\n  fibonacciRetracements = 'canvas/fibonacci_retracements',\r\n  horizontalLine = 'canvas/horizontal_line',\r\n  line = 'canvas/line',\r\n  measure = 'canvas/measure',\r\n  pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\r\n  polygon = 'canvas/polygon',\r\n  position = 'canvas/position',\r\n  rectangle = 'canvas/rectangle',\r\n  rotatedRectangle = 'canvas/rotated_rectangle',\r\n  rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\r\n  scaledLine = 'canvas/scaled_line',\r\n  scaledText = 'canvas/scaled_text',\r\n  symbol = 'canvas/symbol',\r\n  text = 'canvas/text',\r\n  triangle = 'canvas/triangle',\r\n  verticalLine = 'canvas/vertical_line',\r\n  xabcd = 'canvas/xabcd',\r\n}\r\n\r\nexport enum ChartElementType {\r\n  CandleStick = 'charts/candle_stick',\r\n  HeikinAshi = 'charts/heikin_ashi',\r\n  HollowCandleStick = 'charts/candle_stick_hollow',\r\n  LineChart = 'charts/line_chart',\r\n  OhlcChart = 'charts/ohlc_chart',\r\n  MarketSentiment = 'charts/market_sentiment',\r\n  MultiLineChart = 'charts/multi_line_chart',\r\n  PerfChart = 'charts/perf_chart',\r\n}\r\n\r\nexport enum IndicatorType {\r\n  Indicator = 'indicators/indicator',\r\n  None = 'indicators/none',\r\n  Adx = 'indicators/adx',\r\n  Aro = 'indicators/aro',\r\n  Aroosc = 'indicators/aroosc',\r\n  Atr = 'indicators/atr',\r\n  Cci = 'indicators/cci',\r\n  Cot = 'indicators/cot',\r\n  Fi = 'indicators/fi',\r\n  Macd = 'indicators/macd',\r\n  Mfi = 'indicators/mfi',\r\n  Obv = 'indicators/obv',\r\n  Perf = 'indicators/perf',\r\n  Rmi = 'indicators/rmi',\r\n  Roc = 'indicators/roc',\r\n  Rsi = 'indicators/rsi',\r\n  Rvol = 'indicators/rvol',\r\n  Rwi = 'indicators/rwi',\r\n  Stofa = 'indicators/stofa',\r\n  Stofu = 'indicators/stofu',\r\n  Stosl = 'indicators/stosl',\r\n  Trix = 'indicators/trix',\r\n  Ult = 'indicators/ult',\r\n  Vol = 'indicators/vol',\r\n  Wr = 'indicators/wr',\r\n  Shrtfl = 'indicators/shrtfl',\r\n  Shrtra = 'indicators/shrtra',\r\n\r\n  // NOTE: financial indicators\r\n  Ap = 'indicators/ap',\r\n  Bvps = 'indicators/bvps',\r\n  Capex = 'indicators/capex',\r\n  Cdp = 'indicators/cdp',\r\n  Csti = 'indicators/csti',\r\n  Cd = 'indicators/cd',\r\n  Cni = 'indicators/cni',\r\n  Cogs = 'indicators/cogs',\r\n  Cr = 'indicators/cr',\r\n  Ebitda = 'indicators/ebitda',\r\n  Ebit = 'indicators/ebit',\r\n  Epsbbe = 'indicators/epsbbe',\r\n  Epsd = 'indicators/epsd',\r\n  Epsfd = 'indicators/epsfd',\r\n  Ei = 'indicators/ei',\r\n  Fcf = 'indicators/fcf',\r\n  Ffo = 'indicators/ffo',\r\n  Gi = 'indicators/gi',\r\n  Gim = 'indicators/gim',\r\n  It = 'indicators/it',\r\n  Ia = 'indicators/ia',\r\n  Ie = 'indicators/ie',\r\n  Ii = 'indicators/ii',\r\n  Inv = 'indicators/inv',\r\n  Ltd = 'indicators/ltd',\r\n  Mcap = 'indicators/mcap',\r\n  Nafa = 'indicators/nafa',\r\n  Ncic = 'indicators/ncic',\r\n  Ncf = 'indicators/ncf',\r\n  Nfcf = 'indicators/nfcf',\r\n  Niacb = 'indicators/niacb',\r\n  Nif = 'indicators/nif',\r\n  Nico = 'indicators/nico',\r\n  Noni = 'indicators/noni',\r\n  Neti = 'indicators/neti',\r\n  Nl = 'indicators/nl',\r\n  Nm = 'indicators/nm',\r\n  Nocf = 'indicators/nocf',\r\n  Nppe = 'indicators/nppe',\r\n  Nie = 'indicators/nie',\r\n  Noe = 'indicators/noe',\r\n  OpInc = 'indicators/opinc',\r\n  OrdInc = 'indicators/ordinc',\r\n  Om = 'indicators/om',\r\n  Oa = 'indicators/oa',\r\n  Oca = 'indicators/oca',\r\n  Ocl = 'indicators/ocl',\r\n  Ofau = 'indicators/ofau',\r\n  Ofa = 'indicators/ofa',\r\n  Of = 'indicators/of',\r\n  Oia = 'indicators/oia',\r\n  Ol = 'indicators/ol',\r\n  Ooe = 'indicators/ooe',\r\n  Pe = 'indicators/pe',\r\n  Pti = 'indicators/pti',\r\n  Pb = 'indicators/pb',\r\n  Pfcf = 'indicators/pfcf',\r\n  Psf = 'indicators/psf',\r\n  Poi = 'indicators/poi',\r\n  Posi = 'indicators/posi',\r\n  Qr = 'indicators/qr',\r\n  Rd = 'indicators/rd',\r\n  Roa = 'indicators/roa',\r\n  Roate = 'indicators/roate',\r\n  Roi = 'indicators/roi',\r\n  Rev = 'indicators/rev',\r\n  Sgae = 'indicators/sgae',\r\n  Sgaeo = 'indicators/sgaeo',\r\n  So = 'indicators/so',\r\n  Std = 'indicators/std',\r\n  Str = 'indicators/str',\r\n  Tbvps = 'indicators/tbvps',\r\n  Ta = 'indicators/ta',\r\n  Tc = 'indicators/tc',\r\n  Tcdfb = 'indicators/tcdfb',\r\n  Tce = 'indicators/tce',\r\n  Tca = 'indicators/tca',\r\n  Tcl = 'indicators/tcl',\r\n  Td = 'indicators/td',\r\n  Teq = 'indicators/teq',\r\n  Texp = 'indicators/texp',\r\n  Tie = 'indicators/tie',\r\n  Tia = 'indicators/tia',\r\n  Tib = 'indicators/tib',\r\n  Tl = 'indicators/tl',\r\n  Tlse = 'indicators/tlse',\r\n  Tse = 'indicators/tse',\r\n  Ue = 'indicators/ue',\r\n  // Annual only indicators\r\n  Noie = 'indicators/noie',\r\n  Ole = 'indicators/ole',\r\n  Rea = 'indicators/rea',\r\n}\r\n\r\nexport const FUNDAMENTAL_INDICATOR_TYPES = [\r\n  IndicatorType.Ap,\r\n  IndicatorType.Bvps,\r\n  IndicatorType.Capex,\r\n  IndicatorType.Cdp,\r\n  IndicatorType.Csti,\r\n  IndicatorType.Cd,\r\n  IndicatorType.Cni,\r\n  IndicatorType.Cogs,\r\n  IndicatorType.Cr,\r\n  IndicatorType.Ebitda,\r\n  IndicatorType.Ebit,\r\n  IndicatorType.Epsbbe,\r\n  IndicatorType.Epsd,\r\n  IndicatorType.Epsfd,\r\n  IndicatorType.Ei,\r\n  IndicatorType.Fcf,\r\n  IndicatorType.Ffo,\r\n  IndicatorType.Gi,\r\n  IndicatorType.Gim,\r\n  IndicatorType.It,\r\n  IndicatorType.Ia,\r\n  IndicatorType.Ie,\r\n  IndicatorType.Ii,\r\n  IndicatorType.Inv,\r\n  IndicatorType.Ltd,\r\n  IndicatorType.Mcap,\r\n  IndicatorType.Nafa,\r\n  IndicatorType.Ncic,\r\n  IndicatorType.Ncf,\r\n  IndicatorType.Neti,\r\n  IndicatorType.Nfcf,\r\n  IndicatorType.Niacb,\r\n  IndicatorType.Nif,\r\n  IndicatorType.Nico,\r\n  IndicatorType.Noni,\r\n  IndicatorType.Nl,\r\n  IndicatorType.Nm,\r\n  IndicatorType.Nocf,\r\n  IndicatorType.Nppe,\r\n  IndicatorType.Nie,\r\n  IndicatorType.Noe,\r\n  IndicatorType.OpInc,\r\n  IndicatorType.OrdInc,\r\n  IndicatorType.Om,\r\n  IndicatorType.Oa,\r\n  IndicatorType.Oca,\r\n  IndicatorType.Ocl,\r\n  IndicatorType.Ofau,\r\n  IndicatorType.Ofa,\r\n  IndicatorType.Of,\r\n  IndicatorType.Oia,\r\n  IndicatorType.Ol,\r\n  IndicatorType.Ooe,\r\n  IndicatorType.Pe,\r\n  IndicatorType.Pti,\r\n  IndicatorType.Pb,\r\n  IndicatorType.Pfcf,\r\n  IndicatorType.Psf,\r\n  IndicatorType.Poi,\r\n  IndicatorType.Posi,\r\n  IndicatorType.Qr,\r\n  IndicatorType.Rd,\r\n  IndicatorType.Roa,\r\n  IndicatorType.Roate,\r\n  IndicatorType.Roi,\r\n  IndicatorType.Rev,\r\n  IndicatorType.Sgae,\r\n  IndicatorType.Sgaeo,\r\n  IndicatorType.So,\r\n  IndicatorType.Std,\r\n  IndicatorType.Str,\r\n  IndicatorType.Tbvps,\r\n  IndicatorType.Ta,\r\n  IndicatorType.Tc,\r\n  IndicatorType.Tcdfb,\r\n  IndicatorType.Tce,\r\n  IndicatorType.Tca,\r\n  IndicatorType.Tcl,\r\n  IndicatorType.Td,\r\n  IndicatorType.Teq,\r\n  IndicatorType.Texp,\r\n  IndicatorType.Tie,\r\n  IndicatorType.Tia,\r\n  IndicatorType.Tib,\r\n  IndicatorType.Tl,\r\n  IndicatorType.Tlse,\r\n  IndicatorType.Tse,\r\n  IndicatorType.Ue,\r\n  IndicatorType.Noie,\r\n  IndicatorType.Ole,\r\n  IndicatorType.Rea,\r\n] as const\r\n\r\nexport enum FundamentalPeriod {\r\n  Annual = 'annual',\r\n  Quarterly = 'quarterly',\r\n}\r\n\r\nexport const FundamentalPeriodLabel = {\r\n  [FundamentalPeriod.Annual]: 'Annual',\r\n  [FundamentalPeriod.Quarterly]: 'Quarterly',\r\n}\r\n\r\nexport const FundamentalPeriodShortLabel = {\r\n  [FundamentalPeriod.Annual]: 'FY',\r\n  [FundamentalPeriod.Quarterly]: 'FQ',\r\n}\r\n\r\nexport enum OverlayType {\r\n  Overlay = 'overlays/overlay',\r\n  None = 'overlays/none',\r\n  Bb = 'overlays/bb',\r\n  Dch = 'overlays/dch',\r\n  Ema = 'overlays/ema',\r\n  Ema2 = 'overlays/ema2',\r\n  Hilo = 'overlays/hilo',\r\n  Hline = 'overlays/hline',\r\n  Ic = 'overlays/ic',\r\n  Icf = 'overlays/icf',\r\n  Kch = 'overlays/kch',\r\n  Patterns = 'overlays/patterns',\r\n  Pp = 'overlays/pp',\r\n  Sar = 'overlays/sar',\r\n  Sma = 'overlays/sma',\r\n  Sma2 = 'overlays/sma2',\r\n  Str = 'overlays/str',\r\n  Vp = 'overlays/vp',\r\n  Vwap = 'overlays/vwap',\r\n}\r\n\r\nexport enum ChartEventType {\r\n  ChartEvent = 'chartEvent/chartEvent',\r\n  Dividends = 'chartEvent/dividends',\r\n  Split = 'chartEvent/split',\r\n  Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventBadgeType {\r\n  Dividends = 'chartEvent/dividends',\r\n  Split = 'chartEvent/split',\r\n  EarningsPositive = 'chartEvent/earnings',\r\n  EarningsNegative = 'chartEvent/earningsNegative',\r\n  EarningsNeutral = 'chartEvent/earningsNeutral',\r\n  EarningsFuture = 'chartEvent/earningsFuture',\r\n}\r\n\r\nexport const ChartEventLabels: Record<ChartEventBadgeType, string> = {\r\n  [ChartEventBadgeType.Dividends]: 'Dividends',\r\n  [ChartEventBadgeType.Split]: 'Split',\r\n  [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\r\n  [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\r\n  [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\r\n  [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\r\n}\r\n\r\ninterface LayoutRule {\r\n  columns: number\r\n  rows: number\r\n  count: number\r\n  gridAreas?: string[]\r\n}\r\n\r\nexport const LAYOUTS: Record<LayoutType, LayoutRule> = {\r\n  '1h1v': { columns: 1, rows: 1, count: 1 },\r\n  '1h2v': { columns: 1, rows: 2, count: 2 },\r\n  '1h3v': { columns: 1, rows: 3, count: 3 },\r\n  '2h1v': { columns: 2, rows: 1, count: 2 },\r\n  '2h2v': { columns: 2, rows: 2, count: 4 },\r\n  '3h1v': { columns: 3, rows: 1, count: 3 },\r\n  '3h2v': { columns: 3, rows: 2, count: 6 },\r\n  '1l2r': {\r\n    columns: 2,\r\n    rows: 2,\r\n    count: 3,\r\n    gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\r\n  },\r\n  '1t2b': {\r\n    columns: 2,\r\n    rows: 2,\r\n    count: 3,\r\n    gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\r\n  },\r\n}\r\n\r\nexport const SORT_DIRECTION = {\r\n  ASC: 'ASC',\r\n  DESC: 'DESC',\r\n}\r\n\r\nexport const ICON_SIZE = {\r\n  L: 32,\r\n}\r\n\r\n// Keep in sync with the copy in Website repo - Website/js/main/constants/common.ts\r\nexport enum TIMEFRAME {\r\n  i1 = 'i1',\r\n  i2 = 'i2',\r\n  i3 = 'i3',\r\n  i5 = 'i5',\r\n  i10 = 'i10',\r\n  i15 = 'i15',\r\n  i30 = 'i30',\r\n  h = 'h',\r\n  h2 = 'h2',\r\n  h4 = 'h4',\r\n  d = 'd',\r\n  w = 'w',\r\n  m = 'm',\r\n}\r\n\r\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\r\n\r\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\r\n\r\nexport const IntradayTimeframeInterval = {\r\n  [TIMEFRAME.i1]: 1,\r\n  [TIMEFRAME.i2]: 2,\r\n  [TIMEFRAME.i3]: 3,\r\n  [TIMEFRAME.i5]: 5,\r\n  [TIMEFRAME.i10]: 10,\r\n  [TIMEFRAME.i15]: 15,\r\n  [TIMEFRAME.i30]: 30,\r\n  [TIMEFRAME.h]: 60,\r\n  [TIMEFRAME.h2]: 120,\r\n  [TIMEFRAME.h4]: 240,\r\n}\r\n\r\nexport const TimeframeLabelShort = {\r\n  [TIMEFRAME.i1]: '1M',\r\n  [TIMEFRAME.i2]: '2M',\r\n  [TIMEFRAME.i3]: '3M',\r\n  [TIMEFRAME.i5]: '5M',\r\n  [TIMEFRAME.i10]: '10M',\r\n  [TIMEFRAME.i15]: '15M',\r\n  [TIMEFRAME.i30]: '30M',\r\n  [TIMEFRAME.h]: '1H',\r\n  [TIMEFRAME.h2]: '2H',\r\n  [TIMEFRAME.h4]: '4H',\r\n  [TIMEFRAME.d]: 'D',\r\n  [TIMEFRAME.w]: 'W',\r\n  [TIMEFRAME.m]: 'M',\r\n}\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 enum QuoteFinancialAttachment {\r\n  shortInterest = 'shortInterest',\r\n}\r\n\r\nexport type QuoteFundamentalAttachmentType =\r\n  `${(typeof FUNDAMENTAL_INDICATOR_TYPES)[number] extends `indicators/${infer Type}` ? Type : never}_${FundamentalPeriod}`\r\n\r\nexport type QuoteFinancialAttachmentType = QuoteFinancialAttachment | QuoteFundamentalAttachmentType\r\n\r\nexport const TIMEFRAME_SECONDS = {\r\n  [TIMEFRAME.i1]: 60,\r\n  [TIMEFRAME.i2]: 120,\r\n  [TIMEFRAME.i3]: 180,\r\n  [TIMEFRAME.i5]: 300,\r\n  [TIMEFRAME.i10]: 600,\r\n  [TIMEFRAME.i15]: 900,\r\n  [TIMEFRAME.i30]: 1800,\r\n  [TIMEFRAME.h]: 3600,\r\n  [TIMEFRAME.h2]: 7200,\r\n  [TIMEFRAME.h4]: 14400,\r\n  [TIMEFRAME.d]: 86400,\r\n  [TIMEFRAME.w]: 604800,\r\n  [TIMEFRAME.m]: 2592000,\r\n}\r\n\r\nexport const CRYPTOS = {\r\n  // USD pairs\r\n  BTCUSD: 'BTCUSD',\r\n  ETHUSD: 'ETHUSD',\r\n  BNBUSD: 'BNBUSD',\r\n  SOLUSD: 'SOLUSD',\r\n  XRPUSD: 'XRPUSD',\r\n  DOGEUSD: 'DOGEUSD',\r\n  ADAUSD: 'ADAUSD',\r\n  TRXUSD: 'TRXUSD',\r\n  AVAXUSD: 'AVAXUSD',\r\n  DOTUSD: 'DOTUSD',\r\n  BCHUSD: 'BCHUSD',\r\n  NEARUSD: 'NEARUSD',\r\n  LTCUSD: 'LTCUSD',\r\n  APTUSD: 'APTUSD',\r\n  XLMUSD: 'XLMUSD',\r\n  LINKUSD: 'LINKUSD',\r\n  ETCUSD: 'ETCUSD',\r\n  UNIUSD: 'UNIUSD',\r\n  EGLDUSD: 'EGLDUSD',\r\n  OPUSD: 'OPUSD',\r\n  SUIUSD: 'SUIUSD',\r\n  AAVEUSD: 'AAVEUSD',\r\n\r\n  // EUR pairs\r\n  BTCEUR: 'BTCEUR',\r\n  ETHEUR: 'ETHEUR',\r\n  BNBEUR: 'BNBEUR',\r\n  SOLEUR: 'SOLEUR',\r\n  XRPEUR: 'XRPEUR',\r\n  DOGEEUR: 'DOGEEUR',\r\n  ADAEUR: 'ADAEUR',\r\n  TRXEUR: 'TRXEUR',\r\n  AVAXEUR: 'AVAXEUR',\r\n  DOTEUR: 'DOTEUR',\r\n  BCHEUR: 'BCHEUR',\r\n  NEAREUR: 'NEAREUR',\r\n  LTCEUR: 'LTCEUR',\r\n  ICPEUR: 'ICPEUR',\r\n  APTEUR: 'APTEUR',\r\n  XLMEUR: 'XLMEUR',\r\n  LINKEUR: 'LINKEUR',\r\n  SHIBEUR: 'SHIBEUR',\r\n  EGLDEUR: 'EGLDEUR',\r\n  SEUR: 'SEUR',\r\n  OPEUR: 'OPEUR',\r\n  SUIEUR: 'SUIEUR',\r\n\r\n  // USDT pairs\r\n  BTCUSDT: 'BTCUSDT',\r\n  ETHUSDT: 'ETHUSDT',\r\n  BNBUSDT: 'BNBUSDT',\r\n  SOLUSDT: 'SOLUSDT',\r\n  XRPUSDT: 'XRPUSDT',\r\n  DOGEUSDT: 'DOGEUSDT',\r\n  ADAUSDT: 'ADAUSDT',\r\n  TRXUSDT: 'TRXUSDT',\r\n  AVAXUSDT: 'AVAXUSDT',\r\n  DOTUSDT: 'DOTUSDT',\r\n  BCHUSDT: 'BCHUSDT',\r\n  NEARUSDT: 'NEARUSDT',\r\n  LTCUSDT: 'LTCUSDT',\r\n  ICPUSDT: 'ICPUSDT',\r\n  FETUSDT: 'FETUSDT',\r\n  ETCUSDT: 'ETCUSDT',\r\n  APTUSDT: 'APTUSDT',\r\n  XLMUSDT: 'XLMUSDT',\r\n  LINKUSDT: 'LINKUSDT',\r\n  SHIBUSDT: 'SHIBUSDT',\r\n  UNIUSDT: 'UNIUSDT',\r\n  EGLDUSDT: 'EGLDUSDT',\r\n  SUSDT: 'SUSDT',\r\n  OPUSDT: 'OPUSDT',\r\n  SUIUSDT: 'SUIUSDT',\r\n  AAVEUSDT: 'AAVEUSDT',\r\n  TRUMPUSDT: 'TRUMPUSDT',\r\n\r\n  // BTC pairs\r\n  ETHBTC: 'ETHBTC',\r\n  BNBBTC: 'BNBBTC',\r\n  SOLBTC: 'SOLBTC',\r\n  XRPBTC: 'XRPBTC',\r\n  DOGEBTC: 'DOGEBTC',\r\n  ADABTC: 'ADABTC',\r\n  TRXBTC: 'TRXBTC',\r\n  AVAXBTC: 'AVAXBTC',\r\n  DOTBTC: 'DOTBTC',\r\n  BCHBTC: 'BCHBTC',\r\n  NEARBTC: 'NEARBTC',\r\n  LTCBTC: 'LTCBTC',\r\n  ICPBTC: 'ICPBTC',\r\n  FETBTC: 'FETBTC',\r\n  ETCBTC: 'ETCBTC',\r\n  APTBTC: 'APTBTC',\r\n  XLMBTC: 'XLMBTC',\r\n  LINKBTC: 'LINKBTC',\r\n  UNIBTC: 'UNIBTC',\r\n  EGLDBTC: 'EGLDBTC',\r\n  SBTC: 'SBTC',\r\n  OPBTC: 'OPBTC',\r\n  SUIBTC: 'SUIBTC',\r\n  AAVEBTC: 'AAVEBTC',\r\n} as const\r\n\r\nexport enum SpecificChartFunctionality {\r\n  default = 'default',\r\n  quotePage = 'quotePage',\r\n  quotePerf = 'quotePerf',\r\n  quoteFinancials = 'quoteFinancials',\r\n  chartPage = 'chartPage',\r\n  smallIndex = 'smallIndex',\r\n  offScreen = 'offScreen',\r\n  forexPage = 'forexPage',\r\n  futuresPage = 'futuresPage',\r\n  cryptoPage = 'cryptoPage',\r\n}\r\n\r\nexport enum TextAlign {\r\n  left = 'left',\r\n  right = 'right',\r\n  center = 'center',\r\n  start = 'start',\r\n  end = 'end',\r\n}\r\n\r\nexport enum TextBaseline {\r\n  top = 'top',\r\n  hanging = 'hanging',\r\n  middle = 'middle',\r\n  alphabetic = 'alphabetic',\r\n  ideographic = 'ideographic',\r\n  bottom = 'bottom',\r\n}\r\n\r\nexport enum ScaleType {\r\n  Linear = 'linear',\r\n  Percentage = 'percentage',\r\n  Logarithmic = 'logarithmic',\r\n}\r\n\r\nexport const QuotePollingIntervalInMs = {\r\n  Elite: {\r\n    Default: 2000,\r\n    Stock: 500,\r\n    Forex: 5000,\r\n    Crypto: 5000,\r\n    Futures: 5000,\r\n  },\r\n  Free: {\r\n    Default: 30000,\r\n    Stock: 30000,\r\n    Forex: 5000,\r\n    Crypto: 5000,\r\n    Futures: 5000,\r\n  },\r\n  Reduced: 60000,\r\n}\r\n\r\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\r\n\r\nexport const ScaleLabel = {\r\n  [ScaleType.Linear]: 'Linear',\r\n  [ScaleType.Percentage]: 'Percentage',\r\n  [ScaleType.Logarithmic]: 'Logarithmic',\r\n}\r\n\r\nexport const PANE_HEIGHT_DEFAULT = {\r\n  chart: 400,\r\n  indicator: 120,\r\n}\r\n\r\nexport const INDICATOR_LABEL_HEIGHT = 24\r\n\r\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\r\n\r\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\r\n\r\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\r\n\r\nexport const getTimeframeLabel = (timeframe: string) => {\r\n  switch (timeframe) {\r\n    case TIMEFRAME.i1:\r\n      return '1 MIN'\r\n    case TIMEFRAME.i2:\r\n      return '2 MIN'\r\n    case TIMEFRAME.i3:\r\n      return '3 MIN'\r\n    case TIMEFRAME.i5:\r\n      return '5 MIN'\r\n    case TIMEFRAME.i10:\r\n      return '10 MIN'\r\n    case TIMEFRAME.i15:\r\n      return '15 MIN'\r\n    case TIMEFRAME.i30:\r\n      return '30 MIN'\r\n    case TIMEFRAME.h:\r\n      return '1 HR'\r\n    case TIMEFRAME.h2:\r\n      return '2 HR'\r\n    case TIMEFRAME.h4:\r\n      return '4 HR'\r\n    case TIMEFRAME.d:\r\n      return 'DAILY'\r\n    case TIMEFRAME.w:\r\n      return 'WEEKLY'\r\n    case TIMEFRAME.m:\r\n      return 'MONTHLY'\r\n    default:\r\n      return ''\r\n  }\r\n}\r\n\r\nexport type ChartsPageQueryParams = {\r\n  p: string\r\n  t: string\r\n  l: string\r\n  r?: string\r\n  i?: string\r\n  sidebar?: string\r\n}\r\n\r\nexport type QuotePageQueryParams = {\r\n  p?: string\r\n  t: string\r\n  r?: string\r\n  i?: string\r\n  ty?: QuotePageQueryChartTypes\r\n}\r\n\r\nexport enum QuotePageQueryChartTypes {\r\n  l = 'l',\r\n  c = 'c',\r\n  cs = 'cs',\r\n  hc = 'hc',\r\n  ha = 'ha',\r\n  o = 'o',\r\n  p = 'p',\r\n}\r\n\r\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\r\n\r\nexport enum MacroTimeframe {\r\n  // seconds = 'seconds',\r\n  minutes = 'minutes',\r\n  hours = 'hours',\r\n  days = 'days',\r\n  weeks = 'weeks',\r\n  months = 'months',\r\n}\r\n\r\nexport const MicroMacroTimeframe = {\r\n  [TIMEFRAME.i1]: {\r\n    micro: 1,\r\n    macro: MacroTimeframe.minutes,\r\n  },\r\n  [TIMEFRAME.i2]: {\r\n    micro: 2,\r\n    macro: MacroTimeframe.minutes,\r\n  },\r\n  [TIMEFRAME.i3]: {\r\n    micro: 3,\r\n    macro: MacroTimeframe.minutes,\r\n  },\r\n  [TIMEFRAME.i5]: {\r\n    micro: 5,\r\n    macro: MacroTimeframe.minutes,\r\n  },\r\n  [TIMEFRAME.i10]: {\r\n    micro: 10,\r\n    macro: MacroTimeframe.minutes,\r\n  },\r\n  [TIMEFRAME.i15]: {\r\n    micro: 15,\r\n    macro: MacroTimeframe.minutes,\r\n  },\r\n  [TIMEFRAME.i30]: {\r\n    micro: 30,\r\n    macro: MacroTimeframe.minutes,\r\n  },\r\n  [TIMEFRAME.h]: {\r\n    micro: 1,\r\n    macro: MacroTimeframe.hours,\r\n  },\r\n  [TIMEFRAME.h2]: {\r\n    micro: 2,\r\n    macro: MacroTimeframe.hours,\r\n  },\r\n  [TIMEFRAME.h4]: {\r\n    micro: 4,\r\n    macro: MacroTimeframe.hours,\r\n  },\r\n  [TIMEFRAME.d]: {\r\n    micro: 1,\r\n    macro: MacroTimeframe.days,\r\n  },\r\n  [TIMEFRAME.w]: {\r\n    micro: 1,\r\n    macro: MacroTimeframe.weeks,\r\n  },\r\n  [TIMEFRAME.m]: {\r\n    micro: 1,\r\n    macro: MacroTimeframe.months,\r\n  },\r\n}\r\n\r\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\r\n  (prev, curr) => ({\r\n    ...prev,\r\n    [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\r\n      ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\r\n      : [MicroMacroTimeframe[curr].micro],\r\n  }),\r\n  {} as { [key in MacroTimeframe]: number[] }\r\n)\r\n\r\ntype IRange = {\r\n  from?: number\r\n  to?: number\r\n}\r\n\r\nexport type IVisibility = {\r\n  [key in MacroTimeframe]?: IRange\r\n}\r\n\r\nexport enum SetVisibilityTo {\r\n  currentAndAbove,\r\n  currentAndBelow,\r\n  currentOnly,\r\n  all,\r\n}\r\n\r\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\r\n\r\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\nexport const CHART_ELEMENT_ID = 'chart'\r\n\r\nexport const CHART_SETTINGS_DIALOG_TEST_ID = 'chart-settings-dialog'\r\n\r\nexport const MARKET_START = { hours: 9, minutes: 30 }\r\nexport const MARKET_END = { hours: 16, minutes: 0 }\r\n","import {\r\n  MARKET_END,\r\n  MARKET_START,\r\n  MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n  PREMARKET_AFTERMARKET_HOURS,\r\n  SpecificChartFunctionality,\r\n} from './constants/common'\r\nimport { captureException, getIsSSr } from './utils/helpers'\r\n\r\nexport { getSanitizedTicker } from './utils/ticker-sanitizer'\r\n\r\nfunction 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\nclass Utils {\r\n  static min<T extends number | number[] = number[]>(...args: T[]): number {\r\n    if (typeof args[0] === 'number') {\r\n      return args[0] < +args[1] ? args[0] : (args[1] as number)\r\n    }\r\n    let min = args[0][0]\r\n    for (const arg of args) {\r\n      for (const el of arg as number[]) {\r\n        if (el < min) {\r\n          min = el\r\n        }\r\n      }\r\n    }\r\n    return min\r\n  }\r\n\r\n  static max<T extends number | number[] = number[]>(...args: T[]): number {\r\n    if (typeof args[0] === 'number') {\r\n      return args[0] > +args[1] ? args[0] : (args[1] as number)\r\n    }\r\n    let max = args[0][0]\r\n    for (const arg of args) {\r\n      for (const el of arg as number[]) {\r\n        if (el > max) {\r\n          max = el\r\n        }\r\n      }\r\n    }\r\n    return max\r\n  }\r\n\r\n  static minMax(...args: number[][]) {\r\n    let max\r\n    let min = (max = args[0][0] as number)\r\n    for (const arg of args) {\r\n      for (const el of arg) {\r\n        if (el < min) {\r\n          min = el\r\n        }\r\n        if (el > max) {\r\n          max = el\r\n        }\r\n      }\r\n    }\r\n    return [min, max]\r\n  }\r\n\r\n  static getScaleRatio() {\r\n    return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\r\n  }\r\n\r\n  static setSizeOnCanvasElement({\r\n    canvasElement,\r\n    width,\r\n    height,\r\n    ratio = Utils.getScaleRatio(),\r\n  }: {\r\n    canvasElement: HTMLCanvasElement | null\r\n    width: number\r\n    height: number\r\n    ratio?: number\r\n  }) {\r\n    if (canvasElement) {\r\n      canvasElement.width = width * ratio\r\n      canvasElement.height = height * ratio\r\n      canvasElement.style.width = width + 'px'\r\n      canvasElement.style.height = height + 'px'\r\n    }\r\n  }\r\n\r\n  static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\r\n    const date = referenceDate || 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    return (isDst ? 4 : 5) * 60 * 60\r\n  }\r\n\r\n  static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\r\n    const date = new Date(referenceDate)\r\n    const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\r\n    const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\r\n    const offsetDirectionCoefficient = addOffset ? 1 : -1\r\n    date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\r\n    return date\r\n  }\r\n\r\n  // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\r\n  static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n    const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n    const date = convertLocalToNyTime(new Date(), true)\r\n    const dayOfWeek = date.getDay()\r\n    const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n    const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n    const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n    const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n    const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n    const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n    return !isWeekend && isOpen && !isClosed\r\n  }\r\n\r\n  static dateFromUnixTimestamp(timestamp: number) {\r\n    /*\r\n     * Passing 0 as a param is needed in order to setUTCSeconds work properly.\r\n     * The function adds seconds to the date instance if it exceeds 60.\r\n     * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\r\n     * */\r\n    const date = new Date(0)\r\n    date.setUTCSeconds(timestamp)\r\n    return Utils.convertLocalToNyTime(date, true)\r\n  }\r\n\r\n  static dateStringFromDate(date: Date) {\r\n    return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\r\n      2,\r\n      '0'\r\n    )}`\r\n  }\r\n\r\n  static dateFromDateString(dateString: string) {\r\n    const [yyyy, mm, dd] = dateString.split('-')\r\n\r\n    const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\r\n    if (Number.isNaN(date.getTime())) {\r\n      captureException(new Error('Invalid Date'), { extra: { date, dateString } })\r\n    }\r\n\r\n    return date\r\n  }\r\n\r\n  static isMobile(testTouchPoints?: boolean) {\r\n    if (getIsSSr()) return false\r\n    let isMobileOs = false\r\n\r\n    // New iOS versions no longer report iPad in user agent\r\n    if (navigator.userAgent.indexOf('Macintosh') > -1) {\r\n      try {\r\n        document.createEvent('TouchEvent')\r\n        isMobileOs = true\r\n      } catch {}\r\n    } else {\r\n      isMobileOs = !!navigator.userAgent.match(\r\n        /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\r\n      )\r\n    }\r\n\r\n    if (testTouchPoints) {\r\n      try {\r\n        return (\r\n          isMobileOs &&\r\n          (window.navigator.msMaxTouchPoints ||\r\n            window.navigator.maxTouchPoints ||\r\n            'ontouchstart' in document.createElement('div'))\r\n        )\r\n      } catch {}\r\n    }\r\n\r\n    return isMobileOs\r\n  }\r\n\r\n  static isIPad() {\r\n    const matchesIPad = navigator.userAgent.match(/iPad/i)\r\n    const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n    const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n    const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n    return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\r\n  }\r\n\r\n  static getCookie(name: string) {\r\n    const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n    return document.cookie.replace(re, '$1')\r\n  }\r\n\r\n  static setCookie(name: string, value: string, expires: Date) {\r\n    let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n    if (document.location.hostname !== 'localhost') {\r\n      cookie += '; domain=.finviz.com'\r\n    }\r\n    document.cookie = cookie\r\n  }\r\n}\r\n\r\nexport default Utils\r\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\r\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\r\nexport const dateStringFromDate = Utils.dateStringFromDate\r\nexport const dateFromDateString = Utils.dateFromDateString\r\n\r\nexport function getFullscreenStatus(): boolean {\r\n  return (\r\n    document.fullscreenElement ??\r\n    document.webkitFullscreenElement ??\r\n    document.mozFullScreenElement ??\r\n    document.msFullscreenElement ??\r\n    false\r\n  )\r\n}\r\n\r\nexport function getRequestFullscreen(element: HTMLElement) {\r\n  return (\r\n    element.requestFullscreen ??\r\n    element.webkitRequestFullScreen ??\r\n    element.mozRequestFullScreen ??\r\n    element.msRequestFullscreen\r\n  )\r\n}\r\n\r\nexport function getExitFullscreen() {\r\n  return (\r\n    document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\r\n  )\r\n}\r\n\r\nexport function ready(fn: () => void) {\r\n  if (document.readyState !== 'loading') {\r\n    fn()\r\n    return\r\n  }\r\n\r\n  document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n\r\nexport function getChartsDimensions(chartElementId: string) {\r\n  const PADDING = 2 // Border widths\r\n  const containerElement = document.getElementById(chartElementId)\r\n\r\n  const box = containerElement?.getBoundingClientRect()\r\n\r\n  return {\r\n    width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n    height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n  }\r\n}\r\n\r\nexport function getIsMobileScreenSize() {\r\n  return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\r\n}\r\n\r\nexport function getIsMobilePortrait(isMobile?: boolean) {\r\n  if (isMobile ?? Utils.isMobile()) {\r\n    return window.orientation % 180 === 0\r\n  }\r\n  return false\r\n}\r\n\r\nexport function numberToStringWithUnitsSuffix(value: number) {\r\n  let suffix = ''\r\n  if (value >= 1000000000) {\r\n    value /= 1000000000\r\n    suffix = 'B'\r\n  } else if (value >= 1000000) {\r\n    value /= 1000000\r\n    suffix = 'M'\r\n  } else if (value >= 1000) {\r\n    value /= 1000\r\n    suffix = 'K'\r\n  }\r\n\r\n  return value.toFixed(2) + suffix\r\n}\r\n\r\nexport function isRedesignEnabled() {\r\n  return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\r\n}\r\n\r\nexport function isRedesignedPage(\r\n  obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\r\n  matchingPages = [\r\n    SpecificChartFunctionality.forexPage,\r\n    SpecificChartFunctionality.futuresPage,\r\n    SpecificChartFunctionality.cryptoPage,\r\n  ]\r\n) {\r\n  const isQuotePage = obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n  const isQuoteFinancials = obj.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials\r\n\r\n  return (\r\n    (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\r\n    // Legacy design on quote uses redesigned elements (page header + chart controls)\r\n    isQuotePage ||\r\n    isQuoteFinancials\r\n  )\r\n}\r\n\r\nexport function getMaxValue(currentValue: number | undefined, newValue: number | undefined) {\r\n  return currentValue && newValue ? Math.max(currentValue, newValue) : (currentValue ?? newValue ?? undefined)\r\n}\r\n\r\nexport function getMinValue(currentValue: number | undefined, newValue: number | undefined) {\r\n  return currentValue && newValue ? Math.min(currentValue, newValue) : (currentValue ?? newValue ?? undefined)\r\n}\r\n","import { EmptyObject, ObjectHash } from '../../types/shared'\r\n\r\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\r\n  const precision = Math.pow(10, numOfDecimalPlaces)\r\n  return String(Math.round(number * precision) / precision)\r\n}\r\n\r\nexport function getIsSSr() {\r\n  return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\r\n}\r\n\r\nexport function isValidHexColor(color: string) {\r\n  const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\r\n  return !!color && regex.test(color)\r\n}\r\n\r\nexport function getParsedIntegersFromPeriodString(periodString: string | number) {\r\n  // Ideas have number periods\r\n  const periodParts = `${periodString}`.split(',')\r\n  return periodParts.map((part) => Number.parseInt(part, 10))\r\n}\r\n\r\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\r\n  if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\r\n    console.error(exception)\r\n  } else if (process.env.IS_OFFSCREEN_RENDERER) {\r\n    if (!global.Sentry) {\r\n      console.error('Sentry is not defined in the global scope !')\r\n      return\r\n    }\r\n    global.Sentry.captureException(exception, captureContext)\r\n  } else {\r\n    window.Sentry.captureException(exception, captureContext)\r\n  }\r\n}\r\n\r\nexport function isPositiveFloat(value: string | number) {\r\n  const parsedNumber = Number.parseFloat(`${value}`)\r\n  return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\r\n}\r\n\r\nexport function isPositiveInteger(value: string | number) {\r\n  const string = `${value}`\r\n  return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\r\n}\r\n\r\nexport function isInRange({\r\n  value,\r\n  min = Number.MIN_SAFE_INTEGER,\r\n  max = Number.MAX_SAFE_INTEGER,\r\n}: {\r\n  value: string | number\r\n  min?: number\r\n  max?: number\r\n}) {\r\n  const parsedNumber = Number.parseFloat(`${value}`)\r\n  return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\r\n}\r\n\r\nexport function tryJsonParse<Result extends ObjectHash = EmptyObject>(json: string | null = '') {\r\n  try {\r\n    return JSON.parse(json ?? '') as Result\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\r\n  return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\r\n  // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\r\n  // as cy.get('.target').trigger('mousedown', { button: 0 })\r\n  if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\r\n    return (e as unknown as MouseEvent).button === 0\r\n  } else {\r\n    return true\r\n  }\r\n}\r\n\r\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\r\nexport function getJSONReplacerFunc() {\r\n  const visited = new WeakSet()\r\n  return (key: string, value: any) => {\r\n    if (typeof value === 'object' && value !== null) {\r\n      if (visited.has(value)) {\r\n        return\r\n      }\r\n      visited.add(value)\r\n    }\r\n    return value\r\n  }\r\n}\r\n\r\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\r\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\r\n  date.toLocaleDateString('en-US', {\r\n    day: '2-digit',\r\n    month: '2-digit',\r\n    year: 'numeric',\r\n    ...options,\r\n  })\r\n\r\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\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// duplicate from Website/js/main/util.ts, to be refactored\r\nexport function getEarningsDateSuffix(date: Date) {\r\n  const hours = date.getHours()\r\n\r\n  if (hours <= 9) {\r\n    return 'BMO'\r\n  } else if (hours >= 16) {\r\n    return 'AMC'\r\n  }\r\n\r\n  return ''\r\n}\r\n\r\nexport function isValidTickerString(ticker: string) {\r\n  const regex = /^@?[a-z0-9](?:[a-z0-9]*[-_]?[a-z0-9]+)?$/\r\n  return regex.test(ticker.toLowerCase())\r\n}\r\n"],"names":["ticker","marketSentimentChartConfig","layout","LayoutType","theme","FinvizSettings","hasDarkTheme","Theme","dark","light","width","height","scrollable","editable","cross","charts","timeframe","TIMEFRAME","i3","scale","ScaleType","Linear","instrument","Instrument","MarketSentiment","refreshData","premarket","aftermarket","dateRange","stretch","panes","elements","type","ChartElementType","overlays","Component","constructor","_this","arguments","this","_defineProperty","loading","enabled","chartConfig","async","urlQuery","length","undefined","callback","setTimer","_timer","clearTimeout","document","hidden","window","setTimeout","_fetchData","_lastRequest","apiRequest","json","quoteData","getData","Quote","findByAttribute","updateAttributes","create","save","setState","_json$refresh","refresh","componentDidMount","componentWillUnmount","_this$_lastRequest","_this$_lastRequest$ca","cancel","call","render","state","_jsx","cellPadding","cellSpacing","border","style","visibility","children","_jsxs","id","ChartLayout","config","valign","className","disabled","onClick","e","_vote","src","alt","display","hasRedesignEnabled","sentiment","preventDefault","data","close","sum","volume","weight","date","Array","from","repeat","map","x","parseInt","afterChange","afterClose","drawMinutesPerDay","visibleMinutes","marketStartMinutes","premarketLengthMinutes","aftermarketLengthMinutes","root","rootEl","getElementById","ReactDOM","mount","refreshInfo","parseJSONFromScript","replaceSignalTables","newDocument","oldSignalsLeft","newSignalsLeft","innerHTML","oldSignalsRight","newSignalsRight","getRefreshData","location","pathname","headers","ContentType","Html","DOMParser","parseFromString","newRefreshInfo","userId","version","reload","interval","IndicesPollingIntervalInMs","intervalCallbackOnWindowVisible","_window$gtag","_window","oldMarketStats","getElementsByClassName","newMarketStats","forEach","_","index","oldElement","item","newElement","oldHomepageBottom","newHomepageBottom","_window$initFinvizBan","_window2","hasUserPremium","then","_ref","RenderRecentQuotes","gtag","event_category","finvizBannersLoaded","initFinvizBanners","refreshAds","refreshPage","isStockFastRefreshAvailable","Default","Reduced","Free","newIndicesData","indices","dowQ","nasdaqQ","sap500Q","rutQ","_window$Sentry","Sentry","captureMessage","extra","allAvailableTickers","all","reduce","acc","cur","push","join","updateIndices","getMapsRefreshInterval","perfDataSecReq","mapPerf","MapTypeId","Sector","MapSubtypeId","DayPerf","perfDataGeoReq","hasGeoMaps","World","perfDataSec","perfDataGeo","Promise","FinvizIndexSecMap","mapActionCreators","updatePerfData","FinvizIndexGeoMap","hasChartEvents","HPSignalInterval","HP_SIGNAL_LABELS","intraday","daily","HP_SIGNAL_COOKIE","IS_REDESIGN","OPTIONS","Object","entries","value","label","ROUNDING","EliteSwitch","_ref2","isLoading","signal","onSignalChange","Select","size","rounding","classNames","find","option","rightContent","Icon","name","onChange","_ref3","placement","orientation","gutter","SelectOption","activeTheme","active","FreeSwitch","usePopoverState","isOpen","useState","_Fragment","Button","as","PopoverTrigger","title","fontSize","contentClass","Popover","Paragraph","href","leftContent","SWITCH_BUTTON_SELECTOR","signalSwitchesElements","querySelectorAll","HomepageSignals","setSignal","React","getCookie","castedValue","getSignalsCookie","setIsLoading","element","remove","handleSignalChange","changedSignal","setCookieRequest","handleSignalIntervalChange","catch","getChartConfig","barWidth","barMargin","colors","getCustomColorsFromCookies","specificChartFunctionality","SpecificChartFunctionality","smallIndex","i10","Stock","CandleStick","ready","ReactDOMClient","signalSwitches","SignalIntervalSwitch","renderSignalIntervalSwitch","subtype","query","t","st","mapPerfScreener","search","uploadMap","method","FormUrlEncoded","body","URLSearchParams","file","replace","_targetScale","updateVisibleSparklines","treemap","hoveredNode","mapStore","getHoveredNode","mapNodeId","visibleNodes","getVisibleTooltipNodes","tickersToLoad","node","includes","debouncedLoadSparklines","_lastSparklinesRequest","debounce","tickers","mapType","_lastSparklinesReques","_lastSparklinesReques2","AppDispatcher","handleViewAction","ActionTypes","LOAD_SPARKLINES_STARTED","ty","handleServerAction","LOAD_SPARKLINES_COMPLETED","error","aborted","LOAD_SPARKLINES_FAILED","trailing","setHoveredNode","SET_HOVERED_NODE","loadSparklineData","loadSparklinesCancel","_lastSparklinesReques3","_lastSparklinesReques4","resetSparklineData","RESET_SPARKLINE_DATA","changeTranslate","tx","zoom","translate","CHANGE_TRANSLATE","direction","offsetX","offsetY","zoomLevel","getNextZoomLevel","animate","toFixed","y","RENDER_TREEMAP","requestAnimationFrame","zoomIn","getPreviousZoomLevel","zoomOut","zoomAndTranslate","updateLayout","props","updateData","updateDimensions","nodes","updatePerf","UPDATE_DATA","_setOnPublish","getPublishCanvas","SET_PUBLISH_CANVAS","setupWidget","SET_WIDGET","isWidget","Dispatcher","action","payload","source","PayloadSources","SERVER_ACTION","dispatch","VIEW_ACTION","keyMirror","INIT_STARTED","INIT_FAILED","Store","EventEmitter","emitChange","emit","CHANGE_EVENT","addChangeListener","on","removeChangeListener","removeListener","_hoveredNode","_mapNodeId","_dataVersion","_getPublishCanvas","_sparklinesData","_isWidget","getSparklines","getDataVersion","dispatchToken","register","getStaticChartConfig","paneElements","default","colorsOverride","leftOffset","JSON","parse","getParsedCookies","el","isValidElement","tagName","getAttribute","textContent","captureException","AdsProvider","getAdsProvider","None","adsProvider","Freestar","InvestingChannel","trackPageView","_window$gtag2","freestarPageView","_window$freestar","freestar","queue","trackPageview","ButtonSwitch","items","controlledValue","defaultValue","labelClassNames","groupRounding","restProps","internalValue","setInternalValue","handleChange","newValue","ButtonGroup","hasDivider","ColorVariant","CheckboxSize","CheckboxComponent","ref","_props$checked","color","checked","defaultChecked","classnames","violet","emerald","orange","teal","pink","lime","purple","green","yellow","blue","red","gray","darkGray","Checkbox","forwardRef","clamp","num","min","max","isTouch","event","getRelativePosition","rect","getBoundingClientRect","pointer","touches","left","pageX","pageXOffset","top","pageY","pageYOffset","preventDefaultMove","DraggablePickerComponent","onMove","onKey","container","useRef","hasTouched","isDragging","setDragging","isValid","current","handleMove","useCallback","buttons","handleMoveStart","nativeEvent","handleKeyDown","keyCode","which","handleMoveEnd","toggleDocumentEvents","toggleEvent","addEventListener","removeEventListener","useLayoutEffect","onTouchStart","onMouseDown","onKeyDown","tabIndex","DraggablePicker","memo","Pointer","backgroundColor","hexStringToRGBA","hexString","hexColor","removeHashSymbol","r","g","b","a","Number","Math","round","hexStringToHSVA","rgbaToHSVA","alphaToHex","alpha","toString","padStart","rgbaToHexString","hsvaToHEXString","hsvaToRGBA","v","c","h","s","f","n","k","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","slice","String","parseFloat","strColor","isValidColor","isRgb","startsWith","Option","convertColorToHEX","getIsRgb","rgbKeys","some","getHSVAFromColor","Alpha","changeLightness","pos","gradientPreview","useMemo","backgroundImage","DEFAULT_COLORS","ColorPalette","lowerCaseColor","toLowerCase","colorObj","isSelected","HueSaturation","position","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","icon","isArray","isTooLight","getLumaFromRGBA","getIsColorTooLightOrTransparent","isValidIconName","PickerInput","inputClass","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","useEffect","handleColorInputChange","currentTarget","colorValue","Input","ColorPicker","canSelectCustom","canSelectAlpha","outputFormat","onPaletteItemClick","cachedColor","hsvaColor","setColor","popover","Ariakit","input","currentColor","newColor","onChangeCallback","stringColor","output","onSetCustomCodeClick","_prompt","prompt","trim","alert","isMobile","_hex","orignalColor","focus","preventScroll","InputColorPicker","inputDataTestId","popoverState","isMobileDevice","hideOnInteractOutside","backdrop","hide","MultiColorPicker","colorInputLabel","ColorTabButton","ButtonRounding","small","ButtonColorPicker","buttonPickerDataTestId","isMultiPicker","activeColorIndex","setActiveColorIndex","handleColorChange","originalColor","colorObject","appearance","_ref4","childComponent","_ref5","CopyToClipboard","text","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","timeout","resetTimer","Textarea","readOnly","select","DropdownRounding","DropdownTheme","StatelessDropdown","trigger","modal","unmountOnHide","showOnHover","autoFocusOnShow","autoFocusOnHide","onFullyOpen","onFullyClosed","store","zIndex","updatePosition","usePopoverPlacement","isFullyOpen","setIsFullyOpen","isMounted","wasMounted","usePrevious","menuGutter","parent","focusable","portal","hideOnHoverOutside","preventBodyScroll","focusWithoutScroll","blurWithoutScroll","none","onTransitionEnd","ev","target","Dropdown","focusLoop","virtualFocus","DropdownItemComponent","asComponent","OptionButton","DropdownItem","useDropdownState","ContextMenuInner","onClose","onContextMenu","MenuGroup","options","_item$onClick","assign","menu_option","ContextMenu","ChartGridCell","gridArea","GridLayout","columns","rows","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","InnerState","valueKey","changeKey","valueAccessor","RangeSize","RangeSlider","step","inputClassName","hasTrack","setHasTrack","trackRef","thumbRef","Boolean","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","Label","ToolbarTheme","ToolbarDirection","ToolbarContext","vertical","chipTransparent","isWrapped","isStretched","useToolbarContext","getToolbarSettings","horizontal","alternative","Toolbar","hasFocusRings","toolbarRef","contextProviderValue","toolbarSettings","isSafariDesktop","forceReflow","throttle","originalWidth","offsetWidth","showTimeout","hideTimeout","Provider","querySelector","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","Box","Heading","level","shepherdLibrary","loadShepherdLibrary","setLoading","shepherdPromise","buttonClasses","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","regular","getStepButtons","tour","arr","_step$backButton","_step$nextButton","complete","classes","getButtonTheme","ButtonTheme","button","ButtonPadding","back","backButton","next","nextButton","filter","getTourKey","getStepsForUser","tours","_localStorage","lastFinishedTour","localStorage","getItem","lastTourIndex","allToursViewed","every","skip","toursToView","hasNewTours","steps","initialTour","completeTour","key","_localStorage2","setItem","DEFAULT_OPTIONS","exitOnEsc","useModalOverlay","useTour","currentTour","setTour","controller","AbortController","loadingSetter","_controller$current","_controller$current2","abort","startTour","definition","_controller$current3","setComplete","tourUtils","_definition$initialTo","Tour","removeStep","processedSteps","_step$placement","_step$offset","_step$overlayRadius","_step$overlayPadding","attachTo","floatingUIOptions","middleware","shift","padding","offset","mainAxis","crossAxis","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","NotificationPosition","NotificationContext","useNotification","NotificationWrapper","setIsOpen","notification","setNotification","viewport","setViewport","useVisualViewport","getVisualViewport","visualViewport","positionClass","_notification$options","BottomLeft","TopLeft","TopRight","BottomRight","WrapperComponent","inline","role","hideOnEscape","transform","willChange","withNotificationContext","WrappedComponent","_WrappedComponent$dis","displayName","WithNotificationContext","notificationContext","NotificationTheme","Notification","closeText","actions","timeoutInMs","timeoutId","success","failure","imgFromUrlToBase64","url","fetch","URL","createObjectURL","response","blob","DownloadImageButton","downloadUrl","base64ImageData","dataUrl","fileName","_downloadUrl$split$po","split","pop","imageUri","setImageUri","val","download","SocialShare","shareUrl","imageToDownloadURL","imageToDownloadBase64Data","FacebookShareButton","FacebookIcon","TwitterShareButton","via","TwitterIcon","TooltipInputComponent","tooltipSettings","isPointerEventsEnabled","prevMessage","isFocused","setIsFocused","handleFocus","handleBlur","TooltipTrigger","hideOnBlur","onFocus","onBlur","Tooltip","TooltipInput","useTrackPageView","trackInitial","trackAutomatically","initialRender","useLocation","handleTrackView","tracking","FONT_SIZE","XXS","XS","S","M","L","XXL","XXXL","LINE_HEIGHT","PADDING","XXXS","MARGIN","CHART_MARGIN","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","OFFSET","MONTHS","ChartEditorEnum","CanvasElementType","IndicatorType","Ap","Bvps","Capex","Cdp","Csti","Cd","Cni","Cogs","Cr","Ebitda","Ebit","Epsbbe","Epsd","Epsfd","Ei","Fcf","Ffo","Gi","Gim","It","Ia","Ie","Ii","Inv","Ltd","Mcap","Nafa","Ncic","Ncf","Neti","Nfcf","Niacb","Nif","Nico","Noni","Nl","Nm","Nocf","Nppe","Nie","Noe","OpInc","OrdInc","Om","Oa","Oca","Ocl","Ofau","Ofa","Of","Oia","Ol","Ooe","Pe","Pti","Pb","Pfcf","Psf","Poi","Posi","Qr","Rd","Roa","Roate","Roi","Rev","Sgae","Sgaeo","So","Std","Str","Tbvps","Ta","Tc","Tcdfb","Tce","Tca","Tcl","Td","Teq","Texp","Tie","Tia","Tib","Tl","Tlse","Tse","Ue","Noie","Ole","Rea","FundamentalPeriod","FundamentalPeriodLabel","Annual","Quarterly","FundamentalPeriodShortLabel","OverlayType","ChartEventType","ChartEventBadgeType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","LAYOUTS","count","gridAreas","SORT_DIRECTION","ASC","DESC","TIMEFRAMES_WITH_PRE_MARKET","i1","i2","i5","IntradayTimeframeInterval","i15","i30","h2","h4","TimeframeLabelShort","d","w","m","DateRangeType","QuoteFinancialAttachment","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","ETHUSD","BNBUSD","SOLUSD","XRPUSD","DOGEUSD","ADAUSD","TRXUSD","AVAXUSD","DOTUSD","BCHUSD","NEARUSD","LTCUSD","APTUSD","XLMUSD","LINKUSD","ETCUSD","UNIUSD","EGLDUSD","OPUSD","SUIUSD","AAVEUSD","BTCEUR","ETHEUR","BNBEUR","SOLEUR","XRPEUR","DOGEEUR","ADAEUR","TRXEUR","AVAXEUR","DOTEUR","BCHEUR","NEAREUR","LTCEUR","ICPEUR","APTEUR","XLMEUR","LINKEUR","SHIBEUR","EGLDEUR","SEUR","OPEUR","SUIEUR","BTCUSDT","ETHUSDT","BNBUSDT","SOLUSDT","XRPUSDT","DOGEUSDT","ADAUSDT","TRXUSDT","AVAXUSDT","DOTUSDT","BCHUSDT","NEARUSDT","LTCUSDT","ICPUSDT","FETUSDT","ETCUSDT","APTUSDT","XLMUSDT","LINKUSDT","SHIBUSDT","UNIUSDT","EGLDUSDT","SUSDT","OPUSDT","SUIUSDT","AAVEUSDT","TRUMPUSDT","ETHBTC","BNBBTC","SOLBTC","XRPBTC","DOGEBTC","ADABTC","TRXBTC","AVAXBTC","DOTBTC","BCHBTC","NEARBTC","LTCBTC","ICPBTC","FETBTC","ETCBTC","APTBTC","XLMBTC","LINKBTC","UNIBTC","EGLDBTC","SBTC","OPBTC","SUIBTC","AAVEBTC","TextAlign","TextBaseline","QuotePollingIntervalInMs","Elite","Forex","Crypto","Futures","EXTRA_MARKET_BUFFER_MINUTES","ScaleLabel","Percentage","Logarithmic","PANE_HEIGHT_DEFAULT","chart","indicator","INDICATOR_LABEL_HEIGHT","MOBILE_BARS_TO_VIEW","MOBILE_VIEW_BREAKPOINT_WIDTH","FREE_DATE_RANGES","getTimeframeLabel","QuotePageQueryChartTypes","MacroTimeframe","MicroMacroTimeframe","micro","macro","minutes","hours","days","weeks","months","MicroTimeframeRange","keys","prev","curr","SetVisibilityTo","QUOTE_FETCH_EVENT","PREMARKET_AFTERMARKET_HOURS","CHART_ELEMENT_ID","CHART_SETTINGS_DIALOG_TEST_ID","MARKET_START","MARKET_END","Utils","_len","args","_key","arg","_len2","_key2","minMax","_len3","_key3","getScaleRatio","devicePixelRatio","setSizeOnCanvasElement","canvasElement","ratio","getQuoteDateTimestampOffsetInSeconds","referenceDate","Date","dayNumber","getDate","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","convertLocalToNyTime","addOffset","quoteDateTimeOffsetInMs","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","getTime","hasPremarket","hasAftermarket","bufferMinutes","getMinutes","dayOfWeek","currentDayMinutes","getHours","premarketMinutes","aftermarketMinutes","isWeekend","isClosed","dateFromUnixTimestamp","timestamp","setUTCSeconds","dateStringFromDate","getFullYear","dateFromDateString","dateString","yyyy","mm","dd","isNaN","Error","testTouchPoints","getIsSSr","isMobileOs","navigator","userAgent","indexOf","createEvent","match","msMaxTouchPoints","maxTouchPoints","createElement","isIPad","matchesIPad","matchesIPhone","matchesIPod","re","RegExp","cookie","setCookie","expires","toUTCString","hostname","getFullscreenStatus","_document$fullscreenE","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","getRequestFullscreen","_ref6","_ref7","_element$requestFulls","requestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","getExitFullscreen","_ref8","_ref9","_document$exitFullscr","exitFullscreen","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","fn","readyState","getChartsDimensions","chartElementId","_box$width","_box$height","containerElement","box","getIsMobileScreenSize","innerWidth","getIsMobilePortrait","numberToStringWithUnitsSuffix","suffix","isRedesignEnabled","_window$FinvizSetting","isRedesignedPage","obj","matchingPages","forexPage","futuresPage","cryptoPage","isQuotePage","quotePage","isQuoteFinancials","quoteFinancials","getMaxValue","currentValue","_ref10","getMinValue","_ref11","getRoundedString","number","numOfDecimalPlaces","precision","pow","process","getParsedIntegersFromPeriodString","periodString","part","exception","captureContext","isPositiveFloat","parsedNumber","isFinite","isPositiveInteger","string","isInRange","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","getValueInRange","isPrimaryClick","hasOwnProperty","getJSONReplacerFunc","visited","WeakSet","has","add","formatDateToStringUS","toLocaleDateString","day","month","year","getUuid","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","substring","getRandomValues","Uint8Array","getEarningsDateSuffix"],"sourceRoot":""}