{"version":3,"file":"header.c12aefe2.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/crypto/currencyUtils.ts","webpack://@finviz/website/./js/app/header/scam-notice.tsx","webpack://@finviz/website/./js/app/header/search.tsx","webpack://@finviz/website/./js/app/header/settings-dropdown.tsx","webpack://@finviz/website/./js/app/header/index.tsx","webpack://@finviz/website/./js/app/header/notice.tsx","webpack://@finviz/website/./js/app/header/market-badge.tsx","webpack://@finviz/website/./js/app/header/time.tsx","webpack://@finviz/website/./js/app/header/utils.ts","webpack://@finviz/website/./js/app/shared/components/QueryClientContext.tsx","webpack://@finviz/website/./js/app/shared/cookie.ts","webpack://@finviz/website/./js/app/shared/isMobile.ts","webpack://@finviz/website/./js/app/shared/ready.ts","webpack://@finviz/website/./js/app/shared/sentry/init.ts","webpack://@finviz/website/./js/app/shared/sentry/constants.ts","webpack://@finviz/website/./js/main/components/TickerSearch/TickerSearchItem.tsx","webpack://@finviz/website/./js/main/components/TickerSearch/util.ts","webpack://@finviz/website/./js/main/components/TickerSearch/TickerSearch.tsx","webpack://@finviz/website/./js/main/components/box.tsx","webpack://@finviz/website/./js/main/components/button.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box-item.tsx","webpack://@finviz/website/./js/main/components/combo-box/hooks.ts","webpack://@finviz/website/./js/main/components/dialog/hooks.ts","webpack://@finviz/website/./js/main/components/error-view.tsx","webpack://@finviz/website/./js/main/components/highlight.tsx","webpack://@finviz/website/./js/main/components/icon/icon.tsx","webpack://@finviz/website/./js/main/components/icon/index.tsx","webpack://@finviz/website/./js/main/components/input.tsx","webpack://@finviz/website/./js/main/components/centered.tsx","webpack://@finviz/website/./js/main/components/search/search-error.tsx","webpack://@finviz/website/./js/main/components/search/search-item.tsx","webpack://@finviz/website/./js/main/components/search/search-list.tsx","webpack://@finviz/website/./js/main/components/search/search-navigation-wrapper.tsx","webpack://@finviz/website/./js/main/components/search/search.tsx","webpack://@finviz/website/./js/main/components/search/useSearchComboboxState.ts","webpack://@finviz/website/./js/main/components/spinner.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip-box.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip-trigger.tsx","webpack://@finviz/website/./js/main/components/tooltip/TooltipProvider.tsx","webpack://@finviz/website/./js/main/components/tooltip/hooks.ts","webpack://@finviz/website/./js/main/components/tooltip/tooltip-arrow.tsx","webpack://@finviz/website/./js/main/components/tooltip/types.ts","webpack://@finviz/website/./js/main/components/typography.tsx","webpack://@finviz/website/./js/main/hooks/use-resize-observer.ts","webpack://@finviz/website/./js/main/hooks/usePopoverPlacement.ts","webpack://@finviz/website/./js/main/services/api.ts","webpack://@finviz/website/./js/main/services/routing.ts","webpack://@finviz/website/./js/main/types.ts","webpack://@finviz/website/./js/main/util.tsx","webpack://@finviz/website/../charts/app/utils/ticker-sanitizer.ts","webpack://@finviz/website/../node_modules/react-error-boundary/dist/react-error-boundary.esm.js"],"sourcesContent":["import { ObjectHash } from '../queryString'\r\n\r\nexport const DEFAULT_ACTIVE_CURRENCY = 'USD'\r\nexport const TILE_WIDTH = 240\r\n\r\nexport const CURRENCIES_LAYOUT: Record<string, string[][]> = {\r\n  USD: [\r\n    ['BTCUSD', 'ETHUSD', 'SOLUSD', 'BNBUSD', 'XRPUSD'],\r\n    ['DOGEUSD', 'ADAUSD', 'TRXUSD', 'AVAXUSD', 'XLMUSD'],\r\n    ['DOTUSD', 'LINKUSD', 'BCHUSD', 'SUIUSD', 'NEARUSD'],\r\n    ['LTCUSD', 'APTUSD', 'EGLDUSD', 'OPUSD', 'AAVEUSD'],\r\n  ],\r\n  USDT: [\r\n    ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT', 'XRPUSDT'],\r\n    ['DOGEUSDT', 'ADAUSDT', 'TRXUSDT', 'AVAXUSDT', 'XLMUSDT'],\r\n    ['DOTUSDT', 'LINKUSDT', 'BCHUSDT', 'SUIUSDT', 'NEARUSDT'],\r\n    ['LTCUSDT', 'APTUSDT', 'EGLDUSDT', 'OPUSDT', 'SUSDT'],\r\n  ],\r\n  EUR: [\r\n    ['BTCEUR', 'ETHEUR', 'SOLEUR', 'BNBEUR', 'XRPEUR'],\r\n    ['DOGEEUR', 'ADAEUR', 'TRXEUR', 'AVAXEUR', 'XLMEUR'],\r\n    ['DOTEUR', 'LINKEUR', 'BCHEUR', 'SUIEUR', 'NEAREUR'],\r\n    ['LTCEUR', 'APTEUR', 'EGLDEUR', 'OPEUR', 'SEUR'],\r\n  ],\r\n  BTC: [\r\n    ['BTCUSD', 'ETHBTC', 'SOLBTC', 'BNBBTC', 'XRPBTC'],\r\n    ['DOGEBTC', 'ADABTC', 'TRXBTC', 'AVAXBTC', 'XLMBTC'],\r\n    ['DOTBTC', 'LINKBTC', 'BCHBTC', 'SUIBTC', 'NEARBTC'],\r\n    ['LTCBTC', 'APTBTC', 'EGLDBTC', 'OPBTC', 'SBTC'],\r\n  ],\r\n}\r\n\r\n// NOTE: all tickers that are not visible at main 'crypto.ashx' but\r\n// we wanna keep them displayed as sparkline in the detail of ticker\r\nexport const TICKERS_NOT_IN_DASHBOARD: Record<string, string[]> = {\r\n  USDT: ['AAVEUSDT', 'TRUMPUSDT'],\r\n  BTC: ['AAVEBTC'],\r\n}\r\n\r\nexport const CURRENCIES_LIST = Object.keys(CURRENCIES_LAYOUT)\r\n\r\nexport const CRYPTO_TICKERS = [\r\n  ...Object.values(CURRENCIES_LAYOUT).flat(2),\r\n  ...Object.values(TICKERS_NOT_IN_DASHBOARD).flat(1),\r\n]\r\n\r\nexport function getCurrency(ticker: string): string {\r\n  if (ticker.endsWith('USD')) {\r\n    return 'USD'\r\n  } else if (ticker.endsWith('USDT')) {\r\n    return 'USDT'\r\n  } else if (ticker.endsWith('EUR')) {\r\n    return 'EUR'\r\n  } else if (ticker.endsWith('BTC')) {\r\n    return 'BTC'\r\n  }\r\n  return DEFAULT_ACTIVE_CURRENCY\r\n}\r\n\r\nexport function getActiveCurrency(queryString: ObjectHash<string, string>) {\r\n  const activeCurrency = (queryString['c'] || DEFAULT_ACTIVE_CURRENCY).toUpperCase()\r\n  return CURRENCIES_LIST.includes(activeCurrency) ? activeCurrency : DEFAULT_ACTIVE_CURRENCY\r\n}\r\n\r\nexport function getActiveCurrencySparklineTickers(activeCurrency: string) {\r\n  return [...CURRENCIES_LAYOUT[activeCurrency].flat(1), ...(TICKERS_NOT_IN_DASHBOARD[activeCurrency] ?? [])]\r\n}\r\n\r\nexport function getCurrencyLongName(currency: string): string {\r\n  switch (currency.toLowerCase()) {\r\n    case 'btc':\r\n      return 'Bitcoin'\r\n    case 'eth':\r\n      return 'Ethereum'\r\n    case 'bnb':\r\n      return 'Binance Coin'\r\n    case 'sol':\r\n      return 'Solana'\r\n    case 'xrp':\r\n      return 'Ripple'\r\n    case 'doge':\r\n      return 'Dogecoin'\r\n    case 'ada':\r\n      return 'Cardano'\r\n    case 'trx':\r\n      return 'TRON'\r\n    case 'avax':\r\n      return 'Avalanche'\r\n    case 'dot':\r\n      return 'Polkadot'\r\n    case 'bch':\r\n      return 'Bitcoin Cash'\r\n    case 'near':\r\n      return 'NEAR Protocol'\r\n    case 'ltc':\r\n      return 'Litecoin'\r\n    case 'icp':\r\n      return 'Internet Computer'\r\n    case 'apt':\r\n      return 'Aptos'\r\n    case 'xlm':\r\n      return 'Stellar'\r\n    case 'link':\r\n      return 'Chainlink'\r\n    case 'shib':\r\n      return 'Shiba Inu'\r\n    case 'etc':\r\n      return 'Ethereum Classic'\r\n    case 'uni':\r\n      return 'Uniswap'\r\n    case 'fet':\r\n      return 'Fetch.ai'\r\n    case 'egld':\r\n      return 'MultiversX'\r\n    case 's':\r\n      return 'Sonic'\r\n    case 'op':\r\n      return 'Optimism'\r\n    case 'sui':\r\n      return 'Sui'\r\n    case 'aave':\r\n      return 'Aave'\r\n    case 'trump':\r\n      return 'Trump'\r\n    case 'usd':\r\n      return 'US Dollar'\r\n    case 'eur':\r\n      return 'Euro'\r\n    case 'usdt':\r\n      return 'Tether'\r\n    default:\r\n      return currency\r\n  }\r\n}\r\n","import Notice from './notice'\r\n\r\nexport default function ScamNotice() {\r\n  return (\r\n    <Notice id=\"scam\">\r\n      We have been notified by several users from Russia and other Russian-speaking countries, that they were contacted\r\n      by various individuals by phone, pretending to be employees of FINVIZ.com, offering fraudulent investment\r\n      services. Please note that these activities are not related to FINVIZ.com in any way, we do not have any employees\r\n      or partners in this region.\r\n      <br />\r\n      If you notice such activity, please send us an email at{' '}\r\n      <a className=\"tab-link\" href=\"mailto:support@finviz.com\">\r\n        support@finviz.com\r\n      </a>\r\n      . Thank you.\r\n      <br />\r\n      <br />В последнее время участились случаи обращений пользователей из России и русскоговорящих регионах, которые\r\n      утверждали, что с ними связывались по телефону мошеннические лица, выдававшие себя за сотрудников компании\r\n      FINVIZ.com, предлагая мошеннические инвестиционные услуги. Обратите внимание, что эти мероприятия не связаны с\r\n      FINVIZ.com в любом случае, у нас нет никаких сотрудников или партнеров в этом регионе. Если вы заметили такую\r\n      активность, пожалуйста, отправьте нам электронное письмо по адресу{' '}\r\n      <a className=\"tab-link\" href=\"mailto:support@finviz.com\">\r\n        support@finviz.com\r\n      </a>\r\n      . Спасибо.\r\n    </Notice>\r\n  )\r\n}\r\n","import { ChangeEvent, FocusEvent, FormEvent, KeyboardEvent, MouseEvent, createRef } from 'react'\r\nimport { Component } from 'react'\r\n\r\nimport { getInstrumentForTicker } from '../../main/util'\r\nimport { getCurrency } from '../crypto/currencyUtils'\r\nimport { getSanitizedTicker } from '../shared/ticker-sanitizer'\r\n\r\nvar lastRequest: XMLHttpRequest | undefined\r\nfunction fetch(input: string, cb: (data: any[]) => void, errCb?: (request: XMLHttpRequest) => void) {\r\n  if (lastRequest) {\r\n    lastRequest.abort()\r\n  }\r\n\r\n  if (input === '') {\r\n    setTimeout(function () {\r\n      cb([])\r\n    }, 0)\r\n    return\r\n  }\r\n\r\n  var request: XMLHttpRequest | null = new XMLHttpRequest()\r\n  request.open('GET', '/api/suggestions.ashx?input=' + encodeURIComponent(input), true)\r\n\r\n  request.onreadystatechange = function () {\r\n    if (this.readyState === 4) {\r\n      if (this.status >= 200 && this.status < 400) {\r\n        var data = JSON.parse(this.responseText)\r\n        cb(data)\r\n      } else {\r\n        errCb?.(this)\r\n      }\r\n    }\r\n  }\r\n\r\n  request.send()\r\n  lastRequest = request\r\n  request = null\r\n}\r\n\r\nfunction getRedirectUrl(tickerRaw: string) {\r\n  let ticker = getSanitizedTicker(tickerRaw, true)\r\n  var url = ''\r\n  var instrument = getInstrumentForTicker(ticker)\r\n  if (instrument === 'crypto') {\r\n    ticker = ticker.substring(1)\r\n    url = `/crypto_charts.ashx?c=${getCurrency(ticker)}&t=`\r\n  } else if (instrument === 'forex' || instrument === 'futures') {\r\n    ticker = ticker.substring(1)\r\n    url = `/${instrument}_charts.ashx?t=`\r\n  } else {\r\n    url = '/quote.ashx?t='\r\n  }\r\n  return url + encodeURIComponent(ticker) + (FinvizSettings.quoteSearchExt ?? '')\r\n}\r\n\r\nexport interface SearchProps {\r\n  focus?: boolean\r\n}\r\n\r\ninterface SearchState {\r\n  input: string\r\n  highlight: string\r\n  data: any[]\r\n  focused: boolean\r\n  selected: number\r\n}\r\n\r\nclass Search extends Component<SearchProps, SearchState> {\r\n  state: SearchState = { input: '', highlight: '', data: [], focused: false, selected: -1 }\r\n\r\n  render() {\r\n    var focus = !!this.props.focus\r\n    return (\r\n      <div>\r\n        <Input\r\n          onChange={this._onChange}\r\n          onFocus={this._onFocus}\r\n          onBlur={this._onBlur}\r\n          onArrowUp={this._onArrowUp}\r\n          onArrowDown={this._onArrowDown}\r\n          value={this.state.input}\r\n          focus={focus}\r\n        />\r\n        <SuggestionsBox\r\n          input={this.state.input}\r\n          highlight={this.state.highlight}\r\n          data={this.state.data}\r\n          selected={this.state.selected}\r\n          focused={this.state.focused}\r\n        />\r\n      </div>\r\n    )\r\n  }\r\n\r\n  _onChange = (value: string) => {\r\n    fetch(\r\n      value,\r\n      function (data: any[]) {\r\n        // @ts-ignore - @REFACTOR\r\n        this.setState({ data: data, highlight: value })\r\n      }.bind(this)\r\n    )\r\n    this.setState({ input: value, selected: -1 })\r\n  }\r\n\r\n  _onFocus = () => {\r\n    this.setState({ focused: true })\r\n  }\r\n\r\n  _onBlur = () => {\r\n    this.setState({ focused: false })\r\n  }\r\n\r\n  _onArrowUp = () => {\r\n    if (this.state.selected > 0) {\r\n      var selected = this.state.selected - 1\r\n      this.setState({ selected: selected, input: this.state.data[selected].ticker })\r\n    }\r\n  }\r\n\r\n  _onArrowDown = () => {\r\n    if (this.state.selected < this.state.data.length - 1) {\r\n      var selected = this.state.selected + 1\r\n      this.setState({ selected: selected, input: this.state.data[selected].ticker })\r\n    }\r\n  }\r\n}\r\n\r\ninterface InputProps {\r\n  value: string\r\n  focus: boolean\r\n  onChange: (value: string) => void\r\n  onFocus: (e: FocusEvent) => void\r\n  onBlur: (e: FocusEvent) => void\r\n  onArrowUp: () => void\r\n  onArrowDown: () => void\r\n}\r\n\r\ninterface InputState {\r\n  firstFocus: boolean\r\n  placeholderSupported: boolean\r\n}\r\n\r\nclass Input extends Component<InputProps, InputState> {\r\n  inputRef = createRef<HTMLInputElement>()\r\n\r\n  constructor(props: InputProps) {\r\n    super(props)\r\n\r\n    var placeholderSupported = document.createElement('input').placeholder !== undefined\r\n    this.state = { firstFocus: true, placeholderSupported }\r\n  }\r\n\r\n  render() {\r\n    const placeholderText = 'Search ticker, company or profile'\r\n    var value = this.props.value\r\n    return (\r\n      <form onSubmit={this._onSubmit}>\r\n        <input\r\n          placeholder={placeholderText}\r\n          type=\"text\"\r\n          ref={this.inputRef}\r\n          value={value}\r\n          className={value !== '' ? 'is-focused' : ''}\r\n          autoComplete=\"off\"\r\n          autoCorrect=\"off\"\r\n          autoCapitalize=\"off\"\r\n          maxLength={100}\r\n          onChange={this._onChange}\r\n          onKeyDown={this._onKeyDown}\r\n          onKeyUp={this._onKeyUp}\r\n          onFocus={this._onFocus}\r\n          onBlur={this._onBlur}\r\n        />\r\n        <span className=\"fa fa-search\" onClick={this._onSubmit}></span>\r\n      </form>\r\n    )\r\n  }\r\n\r\n  _onChange = (e: ChangeEvent<HTMLInputElement>) => {\r\n    e.preventDefault()\r\n    this.props.onChange(e.target.value)\r\n  }\r\n\r\n  _onSubmit = (e: FormEvent) => {\r\n    e.preventDefault()\r\n    // @ts-ignore - @REFACTOR\r\n    window.location = getRedirectUrl(this.props.value)\r\n  }\r\n\r\n  _onKeyDown = (e: KeyboardEvent) => {\r\n    if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\r\n      e.preventDefault()\r\n    }\r\n  }\r\n\r\n  _onFocus = (e: FocusEvent) => {\r\n    this.props.onFocus(e)\r\n  }\r\n\r\n  _onBlur = (e: FocusEvent) => {\r\n    this.props.onBlur(e)\r\n  }\r\n\r\n  _onKeyUp = (e: KeyboardEvent) => {\r\n    if (e.key === 'ArrowUp') {\r\n      e.preventDefault()\r\n      this.props.onArrowUp()\r\n    } else if (e.key === 'ArrowDown') {\r\n      e.preventDefault()\r\n      this.props.onArrowDown()\r\n    }\r\n  }\r\n\r\n  componentDidMount() {\r\n    this._focus()\r\n  }\r\n\r\n  componentDidUpdate() {\r\n    this._focus()\r\n  }\r\n\r\n  _focus() {\r\n    if (this.props.focus && this.state.firstFocus && !this._isMobile()) {\r\n      this.inputRef.current!.focus()\r\n      this.setState({ firstFocus: false })\r\n    }\r\n  }\r\n\r\n  _isMobile() {\r\n    return (\r\n      navigator.userAgent.match(/Android/i) ||\r\n      navigator.userAgent.match(/webOS/i) ||\r\n      navigator.userAgent.match(/iPhone/i) ||\r\n      navigator.userAgent.match(/iPad/i) ||\r\n      navigator.userAgent.match(/iPod/i) ||\r\n      navigator.userAgent.match(/BlackBerry/i) ||\r\n      navigator.userAgent.match(/Windows Phone/i)\r\n    )\r\n  }\r\n}\r\n\r\ninterface SuggestionsBoxProps {\r\n  data: any[]\r\n  input: string\r\n  focused: boolean\r\n  highlight: string\r\n  selected: number\r\n}\r\n\r\nclass SuggestionsBox extends Component<SuggestionsBoxProps> {\r\n  render() {\r\n    var data = this.props.data\r\n    var searchLink = '/search.ashx?p=' + encodeURIComponent(this.props.input)\r\n    return (\r\n      <table\r\n        className=\"suggestions-box\"\r\n        style={{\r\n          display: this.props.focused && (data.length > 0 || this.props.highlight.length > 2) ? 'table' : 'none',\r\n        }}\r\n        cellPadding=\"0\"\r\n        cellSpacing=\"0\"\r\n        // @ts-ignore - @REFACTOR\r\n        border=\"0\"\r\n      >\r\n        <tbody>\r\n          {data.map((row, index) => (\r\n            <tr\r\n              onMouseDown={this._onClick.bind(this, row.ticker)}\r\n              className={index === this.props.selected ? 'active' : ''}\r\n              key={row.ticker}\r\n            >\r\n              <td className=\"ticker\" dangerouslySetInnerHTML={{ __html: this._formatTicker(row.ticker) }} />\r\n              <td className=\"company\" dangerouslySetInnerHTML={{ __html: this._formatCompany(row.company) }} />\r\n              <td className=\"exchange\">{row.exchange}</td>\r\n            </tr>\r\n          ))}\r\n          {this.props.highlight.length > 0 && (\r\n            <tr className=\"links\">\r\n              <td colSpan={3}>\r\n                <table\r\n                  width=\"100%\"\r\n                  cellPadding=\"0\"\r\n                  cellSpacing=\"0\"\r\n                  // @ts-ignore - @REFACTOR\r\n                  border=\"0\"\r\n                >\r\n                  <tbody>\r\n                    <tr>\r\n                      <td width=\"100%\">\r\n                        <a\r\n                          // @ts-ignore - @REFACTOR\r\n                          onMouseDown={() => (window.location = searchLink)}\r\n                          className=\"search-company\"\r\n                        >\r\n                          Search\r\n                        </a>\r\n                      </td>\r\n                    </tr>\r\n                  </tbody>\r\n                </table>\r\n              </td>\r\n            </tr>\r\n          )}\r\n        </tbody>\r\n      </table>\r\n    )\r\n  }\r\n\r\n  _onClick(ticker: string, e: MouseEvent) {\r\n    if (e.button === 0) {\r\n      // @ts-ignore - @REFACTOR\r\n      window.location = getRedirectUrl(ticker)\r\n    }\r\n  }\r\n\r\n  _formatTicker(ticker: string) {\r\n    var hightlight = this.props.highlight.toUpperCase()\r\n    return ticker.replace(hightlight, '<b>' + hightlight + '</b>')\r\n  }\r\n\r\n  _formatCompany(text: string) {\r\n    var input = this.props.highlight\r\n    var re = new RegExp(this._escapeRegExp(input), 'gi')\r\n    return text.replace(re, function (match) {\r\n      return '<b>' + match + '</b>'\r\n    })\r\n  }\r\n\r\n  _escapeRegExp(str: string) {\r\n    return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n  }\r\n}\r\n\r\nexport default Search\r\n","import { Component, MouseEvent as ReactMouseEvent } from 'react'\r\n\r\nclass Settings extends Component {\r\n  state = { open: false }\r\n\r\n  componentWillUnmount() {\r\n    document.removeEventListener('click', this._onDocumentClick)\r\n  }\r\n\r\n  render() {\r\n    var classes = 'nav-link sign-in account-btn is-account'\r\n    if (this.state.open) {\r\n      classes += ' is-open'\r\n    }\r\n    return (\r\n      <div style={{ position: 'relative' }}>\r\n        <a href=\"#\" className={classes} onClick={this._showDropDown}>\r\n          <span className=\"fa fa-user\"></span>\r\n          <span>{FinvizSettings.name}</span>\r\n        </a>\r\n        <ul className=\"dropdown-menu\" style={{ display: this.state.open ? 'block' : 'none' }}>\r\n          <li>\r\n            <a className=\"menu-item\" href=\"/myaccount.ashx\">\r\n              Settings\r\n            </a>\r\n          </li>\r\n          {FinvizSettings.hasEliteRedesign && FinvizSettings.hasUserPremium && (\r\n            <li>\r\n              <a className=\"menu-item\" href=\"/subscription.ashx\">\r\n                Elite Subscription\r\n              </a>\r\n            </li>\r\n          )}\r\n          <li>\r\n            <a className=\"menu-item\" href=\"/feature_preview.ashx\">\r\n              Feature Preview\r\n            </a>\r\n          </li>\r\n          <li>\r\n            <a className=\"menu-item\" href=\"/logout.ashx\">\r\n              Sign Out\r\n            </a>\r\n          </li>\r\n        </ul>\r\n      </div>\r\n    )\r\n  }\r\n\r\n  _showDropDown = (e: ReactMouseEvent) => {\r\n    e.preventDefault()\r\n    e.stopPropagation()\r\n\r\n    if (this.state.open) {\r\n      this.setState({ open: false })\r\n      return\r\n    }\r\n\r\n    this.setState({ open: true })\r\n    document.addEventListener('click', this._onDocumentClick)\r\n  }\r\n\r\n  _hideDropDown = () => {\r\n    this.setState({ open: false })\r\n    document.removeEventListener('click', this._onDocumentClick)\r\n  }\r\n\r\n  _onDocumentClick = (e: MouseEvent) => {\r\n    // @ts-ignore @REFACTOR\r\n    if (e.target.className.indexOf?.('menu-item') === -1) {\r\n      this._hideDropDown()\r\n    }\r\n  }\r\n}\r\n\r\nexport default Settings\r\n","import '../shared/sentry/init'\r\n\r\nimport React from 'react'\r\nimport ReactDOM from 'react-dom/client'\r\n\r\nimport { TickerSearch } from '../../main/components/TickerSearch'\r\nimport { withQueryClientContext } from '../shared/components/QueryClientContext'\r\nimport { isIpad, isMobile } from '../shared/isMobile'\r\nimport { ready } from '../shared/ready'\r\nimport { getSanitizedTicker } from '../shared/ticker-sanitizer'\r\nimport ScamNotice from './scam-notice'\r\nimport OldSearch, { SearchProps } from './search'\r\nimport Settings from './settings-dropdown'\r\nimport { Time } from './time'\r\n\r\nwindow.FLibs = { getSanitizedTicker }\r\n\r\n/**\r\n * The script below allows iPads in landscape mode to size the page naturally\r\n * instead of forcing 1024px viewport which results in a zoomed in view\r\n */\r\nif (isIpad()) {\r\n  const minViewport = 1024\r\n  const viewportString = { fixed: `width=${minViewport}`, fluid: 'width=device-width, initial-scale=1.0' }\r\n\r\n  const getViewportWidth = () => Math.round(window.innerWidth * (window.visualViewport?.scale || 1))\r\n  const setViewport = (fixedViewport: boolean) =>\r\n    document\r\n      .querySelector('meta[name=viewport]')\r\n      ?.setAttribute('content', fixedViewport ? viewportString.fixed : viewportString.fluid)\r\n\r\n  let viewportWidth = getViewportWidth()\r\n\r\n  setViewport(viewportWidth <= minViewport)\r\n\r\n  window.addEventListener('resize', function () {\r\n    const newViewportWidth = getViewportWidth()\r\n    // iOS fires resize on overscroll\r\n    if (viewportWidth === newViewportWidth) return\r\n    viewportWidth = newViewportWidth\r\n    setViewport(newViewportWidth <= minViewport)\r\n  })\r\n}\r\n\r\nfunction renderAccountDropdown(element: Element | null) {\r\n  if (!element) return\r\n\r\n  const root = ReactDOM.createRoot(element)\r\n  root.render(<Settings />)\r\n}\r\n\r\n/**\r\n * Display scam notice when language matches 'ru' or 'et'\r\n */\r\nfunction renderScamNotice(element: Element | null) {\r\n  const languages = navigator.languages instanceof Array ? navigator.languages : [navigator.language]\r\n  const targetLanguages = ['ru', 'et']\r\n  const isTargetLanguage = languages\r\n    .map((language) => language.toLowerCase())\r\n    .some((language) => targetLanguages.some((targetLanguage) => language.includes(targetLanguage)))\r\n\r\n  if (!element || !isTargetLanguage) return\r\n\r\n  const root = ReactDOM.createRoot(element)\r\n  root.render(<ScamNotice />)\r\n}\r\n\r\nconst hasEnabledRedesign = FinvizSettings.hasRedesignEnabled\r\nlet root: ReactDOM.Root\r\nfunction renderSearch(props?: SearchProps, retries = 0) {\r\n  const container = document.getElementById('search')\r\n\r\n  if (!container) {\r\n    if (retries < 10) setTimeout(() => renderSearch(props, retries + 1), 300)\r\n    return\r\n  }\r\n\r\n  root = ReactDOM.createRoot(container)\r\n\r\n  if (!hasEnabledRedesign) {\r\n    root.render(<OldSearch {...props} />)\r\n  } else {\r\n    const SearchComponent = withQueryClientContext(TickerSearch)\r\n\r\n    root.render(\r\n      <SearchComponent\r\n        defaultPlacement=\"bottom-start\"\r\n        theme=\"navigationBar\"\r\n        size=\"medium\"\r\n        placeholder=\"Search ticker, company or profile\"\r\n        autoFocus={props?.focus}\r\n        isMatchInputAndBoxWidth\r\n      />\r\n    )\r\n  }\r\n}\r\n\r\nlet didInitializeWithFocus = false\r\nlet searchAutoFocus = false\r\nready(function () {\r\n  if (!didInitializeWithFocus) renderSearch({ focus: searchAutoFocus })\r\n\r\n  const timeContainer = document.getElementById('time')\r\n  if (timeContainer) {\r\n    const timeRoot = ReactDOM.createRoot(timeContainer)\r\n    timeRoot.render(<Time className=\"w-full text-info text-white\" />)\r\n  }\r\n\r\n  renderAccountDropdown(document.getElementById('account-dropdown'))\r\n  renderScamNotice(document.getElementById('scam-notice'))\r\n})\r\n\r\nwindow['SearchFocus'] = function () {\r\n  didInitializeWithFocus = true\r\n  searchAutoFocus = !isMobile()\r\n  renderSearch({ focus: searchAutoFocus })\r\n}\r\n","import { ReactNode, useRef, useState } from 'react'\r\n\r\nimport { setCookieRequest } from '../../main/services/api'\r\n\r\ninterface NoticeProps {\r\n  id: string\r\n  children: ReactNode\r\n}\r\n\r\nexport default function Notice({ id, children }: NoticeProps) {\r\n  const cookieName = 'notice-' + id\r\n  const [hidden, setHidden] = useState(!!getCookie(cookieName))\r\n\r\n  const onClose = useRef(() => {\r\n    setCookieRequest(cookieName).catch(() => {})\r\n\r\n    setHidden(true)\r\n  })\r\n\r\n  return (\r\n    <div\r\n      style={{\r\n        background: '#fffce5',\r\n        border: '1px solid #fee500',\r\n        color: '#363a46',\r\n        display: hidden ? 'none' : 'block',\r\n        fontFamily: 'Lato',\r\n        fontSize: 13,\r\n        textAlign: 'center',\r\n        margin: '10px auto 10px auto',\r\n        position: 'relative',\r\n        padding: '12px 30px 12px 12px',\r\n        lineHeight: '1.3em',\r\n        width: 'auto',\r\n      }}\r\n    >\r\n      {children}\r\n      <a\r\n        title=\"Close\"\r\n        className=\"close\"\r\n        onClick={onClose.current}\r\n        href=\"#\"\r\n        style={{\r\n          position: 'absolute',\r\n          marginRight: 0,\r\n          right: 10,\r\n          color: '#363a46',\r\n          textDecoration: 'none',\r\n          fontSize: 18,\r\n          top: 'calc(50% - 9px)',\r\n        }}\r\n      >\r\n        ×\r\n      </a>\r\n    </div>\r\n  )\r\n}\r\n\r\nfunction getCookie(name: string) {\r\n  var re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n  return document.cookie.replace(re, '$1')\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { isAftermarket, isHoliday, isPremarket } from './utils'\r\n\r\nexport enum MarketBadgeType {\r\n  None,\r\n  Open,\r\n  Closed,\r\n  Premarket,\r\n  Aftermarket,\r\n}\r\n\r\nexport function getMarketBadgeText(type: MarketBadgeType, _date?: Date) {\r\n  switch (type) {\r\n    case MarketBadgeType.Open:\r\n      return {\r\n        label: 'Markets Open',\r\n      }\r\n    case MarketBadgeType.Closed:\r\n      // const holiday = getHoliday(date)\r\n\r\n      return {\r\n        label: 'Markets Closed',\r\n        // description: holiday && (\r\n        //   <>\r\n        //     The markets observe U.S. holidays and are closed on\r\n        //     <br />\r\n        //     {holiday.label}\r\n        //   </>\r\n        // ),\r\n      }\r\n    case MarketBadgeType.Premarket:\r\n      return {\r\n        label: 'Premarket',\r\n        // description: (\r\n        //   <>\r\n        //     An additional time window when trading is possible.\r\n        //     <br />\r\n        //     We report it as the time between 7:00 AM and 9:30 AM\r\n        //   </>\r\n        // ),\r\n      }\r\n    case MarketBadgeType.Aftermarket:\r\n      return {\r\n        label: 'Aftermarket',\r\n        // description: (\r\n        //   <>\r\n        //     An additional time window when trading is still possible.\r\n        //     <br />\r\n        //     We report it as the time between 4:00 PM and 6:30 PM\r\n        //   </>\r\n        // ),\r\n      }\r\n  }\r\n}\r\n\r\nexport function getMarketBadgeType(time: Date, hasUserPremium?: boolean) {\r\n  if (isHoliday(time)) return MarketBadgeType.Closed\r\n  if (isPremarket(time, hasUserPremium)) return MarketBadgeType.Premarket\r\n  if (isAftermarket(time, hasUserPremium)) return MarketBadgeType.Aftermarket\r\n  // if (isMarketOpen(time, hasUserPremium)) return MarketBadgeType.Open\r\n\r\n  return MarketBadgeType.None\r\n}\r\n\r\nexport interface MarketBadgeProps {\r\n  badge: MarketBadgeType\r\n  className?: string\r\n}\r\n\r\nexport function MarketBadge({ badge, className }: MarketBadgeProps) {\r\n  if (badge === MarketBadgeType.None) return null\r\n\r\n  return (\r\n    <div\r\n      className={classnames('h-1.5 w-1.5 shrink-0 rounded-full', className, {\r\n        'bg-green-400': badge === MarketBadgeType.Open,\r\n        'bg-yellow-200': [MarketBadgeType.Premarket, MarketBadgeType.Aftermarket].includes(badge),\r\n        'bg-red-400': badge === MarketBadgeType.Closed,\r\n      })}\r\n    />\r\n  )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nimport { Tooltip, TooltipTrigger, useTooltipState } from '../../main/components/tooltip'\r\nimport { Heading } from '../../main/components/typography'\r\nimport { useResizeObserver } from '../../main/hooks/use-resize-observer'\r\nimport { MarketBadge, MarketBadgeProps, getMarketBadgeText, getMarketBadgeType } from './market-badge'\r\nimport { TimeFormatType, getDate, getFormattedDateString } from './utils'\r\n\r\nconst UPDATE_INTERVAL = 10000\r\n\r\nenum TimeBreakpointMode {\r\n  container,\r\n  window,\r\n}\r\n\r\nexport interface TimeBreakpoint {\r\n  minWidth: number\r\n  marketBadgeText: boolean\r\n  timeFormat: TimeFormatType\r\n}\r\n\r\nconst BREAKPOINTS: TimeBreakpoint[] = [\r\n  { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\r\n  { minWidth: 140, marketBadgeText: false, timeFormat: 'short' },\r\n  { minWidth: 180, marketBadgeText: false, timeFormat: 'long' },\r\n  { minWidth: 255, marketBadgeText: true, timeFormat: 'long' },\r\n]\r\n\r\nfunction getTimeState(fixedTime?: string | Date, hasUserPremium: boolean = FinvizSettings.hasUserPremium) {\r\n  const time = getDate(fixedTime)\r\n  const badge = getMarketBadgeType(time, hasUserPremium)\r\n\r\n  return { time, badge }\r\n}\r\n\r\nfunction TooltipBadge(props: MarketBadgeProps & { time: Date }) {\r\n  const state = useTooltipState({ placement: 'bottom' })\r\n  const badge = getMarketBadgeText(props.badge, props.time)\r\n\r\n  if (!badge) return null\r\n\r\n  return (\r\n    <>\r\n      <TooltipTrigger state={state} aria-label={badge.label}>\r\n        <div className=\"flex h-5 w-5 cursor-help items-center justify-center\">\r\n          <MarketBadge {...props} />\r\n        </div>\r\n      </TooltipTrigger>\r\n      <Tooltip state={state} className=\"px-2 text-xs\">\r\n        <Heading level={6} className=\"my-0\">\r\n          {badge.label}\r\n        </Heading>\r\n        {/* {badge.description && <Paragraph size=\"small\">{badge.description}</Paragraph>} */}\r\n      </Tooltip>\r\n    </>\r\n  )\r\n}\r\n\r\nfunction StaticBadge(props: MarketBadgeProps & { time: Date }) {\r\n  const badge = getMarketBadgeText(props.badge, props.time)\r\n\r\n  if (!badge) return null\r\n\r\n  return (\r\n    <>\r\n      <MarketBadge {...props} className=\"mr-2\" />\r\n      <span>{`${badge.label} · `}</span>\r\n    </>\r\n  )\r\n}\r\n\r\n/**\r\n * Find matching breakpoint or return the last (largest) one\r\n */\r\nfunction findMatchingBreakpoint(compareWidth: number | undefined, breakpoints: TimeBreakpoint[]) {\r\n  if (typeof compareWidth !== 'number') return breakpoints[breakpoints.length - 1]\r\n\r\n  const matchingBreakpoints = breakpoints.filter((breakpoint) => compareWidth >= breakpoint.minWidth)\r\n\r\n  return matchingBreakpoints.pop() ?? breakpoints[breakpoints.length - 1]\r\n}\r\n\r\nfunction getCurrentWidth(mode: TimeBreakpointMode, element: HTMLElement | null) {\r\n  return mode === TimeBreakpointMode.window ? window.innerWidth : (element?.clientWidth ?? 0)\r\n}\r\n\r\ninterface TimeProps extends React.HTMLProps<HTMLDivElement> {\r\n  /**\r\n   * Set custom time to display\r\n   */\r\n  fixedTime?: string | Date\r\n\r\n  /**\r\n   * What to measure the breakpoints to\r\n   * - `container` parent element\r\n   * - `window` window\r\n   *\r\n   * @default \"container\"\r\n   */\r\n  breakpointMode?: keyof typeof TimeBreakpointMode\r\n\r\n  /**\r\n   * Defines what information is visible at which breakpoint. Local mode measures\r\n   * the component wrapper div and global mode measures window width. The definitions\r\n   * must be ascending in width\r\n   */\r\n  breakpoints?: TimeBreakpoint[]\r\n}\r\n\r\nexport function Time({\r\n  className,\r\n  fixedTime,\r\n  breakpointMode = 'container',\r\n  breakpoints = BREAKPOINTS,\r\n  ...props\r\n}: TimeProps) {\r\n  const ResizeObserver = useResizeObserver()\r\n  const rootRef = React.useRef<HTMLDivElement>(null)\r\n  const [state, setState] = React.useState(getTimeState(fixedTime))\r\n  const [currentBreakpoint, setBreakpoint] = React.useState<TimeBreakpoint | null>(null)\r\n\r\n  React.useEffect(() => {\r\n    const interval = setInterval(() => setState(getTimeState(fixedTime)), UPDATE_INTERVAL)\r\n    return () => clearInterval(interval)\r\n  }, [fixedTime])\r\n\r\n  React.useEffect(() => {\r\n    if (!ResizeObserver || !rootRef.current) return\r\n\r\n    if (!currentBreakpoint) {\r\n      const currentWidth = getCurrentWidth(TimeBreakpointMode[breakpointMode], rootRef.current)\r\n      setBreakpoint(findMatchingBreakpoint(currentWidth, breakpoints))\r\n    }\r\n\r\n    const handleResize = throttle(() => {\r\n      const currentWidth = getCurrentWidth(TimeBreakpointMode[breakpointMode], rootRef.current)\r\n      const foundBreakpoint = findMatchingBreakpoint(currentWidth, breakpoints)\r\n\r\n      if (foundBreakpoint !== currentBreakpoint) setBreakpoint(foundBreakpoint)\r\n    }, 150)\r\n\r\n    const observer = new ResizeObserver((entries) => {\r\n      window.requestAnimationFrame(() => {\r\n        if (Array.isArray(entries) && entries.length > 0) handleResize()\r\n      })\r\n    })\r\n\r\n    observer.observe(rootRef.current)\r\n    window.addEventListener('resize', handleResize)\r\n\r\n    return () => {\r\n      observer.disconnect()\r\n      window.removeEventListener('resize', handleResize)\r\n    }\r\n  }, [ResizeObserver, currentBreakpoint, breakpoints, breakpointMode])\r\n\r\n  return (\r\n    <div ref={rootRef} {...props} className={className}>\r\n      {currentBreakpoint && (\r\n        <div className=\"flex items-center justify-end overflow-hidden whitespace-nowrap\">\r\n          {currentBreakpoint.marketBadgeText ? (\r\n            <StaticBadge time={state.time} badge={state.badge} />\r\n          ) : (\r\n            <TooltipBadge time={state.time} badge={state.badge} />\r\n          )}\r\n          <span>{getFormattedDateString(state.time, currentBreakpoint.timeFormat)}</span>\r\n        </div>\r\n      )}\r\n    </div>\r\n  )\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\n/**\r\n * Check if a given date is DST in the US\r\n * - begins on the second Sunday in March\r\n * - ends on the first Sunday in November\r\n *\r\n * Keep in sync with https://github.com/finvizhq/charts/blob/master/app/utils.ts\r\n */\r\nexport function getIsDstInNy(date: Date) {\r\n  const dayNumber = date.getDate()\r\n  const monthIndex = date.getMonth()\r\n  const dayOfWeek = date.getDay()\r\n  const previousSunday = dayNumber - dayOfWeek\r\n  if (monthIndex < 2 || monthIndex > 10) {\r\n    return false\r\n  }\r\n  if (monthIndex > 2 && monthIndex < 10) {\r\n    return true\r\n  }\r\n  return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nexport function getDate(seed?: string | number | Date | null) {\r\n  var date = seed != null ? new Date(seed) : new Date()\r\n  const dateAsNY = new Date(\r\n    date.getUTCFullYear(),\r\n    date.getUTCMonth(),\r\n    date.getUTCDate(),\r\n    date.getUTCHours() - 5,\r\n    date.getUTCMinutes(),\r\n    date.getUTCSeconds()\r\n  )\r\n  const isDst = getIsDstInNy(dateAsNY)\r\n\r\n  if (isDst) {\r\n    dateAsNY.setUTCHours(dateAsNY.getUTCHours() + 1)\r\n  }\r\n\r\n  return dateAsNY\r\n}\r\n\r\nfunction getWeekDay(date: Date) {\r\n  return date.toLocaleDateString('en-US', { weekday: 'short' })\r\n}\r\n\r\nfunction getMonth(date: Date, uppercase = true) {\r\n  const name = date.toLocaleDateString('en-US', { month: 'short' })\r\n  return uppercase ? name.toUpperCase() : name\r\n}\r\n\r\nfunction getDay(date: Date) {\r\n  return date.getDate().toString().padStart(2, '0')\r\n}\r\n\r\nfunction getTime(date: Date) {\r\n  return date.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true })\r\n}\r\n\r\nenum TimeFormat {\r\n  long,\r\n  short,\r\n  dateOnly,\r\n  timeOnly,\r\n}\r\n\r\nexport type TimeFormatType = keyof typeof TimeFormat\r\n\r\nexport function getFormattedDateString(date: Date = getDate(), format: TimeFormatType = 'long') {\r\n  switch (TimeFormat[format]) {\r\n    case TimeFormat.long:\r\n      return `${getWeekDay(date)} ${getMonth(date)} ${getDay(date)} ${date.getFullYear()} ${getTime(date)} ET`\r\n    case TimeFormat.short:\r\n      return `${getWeekDay(date)} ${getMonth(date)} ${getDay(date)} ${getTime(date)}`\r\n    case TimeFormat.dateOnly:\r\n      return `${getMonth(date, false)} ${getDay(date)}`\r\n    case TimeFormat.timeOnly:\r\n      return getTime(date)\r\n  }\r\n}\r\n\r\nexport function formatDate(value: Date | unknown, inputOrOutputFormat: string, outputFormat?: string): string {\r\n  return dateFns.format(\r\n    dateFns.isDate(value) ? (value as Date) : dateFns.parse(`${value}`, inputOrOutputFormat, new Date()),\r\n    outputFormat ?? inputOrOutputFormat\r\n  )\r\n}\r\n\r\nexport function isPremarket(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n  const dayOfWeek = date.getDay()\r\n  const min = date.getMinutes()\r\n  const hours = date.getHours()\r\n\r\n  if (isPremium && dayOfWeek !== 0 && dayOfWeek !== 6 && (hours === 7 || hours === 8 || (hours === 9 && min < 30))) {\r\n    return true\r\n  }\r\n  return false\r\n}\r\n\r\nexport function isAftermarket(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n  const dayOfWeek = date.getDay()\r\n  const min = date.getMinutes()\r\n\r\n  if (\r\n    isPremium &&\r\n    dayOfWeek !== 0 &&\r\n    dayOfWeek !== 6 &&\r\n    (date.getHours() === 16 || date.getHours() === 17 || (date.getHours() === 18 && min < 30))\r\n  ) {\r\n    return true\r\n  }\r\n  return false\r\n}\r\n\r\n/**\r\n * https://www.nyse.com/markets/hours-calendars\r\n */\r\nconst HOLIDAY_DATES = [\r\n  {\r\n    label: \"New Year's Day\",\r\n    test: (day: number, month: number) => month === 1 && day === 1,\r\n  },\r\n  {\r\n    label: 'National Day of Mourning',\r\n    test: (day: number, month: number) => month === 1 && day === 9,\r\n  },\r\n  {\r\n    label: 'Martin Luther King, Jr. Day',\r\n    test: (day: number, month: number) => month === 1 && day === 20,\r\n  },\r\n  {\r\n    label: 'Presidents Day',\r\n    test: (day: number, month: number) => month === 2 && day === 17,\r\n  },\r\n  {\r\n    label: 'Good Friday',\r\n    test: (day: number, month: number) => month === 4 && day === 18,\r\n  },\r\n  {\r\n    label: 'Memorial Day',\r\n    test: (day: number, month: number) => month === 5 && day === 26,\r\n  },\r\n  {\r\n    label: 'Juneteenth Holiday',\r\n    test: (day: number, month: number) => month === 6 && day === 19,\r\n  },\r\n  {\r\n    label: 'Day before Independence Day (closed from 1 PM)',\r\n    test: (day: number, month: number, hours: number) => month === 7 && day === 3 && hours >= 13,\r\n  },\r\n  {\r\n    label: 'Independence Day',\r\n    test: (day: number, month: number) => month === 7 && day === 4,\r\n  },\r\n  {\r\n    label: 'Labor Day',\r\n    test: (day: number, month: number) => month === 9 && day === 1,\r\n  },\r\n  {\r\n    label: 'Thanksgiving Day',\r\n    test: (day: number, month: number) => month === 11 && day === 27,\r\n  },\r\n  {\r\n    label: 'Day after Thanksgiving (closed from 1 PM)',\r\n    test: (day: number, month: number, hours: number) => month === 11 && day === 28 && hours >= 13,\r\n  },\r\n  {\r\n    label: 'Day before Christmas (closed from 1 PM)',\r\n    test: (day: number, month: number, hours: number) => month === 12 && day === 24 && hours >= 13,\r\n  },\r\n  {\r\n    label: 'Christmas Day',\r\n    test: (day: number, month: number) => month === 12 && day === 25,\r\n  },\r\n]\r\n\r\nexport function getHoliday(date: Date = getDate()) {\r\n  var day = date.getDate()\r\n  var month = date.getMonth() + 1\r\n  var hours = date.getHours()\r\n\r\n  return HOLIDAY_DATES.find((holiday) => holiday.test(day, month, hours))\r\n}\r\n\r\nexport function isHoliday(date: Date = getDate()) {\r\n  return !!getHoliday(date)\r\n}\r\n\r\nexport function isMarketOpen(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n  if (isPremarket(date, isPremium) || isAftermarket(date, isPremium) || isHoliday(date)) {\r\n    return false\r\n  }\r\n\r\n  const dayOfWeek = date.getDay()\r\n  const hour = date.getHours()\r\n  const minute = date.getMinutes()\r\n\r\n  const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n  // Day starts at 9:30\r\n  const dayStarted = hour === 9 ? minute >= 30 : hour >= 10\r\n  // Ends at 16:00\r\n  const dayEnded = hour >= 16\r\n\r\n  return !isWeekend && dayStarted && !dayEnded\r\n}\r\n","import { DefaultOptions, MutationCache, QueryCache, QueryClient, QueryClientProvider } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\n\r\nimport { DefaultErrorBoundary } from '../../../main/components/error-view'\r\n\r\ninterface QueryClientConfig {\r\n  queryCache?: QueryCache\r\n  mutationCache?: MutationCache\r\n  defaultOptions?: DefaultOptions\r\n}\r\n\r\ninterface QueryContextProps {\r\n  queryOptions?: QueryClientConfig\r\n}\r\n\r\nexport function getQueryClient(queryOptions?: QueryClientConfig) {\r\n  return new QueryClient({\r\n    defaultOptions: {\r\n      queries: {\r\n        useErrorBoundary: true,\r\n        refetchOnWindowFocus: false,\r\n        ...queryOptions?.defaultOptions?.queries,\r\n      },\r\n      ...queryOptions?.defaultOptions,\r\n    },\r\n    ...queryOptions,\r\n  })\r\n}\r\n\r\nexport function QueryClientContext({ children, queryOptions }: React.PropsWithChildren<QueryContextProps>) {\r\n  const client = React.useRef(getQueryClient(queryOptions))\r\n\r\n  return (\r\n    <QueryClientProvider client={client.current}>\r\n      <ErrorBoundary FallbackComponent={DefaultErrorBoundary}>{children}</ErrorBoundary>\r\n    </QueryClientProvider>\r\n  )\r\n}\r\n\r\nexport function withQueryClientContext<Props>(\r\n  Component: React.ComponentType<Props>,\r\n  config?: QueryClientConfig\r\n): React.ComponentType<Props> {\r\n  const hocComponent = (props: Props) => (\r\n    <QueryClientContext queryOptions={config}>\r\n      <Component {...(props as Props & React.Attributes)} />\r\n    </QueryClientContext>\r\n  )\r\n\r\n  hocComponent.displayName = `withQueryClientContext(${Component.displayName ?? 'Component'})`\r\n\r\n  return hocComponent\r\n}\r\n","export function getParsedCookies(cookieName: string) {\r\n  const parseCookies = document.cookie\r\n    .split(';')\r\n    .map((cookieString) => cookieString.split('='))\r\n    .reduce(\r\n      (acc, v) => {\r\n        acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())\r\n        return acc\r\n      },\r\n      {} as Record<string, string>\r\n    )\r\n\r\n  return cookieName ? parseCookies[cookieName] : parseCookies\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n  var re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n  return document.cookie.replace(re, '$1')\r\n}\r\n\r\nexport function setCookie(name: string, value: string, expires: Date) {\r\n  var cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n  if (/\\bfinviz\\b/.test(document.location.hostname)) {\r\n    cookie += '; domain=.finviz.com'\r\n  }\r\n  document.cookie = cookie\r\n}\r\n","// OS Matches\r\nconst matchesAndroid = navigator.userAgent.match(/Android/i)\r\nconst matchesWebOS = navigator.userAgent.match(/webOS/i)\r\nconst matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\nconst matchesiPad = navigator.userAgent.match(/iPad/i)\r\nconst matchesIPod = navigator.userAgent.match(/iPod/i)\r\nconst matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\r\nconst matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\r\nconst matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n// Browser Matches\r\nconst matchesFirefox = !!navigator.userAgent.match(/firefox/i)\r\nconst matchesSafariDesktopLike =\r\n  /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && navigator.maxTouchPoints === 0\r\n\r\nconst isMobileDevice =\r\n  matchesAndroid ||\r\n  matchesWebOS ||\r\n  matchesIPhone ||\r\n  matchesiPad ||\r\n  matchesIPod ||\r\n  matchesBlackBerry ||\r\n  matchesWindowsPhone ||\r\n  matchesIOSLike\r\n\r\nexport function isMobile() {\r\n  return !!isMobileDevice\r\n}\r\n\r\nexport function isIphone() {\r\n  return !!(matchesIPhone && !matchesiPad)\r\n}\r\n\r\nexport function isIpad() {\r\n  return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesiPad\r\n}\r\n\r\nexport function isSafariDesktop() {\r\n  return matchesSafariDesktopLike\r\n}\r\n\r\nexport function isIos() {\r\n  return !!matchesIOSLike && !isSafariDesktop()\r\n}\r\n\r\nexport function isFirefox() {\r\n  return matchesFirefox\r\n}\r\n\r\nexport function isFirefoxDesktop() {\r\n  return isFirefox() && !isMobile()\r\n}\r\n","export function ready(fn: (ev?: Event) => any) {\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","import * as Sentry from '@sentry/browser'\r\n\r\nimport { ThrowableError } from '../../../main/services/api'\r\nimport { getSentryOptions } from './constants'\r\n\r\nif ('FinvizSentrySettings' in window && !('sentryDisabled' in window)) {\r\n  const sentryOptions = getSentryOptions(window)\r\n  Sentry.init({\r\n    ...sentryOptions,\r\n    beforeSend(event: Sentry.ErrorEvent, hint: Sentry.EventHint) {\r\n      const originalError = hint.originalException as Error | null\r\n      const exception = event.exception?.values?.[0]\r\n      const errorFrames = exception?.stacktrace?.frames ?? []\r\n\r\n      const mechanism = exception?.mechanism?.type ?? hint.mechanism?.type\r\n      const message = originalError?.message ?? exception?.value\r\n\r\n      /**\r\n       * Ignore scripts matching `ignoreStack`.\r\n       * - If pattern is string, only the script url is matched. In case of `http.client`, the url is matched\r\n       * - If pattern is array, both url and and error message must match\r\n       */\r\n      const isIgnoredError = sentryOptions.ignoreStack.some((ignorePattern) => {\r\n        const [ignoreSource, ignoreMessage] = Array.isArray(ignorePattern) ? ignorePattern : [ignorePattern]\r\n        const isIgnoredScript =\r\n          errorFrames.some((frame) => frame?.filename?.includes(ignoreSource)) ||\r\n          (mechanism === 'http.client' && event.request?.url?.includes(ignoreSource))\r\n\r\n        if (!ignoreMessage) return isIgnoredScript\r\n\r\n        return message?.match(ignoreMessage)\r\n      })\r\n\r\n      if (isIgnoredError) return null\r\n\r\n      // Completely ignore 524 errors, track other network errors as `info` if the status is 520+\r\n      const statusCode =\r\n        originalError instanceof ThrowableError ? originalError.status : (event.contexts?.response?.status_code ?? -1)\r\n      if (statusCode === 500) {\r\n        return { ...event, level: 'error', fingerprint: ['500'] }\r\n      } else if (statusCode > 500 && statusCode < 520) {\r\n        return { ...event, level: 'info', fingerprint: ['500+'] }\r\n      } else if (statusCode > 520) {\r\n        // Completely ignore 524 errors\r\n        if (statusCode === 524) return null\r\n        return { ...event, level: 'info', fingerprint: ['520+'] }\r\n      }\r\n\r\n      return event\r\n    },\r\n  })\r\n\r\n  if (FinvizSentrySettings.id > 0) {\r\n    Sentry.setUser({ id: String(FinvizSentrySettings.id) })\r\n  }\r\n\r\n  try {\r\n    Sentry.setTags({\r\n      dpr: window.devicePixelRatio,\r\n      redesign: window.FinvizSettings?.hasRedesignEnabled,\r\n      dark: window.FinvizSettings?.hasDarkTheme,\r\n      innerWidth: window.innerWidth,\r\n      innerHeight: window.innerHeight,\r\n    })\r\n  } catch {}\r\n}\r\n\r\nwindow['Sentry'] = {\r\n  captureException: Sentry.captureException,\r\n  captureMessage: Sentry.captureMessage,\r\n  withScope: Sentry.withScope,\r\n  getCurrentScope: Sentry.getCurrentScope,\r\n}\r\n","import {\r\n  dedupeIntegration,\r\n  extraErrorDataIntegration,\r\n  httpClientIntegration,\r\n  thirdPartyErrorFilterIntegration,\r\n} from '@sentry/browser'\r\n\r\nconst prodDsn = 'https://11de51e753454212a2845e5899a38cae@sentry.io/33153'\r\nconst devDsn = 'https://a6b6fd3b51987321373cd9ac451f1d4b@o17229.ingest.us.sentry.io/4508811147476997'\r\n\r\nexport const getSentryOptions = (globalRef: { location: { hostname: string } }) => ({\r\n  dsn: globalRef.location.hostname.includes('finviz.com') ? prodDsn : devDsn,\r\n  allowUrls: [/finviz\\.com/, /www\\.finviz\\.com/, /elite\\.finviz\\.com/],\r\n  release: typeof window !== 'undefined' && 'FinvizSentrySettings' in window ? FinvizSentrySettings.release : undefined,\r\n  environment:\r\n    typeof window !== 'undefined' && 'FinvizSentrySettings' in window ? FinvizSentrySettings.environment : undefined,\r\n  sendDefaultPii: true,\r\n  integrations: [\r\n    dedupeIntegration(),\r\n    extraErrorDataIntegration(),\r\n    httpClientIntegration({ failedRequestTargets: [/finviz\\.com/] }),\r\n    thirdPartyErrorFilterIntegration({\r\n      filterKeys: ['finviz'], //NOTE: same application keys as specified in Sentry bundle plugin `webpack.config.js` -> `sentryWebpackPlugin`\r\n      behaviour: 'apply-tag-if-exclusively-contains-third-party-frames',\r\n    }),\r\n  ],\r\n  /**\r\n   * Ignore if error message matches\r\n   * For ignoring specific files, or errors in specific files use `ignoreStack` below\r\n   */\r\n  ignoreErrors: [\r\n    'AbortError: The operation was aborted.',\r\n    'TypeError: Failed to fetch',\r\n    'TypeError: NetworkError when attempting to fetch resource.',\r\n    'ChunkLoadError: Loading chunk',\r\n    'Error: Loading CSS chunk',\r\n    /^TypeError: Load failed$/,\r\n  ],\r\n  /**\r\n   * Ignore error if a script name in the stack matches any of these\r\n   * For global ignore pattenrs use `ignoreErrors` above\r\n   */\r\n  ignoreStack: [\r\n    // Ignore all quantserve scripts\r\n    'quantcount.com',\r\n    'quantserve.com',\r\n    // Ignore network errors from cmp script\r\n    'investingchannel.com',\r\n    ['cmp2.js', /(AbortError|NetworkError|aborted|network)/i],\r\n  ] satisfies Array<string | [string, RegExp]>,\r\n})\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { SearchApiResult } from '../../services/api'\r\nimport { ComboBoxItem, ComboBoxItemProps } from '../combo-box'\r\nimport { Highlight } from '../highlight'\r\nimport { PropsWithAs } from '../types'\r\n\r\ninterface SearchItemProps extends Pick<ComboBoxItemProps, 'state'>, Partial<PropsWithAs<React.ElementType>> {\r\n  item: SearchApiResult\r\n  dataTestId?: string\r\n}\r\n\r\nexport function TickerSearchItem({ item, dataTestId, ...props }: SearchItemProps) {\r\n  const value = props.state!.useState('value')\r\n  const isTickerWide = item.ticker.length > 7\r\n\r\n  return (\r\n    <ComboBoxItem\r\n      {...props}\r\n      value={item.ticker}\r\n      className=\"search-item h-auto min-h-7 w-full shrink-0 appearance-none py-1 leading-snug\"\r\n      contentClass=\"overflow-hidden px-1 -mx-1 search-item\"\r\n      data-testid={dataTestId}\r\n    >\r\n      <span\r\n        className={classNames({\r\n          'w-16': !isTickerWide,\r\n          'w-20': isTickerWide,\r\n        })}\r\n      >\r\n        <Highlight text={item.ticker} highlight={value} />\r\n      </span>\r\n      <span className=\"-mx-1 flex-1 whitespace-normal px-1 text-gray-600 dark:text-gray-200\">\r\n        <Highlight text={item.company} highlight={value} />\r\n      </span>\r\n      <span className=\"ml-2 uppercase text-gray-400\">{item.exchange}</span>\r\n    </ComboBoxItem>\r\n  )\r\n}\r\n","import { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { link } from '../../services/routing'\r\nimport { Instrument } from '../../types'\r\nimport { cleanTicker, getInstrumentForTicker } from '../../util'\r\n\r\nexport function getRedirectForTicker(tickerRaw: string) {\r\n  const ticker = getSanitizedTicker(tickerRaw, true)\r\n  const instrument = cleanTicker(ticker) ? getInstrumentForTicker(ticker) : null\r\n  let redirectLink = ''\r\n\r\n  switch (instrument) {\r\n    case Instrument.Stock:\r\n      redirectLink = link.toQuote(ticker)\r\n      break\r\n    case Instrument.Forex:\r\n      redirectLink = link.toForexChartDetail(ticker)\r\n      break\r\n    case Instrument.Futures:\r\n      redirectLink = link.toFuturesChartDetail(ticker)\r\n      break\r\n    case Instrument.Crypto:\r\n      redirectLink = link.toCryptoChartDetail(ticker)\r\n      break\r\n    default:\r\n      return link.toSearch(ticker)\r\n  }\r\n\r\n  return redirectLink + (FinvizSettings.quoteSearchExt ?? '')\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport { useQuery } from '@tanstack/react-query'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { searchApiRequest } from '../../services/api'\r\nimport { link } from '../../services/routing'\r\nimport { Button } from '../button'\r\nimport { IconNameType } from '../icon'\r\nimport { InputSize, InputTheme } from '../input'\r\nimport { Search, SearchProps, useSearchComboboxState } from '../search'\r\nimport { TickerSearchItem } from './TickerSearchItem'\r\nimport { getRedirectForTicker } from './util'\r\n\r\ninterface Props extends Omit<SearchProps, 'state'> {\r\n  /**\r\n   * Whether the input should automatically receive focus when mounted\r\n   */\r\n  autoFocus?: boolean\r\n\r\n  /**\r\n   * Initial value for the input field\r\n   */\r\n  defaultValue?: string\r\n\r\n  /**\r\n   * Default placement position of the combobox popover\r\n   * Inherits placement options from Ariakit ComboboxStore\r\n   */\r\n  defaultPlacement?: Ariakit.ComboboxStoreProps['placement']\r\n\r\n  /**\r\n   * Placeholder text shown when the input is empty\r\n   */\r\n  placeholder?: string\r\n\r\n  /**\r\n   * Visual theme variant for the input\r\n   * References predefined styles from InputTheme\r\n   */\r\n  theme?: keyof typeof InputTheme\r\n\r\n  /**\r\n   * Size variant for the input\r\n   * References predefined sizes from InputSize\r\n   */\r\n  size?: keyof typeof InputSize\r\n\r\n  /**\r\n   * Additional CSS class name for the input element\r\n   */\r\n  inputClass?: string\r\n\r\n  /**\r\n   * ChartIndex used for data-testid\r\n   */\r\n  chartIndex?: number\r\n\r\n  /**\r\n   * Whether to show the \"Show All\" option\r\n   *\r\n   * @default true\r\n   */\r\n  isShowAllVisible?: boolean\r\n\r\n  /**\r\n   * Whether search items should be rendered as links\r\n   *\r\n   * @default true\r\n   */\r\n  isSearchItemLink?: boolean\r\n\r\n  /**\r\n   * Content to show on the right side of the input (icon or custom element)\r\n   */\r\n  rightContent?: JSX.Element | IconNameType\r\n\r\n  /**\r\n   * Callback function triggered when a ticker is selected\r\n   *\r\n   * @param ticker - The selected ticker string\r\n   */\r\n  onTickerSelected?: (ticker: string) => void\r\n}\r\n\r\nexport function TickerSearch({ isShowAllVisible = true, isSearchItemLink = true, chartIndex, ...props }: Props) {\r\n  const searchComboboxState = useSearchComboboxState({\r\n    defaultValue: props.defaultValue,\r\n    placement: props.defaultPlacement ?? 'bottom-start',\r\n    setSelectedValue: (value) => {\r\n      if (isSearchItemLink) {\r\n        window.location.href = getRedirectForTicker(value as string)\r\n      } else {\r\n        props.onTickerSelected?.(getSanitizedTicker(value as string))\r\n        // We have to reset the value (clear the input) in next tick otherwise it doesn't work\r\n        setTimeout(() => searchComboboxState.setValue(''))\r\n      }\r\n    },\r\n  })\r\n\r\n  const value = searchComboboxState.useState('value')\r\n  const activeValue = searchComboboxState.useState('activeValue')\r\n  const { data, error, isLoading, refetch } = useQuery(['search', value], () => searchApiRequest(value), {\r\n    enabled: value.length > 0,\r\n    keepPreviousData: true,\r\n    cacheTime: Infinity,\r\n    staleTime: Infinity,\r\n  })\r\n\r\n  return (\r\n    <Search\r\n      state={searchComboboxState}\r\n      aria-label=\"Search\"\r\n      inputProps={{\r\n        theme: props.theme,\r\n        maxLength: 100,\r\n        hasFocusStyle: !activeValue,\r\n        size: props.size,\r\n        placeholder: props.placeholder ?? 'Search symbol',\r\n        inputClass: classnames(props.inputClass, {\r\n          'focus:border-blue-500 dark:focus:border-blue-400': !!value && !activeValue,\r\n        }),\r\n        rightContent: props.rightContent,\r\n      }}\r\n      popoverProps={{\r\n        className: classnames('h-64 w-full sm:h-auto', {\r\n          'sm:w-110': !props.isMatchInputAndBoxWidth,\r\n        }),\r\n      }}\r\n      inputTestId={chartIndex !== undefined ? `chart-${chartIndex}-settings-search-input` : undefined}\r\n      footer={\r\n        isShowAllVisible ? (\r\n          <Button\r\n            as=\"a\"\r\n            className=\"w-full shrink-0 self-center\"\r\n            contentClass=\"text-center\"\r\n            href={link.toSearch(activeValue ?? value)}\r\n          >\r\n            Show All Results\r\n          </Button>\r\n        ) : undefined\r\n      }\r\n      isLoading={isLoading}\r\n      isError={!!error}\r\n      onErrorRetry={refetch}\r\n      {...props}\r\n    >\r\n      <div className=\"search-list\">\r\n        {data?.map((item) => (\r\n          <TickerSearchItem\r\n            key={item.ticker}\r\n            state={searchComboboxState}\r\n            item={item}\r\n            dataTestId={chartIndex !== undefined ? `chart-${chartIndex}-settings-suggestion-${item.ticker}` : undefined}\r\n            {...(isSearchItemLink\r\n              ? {\r\n                  as: 'a',\r\n                  href: getRedirectForTicker(item.ticker),\r\n                }\r\n              : {})}\r\n          />\r\n        ))}\r\n      </div>\r\n    </Search>\r\n  )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport enum BoxRounding {\r\n  none = '',\r\n  regular = 'rounded-md', // 6px\r\n}\r\n\r\nexport enum BoxTheme {\r\n  none = '',\r\n  light = 'bg-white dark:bg-gray-800 border border-gray-100 dark:border-gray-600',\r\n  dark = 'bg-gray-800 border border-gray-600',\r\n}\r\n\r\nexport interface BoxProps extends Omit<React.HTMLProps<HTMLDivElement>, 'ref'> {\r\n  'data-testid'?: string\r\n  rounding?: keyof typeof BoxRounding\r\n  theme?: keyof typeof BoxTheme\r\n}\r\n\r\nexport const Box = React.forwardRef(function Box(\r\n  { rounding = 'regular', theme = 'light', ...props }: BoxProps,\r\n  ref: React.ForwardedRef<HTMLDivElement>\r\n) {\r\n  return (\r\n    <div\r\n      {...props}\r\n      ref={ref}\r\n      className={classnames(\r\n        'shadow-modal dark:shadow-modal-dark',\r\n        props.className,\r\n        BoxRounding[rounding],\r\n        BoxTheme[theme]\r\n      )}\r\n    >\r\n      {props.children}\r\n    </div>\r\n  )\r\n})\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { PropsWithAs } from './types'\r\n\r\nexport const BUTTON_DEFAULT_ELEMENT = 'button'\r\n\r\nexport const BUTTON_BASE_CLASS =\r\n  'group/button flex shrink-0 items-center justify-center font-medium whitespace-nowrap focus:outline-none'\r\nexport const BUTTON_SQUARE_BASE_CLASS = 'shrink-0 justify-center'\r\nexport const BUTTON_FOCUS_STYLES = 'focus-visible:ring-2 ring-gray-200 dark:ring-gray-500'\r\n\r\nexport enum ButtonSize {\r\n  none = '', // Do not set fixed dimensions\r\n  xxsmall = 'text-info h-4 min-w-4', // 16px height\r\n  xsmall = 'text-2xs h-5 min-w-5', // 20px height\r\n  small = 'text-2xs h-6 min-w-6', // 24px height\r\n  regular = 'text-2xs h-7 min-w-7', // 28px height\r\n  medium = 'text-sm h-8 min-w-8', // 32px height\r\n  large = 'text-sm h-9 min-w-9', // 36px height\r\n  xlarge = 'text-sm h-11 min-w-9', // 44px height\r\n}\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum ButtonPadding {\r\n  none = '',\r\n  xxsmall = 'px-0.5', // 2px padding\r\n  xsmall = 'px-1', // 4px padding\r\n  small = 'px-1.5', // 6px padding\r\n  regular = 'px-2', // 8px padding\r\n  medium = 'px-2.5', // 10px padding\r\n  large = 'px-3', // 12px padding\r\n  xlarge = 'px-3.5', // 14px padding\r\n}\r\n\r\nexport enum ButtonAlign {\r\n  none = '',\r\n  left = 'text-left',\r\n  center = 'text-center',\r\n  right = 'text-right',\r\n}\r\n\r\nexport type ButtonSizeType = keyof typeof ButtonSize\r\n\r\nexport enum ButtonSquareSize {\r\n  none = '', // Do not set fixed dimensions\r\n  xxsmall = 'h-4 w-4', // 16x16px\r\n  xsmall = 'h-5 w-5', // 20x20px\r\n  small = 'h-6 w-6', // 24x24px\r\n  regular = 'h-7 w-7', // 28x28px\r\n  medium = 'h-8 w-8', // 32x32px\r\n  large = 'h-9 w-9', // 36x36px\r\n  xlarge = 'h-11 w-11', // 44x44px\r\n}\r\n\r\nexport enum ButtonRounding {\r\n  none = '',\r\n  small = 'rounded', // 4px\r\n  regular = 'rounded-md', // 6px\r\n  large = 'rounded-lg', // 6px\r\n  full = 'rounded-full', // 9999px\r\n}\r\n\r\nexport type ButtonRoundingType = keyof typeof ButtonRounding\r\n\r\nexport enum ButtonTheme {\r\n  transparent, // Only basic shape is rendered\r\n  light,\r\n  lightTransparent,\r\n  dark,\r\n  blue,\r\n  violet,\r\n  blueHover,\r\n  red,\r\n  headerItem,\r\n  menuItem,\r\n  menuItemTransparent,\r\n  menuItemDark,\r\n  opacity,\r\n  outline,\r\n  chipTransparent,\r\n  chip,\r\n  chipOutline,\r\n  link,\r\n  linkText,\r\n  tab,\r\n}\r\n\r\nexport type ButtonThemeType = keyof typeof ButtonTheme\r\n\r\n/**\r\n * Get button theme\r\n */\r\nexport function getButtonTheme({\r\n  theme,\r\n  active = false,\r\n  size = 'regular',\r\n}: {\r\n  theme: ButtonTheme\r\n  active?: boolean\r\n  size?: ButtonSizeType\r\n}) {\r\n  switch (theme) {\r\n    case ButtonTheme.light: {\r\n      return {\r\n        button: classnames(\r\n          'border border-transparent active:bg-gray-200/90 disabled:bg-gray-200/30 disabled:text-gray-400 disabled:hover:bg-gray-200/30 disabled:hover:text-gray-400', // Light\r\n          'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n          {\r\n            'bg-gray-200/30 hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n            'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n          }\r\n        ),\r\n      }\r\n    }\r\n    case ButtonTheme.lightTransparent: {\r\n      return {\r\n        button: classnames(\r\n          'border border-transparent active:bg-gray-200/90 disabled:bg-transparent disabled:text-gray-400 disabled:hover:bg-transparent disabled:hover:text-gray-400', // Light\r\n          'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n          {\r\n            'bg-transparent hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n            'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n          }\r\n        ),\r\n      }\r\n    }\r\n    case ButtonTheme.dark: {\r\n      return {\r\n        button: classnames(\r\n          'border border-transparent text-gray-50 active:bg-gray-500/90 disabled:bg-gray-500/30 disabled:text-gray-300 disabled:hover:bg-gray-500/30 disabled:hover:text-gray-300',\r\n          {\r\n            'bg-gray-500/30 hover:bg-gray-500/50': !active,\r\n            'bg-gray-500/90': active,\r\n          }\r\n        ),\r\n      }\r\n    }\r\n    case ButtonTheme.blue: {\r\n      return {\r\n        button: classnames(\r\n          'border border-transparent text-white hover:text-white active:bg-blue-600 disabled:bg-blue-200 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 dark:disabled:hover:text-gray-300',\r\n          {\r\n            'bg-blue-400 hover:bg-blue-500': !active,\r\n            'bg-blue-600': active,\r\n          }\r\n        ),\r\n      }\r\n    }\r\n    case ButtonTheme.violet: {\r\n      return {\r\n        button: classnames(\r\n          'text-white hover:text-white focus:text-white disabled:bg-violet-200 dark:disabled:text-gray-300 disabled:hover:bg-violet-200 dark:disabled:hover:text-gray-300',\r\n          {\r\n            'bg-violet-500 hover:bg-violet-600': !active,\r\n            'bg-violet-700': active,\r\n          }\r\n        ),\r\n      }\r\n    }\r\n    case ButtonTheme.blueHover: {\r\n      return {\r\n        button: classnames(\r\n          'border border-transparent active:bg-blue-600 disabled:bg-blue-200 disabled:text-gray-400 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 disabled:hover:text-gray-400 dark:disabled:hover:text-gray-300',\r\n          {\r\n            'text-blue-600 hover:bg-blue-400 hover:text-white dark:text-blue-500 dark:hover:text-white': !active,\r\n            'bg-blue-400 text-white': active,\r\n          }\r\n        ),\r\n      }\r\n    }\r\n    case ButtonTheme.red: {\r\n      return {\r\n        button: classnames(\r\n          'border border-transparent text-white active:bg-red-600 disabled:bg-red-200 disabled:text-gray-300 disabled:hover:bg-red-200 disabled:hover:text-gray-300',\r\n          {\r\n            'bg-red-400 hover:bg-red-500': !active,\r\n            'bg-red-600': active,\r\n          }\r\n        ),\r\n      }\r\n    }\r\n    case ButtonTheme.headerItem: {\r\n      return {\r\n        button: classnames(\r\n          'border border-transparent bg-gray-800 text-gray-300 hover:bg-gray-900 hover:text-white disabled:hover:text-gray-300 disabled:bg-gray-700 disabled:hover:bg-gray-700' // Base\r\n        ),\r\n        icon: 'text-white',\r\n      }\r\n    }\r\n    case ButtonTheme.menuItem: {\r\n      return {\r\n        button: classnames(\r\n          'border border-transparent dark:disabled:hover:bg-transparent disabled:hover:bg-transparent',\r\n          {\r\n            'hover:bg-gray-200/30 disabled:text-gray-400 disabled:hover:text-gray-400 dark:hover:bg-gray-500/30':\r\n              !active,\r\n            'bg-gray-200/30 dark:bg-gray-500/30': active,\r\n          }\r\n        ),\r\n      }\r\n    }\r\n    case ButtonTheme.menuItemTransparent: {\r\n      return {\r\n        button: 'border border-transparent disabled:text-gray-400',\r\n      }\r\n    }\r\n    case ButtonTheme.menuItemDark: {\r\n      return {\r\n        button: classnames('border border-transparent text-white dark:disabled:hover:bg-transparent', {\r\n          'hover:bg-gray-700': !active,\r\n          'bg-gray-700': active,\r\n        }),\r\n      }\r\n    }\r\n    case ButtonTheme.opacity:\r\n      return {\r\n        button: classnames(\r\n          'border border-transparent disabled:opacity-50 disabled:hover:opacity-50 dark:text-gray-400',\r\n          {\r\n            'opacity-70 hover:opacity-100': !active,\r\n          }\r\n        ),\r\n      }\r\n    case ButtonTheme.outline:\r\n      return {\r\n        button: classnames(\r\n          // Base styles\r\n          'bg-primary border disabled:border-gray-100 disabled:bg-gray-50 disabled:text-gray-500 disabled:hover:border-gray-100 disabled:hover:bg-gray-50 disabled:hover:text-gray-500',\r\n          // Dark styles\r\n          'dark:bg-gray-800 dark:text-gray-50 dark:disabled:border-transparent dark:disabled:bg-gray-700 dark:disabled:text-gray-400 dark:disabled:hover:border-transparent dark:disabled:hover:bg-gray-700 dark:disabled:hover:text-gray-400',\r\n          {\r\n            'border-blue-400 dark:border-blue-400': active,\r\n            'border-gray-200 hover:border-gray-300 dark:hover:border-gray-400 dark:border-primary': !active,\r\n          }\r\n        ),\r\n      }\r\n    case ButtonTheme.chip:\r\n      return {\r\n        button: classnames('border text-default dark:disabled:hover:bg-gray-700 disabled:hover:bg-gray-50', {\r\n          'border-transparent bg-gray-200/30 hover:bg-gray-200/30 dark:bg-gray-700 dark:hover:bg-gray-500/30': !active,\r\n          'border-blue-400 bg-blue-50 text-gray-900 dark:border-blue-400 dark:bg-gray-500/30 dark:text-white': active,\r\n        }),\r\n      }\r\n    case ButtonTheme.chipOutline:\r\n      return {\r\n        button: classnames(\r\n          // Base styles\r\n          'border text-gray-600 disabled:text-gray-400 disabled:hover:border-gray-200 disabled:hover:bg-primary disabled:hover:text-gray-400',\r\n          // Dark styles\r\n          'dark:text-gray-200 dark:disabled:text-gray-400 dark:disabled:hover:text-gray-400 dark:disabled:hover:border-gray-600 dark:disabled:hover:bg-primary',\r\n          {\r\n            'bg-primary border-gray-200 dark:border-primary hover:text-default hover:border-gray-300 hover:bg-gray-50 dark:hover:text-default dark:hover:bg-gray-900 dark:hover:border-gray-400':\r\n              !active,\r\n            'text-default border-blue-400 bg-blue-50 dark:bg-blue-700 dark:text-white': active,\r\n          }\r\n        ),\r\n      }\r\n    case ButtonTheme.chipTransparent:\r\n      return {\r\n        button: classnames(\r\n          'border dark:disabled:hover:bg-transparent disabled:hover:bg-transparent dark:disabled:hover:text-gray-400 disabled:hover:text-gray-500', // Base styles\r\n          {\r\n            'border-transparent text-gray-500 hover:bg-gray-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n              !active,\r\n            'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-500/30 dark:text-white': active,\r\n          }\r\n        ),\r\n      }\r\n    case ButtonTheme.link: {\r\n      return {\r\n        button: classnames(\r\n          'border border-transparent disabled:text-blue-500/50 disabled:hover:text-blue-500/50', // Light\r\n          'dark:disabled:text-blue-300/50 dark:disabled:hover:text-blue-300/50', // Dark\r\n          {\r\n            'text-blue-500 hover:text-blue-600 dark:text-blue-300 dark:hover:text-blue-200': !active,\r\n            'bg-blue-50 text-blue-600 dark:bg-blue-700 dark:text-white': active,\r\n          }\r\n        ),\r\n      }\r\n    }\r\n    case ButtonTheme.linkText: {\r\n      return {\r\n        button:\r\n          'text-inherit font-normal hover:text-blue-600 dark:hover:text-blue-200 no-underline hover:underline disabled:opacity-50 disabled:hover:opacity-50',\r\n      }\r\n    }\r\n    case ButtonTheme.tab: {\r\n      return {\r\n        button: classnames('border-b', {\r\n          'border-b-gray-100 text-default dark:border-b-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 dark:hover:border-b-gray-600':\r\n            !active,\r\n          'text-blue-500 border-b-blue-400 shadow-blue-400 dark:text-blue-300': active,\r\n          'shadow-[inset_0_-1px_0]': active && size !== 'xlarge',\r\n          'shadow-[inset_0_-3px_0]': active && size === 'xlarge',\r\n        }),\r\n      }\r\n    }\r\n    default:\r\n      return {}\r\n  }\r\n}\r\n\r\n/**\r\n * Export Button html props type so we don’t always have to omit\r\n */\r\nexport type ButtonHTMLProps = Omit<\r\n  React.HTMLProps<HTMLButtonElement>,\r\n  'ref' | 'type' | 'size' | 'content' | 'align' | 'as'\r\n>\r\n\r\nexport interface ButtonProps {\r\n  /**\r\n   * Visual appearance of the button\r\n   */\r\n  theme?: ButtonThemeType\r\n\r\n  /**\r\n   * Sets if button is square or normal.\r\n   *\r\n   * @default 'regular'\r\n   */\r\n  appearance?: 'regular' | 'square'\r\n\r\n  /**\r\n   * Size of the button\r\n   *\r\n   * @default \"regular\"\r\n   */\r\n  size?: ButtonSizeType\r\n\r\n  /**\r\n   * Override align of the text for a button\r\n   *\r\n   * @default center, left when `leftContent` or `rightContent` are defined\r\n   */\r\n  align?: keyof typeof ButtonAlign\r\n\r\n  /**\r\n   * Override button padding\r\n   *\r\n   * @default undefined\r\n   */\r\n  padding?: keyof typeof ButtonPadding\r\n\r\n  /**\r\n   * Render button in an active state (darker background, etc.)\r\n   */\r\n  active?: boolean\r\n\r\n  /**\r\n   * Sets if the button has focus ring\r\n   *\r\n   * @default true\r\n   */\r\n  focusRing?: boolean\r\n\r\n  /**\r\n   * Sets rounded corners for the button\r\n   *\r\n   * @default regular\r\n   */\r\n  rounding?: ButtonRoundingType\r\n\r\n  /**\r\n   * Class for the content wrapper\r\n   */\r\n  contentClass?: string\r\n\r\n  /**\r\n   * Name of left icon\r\n   */\r\n  leftContent?: JSX.Element | IconNameType\r\n\r\n  /**\r\n   * Name of right icon\r\n   */\r\n  rightContent?: JSX.Element | IconNameType\r\n}\r\n\r\nexport type ButtonComponentProps<TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT> =\r\n  PropsWithAs<TagType> & ButtonProps\r\n\r\nfunction ButtonComponent<TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT>(\r\n  {\r\n    as: asComponent,\r\n    theme = 'light',\r\n    size = 'regular',\r\n    rounding = 'regular',\r\n    focusRing = true,\r\n    appearance = 'regular',\r\n    align,\r\n    padding = size, // same as size\r\n    active,\r\n    contentClass,\r\n    leftContent,\r\n    rightContent,\r\n    className,\r\n    children,\r\n    ...props\r\n  }: ButtonComponentProps<TagType>,\r\n  ref: React.ForwardedRef<HTMLElement>\r\n) {\r\n  const isSquare = appearance === 'square'\r\n  const buttonTheme = React.useMemo(\r\n    () => getButtonTheme({ theme: ButtonTheme[theme], active, size }),\r\n    [theme, active, size]\r\n  )\r\n  const buttonPadding = React.useMemo(() => (isSquare ? null : ButtonPadding[padding]), [isSquare, padding])\r\n  const buttonSize = isSquare ? ButtonSquareSize[size] : ButtonSize[size]\r\n  const buttonRounding = ButtonRounding[rounding]\r\n  const hasIcons = leftContent || rightContent\r\n\r\n  return React.createElement(\r\n    asComponent ?? BUTTON_DEFAULT_ELEMENT,\r\n    {\r\n      ...props,\r\n      ref,\r\n      className: classnames(\r\n        BUTTON_BASE_CLASS,\r\n        buttonTheme.button,\r\n        buttonPadding,\r\n        buttonSize,\r\n        buttonRounding,\r\n        {\r\n          [BUTTON_SQUARE_BASE_CLASS]: isSquare,\r\n          [BUTTON_FOCUS_STYLES]: focusRing,\r\n        },\r\n        className\r\n      ),\r\n    },\r\n    <>\r\n      {leftContent && (\r\n        <div className=\"flex w-3 items-center justify-center\">\r\n          {isValidIconName(leftContent) ? <Icon name={leftContent} className={buttonTheme.icon} /> : leftContent}\r\n        </div>\r\n      )}\r\n      {children && !isSquare ? (\r\n        <div\r\n          className={classnames(contentClass, 'grow', (align ?? hasIcons) ? ButtonAlign.left : ButtonAlign.center, {\r\n            'ml-0.5': leftContent && ButtonSize.xxsmall === ButtonSize[size],\r\n            'ml-1': leftContent && ButtonSize.xsmall === ButtonSize[size],\r\n            'ml-1.5': leftContent && [ButtonSize.none, ButtonSize.small, ButtonSize.regular].includes(ButtonSize[size]),\r\n            'ml-2': leftContent && [ButtonSize.medium, ButtonSize.large, ButtonSize.xlarge].includes(ButtonSize[size]),\r\n            'mr-0.5': rightContent && ButtonSize.xxsmall === ButtonSize[size],\r\n            'mr-1': rightContent && ButtonSize.xsmall === ButtonSize[size],\r\n            'mr-1.5':\r\n              rightContent && [ButtonSize.none, ButtonSize.small, ButtonSize.regular].includes(ButtonSize[size]),\r\n            'mr-2': rightContent && [ButtonSize.medium, ButtonSize.large, ButtonSize.xlarge].includes(ButtonSize[size]),\r\n          })}\r\n        >\r\n          {children}\r\n        </div>\r\n      ) : (\r\n        children\r\n      )}\r\n      {rightContent && (\r\n        <div className=\"flex w-3 items-center justify-center\">\r\n          {isValidIconName(rightContent) ? <Icon name={rightContent} className={buttonTheme.icon} /> : rightContent}\r\n        </div>\r\n      )}\r\n    </>\r\n  )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const Button = React.forwardRef(ButtonComponent) as <\r\n  TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n  props: PropsWithAs<TagType> & ButtonProps & { ref?: React.ForwardedRef<HTMLElement> }\r\n) => ReturnType<typeof ButtonComponent>\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Box } from '../box'\r\nimport { Input, InputProps } from '../input'\r\n\r\nexport interface ComboBoxProps extends Partial<Omit<Ariakit.ComboboxProps, 'store' | 'onChange'>> {\r\n  /**\r\n   * The returned object from `useComboBoxState`\r\n   */\r\n  state: Ariakit.ComboboxStore\r\n\r\n  /**\r\n   * Additional props for the input\r\n   */\r\n  inputProps?: Partial<InputProps> & Omit<Partial<Ariakit.ComboboxProps>, 'size'>\r\n\r\n  /**\r\n   * Additional props for the popover\r\n   */\r\n  popoverProps?: Partial<Ariakit.ComboboxPopoverProps>\r\n\r\n  /**\r\n   * Id for testing purposes\r\n   */\r\n  inputTestId?: string\r\n\r\n  /**\r\n   * Minimum num of chars in input to show the popover\r\n   */\r\n  minValueLength?: number\r\n\r\n  /**\r\n   * Inut value getter\r\n   */\r\n  getInputValue?: (activeValue: string | undefined, value: string) => string\r\n}\r\n\r\nexport function ComboBox({\r\n  state,\r\n  children,\r\n  inputProps,\r\n  popoverProps,\r\n  inputTestId,\r\n  'aria-label': ariaLabel,\r\n  minValueLength = 0,\r\n  getInputValue,\r\n  ...props\r\n}: React.PropsWithChildren<ComboBoxProps>) {\r\n  const isMounted = state.useState('mounted')\r\n  const value = state.useState('value')\r\n  const activeValue = state.useState('activeValue')\r\n  const placement = state.useState('currentPlacement')\r\n\r\n  const inputValue = React.useMemo(() => {\r\n    if (getInputValue) return getInputValue(activeValue, value)\r\n\r\n    return activeValue || value\r\n  }, [getInputValue, value, activeValue])\r\n\r\n  return (\r\n    <>\r\n      <Ariakit.Combobox\r\n        store={state}\r\n        autoFocus={props.autoFocus ?? false}\r\n        value={inputValue}\r\n        render={\r\n          <Input\r\n            {...inputProps}\r\n            aria-label={ariaLabel}\r\n            data-testid={inputTestId}\r\n            onKeyDown={(ev: React.KeyboardEvent<HTMLInputElement>) => {\r\n              if (ev.key === 'Enter') {\r\n                state.setSelectedValue(value)\r\n              }\r\n              inputProps?.onKeyDown?.(ev)\r\n            }}\r\n          />\r\n        }\r\n        {...props}\r\n      />\r\n      {isMounted && value.length >= minValueLength && (\r\n        <Ariakit.ComboboxPopover\r\n          portal\r\n          gutter={4}\r\n          unmountOnHide\r\n          render={<Box />}\r\n          store={state}\r\n          aria-label={ariaLabel}\r\n          {...popoverProps}\r\n          className={classnames(\r\n            'z-dialog flex flex-col items-stretch space-y-px p-2 opacity-0 outline-none transition duration-[250ms] will-change-transform data-[enter]:translate-x-0 data-[enter]:translate-y-0 data-[enter]:opacity-100 motion-safe:transform',\r\n            {\r\n              'motion-safe:translate-y-1': placement.startsWith('top'),\r\n              'motion-safe:-translate-x-1': placement.startsWith('right'),\r\n              'motion-safe:-translate-y-1': placement.startsWith('bottom'),\r\n              'motion-safe:translate-x-1': placement.startsWith('left'),\r\n            },\r\n            popoverProps?.className\r\n          )}\r\n        >\r\n          {children}\r\n        </Ariakit.ComboboxPopover>\r\n      )}\r\n    </>\r\n  )\r\n}\r\n","// Disable rule as the component is external\r\nimport * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonProps } from '../button'\r\nimport { PropsWithAs } from '../types'\r\n\r\nconst DEFAULT_ELEMENT = 'button'\r\n\r\nexport interface ComboBoxItemProps extends ButtonProps {\r\n  /**\r\n   * The returned object from `useComboBoxState`\r\n   */\r\n  state?: Ariakit.ComboboxStore\r\n\r\n  /**\r\n   * Value for the combo box item\r\n   */\r\n  value: string\r\n}\r\n\r\nfunction ComboBoxItemButton<TagType extends React.ElementType = typeof DEFAULT_ELEMENT>(\r\n  { as: asComponent, children, 'data-active-item': dataActiveItem, ...props }: PropsWithAs<TagType> & ButtonProps,\r\n  ref: React.ForwardedRef<HTMLElement>\r\n) {\r\n  return (\r\n    <Button\r\n      {...(props as any)}\r\n      ref={ref}\r\n      as={asComponent ?? DEFAULT_ELEMENT}\r\n      active={dataActiveItem === true}\r\n      theme=\"menuItem\"\r\n      type=\"button\"\r\n      align=\"left\"\r\n      contentClass={classnames(props.contentClass, 'font-normal')}\r\n    >\r\n      {children}\r\n    </Button>\r\n  )\r\n}\r\n\r\nexport const ComboBoxItemButtonWithRef = React.forwardRef(ComboBoxItemButton) as <\r\n  TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n  props: PropsWithAs<TagType> & ButtonProps & { ref?: React.ForwardedRef<HTMLElement> }\r\n) => ReturnType<typeof ComboBoxItemButton>\r\n\r\nexport function ComboBoxItem<TagType extends React.ElementType = typeof DEFAULT_ELEMENT>({\r\n  as: asComponent,\r\n  state,\r\n  children,\r\n  contentClass,\r\n  ...props\r\n}: PropsWithAs<TagType> & ComboBoxItemProps) {\r\n  return (\r\n    <Ariakit.ComboboxItem\r\n      store={state}\r\n      {...props}\r\n      render={\r\n        <ComboBoxItemButtonWithRef\r\n          as={(asComponent ?? DEFAULT_ELEMENT) as React.ElementType}\r\n          contentClass={contentClass}\r\n        >\r\n          {children}\r\n        </ComboBoxItemButtonWithRef>\r\n      }\r\n    />\r\n  )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\nexport const useComboBoxState = Ariakit.useComboboxStore\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\n\r\nexport const ZIndexContext = React.createContext<string | null>(null)\r\n\r\nexport function useZIndex(defaultValue: string | null = 'z-50') {\r\n  return React.useContext(ZIndexContext) ?? defaultValue\r\n}\r\n\r\nexport type DialogStateProps = Ariakit.DialogStoreProps\r\nexport type DialogStateReturn = ReturnType<typeof useDialogState>\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function useDialogState(settings?: DialogStateProps) {\r\n  return Ariakit.useDialogStore(settings)\r\n}\r\n\r\nexport const DialogDragContext = React.createContext<{\r\n  enabled?: boolean\r\n  handleRef?: React.RefObject<HTMLDivElement>\r\n  boxPosition: { x: number; y: number }\r\n  resetBoxPosition: () => void\r\n  setBoxPosition: React.Dispatch<React.SetStateAction<{ x: number; y: number }>>\r\n}>({\r\n  enabled: false,\r\n  handleRef: undefined,\r\n  boxPosition: { x: 0, y: 0 },\r\n  resetBoxPosition: () => {},\r\n  setBoxPosition: () => {},\r\n})\r\n\r\n/**\r\n * Hook which allows an element on the page to become draggable\r\n */\r\nexport function useDrag(enabled?: boolean) {\r\n  const dragging = React.useRef(false)\r\n  const handleRef = React.useRef<HTMLDivElement>(null)\r\n  const handleElement = handleRef.current\r\n\r\n  /**\r\n   * Set box position in both state for the component to re-render and as a ref\r\n   * so that we don’t have to re-run the whole effect on every change\r\n   */\r\n  const [boxPosition, setBoxPosition] = React.useState({ x: 0, y: 0 })\r\n  const boxPositionRef = React.useRef({ x: 0, y: 0 })\r\n  const dragDiff = React.useRef({ x: 0, y: 0 })\r\n\r\n  const { current: resetBoxPosition } = React.useRef(() => {\r\n    setBoxPosition({ x: 0, y: 0 })\r\n  })\r\n\r\n  React.useEffect(() => {\r\n    boxPositionRef.current = { ...boxPosition }\r\n  }, [boxPosition])\r\n\r\n  React.useEffect(() => {\r\n    if (!enabled || !handleElement || isMobile()) return\r\n\r\n    const onMouseDown = (ev: MouseEvent) => {\r\n      dragging.current = true\r\n\r\n      dragDiff.current = {\r\n        x: ev.pageX - boxPositionRef.current.x - window.scrollX,\r\n        y: ev.pageY - boxPositionRef.current.y - window.scrollY,\r\n      }\r\n    }\r\n\r\n    const onMouseUp = () => {\r\n      dragging.current = false\r\n    }\r\n\r\n    const onMouseMove = (ev: MouseEvent) => {\r\n      if (!dragging.current) return\r\n\r\n      const x = ev.pageX - dragDiff.current.x - window.scrollX\r\n      const y = ev.pageY - dragDiff.current.y - window.scrollY\r\n\r\n      setBoxPosition({ x, y })\r\n    }\r\n\r\n    handleElement.addEventListener('pointerdown', onMouseDown)\r\n    handleElement.addEventListener('dblclick', resetBoxPosition)\r\n    window.addEventListener('pointerup', onMouseUp)\r\n    document.body.addEventListener('pointermove', onMouseMove)\r\n\r\n    return () => {\r\n      handleElement.removeEventListener('pointerdown', onMouseDown)\r\n      handleElement.removeEventListener('dblclick', resetBoxPosition)\r\n      window.removeEventListener('pointerup', onMouseUp)\r\n      document.body.removeEventListener('pointermove', onMouseMove)\r\n    }\r\n  }, [enabled, handleElement, resetBoxPosition])\r\n\r\n  return {\r\n    enabled,\r\n    handleRef,\r\n    boxPosition,\r\n    setBoxPosition,\r\n    resetBoxPosition,\r\n  }\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\nimport { ReactNode, useEffect } from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\nimport { useRouteError } from 'react-router-dom'\r\n\r\nimport { link } from '../services/routing'\r\nimport { Button } from './button'\r\nimport { Heading, Paragraph } from './typography'\r\n\r\ninterface ErrorViewProps {\r\n  /**\r\n   * Title of the message\r\n   */\r\n  title?: ReactNode\r\n\r\n  /**\r\n   * Body text\r\n   */\r\n  message?: ReactNode\r\n\r\n  /**\r\n   * Show contact support text under the message\r\n   *\r\n   * @default true\r\n   */\r\n  showContact?: boolean\r\n\r\n  /**\r\n   * Show refresh page button under the text\r\n   *\r\n   * @default true\r\n   */\r\n  showRefresh?: boolean\r\n}\r\n\r\nexport function ErrorView({ title, message, showContact = true, showRefresh = true }: ErrorViewProps) {\r\n  return (\r\n    <div className=\"flex h-full w-full select-text flex-col items-center justify-center\" data-testid=\"error-view\">\r\n      <Heading level={2}>{title}</Heading>\r\n      <Paragraph className=\"mt-2 w-96 text-center\">{message}</Paragraph>\r\n\r\n      {showContact && (\r\n        <Paragraph className=\"mt-4 w-96 text-center\">\r\n          Our development team has been notified of this. If the error persists, please{' '}\r\n          <a href={link.toContact()} className=\"tab-link text-link hover:underline\">\r\n            contact support\r\n          </a>\r\n          .\r\n        </Paragraph>\r\n      )}\r\n\r\n      {showRefresh && (\r\n        <Button\r\n          as=\"a\"\r\n          className=\"mt-6\"\r\n          href={window.location.origin + window.location.pathname + window.location.search}\r\n        >\r\n          Refresh page\r\n        </Button>\r\n      )}\r\n    </div>\r\n  )\r\n}\r\n\r\nexport function DefaultErrorBoundary({\r\n  error,\r\n  title = 'Application error',\r\n  message = 'We’re sorry but an unknown error occured.',\r\n  ...props\r\n}: Partial<FallbackProps & ErrorViewProps>) {\r\n  useEffect(() => {\r\n    // Ignore webpack chunk loading errors\r\n    if (error?.name === 'ChunkLoadError') return\r\n    // Otherwise log to Sentry\r\n    Sentry.captureException(error, { level: 'fatal' })\r\n    // so we can see error in logs\r\n    console.error('ErrorBoundary:', JSON.stringify(error))\r\n  }, [error])\r\n\r\n  return <ErrorView title={title} message={message} {...props} />\r\n}\r\n\r\nexport function RouterErrorElement() {\r\n  const error = useRouteError() as Error\r\n  return <DefaultErrorBoundary error={error} />\r\n}\r\n","import { useMemo } from 'react'\r\n\r\ninterface HighlightProps {\r\n  /**\r\n   * Search string that will be highlighted\r\n   */\r\n  highlight: string\r\n  /**\r\n   * Text to be highlighted\r\n   */\r\n  text: string\r\n}\r\n\r\nexport function Highlight({ highlight, text }: HighlightProps) {\r\n  const index = text.toLowerCase().indexOf(highlight.toLowerCase())\r\n\r\n  const processedText = useMemo(\r\n    () => ({\r\n      before: text.substring(0, index),\r\n      highlight: text.substring(index, index + highlight.length),\r\n      after: text.substring(index + highlight.length),\r\n    }),\r\n    [highlight.length, index, text]\r\n  )\r\n\r\n  if (index < 0 || highlight.length < 1) return <span>{text}</span>\r\n\r\n  return (\r\n    <>\r\n      <span className=\"relative z-10\">{processedText.before}</span>\r\n      {!!processedText.highlight.length && (\r\n        <span className=\"rounded-sm bg-yellow-100 text-yellow-800 dark:bg-transparent dark:text-orange-300\">\r\n          {processedText.highlight}\r\n        </span>\r\n      )}\r\n      <span className=\"relative z-10\">{processedText.after}</span>\r\n    </>\r\n  )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { IconNameType, iconList } from '.'\r\nimport { SVGProps } from './svg'\r\n\r\nexport interface IconProps extends SVGProps {\r\n  /**\r\n   * Icon name\r\n   */\r\n  name?: IconNameType\r\n\r\n  /**\r\n   * Alternative way to pass icon to render if you want to render a custom component\r\n   * or use `iconList` object lookup\r\n   */\r\n  as?: React.FC<SVGProps>\r\n}\r\n\r\nexport function Icon({ name, as: asComponent, className, width = 16, height = width, ...props }: IconProps) {\r\n  if (name && asComponent) {\r\n    throw new Error('Specifying both \"name\" and \"as\" on Icon component is not supported')\r\n  }\r\n\r\n  if (!name && !asComponent) {\r\n    throw new Error('No icon specified')\r\n  }\r\n\r\n  if (name) {\r\n    if (iconList[name] === undefined) {\r\n      throw new Error('Icon not found')\r\n    }\r\n\r\n    const fileName = ['icons', iconList[name]].filter(Boolean).join('_')\r\n\r\n    return (\r\n      <svg\r\n        {...props}\r\n        className={classnames('pointer-events-none block shrink-0 fill-current', className)}\r\n        width={typeof width === 'number' && Number.isFinite(width) ? `${width / 16}rem` : width}\r\n        height={typeof height === 'number' && Number.isFinite(height) ? `${height / 16}rem` : height}\r\n      >\r\n        <use href={`/assets/dist-icons/${fileName}.svg?rev=${FinvizSettings.versionImages}#${name}`} />\r\n      </svg>\r\n    )\r\n  }\r\n\r\n  const Component = asComponent!\r\n  return <Component {...props} className={className} width={width} height={height} />\r\n}\r\n","// Export the Icon component itself\r\nexport * from './icon'\r\n\r\nexport function isValidIconName(name?: unknown): name is IconNameType {\r\n  if (!name || typeof name !== 'string') return false\r\n\r\n  return iconList[name as IconNameType] !== undefined\r\n}\r\n\r\nexport type IconNameType = keyof typeof iconList\r\n\r\nconst root = ''\r\nconst chartLayouts = 'chart-layouts'\r\nconst chartTools = 'chart-tools'\r\nconst chartTypes = 'chart-types'\r\nconst screener = 'screener'\r\n\r\n// Export list of icon components\r\nexport const iconList = {\r\n  // Main icons\r\n  add: root,\r\n  arrowBackward: root,\r\n  arrowDownShort: root,\r\n  arrowForward: root,\r\n  arrowUpShort: root,\r\n  briefcase: root,\r\n  calendar: root,\r\n  caretDown: root,\r\n  caretLeft: root,\r\n  caretRight: root,\r\n  caretUp: root,\r\n  caretVertical: root,\r\n  chartBar: root,\r\n  chartBubble: root,\r\n  chartPie: root,\r\n  chartTable: root,\r\n  chartTreemap: root,\r\n  checkboxTick: root,\r\n  chevronDown: root,\r\n  chevronLeft: root,\r\n  chevronRight: root,\r\n  chevronUp: root,\r\n  close: root,\r\n  darkMode: root,\r\n  diamondOutlined: root,\r\n  done: root,\r\n  drag: root,\r\n  draw: root,\r\n  empty: root,\r\n  exitFullscreen: root,\r\n  flash: root,\r\n  fullscreen: root,\r\n  gesture: root,\r\n  gift: root,\r\n  hamburger: root,\r\n  help: root,\r\n  idea: root,\r\n  ideaLoad: root,\r\n  ideaSave: root,\r\n  import: root,\r\n  info: root,\r\n  interval: root,\r\n  lightMode: root,\r\n  link: root,\r\n  lock: root,\r\n  lockOpened: root,\r\n  menuClose: root,\r\n  minus: root,\r\n  more: root,\r\n  note: root,\r\n  openInNew: root,\r\n  palette: root,\r\n  profile: root,\r\n  publish: root,\r\n  refresh: root,\r\n  remove: root,\r\n  restore: root,\r\n  search: root,\r\n  settings: root,\r\n  settingsWheel: root,\r\n  share: root,\r\n  signOut: root,\r\n  star: root,\r\n  starOutlined: root,\r\n  switchHorizontal: root,\r\n  switchVertical: root,\r\n  tabKey: root,\r\n  template: root,\r\n  trashCan: root,\r\n  trendingDown: root,\r\n  trendingUp: root,\r\n  triangle: root,\r\n  triangleOutlineDown: root,\r\n  triangleOutlineUp: root,\r\n  warning: root,\r\n\r\n  // Chart layouts\r\n  layout1h1v: chartLayouts,\r\n  layout1h2v: chartLayouts,\r\n  layout1h3v: chartLayouts,\r\n  layout1l2r: chartLayouts,\r\n  layout1t2b: chartLayouts,\r\n  layout2h1v: chartLayouts,\r\n  layout2h2v: chartLayouts,\r\n  layout3h1v: chartLayouts,\r\n  layout3h2v: chartLayouts,\r\n\r\n  // Chart tools\r\n  drawingActionDelete: chartTools,\r\n  drawingSettingAutosaveOff: chartTools,\r\n  drawingSettingAutosaveOn: chartTools,\r\n  drawingSettingAutosaveSaving: chartTools,\r\n  drawingSettingDrawingMode: chartTools,\r\n  drawingSettingDrawingModeActive: chartTools,\r\n  drawingSettingHide: chartTools,\r\n  drawingSettingLock: chartTools,\r\n  drawingSettingPreserveDrawings: chartTools,\r\n  drawingSettingPreserveDrawingsActive: chartTools,\r\n  drawingSettingShow: chartTools,\r\n  drawingSettingUnlock: chartTools,\r\n  toolArrow: chartTools,\r\n  toolAVWAP: chartTools,\r\n  toolBrush: chartTools,\r\n  toolCallout: chartTools,\r\n  toolCurve: chartTools,\r\n  toolElliottWave: chartTools,\r\n  toolEllipse: chartTools,\r\n  toolExpand: chartTools,\r\n  toolFibonacci: chartTools,\r\n  toolLine: chartTools,\r\n  toolMeasure: chartTools,\r\n  toolMidLineH: chartTools,\r\n  toolMidLineV: chartTools,\r\n  toolMouse: chartTools,\r\n  toolPitchfork: chartTools,\r\n  toolPolygon: chartTools,\r\n  toolPosition: chartTools,\r\n  toolRect: chartTools,\r\n  toolRectRotated: chartTools,\r\n  toolText: chartTools,\r\n  toolTriangle: chartTools,\r\n  toolXABCD: chartTools,\r\n\r\n  // Chart types\r\n  candleBarBasic: chartTypes,\r\n  candleBarHeikinAshi: chartTypes,\r\n  candleBarHollow: chartTypes,\r\n  lineChartType: chartTypes,\r\n  ohlcChartType: chartTypes,\r\n\r\n  // Screener\r\n  above: screener,\r\n  aboveEqual: screener,\r\n  abovePercent: screener,\r\n  below: screener,\r\n  belowEqual: screener,\r\n  belowPercent: screener,\r\n  between: screener,\r\n  crosses: screener,\r\n  crossesDown: screener,\r\n  crossesUp: screener,\r\n  equal: screener,\r\n  outside: screener,\r\n}\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef, useMemo } from 'react'\r\n\r\nimport { ButtonPadding } from './button'\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { Label } from './typography'\r\n\r\nexport enum InputTheme {\r\n  none,\r\n  light,\r\n  dark,\r\n  navigationBar,\r\n}\r\n\r\nexport enum InputRounding {\r\n  none = '',\r\n  regular = 'rounded-md',\r\n}\r\n\r\n/**\r\n * Enum for input size. Only set size on larger viewports to avoid page zooming\r\n */\r\nexport enum InputSize {\r\n  small = 'h-6 text-2xs', // 24px height\r\n  regular = 'h-7 text-2xs', // 28px height\r\n  medium = 'h-8 text-sm', // 32px height\r\n  large = 'h-9 text-sm', // 36px height\r\n}\r\n\r\nfunction getInputTheme({\r\n  theme,\r\n  isError,\r\n  hasFocusStyle,\r\n  isSelected,\r\n}: {\r\n  theme: InputTheme\r\n  isError: boolean\r\n  hasFocusStyle: boolean\r\n  isSelected: boolean\r\n}) {\r\n  switch (theme) {\r\n    case InputTheme.none:\r\n      return {}\r\n    case InputTheme.dark:\r\n      return {\r\n        input: classnames('border bg-gray-800 text-gray-50 disabled:bg-gray-700 disabled:text-gray-400', {\r\n          'border-gray-600 hover:border-gray-400 disabled:border-gray-700': !isError,\r\n          'border-red-400': isError,\r\n          'focus:border-blue-400 focus:hover:border-blue-400': !isError && hasFocusStyle,\r\n        }),\r\n        icon: classnames({\r\n          'text-gray-500': !isError,\r\n          'text-red-400': isError,\r\n          'group-focus-within:text-blue-400': !isError && hasFocusStyle,\r\n        }),\r\n      }\r\n    case InputTheme.navigationBar:\r\n      return {\r\n        input: classnames(\r\n          'border bg-transparent disabled:border-gray-700 disabled:bg-gray-700 disabled:text-gray-400',\r\n          {\r\n            'border-gray-100 dark:border-gray-600 text-gray-750 dark:text-gray-50':\r\n              !isError && !FinvizSettings.hasUserPremium,\r\n            'border-gray-600 text-gray-50': !isError && FinvizSettings.hasUserPremium,\r\n            'border-red-400': isError,\r\n          }\r\n        ),\r\n        icon: classnames({\r\n          'text-gray-500': !isError,\r\n          'text-red-400': isError,\r\n        }),\r\n      }\r\n    default:\r\n      return {\r\n        input: classnames(\r\n          'border', // Base styles\r\n          'disabled:bg-secondary disabled:text-gray-500', // Light\r\n          'dark:disabled:bg-gray-700 dark:disabled:text-gray-400', // Dark\r\n          {\r\n            'bg-primary': !isSelected,\r\n            'border-gray-200 dark:border-primary hover:border-gray-300 disabled:hover:border-gray-100 dark:hover:border-gray-400 dark:disabled:border-gray-700':\r\n              !isError && !isSelected,\r\n            'border-red-400': isError,\r\n            'focus:border-blue-400 hover:focus:border-blue-400 dark:focus:border-blue-400 dark:hover:focus:border-blue-400':\r\n              !isError && !isSelected && hasFocusStyle,\r\n            'bg-blue-50 border-blue-400 dark:bg-blue-700': isSelected,\r\n          }\r\n        ),\r\n        icon: classnames({\r\n          'text-gray-300 dark:text-gray-500': !isError && !isSelected,\r\n          'text-red-400': isError,\r\n          'group-focus-within:text-blue-400': !isError && !isSelected && hasFocusStyle,\r\n          'text-blue-400': isSelected,\r\n        }),\r\n      }\r\n  }\r\n}\r\n\r\ntype OmitNativeProps<FromType> = Omit<HTMLProps<FromType>, 'label' | 'size'>\r\n\r\nexport interface InputProps {\r\n  /**\r\n   * Label which is rendered above the input\r\n   */\r\n  label?: ReactNode\r\n\r\n  /**\r\n   * Optional label layout switch\r\n   */\r\n  isHorizontalLabel?: boolean\r\n\r\n  /**\r\n   * Optional label className override\r\n   */\r\n  labelClassName?: string\r\n\r\n  /**\r\n   * Theme for the input\r\n   *\r\n   * @default light\r\n   */\r\n  theme?: keyof typeof InputTheme\r\n\r\n  /**\r\n   * Input size. This setting is ignored on mobile to avoid zoom\r\n   *\r\n   * @default regular\r\n   */\r\n  size?: keyof typeof InputSize\r\n\r\n  /**\r\n   * Border radius of the input\r\n   *\r\n   * @default regular\r\n   */\r\n  rounding?: keyof typeof InputRounding\r\n\r\n  /**\r\n   * Hide value stepper for number inputs\r\n   */\r\n  showNumberStepper?: boolean\r\n\r\n  /**\r\n   * Element to display on left the side of the input or name of the icon\r\n   */\r\n  leftContent?: JSX.Element | IconNameType\r\n\r\n  /**\r\n   * Element to display on right the side of the input or name of the icon\r\n   */\r\n  rightContent?: JSX.Element | IconNameType\r\n\r\n  /**\r\n   * Additional class names for the input\r\n   */\r\n  inputClass?: string\r\n\r\n  /**\r\n   * Error label to display under the input\r\n   */\r\n  error?: ReactNode\r\n\r\n  /**\r\n   * Additional info to display under the input\r\n   */\r\n  caption?: ReactNode\r\n\r\n  /**\r\n   * Disables setting text size to 16px on mobile. Only use for pages which aren’t\r\n   * responsive\r\n   */\r\n  isMobileStyleEnabled?: boolean\r\n\r\n  /**\r\n   * Toggle for component focus styles\r\n   *\r\n   * @default true\r\n   */\r\n  hasFocusStyle?: boolean\r\n\r\n  /**\r\n   * Toggle for selected styles\r\n   *\r\n   * @default true\r\n   */\r\n  isSelected?: boolean\r\n}\r\n\r\nexport type InputHTMLProps = OmitNativeProps<HTMLInputElement>\r\n\r\nexport type InputComponentProps = InputProps & InputHTMLProps\r\n\r\nfunction InputComponent(\r\n  {\r\n    label,\r\n    isHorizontalLabel,\r\n    labelClassName,\r\n    size = 'regular',\r\n    theme = 'light',\r\n    rounding = 'regular',\r\n    type,\r\n    showNumberStepper = type === 'number',\r\n    leftContent,\r\n    rightContent,\r\n    inputClass,\r\n    error,\r\n    caption,\r\n    className,\r\n    isMobileStyleEnabled = true,\r\n    hasFocusStyle = true,\r\n    isSelected = false,\r\n    ...props\r\n  }: InputComponentProps,\r\n  ref: ForwardedRef<HTMLInputElement>\r\n) {\r\n  const inputTheme = useMemo(\r\n    () => getInputTheme({ theme: InputTheme[theme], isError: !!error, hasFocusStyle, isSelected }),\r\n    [theme, error, hasFocusStyle, isSelected]\r\n  )\r\n  const isLeftStringIcon = isValidIconName(leftContent)\r\n  const isRightStringIcon = isValidIconName(rightContent)\r\n  const inputSize = InputSize[size]\r\n\r\n  const commonSideContentClassnames = useMemo(\r\n    () => ({\r\n      'flex absolute w-3 items-center justify-center': true,\r\n      'text-gray-500 dark:text-gray-600': theme === 'light',\r\n      'text-gray-600': theme === 'dark',\r\n    }),\r\n    [theme]\r\n  )\r\n\r\n  return (\r\n    <div className=\"w-full\">\r\n      <Label title={label} isHorizontal={isHorizontalLabel} className={labelClassName}>\r\n        <div className={classnames(className, 'group relative flex')}>\r\n          {leftContent && (\r\n            <span\r\n              className={classnames('pointer-events-none top-0 h-full', commonSideContentClassnames, {\r\n                'left-1.5': inputSize === InputSize.small,\r\n                'left-2': inputSize === InputSize.regular,\r\n                'left-2.5': inputSize === InputSize.medium,\r\n                'left-3': inputSize === InputSize.large,\r\n              })}\r\n            >\r\n              {isLeftStringIcon ? (\r\n                <Icon name={leftContent as IconNameType} width={16} className={inputTheme.icon} />\r\n              ) : (\r\n                leftContent\r\n              )}\r\n            </span>\r\n          )}\r\n          <input\r\n            {...props}\r\n            ref={ref}\r\n            type={type}\r\n            className={classnames(\r\n              inputTheme.input,\r\n              inputSize,\r\n              InputRounding[rounding],\r\n              inputClass,\r\n              'w-full grow select-text appearance-none outline-none',\r\n              {\r\n                'mobile:h-8 mobile:text-base': isMobileStyleEnabled,\r\n                'hide-stepper': type === 'number' && showNumberStepper === false,\r\n\r\n                [ButtonPadding.small]: inputSize === InputSize.small,\r\n                [ButtonPadding.regular]: inputSize === InputSize.regular,\r\n                [ButtonPadding.medium]: inputSize === InputSize.medium,\r\n                [ButtonPadding.large]: inputSize === InputSize.large,\r\n              },\r\n              isLeftStringIcon && {\r\n                'pl-6': inputSize === InputSize.small,\r\n                'pl-6.5': inputSize === InputSize.regular,\r\n                'pl-7.5': inputSize === InputSize.medium,\r\n                'pl-8': inputSize === InputSize.large,\r\n              },\r\n              !showNumberStepper &&\r\n                isRightStringIcon && {\r\n                  'pr-6': inputSize === InputSize.small,\r\n                  'pr-6.5': inputSize === InputSize.regular,\r\n                  'pr-7.5': inputSize === InputSize.medium,\r\n                  'pr-8': inputSize === InputSize.large,\r\n                },\r\n              showNumberStepper && {\r\n                'pr-0.5': inputSize === InputSize.small,\r\n                'pr-1': inputSize === InputSize.regular,\r\n                'pr-1.5': inputSize === InputSize.medium,\r\n                'pr-2': inputSize === InputSize.large,\r\n              }\r\n            )}\r\n          />\r\n          {showNumberStepper && (\r\n            <div\r\n              className={classnames(\r\n                'pointer-events-none top-1/2 -mt-2.5 h-5 w-5 rounded bg-gray-50 dark:bg-gray-700 mobile:hidden touch-device:hidden',\r\n                commonSideContentClassnames,\r\n                {\r\n                  'right-0.5': inputSize === InputSize.small,\r\n                  'right-1': inputSize === InputSize.regular,\r\n                  'right-1.5': inputSize === InputSize.medium,\r\n                  'right-2': inputSize === InputSize.large,\r\n                }\r\n              )}\r\n            >\r\n              <Icon name=\"caretVertical\" width={16} className=\"text-gray-300 dark:text-gray-500\" />\r\n            </div>\r\n          )}\r\n          {rightContent && !showNumberStepper && (\r\n            <span\r\n              className={classnames('right-0 top-0 h-full', commonSideContentClassnames, {\r\n                'right-1.5': inputSize === InputSize.small,\r\n                'right-2': inputSize === InputSize.regular,\r\n                'right-2.5': inputSize === InputSize.medium,\r\n                'right-3': inputSize === InputSize.large,\r\n              })}\r\n            >\r\n              {isRightStringIcon ? (\r\n                <Icon name={rightContent as IconNameType} width={16} className={inputTheme.icon} />\r\n              ) : (\r\n                rightContent\r\n              )}\r\n            </span>\r\n          )}\r\n        </div>\r\n      </Label>\r\n      {caption && typeof caption !== 'boolean' && (\r\n        <InputCaption className=\"mt-1 text-gray-500 dark:text-gray-600\">{caption}</InputCaption>\r\n      )}\r\n      {error && typeof error !== 'boolean' && <InputCaption className=\"mt-1 text-red-600\">{error}</InputCaption>}\r\n    </div>\r\n  )\r\n}\r\n\r\ninterface InputCaptionProps extends Omit<HTMLProps<HTMLDivElement>, 'size'> {\r\n  size?: keyof typeof InputSize\r\n}\r\n\r\nfunction InputCaption({ size = 'regular', ...props }: PropsWithChildren<InputCaptionProps>) {\r\n  return (\r\n    <div\r\n      {...props}\r\n      className={classnames(props.className, {\r\n        'text-2xs': ['small', 'regular'].includes(size),\r\n        'text-sm': ['medium', 'large'].includes(size),\r\n      })}\r\n    />\r\n  )\r\n}\r\n\r\ntype TextareaProps = Omit<InputProps, 'leftContent' | 'size'> & OmitNativeProps<HTMLTextAreaElement>\r\n\r\nfunction TextareaComponent(\r\n  {\r\n    label,\r\n    theme = 'light',\r\n    rounding = 'regular',\r\n    inputClass,\r\n    error,\r\n    caption,\r\n    className,\r\n    hasFocusStyle = true,\r\n    isSelected = false,\r\n    ...props\r\n  }: TextareaProps,\r\n  ref: ForwardedRef<HTMLTextAreaElement>\r\n) {\r\n  const textareaTheme = useMemo(\r\n    () => getInputTheme({ theme: InputTheme[theme], isError: !!error, hasFocusStyle, isSelected }),\r\n    [theme, error, hasFocusStyle, isSelected]\r\n  )\r\n\r\n  return (\r\n    <div>\r\n      <Label title={label}>\r\n        <div className={classnames(className, 'flex w-full')}>\r\n          <textarea\r\n            {...props}\r\n            ref={ref}\r\n            className={classnames(\r\n              textareaTheme.input,\r\n              inputClass,\r\n              InputRounding[rounding],\r\n              'grow select-text appearance-none px-2 py-1 text-2xs outline-none mobile:text-base'\r\n            )}\r\n          />\r\n        </div>\r\n      </Label>\r\n      {caption && typeof caption !== 'boolean' && (\r\n        <InputCaption className=\"mt-1 text-gray-500 dark:text-gray-600\">{caption}</InputCaption>\r\n      )}\r\n      {error && typeof error !== 'boolean' && <InputCaption className=\"mt-1 text-red-600\">{error}</InputCaption>}\r\n    </div>\r\n  )\r\n}\r\n\r\nexport const Input = forwardRef(InputComponent)\r\nexport const Textarea = forwardRef(TextareaComponent)\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren } from 'react'\r\n\r\nexport function Centered(props: PropsWithChildren<HTMLProps<HTMLDivElement>>) {\r\n  return <div {...props} className={classnames(props.className, 'flex grow items-center justify-center')} />\r\n}\r\n","import { link } from '../../services/routing'\r\nimport { Button } from '../button'\r\nimport { Centered } from '../centered'\r\nimport { Icon } from '../icon'\r\nimport { Heading, Paragraph } from '../typography'\r\n\r\ninterface Props {\r\n  onRetry?: () => void\r\n}\r\n\r\nexport function SearchError({ onRetry }: Props) {\r\n  return (\r\n    <Centered className=\"h-52 flex-1 flex-col\">\r\n      <Icon width={24} name=\"warning\" className=\"text-gray-600\" />\r\n      <Heading level={5} className=\"mt-5\">\r\n        Error fetching the results\r\n      </Heading>\r\n      <Paragraph size=\"small\" className=\"w-64 text-center text-gray-600 dark:text-gray-400\">\r\n        There’s been an error fetching your results. Please try again or{' '}\r\n        <a href={link.toContact()} className=\"text-blue-600\">\r\n          contact support\r\n        </a>\r\n        .\r\n      </Paragraph>\r\n      {onRetry && (\r\n        <Button className=\"mt-6\" theme=\"blueHover\" onClick={onRetry}>\r\n          Retry\r\n        </Button>\r\n      )}\r\n    </Centered>\r\n  )\r\n}\r\n","import React from 'react'\r\nimport { Link, useInRouterContext } from 'react-router-dom'\r\n\r\nimport { ComboBoxItem, ComboBoxProps } from '../combo-box'\r\nimport { Highlight } from '../highlight'\r\nimport { PropsWithAs } from '../types'\r\nimport { SearchListItem } from './constants'\r\n\r\ninterface SearchItemProps extends Pick<ComboBoxProps, 'state'>, Partial<PropsWithAs<React.ElementType>> {\r\n  item: SearchListItem\r\n}\r\n\r\nfunction getItemHrefProps(item: SearchListItem, inRouterContext?: boolean) {\r\n  if (item.href) {\r\n    if (inRouterContext) return { as: Link, to: item.href, reloadDocument: item.reloadDocument, target: item.target }\r\n    else return { as: 'a' as React.ElementType, href: item.href, target: item.target }\r\n  }\r\n\r\n  return undefined\r\n}\r\n\r\nexport function SearchItem({ item, state, ...props }: SearchItemProps) {\r\n  const value = state.useState('value')\r\n  const isInRouterContext = useInRouterContext()\r\n\r\n  const itemProps = getItemHrefProps(item, isInRouterContext)\r\n\r\n  return (\r\n    <ComboBoxItem\r\n      {...props}\r\n      value={item.value}\r\n      className=\"h-auto min-h-7 w-full shrink-0 appearance-none py-1 leading-snug\"\r\n      contentClass=\"overflow-hidden px-1 -mx-1\"\r\n      {...itemProps}\r\n    >\r\n      <div>\r\n        <Highlight text={item.label} highlight={value} />\r\n      </div>\r\n      {item.subtitle && (\r\n        <div className=\"text-3xs text-gray-600 dark:text-gray-200\">\r\n          <Highlight text={item.subtitle} highlight={value} />\r\n        </div>\r\n      )}\r\n    </ComboBoxItem>\r\n  )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { Centered } from '../centered'\r\nimport { Spinner } from '../spinner'\r\nimport { SearchListItem } from './constants'\r\nimport { SearchItem } from './search-item'\r\n\r\ninterface SearchListProps {\r\n  /**\r\n   * Ariakit combobox store for managing the search list state\r\n   */\r\n  state: Ariakit.ComboboxStore\r\n\r\n  /**\r\n   * Array of items to display in the search list\r\n   */\r\n  items?: SearchListItem[]\r\n\r\n  /**\r\n   * Custom footer content shown at the bottom of the search list\r\n   */\r\n  footer?: React.ReactNode\r\n\r\n  /**\r\n   * Whether the list is currently loading\r\n   *\r\n   * @default false\r\n   */\r\n  isLoading?: boolean\r\n}\r\n\r\nexport function SearchList({\r\n  state,\r\n  children,\r\n  items,\r\n  footer,\r\n  isLoading = false,\r\n}: React.PropsWithChildren<SearchListProps>) {\r\n  const isOpen = state.useState('open')\r\n  const hasContent = React.Children.count(children) > 0 || (items?.length ?? 0) > 0 || !!footer || isLoading\r\n  const { hide } = state\r\n\r\n  React.useEffect(() => {\r\n    if (!hasContent && isOpen) {\r\n      hide()\r\n    }\r\n  }, [hide, hasContent, isOpen])\r\n\r\n  if (isLoading) {\r\n    return (\r\n      <Centered className=\"h-52 flex-1\">\r\n        <Spinner />\r\n      </Centered>\r\n    )\r\n  }\r\n\r\n  return (\r\n    <div className=\"flex flex-1 flex-col space-y-2 overflow-hidden\">\r\n      <div className=\"flex grow flex-col overflow-auto\">\r\n        {children ?? items?.map((item) => <SearchItem state={state} key={item.value} item={item} />)}\r\n      </div>\r\n      {footer}\r\n    </div>\r\n  )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { SearchProps } from './search'\r\n\r\ninterface Props extends Pick<SearchProps, 'state' | 'items'> {\r\n  children: React.ReactNode\r\n}\r\n\r\nfunction getSelectedItem({\r\n  value,\r\n  items,\r\n}: {\r\n  value?: Ariakit.ComboboxStoreProps['selectedValue']\r\n  items: SearchProps['items']\r\n}) {\r\n  return items?.find((item) => item.value === value)\r\n}\r\n\r\nexport function SearchNavigationWrapperInRouterContext({ state, children, items }: Props) {\r\n  const navigate = useNavigate()\r\n  const selectedValue = state.useState('selectedValue')\r\n  React.useEffect(() => {\r\n    const { href, reloadDocument } = getSelectedItem({ value: selectedValue, items }) ?? {}\r\n    if (href) {\r\n      if (reloadDocument) {\r\n        window.location.href = href\r\n      } else {\r\n        navigate(href)\r\n      }\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedValue])\r\n\r\n  return children\r\n}\r\n\r\nexport function SearchNavigationWrapperOutsideRouterContext({ state, children, items }: Props) {\r\n  const selectedValue = state.useState('selectedValue')\r\n  React.useEffect(() => {\r\n    const href = getSelectedItem({ value: selectedValue, items })?.href\r\n\r\n    if (href) {\r\n      window.location.href = href\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedValue])\r\n\r\n  return children\r\n}\r\n","import * as React from 'react'\r\nimport { useInRouterContext } from 'react-router-dom'\r\n\r\nimport { ComboBox, ComboBoxProps } from '../combo-box'\r\nimport { IconNameType } from '../icon'\r\nimport { SearchListItem } from './constants'\r\nimport { SearchError } from './search-error'\r\nimport { SearchList } from './search-list'\r\nimport {\r\n  SearchNavigationWrapperInRouterContext,\r\n  SearchNavigationWrapperOutsideRouterContext,\r\n} from './search-navigation-wrapper'\r\n\r\nexport interface SearchProps\r\n  extends Pick<\r\n    ComboBoxProps,\r\n    'state' | 'autoFocus' | 'inputProps' | 'popoverProps' | 'aria-label' | 'inputTestId' | 'getInputValue'\r\n  > {\r\n  /**\r\n   * Array of items to display in the search list\r\n   */\r\n  items?: SearchListItem[]\r\n\r\n  /**\r\n   * Minimum length of input value before showing results\r\n   *\r\n   * @default 1\r\n   */\r\n  minValueLength?: number\r\n\r\n  /**\r\n   * Placeholder text for the search input\r\n   */\r\n  placeholder?: string\r\n\r\n  /**\r\n   * Content to show on the right side of the input (icon or custom element)\r\n   */\r\n  rightContent?: JSX.Element | IconNameType\r\n\r\n  /**\r\n   * Custom footer content shown at the bottom of the search results\r\n   */\r\n  footer?: React.ReactNode\r\n\r\n  /**\r\n   * Whether to show the search icon in the input\r\n   *\r\n   * @default true\r\n   */\r\n  hasSearchIcon?: boolean\r\n\r\n  /**\r\n   * Whether to match the width of the input and its dropdown box\r\n   */\r\n  isMatchInputAndBoxWidth?: boolean\r\n\r\n  /**\r\n   * Whether the search is currently loading results\r\n   *\r\n   * @default false\r\n   */\r\n  isLoading?: boolean\r\n\r\n  /**\r\n   * Whether there was an error loading the search results\r\n   *\r\n   * @default false\r\n   */\r\n  isError?: boolean\r\n\r\n  /**\r\n   * Callback function to retry when there's an error\r\n   */\r\n  onErrorRetry?: () => void\r\n}\r\n\r\nexport function Search({\r\n  state,\r\n  children,\r\n  items,\r\n  footer,\r\n  'aria-label': ariaLabel,\r\n  inputProps,\r\n  popoverProps,\r\n  inputTestId,\r\n  minValueLength = 1,\r\n  hasSearchIcon = true,\r\n  isLoading = false,\r\n  isError = false,\r\n  onErrorRetry,\r\n  ...props\r\n}: React.PropsWithChildren<SearchProps>) {\r\n  const isInRouterContext = useInRouterContext()\r\n  const isMounted = state.useState('mounted')\r\n\r\n  const Wrapper = isInRouterContext\r\n    ? SearchNavigationWrapperInRouterContext\r\n    : SearchNavigationWrapperOutsideRouterContext\r\n\r\n  return (\r\n    <Wrapper state={state} items={items}>\r\n      <ComboBox\r\n        state={state}\r\n        minValueLength={minValueLength}\r\n        aria-label={ariaLabel}\r\n        autoFocus={props.autoFocus}\r\n        inputProps={{\r\n          autoComplete: 'off',\r\n          autoCorrect: 'off',\r\n          autoCapitalize: 'off',\r\n          onBlur: (e) => {\r\n            // prevent combobox from setting input value on input blur\r\n            e.preventDefault()\r\n          },\r\n          leftContent: hasSearchIcon ? 'search' : undefined,\r\n          ...inputProps,\r\n        }}\r\n        popoverProps={{\r\n          sameWidth: props.isMatchInputAndBoxWidth,\r\n          fitViewport: !props.isMatchInputAndBoxWidth,\r\n          ...popoverProps,\r\n        }}\r\n        inputTestId={inputTestId}\r\n        getInputValue={props.getInputValue}\r\n      >\r\n        {isMounted &&\r\n          (isError ? (\r\n            <SearchError onRetry={onErrorRetry} />\r\n          ) : (\r\n            <SearchList state={state} footer={footer} items={items} isLoading={isLoading}>\r\n              {children}\r\n            </SearchList>\r\n          ))}\r\n      </ComboBox>\r\n    </Wrapper>\r\n  )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\nimport { useComboBoxState } from '../combo-box'\r\n\r\nexport function useSearchComboboxState(props: Ariakit.ComboboxStoreProps<string> = {}) {\r\n  return useComboBoxState({\r\n    placement: 'bottom-start',\r\n    defaultSelectedValue: '',\r\n    ...props,\r\n  })\r\n}\r\n","import classnames from 'classnames'\r\n\r\ninterface SpinnerProps {\r\n  /**\r\n   * Spinner as progress bar\r\n   * @default false\r\n   */\r\n  isProgressBar?: boolean\r\n\r\n  /**\r\n   * Progress number in percent\r\n   * @default 0\r\n   */\r\n  progress?: number\r\n\r\n  /**\r\n   * Spinner box width\r\n   *\r\n   * @default 28\r\n   */\r\n  width?: number\r\n}\r\n\r\nexport function Spinner({ isProgressBar = false, progress = 0, width = 28 }: SpinnerProps) {\r\n  const radius = (3 * width) / 7\r\n  const strokeWidth = radius / 3\r\n  const circleXY = radius + strokeWidth / 2\r\n  const circumference = radius * 2 * Math.PI\r\n\r\n  return (\r\n    <svg\r\n      className={classnames('block shrink-0', { 'animate-spin': !isProgressBar })}\r\n      width={width}\r\n      height={width}\r\n      viewBox={`0 0 ${width} ${width}`}\r\n      xmlns=\"http://www.w3.org/2000/svg\"\r\n    >\r\n      <circle\r\n        className=\"block origin-center fill-transparent stroke-gray-50 dark:stroke-gray-700\"\r\n        style={{ strokeWidth: `${strokeWidth}px` }}\r\n        cx={circleXY}\r\n        cy={circleXY}\r\n        r={radius}\r\n      />\r\n      <circle\r\n        className=\"block origin-center -rotate-90 transform fill-transparent stroke-blue-400\"\r\n        style={{\r\n          strokeDasharray: `${circumference} ${circumference}`,\r\n          strokeDashoffset: `${circumference - ((isProgressBar ? progress : 50) / 100) * circumference}`,\r\n          strokeWidth: `${strokeWidth}px`,\r\n          strokeLinecap: 'round',\r\n        }}\r\n        cx={circleXY}\r\n        cy={circleXY}\r\n        r={radius}\r\n      />\r\n    </svg>\r\n  )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipColor } from './types'\r\n\r\nexport interface TooltipBoxProps extends Omit<React.HTMLProps<HTMLDivElement>, 'ref'> {\r\n  /**\r\n   * Color of the tooltip. If se to `none`, the tooltip will have default color\r\n   * based on light/dark theme\r\n   *\r\n   * @default 'none'\r\n   */\r\n  color?: keyof typeof TooltipColor\r\n}\r\n\r\nexport const TooltipBox = React.forwardRef(function TooltipBox(\r\n  { color = 'none', ...props }: TooltipBoxProps,\r\n  ref: React.ForwardedRef<HTMLDivElement>\r\n) {\r\n  const tooltipColor = TooltipColor[color]\r\n\r\n  return (\r\n    <div\r\n      {...props}\r\n      ref={ref}\r\n      className={classnames(props.className, 'rounded px-2 py-1 text-2xs', {\r\n        'bg-gray-700 text-gray-50 dark:bg-gray-300 dark:text-gray-700': tooltipColor === TooltipColor.none,\r\n        'bg-red-400 text-gray-50': tooltipColor === TooltipColor.red,\r\n        'bg-amber-600 text-gray-50': tooltipColor === TooltipColor.orange,\r\n        'bg-blue-400 text-gray-50': tooltipColor === TooltipColor.blue,\r\n        'bg-emerald-500 text-gray-50': tooltipColor === TooltipColor.green,\r\n        'bg-gray-700 text-white': tooltipColor === TooltipColor.dark,\r\n      })}\r\n    >\r\n      {props.children}\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 { isIos } from '../../../app/shared/isMobile'\r\nimport { usePopoverPlacement } from '../../hooks/usePopoverPlacement'\r\nimport { TooltipStateReturn } from './hooks'\r\nimport { TooltipArrow } from './tooltip-arrow'\r\nimport { TooltipBox, TooltipBoxProps } from './tooltip-box'\r\n\r\nconst isIosBrowser = isIos()\r\n\r\nconst TOOLTIP_WRAPPER_PROPS = {\r\n  className: 'pointer-events-none',\r\n}\r\n\r\nexport interface TooltipProps\r\n  extends TooltipBoxProps,\r\n    Pick<Ariakit.TooltipProps, 'gutter' | 'hideOnHoverOutside' | 'onClose'> {\r\n  // State is intentionally not marked as optional so you get error when you don’t provide it\r\n  /**\r\n   * Returned state from `useTooltipState`. Set `undefined` if you use a `PopoverProvider` wrapper (eg. TooltipInput)\r\n   */\r\n  state: TooltipStateReturn | undefined\r\n\r\n  /**\r\n   * Determines whether or not the tooltip receives mouse events\r\n   *\r\n   * @default true\r\n   */\r\n  isPointerEventsEnabled?: boolean\r\n}\r\n\r\nexport function Tooltip({\r\n  state,\r\n  children,\r\n  gutter = 4,\r\n  hideOnHoverOutside = true,\r\n  isPointerEventsEnabled = true,\r\n  color = 'none',\r\n  onClose,\r\n  ...props\r\n}: React.PropsWithChildren<TooltipProps>) {\r\n  const context = Ariakit.useTooltipContext()\r\n  const stateObject = state ?? context\r\n  const { placement, zIndex, updatePosition } = usePopoverPlacement(stateObject)\r\n\r\n  return (\r\n    <Ariakit.Tooltip\r\n      store={state}\r\n      focusable={false}\r\n      gutter={gutter}\r\n      wrapperProps={isPointerEventsEnabled ? undefined : TOOLTIP_WRAPPER_PROPS}\r\n      hideOnHoverOutside={hideOnHoverOutside}\r\n      onClose={onClose}\r\n      // On iOS depending on composition TooltipTrigger doesn't work properly if Tooltip isn't always rendered\r\n      // and causes bug on interactive elements with tooltip like selects, buttons, etc. when on first click\r\n      // only tooltip appears but select, button or etc. doesn't receive event so it won't open, also on first click\r\n      // in iOS safari onClick event isn't fired no TooltipTrigger, just onPointerDown, and thus further breaking logic\r\n      // because our custom callback which are placed in onClick aren't invoked, after debugging we think that this\r\n      // is bug caused by combination of ariakit behaviour when <Tooltip> isn't always rendered and way of events\r\n      // firing by iOS Safari\r\n      unmountOnHide={!isIosBrowser}\r\n      className={classnames(\r\n        zIndex,\r\n        'cursor-default opacity-0 outline-none transition duration-[250ms] will-change-transform data-[enter]:translate-x-0 data-[enter]:translate-y-0 data-[enter]:opacity-100',\r\n        {\r\n          'motion-safe:translate-y-1': placement?.startsWith('top'),\r\n          'motion-safe:-translate-x-1': placement?.startsWith('right'),\r\n          'motion-safe:-translate-y-1': placement?.startsWith('bottom'),\r\n          'motion-safe:translate-x-1': placement?.startsWith('left'),\r\n        }\r\n      )}\r\n      // Update zIndex when popover position changes\r\n      updatePosition={updatePosition}\r\n    >\r\n      <TooltipBox {...props} color={color} data-placement={placement}>\r\n        <Ariakit.TooltipArrow store={state} size={11}>\r\n          <TooltipArrow placement={placement} color={color} />\r\n        </Ariakit.TooltipArrow>\r\n        {children}\r\n      </TooltipBox>\r\n    </Ariakit.Tooltip>\r\n  )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipStateReturn } from './hooks'\r\n\r\ninterface TooltipButtonProps extends Omit<Ariakit.TooltipAnchorProps, 'store'> {\r\n  // State is intentionally not marked as optional so you get error when you don’t provide it\r\n  /**\r\n   * Returned state from `useTooltipState`. Set `undefined` if you use a `TooltipProvider` wrapper (eg. TooltipInput)\r\n   */\r\n  state: TooltipStateReturn | undefined\r\n\r\n  /**\r\n   * Hides tooltip on trigger click\r\n   *\r\n   * @default false\r\n   */\r\n  isHideOnClick?: boolean\r\n\r\n  /**\r\n   * Whether or not the tooltip should be visible when user hovers over the trigger element\r\n   *\r\n   * @default true\r\n   */\r\n  showOnHover?: boolean\r\n\r\n  /**\r\n   * Whether or not the tooltip should hide when the element is blurred\r\n   */\r\n  hideOnBlur?: boolean\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const TooltipTrigger = React.forwardRef(\r\n  (\r\n    {\r\n      state,\r\n      isHideOnClick,\r\n      showOnHover = true,\r\n      hideOnBlur,\r\n      onClick,\r\n      onMouseEnter,\r\n      onMouseLeave,\r\n      ...props\r\n    }: TooltipButtonProps,\r\n    ref: React.ForwardedRef<HTMLDivElement>\r\n  ) => {\r\n    const context = Ariakit.useTooltipContext()\r\n    const stateObject = state ?? context\r\n\r\n    return (\r\n      <Ariakit.TooltipAnchor\r\n        ref={ref}\r\n        store={stateObject}\r\n        onClick={(ev) => {\r\n          if (isHideOnClick) stateObject?.hide()\r\n          onClick?.(ev)\r\n        }}\r\n        showOnHover={showOnHover}\r\n        onMouseEnter={(ev) => {\r\n          if (showOnHover === false) ev.preventDefault()\r\n          onMouseEnter?.(ev)\r\n        }}\r\n        onMouseLeave={(ev) => {\r\n          if (showOnHover === false) ev.preventDefault()\r\n          onMouseLeave?.(ev)\r\n        }}\r\n        onBlur={() => {\r\n          if (hideOnBlur) stateObject?.hide()\r\n        }}\r\n        {...props}\r\n      >\r\n        {props.children}\r\n      </Ariakit.TooltipAnchor>\r\n    )\r\n  }\r\n)\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\ninterface TooltipProviderProps extends Omit<Ariakit.TooltipProviderProps, 'store'> {\r\n  state?: Ariakit.TooltipProviderProps['store']\r\n}\r\n\r\nexport function TooltipProvider({ state, ...props }: TooltipProviderProps) {\r\n  return <Ariakit.TooltipProvider store={state} showTimeout={0} hideTimeout={0} {...props} />\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\n/**\r\n * Hook which provides state to tooltips\r\n */\r\nexport function useTooltipState({ showTimeout = 0, hideTimeout = 0, ...settings }: Ariakit.TooltipStoreProps = {}) {\r\n  return Ariakit.useTooltipStore({\r\n    ...settings,\r\n    showTimeout,\r\n    hideTimeout,\r\n  })\r\n}\r\n\r\nexport type TooltipStateReturn = ReturnType<typeof useTooltipState>\r\n","import classnames from 'classnames'\r\n\r\nimport { PopoverPlacement } from '../popover'\r\nimport { TooltipColor } from './types'\r\n\r\ntype PositionMain = 'auto' | 'top' | 'bottom' | 'left' | 'right'\r\n\r\nconst transformMap: Record<PositionMain, string> = {\r\n  auto: '',\r\n  top: 'rotateZ(180deg)',\r\n  right: 'rotateZ(-90deg)',\r\n  bottom: 'rotateZ(360deg)',\r\n  left: 'rotateZ(90deg)',\r\n}\r\n\r\ninterface TooltipArrowProps {\r\n  color?: keyof typeof TooltipColor | 'custom'\r\n  placement?: PopoverPlacement\r\n  className?: string\r\n}\r\n\r\n/**\r\n * Custom arrow for the dropdown\r\n */\r\nexport function TooltipArrow({ placement, color = 'none', className }: TooltipArrowProps) {\r\n  const positionMain = (placement?.split('-')[0] as PositionMain) ?? 'auto'\r\n  const arrowColor = color !== 'custom' ? TooltipColor[color] : null\r\n\r\n  return (\r\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\" style={{ transform: transformMap[positionMain] }}>\r\n      <path\r\n        className={classnames(className, {\r\n          'fill-gray-700': arrowColor === TooltipColor.dark,\r\n          'fill-gray-700 dark:fill-gray-300': arrowColor === TooltipColor.none,\r\n          'fill-red-400': arrowColor === TooltipColor.red,\r\n          'fill-amber-600': arrowColor === TooltipColor.orange,\r\n          'fill-blue-400': arrowColor === TooltipColor.blue,\r\n          'fill-emerald-500': arrowColor === TooltipColor.green,\r\n        })}\r\n        d=\"M7.14 5.86a2 2 0 0 0-3.28 0L.3 11h10.4L7.14 5.86Z\"\r\n      />\r\n    </svg>\r\n  )\r\n}\r\n","export enum TooltipColor {\r\n  none,\r\n  green,\r\n  red,\r\n  orange,\r\n  blue,\r\n  dark,\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ComponentProps, ElementType, HTMLProps, PropsWithChildren, ReactNode } from 'react'\r\n\r\nimport { PropsWithAs } from './types'\r\n\r\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6\r\n\r\ninterface HeadingProps {\r\n  /**\r\n   * Heading level\r\n   */\r\n  level: HeadingLevel\r\n}\r\n\r\nfunction getHeadingElement(level: HeadingLevel) {\r\n  switch (level) {\r\n    case 1:\r\n      return 'h1'\r\n    case 2:\r\n      return 'h2'\r\n    case 3:\r\n      return 'h3'\r\n    case 4:\r\n      return 'h4'\r\n    case 5:\r\n      return 'h5'\r\n    default:\r\n      return 'h6'\r\n  }\r\n}\r\n\r\nexport function Heading<TagType extends React.ElementType = 'h1'>({\r\n  as: asComponent,\r\n  level,\r\n  children,\r\n  ...props\r\n}: PropsWithAs<TagType> & PropsWithChildren<HeadingProps>) {\r\n  return React.createElement(\r\n    asComponent ?? getHeadingElement(level),\r\n    {\r\n      ...props,\r\n      className: classnames(props.className, 'font-bold', {\r\n        'text-3xl': level === 1,\r\n        'text-2xl': level === 2,\r\n        'text-xl': level === 3,\r\n        // We don't want to set any specific fontsize because it's used e.g. in DialogHeader\r\n        // where it uses font-size: inherit; and is different on old/redesign versions\r\n        'leading-[1.375]': level === 4,\r\n        'text-sm': level === 5,\r\n        'text-2xs': level === 6,\r\n      }),\r\n    },\r\n    children\r\n  )\r\n}\r\n\r\ninterface ParagraphProps<AsTag extends ElementType> extends Omit<HTMLProps<ComponentProps<AsTag>>, 'size' | 'as'> {\r\n  /**\r\n   * Determines which element the text should render to\r\n   *\r\n   * @default p\r\n   */\r\n  as?: ElementType\r\n\r\n  /**\r\n   * Font size for the paragraph\r\n   * - tiny - 10px\r\n   * - small - 12px\r\n   * - default - 14px\r\n   * - medium - 16px\r\n   * - large - 18px\r\n   *\r\n   * @default default\r\n   */\r\n  size?: 'tiny' | 'small' | 'default' | 'medium' | 'large'\r\n\r\n  /**\r\n   * Paragraph font weight\r\n   */\r\n  medium?: boolean\r\n}\r\n\r\nexport function Paragraph<AsTag extends ElementType>({\r\n  as = 'p',\r\n  size = 'default',\r\n  medium,\r\n  children,\r\n  ...props\r\n}: PropsWithChildren<ParagraphProps<AsTag>>) {\r\n  return React.createElement(\r\n    as,\r\n    {\r\n      ...props,\r\n      className: classnames(props.className, {\r\n        'font-medium': medium,\r\n        'text-lg': size === 'large',\r\n        'text-sm': size === 'default',\r\n        'text-2xs': size === 'small',\r\n        'text-3xs': size === 'tiny',\r\n      }),\r\n    },\r\n    children\r\n  )\r\n}\r\n\r\ninterface LabelProps extends Omit<HTMLProps<HTMLLabelElement>, 'title'> {\r\n  title?: ReactNode\r\n  titleClassName?: string\r\n  isHorizontal?: boolean\r\n}\r\n\r\nexport function Label({ title, titleClassName, isHorizontal, children, ...props }: PropsWithChildren<LabelProps>) {\r\n  return (\r\n    <label {...props} className={classnames(props.className, 'flex grow', { 'flex-col': !isHorizontal })}>\r\n      {title && <span className={classnames('text-2xs', { 'mb-1': !isHorizontal }, titleClassName)}>{title}</span>}\r\n      {children}\r\n    </label>\r\n  )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { loadResizeObserverPolyfill } from '../util'\r\n\r\nexport function useResizeObserver() {\r\n  const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n  const [ResizeObserver, setResizeObserver] = React.useState<typeof window.ResizeObserver | undefined>(\r\n    () => window.ResizeObserver\r\n  )\r\n\r\n  React.useEffect(() => {\r\n    if (typeof ResizeObserver === 'undefined') {\r\n      void loadResizeObserverPolyfill().then((polyfill) => {\r\n        if (!controller.current?.signal.aborted) {\r\n          setResizeObserver(() => polyfill)\r\n        }\r\n      })\r\n    }\r\n  }, [ResizeObserver])\r\n\r\n  // Cleanup effect to abort the controller\r\n  React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n  return ResizeObserver\r\n}\r\n","import React from 'react'\r\n\r\nimport { PopoverPlacement } from '../components'\r\nimport { useZIndex } from '../components/dialog/hooks'\r\n\r\nfunction getPlacementZIndex(placement: PopoverPlacement) {\r\n  return placement!.startsWith('top') ? 'z-dialog' : 'z-50'\r\n}\r\n\r\nfunction changeZIndex(element: HTMLElement | null, placement: PopoverPlacement, computedZIndex = '') {\r\n  if (!element) return\r\n  element.style.removeProperty('z-index')\r\n  element.classList.remove('z-50', 'z-dialog', computedZIndex)\r\n  element.classList.add(getPlacementZIndex(placement))\r\n}\r\n\r\nexport function usePopoverPlacement(context: any) {\r\n  const popoverElement: HTMLDivElement | null = context.useState('popoverElement')\r\n  const placement: PopoverPlacement = context.useState('currentPlacement')\r\n  const contextZIndex = useZIndex(null)\r\n  const computedZIndex = getPlacementZIndex(placement)\r\n\r\n  const updatePosition = React.useCallback(\r\n    (props: { updatePosition: () => Promise<void> }) => {\r\n      if (!popoverElement) return\r\n\r\n      const overlayElement = popoverElement?.previousElementSibling as HTMLElement | null\r\n\r\n      if (!contextZIndex) {\r\n        changeZIndex(popoverElement, placement, computedZIndex)\r\n        if (overlayElement && overlayElement.dataset.backdrop) changeZIndex(overlayElement, placement, computedZIndex)\r\n      }\r\n\r\n      void props.updatePosition()\r\n    },\r\n    [popoverElement, contextZIndex, computedZIndex, placement]\r\n  )\r\n\r\n  return {\r\n    zIndex: contextZIndex ?? computedZIndex,\r\n    placement,\r\n    updatePosition,\r\n  }\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { PortfolioDefinition } from '../modules/portfolio/types'\r\nimport { PortfolioApiFields } from '../types'\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/charts/blob/master/app/utils/fetch_api.ts\r\n// START\r\nexport enum ContentType {\r\n  ApplicationJson = 'application/json',\r\n  ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n  FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n  Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n  switch (contentType) {\r\n    case ContentType.ApplicationJson:\r\n    case ContentType.ApplicationJsonUTF:\r\n    case ContentType.FormUrlEncoded:\r\n      return JSON.parse(response)\r\n    default:\r\n      return response\r\n  }\r\n}\r\n// END\r\n\r\nexport class ThrowableError extends Error {\r\n  status: number\r\n  isServerError = false\r\n  body: unknown\r\n  extra: Record<string, any> = {}\r\n\r\n  constructor(status: number, message = 'ThrowableError', body = '', extra: Record<string, any> = {}) {\r\n    super(`${status} ${message}`)\r\n    this.status = status\r\n    this.isServerError = status >= 500\r\n    this.body = body\r\n    this.extra = extra\r\n  }\r\n}\r\n\r\nexport interface CancelablePromise<ResolveType> extends Promise<ResolveType> {\r\n  aborted?: boolean\r\n  cancel?: () => void\r\n}\r\n\r\n/**\r\n * General api fetch utility which returns a cancelable promise\r\n */\r\nexport function apiRequest<ResolveType>(\r\n  url: string,\r\n  { query, headers = {}, ...options }: RequestInit & { query?: Record<string, any> } = {},\r\n  throwOnAllErrors = false\r\n): CancelablePromise<ResolveType | undefined> {\r\n  const controller = 'AbortController' in window ? new AbortController() : undefined\r\n  const requestUrl = query ? `${url}?${new URLSearchParams(query)}` : url\r\n  const contentType: ContentType = (headers as any)['Content-Type'] ?? ContentType.ApplicationJson\r\n\r\n  const requestOptions = {\r\n    ...options,\r\n    headers: {\r\n      'Content-Type': contentType,\r\n      ...headers,\r\n    },\r\n  }\r\n  const request = fetch(requestUrl, { ...requestOptions, signal: controller?.signal })\r\n\r\n  const cancelableRequest: CancelablePromise<ResolveType> = request\r\n    .then(async (response) => {\r\n      const textResponse = await response.text()\r\n      const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n\r\n      try {\r\n        const parsedResponse = parseResponseForContentType(textResponse, responseContentType)\r\n        if (!response.ok || response.status >= 500) {\r\n          throw new ThrowableError(response.status, response.statusText, parsedResponse, {\r\n            rayId: response.headers.get('cf-ray'),\r\n          })\r\n        }\r\n\r\n        return parsedResponse\r\n      } catch (error: any) {\r\n        if (error instanceof ThrowableError) {\r\n          throw error\r\n        }\r\n        throw new ThrowableError(response.status, error.message, textResponse, {\r\n          rayId: response.headers.get('cf-ray'),\r\n        })\r\n      }\r\n    })\r\n    .catch((error: ThrowableError) => {\r\n      if (error.status >= 500) {\r\n        Sentry.withScope((scope) => {\r\n          scope.setContext('Cloudflare', error.extra)\r\n\r\n          if (error.status === 500) {\r\n            Sentry.captureException(error)\r\n          } else {\r\n            Sentry.captureMessage(`${error.status} ${error.message}`)\r\n          }\r\n        })\r\n      }\r\n      if (throwOnAllErrors) {\r\n        throw error\r\n      }\r\n    })\r\n\r\n  if (controller) {\r\n    cancelableRequest.cancel = () => {\r\n      controller.abort()\r\n      cancelableRequest.aborted = true\r\n    }\r\n  }\r\n\r\n  return cancelableRequest\r\n}\r\n\r\nexport interface SearchApiResult {\r\n  ticker: string\r\n  company: string\r\n  exchange: string\r\n}\r\n\r\nexport function searchApiRequest(input = '') {\r\n  return apiRequest<SearchApiResult[]>('/api/suggestions.ashx', { query: { input } }, true)\r\n}\r\n\r\nexport function portfoliosRequest() {\r\n  return apiRequest<{ portfolios: PortfolioDefinition[] }>('/api/portfolio_data.ashx', {\r\n    query: {\r\n      fields: [PortfolioApiFields.UserPortfolios],\r\n    },\r\n  })\r\n}\r\n\r\nexport function lastCloseRequest(ticker: string) {\r\n  return apiRequest<string>('/request_quote.ashx', {\r\n    query: {\r\n      t: ticker,\r\n    },\r\n  })\r\n}\r\n\r\ninterface PortfolioLimitResult {\r\n  transactions: number\r\n  limitTransactions: number\r\n}\r\n\r\nexport function portfolioLimitRequest(portfolioId: number) {\r\n  return apiRequest<PortfolioLimitResult>('/api/portfolio_data.ashx', {\r\n    query: {\r\n      pid: portfolioId,\r\n      fields: [PortfolioApiFields.TransactionLimit, PortfolioApiFields.NumberOfTransactions],\r\n    },\r\n  })\r\n}\r\n\r\nexport function setCookieRequest(name: string, value?: unknown) {\r\n  return apiRequest(\r\n    '/api/set_cookie.ashx',\r\n    {\r\n      keepalive: true,\r\n      query: {\r\n        cookie: name,\r\n        ...(value !== undefined && {\r\n          value: value,\r\n        }),\r\n      },\r\n    },\r\n    true\r\n  )\r\n}\r\n","import * as pathToRegexp from 'path-to-regexp'\r\n\r\nimport { getCurrency } from '../../app/crypto/currencyUtils'\r\nimport { cleanTicker } from '../util'\r\n\r\n/**\r\n * Compile route path by applying parameters to it\r\n *\r\n * @example\r\n * // Outputs /route/1?query=foo\r\n * compilePath('/route/:id?query=:query', { id: 1, query: 'foo' })\r\n */\r\nfunction compilePath(\r\n  path: string,\r\n  params?: pathToRegexp.ParamData,\r\n  options?: pathToRegexp.ParseOptions & pathToRegexp.CompileOptions\r\n) {\r\n  return pathToRegexp.compile(path, options)(params)\r\n}\r\n\r\nexport const path = {\r\n  home: '/',\r\n  news: '/news.ashx',\r\n  screener: '/screener.ashx',\r\n  charts: '/charts',\r\n  groups: '/groups.ashx',\r\n  portfolio: '/portfolio.ashx',\r\n  insider: '/insidertrading.ashx',\r\n  elite: '/elite.ashx',\r\n  search: '/search.ashx\\\\?p=:ticker',\r\n  quote: '/quote.ashx\\\\?t=:ticker',\r\n  contact: '/contact.ashx',\r\n\r\n  alerts: '/alerts.ashx',\r\n  help: '/help/screener.ashx',\r\n  account: '/myaccount.ashx',\r\n  login: '/login.ashx',\r\n  logout: '/logout.ashx',\r\n\r\n  // Maps\r\n  maps: '/map.ashx',\r\n  bubbles: '/bubbles.ashx',\r\n\r\n  // Futures\r\n  futures: '/futures.ashx',\r\n  futuresPerf: '/futures_performance.ashx',\r\n  futuresCharts: '/futures_charts.ashx',\r\n  futuresChartDetail: '/futures_charts.ashx\\\\?t=:ticker',\r\n\r\n  // Forex\r\n  forex: '/forex.ashx',\r\n  forexPerf: '/forex_performance.ashx',\r\n  forexCharts: '/forex_charts.ashx',\r\n  forexChartDetail: '/forex_charts.ashx\\\\?t=:ticker',\r\n\r\n  // Crypto\r\n  crypto: '/crypto.ashx',\r\n  cryptoPerf: '/crypto_performance.ashx',\r\n  cryptoCharts: '/crypto_charts.ashx',\r\n  cryptoChartDetail: '/crypto_charts.ashx\\\\?t=:ticker&c=:currency',\r\n\r\n  // Backtsest\r\n  backtests: '/backtests.ashx',\r\n  backtestCreate: '/backtest_create.ashx',\r\n  backtestDetail: '/backtest_detail.ashx\\\\?id=:backtestId',\r\n  backtestPresets: 'backtests.ashx\\\\?presets=1',\r\n}\r\n\r\nexport const link = {\r\n  toHome: () => path.home,\r\n  toNews: () => path.news,\r\n  toScreener: () => path.screener,\r\n  toCharts: () => path.charts,\r\n  toGroups: () => path.groups,\r\n  toPortfolio: () => path.portfolio,\r\n  toInsider: () => path.insider,\r\n  toElite: () => path.elite,\r\n  toSearch: (ticker: string) => compilePath(path.search, { ticker }),\r\n  toQuote: (ticker: string) => compilePath(path.quote, { ticker }),\r\n  toContact: () => path.contact,\r\n\r\n  toAlerts: () => path.alerts,\r\n  toHelp: () => path.help,\r\n  toAccount: () => path.account,\r\n  toLogin: () => path.login,\r\n  toLogout: () => path.logout,\r\n\r\n  toMaps: () => path.maps,\r\n  toBubbles: () => path.bubbles,\r\n\r\n  toFutures: () => path.futures,\r\n  toFuturesPerf: () => path.futuresPerf,\r\n  toFuturesCharts: () => path.futuresCharts,\r\n  toFuturesChartDetail: (ticker: string) => compilePath(path.futuresChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n  toForex: () => path.forex,\r\n  toForexPerf: () => path.forexPerf,\r\n  toForexCharts: () => path.forexCharts,\r\n  toForexChartDetail: (ticker: string) => compilePath(path.forexChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n  toCrypto: () => path.crypto,\r\n  toCryptoPerf: () => path.cryptoPerf,\r\n  toCryptoCharts: () => path.cryptoCharts,\r\n  toCryptoChartDetail: (ticker: string) =>\r\n    compilePath(path.cryptoChartDetail, { ticker: cleanTicker(ticker), currency: getCurrency(cleanTicker(ticker)) }),\r\n\r\n  toBacktests: () => path.backtests,\r\n  toBacktestCreate: () => path.backtestCreate,\r\n  toBacktestDetail: (backtestId: string | number) =>\r\n    compilePath(path.backtestDetail, { backtestId: String(backtestId) }),\r\n  toBacktestPresets: () => path.backtestPresets,\r\n}\r\n","// Do not import anything in this file\r\n\r\nexport enum Instrument {\r\n  Stock = 'stock',\r\n  Forex = 'forex',\r\n  Crypto = 'crypto',\r\n  Futures = 'futures',\r\n  MarketSentiment = 'market_sentiment',\r\n  Group = 'group',\r\n}\r\n\r\nexport type RecordType = Record<string | number | symbol, unknown>\r\n\r\nexport type PartialBy<Obj, Keys extends keyof Obj> = Omit<Obj, Keys> & Partial<Pick<Obj, Keys>>\r\n\r\nexport type NullableNumbers<Obj> = { [K in keyof Obj]: Obj[K] extends number ? number | null : Obj[K] }\r\n\r\nexport enum DateRangeType {\r\n  d1 = 'd1',\r\n  d5 = 'd5',\r\n  m1 = 'm1',\r\n  m3 = 'm3',\r\n  m6 = 'm6',\r\n  ytd = 'ytd',\r\n  y1 = 'y1',\r\n  y2 = 'y2',\r\n  y5 = 'y5',\r\n  max = 'max',\r\n}\r\n\r\nexport type SortableValue = string | null | number | Date\r\nexport enum SortDirection {\r\n  Ascending = 1,\r\n  Descending = -1,\r\n}\r\n\r\nexport enum FeatureFlag {\r\n  RedesignedPages = 'redesign',\r\n  PortfolioRedesign = 'redesignpfo',\r\n  OptionsGreeks = 'greeks',\r\n  TrafficPage = 'trafficPage',\r\n  ScreenerAddFilter = 'screeneraddfilter',\r\n}\r\n\r\nexport interface ApiPaginatedResponse<T> {\r\n  items: T\r\n  page: number\r\n  pageSize: number\r\n  totalItemsCount: number\r\n  totalPages: number\r\n}\r\n\r\nexport enum PortfolioApiFields {\r\n  News = 'news',\r\n  // User Portfolios\r\n  UserPortfolios = 'portfolios',\r\n  PortfolioLimit = 'limit',\r\n  // Portfolio Detail\r\n  SelectedPortfolioId = 'selectedPortfolio',\r\n  SelectedPortfolio = 'portfolio',\r\n  TransactionLimit = 'limitTransactions',\r\n  TickerGroupsOnly = 'groupsOnly',\r\n  NumberOfTransactions = 'transactions',\r\n}\r\n","import isPlainObject from 'lodash.isplainobject'\r\n\r\nimport { CRYPTO_TICKERS } from '../app/crypto/currencyUtils'\r\nimport { getCookie } from '../app/shared/cookie'\r\nimport { FeatureFlag, Instrument, SortDirection, SortableValue } from './types'\r\nimport { RecordType } from './types'\r\n\r\nconst isObject = (value: any): value is RecordType => isPlainObject(value)\r\n\r\n/**\r\n * Parse text as JSON\r\n */\r\nexport function parseAsJSON<Shape>(value: unknown | Shape): Shape | undefined {\r\n  if (isObject(value)) {\r\n    return value as Shape\r\n  }\r\n\r\n  let parsedValue\r\n  try {\r\n    if (typeof value === 'string') {\r\n      parsedValue = JSON.parse(value)\r\n    }\r\n  } catch {\r\n    return\r\n  }\r\n  return parsedValue\r\n}\r\n\r\n/**\r\n * remove @ symbol from a ticker\r\n */\r\nexport function cleanTicker(ticker: string) {\r\n  return ticker.startsWith('@') ? ticker.substring(1) : ticker\r\n}\r\n\r\n/**\r\n * Get instrument for a ticker.\r\n *\r\n * - If ticker doesn’t start with `@` - stock\r\n * - Otherwise\r\n *   - one of `CRYPTO_TICKERS` - crypto\r\n *   - has length of 6 - forex\r\n *   - none of above - future\r\n *\r\n * NOTE: counterpart in charts 'charts/app/utils/chart.js'\r\n */\r\n\r\nexport function getInstrumentForTicker(ticker: string): Instrument {\r\n  if (!ticker?.startsWith('@')) return Instrument.Stock\r\n\r\n  const cleanedTicker = cleanTicker(ticker)\r\n\r\n  if (CRYPTO_TICKERS.includes(cleanedTicker.toUpperCase())) return Instrument.Crypto\r\n  if (cleanedTicker.length === 6) return Instrument.Forex\r\n\r\n  return Instrument.Futures\r\n}\r\n\r\n/**\r\n * Async load Resize observer polyfill when we need it\r\n */\r\nlet resizeObserverPolyfill: typeof window.ResizeObserver\r\n\r\nexport async function loadResizeObserverPolyfill() {\r\n  if (typeof window.ResizeObserver === 'undefined') {\r\n    const polyfill = await import('resize-observer-polyfill')\r\n    resizeObserverPolyfill = polyfill.default\r\n    window.ResizeObserver = resizeObserverPolyfill\r\n    return resizeObserverPolyfill as typeof window.ResizeObserver\r\n  }\r\n}\r\n\r\nexport async function getIsBrave() {\r\n  return (navigator.brave && (await navigator.brave.isBrave())) || false\r\n}\r\n\r\nexport function deserializeFeatureFlags(): Partial<Record<FeatureFlag, boolean>> | undefined {\r\n  try {\r\n    const cookie = decodeURIComponent(getCookie('featureFlags'))\r\n    const flags = cookie.split('_').map((value) => {\r\n      const [key, val] = value.split(':')\r\n      return [key, val === '1']\r\n    })\r\n\r\n    return Object.fromEntries(flags)\r\n  } catch {\r\n    return\r\n  }\r\n}\r\n\r\nexport function serializeFeatureFlags(flags: Partial<Record<FeatureFlag, boolean>>) {\r\n  return Object.entries(flags)\r\n    .map(([key, val]) => `${key}:${Number(val)}`)\r\n    .join('_')\r\n}\r\n\r\nexport enum ChildPosition {\r\n  topLeft,\r\n  topRight,\r\n  bottomLeft,\r\n  bottomRight,\r\n  center,\r\n  topCenter,\r\n  rightCenter,\r\n  bottomCenter,\r\n  leftCenter,\r\n}\r\n\r\nexport function getFlexAlignClasses(position: ChildPosition) {\r\n  return {\r\n    'justify-start': [ChildPosition.topLeft, ChildPosition.bottomLeft, ChildPosition.leftCenter].includes(position),\r\n    'justify-center': [ChildPosition.center, ChildPosition.topCenter, ChildPosition.bottomCenter].includes(position),\r\n    'justify-end': [ChildPosition.topRight, ChildPosition.bottomRight, ChildPosition.rightCenter].includes(position),\r\n    'items-start': [ChildPosition.topLeft, ChildPosition.topRight, ChildPosition.topCenter].includes(position),\r\n    'items-center': [ChildPosition.center, ChildPosition.rightCenter, ChildPosition.leftCenter].includes(position),\r\n    'items-end': [ChildPosition.bottomLeft, ChildPosition.bottomRight, ChildPosition.bottomCenter].includes(position),\r\n  }\r\n}\r\n\r\ninterface NumberFormatOptions {\r\n  fractions: number\r\n  multiply: number\r\n  showPlusSign: boolean\r\n  defaultValue: string\r\n  prefix: string\r\n  suffix: string\r\n  withSpace: boolean\r\n}\r\n\r\nconst intlCache: { [key: number]: Intl.NumberFormat } = {}\r\nconst dollarIntlCache: { [key: number]: Intl.NumberFormat } = {}\r\n\r\nfunction getIntl(fractions: number) {\r\n  if (!intlCache[fractions])\r\n    intlCache[fractions] = new Intl.NumberFormat('en-US', {\r\n      minimumFractionDigits: fractions,\r\n      maximumFractionDigits: fractions,\r\n    })\r\n  return intlCache[fractions]\r\n}\r\n\r\nfunction getDollarIntl(fractions: number) {\r\n  if (!dollarIntlCache[fractions])\r\n    dollarIntlCache[fractions] = new Intl.NumberFormat('en-US', {\r\n      minimumFractionDigits: fractions,\r\n      maximumFractionDigits: fractions,\r\n      style: 'currency',\r\n      currency: 'USD',\r\n    })\r\n  return dollarIntlCache[fractions]\r\n}\r\n\r\nexport function shortFormatNumber(\r\n  value: number | null | undefined,\r\n  {\r\n    fractions = 2,\r\n    showPlusSign = false,\r\n    defaultValue = '-',\r\n    multiply = 1,\r\n    suffix: extraSuffix = '',\r\n  }: Partial<NumberFormatOptions> = {}\r\n) {\r\n  let num = value\r\n  if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n  num *= multiply\r\n\r\n  let suffix = ''\r\n  const absValue = Math.abs(num)\r\n  if (absValue >= 1e9) {\r\n    num /= 1e9\r\n    suffix = 'B'\r\n  } else if (absValue >= 1e6) {\r\n    num /= 1e6\r\n    suffix = 'M'\r\n  } else if (absValue >= 1000) {\r\n    num /= 1000\r\n    suffix = 'K'\r\n  }\r\n\r\n  const formatted = getIntl(fractions).format(num)\r\n\r\n  return (showPlusSign && num > 0 ? '+' : '') + formatted + suffix + extraSuffix\r\n}\r\n\r\nexport function shortFormatDollar(\r\n  value: number | null | undefined,\r\n  {\r\n    fractions = 2,\r\n    showPlusSign = false,\r\n    defaultValue = '-',\r\n    multiply = 1,\r\n    suffix: extraSuffix = '',\r\n  }: Partial<NumberFormatOptions> = {}\r\n) {\r\n  let num = value\r\n  if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n  num *= multiply\r\n\r\n  let suffix = ''\r\n  const absValue = Math.abs(num)\r\n  if (absValue >= 1e9) {\r\n    num /= 1e9\r\n    suffix = 'B'\r\n  } else if (absValue >= 1e6) {\r\n    num /= 1e6\r\n    suffix = 'M'\r\n  } else if (absValue >= 1000) {\r\n    num /= 1000\r\n    suffix = 'K'\r\n  }\r\n\r\n  const formatted = getDollarIntl(fractions).format(num)\r\n\r\n  return (showPlusSign && num > 0 ? '+' : '') + formatted + suffix + extraSuffix\r\n}\r\n\r\nexport function getDecimalPlacesForValue(value: number, instrument: Instrument = Instrument.Stock) {\r\n  if (value >= 100000) {\r\n    return 0\r\n  } else if (value >= 10000) {\r\n    return 1\r\n  } else if (instrument === Instrument.Stock && value < 1) {\r\n    return 4\r\n  } else if (value === undefined) {\r\n    // if lastClose is not defined we'll always display 2 decimpal places, e.g. backtests, screener stats\r\n    return 2\r\n  }\r\n\r\n  return undefined\r\n}\r\n\r\nexport const FORMAT_PERCENT = { suffix: '%' }\r\nexport const FORMAT_PERCENT_CHANGE = { ...FORMAT_PERCENT, showPlusSign: true }\r\n\r\nexport function formatNumber(\r\n  value: number | null | undefined,\r\n  { fractions = 2, showPlusSign = false, defaultValue = '-', suffix = '' }: Partial<NumberFormatOptions> = {}\r\n) {\r\n  if (value === undefined || value === null) return defaultValue\r\n\r\n  const fixedValue = value.toFixed(fractions)\r\n  const signPrefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n  if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n    return <span title={value.toString() + suffix}>{signPrefix + fixedValue + suffix}</span>\r\n  }\r\n\r\n  const formatted = getIntl(fractions).format(value)\r\n\r\n  return signPrefix + formatted + suffix\r\n}\r\n\r\nexport function formatDollar(\r\n  value: number | null | undefined,\r\n  { fractions = 2, showPlusSign = false, defaultValue = '-', suffix = '' }: Partial<NumberFormatOptions> = {}\r\n) {\r\n  if (value === undefined || value === null) return defaultValue\r\n\r\n  const fixedValue = value.toFixed(fractions)\r\n  const signPrefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n  const formatted = getDollarIntl(fractions).format(value)\r\n\r\n  if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n    return <span title={value.toString() + suffix}>{signPrefix + formatted + suffix}</span>\r\n  }\r\n\r\n  return signPrefix + formatted + suffix\r\n}\r\n\r\nexport interface SortByColumnOptions {\r\n  /**\r\n   * Change order of `null` values.\r\n   * - `false` Force sort null as first (asc) and last (desc)\r\n   * - `true` Always sort null as last regardless of order\r\n   * @default false\r\n   */\r\n  sortNullAsLast?: boolean\r\n\r\n  /**\r\n   * When true, null values will not be treated as special values\r\n   * @default false\r\n   */\r\n  ignoreNullForComparison?: boolean\r\n}\r\n\r\nexport function sortByColumn(\r\n  options: SortByColumnOptions & {\r\n    a: SortableValue\r\n    b: SortableValue\r\n    direction: SortDirection\r\n  }\r\n) {\r\n  if (options.a === options.b) return 0\r\n\r\n  // Compare as strings\r\n  if (typeof options.a === 'string' && typeof options.b === 'string')\r\n    return options.a.localeCompare(options.b) * options.direction\r\n\r\n  // Always sort null last if enabled\r\n  if (options.sortNullAsLast && options.a === null) return Infinity\r\n  if (options.sortNullAsLast && options.b === null) return -Infinity\r\n\r\n  // Sort null first/last depending on direction\r\n  if (!options.ignoreNullForComparison && options.a === null) return -options.direction\r\n  if (!options.ignoreNullForComparison && options.b === null) return options.direction\r\n\r\n  // Compare as numbers\r\n  return (Number(options.a) - Number(options.b)) * options.direction\r\n}\r\n\r\nexport function moveItemInArray<ItemType>(arr: ItemType[], sourceIndex: number, destinationIndex: number) {\r\n  // make sure sourceIndex and destinationIndex are inside of arr\r\n  const from = Math.max(0, Math.min(sourceIndex, arr.length - 1))\r\n  const to = Math.min(arr.length - 1, Math.max(destinationIndex, 0))\r\n\r\n  const items = [...arr]\r\n  const [removed] = items.splice(from, 1)\r\n  items.splice(to, 0, removed)\r\n\r\n  return items\r\n}\r\n\r\nexport function randomUUID() {\r\n  return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n    const c = Number(substring)\r\n    return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n  })\r\n}\r\n\r\nexport function getUuid() {\r\n  return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n/**\r\n * Used as a callback to autoFocusOnShow/autoFocusOnHide to make sure the page\r\n * doesn’t jump when focusing the element\r\n */\r\nexport function focusWithoutScroll(element: HTMLElement | null) {\r\n  requestAnimationFrame(() => {\r\n    element?.focus({ preventScroll: element.ariaHasPopup !== null })\r\n  })\r\n\r\n  return !element\r\n}\r\n\r\nexport function blurWithoutScroll(element: HTMLElement | null) {\r\n  element?.focus({ preventScroll: true })\r\n\r\n  return !element\r\n}\r\n\r\n/**\r\n * Can be used as a callback for events if you just need to prevent the default action\r\n */\r\nexport function preventDefault(ev: React.MouseEvent) {\r\n  ev.preventDefault()\r\n}\r\n\r\nexport function getNavigationLinkUrl(\r\n  url: URL,\r\n  preservedKeys?: string[],\r\n  removeQueryKeys?: string[],\r\n  additionalQueryValues: Record<string, string | number> = {}\r\n) {\r\n  const newUrl = new URL(url)\r\n\r\n  if (preservedKeys?.length) {\r\n    for (const key of url.searchParams.keys()) {\r\n      if (!preservedKeys.includes(key)) newUrl.searchParams.delete(key)\r\n    }\r\n  }\r\n\r\n  removeQueryKeys?.forEach((key) => {\r\n    newUrl.searchParams.delete(key)\r\n  })\r\n\r\n  Object.entries(additionalQueryValues).forEach(([key, value]) => {\r\n    newUrl.searchParams.set(key, value as string)\r\n  })\r\n\r\n  return newUrl\r\n}\r\n\r\nexport function getElitePageLink(campaign?: string) {\r\n  const url = '/elite.ashx'\r\n  const query = new URLSearchParams('utm_source=finviz&utm_medium=banner')\r\n\r\n  if (campaign) {\r\n    query.set('utm_campaign', campaign)\r\n\r\n    return `${url}?${query.toString()}`\r\n  }\r\n\r\n  return url\r\n}\r\n\r\nexport function getNumberValue(value?: number) {\r\n  if (value === undefined || isNaN(value)) return NaN\r\n  return value\r\n}\r\n\r\nexport function dateStrToDate(dateStr: string) {\r\n  return new Date(`${dateStr}T00:00:00`)\r\n}\r\n\r\nexport function dateStrToTimestamp(dateStr: string) {\r\n  return dateStrToDate(dateStr).getTime()\r\n}\r\n\r\nexport function getEarningsDateSuffix(date: Date | null) {\r\n  if (!date) {\r\n    return ''\r\n  }\r\n  const hours = date.getHours()\r\n  if (hours <= 9) {\r\n    return 'BMO'\r\n  }\r\n  if (hours >= 16) {\r\n    return 'AMC'\r\n  }\r\n  return ''\r\n}\r\n","function getSanitizedSingleTicker(rawTicker: string, specialTickers: string[] = []) {\r\n  return rawTicker\r\n    .replace(/\\.+/gi, '-')\r\n    .split('-')\r\n    .map((x) => {\r\n      if (specialTickers.includes(x.toUpperCase())) return x\r\n      return x.replace(/([^a-z0-9@-])+/gi, '')\r\n    })\r\n    .filter((x) => !!x)\r\n    .join('-')\r\n    .toUpperCase()\r\n}\r\n\r\nexport function getSanitizedTicker(rawTicker: string, isMulti = false, specialTickers: string[] = []) {\r\n  if (isMulti) {\r\n    return rawTicker\r\n      .replace(/ /g, ',')\r\n      .split(',')\r\n      .map((x) => getSanitizedSingleTicker(x, specialTickers))\r\n      .filter((x) => !!x)\r\n      .join(',')\r\n  }\r\n\r\n  return getSanitizedSingleTicker(rawTicker, specialTickers)\r\n}\r\n","'use client';\nimport { createContext, Component, createElement, isValidElement, useContext, useState, useMemo, forwardRef } from 'react';\n\nconst ErrorBoundaryContext = createContext(null);\n\nconst initialState = {\n  didCatch: false,\n  error: null\n};\nclass ErrorBoundary extends Component {\n  constructor(props) {\n    super(props);\n    this.resetErrorBoundary = this.resetErrorBoundary.bind(this);\n    this.state = initialState;\n  }\n  static getDerivedStateFromError(error) {\n    return {\n      didCatch: true,\n      error\n    };\n  }\n  resetErrorBoundary() {\n    const {\n      error\n    } = this.state;\n    if (error !== null) {\n      var _this$props$onReset, _this$props;\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      (_this$props$onReset = (_this$props = this.props).onReset) === null || _this$props$onReset === void 0 ? void 0 : _this$props$onReset.call(_this$props, {\n        args,\n        reason: \"imperative-api\"\n      });\n      this.setState(initialState);\n    }\n  }\n  componentDidCatch(error, info) {\n    var _this$props$onError, _this$props2;\n    (_this$props$onError = (_this$props2 = this.props).onError) === null || _this$props$onError === void 0 ? void 0 : _this$props$onError.call(_this$props2, error, info);\n  }\n  componentDidUpdate(prevProps, prevState) {\n    const {\n      didCatch\n    } = this.state;\n    const {\n      resetKeys\n    } = this.props;\n\n    // There's an edge case where if the thing that triggered the error happens to *also* be in the resetKeys array,\n    // we'd end up resetting the error boundary immediately.\n    // This would likely trigger a second error to be thrown.\n    // So we make sure that we don't check the resetKeys on the first call of cDU after the error is set.\n\n    if (didCatch && prevState.error !== null && hasArrayChanged(prevProps.resetKeys, resetKeys)) {\n      var _this$props$onReset2, _this$props3;\n      (_this$props$onReset2 = (_this$props3 = this.props).onReset) === null || _this$props$onReset2 === void 0 ? void 0 : _this$props$onReset2.call(_this$props3, {\n        next: resetKeys,\n        prev: prevProps.resetKeys,\n        reason: \"keys\"\n      });\n      this.setState(initialState);\n    }\n  }\n  render() {\n    const {\n      children,\n      fallbackRender,\n      FallbackComponent,\n      fallback\n    } = this.props;\n    const {\n      didCatch,\n      error\n    } = this.state;\n    let childToRender = children;\n    if (didCatch) {\n      const props = {\n        error,\n        resetErrorBoundary: this.resetErrorBoundary\n      };\n      if (typeof fallbackRender === \"function\") {\n        childToRender = fallbackRender(props);\n      } else if (FallbackComponent) {\n        childToRender = createElement(FallbackComponent, props);\n      } else if (fallback === null || isValidElement(fallback)) {\n        childToRender = fallback;\n      } else {\n        throw error;\n      }\n    }\n    return createElement(ErrorBoundaryContext.Provider, {\n      value: {\n        didCatch,\n        error,\n        resetErrorBoundary: this.resetErrorBoundary\n      }\n    }, childToRender);\n  }\n}\nfunction hasArrayChanged() {\n  let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  let b = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  return a.length !== b.length || a.some((item, index) => !Object.is(item, b[index]));\n}\n\nfunction assertErrorBoundaryContext(value) {\n  if (value == null || typeof value.didCatch !== \"boolean\" || typeof value.resetErrorBoundary !== \"function\") {\n    throw new Error(\"ErrorBoundaryContext not found\");\n  }\n}\n\nfunction useErrorBoundary() {\n  const context = useContext(ErrorBoundaryContext);\n  assertErrorBoundaryContext(context);\n  const [state, setState] = useState({\n    error: null,\n    hasError: false\n  });\n  const memoized = useMemo(() => ({\n    resetBoundary: () => {\n      context.resetErrorBoundary();\n      setState({\n        error: null,\n        hasError: false\n      });\n    },\n    showBoundary: error => setState({\n      error,\n      hasError: true\n    })\n  }), [context.resetErrorBoundary]);\n  if (state.hasError) {\n    throw state.error;\n  }\n  return memoized;\n}\n\nfunction withErrorBoundary(component, errorBoundaryProps) {\n  const Wrapped = forwardRef((props, ref) => createElement(ErrorBoundary, errorBoundaryProps, createElement(component, {\n    ...props,\n    ref\n  })));\n\n  // Format for display in DevTools\n  const name = component.displayName || component.name || \"Unknown\";\n  Wrapped.displayName = \"withErrorBoundary(\".concat(name, \")\");\n  return Wrapped;\n}\n\nexport { ErrorBoundary, ErrorBoundaryContext, useErrorBoundary, withErrorBoundary };\n"],"names":["DEFAULT_ACTIVE_CURRENCY","TILE_WIDTH","CURRENCIES_LAYOUT","USD","USDT","EUR","BTC","TICKERS_NOT_IN_DASHBOARD","CURRENCIES_LIST","Object","keys","CRYPTO_TICKERS","values","flat","getCurrency","ticker","endsWith","getActiveCurrency","queryString","activeCurrency","toUpperCase","includes","getActiveCurrencySparklineTickers","_TICKERS_NOT_IN_DASHB","getCurrencyLongName","currency","toLowerCase","ScamNotice","_jsxs","Notice","id","children","_jsx","className","href","lastRequest","getRedirectUrl","tickerRaw","_FinvizSettings$quote","getSanitizedTicker","url","instrument","getInstrumentForTicker","substring","encodeURIComponent","FinvizSettings","quoteSearchExt","Search","Component","constructor","arguments","_defineProperty","input","highlight","data","focused","selected","value","cb","errCb","abort","request","XMLHttpRequest","open","onreadystatechange","this","readyState","status","JSON","parse","responseText","send","setTimeout","fetch","setState","bind","state","length","render","focus","props","Input","onChange","_onChange","onFocus","_onFocus","onBlur","_onBlur","onArrowUp","_onArrowUp","onArrowDown","_onArrowDown","SuggestionsBox","super","createRef","e","preventDefault","target","window","location","key","placeholderSupported","undefined","document","createElement","placeholder","firstFocus","onSubmit","_onSubmit","type","ref","inputRef","autoComplete","autoCorrect","autoCapitalize","maxLength","onKeyDown","_onKeyDown","onKeyUp","_onKeyUp","onClick","componentDidMount","_focus","componentDidUpdate","_isMobile","current","navigator","userAgent","match","searchLink","style","display","cellPadding","cellSpacing","border","map","row","index","onMouseDown","_onClick","dangerouslySetInnerHTML","__html","_formatTicker","_formatCompany","company","exchange","colSpan","width","button","hightlight","replace","text","re","RegExp","_escapeRegExp","str","Settings","stopPropagation","addEventListener","_onDocumentClick","removeEventListener","_e$target$className$i","_e$target$className","indexOf","call","_hideDropDown","componentWillUnmount","classes","position","_showDropDown","name","hasEliteRedesign","hasUserPremium","FLibs","isIpad","minViewport","viewportString","fixed","fluid","getViewportWidth","_window$visualViewpor","Math","round","innerWidth","visualViewport","scale","setViewport","fixedViewport","_document$querySelect","querySelector","setAttribute","viewportWidth","newViewportWidth","hasEnabledRedesign","hasRedesignEnabled","root","renderSearch","retries","container","getElementById","ReactDOM","SearchComponent","withQueryClientContext","TickerSearch","defaultPlacement","theme","size","autoFocus","isMatchInputAndBoxWidth","OldSearch","didInitializeWithFocus","searchAutoFocus","ready","timeContainer","Time","element","renderAccountDropdown","languages","Array","language","targetLanguages","isTargetLanguage","some","targetLanguage","renderScamNotice","isMobile","_ref","cookieName","hidden","setHidden","useState","cookie","onClose","useRef","setCookieRequest","catch","background","color","fontFamily","fontSize","textAlign","margin","padding","lineHeight","title","marginRight","right","textDecoration","top","MarketBadgeType","getMarketBadgeText","_date","Open","label","Closed","Premarket","Aftermarket","MarketBadge","badge","None","classnames","UPDATE_INTERVAL","TimeBreakpointMode","BREAKPOINTS","minWidth","Infinity","marketBadgeText","timeFormat","getTimeState","fixedTime","time","getDate","isHoliday","isPremarket","isAftermarket","getMarketBadgeType","TooltipBadge","useTooltipState","placement","_Fragment","TooltipTrigger","Tooltip","Heading","level","StaticBadge","findMatchingBreakpoint","compareWidth","breakpoints","_matchingBreakpoints$","filter","breakpoint","pop","getCurrentWidth","mode","_element$clientWidth","clientWidth","breakpointMode","ResizeObserver","useResizeObserver","rootRef","React","currentBreakpoint","setBreakpoint","interval","setInterval","clearInterval","currentWidth","handleResize","throttle","foundBreakpoint","observer","entries","requestAnimationFrame","isArray","observe","disconnect","getFormattedDateString","seed","date","Date","dateAsNY","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","isDst","dayNumber","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","setUTCHours","getWeekDay","toLocaleDateString","weekday","uppercase","month","toString","padStart","getTime","toLocaleString","hour","minute","hour12","TimeFormat","long","getFullYear","short","dateOnly","timeOnly","formatDate","inputOrOutputFormat","outputFormat","dateFns","isPremium","dayOfWeek","min","getMinutes","hours","getHours","HOLIDAY_DATES","test","day","find","holiday","getHoliday","getQueryClient","queryOptions","_queryOptions$default","QueryClient","defaultOptions","queries","useErrorBoundary","refetchOnWindowFocus","QueryClientContext","client","QueryClientProvider","ErrorBoundary","FallbackComponent","DefaultErrorBoundary","config","_Component$displayNam","hocComponent","displayName","getParsedCookies","parseCookies","split","cookieString","reduce","acc","v","decodeURIComponent","trim","getCookie","setCookie","expires","toUTCString","hostname","matchesAndroid","matchesWebOS","matchesIPhone","matchesiPad","matchesIPod","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","maxTouchPoints","matchesFirefox","matchesSafariDesktopLike","isMobileDevice","isIphone","isSafariDesktop","isIos","isFirefoxDesktop","fn","sentryOptions","dsn","allowUrls","release","FinvizSentrySettings","environment","sendDefaultPii","integrations","dedupeIntegration","extraErrorDataIntegration","httpClientIntegration","failedRequestTargets","thirdPartyErrorFilterIntegration","filterKeys","behaviour","ignoreErrors","ignoreStack","Sentry","beforeSend","event","hint","_event$exception","_exception$stacktrace","_exception$stacktrace2","_exception$mechanism$","_exception$mechanism","_hint$mechanism","_originalError$messag","_event$contexts$respo","_event$contexts","originalError","originalException","exception","errorFrames","stacktrace","frames","mechanism","message","ignorePattern","_event$request","ignoreSource","ignoreMessage","isIgnoredScript","frame","_frame$filename","filename","statusCode","ThrowableError","contexts","response","status_code","fingerprint","String","_window$FinvizSetting","_window$FinvizSetting2","dpr","devicePixelRatio","redesign","dark","hasDarkTheme","innerHeight","captureException","captureMessage","withScope","getCurrentScope","TickerSearchItem","item","dataTestId","isTickerWide","ComboBoxItem","contentClass","classNames","Highlight","getRedirectForTicker","redirectLink","cleanTicker","Instrument","Stock","link","toQuote","Forex","toForexChartDetail","Futures","toFuturesChartDetail","Crypto","toCryptoChartDetail","toSearch","_props$defaultPlaceme","_props$placeholder","isShowAllVisible","isSearchItemLink","chartIndex","searchComboboxState","useSearchComboboxState","defaultValue","setSelectedValue","_props$onTickerSelect","onTickerSelected","setValue","activeValue","error","isLoading","refetch","useQuery","searchApiRequest","enabled","keepPreviousData","cacheTime","staleTime","inputProps","hasFocusStyle","inputClass","rightContent","popoverProps","inputTestId","footer","Button","as","isError","onErrorRetry","BoxRounding","BoxTheme","Box","rounding","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","ButtonPadding","ButtonAlign","ButtonSquareSize","ButtonRounding","ButtonTheme","getButtonTheme","active","light","lightTransparent","blue","violet","blueHover","red","headerItem","icon","menuItem","menuItemTransparent","menuItemDark","opacity","outline","chip","chipOutline","chipTransparent","linkText","tab","ButtonComponent","_ref2","asComponent","focusRing","appearance","align","leftContent","isSquare","buttonTheme","buttonPadding","buttonSize","buttonRounding","hasIcons","isValidIconName","Icon","left","center","xxsmall","xsmall","none","small","regular","medium","large","xlarge","ComboBox","_props$autoFocus","ariaLabel","minValueLength","getInputValue","isMounted","inputValue","Ariakit","store","ev","_inputProps$onKeyDown","portal","gutter","unmountOnHide","startsWith","DEFAULT_ELEMENT","ComboBoxItemButton","dataActiveItem","ComboBoxItemButtonWithRef","useComboBoxState","ZIndexContext","useZIndex","_React$useContext","useDialogState","settings","DialogDragContext","handleRef","boxPosition","x","y","resetBoxPosition","setBoxPosition","useDrag","dragging","handleElement","boxPositionRef","dragDiff","pageX","scrollX","pageY","scrollY","onMouseUp","onMouseMove","body","ErrorView","showContact","showRefresh","Paragraph","toContact","origin","pathname","search","useEffect","console","stringify","RouterErrorElement","useRouteError","processedText","useMemo","before","after","height","Error","iconList","fileName","Boolean","join","Number","isFinite","versionImages","chartLayouts","chartTools","chartTypes","screener","add","arrowBackward","arrowDownShort","arrowForward","arrowUpShort","briefcase","calendar","caretDown","caretLeft","caretRight","caretUp","caretVertical","chartBar","chartBubble","chartPie","chartTable","chartTreemap","checkboxTick","chevronDown","chevronLeft","chevronRight","chevronUp","close","darkMode","diamondOutlined","done","drag","draw","empty","exitFullscreen","flash","fullscreen","gesture","gift","hamburger","help","idea","ideaLoad","ideaSave","import","info","lightMode","lock","lockOpened","menuClose","minus","more","note","openInNew","palette","profile","publish","refresh","remove","restore","settingsWheel","share","signOut","star","starOutlined","switchHorizontal","switchVertical","tabKey","template","trashCan","trendingDown","trendingUp","triangle","triangleOutlineDown","triangleOutlineUp","warning","layout1h1v","layout1h2v","layout1h3v","layout1l2r","layout1t2b","layout2h1v","layout2h2v","layout3h1v","layout3h2v","drawingActionDelete","drawingSettingAutosaveOff","drawingSettingAutosaveOn","drawingSettingAutosaveSaving","drawingSettingDrawingMode","drawingSettingDrawingModeActive","drawingSettingHide","drawingSettingLock","drawingSettingPreserveDrawings","drawingSettingPreserveDrawingsActive","drawingSettingShow","drawingSettingUnlock","toolArrow","toolAVWAP","toolBrush","toolCallout","toolCurve","toolElliottWave","toolEllipse","toolExpand","toolFibonacci","toolLine","toolMeasure","toolMidLineH","toolMidLineV","toolMouse","toolPitchfork","toolPolygon","toolPosition","toolRect","toolRectRotated","toolText","toolTriangle","toolXABCD","candleBarBasic","candleBarHeikinAshi","candleBarHollow","lineChartType","ohlcChartType","above","aboveEqual","abovePercent","below","belowEqual","belowPercent","between","crosses","crossesDown","crossesUp","equal","outside","InputTheme","InputRounding","InputSize","getInputTheme","isSelected","navigationBar","InputComponent","isHorizontalLabel","labelClassName","showNumberStepper","caption","isMobileStyleEnabled","inputTheme","isLeftStringIcon","isRightStringIcon","inputSize","commonSideContentClassnames","Label","isHorizontal","InputCaption","_ref3","TextareaComponent","_ref4","textareaTheme","forwardRef","Textarea","Centered","SearchError","onRetry","SearchItem","itemProps","inRouterContext","Link","to","reloadDocument","getItemHrefProps","useInRouterContext","subtitle","SearchList","_items$length","items","isOpen","hasContent","count","hide","Spinner","getSelectedItem","SearchNavigationWrapperInRouterContext","navigate","useNavigate","selectedValue","_getSelectedItem","SearchNavigationWrapperOutsideRouterContext","_getSelectedItem2","hasSearchIcon","isInRouterContext","Wrapper","sameWidth","fitViewport","defaultSelectedValue","isProgressBar","progress","radius","strokeWidth","circleXY","circumference","PI","viewBox","xmlns","cx","cy","r","strokeDasharray","strokeDashoffset","strokeLinecap","TooltipBox","tooltipColor","TooltipColor","orange","green","isIosBrowser","TOOLTIP_WRAPPER_PROPS","hideOnHoverOutside","isPointerEventsEnabled","context","stateObject","zIndex","updatePosition","usePopoverPlacement","focusable","wrapperProps","TooltipArrow","isHideOnClick","showOnHover","hideOnBlur","onMouseEnter","onMouseLeave","TooltipProvider","showTimeout","hideTimeout","transformMap","auto","bottom","positionMain","arrowColor","transform","d","getHeadingElement","titleClassName","controller","AbortController","setResizeObserver","loadResizeObserverPolyfill","then","polyfill","_controller$current","signal","aborted","_controller$current2","getPlacementZIndex","changeZIndex","computedZIndex","removeProperty","classList","popoverElement","contextZIndex","overlayElement","previousElementSibling","dataset","backdrop","ContentType","extra","isServerError","apiRequest","_ContentType","query","headers","options","throwOnAllErrors","requestUrl","URLSearchParams","requestOptions","ApplicationJson","cancelableRequest","async","textResponse","responseContentType","get","Html","parsedResponse","contentType","ApplicationJsonUTF","FormUrlEncoded","parseResponseForContentType","ok","statusText","rayId","scope","setContext","cancel","portfoliosRequest","fields","PortfolioApiFields","UserPortfolios","lastCloseRequest","t","portfolioLimitRequest","portfolioId","pid","TransactionLimit","NumberOfTransactions","keepalive","compilePath","path","params","pathToRegexp","toHome","toNews","toScreener","toCharts","toGroups","toPortfolio","toInsider","toElite","toAlerts","toHelp","toAccount","toLogin","toLogout","toMaps","toBubbles","toFutures","toFuturesPerf","toFuturesCharts","toForex","toForexPerf","toForexCharts","toCrypto","toCryptoPerf","toCryptoCharts","toBacktests","toBacktestCreate","toBacktestDetail","backtestId","toBacktestPresets","DateRangeType","SortDirection","FeatureFlag","cleanedTicker","resizeObserverPolyfill","default","getIsBrave","brave","isBrave","deserializeFeatureFlags","flags","val","fromEntries","serializeFeatureFlags","ChildPosition","getFlexAlignClasses","topLeft","bottomLeft","leftCenter","topCenter","bottomCenter","topRight","bottomRight","rightCenter","intlCache","dollarIntlCache","getIntl","fractions","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","getDollarIntl","shortFormatNumber","showPlusSign","multiply","suffix","extraSuffix","num","absValue","abs","format","shortFormatDollar","getDecimalPlacesForValue","FORMAT_PERCENT","FORMAT_PERCENT_CHANGE","formatNumber","fixedValue","toFixed","signPrefix","parseFloat","formatDollar","formatted","sortByColumn","a","b","localeCompare","direction","sortNullAsLast","ignoreNullForComparison","moveItemInArray","arr","sourceIndex","destinationIndex","from","max","removed","splice","getUuid","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","c","getRandomValues","Uint8Array","focusWithoutScroll","preventScroll","ariaHasPopup","blurWithoutScroll","getNavigationLinkUrl","preservedKeys","removeQueryKeys","additionalQueryValues","newUrl","URL","searchParams","delete","forEach","set","getElitePageLink","campaign","getNumberValue","isNaN","NaN","dateStrToDate","dateStr","dateStrToTimestamp","getEarningsDateSuffix","getSanitizedSingleTicker","rawTicker","specialTickers","ErrorBoundaryContext","createContext","initialState","didCatch","resetErrorBoundary","getDerivedStateFromError","_this$props$onReset","_this$props","_len","args","_key","onReset","reason","componentDidCatch","_this$props$onError","_this$props2","onError","prevProps","prevState","resetKeys","_this$props$onReset2","_this$props3","is","hasArrayChanged","next","prev","fallbackRender","fallback","childToRender","isValidElement","Provider"],"sourceRoot":""}