{"version":3,"file":"libs_init.3f7d8e10.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/header/market-badge.tsx","webpack://@finviz/website/./js/app/header/time.tsx","webpack://@finviz/website/./js/app/header/utils.ts","webpack://@finviz/website/./js/app/maps/types.ts","webpack://@finviz/website/./js/app/queryString.ts","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/cookie.ts","webpack://@finviz/website/./js/app/shared/hover-chart.ts","webpack://@finviz/website/./js/app/shared/isMobile.ts","webpack://@finviz/website/./js/app/shared/ticker-sanitizer.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/app/shared/utils.ts","webpack://@finviz/website/./js/main/components/RedGreenText.tsx","webpack://@finviz/website/./js/main/components/Table/Table.tsx","webpack://@finviz/website/./js/main/components/Table/types.ts","webpack://@finviz/website/./js/main/components/Table/TableCell.tsx","webpack://@finviz/website/./js/main/components/Table/TableHeader.tsx","webpack://@finviz/website/./js/main/components/Table/TableRow.tsx","webpack://@finviz/website/./js/main/components/Table/hooks.ts","webpack://@finviz/website/./js/main/components/box.tsx","webpack://@finviz/website/./js/main/components/button-group/button-group.tsx","webpack://@finviz/website/./js/main/components/button.tsx","webpack://@finviz/website/./js/main/components/checkbox.tsx","webpack://@finviz/website/./js/main/components/color-picker/draggable.tsx","webpack://@finviz/website/./js/main/components/color-picker/pointer.tsx","webpack://@finviz/website/./js/main/components/color-picker/util.ts","webpack://@finviz/website/./js/main/components/color-picker/alpha.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-palette.tsx","webpack://@finviz/website/./js/main/components/color-picker/hue-saturation.tsx","webpack://@finviz/website/./js/main/components/color-picker/lightness.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-preview.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-input.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-button.tsx","webpack://@finviz/website/./js/main/components/constants.ts","webpack://@finviz/website/./js/main/components/copy-to-clipboard/copy-to-clipboard.tsx","webpack://@finviz/website/./js/main/components/date-picker/index.tsx","webpack://@finviz/website/./js/main/components/delayed.tsx","webpack://@finviz/website/./js/main/components/dialog/hooks.ts","webpack://@finviz/website/./js/main/components/dialog/dialog-box.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-overlay.tsx","webpack://@finviz/website/./js/main/components/dialog/utils.ts","webpack://@finviz/website/./js/main/components/dialog/dialog.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-body.tsx","webpack://@finviz/website/./js/main/components/dialog/confirmation-dialog.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-trigger.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-footer.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-header.tsx","webpack://@finviz/website/./js/main/components/dropdown/hooks.ts","webpack://@finviz/website/./js/main/components/dropdown/dropdown.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-bar.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-item.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-separator.tsx","webpack://@finviz/website/./js/main/components/dropdown/more-button.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/icon/add.tsx","webpack://@finviz/website/./js/main/components/icon/arrow-down-short.tsx","webpack://@finviz/website/./js/main/components/icon/arrow-forward.tsx","webpack://@finviz/website/./js/main/components/icon/arrow-up-short.tsx","webpack://@finviz/website/./js/main/components/icon/briefcase.tsx","webpack://@finviz/website/./js/main/components/icon/calendar.tsx","webpack://@finviz/website/./js/main/components/icon/candle-bar-basic.tsx","webpack://@finviz/website/./js/main/components/icon/candle-bar-heikin-ashi.tsx","webpack://@finviz/website/./js/main/components/icon/candle-bar-hollow.tsx","webpack://@finviz/website/./js/main/components/icon/caret-down.tsx","webpack://@finviz/website/./js/main/components/icon/caret-left.tsx","webpack://@finviz/website/./js/main/components/icon/caret-right.tsx","webpack://@finviz/website/./js/main/components/icon/caret-up.tsx","webpack://@finviz/website/./js/main/components/icon/caretVertical.tsx","webpack://@finviz/website/./js/main/components/icon/chart-bar.tsx","webpack://@finviz/website/./js/main/components/icon/chart-bubble.tsx","webpack://@finviz/website/./js/main/components/icon/chart-pie.tsx","webpack://@finviz/website/./js/main/components/icon/chart-table.tsx","webpack://@finviz/website/./js/main/components/icon/chart-treemap.tsx","webpack://@finviz/website/./js/main/components/icon/chevron-down.tsx","webpack://@finviz/website/./js/main/components/icon/chevron-right.tsx","webpack://@finviz/website/./js/main/components/icon/menu-close.tsx","webpack://@finviz/website/./js/main/components/icon/dark-mode.tsx","webpack://@finviz/website/./js/main/components/icon/diamond-outlined.tsx","webpack://@finviz/website/./js/main/components/icon/done.tsx","webpack://@finviz/website/./js/main/components/icon/drag.tsx","webpack://@finviz/website/./js/main/components/icon/draw.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-action-delete.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-autosave-off.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-autosave-on.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-autosave-saving.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-drawing-mode.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-drawing-mode-active.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-hide.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-lock.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-preserve-drawings.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-preserve-drawings-active.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-show.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-unlock.tsx","webpack://@finviz/website/./js/main/components/icon/exit-fullscreen.tsx","webpack://@finviz/website/./js/main/components/icon/flash.tsx","webpack://@finviz/website/./js/main/components/icon/fullscreen.tsx","webpack://@finviz/website/./js/main/components/icon/gesture.tsx","webpack://@finviz/website/./js/main/components/icon/gift.tsx","webpack://@finviz/website/./js/main/components/icon/hamburger.tsx","webpack://@finviz/website/./js/main/components/icon/help.tsx","webpack://@finviz/website/./js/main/components/icon/idea.tsx","webpack://@finviz/website/./js/main/components/icon/idea-load.tsx","webpack://@finviz/website/./js/main/components/icon/idea-save.tsx","webpack://@finviz/website/./js/main/components/icon/info.tsx","webpack://@finviz/website/./js/main/components/icon/interval.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1h1v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1h2v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1h3v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1l2r.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1t2b.tsx","webpack://@finviz/website/./js/main/components/icon/layout-2h1v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-2h2v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-3h1v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-3h2v.tsx","webpack://@finviz/website/./js/main/components/icon/light-mode.tsx","webpack://@finviz/website/./js/main/components/icon/line-chart-type.tsx","webpack://@finviz/website/./js/main/components/icon/lock.tsx","webpack://@finviz/website/./js/main/components/icon/close.tsx","webpack://@finviz/website/./js/main/components/icon/minus.tsx","webpack://@finviz/website/./js/main/components/icon/more.tsx","webpack://@finviz/website/./js/main/components/icon/note.tsx","webpack://@finviz/website/./js/main/components/icon/ohlc-chart-type.tsx","webpack://@finviz/website/./js/main/components/icon/palette.tsx","webpack://@finviz/website/./js/main/components/icon/profile.tsx","webpack://@finviz/website/./js/main/components/icon/publish.tsx","webpack://@finviz/website/./js/main/components/icon/refresh.tsx","webpack://@finviz/website/./js/main/components/icon/remove.tsx","webpack://@finviz/website/./js/main/components/icon/restore.tsx","webpack://@finviz/website/./js/main/components/icon/search.tsx","webpack://@finviz/website/./js/main/components/icon/settings.tsx","webpack://@finviz/website/./js/main/components/icon/settings-wheel.tsx","webpack://@finviz/website/./js/main/components/icon/share.tsx","webpack://@finviz/website/./js/main/components/icon/sign-out.tsx","webpack://@finviz/website/./js/main/components/icon/star.tsx","webpack://@finviz/website/./js/main/components/icon/star-outlined.tsx","webpack://@finviz/website/./js/main/components/icon/switch-horizontal.tsx","webpack://@finviz/website/./js/main/components/icon/switch-vertical.tsx","webpack://@finviz/website/./js/main/components/icon/tab-key.tsx","webpack://@finviz/website/./js/main/components/icon/template.tsx","webpack://@finviz/website/./js/main/components/icon/tool-arrow.tsx","webpack://@finviz/website/./js/main/components/icon/tool-brush.tsx","webpack://@finviz/website/./js/main/components/icon/tool-callout.tsx","webpack://@finviz/website/./js/main/components/icon/tool-curve.tsx","webpack://@finviz/website/./js/main/components/icon/tool-elliott-wave.tsx","webpack://@finviz/website/./js/main/components/icon/tool-ellipse.tsx","webpack://@finviz/website/./js/main/components/icon/tool-expand.tsx","webpack://@finviz/website/./js/main/components/icon/tool-fibonacci.tsx","webpack://@finviz/website/./js/main/components/icon/tool-line.tsx","webpack://@finviz/website/./js/main/components/icon/tool-measure.tsx","webpack://@finviz/website/./js/main/components/icon/tool-midline-h.tsx","webpack://@finviz/website/./js/main/components/icon/tool-midline-v.tsx","webpack://@finviz/website/./js/main/components/icon/tool-mouse.tsx","webpack://@finviz/website/./js/main/components/icon/tool-pitchfork.tsx","webpack://@finviz/website/./js/main/components/icon/tool-polygon.tsx","webpack://@finviz/website/./js/main/components/icon/tool-position.tsx","webpack://@finviz/website/./js/main/components/icon/tool-rect.tsx","webpack://@finviz/website/./js/main/components/icon/tool-rect-rotated.tsx","webpack://@finviz/website/./js/main/components/icon/tool-text.tsx","webpack://@finviz/website/./js/main/components/icon/tool-triangle.tsx","webpack://@finviz/website/./js/main/components/icon/tool-xabcd.tsx","webpack://@finviz/website/./js/main/components/icon/trash-can.tsx","webpack://@finviz/website/./js/main/components/icon/trending-down.tsx","webpack://@finviz/website/./js/main/components/icon/trending-up.tsx","webpack://@finviz/website/./js/main/components/icon/triangle.tsx","webpack://@finviz/website/./js/main/components/icon/triangle-outline-down.tsx","webpack://@finviz/website/./js/main/components/icon/triangle-outline-up.tsx","webpack://@finviz/website/./js/main/components/icon/warning.tsx","webpack://@finviz/website/./js/main/components/icon/svg.tsx","webpack://@finviz/website/./js/main/components/input.tsx","webpack://@finviz/website/./js/main/components/list/hooks.tsx","webpack://@finviz/website/./js/main/components/list/list-item.tsx","webpack://@finviz/website/./js/main/components/list/list.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/popover/popover.tsx","webpack://@finviz/website/./js/main/components/popover/hooks.ts","webpack://@finviz/website/./js/main/components/popover/popover-trigger.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box-item.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box.tsx","webpack://@finviz/website/./js/main/components/search/constants.ts","webpack://@finviz/website/./js/main/components/centered.tsx","webpack://@finviz/website/./js/main/components/search/search-error.tsx","webpack://@finviz/website/./js/main/components/highlight.tsx","webpack://@finviz/website/./js/main/components/search/search-item.tsx","webpack://@finviz/website/./js/main/components/search/util.ts","webpack://@finviz/website/./js/main/components/search/search-list.tsx","webpack://@finviz/website/./js/main/components/search/search.tsx","webpack://@finviz/website/./js/main/components/combo-box/hooks.ts","webpack://@finviz/website/./js/main/components/select/hooks.ts","webpack://@finviz/website/./js/main/components/select/select-button.tsx","webpack://@finviz/website/./js/main/components/select/select.tsx","webpack://@finviz/website/./js/main/components/select/select-with-tooltip.tsx","webpack://@finviz/website/./js/main/components/select/native-select.tsx","webpack://@finviz/website/./js/main/components/select/select-list.tsx","webpack://@finviz/website/./js/main/components/spinner.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/daterange-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/label-with-delayed-spinner.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-bar.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range-utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-custom-date-range-dialog.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-favorite-timeframes.tsx","webpack://@finviz/website/./js/main/components/tooltip-input.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip-box.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip-trigger.tsx","webpack://@finviz/website/./js/main/components/tooltip/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/constants.ts","webpack://@finviz/website/./js/main/hooks/use-is-mounted.ts","webpack://@finviz/website/./js/main/hooks/use-element-measure.ts","webpack://@finviz/website/./js/main/hooks/use-popover-maxHeight.ts","webpack://@finviz/website/./js/main/hooks/use-resize-observer.ts","webpack://@finviz/website/./js/main/hooks/use-sort-data.ts","webpack://@finviz/website/./js/main/hooks/use-sync-local-storage.ts","webpack://@finviz/website/./js/main/hooks/use-track-pageview.ts","webpack://@finviz/website/./js/main/hooks/use-window-size.tsx","webpack://@finviz/website/./js/main/components/context-menu/context-menu.tsx","webpack://@finviz/website/./js/main/components/grid/grid.tsx","webpack://@finviz/website/./js/main/components/inner-state/inner-state.tsx","webpack://@finviz/website/./js/main/components/portfolio/PortfolioWatchlistTable.tsx","webpack://@finviz/website/./js/main/components/range.tsx","webpack://@finviz/website/./js/main/components/toolbar/interfaces.ts","webpack://@finviz/website/./js/main/components/toolbar/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/toolbar.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-button.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-group.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-item.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-divider.tsx","webpack://@finviz/website/./js/main/components/tour/step-content.tsx","webpack://@finviz/website/./js/main/components/tour/utils.ts","webpack://@finviz/website/./js/main/components/tour/hooks.tsx","webpack://@finviz/website/./js/main/components/index.ts","webpack://@finviz/website/./js/main/libs-init.ts","webpack://@finviz/website/./js/main/modules/portfolio/constants/columns.tsx","webpack://@finviz/website/./js/main/modules/portfolio/constants/general.ts","webpack://@finviz/website/./js/main/modules/portfolio/services/api.ts","webpack://@finviz/website/./js/main/modules/portfolio/types.tsx","webpack://@finviz/website/./js/main/modules/portfolio/utils.ts","webpack://@finviz/website/./js/main/services/api.ts","webpack://@finviz/website/./js/main/services/local-storage.ts","webpack://@finviz/website/./js/main/services/routing.ts","webpack://@finviz/website/./js/main/types.ts","webpack://@finviz/website/./js/main/util.tsx"],"sourcesContent":["import classnames from 'classnames'\r\n\r\nimport { isAftermarket, isHoliday, isPremarket } from './utils'\r\n\r\nexport enum MarketBadgeType {\r\n None,\r\n Open,\r\n Closed,\r\n Premarket,\r\n Aftermarket,\r\n}\r\n\r\nexport function getMarketBadgeText(type: MarketBadgeType, _date?: Date) {\r\n switch (type) {\r\n case MarketBadgeType.Open:\r\n return {\r\n label: 'Markets Open',\r\n }\r\n case MarketBadgeType.Closed:\r\n // const holiday = getHoliday(date)\r\n\r\n return {\r\n label: 'Markets Closed',\r\n // description: holiday && (\r\n // <>\r\n // The markets observe U.S. holidays and are closed on\r\n //
\r\n // {holiday.label}\r\n // \r\n // ),\r\n }\r\n case MarketBadgeType.Premarket:\r\n return {\r\n label: 'Premarket',\r\n // description: (\r\n // <>\r\n // An additional time window when trading is possible.\r\n //
\r\n // We report it as the time between 7:00 AM and 9:30 AM\r\n // \r\n // ),\r\n }\r\n case MarketBadgeType.Aftermarket:\r\n return {\r\n label: 'Aftermarket',\r\n // description: (\r\n // <>\r\n // An additional time window when trading is still possible.\r\n //
\r\n // We report it as the time between 4:00 PM and 6:30 PM\r\n // \r\n // ),\r\n }\r\n }\r\n}\r\n\r\nexport function getMarketBadgeType(time: Date, hasUserPremium?: boolean) {\r\n if (isHoliday(time)) return MarketBadgeType.Closed\r\n if (isPremarket(time, hasUserPremium)) return MarketBadgeType.Premarket\r\n if (isAftermarket(time, hasUserPremium)) return MarketBadgeType.Aftermarket\r\n // if (isMarketOpen(time, hasUserPremium)) return MarketBadgeType.Open\r\n\r\n return MarketBadgeType.None\r\n}\r\n\r\nexport interface MarketBadgeProps {\r\n badge: MarketBadgeType\r\n className?: string\r\n}\r\n\r\nexport function MarketBadge({ badge, className }: MarketBadgeProps) {\r\n if (badge === MarketBadgeType.None) return null\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nimport { Tooltip, TooltipTrigger, useTooltipState } from '../../main/components/tooltip'\r\nimport { Heading } from '../../main/components/typography'\r\nimport { useResizeObserver } from '../../main/hooks/use-resize-observer'\r\nimport { MarketBadge, MarketBadgeProps, getMarketBadgeText, getMarketBadgeType } from './market-badge'\r\nimport { TimeFormatType, getDate, getFormattedDateString } from './utils'\r\n\r\nconst UPDATE_INTERVAL = 10000\r\n\r\nenum TimeBreakpointMode {\r\n container,\r\n window,\r\n}\r\n\r\nexport interface TimeBreakpoint {\r\n minWidth: number\r\n marketBadgeText: boolean\r\n timeFormat: TimeFormatType\r\n}\r\n\r\nconst BREAKPOINTS: TimeBreakpoint[] = [\r\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\r\n { minWidth: 140, marketBadgeText: false, timeFormat: 'short' },\r\n { minWidth: 180, marketBadgeText: false, timeFormat: 'long' },\r\n { minWidth: 255, marketBadgeText: true, timeFormat: 'long' },\r\n]\r\n\r\nfunction getTimeState(fixedTime?: string | Date, hasUserPremium: boolean = FinvizSettings.hasUserPremium) {\r\n const time = getDate(fixedTime)\r\n const badge = getMarketBadgeType(time, hasUserPremium)\r\n\r\n return { time, badge }\r\n}\r\n\r\nfunction TooltipBadge(props: MarketBadgeProps & { time: Date }) {\r\n const state = useTooltipState({ placement: 'bottom' })\r\n const badge = getMarketBadgeText(props.badge, props.time)\r\n\r\n if (!badge) return null\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n {badge.label}\r\n \r\n {/* {badge.description && {badge.description}} */}\r\n \r\n \r\n )\r\n}\r\n\r\nfunction StaticBadge(props: MarketBadgeProps & { time: Date }) {\r\n const badge = getMarketBadgeText(props.badge, props.time)\r\n\r\n if (!badge) return null\r\n\r\n return (\r\n <>\r\n \r\n {`${badge.label} · `}\r\n \r\n )\r\n}\r\n\r\n/**\r\n * Find matching breakpoint or return the last (largest) one\r\n */\r\nfunction findMatchingBreakpoint(compareWidth: number | undefined, breakpoints: TimeBreakpoint[]) {\r\n if (typeof compareWidth !== 'number') return breakpoints[breakpoints.length - 1]\r\n\r\n const matchingBreakpoints = breakpoints.filter((breakpoint) => compareWidth >= breakpoint.minWidth)\r\n\r\n return matchingBreakpoints.pop() ?? breakpoints[breakpoints.length - 1]\r\n}\r\n\r\nfunction getCurrentWidth(mode: TimeBreakpointMode, element: HTMLElement | null) {\r\n return mode === TimeBreakpointMode.window ? window.innerWidth : element?.clientWidth ?? 0\r\n}\r\n\r\ninterface TimeProps extends React.HTMLProps {\r\n /**\r\n * Set custom time to display\r\n */\r\n fixedTime?: string | Date\r\n\r\n /**\r\n * What to measure the breakpoints to\r\n * - `container` parent element\r\n * - `window` window\r\n *\r\n * @default \"container\"\r\n */\r\n breakpointMode?: keyof typeof TimeBreakpointMode\r\n\r\n /**\r\n * Defines what information is visible at which breakpoint. Local mode measures\r\n * the component wrapper div and global mode measures window width. The definitions\r\n * must be ascending in width\r\n */\r\n breakpoints?: TimeBreakpoint[]\r\n}\r\n\r\nexport function Time({\r\n className,\r\n fixedTime,\r\n breakpointMode = 'container',\r\n breakpoints = BREAKPOINTS,\r\n ...props\r\n}: TimeProps) {\r\n const ResizeObserver = useResizeObserver()\r\n const rootRef = React.useRef(null)\r\n const [state, setState] = React.useState(getTimeState(fixedTime))\r\n const [currentBreakpoint, setBreakpoint] = React.useState(null)\r\n\r\n React.useEffect(() => {\r\n const interval = setInterval(() => setState(getTimeState(fixedTime)), UPDATE_INTERVAL)\r\n return () => clearInterval(interval)\r\n }, [fixedTime])\r\n\r\n React.useEffect(() => {\r\n if (!ResizeObserver || !rootRef.current) return\r\n\r\n if (!currentBreakpoint) {\r\n const currentWidth = getCurrentWidth(TimeBreakpointMode[breakpointMode], rootRef.current)\r\n setBreakpoint(findMatchingBreakpoint(currentWidth, breakpoints))\r\n }\r\n\r\n const handleResize = throttle(() => {\r\n const currentWidth = getCurrentWidth(TimeBreakpointMode[breakpointMode], rootRef.current)\r\n const foundBreakpoint = findMatchingBreakpoint(currentWidth, breakpoints)\r\n\r\n if (foundBreakpoint !== currentBreakpoint) setBreakpoint(foundBreakpoint)\r\n }, 150)\r\n\r\n const observer = new ResizeObserver((entries) => {\r\n window.requestAnimationFrame(() => {\r\n if (Array.isArray(entries) && entries.length > 0) handleResize()\r\n })\r\n })\r\n\r\n observer.observe(rootRef.current)\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n observer.disconnect()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [ResizeObserver, currentBreakpoint, breakpoints, breakpointMode])\r\n\r\n return (\r\n
\r\n {currentBreakpoint && (\r\n
\r\n {currentBreakpoint.marketBadgeText ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {getFormattedDateString(state.time, currentBreakpoint.timeFormat)}\r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\n/**\r\n * Check if a given date is DST in the US\r\n * - begins on the second Sunday in March\r\n * - ends on the first Sunday in November\r\n *\r\n * Keep in sync with https://github.com/finvizhq/charts/blob/master/app/utils.ts\r\n */\r\nexport function getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nexport function getDate(seed?: string | number | Date | null) {\r\n var date = seed != null ? new Date(seed) : new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n\r\n if (isDst) {\r\n dateAsNY.setUTCHours(dateAsNY.getUTCHours() + 1)\r\n }\r\n\r\n return dateAsNY\r\n}\r\n\r\nfunction getWeekDay(date: Date) {\r\n return date.toLocaleDateString('en-US', { weekday: 'short' })\r\n}\r\n\r\nfunction getMonth(date: Date, uppercase = true) {\r\n const name = date.toLocaleDateString('en-US', { month: 'short' })\r\n return uppercase ? name.toUpperCase() : name\r\n}\r\n\r\nfunction getDay(date: Date) {\r\n return date.getDate().toString().padStart(2, '0')\r\n}\r\n\r\nfunction getTime(date: Date) {\r\n return date.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true })\r\n}\r\n\r\nenum TimeFormat {\r\n long,\r\n short,\r\n dateOnly,\r\n timeOnly,\r\n}\r\n\r\nexport type TimeFormatType = keyof typeof TimeFormat\r\n\r\nexport function getFormattedDateString(date: Date = getDate(), format: TimeFormatType = 'long') {\r\n switch (TimeFormat[format]) {\r\n case TimeFormat.long:\r\n return `${getWeekDay(date)} ${getMonth(date)} ${getDay(date)} ${date.getFullYear()} ${getTime(date)} ET`\r\n case TimeFormat.short:\r\n return `${getWeekDay(date)} ${getMonth(date)} ${getDay(date)} ${getTime(date)}`\r\n case TimeFormat.dateOnly:\r\n return `${getMonth(date, false)} ${getDay(date)}`\r\n case TimeFormat.timeOnly:\r\n return getTime(date)\r\n }\r\n}\r\n\r\nexport function formatDate(value: Date | unknown, inputOrOutputFormat: string, outputFormat?: string): string {\r\n return dateFns.format(\r\n dateFns.isDate(value) ? (value as Date) : dateFns.parse(`${value}`, inputOrOutputFormat, new Date()),\r\n outputFormat ?? inputOrOutputFormat\r\n )\r\n}\r\n\r\nexport function isPremarket(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n const dayOfWeek = date.getDay()\r\n const min = date.getMinutes()\r\n const hours = date.getHours()\r\n\r\n if (isPremium && dayOfWeek !== 0 && dayOfWeek !== 6 && (hours === 7 || hours === 8 || (hours === 9 && min < 30))) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nexport function isAftermarket(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n const dayOfWeek = date.getDay()\r\n const min = date.getMinutes()\r\n\r\n if (\r\n isPremium &&\r\n dayOfWeek !== 0 &&\r\n dayOfWeek !== 6 &&\r\n (date.getHours() === 16 || date.getHours() === 17 || (date.getHours() === 18 && min < 30))\r\n ) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * https://www.nyse.com/markets/hours-calendars\r\n */\r\nconst HOLIDAY_DATES = [\r\n {\r\n label: \"New Year's Day\",\r\n test: (day: number, month: number) => month === 1 && day === 2,\r\n },\r\n {\r\n label: 'Martin Luther King, Jr. Day',\r\n test: (day: number, month: number) => month === 1 && day === 16,\r\n },\r\n {\r\n label: 'Presidents Day',\r\n test: (day: number, month: number) => month === 2 && day === 20,\r\n },\r\n {\r\n label: 'Good Friday',\r\n test: (day: number, month: number) => month === 4 && day === 7,\r\n },\r\n {\r\n label: 'Memorial Day',\r\n test: (day: number, month: number) => month === 5 && day === 29,\r\n },\r\n {\r\n label: 'Juneteenth Holiday',\r\n test: (day: number, month: number) => month === 6 && day === 19,\r\n },\r\n {\r\n label: 'Early Close',\r\n test: (day: number, month: number, hours: number) => month === 7 && day === 3 && hours >= 13,\r\n },\r\n {\r\n label: 'Independence Day',\r\n test: (day: number, month: number) => month === 7 && day === 4,\r\n },\r\n {\r\n label: 'Labor Day',\r\n test: (day: number, month: number) => month === 9 && day === 4,\r\n },\r\n {\r\n label: 'Thanksgiving Day',\r\n test: (day: number, month: number) => month === 11 && day === 23,\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 === 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 { ReactNode } from 'react'\r\n\r\nexport enum MapTypeId {\r\n Sector = 'sec',\r\n World = 'geo',\r\n SectorFull = 'sec_all',\r\n ETF = 'etf',\r\n Screener = 'screener',\r\n Portfolio = 'portfolio',\r\n}\r\n\r\nexport enum MapSubtypeId {\r\n DayPerf = 'd1',\r\n WeekPerf = 'w1',\r\n MonthPerf = 'w4',\r\n ThreeMonthPerf = 'w13',\r\n SixMonthPerf = 'w26',\r\n YearPerf = 'w52',\r\n YearToDatePerf = 'ytd',\r\n RelativeVolume = 'relvol',\r\n PriceToEarnings = 'pe',\r\n ForwardPriceToEearnings = 'fpe',\r\n PriceEarningsToGrowth = 'peg',\r\n PriceToSellsRatio = 'ps',\r\n PriceToBookRatio = 'pb',\r\n DividendYield = 'div',\r\n EPSGrowth5y = 'eps5y',\r\n FloatShort = 'short',\r\n AnalystRecommendation = 'rec',\r\n EarningsPerf = 'earnperf',\r\n EarningsDate = 'earndate',\r\n // Portfolio\r\n PortfolioGainPct = 'portfolioGainPct',\r\n PortfolioGainUsd = 'portfolioGainUsd',\r\n PortfolioChangePct = 'portfolioChangePct',\r\n PortfolioChangeUsd = 'portfolioChangeUsd',\r\n}\r\n\r\nexport enum ScaleId {\r\n DayPerf = 'default',\r\n WeekPerf = '_5',\r\n MonthPerf = '_10',\r\n ThreeMonthPerf = '_15',\r\n SixMonthPerf = '_20',\r\n YearPerf = '_25',\r\n RelativeVolume = '_relvol',\r\n PriceToEarnings = '_pe',\r\n ForwardPriceToEearnings = '_fpe',\r\n PriceEarningsToGrowth = '_peg',\r\n PriceToSellsRatio = '_ps',\r\n PriceToBookRatio = '_pb',\r\n DividendYield = '_div',\r\n EPSGrowth5y = '_eps5y',\r\n FloatShort = '_short',\r\n AnalystRecommendation = '_rec',\r\n EarningsDate = '_earndate',\r\n // Portfolio\r\n PortfolioPct = '_portfolioPct',\r\n PortfolioUsd = '_portfolioUsd',\r\n}\r\n\r\nexport const enum NodeDepth {\r\n Root,\r\n Sector,\r\n Industry,\r\n Node,\r\n}\r\n\r\nexport interface MapDataRow {\r\n name: string\r\n perf?: number\r\n x: number\r\n y: number\r\n dx: number\r\n dy: number\r\n data: any\r\n depth: NodeDepth\r\n}\r\n\r\nexport interface MapDataRoot {\r\n name: 'Root'\r\n children: MapDataSector[]\r\n duplicateTickers: number\r\n}\r\n\r\nexport interface MapDataSector extends MapDataRow {\r\n children: MapDataIndustry[]\r\n parent: MapDataRoot\r\n}\r\n\r\nexport interface MapDataIndustry extends MapDataRow {\r\n children: MapDataNode[]\r\n parent: MapDataSector\r\n}\r\n\r\nexport interface MapDataNode extends MapDataRow {\r\n parent: MapDataIndustry\r\n additional?: string\r\n description: string\r\n perfText: string\r\n value: number\r\n}\r\n\r\nexport interface MapData {\r\n sectors: MapDataSector[]\r\n industries: MapDataIndustry[]\r\n nodes: MapDataNode[]\r\n}\r\n\r\nexport type PerfData = {\r\n nodes: Record | Array\r\n additional: Record\r\n subtype: MapSubtypeId\r\n version?: number\r\n}\r\n\r\nexport interface MapSubtype {\r\n id: MapSubtypeId\r\n name: string\r\n scaleId: ScaleId\r\n tooltip: string\r\n countIndustryPerf: boolean\r\n countSectorPerf: boolean\r\n}\r\n\r\nexport interface MapType {\r\n name: string\r\n pageTitle: string\r\n nameShort?: string\r\n description: string\r\n type: MapTypeId\r\n subtypes: MapSubtype[]\r\n}\r\n\r\nexport interface Scale {\r\n name: string\r\n tooltip: ReactNode\r\n id: ScaleId\r\n}\r\n","export type ObjectHash = Record\r\n\r\nexport const decodeQueryString = function = ObjectHash>(\r\n search = window.location.search\r\n): T {\r\n const vars = search.substring(1).split('&')\r\n const obj: ObjectHash = {}\r\n vars.forEach((pair) => {\r\n const delimiterPos = pair.indexOf('='),\r\n key = decodeURIComponent(pair.substring(0, delimiterPos)),\r\n value = decodeURIComponent(pair.substring(delimiterPos + 1))\r\n obj[key] = value\r\n })\r\n return obj as T\r\n}\r\n\r\nexport const encodeQueryString = function (values: ObjectHash, whitelistedValues: string[] = []) {\r\n return Object.keys(values).reduce((prev, key) => {\r\n const value = values[key]\r\n if (!['', null, undefined].includes(value) || whitelistedValues.includes(value)) {\r\n return prev + (prev.length > 0 ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value)\r\n }\r\n return prev\r\n }, '')\r\n}\r\n","import { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps {\r\n type: string\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n overlays: string[]\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n width?: number\r\n height?: number\r\n ticker: string\r\n timeframe: string\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n theme?: 'dark' | 'light'\r\n colors?: ReturnType\r\n refreshData?: boolean\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n width = 800,\r\n height = 400,\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n theme,\r\n colors = getCustomColorsFromCookies(),\r\n refreshData = false,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: '1h1v',\r\n width,\r\n height,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n theme,\r\n colors,\r\n charts: [\r\n {\r\n height,\r\n timeframe,\r\n scale: 'linear',\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData,\r\n stretch: true,\r\n panes: [\r\n {\r\n height,\r\n elements: paneElements,\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n try {\r\n return JSON.parse(getParsedCookies('customColors') as string)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n","export function getParsedCookies(cookieName: string) {\r\n const parseCookies = document.cookie\r\n .split(';')\r\n .map((cookieString) => cookieString.split('='))\r\n .reduce(\r\n (acc, v) => {\r\n acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())\r\n return acc\r\n },\r\n {} as Record\r\n )\r\n\r\n return cookieName ? parseCookies[cookieName] : parseCookies\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n var re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n}\r\n\r\nexport function setCookie(name: string, value: string, expires: Date) {\r\n var cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (/\\bfinviz\\b/.test(document.location.hostname)) {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n}\r\n","import { HTMLAttributeReferrerPolicy } from 'react'\r\n\r\nimport { Instrument } from '../../main/types'\r\nimport { cleanTicker } from '../../main/util'\r\nimport { encodeQueryString } from '../queryString'\r\n\r\nconst DEFAULT_OVERLAYS =\r\n '&o[0][ot]=sma&o[0][op]=50&o[0][oc]=FF8F33C6&o[1][ot]=sma&o[1][op]=200&o[1][oc]=DCB3326D&o[2][ot]=patterns&o[2][op]=&o[2][oc]=000'\r\n\r\nexport function getHoverChartUrl(\r\n ticker: string,\r\n escaped: boolean = false,\r\n timeframe = FinvizSettings.hoverCharts?.stock?.timeframe,\r\n dateRange = FinvizSettings.hoverCharts?.stock?.dateRange\r\n): string {\r\n const theme = document.documentElement.classList.contains('dark') ? 'd' : undefined\r\n const overlays = FinvizSettings.hasUserPremium && FinvizSettings.hoverCharts?.stock?.patterns ? DEFAULT_OVERLAYS : ''\r\n const query = encodeQueryString({\r\n cs: 'm',\r\n t: ticker,\r\n tf: timeframe ?? 'd',\r\n ct: 'candle_stick',\r\n r: dateRange,\r\n tm: theme,\r\n })\r\n\r\n let imgUrl = `${FinvizSettings.nodeChartsDomain}/chart.ashx?${query}${overlays}`\r\n\r\n if (escaped) {\r\n // \"Escaping\" [ and ] because of how boxover.js works\r\n imgUrl = imgUrl.replace(/\\[/g, '[[').replace(/]/g, ']]')\r\n }\r\n return imgUrl\r\n}\r\n\r\nfunction timeframeToDeprecatedTimeframe(timeframeString: string) {\r\n switch (timeframeString) {\r\n case 'i1':\r\n case 'i2':\r\n return 'm1'\r\n case 'i3':\r\n return 'm3'\r\n case 'i5':\r\n return 'm5'\r\n case 'i10':\r\n case 'i15':\r\n return 'm15'\r\n case 'i30':\r\n return 'm30'\r\n case 'h':\r\n case 'h2':\r\n case 'h4':\r\n return 'h1'\r\n case 'w':\r\n return 'w1'\r\n case 'm':\r\n return 'mo'\r\n default:\r\n case 'd':\r\n return 'd1'\r\n }\r\n}\r\n\r\nfunction getOldChartsUrl(ticker: string, timeframe: string = 'd1', instrument: Instrument) {\r\n const oldPeriod = timeframeToDeprecatedTimeframe(timeframe)\r\n\r\n switch (instrument) {\r\n case Instrument.Crypto:\r\n case Instrument.Forex:\r\n return `/fx_image.ashx?${cleanTicker(ticker).toLowerCase()}_${oldPeriod}_s.png`\r\n default:\r\n case Instrument.Futures:\r\n return `/fut_image.ashx?${cleanTicker(ticker).toLowerCase()}_${oldPeriod}_s.png`\r\n }\r\n}\r\n\r\nexport function getHoverChartDimensions() {\r\n switch (FinvizSettings.hoverCharts?.stock?.timeframe) {\r\n case 'i3':\r\n case 'i15':\r\n return { width: 584, height: 180 }\r\n case 'i5':\r\n return { width: 376, height: 180 }\r\n case 'd':\r\n if (FinvizSettings.hoverCharts?.stock?.patterns) return { width: 464, height: 230 }\r\n return { width: 324, height: 180 }\r\n default:\r\n return { width: 324, height: 180 }\r\n }\r\n}\r\n\r\nexport function getReferrerPolicy(): HTMLAttributeReferrerPolicy {\r\n return 'no-referrer-when-downgrade'\r\n}\r\n\r\nexport function getHoverChartImg(\r\n ticker: string,\r\n escaped: boolean = false,\r\n timeframe = FinvizSettings.hoverCharts?.stock?.timeframe,\r\n dateRange?: string,\r\n instrument: Instrument = Instrument.Stock\r\n) {\r\n const useOldCharts = !FinvizSettings.hasForexFuturesCryptoNodeCharts && instrument !== Instrument.Stock\r\n const chartSize = useOldCharts ? { width: 320, height: 180 } : getHoverChartDimensions()\r\n const referrerPolicy = getReferrerPolicy()\r\n const url = useOldCharts\r\n ? getOldChartsUrl(ticker, timeframe, instrument)\r\n : getHoverChartUrl(ticker, escaped, timeframe, dateRange)\r\n const srcSet = useOldCharts ? '' : getSrcSet(url)\r\n const srcsetString = srcSet?.length ? ` srcset='${srcSet}'` : ''\r\n\r\n return {\r\n img: ``,\r\n ...chartSize,\r\n }\r\n}\r\n\r\nexport function getSrcSet(url: string) {\r\n // You must keep a space after , for refresh to work\r\n return FinvizSettings.hasUserRetinaNodeCharts ? `${url} 1x, ${url}&sf=2 2x` : undefined\r\n}\r\n","const 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\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 /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && navigator.maxTouchPoints === 0\r\n}\r\n\r\nexport function isIos() {\r\n return matchesIOSLike && !isSafariDesktop()\r\n}\r\n","function getSanitizedSingleTicker(rawTicker: string) {\r\n return rawTicker\r\n .replace(/\\.+/gi, '-')\r\n .split('-')\r\n .map((x) => x.replace(/([^a-z0-9@-])+/gi, ''))\r\n .filter((x) => !!x)\r\n .join('-')\r\n .toUpperCase()\r\n}\r\n\r\nexport function getSanitizedTicker(rawTicker: string, isMulti = false) {\r\n if (isMulti) {\r\n return rawTicker\r\n .replace(/ /g, ',')\r\n .split(',')\r\n .map(getSanitizedSingleTicker)\r\n .filter((x) => !!x)\r\n .join(',')\r\n }\r\n\r\n return getSanitizedSingleTicker(rawTicker)\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","import { decodeQueryString, encodeQueryString } from '../queryString'\r\nimport { getCookie, setCookie } from './cookie'\r\n\r\nexport const formatDateToStringUS = (date: Date) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })\r\n\r\nconst DRAWING_QUOTE_PAGE_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabledOnQuotePage() {\r\n return getCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport async function setIsDrawingEnabledOnQuotePage(isEnabled: boolean) {\r\n return fetch('/api/set_cookie.ashx?cookie=' + DRAWING_QUOTE_PAGE_COOKIE_NAME + '&value=' + (isEnabled ? 'on' : 'off'))\r\n .catch(() => {})\r\n .then((res) => {\r\n if (!res?.ok) {\r\n // fallback to JS otherwise draw toggle won't work if API don't work\r\n setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled)\r\n }\r\n\r\n const { i: idea, ...rest } = decodeQueryString()\r\n if (idea) {\r\n document.location = `quote.ashx?${encodeQueryString(rest)}`\r\n } else {\r\n document.location.reload()\r\n }\r\n })\r\n}\r\n\r\nfunction setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n setCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME, isEnabled ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function parseInitData(elementId: string): T | undefined {\r\n try {\r\n const initDataElement = document.getElementById(elementId)!\r\n return JSON.parse(initDataElement.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return\r\n }\r\n}\r\n\r\nexport function getSidebarFromCookie() {\r\n const chartsUrl = getCookie('chartsUrl')\r\n const decodedCookie = chartsUrl ? decodeQueryString<{ sidebar?: string }>(chartsUrl) : null\r\n return decodedCookie?.sidebar || undefined\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\ninterface RedGreenTextProps {\r\n value?: number | null\r\n children: any\r\n rightContent?: React.ReactNode\r\n className?: string\r\n rightClass?: string\r\n}\r\n\r\n/**\r\n * Component which renders red/green text based on whether the value is positive or negative if value\r\n * is 0, it will not be colored and it will not display the guide triangle\r\n */\r\nexport function RedGreenText({ value, children, className, rightContent, rightClass }: RedGreenTextProps) {\r\n const hasValue = value && Number.isFinite(value)\r\n\r\n return (\r\n 0,\r\n 'text-red-500 dark:text-red-400': hasValue && value < 0,\r\n })}\r\n >\r\n {children}\r\n \r\n {rightContent === undefined && hasValue && value !== 0 ? (\r\n 0 ? 'arrowUpShort' : 'arrowDownShort'} className=\"block\" />\r\n ) : null}\r\n {rightContent}\r\n \r\n \r\n )\r\n}\r\n\r\n/**\r\n * Used to position multiple lines of RedGreen text, this component will make sure all numbers are\r\n * in line with their `rightContent`\r\n */\r\nexport function RedGreenMultiline({ className, children, ...props }: React.PropsWithChildren) {\r\n return (\r\n
\r\n {React.Children.map(children, (child: React.ReactElement) => {\r\n if (React.isValidElement(child) && child.type === RedGreenText) {\r\n return React.cloneElement(child, {\r\n className: classnames(child.props.className, 'table-row'),\r\n rightClass: 'table-cell align-middle',\r\n })\r\n }\r\n\r\n return child\r\n })}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport const Table = React.forwardRef(\r\n (props: React.PropsWithChildren>, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableHead(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n\r\ninterface TableBodyProps extends React.HTMLProps {\r\n spacing?: 'regular' | 'large' | 'none'\r\n}\r\n\r\nexport const TableBody = React.forwardRef(\r\n (\r\n { spacing = 'none', ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n ) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableFooter(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","export enum TableAlign {\r\n Left,\r\n Center,\r\n Right,\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign } from './types'\r\n\r\nexport interface TableCellProps extends React.HTMLProps {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n}\r\n\r\nexport function TableCell({\r\n isFirst,\r\n isLast,\r\n align = TableAlign.Left,\r\n hasPadding = true,\r\n className,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { TableAlign } from './types'\r\n\r\nconst TABLE_HEADER_DEFAULT_ELEMENT = 'th'\r\n\r\ninterface SortProps {\r\n isActive: boolean\r\n direction: 1 | -1\r\n}\r\n\r\nfunction TableSortIndicator({ isActive, direction, className }: Partial & { className?: string }) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ninterface TableHeaderProps extends Omit, 'as'> {\r\n isActive?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n hasHover?: boolean\r\n}\r\n\r\nexport function TableHeader({\r\n as: asComponent,\r\n align,\r\n children,\r\n isActive,\r\n hasPadding = true,\r\n hasHover,\r\n ...props\r\n}: Omit, 'align'> & TableHeaderProps) {\r\n const componentToRender = asComponent ?? TABLE_HEADER_DEFAULT_ELEMENT\r\n\r\n return React.createElement(\r\n componentToRender,\r\n {\r\n ...props,\r\n className: classnames(\r\n props.className,\r\n 'whitespace-nowrap font-normal h-5.5 hover:first:rounded-l-md hover:last:rounded-r-md',\r\n {\r\n 'cursor-pointer hover:select-none hover:bg-gray-100 dark:hover:bg-gray-700': hasHover && !props.disabled,\r\n 'text-gray-500 dark:text-gray-300': props.disabled,\r\n 'text-gray-600 dark:text-gray-200': !isActive && !props.disabled,\r\n 'font-medium text-gray-800 dark:text-gray-50': isActive,\r\n 'text-left': align === TableAlign.Left,\r\n 'text-center': align === TableAlign.Center,\r\n 'text-right': align === TableAlign.Right,\r\n 'px-1': hasPadding,\r\n 'p-0': !hasPadding,\r\n }\r\n ),\r\n },\r\n children\r\n )\r\n}\r\n\r\nexport function TableHeaderSortable({\r\n direction,\r\n ...props\r\n}: Omit, 'align'> & Partial & TableHeaderProps) {\r\n const isDisabled = props.disabled === true\r\n\r\n return (\r\n \r\n \r\n {props.align === TableAlign.Right && (\r\n \r\n )}\r\n {props.children}\r\n {props.align !== TableAlign.Right && (\r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface TableRowProps extends React.PropsWithChildren> {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n isHoverable?: boolean\r\n}\r\n\r\nexport const TableRow = React.forwardRef(\r\n ({ isFirst, isLast, isHoverable = true, ...props }: TableRowProps, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape, isSortByShape, useSortData } from '../../hooks/use-sort-data'\r\nimport { SortableValue } from '../../types'\r\n\r\nexport enum SortDirection {\r\n Ascending = 1,\r\n Descending = -1,\r\n}\r\n\r\nexport interface TableSort {\r\n column: ColumnType\r\n direction: SortDirection\r\n}\r\n\r\n/**\r\n * Default sort getter which either gets column matching by `defaultSortId` or returns the first column\r\n */\r\nexport function getDefaultSort(\r\n columns: ColumnType[],\r\n defaultSort?: DefaultSort\r\n): TableSort {\r\n if (defaultSort && typeof defaultSort === 'object') return defaultSort as unknown as TableSort\r\n\r\n const foundColumn = columns.find((column) => isSortByShape(column) && column.id === defaultSort)\r\n\r\n return {\r\n column: foundColumn ?? (defaultSort as unknown as ColumnType | undefined) ?? columns[0],\r\n direction: SortDirection.Ascending,\r\n }\r\n}\r\n\r\n/**\r\n * Get default sorting from url when persisting sort\r\n */\r\nexport function getDefaultSortFromUrl>(\r\n columns: ColumnType[],\r\n order?: string | null,\r\n idKey: keyof ColumnType = 'id'\r\n) {\r\n const isDesc = order?.startsWith('-')\r\n const queryParam = isDesc ? order?.substring(1) : order\r\n const column = columns.find((column) => column[idKey] === queryParam)\r\n\r\n if (column) {\r\n return { column, direction: isDesc ? SortDirection.Descending : SortDirection.Ascending }\r\n } else {\r\n return { column: columns[0], direction: SortDirection.Ascending }\r\n }\r\n}\r\n\r\nexport function saveSortToUrl>(\r\n prev: URLSearchParams,\r\n urlPersistKey: string,\r\n newSort: ColumnType,\r\n idKey: keyof ColumnType = 'id',\r\n defaultSort: unknown = null\r\n) {\r\n const newParams = new URLSearchParams(prev)\r\n const previousOrder = newParams.get(urlPersistKey) ?? defaultSort\r\n const isDescOrder = previousOrder?.toString().startsWith('-')\r\n newParams.set(urlPersistKey, `${!isDescOrder && previousOrder === newSort[idKey] ? '-' : ''}${newSort[idKey]}`)\r\n\r\n return newParams\r\n}\r\n\r\nexport function useTableSort<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort,\r\n>({\r\n data,\r\n columns,\r\n defaultSort,\r\n valueGetter,\r\n urlPersistKey,\r\n idKey = 'id',\r\n}: {\r\n data: DataType[]\r\n columns: ColumnType[]\r\n\r\n /**\r\n * When set, the sorting will be persisted in the URL. Loading the\r\n *\r\n * @default undefined\r\n */\r\n urlPersistKey?: string\r\n\r\n /**\r\n * Key to get value of the URL sort from a column\r\n * @deafult \"id\"\r\n */\r\n idKey?: keyof ColumnType\r\n\r\n /**\r\n * You can either provide id of the column or whole shape\r\n * defaultSort: { column: columns[0], direction: -1 }\r\n * If your ids are constants (or enums), you will get name suggestions\r\n */\r\n defaultSort?: DefaultSort\r\n\r\n /**\r\n * Custom value getter. By default these can be defined on every column using `getValueForSort`\r\n */\r\n valueGetter?: (column: ColumnType) => (row: DataType) => SortableValue\r\n}) {\r\n const [searchParams, setSearchParams] = useSearchParams()\r\n const defaultSortRef = React.useRef(\r\n urlPersistKey && typeof defaultSort === 'string'\r\n ? getDefaultSortFromUrl(columns, searchParams.get(urlPersistKey) ?? defaultSort, idKey)\r\n : getDefaultSort(columns, defaultSort)\r\n )\r\n const [sort, setSort] = React.useState(defaultSortRef.current)\r\n\r\n const changeSort = React.useCallback(\r\n (newSort: ColumnType) => {\r\n if (urlPersistKey) {\r\n setSearchParams(\r\n (prev) => saveSortToUrl(prev, urlPersistKey, newSort, idKey, defaultSortRef.current.column[idKey]),\r\n { preventScrollReset: true }\r\n )\r\n }\r\n\r\n setSort((prevSort) => {\r\n if (prevSort.column.id === newSort.id) {\r\n return { ...prevSort, direction: prevSort.direction * -1 } as TableSort\r\n }\r\n\r\n return { column: newSort, direction: SortDirection.Ascending }\r\n })\r\n },\r\n [idKey, setSearchParams, urlPersistKey]\r\n )\r\n\r\n /**\r\n * Update sort from url\r\n */\r\n React.useEffect(() => {\r\n if (!urlPersistKey) return\r\n\r\n const newSort = searchParams.get(urlPersistKey)\r\n if (newSort) {\r\n const sort = getDefaultSortFromUrl(columns, newSort, idKey)\r\n setSort(sort)\r\n }\r\n }, [columns, idKey, searchParams, urlPersistKey])\r\n\r\n const sortedData = useSortData({ data, direction: sort.direction, sortBy: sort.column, valueGetter })\r\n\r\n return {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport enum BoxRounding {\r\n none = '',\r\n regular = 'rounded-md', // 6px\r\n}\r\n\r\nexport enum BoxTheme {\r\n none = '',\r\n light = 'bg-white dark:bg-gray-800 border border-gray-100 dark:border-gray-600',\r\n dark = 'bg-gray-800 border border-gray-600',\r\n}\r\n\r\nexport interface BoxProps extends Omit, 'ref'> {\r\n rounding?: keyof typeof BoxRounding\r\n theme?: keyof typeof BoxTheme\r\n}\r\n\r\nexport const Box = React.forwardRef(function Box(\r\n { rounding = 'regular', theme = 'light', ...props }: BoxProps,\r\n ref: React.ForwardedRef\r\n) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n})\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonRounding, ButtonRoundingType } from '../button'\r\n\r\nexport enum GroupTheme {\r\n light,\r\n dark,\r\n}\r\n\r\nexport interface ButtonGroupProps {\r\n children: React.ReactNode\r\n\r\n /**\r\n * Border radius of entire group wrapper\r\n *\r\n * @default \"regular\"\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n className?: string\r\n\r\n /**\r\n * If a pipe divider between buttons should be rendered\r\n *\r\n * @default true\r\n */\r\n hasDivider?: boolean\r\n\r\n /**\r\n * If group wrapper has a border\r\n *\r\n * @default true\r\n */\r\n hasBorder?: boolean\r\n\r\n /**\r\n * Group color theme\r\n *\r\n * @default \"light\"\r\n */\r\n theme?: keyof typeof GroupTheme\r\n\r\n /**\r\n * Custom button component which extends Button\r\n *\r\n * @default undefined\r\n */\r\n childComponent?: string | React.JSXElementConstructor\r\n}\r\n\r\nfunction getGroupTheme(theme: GroupTheme) {\r\n switch (theme) {\r\n case GroupTheme.dark:\r\n return {\r\n wrapper: 'bg-gray-800 border-gray-600',\r\n divider: 'bg-gray-600',\r\n }\r\n default:\r\n return {\r\n wrapper: 'bg-white dark:bg-gray-800 border-gray-100 dark:border-gray-600',\r\n divider: 'bg-gray-100 dark:bg-gray-600',\r\n }\r\n }\r\n}\r\n\r\nexport function ButtonGroup({\r\n className,\r\n children,\r\n theme = 'light',\r\n hasDivider = true,\r\n hasBorder = true,\r\n rounding = 'regular',\r\n childComponent,\r\n}: ButtonGroupProps) {\r\n const buttonRounding = ButtonRounding[rounding]\r\n const groupTheme = React.useMemo(() => getGroupTheme(GroupTheme[theme]), [theme])\r\n return (\r\n \r\n {React.Children.map(children, (child, index) => {\r\n if (!React.isValidElement(child) || ![Button, childComponent].filter(Boolean).includes(child.type)) {\r\n return child\r\n }\r\n\r\n return (\r\n \r\n {hasDivider && index > 0 &&
}\r\n {React.cloneElement(child as React.ReactElement>, {\r\n rounding: child.props.rounding ?? 'none',\r\n theme: child.props.theme ?? (GroupTheme[theme] === GroupTheme.dark ? 'menuItemDark' : 'menuItem'),\r\n })}\r\n \r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { 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 '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 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}\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum ButtonPadding {\r\n none = '',\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}\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 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}\r\n\r\nexport enum ButtonRounding {\r\n none = '',\r\n small = 'rounded', // 4px\r\n regular = 'rounded-md', // 6px\r\n full = 'rounded-full', // 9999px\r\n}\r\n\r\nexport type ButtonRoundingType = keyof typeof ButtonRounding\r\n\r\nexport enum ButtonTheme {\r\n transparent, // Only basic shape is rendered\r\n light,\r\n dark,\r\n blue,\r\n violet,\r\n blueHover,\r\n red,\r\n headerItem,\r\n menuItem,\r\n menuItemDark,\r\n opacity,\r\n outline,\r\n chipTransparent,\r\n chip,\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(theme: ButtonTheme, active = false) {\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 disabled:bg-gray-50 disabled:text-gray-400 disabled:hover:bg-gray-50 disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500 dark:disabled:bg-gray-700 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-700 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-gray-50 hover:bg-gray-100 dark:bg-gray-700 dark:hover:bg-gray-600': !active,\r\n 'bg-gray-200 dark:bg-gray-500': 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 disabled:bg-gray-700 disabled:text-gray-300 disabled:hover:bg-gray-700 disabled:hover:text-gray-300',\r\n {\r\n 'bg-gray-700 hover:bg-gray-600': !active,\r\n 'bg-gray-500': 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 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-400 hover:bg-violet-500': !active,\r\n 'bg-violet-600': 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-50 disabled:text-gray-400 disabled:hover:text-gray-400 dark:hover:bg-gray-700': !active,\r\n 'bg-gray-50 dark:bg-gray-700': active,\r\n }\r\n ),\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 'border border-gray-100 active:border-blue-400 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:border-gray-600 dark:bg-gray-800 dark:text-gray-50 dark:active:border-blue-400 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 'hover:border-gray-300 dark:hover:border-gray-400': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.chip:\r\n return {\r\n button: classnames('border dark:disabled:hover:bg-gray-700 disabled:hover:bg-gray-50', {\r\n 'border-transparent bg-gray-50 hover:bg-gray-100 dark:bg-gray-700 dark:hover:bg-gray-600': !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:border-blue-400 dark:bg-gray-700 dark:text-white': active,\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-100 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200':\r\n !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': active,\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, 'ref' | 'type' | 'size' | 'content' | 'align'>\r\n\r\nexport interface ButtonProps {\r\n /**\r\n * Visual appearance of the button\r\n */\r\n theme?: ButtonThemeType\r\n\r\n /**\r\n * Sets if button is square or normal.\r\n *\r\n * @default 'regular'\r\n */\r\n appearance?: 'regular' | 'square'\r\n\r\n /**\r\n * Size of the button\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: ButtonSizeType\r\n\r\n /**\r\n * Override align of the text for a button\r\n *\r\n * @default center, left when `leftContent` or `rightContent` are defined\r\n */\r\n align?: keyof typeof ButtonAlign\r\n\r\n /**\r\n * Override button padding\r\n *\r\n * @default undefined\r\n */\r\n padding?: keyof typeof ButtonPadding\r\n\r\n /**\r\n * Render button in an active state (darker background, etc.)\r\n */\r\n active?: boolean\r\n\r\n /**\r\n * Sets if the button has focus ring\r\n *\r\n * @default true\r\n */\r\n focusRing?: boolean\r\n\r\n /**\r\n * Sets rounded corners for the button\r\n *\r\n * @default regular\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n /**\r\n * Class for the content wrapper\r\n */\r\n contentClass?: string\r\n\r\n /**\r\n * Name of left icon\r\n */\r\n leftContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Name of right icon\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n}\r\n\r\nexport type ButtonComponentProps =\r\n PropsWithAs & ButtonProps\r\n\r\nfunction ButtonComponent(\r\n {\r\n as: asComponent,\r\n theme = 'light',\r\n size = 'regular',\r\n rounding = 'regular',\r\n focusRing = true,\r\n appearance = 'regular',\r\n align,\r\n padding = size, // same as size\r\n active,\r\n contentClass,\r\n leftContent,\r\n rightContent,\r\n className,\r\n children,\r\n ...props\r\n }: ButtonComponentProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const isSquare = appearance === 'square'\r\n const buttonTheme = React.useMemo(() => getButtonTheme(ButtonTheme[theme], active), [theme, active])\r\n const buttonPadding = React.useMemo(() => (isSquare ? null : ButtonPadding[padding]), [isSquare, padding])\r\n const buttonSize = isSquare ? ButtonSquareSize[size] : ButtonSize[size]\r\n const buttonRounding = ButtonRounding[rounding]\r\n const hasIcons = leftContent || rightContent\r\n\r\n return React.createElement(\r\n asComponent ?? BUTTON_DEFAULT_ELEMENT,\r\n {\r\n ...props,\r\n ref,\r\n className: classnames(\r\n BUTTON_BASE_CLASS,\r\n buttonTheme.button,\r\n buttonPadding,\r\n buttonSize,\r\n buttonRounding,\r\n {\r\n [BUTTON_SQUARE_BASE_CLASS]: isSquare,\r\n [BUTTON_FOCUS_STYLES]: focusRing,\r\n },\r\n className\r\n ),\r\n },\r\n <>\r\n {leftContent && (\r\n
\r\n {isValidIconName(leftContent) ? : leftContent}\r\n
\r\n )}\r\n {children && !isSquare ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n children\r\n )}\r\n {rightContent && (\r\n
\r\n {isValidIconName(rightContent) ? : rightContent}\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const Button = React.forwardRef(ButtonComponent) as <\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & ButtonProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef } from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\ninterface CheckboxProps extends Omit, 'label'> {\r\n /**\r\n * Text that gets displayed on the right side of the checkbox\r\n */\r\n label?: ReactNode\r\n\r\n checked: boolean\r\n isSmall?: boolean\r\n}\r\n\r\nfunction CheckboxComponent(\r\n { className, label, isSmall, children, ...props }: PropsWithChildren,\r\n ref: ForwardedRef\r\n) {\r\n const checked = props.checked ?? props.defaultChecked\r\n\r\n return (\r\n \r\n
\r\n \r\n {checked && }\r\n
\r\n {label ?? children}\r\n \r\n )\r\n}\r\n\r\nexport const Checkbox = forwardRef(CheckboxComponent)\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren, memo, useCallback, useLayoutEffect, useRef, useState } from 'react'\r\n\r\nexport interface Interaction {\r\n left: number\r\n top: number\r\n}\r\n\r\n/**\r\n * Clamp value between two bounds\r\n */\r\nfunction clamp(num: number, min = 0, max = 1) {\r\n return num > max ? max : num < min ? min : num\r\n}\r\n\r\n/**\r\n * Check if an event was triggered by touch\r\n */\r\nfunction isTouch(event: MouseEvent | TouchEvent): event is TouchEvent {\r\n return 'touches' in event\r\n}\r\n\r\n/**\r\n * Returns a relative position of the pointer inside the node's bounding box\r\n */\r\nfunction getRelativePosition(node: HTMLDivElement, event: MouseEvent | TouchEvent): Interaction {\r\n const rect = node.getBoundingClientRect()\r\n\r\n // Get user's pointer position from `touches` array if it's a `TouchEvent`\r\n const pointer = isTouch(event) ? event.touches[0] : (event as MouseEvent)\r\n\r\n return {\r\n left: clamp((pointer.pageX - (rect.left + window.pageXOffset)) / rect.width),\r\n top: clamp((pointer.pageY - (rect.top + window.pageYOffset)) / rect.height),\r\n }\r\n}\r\n\r\n/**\r\n * Browsers introduced an intervention, making touch events passive by default.\r\n * This workaround removes `preventDefault` call from the touch handlers.\r\n * @see https://github.com/facebook/react/issues/19651\r\n */\r\nfunction preventDefaultMove(event: MouseEvent | TouchEvent) {\r\n !isTouch(event) && event.preventDefault()\r\n}\r\n\r\ninterface Props {\r\n onMove: (interaction: Interaction) => void\r\n onKey: (offset: Interaction) => void\r\n}\r\n\r\nfunction DraggablePickerComponent({\r\n onMove,\r\n onKey,\r\n className,\r\n ...props\r\n}: PropsWithChildren & HTMLProps) {\r\n const container = useRef(null)\r\n const hasTouched = useRef(false)\r\n const [isDragging, setDragging] = useState(false)\r\n\r\n /**\r\n * Prevent mobile browsers from handling mouse events (conflicting with touch ones).\r\n * If we detected a touch interaction before, we prefer reacting to touch events only.\r\n */\r\n const isValid = useRef((event: MouseEvent | TouchEvent): boolean => {\r\n if (hasTouched.current && !isTouch(event)) return false\r\n if (!hasTouched.current) hasTouched.current = isTouch(event)\r\n return true\r\n })\r\n\r\n const handleMove = useCallback(\r\n (event: MouseEvent | TouchEvent) => {\r\n preventDefaultMove(event)\r\n\r\n // If user moves the pointer outside of the window or iframe bounds and release it there,\r\n // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor\r\n // after the user has moved the mouse/finger back to the document, we check `event.buttons`\r\n // and `event.touches`. It allows us to detect that the user is just moving his pointer\r\n // without pressing it down\r\n const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0\r\n\r\n if (isDown && container.current) {\r\n onMove(getRelativePosition(container.current, event))\r\n } else {\r\n setDragging(false)\r\n }\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleMoveStart = useCallback(\r\n ({ nativeEvent }: React.MouseEvent | React.TouchEvent) => {\r\n preventDefaultMove(nativeEvent)\r\n\r\n if (!isValid.current(nativeEvent)) return\r\n\r\n // The node/ref must actually exist when user start an interaction.\r\n // We won't suppress the ESLint warning though, as it should probably be something to be aware of.\r\n onMove(getRelativePosition(container.current!, nativeEvent))\r\n setDragging(true)\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n const keyCode = event.which || event.keyCode\r\n\r\n // Ignore all keys except arrow ones\r\n if (keyCode < 37 || keyCode > 40) return\r\n // Do not scroll page by arrow keys when document is focused on the element\r\n event.preventDefault()\r\n // Send relative offset to the parent component.\r\n // We use codes (37←, 38↑, 39→, 40↓) instead of keys ('ArrowRight', 'ArrowDown', etc)\r\n // to reduce the size of the library\r\n onKey({\r\n left: keyCode === 39 ? 0.05 : keyCode === 37 ? -0.05 : 0,\r\n top: keyCode === 40 ? 0.05 : keyCode === 38 ? -0.05 : 0,\r\n })\r\n },\r\n [onKey]\r\n )\r\n\r\n const handleMoveEnd = useCallback(() => setDragging(false), [])\r\n\r\n const toggleDocumentEvents = useCallback(\r\n (state) => {\r\n // add or remove additional pointer event listeners\r\n const toggleEvent = state ? window.addEventListener : window.removeEventListener\r\n toggleEvent(hasTouched.current ? 'touchmove' : 'mousemove', handleMove)\r\n toggleEvent(hasTouched.current ? 'touchend' : 'mouseup', handleMoveEnd)\r\n },\r\n [handleMove, handleMoveEnd]\r\n )\r\n\r\n useLayoutEffect(() => {\r\n toggleDocumentEvents(isDragging)\r\n return () => {\r\n isDragging && toggleDocumentEvents(false)\r\n }\r\n }, [isDragging, toggleDocumentEvents])\r\n\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport const DraggablePicker = memo(DraggablePickerComponent)\r\n","interface PointerProps {\r\n className?: string\r\n top?: number\r\n left: number\r\n color: string\r\n}\r\n\r\nexport function Pointer({ color, left, top = 0.5 }: PointerProps) {\r\n return (\r\n \r\n
\r\n
\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `app/utils/colors.ts` in charts repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string) {\r\n const isRgb = getIsRgb(strColor)\r\n\r\n if (isRgb) {\r\n return rgbaToHexString(rgbaStringToObject(strColor), true)\r\n }\r\n\r\n return strColor\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Alpha({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, a: 1 - pos.left }), [onChange, color])\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ ...color, a: 1 })\r\n const gradientTo = hsvaToHEXString({ ...color, a: 0 }, true)\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n // Don’t recalculate when alpha changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [color.h, color.s, color.v])\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { Icon } from '../icon'\r\nimport { HSVA, hexStringToHSVA } from './util'\r\n\r\nconst DEFAULT_COLORS = [\r\n { title: 'Rose', value: '#f43f5e' },\r\n { title: 'Pink', value: '#db2777' },\r\n { title: 'Fuchsia', value: '#c026d3' },\r\n { title: 'Purple', value: '#9333ea' },\r\n { title: 'Violet', value: '#7c3aed' },\r\n { title: 'Indigo', value: '#4f46e5' },\r\n { title: 'Blue', value: '#2563eb' },\r\n { title: 'Light Blue', value: '#0284c7' },\r\n { title: 'Cyan', value: '#0891b2' },\r\n { title: 'Teal', value: '#0d9488' },\r\n { title: 'Emerald', value: '#059669' },\r\n { title: 'Green', value: '#16a34a' },\r\n { title: 'Lime', value: '#65a30d' },\r\n { title: 'Yellow', value: '#eab308' },\r\n { title: 'Amber', value: '#d97706' },\r\n { title: 'Red', value: '#dc2626' },\r\n]\r\n\r\ninterface ColorItem {\r\n /**\r\n * Name of the color\r\n */\r\n title: string\r\n\r\n /**\r\n * Hex value\r\n */\r\n value: string\r\n}\r\n\r\ninterface ColorPaletteProps {\r\n /**\r\n * Current selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * List of colors to display in the palette\r\n *\r\n * @default DEFAULT_COLORS\r\n */\r\n colors?: ColorItem[]\r\n\r\n /**\r\n * Callback when user picks a color\r\n */\r\n onChange: (color: string, originalColor: HSVA) => void\r\n}\r\n\r\nexport function ColorPalette({ color, colors = DEFAULT_COLORS, onChange }: ColorPaletteProps) {\r\n const lowerCaseColor = color.toLowerCase()\r\n\r\n return (\r\n
\r\n {colors.map((colorObj) => {\r\n const isSelected = lowerCaseColor.startsWith(colorObj.value)\r\n return (\r\n onChange(colorObj.value, hexStringToHSVA(colorObj.value))}\r\n >\r\n {isSelected && }\r\n
\r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface HueSaturationProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nfunction getPositionFromHSLA(color: HSVA) {\r\n return {\r\n left: color.h / 360,\r\n top: 1 - color.s,\r\n }\r\n}\r\n\r\nexport function HueSaturation({ color, onChange }: HueSaturationProps) {\r\n const position = useMemo(() => getPositionFromHSLA(color), [color])\r\n\r\n const colorPreview = useMemo(() => hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 }), [color.h, color.s])\r\n\r\n const changeSaturation = useCallback(\r\n (pos: Interaction) =>\r\n onChange({\r\n h: Math.round(pos.left * 360),\r\n s: 1 - pos.top,\r\n v: 1,\r\n a: color.a,\r\n }),\r\n [color.a, onChange]\r\n )\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Lightness({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, v: 1 - pos.left }), [onChange, color])\r\n\r\n const colorPreview = useMemo(\r\n () => hsvaToHEXString({ h: color.h, s: color.s, v: color.v, a: 1 }),\r\n [color.h, color.s, color.v]\r\n )\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 })\r\n const gradientTo = hsvaToHEXString({ h: color.h, s: color.s, v: 0, a: 1 })\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n }, [color.h, color.s])\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { getIsColorTooLightOrTransparent, hexStringToRGBA } from './util'\r\n\r\ninterface ColorPreviewProps {\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * One or more colors to show in the preview\r\n */\r\n color: string | string[]\r\n\r\n /**\r\n * Wrapper classname\r\n */\r\n className?: string\r\n}\r\n\r\nexport function ColorPreview({ icon, color, className }: ColorPreviewProps) {\r\n const colors = Array.isArray(color) ? color : [color]\r\n const isTooLight = getIsColorTooLightOrTransparent(hexStringToRGBA(colors[0]))\r\n return (\r\n \r\n {icon && (\r\n
\r\n {isValidIconName(icon) ? (\r\n \r\n ) : (\r\n icon\r\n )}\r\n
\r\n )}\r\n {colors.map((color, index) => (\r\n //   has to be there because of a bug on safari which ignores h-full when empty element\r\n
\r\n  \r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ForwardedRef, useCallback, useEffect, useState } from 'react'\r\n\r\nimport { Input, InputComponentProps } from '../input'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPickerProps } from './picker'\r\nimport * as colorUtil from './util'\r\n\r\ninterface PickerInputProps extends Omit {\r\n color: ColorPickerProps['color']\r\n onChange: ColorPickerProps['onChange']\r\n\r\n /*\r\n * Is color preview square visible\r\n *\r\n * @default true\r\n * */\r\n hasColorPreview?: boolean\r\n}\r\nexport const PickerInput = React.forwardRef(\r\n (\r\n { color, inputClass, hasColorPreview = true, onChange, ...props }: PickerInputProps,\r\n ref: ForwardedRef\r\n ) => {\r\n const [colorInput, setColorInput] = useState(colorUtil.removeHashSymbol(color))\r\n const isRgba = colorUtil.getIsRgb(colorInput)\r\n\r\n useEffect(() => {\r\n setColorInput(colorUtil.removeHashSymbol(color))\r\n }, [color])\r\n\r\n const handleColorInputChange = useCallback(\r\n (event) => {\r\n const value = colorUtil.removeHashSymbol(event.currentTarget.value)\r\n const isRgba = value.startsWith('rgba')\r\n const colorValue = isRgba ? value : `#${value}`\r\n\r\n setColorInput(value)\r\n if ((value.length >= 6 || (isRgba && value.length >= 16)) && colorUtil.isValidColor(colorValue)) {\r\n onChange(colorValue, colorUtil.hexStringToHSVA(colorValue))\r\n }\r\n },\r\n [onChange]\r\n )\r\n return (\r\n \r\n {hasColorPreview && (\r\n
\r\n \r\n
\r\n )}\r\n {!isRgba && #}\r\n
\r\n }\r\n onChange={handleColorInputChange}\r\n />\r\n )\r\n }\r\n)\r\n","import classnames from 'classnames'\r\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button } from '../button'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Alpha } from './alpha'\r\nimport { ColorPalette } from './color-palette'\r\nimport { HueSaturation } from './hue-saturation'\r\nimport { Lightness } from './lightness'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\nexport interface ColorPickerProps {\r\n /**\r\n * The selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * Whether or not the user is able to select custom color\r\n *\r\n * @default true\r\n */\r\n canSelectCustom?: boolean\r\n\r\n /**\r\n * Whether or not the user is able to change alpha channel. Only applicable\r\n * when `canSelectCustom` is true\r\n *\r\n * @default true\r\n */\r\n canSelectAlpha?: boolean\r\n\r\n /**\r\n * Sets the output format for the color picker\r\n *\r\n * @default 'hex'\r\n */\r\n outputFormat?: 'hex' | 'rgba'\r\n\r\n /**\r\n * Callback when user changes color. Use the second parameter to do color space\r\n * conversions otherwise the color could differ due to rounding\r\n */\r\n onChange: (color: string, originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Callback when user clicks on a palette item. Used to close popover\r\n */\r\n onPaletteItemClick?: () => void\r\n}\r\n\r\nexport function ColorPicker({\r\n color,\r\n canSelectCustom = true,\r\n canSelectAlpha = true,\r\n outputFormat = 'hex',\r\n onChange,\r\n onPaletteItemClick,\r\n}: ColorPickerProps) {\r\n const cachedColor = useRef(color)\r\n const [hsvaColor, setColor] = useState(colorUtil.getHSVAFromColor(color))\r\n\r\n /**\r\n * Update state if the color from outside changed\r\n */\r\n useEffect(() => {\r\n const currentColor = colorUtil.removeHashSymbol(cachedColor.current)\r\n const newColor = colorUtil.removeHashSymbol(color)\r\n\r\n if (currentColor === newColor || !colorUtil.isValidColor(newColor)) return\r\n\r\n cachedColor.current = color\r\n setColor(colorUtil.getHSVAFromColor(color))\r\n }, [color])\r\n\r\n /**\r\n * Handle color change\r\n * 1. update cache so we can correctly check when outside color updates\r\n * 2. Update internal color representation\r\n * 3. call onChange with string color\r\n */\r\n const onChangeCallback = useCallback(\r\n (color: colorUtil.HSVA) => {\r\n const stringColor = colorUtil.stringifyHSVAColor(color, outputFormat, canSelectAlpha)\r\n cachedColor.current = stringColor\r\n onChange(stringColor, color)\r\n setColor(color)\r\n },\r\n [onChange, canSelectAlpha, outputFormat]\r\n )\r\n\r\n const onSetCustomCodeClick = useCallback(() => {\r\n const value = prompt('Enter a color code')?.trim()\r\n\r\n if (!value) return\r\n\r\n const isValid = colorUtil.isValidColor(value)\r\n\r\n if (!isValid) {\r\n return alert('The code is not a valid color')\r\n }\r\n\r\n onChangeCallback(colorUtil.getHSVAFromColor(value))\r\n }, [onChangeCallback])\r\n\r\n return (\r\n
\r\n {canSelectCustom && (\r\n <>\r\n {isMobile() && (\r\n \r\n )}\r\n \r\n \r\n\r\n {canSelectAlpha && }\r\n \r\n )}\r\n\r\n \r\n {\r\n onPaletteItemClick?.()\r\n onChangeCallback({ ...orignalColor, a: hsvaColor.a })\r\n }}\r\n />\r\n
\r\n \r\n )\r\n}\r\n\r\ninterface InputColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for the input\r\n */\r\n label?: ReactNode\r\n inputDataTestId?: string\r\n}\r\n\r\nexport function InputColorPicker({ label, inputDataTestId, onChange, ...props }: InputColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const canSelectCustom = props.canSelectCustom !== false\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {\r\n if (canSelectCustom) return\r\n popoverState.hide()\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button, ButtonComponentProps, ButtonRounding, ButtonSizeType } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { IconNameType } from '../icon'\r\nimport { Popover, PopoverProps, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPicker, ColorPickerProps } from './picker'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\ninterface MultiColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n}\r\n\r\nexport function MultiColorPicker({\r\n colorInputLabel,\r\n onChange,\r\n canSelectCustom = true,\r\n ...props\r\n}: MultiColorPickerProps) {\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n {canSelectCustom && !isMobileDevice && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n {}} />\r\n \r\n \r\n )\r\n}\r\n\r\ninterface ColorTabButtonProps extends ButtonComponentProps {\r\n /*\r\n * Preview color\r\n * */\r\n color: string\r\n}\r\n\r\nexport function ColorTabButton({ color, children, ...props }: ColorTabButtonProps) {\r\n return (\r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n\r\ntype ButtonColorProperties = { color: string; label: string }\r\n\r\ninterface ButtonColorPickerProps\r\n extends Omit {\r\n /**\r\n * Temporary prop to enable/disable multi picker funcionality,\r\n * in the future we'll only use secondaryColor prop to decide if the picker is multi picker or not\r\n *\r\n * @default undefined\r\n */\r\n isMultiPicker?: boolean\r\n\r\n /**\r\n * Button classname\r\n */\r\n className?: string\r\n\r\n /**\r\n * Array of objects with color and value\r\n */\r\n colors: ColorType[]\r\n\r\n /**\r\n * Color onchange callback\r\n */\r\n onChange: (colors: ColorType[], originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Button size\r\n *\r\n * @default undefined\r\n */\r\n size?: ButtonSizeType\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Hides color picker when clicked outside of popover,\r\n * works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside: PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Popover overlay click callback, if nothing's provided it calls hide when clicked outside of popover on its overlay\r\n * If false is provided, overlay click calls hide func on popover state object\r\n *\r\n * @default undefined\r\n */\r\n onOverlayClick?: (() => void) | false\r\n\r\n /**\r\n * Identifier for e2e testing\r\n *\r\n * @default undefined\r\n */\r\n buttonPickerDataTestId?: string\r\n}\r\n\r\nexport function ButtonColorPicker({\r\n size,\r\n icon,\r\n colors,\r\n className,\r\n onChange,\r\n buttonPickerDataTestId,\r\n hideOnClickOutside = true,\r\n onOverlayClick,\r\n ...props\r\n}: ButtonColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const isMultiPicker = !!props.isMultiPicker && colors.length > 1\r\n const [activeColorIndex, setActiveColorIndex] = React.useState(0)\r\n const handleColorChange = React.useCallback(\r\n (color: string, originalColor: colorUtil.HSVA) => {\r\n onChange(\r\n colors.map((colorObject, index) => (index === activeColorIndex ? { ...colorObject, color } : colorObject)),\r\n originalColor\r\n )\r\n },\r\n [activeColorIndex, colors, onChange]\r\n )\r\n return (\r\n <>\r\n \r\n color)}\r\n className={classnames('h-full w-full', ButtonRounding.small)}\r\n />\r\n \r\n \r\n {isMultiPicker && (\r\n
\r\n \r\n {colors.map(({ color, label }, index) => (\r\n setActiveColorIndex(index)}\r\n >\r\n {label}\r\n \r\n ))}\r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n )\r\n}\r\n","/**\r\n * Used for reakit as the duration of a open/close animation. The animation itself is done using css\r\n */\r\nexport const COMPONENT_ANIMATION_DURATION = 250\r\n","import copy from 'copy-to-clipboard'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { InputProps, Textarea } from '../input'\r\n\r\ninterface Props extends Pick {\r\n className?: string\r\n text: string\r\n bottomLeftContent?: React.ReactNode\r\n}\r\n\r\nexport const CopyToClipboard: React.FC = ({ className, label, text, bottomLeftContent }) => {\r\n const [isCopied, setIsCopied] = React.useState(false)\r\n\r\n const handleCopyToClipboard = React.useCallback(() => {\r\n setIsCopied(true)\r\n copy(text)\r\n }, [text])\r\n\r\n React.useEffect(() => {\r\n let timeout: NodeJS.Timeout\r\n const resetTimer = () => {\r\n if (!timeout) return\r\n clearTimeout(timeout)\r\n }\r\n if (isCopied) {\r\n resetTimer()\r\n timeout = setTimeout(() => {\r\n setIsCopied(false)\r\n }, 2000)\r\n }\r\n\r\n return () => {\r\n resetTimer()\r\n }\r\n }, [isCopied])\r\n\r\n return (\r\n
\r\n e.currentTarget.select()}\r\n inputClass=\"h-12\"\r\n data-testid=\"copy-to-clipboard-textarea\"\r\n value={text}\r\n />\r\n
\r\n {bottomLeftContent &&
{bottomLeftContent}
}\r\n \r\n {isCopied ? 'Copied' : 'Copy'}\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { CalendarProps } from 'react-calendar'\r\n\r\nimport { Box } from '../box'\r\nimport { ZIndexContext, getExtendedDialogState } from '../dialog'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Spinner } from '../spinner'\r\n\r\nconst DatePickerComponent = React.lazy(() => import('./picker'))\r\n\r\ntype RangePickerCallback = (value: [Date, Date], ev: React.ChangeEvent) => void\r\ntype PickerCallback = (value: Date, ev: React.ChangeEvent) => void\r\n\r\ninterface DatePickerProps extends Omit {\r\n /**\r\n * Trigger element for the picker\r\n */\r\n children: JSX.Element\r\n\r\n onChange: PickerCallback | RangePickerCallback\r\n\r\n zIndex?: string\r\n}\r\n\r\nexport function StatelessDatePicker({\r\n state,\r\n children,\r\n zIndex,\r\n ...props\r\n}: DatePickerProps & { state: ReturnType; zIndex?: string }) {\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n return (\r\n <>\r\n \r\n {(triggerProps: React.HTMLProps) =>\r\n React.Children.map(children, (child) => {\r\n if (React.isValidElement(child))\r\n return React.cloneElement(child, { ...triggerProps, ...(child.props as any) })\r\n })\r\n }\r\n \r\n {!isFullyClosed && (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n ) => {\r\n state.hide()\r\n props.onChange?.(value, ev)\r\n }}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport function DatePicker(props: DatePickerProps) {\r\n const popover = usePopoverState()\r\n\r\n return \r\n}\r\n","import * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Dialog'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport const ZIndexContext = React.createContext('z-50')\r\n\r\nexport function useZIndex() {\r\n return React.useContext(ZIndexContext)\r\n}\r\n\r\nexport type DialogStateReturn = ReturnType\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function useDialogState(settings?: Reakit.DialogInitialState) {\r\n return Reakit.useDialogState({ ...settings, animated: COMPONENT_ANIMATION_DURATION })\r\n}\r\n\r\nexport const DialogDragContext = React.createContext<{\r\n enabled?: boolean\r\n handleRef?: React.RefObject\r\n boxPosition: { x: number; y: number }\r\n resetBoxPosition: () => void\r\n setBoxPosition: React.Dispatch>\r\n}>({\r\n enabled: false,\r\n handleRef: undefined,\r\n boxPosition: { x: 0, y: 0 },\r\n resetBoxPosition: () => {},\r\n setBoxPosition: () => {},\r\n})\r\n\r\n/**\r\n * Hook which allows an element on the page to become draggable\r\n */\r\nexport function useDrag(enabled?: boolean) {\r\n const dragging = React.useRef(false)\r\n const handleRef = React.useRef(null)\r\n const handleElement = handleRef.current\r\n\r\n /**\r\n * Set box position in both state for the component to re-render and as a ref\r\n * so that we don’t have to re-run the whole effect on every change\r\n */\r\n const [boxPosition, setBoxPosition] = React.useState({ x: 0, y: 0 })\r\n const boxPositionRef = React.useRef({ x: 0, y: 0 })\r\n const dragDiff = React.useRef({ x: 0, y: 0 })\r\n\r\n const { current: resetBoxPosition } = React.useRef(() => {\r\n setBoxPosition({ x: 0, y: 0 })\r\n })\r\n\r\n React.useEffect(() => {\r\n boxPositionRef.current = { ...boxPosition }\r\n }, [boxPosition])\r\n\r\n React.useEffect(() => {\r\n if (!enabled || !handleElement || isMobile()) return\r\n\r\n const onMouseDown = (ev: MouseEvent) => {\r\n dragging.current = true\r\n\r\n dragDiff.current = {\r\n x: ev.pageX - boxPositionRef.current.x - window.scrollX,\r\n y: ev.pageY - boxPositionRef.current.y - window.scrollY,\r\n }\r\n }\r\n\r\n const onMouseUp = () => {\r\n dragging.current = false\r\n }\r\n\r\n const onMouseMove = (ev: MouseEvent) => {\r\n if (!dragging.current) return\r\n\r\n const x = ev.pageX - dragDiff.current.x - window.scrollX\r\n const y = ev.pageY - dragDiff.current.y - window.scrollY\r\n\r\n setBoxPosition({ x, y })\r\n }\r\n\r\n handleElement.addEventListener('pointerdown', onMouseDown)\r\n handleElement.addEventListener('dblclick', resetBoxPosition)\r\n window.addEventListener('pointerup', onMouseUp)\r\n document.body.addEventListener('pointermove', onMouseMove)\r\n\r\n return () => {\r\n handleElement.removeEventListener('pointerdown', onMouseDown)\r\n handleElement.removeEventListener('dblclick', resetBoxPosition)\r\n window.removeEventListener('pointerup', onMouseUp)\r\n document.body.removeEventListener('pointermove', onMouseMove)\r\n }\r\n }, [enabled, handleElement, resetBoxPosition])\r\n\r\n return {\r\n enabled,\r\n handleRef,\r\n boxPosition,\r\n setBoxPosition,\r\n resetBoxPosition,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { useElementMeasure } from '../../hooks/use-element-measure'\r\nimport { Box, BoxProps } from '../box'\r\nimport { DialogDragContext } from './hooks'\r\n\r\n/**\r\n * Public props for the component\r\n */\r\nexport type DialogBoxProps = BoxProps\r\n\r\ninterface DialogBoxOwnProps extends DialogBoxProps {\r\n /**\r\n * This callback serves as a way to account for the time between dialog close\r\n * and animation finish. The box isn’t rendered when the dialog closes but we still\r\n * want to display content when the dialog is closing\r\n */\r\n onUnmount?: () => void\r\n}\r\n\r\n/**\r\n * Dialog content container\r\n */\r\nexport function DialogBox({ onUnmount, style, ...props }: React.PropsWithChildren) {\r\n const wrapperRef = React.useRef(null)\r\n const { setElementRef, elementHeight } = useElementMeasure()\r\n const dialogDrag = React.useContext(DialogDragContext)\r\n\r\n React.useEffect(() => {\r\n const onResize = () => {\r\n const { top = 0, bottom = 0, left = 0, right = 0 } = dialogDrag.handleRef?.current?.getBoundingClientRect() ?? {}\r\n const { clientHeight, clientWidth } = window.document.documentElement\r\n if (top < 0 || bottom > clientHeight || left < 0 || right > clientWidth) {\r\n dialogDrag.resetBoxPosition()\r\n }\r\n }\r\n\r\n window.addEventListener('resize', onResize)\r\n onResize()\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize)\r\n onUnmount?.()\r\n }\r\n // Set up an effect which only calls resetBoxPosition which is ref fn with state setter call and the unmount callback\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n setElementRef(wrapperRef.current)\r\n }, [setElementRef])\r\n\r\n React.useEffect(() => {\r\n dialogDrag.setBoxPosition((prevPosition) => {\r\n const { top = 0 } = dialogDrag.handleRef?.current?.getBoundingClientRect() ?? {}\r\n return { ...prevPosition, y: prevPosition.y - Math.min(top, 0) }\r\n })\r\n // We want to call it only on elementHeight change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [elementHeight])\r\n\r\n const dialogBoxStyle = React.useMemo(() => {\r\n if (dialogDrag.enabled) {\r\n return { ...style, transform: `translate3d(${dialogDrag.boxPosition.x}px, ${dialogDrag.boxPosition.y}px, 0)` }\r\n }\r\n return style\r\n }, [style, dialogDrag])\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\n/**\r\n * The backdrop of the dialog, closes the dialog on click\r\n */\r\nexport function DialogOverlay(props: React.HTMLProps) {\r\n return (\r\n \r\n )\r\n}\r\n","export function getExtendedDialogState(state: { visible: boolean; animating: boolean }) {\r\n return {\r\n isFullyOpened: state.visible && !state.animating,\r\n isFullyClosed: !state.visible && !state.animating,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Dialog'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { ChildPosition, getFlexAlignClasses } from '../../util'\r\nimport { DialogBox, DialogBoxProps } from './dialog-box'\r\nimport { DialogOverlay } from './dialog-overlay'\r\nimport { DialogDragContext, DialogStateReturn, ZIndexContext, useDrag } from './hooks'\r\nimport { getExtendedDialogState } from './utils'\r\n\r\nexport enum DialogType {\r\n modal,\r\n drawer,\r\n}\r\n\r\nexport interface DialogProps extends DialogBoxProps, Pick {\r\n /**\r\n * The returned object from `useDialogState`\r\n */\r\n state: DialogStateReturn\r\n\r\n /**\r\n * Any additional props to the Reakit Dialog component\r\n */\r\n finalFocusRef?: React.RefObject\r\n\r\n /**\r\n * Callback which is called when the dialog closes and all animations complete\r\n */\r\n onHide?: () => void\r\n\r\n /**\r\n * Callback which is called when the dialog overlay is clicked\r\n * default behavior (closing the dialog) will be overridden so it has to be called manually\r\n */\r\n onOverlayClick?: () => void\r\n\r\n /**\r\n * Sets if the dialog can be dragged across the screen\r\n *\r\n * @default false\r\n */\r\n isDraggable?: boolean\r\n\r\n /**\r\n * Type of dialog\r\n *\r\n * @default modal\r\n */\r\n type?: keyof typeof DialogType\r\n\r\n /**\r\n * Dialog position on the screen\r\n *\r\n * @default center\r\n */\r\n position?: keyof typeof ChildPosition\r\n\r\n overlayClass?: string\r\n\r\n /**\r\n * Sets if backdrop overlay prevents interaction with rest of page, onOverlayClick will have no effect if isBackdropDisabled is true\r\n *\r\n * @default false\r\n */\r\n isBackdropDisabled?: boolean\r\n}\r\n\r\nconst DIALOG_BACKDROP_WIDTH_CSS_VAR = '--dialog-backgrop-width'\r\n\r\nconst onResize = () => {\r\n // Save to css var because it can change and that could make modal dialog jump on open\r\n document.body.style.setProperty(DIALOG_BACKDROP_WIDTH_CSS_VAR, `${document.documentElement.clientWidth}px`)\r\n}\r\n\r\n/**\r\n * The actual dialog component which renders overlay, box and handles all the\r\n * functionality like focus trapping, etc.\r\n */\r\nexport function Dialog({\r\n state,\r\n finalFocusRef,\r\n onHide,\r\n onOverlayClick,\r\n children,\r\n hide,\r\n hideOnEsc,\r\n isDraggable = false,\r\n position = 'center',\r\n isBackdropDisabled = false,\r\n type = 'modal',\r\n overlayClass,\r\n 'aria-label': ariaLabel,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const dialogDrag = useDrag(isDraggable)\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n\r\n React.useEffect(() => {\r\n if (isFullyClosed) {\r\n return\r\n }\r\n\r\n window.addEventListener('resize', onResize)\r\n onResize()\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize)\r\n }\r\n }, [isFullyClosed])\r\n\r\n if (isFullyClosed) {\r\n return null\r\n }\r\n\r\n const DialogWrapper = state.modal ? React.Fragment : Portal\r\n return (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n {!isBackdropDisabled && (\r\n \r\n )}\r\n \r\n \r\n {\r\n onHide?.()\r\n dialogDrag.resetBoxPosition()\r\n }}\r\n >\r\n {children}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\n\r\ninterface DialogBodyProps extends React.HTMLProps {\r\n /**\r\n * Whether or not the dialog body will have padding\r\n *\r\n * @default true\r\n */\r\n hasPadding?: boolean\r\n}\r\n\r\n/**\r\n * Content wrapper which handles scrolling on mobile\r\n */\r\nexport function DialogBody({ hasPadding = true, ...props }: React.PropsWithChildren) {\r\n const scrollDivRef = React.useRef(null)\r\n\r\n React.useEffect(() => {\r\n const scrollBox = scrollDivRef.current\r\n\r\n if (isMobile() && scrollBox) {\r\n disableBodyScroll(scrollBox)\r\n\r\n return () => enableBodyScroll(scrollBox)\r\n }\r\n }, [])\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { Dialog, DialogProps } from './dialog'\r\nimport { DialogBody } from './dialog-body'\r\nimport { DialogStateReturn } from './hooks'\r\n\r\ninterface ConfirmationDialogProps {\r\n state: DialogStateReturn\r\n title: React.ReactNode\r\n actions: React.ReactNode\r\n 'aria-label': string\r\n position?: DialogProps['position']\r\n}\r\n\r\nexport function ConfirmationDialog({ position, ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n \r\n \r\n {props.title}\r\n \r\n {props.children}\r\n
{props.actions}
\r\n
\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Dialog'\r\n\r\nimport { DropdownContext } from '../dropdown'\r\nimport { DialogStateReturn } from './hooks'\r\n\r\ninterface DialogButtonProps extends Reakit.DialogDisclosureHTMLProps {\r\n state: DialogStateReturn\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const DialogTrigger = React.forwardRef(\r\n ({ state, ...props }: DialogButtonProps, ref: React.ForwardedRef) => {\r\n const dropdownContext = React.useContext(DropdownContext)\r\n\r\n return (\r\n ) => {\r\n // Close dropdown if we’re inside one\r\n dropdownContext?.root.hide()\r\n props.onClick?.(ev)\r\n }}\r\n >\r\n {props.children}\r\n \r\n )\r\n }\r\n)\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface DialogFooterProps extends React.HTMLProps {\r\n padding?: boolean\r\n}\r\n\r\n/**\r\n * Footer container which renders border and aligns items to right\r\n */\r\nexport function DialogFooter({ padding = true, ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { Icon } from '../icon'\r\nimport { Heading } from '../typography'\r\nimport { DialogDragContext } from './hooks'\r\n\r\ninterface DialogHeaderProps {\r\n /**\r\n * Callback when user clicks on close button. The button will be hidden if not set\r\n */\r\n onCloseClick?: () => void\r\n\r\n /**\r\n * Additional class names for the component\r\n */\r\n className?: string\r\n\r\n /**\r\n * Whether or not the dialog header will have default horizontal padding\r\n *\r\n * @default true\r\n */\r\n hasHorizontalPadding?: boolean\r\n\r\n /**\r\n * Whether or not the dialog header will have default min height\r\n *\r\n * @default true\r\n */\r\n hasMinHeight?: boolean\r\n}\r\n\r\n/**\r\n * Component which renders title and a close button\r\n */\r\nexport function DialogHeader({\r\n onCloseClick,\r\n children,\r\n className,\r\n hasHorizontalPadding = true,\r\n hasMinHeight = true,\r\n}: React.PropsWithChildren) {\r\n const dialogDrag = React.useContext(DialogDragContext)\r\n\r\n return (\r\n \r\n {children && (\r\n \r\n {children}\r\n \r\n )}\r\n {onCloseClick && (\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport type DropdownStateReturn = ReturnType\r\n\r\nexport const DropdownContext = React.createContext<{\r\n parent: Reakit.MenuStateReturn\r\n root: Reakit.MenuStateReturn\r\n} | null>(null)\r\n\r\nexport function useDropdownState(settings?: Reakit.MenuInitialState) {\r\n const context = React.useContext(DropdownContext)\r\n\r\n return Reakit.useMenuState({\r\n ...settings,\r\n loop: true,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n unstable_virtual: true,\r\n unstable_offset: context?.root ? [-5, 4] : [0, 5],\r\n modal: false,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { Box, BoxProps, BoxRounding } from '../box'\r\nimport { getExtendedDialogState, useZIndex } from '../dialog'\r\nimport { DropdownContext, useDropdownState } from './hooks'\r\n\r\ninterface DropdownBaseProps extends Omit {\r\n /**\r\n * Trigger button for the dropdown\r\n */\r\n label: JSX.Element\r\n\r\n /**\r\n * @private\r\n * Any additional props to the trigger button. Used by nested dropdown wrapper\r\n */\r\n triggerProps?: Reakit.MenuButtonHTMLProps\r\n\r\n /**\r\n * Rounding of all trigger button, dropdown wrapper and dropdown items\r\n */\r\n rounding?: keyof typeof BoxRounding\r\n}\r\n\r\ninterface RootDropdownProps {\r\n /**\r\n * The returned object from `useDropdownState`. For nested dropdowns use the `isNested` prop\r\n */\r\n state: Reakit.MenuStateReturn\r\n isNested?: never\r\n /**\r\n * When set to true the dropdown will not render in Portal and will not use position absolute + transform.\r\n */\r\n isStatic?: boolean\r\n}\r\n\r\ninterface NestedDropdownProps {\r\n state?: never\r\n /**\r\n * When set to true the dropdown will compute its own state. Only usable with\r\n * nested dropdowns\r\n */\r\n isNested: true\r\n\r\n isStatic?: never\r\n}\r\n\r\ntype DropdownProps = DropdownBaseProps & (RootDropdownProps | NestedDropdownProps)\r\n\r\nfunction DropdownComponent(\r\n {\r\n label,\r\n triggerProps,\r\n state,\r\n 'aria-label': ariaLabel,\r\n children,\r\n isNested,\r\n rounding,\r\n isStatic,\r\n ...props\r\n }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n const zIndex = useZIndex()\r\n const context = React.useContext(DropdownContext)\r\n // Required due to the way conditional props work\r\n const dropdownState = state!\r\n const { isFullyClosed } = getExtendedDialogState(state ?? { visible: false, animating: false })\r\n\r\n if (!isNested && !dropdownState) {\r\n throw new Error('Dropdowns require either `state` or `isNested` prop defined!')\r\n }\r\n\r\n const ContainerElement = React.useRef(isNested || isStatic ? React.Fragment : Portal).current\r\n\r\n return (\r\n <>\r\n \r\n {(buttonProps) =>\r\n React.cloneElement(label, {\r\n ...buttonProps,\r\n ...label.props,\r\n rounding,\r\n active: label.props.active ?? dropdownState.visible,\r\n })\r\n }\r\n \r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === Dropdown) {\r\n return {child}\r\n }\r\n\r\n return React.cloneElement(child, {\r\n ...child.props,\r\n rounding,\r\n })\r\n })}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const Dropdown = React.forwardRef(DropdownComponent)\r\n\r\ninterface NestedDropdownWrapperProps {\r\n /**\r\n * State of parrent dropdown to be passed to MenuItem for correct navigation\r\n * handling\r\n */\r\n parentState: Reakit.MenuStateReturn\r\n\r\n /**\r\n * Nested dropdown element\r\n */\r\n children: JSX.Element\r\n}\r\n\r\n/**\r\n * The `useDropdownState` requires parent context to be defined in order to work\r\n * with nested Dropdowns. So we need to create a wrapper to be able to get to the\r\n * parent context\r\n */\r\nfunction NestedDropdownWrapper({ parentState, children }: NestedDropdownWrapperProps) {\r\n const state = useDropdownState()\r\n\r\n return (\r\n \r\n {(itemProps) => React.cloneElement(children, { ...children.props, triggerProps: itemProps, state })}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\n/**\r\n * When rendering multiple dropdowns, wrap them in `DropdownBar` so they can be\r\n * navigated between\r\n */\r\nexport function DropdownBar({ children, ...props }: Partial) {\r\n const state = Reakit.useMenuBarState()\r\n\r\n return (\r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n return (\r\n \r\n {(itemProps) => React.cloneElement(child, itemProps)}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\nimport { Button, ButtonProps } from '../button'\r\nimport { Icon, isValidIconName } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { DropdownContext } from './hooks'\r\n\r\nconst DEFAULT_ELEMENT = 'button'\r\n\r\ninterface DropdownItemProps extends ButtonProps {\r\n subtitle?: React.ReactNode\r\n\r\n /**\r\n * Whether clicking the item should also close the dropdown. Only applies to\r\n * items without a submenu\r\n *\r\n * @default true\r\n */\r\n closeOnClick?: boolean\r\n}\r\n\r\nfunction DropdownItemComponent(\r\n {\r\n as: asComponent,\r\n state,\r\n subtitle,\r\n closeOnClick = true,\r\n children,\r\n rounding,\r\n size,\r\n ...props\r\n }: PropsWithAs & DropdownItemProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const context = React.useContext(DropdownContext)\r\n\r\n return (\r\n \r\n {(itemProps) => {\r\n const active = itemProps['aria-selected'] && !context?.parent.animating\r\n const hasSubmenu = Boolean(itemProps['aria-haspopup'])\r\n\r\n const iconTheme = {\r\n 'text-gray-300': !active,\r\n 'text-gray-white dark:text-white': active,\r\n }\r\n\r\n return (\r\n \r\n ) : (\r\n props.leftContent\r\n )\r\n }\r\n rightContent={\r\n isValidIconName(props.rightContent) ? (\r\n \r\n ) : (\r\n props.rightContent\r\n )\r\n }\r\n onClick={(ev: React.MouseEvent) => {\r\n // Close if we clicked on an item which doesn’t have a submenu\r\n if (closeOnClick && !hasSubmenu) {\r\n context?.root.hide()\r\n }\r\n\r\n itemProps.onClick?.(ev)\r\n }}\r\n >\r\n {children}\r\n {subtitle &&
{subtitle}
}\r\n \r\n )\r\n }}\r\n
\r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const DropdownItem = React.forwardRef(DropdownItemComponent) as <\r\n TagType extends React.ElementType = typeof DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & DropdownItemProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import * as Reakit from 'reakit/Menu'\r\n\r\nimport { Paragraph } from '../typography'\r\n\r\nexport function DropdownSeparator(props: Partial) {\r\n return (\r\n \r\n
\r\n {props.children && (\r\n \r\n {props.children}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Button, ButtonProps } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { Icon } from '../icon'\r\nimport { Dropdown } from './dropdown'\r\nimport { useDropdownState } from './hooks'\r\n\r\ninterface MoreButtonDropdownProps extends ButtonProps {\r\n /**\r\n * Children of the button\r\n */\r\n label?: React.ReactNode\r\n\r\n /**\r\n * Additional handler when user clicks on the button\r\n */\r\n onClick?: (event: React.MouseEvent) => void\r\n\r\n /**\r\n * Accessibility label for the dropdown component\r\n */\r\n 'aria-label': string\r\n}\r\n\r\nexport function MoreButtonDropdown({\r\n label,\r\n children,\r\n onClick,\r\n 'aria-label': ariaLabel,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const state = useDropdownState({ placement: 'bottom-end' })\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n {children}\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { IconNameType, iconList } from '.'\r\nimport { SVGProps } from './svg'\r\n\r\nexport interface IconProps extends SVGProps {\r\n /**\r\n * Icon name\r\n */\r\n name?: IconNameType\r\n\r\n /**\r\n * Alternative way to pass icon to render if you want to render a custom component\r\n * or use `iconList` object lookup\r\n */\r\n as?: React.FC\r\n}\r\n\r\nexport function Icon({ name, as: asComponent, ...props }: IconProps) {\r\n const Component = name && iconList[name] ? iconList[name] : asComponent\r\n\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 (!Component) {\r\n throw new Error('No icon to render!')\r\n }\r\n\r\n return \r\n}\r\n","import { IconAdd } from './add'\r\nimport { IconArrowDownShort } from './arrow-down-short'\r\nimport { IconArrowForward } from './arrow-forward'\r\nimport { IconArrowUpShort } from './arrow-up-short'\r\nimport { IconBriefcase } from './briefcase'\r\nimport { IconCalendar } from './calendar'\r\nimport { IconCandleBarBasic } from './candle-bar-basic'\r\nimport { IconCandleBarHeikinAshi } from './candle-bar-heikin-ashi'\r\nimport { IconCandleBarHollow } from './candle-bar-hollow'\r\nimport { IconCaretDown } from './caret-down'\r\nimport { IconCaretLeft } from './caret-left'\r\nimport { IconCaretRight } from './caret-right'\r\nimport { IconCaretUp } from './caret-up'\r\nimport { IconCaretVertical } from './caretVertical'\r\nimport { IconChartBar } from './chart-bar'\r\nimport { IconChartBubble } from './chart-bubble'\r\nimport { IconChartPie } from './chart-pie'\r\nimport { IconChartTable } from './chart-table'\r\nimport { IconChartTreemap } from './chart-treemap'\r\nimport { IconChevronDown } from './chevron-down'\r\nimport { IconChevronRight } from './chevron-right'\r\nimport { IconClose } from './close'\r\nimport { IconDarkMode } from './dark-mode'\r\nimport { IconDiamondOutlined } from './diamond-outlined'\r\nimport { IconDone } from './done'\r\nimport { IconDrag } from './drag'\r\nimport { IconDraw } from './draw'\r\nimport { IconDrawingActionDelete } from './drawing-action-delete'\r\nimport { IconDrawingSettingAutosaveOff } from './drawing-setting-autosave-off'\r\nimport { IconDrawingSettingAutosaveOn } from './drawing-setting-autosave-on'\r\nimport { IconDrawingSettingAutosaveSaving } from './drawing-setting-autosave-saving'\r\nimport { IconDrawingSettingDrawingMode } from './drawing-setting-drawing-mode'\r\nimport { IconDrawingSettingDrawingModeActive } from './drawing-setting-drawing-mode-active'\r\nimport { IconDrawingSettingHide } from './drawing-setting-hide'\r\nimport { IconDrawingSettingLock } from './drawing-setting-lock'\r\nimport { IconDrawingSettingPreserveDrawings } from './drawing-setting-preserve-drawings'\r\nimport { IconDrawingSettingPreserveDrawingsActive } from './drawing-setting-preserve-drawings-active'\r\nimport { IconDrawingSettingShow } from './drawing-setting-show'\r\nimport { IconDrawingSettingUnlock } from './drawing-setting-unlock'\r\nimport { IconExitFullscreen } from './exit-fullscreen'\r\nimport { IconFlash } from './flash'\r\nimport { IconFullscreen } from './fullscreen'\r\nimport { IconGesture } from './gesture'\r\nimport { IconGift } from './gift'\r\nimport { IconHamburger } from './hamburger'\r\nimport { IconHelp } from './help'\r\nimport { IconIdea } from './idea'\r\nimport { IconIdeaLoad } from './idea-load'\r\nimport { IconIdeaSave } from './idea-save'\r\nimport { IconInfo } from './info'\r\nimport { IconInterval } from './interval'\r\nimport { IconLayout1h1v } from './layout-1h1v'\r\nimport { IconLayout1h2v } from './layout-1h2v'\r\nimport { IconLayout1h3v } from './layout-1h3v'\r\nimport { IconLayout1l2r } from './layout-1l2r'\r\nimport { IconLayout1t2b } from './layout-1t2b'\r\nimport { IconLayout2h1v } from './layout-2h1v'\r\nimport { IconLayout2h2v } from './layout-2h2v'\r\nimport { IconLayout3h1v } from './layout-3h1v'\r\nimport { IconLayout3h2v } from './layout-3h2v'\r\nimport { IconLightMode } from './light-mode'\r\nimport { IconLineChartType } from './line-chart-type'\r\nimport { IconLock } from './lock'\r\nimport { IconMenuClose } from './menu-close'\r\nimport { IconMinus } from './minus'\r\nimport { IconMore } from './more'\r\nimport { IconNote } from './note'\r\nimport { IconOhlcChartType } from './ohlc-chart-type'\r\nimport { IconPalette } from './palette'\r\nimport { IconProfile } from './profile'\r\nimport { IconPublish } from './publish'\r\nimport { IconRefresh } from './refresh'\r\nimport { IconRemove } from './remove'\r\nimport { IconRestore } from './restore'\r\nimport { IconSearch } from './search'\r\nimport { IconSettings } from './settings'\r\nimport { IconSettingsWheel } from './settings-wheel'\r\nimport { IconShare } from './share'\r\nimport { IconSignOut } from './sign-out'\r\nimport { IconStar } from './star'\r\nimport { IconStarOutlined } from './star-outlined'\r\nimport { SVG, SVGProps } from './svg'\r\nimport { IconSwitchHorizontal } from './switch-horizontal'\r\nimport { IconSwitchVertical } from './switch-vertical'\r\nimport { IconTabKey } from './tab-key'\r\nimport { IconTemplate } from './template'\r\nimport { IconToolArrow } from './tool-arrow'\r\nimport { IconToolBrush } from './tool-brush'\r\nimport { IconToolCallout } from './tool-callout'\r\nimport { IconToolCurve } from './tool-curve'\r\nimport { IconToolElliottWave } from './tool-elliott-wave'\r\nimport { IconToolEllipse } from './tool-ellipse'\r\nimport { IconToolExpand } from './tool-expand'\r\nimport { IconToolFibonacci } from './tool-fibonacci'\r\nimport { IconToolLine } from './tool-line'\r\nimport { IconToolMeasure } from './tool-measure'\r\nimport { IconToolMidlineH } from './tool-midline-h'\r\nimport { IconToolMidlineV } from './tool-midline-v'\r\nimport { IconToolMouse } from './tool-mouse'\r\nimport { IconToolPitchFork } from './tool-pitchfork'\r\nimport { IconToolPolygon } from './tool-polygon'\r\nimport { IconToolPosition } from './tool-position'\r\nimport { IconToolRect } from './tool-rect'\r\nimport { IconToolRectRotated } from './tool-rect-rotated'\r\nimport { IconToolText } from './tool-text'\r\nimport { IconToolTriangle } from './tool-triangle'\r\nimport { IconToolXABCD } from './tool-xabcd'\r\nimport { IconTrashCan } from './trash-can'\r\nimport { IconTrendingDown } from './trending-down'\r\nimport { IconTrendingUp } from './trending-up'\r\nimport { IconTriangle } from './triangle'\r\nimport { IconTriangleOutlineDown } from './triangle-outline-down'\r\nimport { IconTriangleOutlineUp } from './triangle-outline-up'\r\nimport { IconWarning } from './warning'\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]\r\n}\r\n\r\nexport type IconNameType = keyof typeof iconList\r\n\r\n// Export list of icon components\r\nexport const iconList = {\r\n add: IconAdd,\r\n arrowDownShort: IconArrowDownShort,\r\n arrowForward: IconArrowForward,\r\n arrowUpShort: IconArrowUpShort,\r\n briefcase: IconBriefcase,\r\n calendar: IconCalendar,\r\n candleBarBasic: IconCandleBarBasic,\r\n candleBarHeikinAshi: IconCandleBarHeikinAshi,\r\n candleBarHollow: IconCandleBarHollow,\r\n caretDown: IconCaretDown,\r\n caretLeft: IconCaretLeft,\r\n caretRight: IconCaretRight,\r\n caretUp: IconCaretUp,\r\n caretVertical: IconCaretVertical,\r\n chartBar: IconChartBar,\r\n chartBubble: IconChartBubble,\r\n chartPie: IconChartPie,\r\n chartTable: IconChartTable,\r\n chartTreemap: IconChartTreemap,\r\n chevronDown: IconChevronDown,\r\n chevronRight: IconChevronRight,\r\n close: IconMenuClose,\r\n darkMode: IconDarkMode,\r\n diamondOutlined: IconDiamondOutlined,\r\n done: IconDone,\r\n drag: IconDrag,\r\n draw: IconDraw,\r\n drawingActionDelete: IconDrawingActionDelete,\r\n drawingSettingAutosaveOff: IconDrawingSettingAutosaveOff,\r\n drawingSettingAutosaveOn: IconDrawingSettingAutosaveOn,\r\n drawingSettingAutosaveSaving: IconDrawingSettingAutosaveSaving,\r\n drawingSettingDrawingMode: IconDrawingSettingDrawingMode,\r\n drawingSettingDrawingModeActive: IconDrawingSettingDrawingModeActive,\r\n drawingSettingHide: IconDrawingSettingHide,\r\n drawingSettingLock: IconDrawingSettingLock,\r\n drawingSettingPreserveDrawings: IconDrawingSettingPreserveDrawings,\r\n drawingSettingPreserveDrawingsActive: IconDrawingSettingPreserveDrawingsActive,\r\n drawingSettingShow: IconDrawingSettingShow,\r\n drawingSettingUnlock: IconDrawingSettingUnlock,\r\n empty: (props: SVGProps) => ,\r\n exitFullscreen: IconExitFullscreen,\r\n flash: IconFlash,\r\n fullscreen: IconFullscreen,\r\n gesture: IconGesture,\r\n gift: IconGift,\r\n hamburger: IconHamburger,\r\n help: IconHelp,\r\n idea: IconIdea,\r\n ideaLoad: IconIdeaLoad,\r\n ideaSave: IconIdeaSave,\r\n info: IconInfo,\r\n interval: IconInterval,\r\n layout1h1v: IconLayout1h1v,\r\n layout1h2v: IconLayout1h2v,\r\n layout1h3v: IconLayout1h3v,\r\n layout1l2r: IconLayout1l2r,\r\n layout1t2b: IconLayout1t2b,\r\n layout2h1v: IconLayout2h1v,\r\n layout2h2v: IconLayout2h2v,\r\n layout3h1v: IconLayout3h1v,\r\n layout3h2v: IconLayout3h2v,\r\n lightMode: IconLightMode,\r\n lineChartType: IconLineChartType,\r\n lock: IconLock,\r\n menuClose: IconClose,\r\n minus: IconMinus,\r\n more: IconMore,\r\n note: IconNote,\r\n ohlcChartType: IconOhlcChartType,\r\n palette: IconPalette,\r\n profile: IconProfile,\r\n publish: IconPublish,\r\n refresh: IconRefresh,\r\n remove: IconRemove,\r\n restore: IconRestore,\r\n search: IconSearch,\r\n settings: IconSettings,\r\n settingsWheel: IconSettingsWheel,\r\n share: IconShare,\r\n signOut: IconSignOut,\r\n star: IconStar,\r\n starOutlined: IconStarOutlined,\r\n switchHorizontal: IconSwitchHorizontal,\r\n switchVertical: IconSwitchVertical,\r\n tabKey: IconTabKey,\r\n template: IconTemplate,\r\n toolArrow: IconToolArrow,\r\n toolBrush: IconToolBrush,\r\n toolCallout: IconToolCallout,\r\n toolCurve: IconToolCurve,\r\n toolElliottWave: IconToolElliottWave,\r\n toolEllipse: IconToolEllipse,\r\n toolExpand: IconToolExpand,\r\n toolFibonacci: IconToolFibonacci,\r\n toolLine: IconToolLine,\r\n toolMeasure: IconToolMeasure,\r\n toolMidLineH: IconToolMidlineH,\r\n toolMidLineV: IconToolMidlineV,\r\n toolMouse: IconToolMouse,\r\n toolPitchfork: IconToolPitchFork,\r\n toolPolygon: IconToolPolygon,\r\n toolPosition: IconToolPosition,\r\n toolRect: IconToolRect,\r\n toolRectRotated: IconToolRectRotated,\r\n toolText: IconToolText,\r\n toolTriangle: IconToolTriangle,\r\n toolXABCD: IconToolXABCD,\r\n trashCan: IconTrashCan,\r\n trendingDown: IconTrendingDown,\r\n trendingUp: IconTrendingUp,\r\n triangle: IconTriangle,\r\n triangleOutlineDown: IconTriangleOutlineDown,\r\n triangleOutlineUp: IconTriangleOutlineUp,\r\n warning: IconWarning,\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconAdd(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconArrowDownShort(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconArrowForward(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconArrowUpShort(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconBriefcase(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCalendar(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCandleBarBasic(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCandleBarHeikinAshi(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCandleBarHollow(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretLeft(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretRight(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretUp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretVertical(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartBar(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartBubble(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartPie(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartTable(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartTreemap(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChevronDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChevronRight(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconMenuClose(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDarkMode(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDiamondOutlined(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDone(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrag(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDraw(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingActionDelete(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingAutosaveOff(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingAutosaveOn(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingAutosaveSaving(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingDrawingMode(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingDrawingModeActive(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingHide(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingLock(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingPreserveDrawings(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingPreserveDrawingsActive(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingShow(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingUnlock(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconExitFullscreen(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconFlash(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconFullscreen(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconGesture(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconGift(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconHamburger(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconHelp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconIdea(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconIdeaLoad(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconIdeaSave(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconInfo(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconInterval(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1h1v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1h2v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1h3v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1l2r(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1t2b(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout2h1v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout2h2v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout3h1v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout3h2v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLightMode(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLineChartType(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLock(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconClose(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconMinus(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconMore(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconNote(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconOhlcChartType(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconPalette(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconProfile(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconPublish(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconRefresh(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconRemove(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconRestore(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSearch(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSettings(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSettingsWheel(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconShare(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSignOut(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconStar(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconStarOutlined(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSwitchHorizontal(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSwitchVertical(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTabKey(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTemplate(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolArrow(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolBrush(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolCallout(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolCurve(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolElliottWave(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolEllipse(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolExpand(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolFibonacci(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolLine(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMeasure(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMidlineH(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMidlineV(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMouse(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolPitchFork(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolPolygon(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolPosition(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolRect(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolRectRotated(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolText(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolTriangle(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolXABCD(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTrashCan(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTrendingDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTrendingUp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTriangle(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTriangleOutlineDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTriangleOutlineUp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconWarning(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport type SVGProps = React.SVGProps\r\n\r\nexport function SVG({ className, width = 16, height = width, ...props }: SVGProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef, useMemo } from 'react'\r\n\r\nimport { ButtonPadding } from './button'\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { Label } from './typography'\r\n\r\nexport enum InputTheme {\r\n none,\r\n light,\r\n dark,\r\n navigationBar,\r\n}\r\n\r\nexport enum InputRounding {\r\n none = '',\r\n regular = 'rounded-md',\r\n}\r\n\r\n/**\r\n * Enum for input size. Only set size on larger viewports to avoid page zooming\r\n */\r\nexport enum InputSize {\r\n small = 'h-6 text-2xs', // 24px height\r\n regular = 'h-7 text-2xs', // 28px height\r\n medium = 'h-8 text-sm', // 32px height\r\n large = 'h-9 text-sm', // 36px height\r\n}\r\n\r\nfunction getInputTheme(theme: InputTheme, isError = false) {\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 focus:border-blue-400 focus:hover:border-blue-400 disabled:border-gray-700':\r\n !isError,\r\n 'border-red-400': isError,\r\n }),\r\n icon: classnames({\r\n 'text-gray-500 group-focus-within:text-blue-400': !isError,\r\n 'text-red-400': isError,\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 'bg-white disabled:bg-gray-50 disabled:text-gray-500', // Light\r\n 'dark:bg-gray-800 dark:disabled:bg-gray-700 dark:disabled:text-gray-400', // Dark\r\n {\r\n 'border-gray-100 hover:border-gray-300 focus:border-blue-400 hover:focus:border-blue-400 disabled:hover:border-gray-100 dark:border-gray-600 dark:hover:border-gray-400 dark:focus:border-blue-400 dark:hover:focus:border-blue-400 dark:disabled:border-gray-700':\r\n !isError,\r\n 'border-red-400': isError,\r\n }\r\n ),\r\n icon: classnames({\r\n 'text-gray-300 group-focus-within:text-blue-400 dark:text-gray-500': !isError,\r\n 'text-red-400': isError,\r\n }),\r\n }\r\n }\r\n}\r\n\r\ntype OmitNativeProps = Omit, 'label' | 'size'>\r\n\r\nexport interface InputProps {\r\n /**\r\n * Label which is rendered above the input\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * 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\nexport type InputHTMLProps = OmitNativeProps\r\n\r\nexport type InputComponentProps = InputProps & InputHTMLProps\r\n\r\nfunction InputComponent(\r\n {\r\n label,\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 ...props\r\n }: InputComponentProps,\r\n ref: ForwardedRef\r\n) {\r\n const inputTheme = useMemo(() => getInputTheme(InputTheme[theme], !!error), [theme, error])\r\n const isLeftStringIcon = isValidIconName(leftContent)\r\n const isRightStringIcon = isValidIconName(rightContent)\r\n const inputSize = InputSize[size]\r\n\r\n const commonSideContentClassnames = useMemo(\r\n () => ({\r\n 'flex absolute w-3 items-center justify-center': true,\r\n 'text-gray-500 dark:text-gray-600': theme === 'light',\r\n 'text-gray-600': theme === 'dark',\r\n }),\r\n [theme]\r\n )\r\n\r\n return (\r\n
\r\n
\r\n \r\n {caption && typeof caption !== 'boolean' && (\r\n {caption}\r\n )}\r\n {error && typeof error !== 'boolean' && {error}}\r\n
\r\n )\r\n}\r\n\r\ninterface InputCaptionProps extends Omit, 'size'> {\r\n size?: keyof typeof InputSize\r\n}\r\n\r\nfunction InputCaption({ size = 'regular', ...props }: PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ntype TextareaProps = Omit & OmitNativeProps\r\n\r\nfunction TextareaComponent(\r\n { label, theme = 'light', rounding = 'regular', inputClass, error, caption, className, ...props }: TextareaProps,\r\n ref: ForwardedRef\r\n) {\r\n const textareaTheme = useMemo(() => getInputTheme(InputTheme[theme], !!error), [theme, error])\r\n\r\n return (\r\n
\r\n \r\n {caption && typeof caption !== 'boolean' && (\r\n {caption}\r\n )}\r\n {error && typeof error !== 'boolean' && {error}}\r\n
\r\n )\r\n}\r\n\r\nexport const Input = forwardRef(InputComponent)\r\nexport const Textarea = forwardRef(TextareaComponent)\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nexport const ListContext = React.createContext(null)\r\n\r\nexport function useListState(options?: Reakit.CompositeInitialState) {\r\n return Reakit.useCompositeState({ ...options, loop: true, unstable_virtual: true })\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps, ButtonTheme } from '../button'\r\nimport { ListContext } from './hooks'\r\n\r\nexport interface ListItemProps {\r\n /**\r\n * Theme when the button is selected\r\n */\r\n activeTheme?: keyof typeof ButtonTheme\r\n\r\n /**\r\n * Close parent popover when the item is clicked\r\n */\r\n closeOnSelect?: boolean\r\n\r\n /**\r\n * OnChange callback when item is clicked or navigated to\r\n * @private\r\n */\r\n onSelectItem?: (item: string, closeOnSelect?: boolean) => void\r\n}\r\n\r\nexport function ListItem({\r\n as,\r\n activeTheme = 'blue',\r\n onSelectItem,\r\n onClick,\r\n onKeyPress,\r\n className,\r\n closeOnSelect = true,\r\n children,\r\n ...props\r\n}: React.PropsWithChildren & ButtonComponentProps) {\r\n const state = React.useContext(ListContext)\r\n\r\n return (\r\n {\r\n onClick?.(ev)\r\n onSelectItem?.(ev.currentTarget.id, closeOnSelect)\r\n }}\r\n onKeyPress={(ev) => {\r\n onKeyPress?.(ev)\r\n onSelectItem?.(ev.currentTarget.id, closeOnSelect)\r\n }}\r\n >\r\n {(itemProps: ButtonComponentProps) => {\r\n const active = Boolean(itemProps['aria-selected'])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { ListContext } from './hooks'\r\nimport { ListItem } from './list-item'\r\n\r\ninterface ListProps extends Omit {\r\n /**\r\n * The returned object from `useListState`\r\n */\r\n state: Reakit.CompositeStateReturn\r\n\r\n /**\r\n * The selected option\r\n */\r\n selectedIndex?: number\r\n\r\n /**\r\n * Callback when selected option index changes\r\n */\r\n onChange?: (selectedIndex: number, closeParent?: boolean) => void\r\n\r\n /**\r\n * Whether or not default styles should be included for the list\r\n * @default true\r\n */\r\n includeBaseStyles?: boolean\r\n}\r\n\r\nexport function List({ state, selectedIndex, includeBaseStyles = true, onChange, children, ...props }: ListProps) {\r\n const prevSelected = React.useRef(null)\r\n\r\n // Select option when `selectedIndex` changes\r\n React.useEffect(() => {\r\n if (\r\n selectedIndex !== undefined &&\r\n selectedIndex >= 0 &&\r\n prevSelected.current !== selectedIndex &&\r\n state.items.length > selectedIndex\r\n ) {\r\n state.move(state.items[selectedIndex].id)\r\n prevSelected.current = selectedIndex\r\n }\r\n }, [selectedIndex, state, state.items.length])\r\n\r\n const onSelectItem = React.useCallback(\r\n (id: string, closeParent: boolean) => {\r\n onChange?.(\r\n state.items.findIndex((item) => item.id === id),\r\n closeParent\r\n )\r\n },\r\n [onChange, state.items]\r\n )\r\n\r\n return (\r\n \r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === ListItem) {\r\n return React.cloneElement(child, { ...child.props, onSelectItem: onSelectItem })\r\n }\r\n\r\n return child\r\n })}\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\nimport { Dialog, useDialogState } from 'reakit/Dialog'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nfunction getViewport(visualViewport: VisualViewport | null) {\r\n const width = visualViewport?.width ?? window.innerWidth\r\n const height = visualViewport?.height ?? window.innerHeight\r\n const scale = visualViewport?.scale ?? 1\r\n\r\n return {\r\n top: visualViewport?.offsetTop ?? 0,\r\n left: visualViewport?.offsetLeft ?? 0,\r\n scale: Math.round((1 / scale) * 100) / 100,\r\n width: Math.round(width * scale),\r\n height: Math.round(height * scale),\r\n }\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const state = useDialogState({ modal: false, animated: COMPONENT_ANIMATION_DURATION })\r\n const [notification, setNotification] = React.useState(null)\r\n const { isFullyClosed, isFullyOpened } = getExtendedDialogState(state)\r\n const [viewport, setViewport] = React.useState(getViewport(window.visualViewport))\r\n\r\n React.useEffect(() => {\r\n if (!notification) return\r\n\r\n const handleResize = throttle((ev: Event) => {\r\n const viewport = ev.currentTarget as VisualViewport\r\n if (viewport) {\r\n setViewport(() => getViewport(viewport))\r\n }\r\n }, 50)\r\n\r\n window.visualViewport?.addEventListener('resize', handleResize)\r\n window.visualViewport?.addEventListener('scroll', handleResize)\r\n\r\n return () => {\r\n window.visualViewport?.removeEventListener('resize', handleResize)\r\n window.visualViewport?.removeEventListener('scroll', handleResize)\r\n }\r\n }, [notification])\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n state.show()\r\n },\r\n hide: state.hide,\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n actions?: JSX.Element\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification(props: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: NodeJS.Timeout\r\n if (props.timeoutInMs) {\r\n timeoutId = setTimeout(() => {\r\n notification.hide()\r\n }, props.timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, props.timeoutInMs])\r\n\r\n return (\r\n \r\n
{props.children}
\r\n
{props.actions ?? }
\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { usePopoverMaxHeight } from '../../hooks/use-popover-maxHeight'\r\nimport { useWindowSize } from '../../hooks/use-window-size'\r\nimport { Box, BoxProps, BoxTheme } from '../box'\r\nimport { getExtendedDialogState, useZIndex } from '../dialog'\r\nimport { TooltipArrow } from '../tooltip/tooltip-arrow'\r\nimport { PopoverStateReturn } from './hooks'\r\n\r\nexport interface PopoverProps extends BoxProps, Pick {\r\n /**\r\n * The returned object from `usePopoverState`\r\n */\r\n state: PopoverStateReturn\r\n\r\n /**\r\n * Focus the popover when it opens\r\n *\r\n * @default true\r\n */\r\n focusOnShow?: Reakit.PopoverProps['unstable_autoFocusOnShow']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default true\r\n */\r\n focusOnHide?: Reakit.PopoverProps['unstable_autoFocusOnHide']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default undefined\r\n */\r\n finalFocusRef?: Reakit.PopoverProps['unstable_finalFocusRef']\r\n\r\n /**\r\n * Hides when clicked outside of popover, works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside?: Reakit.PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Overlay click callback or if false is provided, overlay click calls hide func on popover state object\r\n *\r\n * @default undefined\r\n */\r\n onOverlayClick?: (() => void) | false\r\n\r\n /**\r\n * Popover wrapper css style object\r\n *\r\n * @default undefined\r\n */\r\n popoverWrapperStyle?: React.CSSProperties\r\n\r\n /**\r\n * Show popover arrow\r\n *\r\n * @default false\r\n */\r\n hasArrow?: boolean\r\n\r\n /**\r\n * Enable or disable backdrop click events\r\n *\r\n * @default true\r\n */\r\n hasBackdrop?: boolean\r\n\r\n /**\r\n * Set the popover to height to be limited by the viewport instead of having full height\r\n *\r\n * @default false\r\n */\r\n hasViewportHeightLimit?: boolean\r\n\r\n /**\r\n * Set the popover max-width to be limited by the trigger button\r\n */\r\n hasButtonWidthLimit?: boolean\r\n\r\n /**\r\n * Can be used together with `hasViewportHeightLimit` to limit the height of the popover\r\n *\r\n * @default undefined\r\n */\r\n popoverMaxHeight?: number\r\n}\r\n\r\nexport function Popover({\r\n state,\r\n children,\r\n focusOnShow = true,\r\n focusOnHide = true,\r\n finalFocusRef,\r\n 'aria-label': ariaLabel,\r\n hide,\r\n hideOnClickOutside = true,\r\n hasArrow = false,\r\n hasBackdrop = true,\r\n onOverlayClick,\r\n popoverWrapperStyle,\r\n popoverMaxHeight = Number.MAX_SAFE_INTEGER,\r\n theme = 'light',\r\n hasViewportHeightLimit = false,\r\n hasButtonWidthLimit = false,\r\n ...props\r\n}: PopoverProps) {\r\n const zIndex = useZIndex()\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const { innerHeight } = useWindowSize({ isWatching: !isFullyClosed })\r\n\r\n const buttonElement = state.unstable_referenceRef.current\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: popoverMaxHeight,\r\n hasViewportHeightLimit,\r\n offsets: state.offsets,\r\n state,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !(hasViewportHeightLimit || hasButtonWidthLimit)) return\r\n\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n\r\n // Limit popover max-width to be width of the trigger button\r\n if (hasButtonWidthLimit) {\r\n popoverWrapper?.style.setProperty('max-width', `${buttonRect.width}px`)\r\n }\r\n }, [\r\n state.visible,\r\n state.offsets,\r\n buttonElement,\r\n hasViewportHeightLimit,\r\n hasButtonWidthLimit,\r\n innerHeight,\r\n state.placement,\r\n popoverMaxHeight,\r\n ])\r\n\r\n if (isFullyClosed) return null\r\n\r\n return (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n <>\r\n {\r\n // prevents from page scroll when clicked outside of popover\r\n event.preventDefault()\r\n }}\r\n />\r\n \r\n \r\n {hasArrow && (\r\n \r\n \r\n \r\n )}\r\n {children}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport type PopoverStateReturn = ReturnType\r\n\r\nconst DEFAULT_OFFSET: [number, number] = [0, 5]\r\nconst HOVER_TIMEOUT = 150\r\n\r\nconst preventDefault = (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n}\r\n\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function usePopoverState(settings?: Reakit.PopoverInitialState) {\r\n const offsets = (settings?.unstable_offset ?? DEFAULT_OFFSET) as [number, number]\r\n const popover = Reakit.usePopoverState({\r\n ...settings,\r\n placement: settings?.placement ?? 'bottom-start',\r\n unstable_offset: offsets,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n modal: false,\r\n })\r\n\r\n return { ...popover, offsets }\r\n}\r\n\r\nexport function useHoverPopover(settings?: Reakit.PopoverInitialState) {\r\n const popover = usePopoverState(settings)\r\n const showTimeout = React.useRef(null)\r\n const hideTimeout = React.useRef(null)\r\n\r\n const clearTimeouts = React.useRef(() => {\r\n if (showTimeout.current !== null) {\r\n window.clearTimeout(showTimeout.current)\r\n }\r\n if (hideTimeout.current !== null) {\r\n window.clearTimeout(hideTimeout.current)\r\n }\r\n })\r\n\r\n const showPopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n showTimeout.current = window.setTimeout(() => {\r\n popover.show()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n const hidePopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n hideTimeout.current = window.setTimeout(() => {\r\n popover.hide()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n // Unmount cleanup\r\n React.useEffect(() => () => clearTimeouts.current(), [])\r\n\r\n return {\r\n ...popover,\r\n show: showPopover.current,\r\n hide: hidePopover.current,\r\n onMouseOver: showPopover.current,\r\n onMouseOut: hidePopover.current,\r\n onMouseDown: preventDefault,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { useZIndex } from '../dialog'\r\n\r\ninterface PopoverButtonProps extends Reakit.PopoverDisclosureHTMLProps {\r\n state: Reakit.PopoverStateReturn\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const PopoverTrigger = React.forwardRef(\r\n ({ state, ...props }: PopoverButtonProps, ref: React.ForwardedRef) => {\r\n const zIndex = useZIndex()\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n }\r\n)\r\n","// Disable rule as the component is external\r\n\r\n/* eslint-disable react/jsx-pascal-case */\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Combobox'\r\n\r\nimport { 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?: Reakit.unstable_ComboboxStateReturn\r\n\r\n /**\r\n * Value for the combo box item\r\n */\r\n value: string\r\n}\r\n\r\nexport function ComboBoxItem({\r\n as: asComponent,\r\n state,\r\n children,\r\n ...props\r\n}: PropsWithAs & ComboBoxItemProps) {\r\n return (\r\n \r\n {(itemProps) => {\r\n const selected = state?.currentId === itemProps.id\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n","// Disable rule as the component is external\r\n\r\n/* eslint-disable react/jsx-pascal-case */\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Combobox'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { Box, BoxProps } from '../box'\r\nimport { getExtendedDialogState, useZIndex } from '../dialog'\r\nimport { Input, InputProps } from '../input'\r\nimport { ComboBoxItem } from './combo-box-item'\r\n\r\ninterface ComboBoxProps extends Omit {\r\n /**\r\n * The returned object from `useComboBoxState`\r\n */\r\n state: Reakit.unstable_ComboboxStateReturn\r\n\r\n /**\r\n * Additional props for the input\r\n */\r\n inputProps?: Partial & Omit, 'size'>\r\n\r\n /**\r\n * Additional props for the popover\r\n */\r\n popoverProps?: Partial\r\n\r\n /**\r\n * Callback when user presses enter\r\n */\r\n onChange: (value: string) => void\r\n\r\n /**\r\n * Id for testing purposes\r\n */\r\n inputTestId?: string\r\n}\r\n\r\nexport function ComboBox({\r\n state,\r\n children,\r\n inputProps,\r\n popoverProps,\r\n onChange,\r\n inputTestId,\r\n 'aria-label': ariaLabel,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const zIndex = useZIndex()\r\n\r\n return (\r\n <>\r\n {\r\n if (ev.key === 'Enter') {\r\n onChange(state.inputValue)\r\n }\r\n inputProps?.onKeyDown?.(ev)\r\n }}\r\n data-testid={inputTestId}\r\n />\r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n
\r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === ComboBoxItem) {\r\n return React.cloneElement(\r\n child as React.ReactElement>,\r\n {\r\n state,\r\n onMouseUp: () => {\r\n onChange(child.props.value)\r\n },\r\n }\r\n )\r\n }\r\n\r\n return child\r\n })}\r\n \r\n
\r\n )}\r\n
\r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { Instrument } from '../../types'\r\n\r\nexport const INSTRUMENT_CATEGORIES = [\r\n { name: 'All', instrument: undefined },\r\n { name: 'Stocks', instrument: Instrument.Stock },\r\n { name: 'Futures', instrument: Instrument.Futures },\r\n { name: 'Forex', instrument: Instrument.Forex },\r\n { name: 'Crypto', instrument: Instrument.Crypto },\r\n]\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren } from 'react'\r\n\r\nexport function Centered(props: PropsWithChildren>) {\r\n return
\r\n}\r\n","import { FallbackProps } from 'react-error-boundary'\r\n\r\nimport { 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\nexport function SearchError(props: FallbackProps) {\r\n return (\r\n \r\n \r\n \r\n Error fetching the results\r\n \r\n \r\n There’s been an error fetching your results. Please try again or{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n \r\n \r\n )\r\n}\r\n","import { useMemo } from 'react'\r\n\r\ninterface HighlightProps {\r\n /**\r\n * Search string that will be highlighted\r\n */\r\n highlight: string\r\n /**\r\n * Text to be highlighted\r\n */\r\n text: string\r\n}\r\n\r\nexport function Highlight({ highlight, text }: HighlightProps) {\r\n const index = text.toLowerCase().indexOf(highlight.toLowerCase())\r\n\r\n const processedText = useMemo(\r\n () => ({\r\n before: text.substring(0, index),\r\n highlight: text.substring(index, index + highlight.length),\r\n after: text.substring(index + highlight.length),\r\n }),\r\n [highlight.length, index, text]\r\n )\r\n\r\n if (index < 0 || highlight.length < 1) return {text}\r\n\r\n return (\r\n <>\r\n {processedText.before}\r\n {!!processedText.highlight.length && (\r\n \r\n {processedText.highlight}\r\n \r\n )}\r\n {processedText.after}\r\n \r\n )\r\n}\r\n","import 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 {\r\n item: SearchApiResult\r\n chartIndex?: number\r\n itemProps: Partial>\r\n}\r\n\r\nexport function SearchItem(props: SearchItemProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {props.item.exchange}\r\n \r\n )\r\n}\r\n","import { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { link } from '../../services/routing'\r\nimport { Instrument } from '../../types'\r\nimport { cleanTicker, getInstrumentForTicker } from '../../util'\r\n\r\nexport function getRedirectForTicker(tickerRaw: string) {\r\n const ticker = getSanitizedTicker(tickerRaw, true)\r\n const instrument = cleanTicker(ticker) ? getInstrumentForTicker(ticker) : null\r\n let redirectLink = ''\r\n\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n redirectLink = link.toQuote(ticker)\r\n break\r\n case Instrument.Forex:\r\n redirectLink = link.toForexChartDetail(ticker)\r\n break\r\n case Instrument.Futures:\r\n redirectLink = link.toFuturesChartDetail(ticker)\r\n break\r\n case Instrument.Crypto:\r\n redirectLink = link.toCryptoChartDetail(ticker)\r\n break\r\n default:\r\n return link.toSearch(ticker)\r\n }\r\n\r\n return redirectLink + (FinvizSettings.quoteSearchExt ?? '')\r\n}\r\n","import { useQuery } from '@tanstack/react-query'\r\nimport React from 'react'\r\nimport * as Reakit from 'reakit/Combobox'\r\n\r\nimport { searchApiRequest } from '../../services/api'\r\nimport { link } from '../../services/routing'\r\nimport { Instrument } from '../../types'\r\nimport { Button } from '../button'\r\nimport { Centered } from '../centered'\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\nimport { Spinner } from '../spinner'\r\nimport { SearchItem } from './search-item'\r\nimport { getRedirectForTicker } from './util'\r\n\r\ninterface SearchListProps {\r\n state: Reakit.unstable_ComboboxStateReturn\r\n instrument?: Instrument\r\n chartIndex?: number\r\n isShowAllVisible: boolean\r\n isSearchItemLink: boolean\r\n onTickerSelected?: (ticker: string) => void\r\n}\r\n\r\nexport function SearchList(props: SearchListProps) {\r\n const { data, isLoading } = useQuery(\r\n ['search', props.state.inputValue, props.instrument],\r\n () => searchApiRequest(props.state.inputValue, props.instrument),\r\n { enabled: props.state.inputValue.length > 0, keepPreviousData: true, cacheTime: Infinity, staleTime: Infinity }\r\n )\r\n const { setAnimated, hide, animated } = props.state\r\n\r\n React.useEffect(() => {\r\n if (!isLoading && !data?.length && !props.isShowAllVisible) {\r\n setAnimated(1)\r\n hide()\r\n } else if (animated !== COMPONENT_ANIMATION_DURATION) {\r\n setAnimated(COMPONENT_ANIMATION_DURATION)\r\n }\r\n }, [isLoading, data, setAnimated, hide, props.isShowAllVisible, animated])\r\n\r\n if (isLoading) {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n
\r\n {data && data.length !== 0 && (\r\n
\r\n {data.map((item) => (\r\n ) => {\r\n ev.preventDefault()\r\n props.onTickerSelected?.(item.ticker)\r\n props.state?.setInputValue('')\r\n },\r\n }\r\n }\r\n />\r\n ))}\r\n
\r\n )}\r\n {props.isShowAllVisible && (\r\n \r\n Show All Results\r\n \r\n )}\r\n
\r\n )\r\n}\r\n","import { Placement } from '@popperjs/core'\r\nimport { useQueryErrorResetBoundary } from '@tanstack/react-query'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\n\r\nimport { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { ComboBox, useComboBoxState } from '../combo-box'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { IconNameType } from '../icon'\r\nimport { InputSize, InputTheme } from '../input'\r\nimport { List, ListItem, useListState } from '../list'\r\nimport { INSTRUMENT_CATEGORIES } from './constants'\r\nimport { SearchError } from './search-error'\r\nimport { SearchList } from './search-list'\r\nimport { getRedirectForTicker } from './util'\r\n\r\ninterface SearchProps {\r\n autoFocus?: boolean\r\n defaultValue?: string\r\n defaultPlacement?: Placement\r\n placeholder?: string\r\n theme?: keyof typeof InputTheme\r\n size?: keyof typeof InputSize\r\n allowCategorySwitching?: boolean\r\n inputClass?: string\r\n popoverClass?: string\r\n chartIndex?: number\r\n isMatchInputAndBoxWidth?: boolean\r\n isSearchIcon?: boolean\r\n isShowAllVisible?: boolean\r\n isSearchItemLink?: boolean\r\n rightContent?: JSX.Element | IconNameType\r\n onTickerSelected?: (ticker: string) => void\r\n}\r\n\r\nexport function Search({\r\n isSearchIcon = true,\r\n isShowAllVisible = true,\r\n isSearchItemLink = true,\r\n ...props\r\n}: SearchProps) {\r\n const { reset } = useQueryErrorResetBoundary()\r\n const state = useComboBoxState({\r\n minValueLength: 1,\r\n inputValue: props.defaultValue,\r\n placement: props.defaultPlacement ?? 'bottom-start',\r\n })\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const listState = useListState({ orientation: 'vertical' })\r\n const [category, setCategory] = React.useState(0)\r\n\r\n const changeCategory = React.useRef((ev: React.KeyboardEvent) => {\r\n switch (ev.key) {\r\n case 'ArrowRight':\r\n state.first()\r\n break\r\n case 'ArrowUp':\r\n setCategory((state) => (state - 1 + INSTRUMENT_CATEGORIES.length) % INSTRUMENT_CATEGORIES.length)\r\n break\r\n case 'ArrowDown':\r\n setCategory((state) => (state + 1) % INSTRUMENT_CATEGORIES.length)\r\n break\r\n }\r\n })\r\n\r\n /**\r\n * The search box can be child of a modal/dialog so we need to handle ESC\r\n * otherwise it would close both the combobox and the parent.\r\n */\r\n const onInputKeyDown = React.useCallback(\r\n (ev: React.KeyboardEvent) => {\r\n if (ev.key === 'Escape' && state.visible) {\r\n ev.stopPropagation()\r\n state.hide()\r\n }\r\n },\r\n // We only use `visible` and `hide` and don’t need the full state\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.visible, state.hide]\r\n )\r\n\r\n /**\r\n * Reset to category \"All\" when the combobox closes\r\n */\r\n React.useEffect(() => {\r\n if (isFullyClosed) {\r\n setCategory(0)\r\n }\r\n }, [isFullyClosed])\r\n\r\n return (\r\n {\r\n // prevent combobox from setting input value on input blur\r\n e.preventDefault()\r\n },\r\n inputClass: props.inputClass,\r\n rightContent: props.rightContent,\r\n ...(isSearchIcon && { leftContent: 'search' }),\r\n }}\r\n popoverProps={{\r\n className: classnames(props.popoverClass, 'sm:px-0 z-dialog', {\r\n 'w-full sm:w-110 px-2': !props.isMatchInputAndBoxWidth,\r\n 'min-w-[340px]': props.isMatchInputAndBoxWidth,\r\n }),\r\n style: {\r\n width: props.isMatchInputAndBoxWidth\r\n ? state.unstable_referenceRef.current?.getBoundingClientRect().width ?? 340\r\n : undefined,\r\n maxWidth: '100vw',\r\n },\r\n }}\r\n onChange={(value) => {\r\n if (isSearchItemLink) {\r\n window.location.href = getRedirectForTicker(value)\r\n } else {\r\n props.onTickerSelected?.(getSanitizedTicker(value))\r\n state.setInputValue('')\r\n }\r\n }}\r\n {...(props.chartIndex !== undefined && { inputTestId: `chart-${props.chartIndex}-settings-search-input` })}\r\n >\r\n
\r\n {props.allowCategorySwitching && (\r\n setCategory(index)}\r\n onKeyDown={changeCategory.current}\r\n >\r\n {INSTRUMENT_CATEGORIES.map((category) => (\r\n {category.name}\r\n ))}\r\n \r\n )}\r\n {!isFullyClosed && (\r\n \r\n \r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import * as Reakit from 'reakit/Combobox'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport function useComboBoxState(options?: Reakit.unstable_ComboboxInitialState) {\r\n return Reakit.unstable_useComboboxState({\r\n ...options,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n modal: false,\r\n inline: true,\r\n unstable_offset: [0, 5],\r\n })\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { PopoverStateReturn } from '../popover'\r\nimport { SelectItem } from './types'\r\n\r\nfunction getSelectedItemIndex(items: SelectItem[], value: unknown) {\r\n if (!value) return -1\r\n\r\n return items.findIndex((item) => item.value === value)\r\n}\r\n\r\n/**\r\n * Hook which handles select state and returns onChange handler\r\n */\r\nexport function useSelect>(\r\n state: PopoverStateReturn,\r\n defaultValue: ValueType | undefined,\r\n items: ItemType[],\r\n onChange: (item: ItemType) => void\r\n) {\r\n const [selectedIndex, setSelectedIndex] = React.useState(getSelectedItemIndex(items, defaultValue))\r\n const closePopover = React.useRef(() => state.hide())\r\n\r\n // Update select value on change from outside\r\n React.useEffect(() => {\r\n const newIndex = getSelectedItemIndex(items, defaultValue)\r\n setSelectedIndex(newIndex)\r\n }, [items, selectedIndex, defaultValue])\r\n\r\n const onItemChange = React.useCallback(\r\n (index: number, closeOnSelect = true) => {\r\n const selectedItem = items[index]\r\n setSelectedIndex(index)\r\n\r\n if (closeOnSelect) closePopover.current()\r\n onChange(selectedItem)\r\n\r\n if (!selectedItem.href || !selectedItem.reloadDocument) {\r\n return\r\n }\r\n\r\n if (typeof selectedItem.href === 'string') {\r\n window.location.href = selectedItem.href\r\n return\r\n }\r\n\r\n const newUrl = new URL(selectedItem.href.pathname!, window.location.href)\r\n newUrl.search = selectedItem.href.search ?? ''\r\n newUrl.hash = selectedItem.href.hash ?? ''\r\n\r\n window.location.href = newUrl.toString()\r\n },\r\n [items, onChange, setSelectedIndex]\r\n )\r\n\r\n return { selectedIndex, onItemChange }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps, ButtonTheme, ButtonThemeType } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon } from '../icon'\r\nimport { PopoverStateReturn, PopoverTrigger } from '../popover'\r\nimport { Spinner } from '../spinner'\r\n\r\nfunction getButtonProps(theme: ButtonTheme, active: boolean): Omit {\r\n switch (theme) {\r\n case ButtonTheme.light:\r\n return {\r\n theme: 'transparent',\r\n contentClass: 'font-normal truncate',\r\n className: classnames(\r\n 'border bg-white disabled:border-gray-100 disabled:bg-gray-50 disabled:text-gray-500 dark:bg-gray-800',\r\n {\r\n 'border-gray-100 hover:border-gray-300 disabled:hover:border-gray-100 dark:border-gray-600 dark:hover:border-gray-400 dark:disabled:border-gray-700':\r\n !active,\r\n 'border-blue-400 dark:border-blue-400': active,\r\n }\r\n ),\r\n rightContent: ,\r\n }\r\n case ButtonTheme.dark:\r\n return {\r\n theme: 'transparent',\r\n contentClass: 'font-normal truncate',\r\n className: classnames('border bg-gray-800 text-gray-50 disabled:border-gray-700 disabled:text-gray-500', {\r\n 'border-gray-600 hover:border-gray-400': !active,\r\n 'border-blue-400': active,\r\n }),\r\n rightContent: ,\r\n }\r\n default:\r\n return {}\r\n }\r\n}\r\n\r\nexport interface SelectButtonProps extends ButtonProps, ButtonHTMLProps {\r\n /**\r\n * Theme for the button\r\n *\r\n * @default light\r\n */\r\n theme?: ButtonThemeType\r\n\r\n isLoading?: boolean\r\n\r\n state?: PopoverStateReturn\r\n\r\n isPopoverTrigger?: boolean\r\n}\r\n\r\nexport function SelectButton({\r\n state,\r\n theme = 'light',\r\n isPopoverTrigger = true,\r\n isLoading,\r\n ...props\r\n}: SelectButtonProps) {\r\n const themeProps = React.useMemo(() => getButtonProps(ButtonTheme[theme], !!props.active), [theme, props.active])\r\n\r\n return (\r\n \r\n \r\n \r\n ) : (\r\n props.rightContent ?? themeProps.rightContent\r\n )\r\n }\r\n >\r\n {props.children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { useInRouterContext } from 'react-router-dom'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { ListItem } from '../list'\r\nimport { PopoverStateReturn, usePopoverState } from '../popover'\r\nimport { Label } from '../typography'\r\nimport { useSelect } from './hooks'\r\nimport { NativeSelect, NativeSelectInRouterContext } from './native-select'\r\nimport { SelectButton, SelectButtonProps } from './select-button'\r\nimport { SelectList, SelectListProps } from './select-list'\r\nimport { SelectItem } from './types'\r\n\r\n/**\r\n * All non-select props get passed to the button element, these are the supported props\r\n */\r\ntype ButtonPassthroughProps = Omit\r\n\r\nexport interface SelectProps extends ButtonPassthroughProps {\r\n /**\r\n * Optional popover state settings\r\n */\r\n popoverStateSettings?: Reakit.PopoverInitialState\r\n\r\n /**\r\n * Name of the select, will be included in `onChange` event\r\n */\r\n name?: Name\r\n\r\n /**\r\n * Current selected value\r\n */\r\n value?: ValueType\r\n\r\n /**\r\n * List of items to display in the select\r\n */\r\n items: ItemType[]\r\n\r\n /**\r\n * Callback when selected item changes\r\n */\r\n onChange?: (item: ItemType, name: Name) => void\r\n\r\n /**\r\n * Label to display above the select\r\n */\r\n label?: React.ReactNode\r\n\r\n /**\r\n * Text for the button (usually the selected value). Falls back to placeholder if not set\r\n */\r\n buttonContent?: React.ReactNode\r\n\r\n /**\r\n * Placeholder when no value is selected\r\n */\r\n placeholder?: string\r\n\r\n /**\r\n * Additional props to the popover list\r\n */\r\n listProps?: Omit\r\n\r\n /**\r\n * Optional label className override\r\n */\r\n labelClassName?: string\r\n\r\n /**\r\n * Optional label title className override\r\n */\r\n labelTitleClassName?: string\r\n\r\n /**\r\n * Should use native select element on mobile devices\r\n *\r\n * @default true\r\n */\r\n isNativeMobileSelect?: boolean\r\n\r\n /**\r\n * Set the popover to height to be limited by the viewport instead of having full height\r\n *\r\n * @default false\r\n */\r\n hasPopoverViewportHeightLimit?: boolean\r\n\r\n /**\r\n * Set the popover max-width to be limited by the trigger button\r\n */\r\n hasPopoverButtonWidthLimit?: boolean\r\n\r\n /**\r\n * Triggered when popover state visibility/animating changes\r\n */\r\n onIsInteractingChange?: (isInteracting: boolean) => void\r\n}\r\n\r\nexport function Select, Name = never>({\r\n children,\r\n popoverStateSettings,\r\n onIsInteractingChange,\r\n ...props\r\n}: SelectProps) {\r\n const popoverState = usePopoverState(popoverStateSettings)\r\n const { isFullyClosed } = getExtendedDialogState(popoverState)\r\n\r\n React.useEffect(() => {\r\n onIsInteractingChange?.(!isFullyClosed)\r\n }, [onIsInteractingChange, isFullyClosed])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport interface StatelessSelectProps extends SelectProps {\r\n /**\r\n * Popover state for handling list in popover\r\n */\r\n popoverState: PopoverStateReturn\r\n}\r\n\r\nexport function StatelessSelect, Name = never>({\r\n // Select\r\n name,\r\n label,\r\n value,\r\n items = [],\r\n onChange,\r\n labelClassName,\r\n labelTitleClassName,\r\n 'aria-label': ariaLabel,\r\n // Button\r\n theme,\r\n buttonContent,\r\n placeholder = 'Select value',\r\n // Popover\r\n popoverState,\r\n listProps,\r\n isNativeMobileSelect = true,\r\n hasPopoverViewportHeightLimit = false,\r\n hasPopoverButtonWidthLimit = true,\r\n children,\r\n ...props\r\n}: StatelessSelectProps) {\r\n const { selectedIndex, onItemChange } = useSelect(popoverState, value, items, (item) => onChange?.(item, name!))\r\n const showMobileSelect = isNativeMobileSelect && isMobile()\r\n\r\n /** Items can have `href` and be router Links. We need a way to account for this in native select */\r\n const isInRouterContext = useInRouterContext()\r\n const NativeSelectComponent = isInRouterContext ? NativeSelectInRouterContext : NativeSelect\r\n\r\n return (\r\n \r\n \r\n {buttonContent ?? items[selectedIndex!]?.label ?? placeholder}\r\n \r\n {showMobileSelect ? (\r\n
\r\n }\r\n buttonContent={getSelectedTimeframeLabel()}\r\n data-testid={`chart-${chartIndex}-timeframes-select`}\r\n hasPopoverViewportHeightLimit\r\n isNativeMobileSelect={false}\r\n hasPopoverButtonWidthLimit={false}\r\n listProps={selectWithTooltipListProps}\r\n >\r\n {timeFrameGroups.flatMap(({ timeframes }, groupIndex) => [\r\n ,\r\n ...timeframes.map((item) => {\r\n const isIconButtonActive = favoriteTimeframes.includes(item.value)\r\n let linkProps = {}\r\n if (item.href) {\r\n linkProps = {\r\n as: Link,\r\n to: item.href,\r\n reloadDocument: !!item.withReload,\r\n }\r\n }\r\n return (\r\n ) => {\r\n ev.stopPropagation()\r\n ev.preventDefault()\r\n onFavoriteTimeframeToggle(item)\r\n }}\r\n className={classNames('group -mr-2', {\r\n 'text-gray-300': !isIconButtonActive,\r\n 'text-yellow-200': isIconButtonActive,\r\n })}\r\n >\r\n \r\n \r\n \r\n ) : undefined\r\n }\r\n >\r\n {item.label}\r\n \r\n )\r\n }),\r\n ])}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Link } from 'react-router-dom'\r\n\r\nimport { useElementMeasure } from '../../hooks/use-element-measure'\r\nimport { BoxRounding } from '../box'\r\nimport { Button, ButtonPadding, ButtonProps, ButtonSize, ButtonSizeType } from '../button'\r\nimport { DateRangeBaseOption, DateRangeSelect } from './daterange-select'\r\nimport { LabelWithDelayedSpinner } from './label-with-delayed-spinner'\r\nimport { TimeframeBaseOption, TimeframeSelect } from './timeframe-select'\r\n\r\ninterface Props {\r\n isPremium?: boolean\r\n chartIndex?: number\r\n compactViewMaxBreakpointPx?: number\r\n timeFrameGroups: Array<{ label: string; timeframes: TimeFrame[] }>\r\n dateRangeGroups: Array<{ label?: string; dateRanges: DateRange[] }>\r\n selectedTimeframe: string\r\n selectedDateRange: string | null\r\n onTimeframeSelect: (value: TimeFrame) => void\r\n onDateRangeSelect: (value: DateRange) => void\r\n favoriteTimeframes: string[]\r\n onFavoriteTimeframeToggle: (value: TimeFrame) => void\r\n size?: ButtonSizeType\r\n loadingTimeframe?: string\r\n rounding?: keyof typeof BoxRounding\r\n isDateRangeAvailable?: boolean\r\n containerElement?: HTMLElement\r\n className?: string\r\n isFavoritesEnabled?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n isTimeframeSelectEnabled?: boolean\r\n isCompactOnly?: boolean\r\n theme?: ButtonProps['theme']\r\n}\r\n\r\nfunction getTimeframeChipElementId({ timeframe, chartIndex }: { timeframe: string; chartIndex: number }) {\r\n return `${chartIndex}-${timeframe}`\r\n}\r\n\r\nfunction getButtonPadding(size: ButtonSize): keyof typeof ButtonPadding {\r\n switch (size) {\r\n case ButtonSize.small:\r\n case ButtonSize.regular:\r\n return 'small'\r\n case ButtonSize.medium:\r\n return 'regular'\r\n case ButtonSize.large:\r\n return 'medium'\r\n case ButtonSize.none:\r\n return 'none'\r\n }\r\n}\r\n\r\nexport function TimeframeBar({\r\n isPremium = FinvizSettings.hasUserPremium,\r\n chartIndex = 0,\r\n compactViewMaxBreakpointPx = 400,\r\n timeFrameGroups,\r\n dateRangeGroups,\r\n selectedTimeframe,\r\n selectedDateRange,\r\n favoriteTimeframes,\r\n loadingTimeframe,\r\n onTimeframeSelect,\r\n onDateRangeSelect,\r\n onFavoriteTimeframeToggle,\r\n size,\r\n rounding = 'regular',\r\n isDateRangeAvailable = true,\r\n containerElement,\r\n className,\r\n isFavoritesEnabled = true,\r\n isScrollIntoViewEnabled = true,\r\n isTimeframeSelectEnabled,\r\n isCompactOnly = false,\r\n theme,\r\n}: Props) {\r\n const [scrollWrapperElement, setScrollWrapperElement] = React.useState(null)\r\n const [timeframeButtonsScrollLocation, setTimeframeButtonsScrollLocation] = React.useState({\r\n isOnLeftEdge: true,\r\n isOnRightEdge: true,\r\n })\r\n const { setElementRef, elementWidth } = useElementMeasure(containerElement)\r\n const flatTimeframes = React.useMemo(() => timeFrameGroups.flatMap(({ timeframes }) => timeframes), [timeFrameGroups])\r\n\r\n const timeframesInExpandedPanel = React.useMemo(\r\n () =>\r\n isFavoritesEnabled\r\n ? flatTimeframes.filter(({ value }) => value === selectedTimeframe || favoriteTimeframes.includes(value))\r\n : flatTimeframes,\r\n [flatTimeframes, selectedTimeframe, favoriteTimeframes, isFavoritesEnabled]\r\n )\r\n\r\n const isCompactView =\r\n isCompactOnly || elementWidth < compactViewMaxBreakpointPx || timeframesInExpandedPanel.length <= 1\r\n const checkTimeframeWrapperScrollPosition = React.useCallback(() => {\r\n if (scrollWrapperElement) {\r\n const isOnLeftEdge = scrollWrapperElement.scrollLeft === 0\r\n const isOnRightEdge =\r\n Math.ceil(scrollWrapperElement.offsetWidth + scrollWrapperElement.scrollLeft) >=\r\n scrollWrapperElement.scrollWidth\r\n\r\n if (\r\n timeframeButtonsScrollLocation.isOnLeftEdge !== isOnLeftEdge ||\r\n timeframeButtonsScrollLocation.isOnRightEdge !== isOnRightEdge\r\n ) {\r\n setTimeframeButtonsScrollLocation({ isOnLeftEdge, isOnRightEdge })\r\n }\r\n }\r\n }, [timeframeButtonsScrollLocation, scrollWrapperElement])\r\n\r\n React.useEffect(() => {\r\n checkTimeframeWrapperScrollPosition()\r\n }, [checkTimeframeWrapperScrollPosition, scrollWrapperElement, elementWidth])\r\n\r\n React.useEffect(() => {\r\n if (!isCompactView && isScrollIntoViewEnabled) {\r\n const timeframeElement = document.getElementById(\r\n getTimeframeChipElementId({ chartIndex, timeframe: selectedTimeframe })\r\n )\r\n\r\n if (timeframeElement && scrollWrapperElement) {\r\n const leftOffset =\r\n timeframeElement.offsetLeft + timeframeElement.clientWidth / 2 - scrollWrapperElement.clientWidth / 2\r\n\r\n scrollWrapperElement.scrollTo(Math.max(0, Math.min(leftOffset, scrollWrapperElement.scrollWidth)), 0)\r\n }\r\n }\r\n }, [isCompactView, chartIndex, selectedTimeframe, elementWidth, isScrollIntoViewEnabled, scrollWrapperElement])\r\n\r\n return (\r\n \r\n {(isTimeframeSelectEnabled ?? isFavoritesEnabled) && (\r\n
\r\n \r\n
\r\n )}\r\n {!isCompactView && (\r\n
\r\n \r\n {\r\n /*\r\n * Vertical scrolling doesn't scroll horizontally by default (it's possible when holding shift)\r\n * When using touchpad we may get values in both delatX and deltaY, so if someone's scrolling horizontally we don't want to do anything\r\n * but if they are scrolling vertically (deltaY > deltaX) we want to scroll horizontally the value they would nativally scroll in vertical direction\r\n * */\r\n const absDx = Math.abs(event.deltaX)\r\n const absDy = Math.abs(event.deltaY)\r\n if (absDy > absDx) {\r\n event.currentTarget.scrollLeft += event.deltaY\r\n }\r\n }}\r\n >\r\n {timeframesInExpandedPanel.map((timeframe) => {\r\n let linkProps = {}\r\n if (timeframe.href) {\r\n linkProps = {\r\n as: Link,\r\n to: timeframe.href,\r\n reloadDocument: timeframe.withReload ?? !isPremium,\r\n onClick: () => onTimeframeSelect(timeframe),\r\n }\r\n } else {\r\n linkProps = {\r\n onClick: (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n onTimeframeSelect(timeframe)\r\n },\r\n }\r\n }\r\n return (\r\n \r\n \r\n \r\n )\r\n })}\r\n
\r\n \r\n \r\n )}\r\n {isDateRangeAvailable && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { type To } from 'react-router-dom'\r\n\r\nimport { decodeQueryString, encodeQueryString } from '../../../app/queryString'\r\nimport { SpecificChartFunctionality } from '../../../app/shared/chartLayoutConfig'\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { DateRangeType, Instrument } from '../../types'\r\nimport { CUSTOM_DATE_RANGE, CustomDateRangePrefixEnum, DATE_RANGE_PREFIX_DELMITER } from './custom-date-range-utils'\r\n\r\ninterface ITimeFrame {\r\n value: TIMEFRAME | 'intraday'\r\n label: string\r\n labelShort: string\r\n labelPageTitle?: string\r\n}\r\n\r\nexport interface ITimeframeGroup {\r\n label: string\r\n timeframes: ITimeFrame[]\r\n}\r\n\r\ninterface IDateRange {\r\n value: string\r\n label: string\r\n timeframe?: TIMEFRAME\r\n}\r\n\r\nexport interface IRangeGroup {\r\n label?: string\r\n dateRanges: IDateRange[]\r\n}\r\n\r\nexport const generateTimeframeGroups = (isPremium = true): ITimeframeGroup[] => {\r\n const premiumTimeframes: ITimeframeGroup[] = [\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.i1, label: '1 Minute', labelShort: '1M' },\r\n { value: TIMEFRAME.i2, label: '2 Minutes', labelShort: '2M' },\r\n { value: TIMEFRAME.i3, label: '3 Minutes', labelShort: '3M' },\r\n { value: TIMEFRAME.i5, label: '5 Minutes', labelShort: '5M' },\r\n { value: TIMEFRAME.i10, label: '10 Minutes', labelShort: '10M' },\r\n { value: TIMEFRAME.i15, label: '15 Minutes', labelShort: '15M' },\r\n { value: TIMEFRAME.i30, label: '30 Minutes', labelShort: '30M' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.h, label: '1 Hour', labelShort: '1H', labelPageTitle: 'Hourly' },\r\n { value: TIMEFRAME.h2, label: '2 Hours', labelShort: '2H' },\r\n { value: TIMEFRAME.h4, label: '4 Hours', labelShort: '4H' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'D', labelPageTitle: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'W', labelPageTitle: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'M', labelPageTitle: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n const freeTimeframes = [\r\n {\r\n // intradayTimeframe is only for non premium users used as redirect to elite subscription\r\n label: '',\r\n timeframes: [{ value: 'intraday' as const, label: 'Intraday', labelShort: 'Intraday' }],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n return isPremium ? premiumTimeframes : freeTimeframes\r\n}\r\n\r\nexport function getTimeframeGroups(isPremium: boolean) {\r\n return generateTimeframeGroups(isPremium)\r\n}\r\n\r\nexport const generateDateRangeGroups = ({\r\n isPremium,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n instrument: Instrument\r\n}): IRangeGroup[] => {\r\n const isStock = instrument === Instrument.Stock\r\n const rangeGroups: Array<{ label?: string; dateRanges: IDateRange[] }> = [\r\n {\r\n label: 'Days',\r\n dateRanges: [\r\n { value: DateRangeType.d1, label: '1 Day', timeframe: isStock ? TIMEFRAME.i1 : TIMEFRAME.i5 },\r\n { value: DateRangeType.d5, label: '5 Days', timeframe: isStock ? TIMEFRAME.i5 : TIMEFRAME.i30 },\r\n ],\r\n },\r\n {\r\n label: 'Months',\r\n dateRanges: [\r\n { value: DateRangeType.m1, label: '1 Month', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m3, label: '3 Months', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m6, label: '6 Months', timeframe: TIMEFRAME.d },\r\n ],\r\n },\r\n {\r\n label: 'Years',\r\n dateRanges: [\r\n { value: DateRangeType.ytd, label: 'Year to Date', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y1, label: '1 Year', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y2, label: '2 Years', timeframe: TIMEFRAME.w },\r\n { value: DateRangeType.y5, label: '5 Years', timeframe: isPremium ? TIMEFRAME.w : TIMEFRAME.m },\r\n { value: DateRangeType.max, label: 'Max', timeframe: TIMEFRAME.m },\r\n ],\r\n },\r\n ]\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroups({\r\n isPremium,\r\n customRange,\r\n isCustomAvailable = true,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n customRange?: string\r\n isCustomAvailable?: boolean\r\n instrument: Instrument\r\n}) {\r\n const rangeGroups = generateDateRangeGroups({ isPremium, instrument })\r\n\r\n if (isPremium && isCustomAvailable !== false) {\r\n const [dateRangePrefix] = customRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n rangeGroups.push({\r\n dateRanges: [\r\n {\r\n value:\r\n customRange && Object.values(CustomDateRangePrefixEnum).includes(dateRangePrefix)\r\n ? customRange\r\n : CUSTOM_DATE_RANGE,\r\n label: 'Custom',\r\n },\r\n ],\r\n })\r\n }\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroupsWithHref({\r\n isPremium,\r\n customRange,\r\n generatePath,\r\n withReload,\r\n isCustomAvailable,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n isCustomAvailable?: boolean\r\n customRange?: string\r\n withReload?: boolean\r\n instrument: Instrument\r\n generatePath: (dateRange: IDateRange) => To\r\n}) {\r\n return getDateRangeGroups({\r\n isPremium,\r\n isCustomAvailable,\r\n customRange,\r\n instrument,\r\n }).map((dateRangeGroup: IRangeGroup) => ({\r\n label: dateRangeGroup.label,\r\n dateRanges: dateRangeGroup.dateRanges.map((dateRange) => ({\r\n ...dateRange,\r\n href:\r\n !isPremium || Object.values(DateRangeType).includes(dateRange.value as DateRangeType)\r\n ? generatePath(dateRange)\r\n : undefined,\r\n withReload: withReload ?? !isPremium,\r\n })),\r\n }))\r\n}\r\n\r\nconst FREE_PERIODS_STOCK = ['d', 'w', 'm']\r\n\r\nexport function generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname,\r\n timeframe,\r\n dateRange,\r\n utmCampaign,\r\n freeTimeframes = FREE_PERIODS_STOCK,\r\n dateRangeQueryKey = 'r',\r\n}: {\r\n isPremium: boolean\r\n pathname: string\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n utmCampaign?: string\r\n freeTimeframes?: string[]\r\n dateRangeQueryKey?: string\r\n}) {\r\n if (isPremium || freeTimeframes.includes(timeframe)) {\r\n return {\r\n pathname,\r\n search: `?${encodeQueryString({\r\n ...decodeQueryString(),\r\n i: undefined,\r\n p: timeframe,\r\n [dateRangeQueryKey]: dateRange ?? undefined,\r\n })}`,\r\n }\r\n }\r\n\r\n return {\r\n pathname: '/elite.ashx',\r\n search: `?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign || window.location.pathname,\r\n })}`,\r\n }\r\n}\r\n\r\nexport const timeframeUtm: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-timeframe',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe',\r\n}\r\n\r\nexport const daterangeUtm: Partial> = {\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe-daterange',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe-daterange',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe-daterange',\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { generateDateRangeGroups } from './utils'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// charts: app/utils/chart-date-range-utils.ts\r\n// *********************************\r\n\r\nexport enum CustomDateRangePrefixEnum {\r\n Range = 'range',\r\n Prev = 'prev',\r\n}\r\n\r\nexport const CUSTOM_DATE_RANGE = 'custom'\r\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\r\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\r\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\r\n\r\nexport function getParsedDateRange(dateRange?: string) {\r\n return dateRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n}\r\n\r\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\r\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\r\n const dateFrom = dateFromString ? new Date(dateFromString) : null\r\n const dateTo = dateToString ? new Date(dateToString) : null\r\n return {\r\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\r\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\r\n }\r\n }\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\r\n\r\n if ([years, months, days].some(Number.isNaN)) {\r\n return { start: null, end: null }\r\n }\r\n\r\n return {\r\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\r\n end: anchorDate,\r\n }\r\n }\r\n\r\n return { start: null, end: anchorDate }\r\n}\r\n\r\n// **************END**************\r\n// Functions below don't need to be\r\n// in sync with Website repository\r\n// *******************************\r\n\r\nconst DAYS_IN_YEAR = 365\r\n\r\nexport function getCustomStartEndDateRangeUrlParam({ start, end }: { start: Date | null; end: Date | null }) {\r\n const startString = start ? formatDateToStringUS(start) : ''\r\n const endString = end ? formatDateToStringUS(end) : ''\r\n\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Range,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n startString,\r\n CUSTOM_DATE_RANGE_DELIMITER,\r\n endString,\r\n ]\r\n\r\n return stringParts.join('').replace(/\\//g, '-')\r\n}\r\n\r\nexport function getPrevPeriodDateRangeUrlParam({\r\n years,\r\n months,\r\n days,\r\n}: {\r\n years: number\r\n months: number\r\n days: number\r\n}) {\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Prev,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n years,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n months,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n days,\r\n ]\r\n\r\n return stringParts.join('')\r\n}\r\n\r\nexport function getTimeframeForDateRangeType({\r\n dateRange,\r\n isPremium = true,\r\n instrument,\r\n}: {\r\n dateRange: string\r\n isPremium?: boolean\r\n instrument: Instrument\r\n}) {\r\n const dateRanges = generateDateRangeGroups({ isPremium, instrument }).flatMap(({ dateRanges }) => dateRanges)\r\n return dateRanges.find(({ value }) => value === dateRange)?.timeframe ?? null\r\n}\r\n\r\nexport function getTimeframeFromDateRange({\r\n dateRange,\r\n anchorDate,\r\n instrument,\r\n isPremium,\r\n}: {\r\n dateRange: string\r\n anchorDate: Date\r\n instrument: Instrument\r\n isPremium: boolean\r\n}) {\r\n const dateRangeTimeframe = getTimeframeForDateRangeType({ dateRange, instrument })\r\n if (dateRangeTimeframe) {\r\n return dateRangeTimeframe\r\n }\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n const startNyTime = start ?? new Date(0)\r\n const startToReferenceDateNumOfDays = dateFns.differenceInCalendarDays(anchorDate, startNyTime) + 1\r\n const rangeNumOfDays = dateFns.differenceInCalendarDays(end ?? anchorDate, startNyTime) + 1\r\n /**\r\n * DB_BARS_LIMIT - code below is dependent on amount of data we store for specific timeframes\r\n * Search DB_BARS_LIMIT in the project to find other places with such code.\r\n */\r\n if (rangeNumOfDays > 6 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 4 * DAYS_IN_YEAR) {\r\n return isPremium ? TIMEFRAME.w : TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 1.5 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.w\r\n }\r\n\r\n // Keep these values in sync with values in FetchQuoteIntraday in quote.cs\r\n if (instrument === Instrument.Stock) {\r\n if (rangeNumOfDays <= 1 && startToReferenceDateNumOfDays <= 11) {\r\n return TIMEFRAME.i1\r\n }\r\n\r\n if (rangeNumOfDays <= 5 && startToReferenceDateNumOfDays <= 16) {\r\n return TIMEFRAME.i5\r\n }\r\n\r\n if (rangeNumOfDays <= 7 && startToReferenceDateNumOfDays <= 200) {\r\n return TIMEFRAME.i30\r\n }\r\n } else {\r\n if (startToReferenceDateNumOfDays <= 2) {\r\n return TIMEFRAME.i5\r\n }\r\n if (startToReferenceDateNumOfDays <= 7) {\r\n return TIMEFRAME.i30\r\n }\r\n }\r\n\r\n return TIMEFRAME.d\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { Button } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { DatePicker } from '../date-picker'\r\nimport { Delayed } from '../delayed'\r\nimport { Dialog, DialogBody, DialogFooter, DialogHeader } from '../dialog'\r\nimport { Input } from '../input'\r\nimport { Spinner } from '../spinner'\r\nimport {\r\n CustomDateRangePrefixEnum,\r\n getCustomStartEndDateRangeUrlParam,\r\n getParsedDateRange,\r\n getPrevPeriodDateRangeUrlParam,\r\n parseCustomDateRangeUrlParam,\r\n} from './custom-date-range-utils'\r\n\r\nconst DATA_YEAR_START = 1980\r\nconst DATE_PICKER_MIN_DATE = new Date(`01/01/${DATA_YEAR_START}`)\r\nconst YEARS_MAX_VALUE = new Date().getFullYear() - DATA_YEAR_START\r\n\r\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button', className: 'flex-1', contentClass: 'text-center' } as const\r\n\r\nexport enum CustomRangeType {\r\n StartEnd,\r\n Manual,\r\n}\r\n\r\ninterface StartEndRange {\r\n kind: CustomRangeType.StartEnd\r\n start: Date | null\r\n end: Date | null\r\n}\r\n\r\ninterface ManualRange {\r\n kind: CustomRangeType.Manual\r\n days?: number\r\n months?: number\r\n years?: number\r\n}\r\n\r\nexport type CustomDateRangeType = StartEndRange | ManualRange\r\n\r\ninterface DialogContentProps {\r\n /**\r\n * Dialog state\r\n */\r\n dialogState: any\r\n dateRange?: string\r\n anchorDate: Date\r\n onDialogSubmit: (args: { dateRange: string | null }) => void\r\n isFetching?: boolean\r\n}\r\n\r\nconst DEFAULT_MANUAL_RANGE: ManualRange = {\r\n kind: CustomRangeType.Manual,\r\n days: 0,\r\n months: 0,\r\n years: 0,\r\n}\r\n\r\nconst DEFAULT_START_END_RANGE: StartEndRange = {\r\n kind: CustomRangeType.StartEnd,\r\n start: null,\r\n end: null,\r\n}\r\n\r\nfunction isValidManualRangeState({ years = 0, months = 0, days = 0 }: ManualRange) {\r\n return years + months + days > 0\r\n}\r\n\r\nfunction isValidStartEndRangeState({ start, end }: StartEndRange) {\r\n return !!(start || end)\r\n}\r\n\r\nfunction getDefaultSelectedTab(dateRange?: string) {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return CustomRangeType.StartEnd\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n return CustomRangeType.Manual\r\n }\r\n }\r\n return CustomRangeType.StartEnd\r\n}\r\n\r\nfunction getDefaultSelectedDate({\r\n dateRange,\r\n anchorDate,\r\n}: {\r\n dateRange?: string\r\n anchorDate: Date\r\n}): CustomDateRangeType {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return { kind: CustomRangeType.StartEnd, start, end }\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev && start && end) {\r\n const { years, months, days } = dateFns.intervalToDuration({\r\n start: dateFns.sub(start, { days: 1 }),\r\n end,\r\n })\r\n return { kind: CustomRangeType.Manual, years, months, days }\r\n }\r\n }\r\n\r\n return DEFAULT_START_END_RANGE\r\n}\r\n\r\nexport function CustomDateRange({\r\n dialogState,\r\n dateRange,\r\n anchorDate,\r\n onDialogSubmit,\r\n isFetching,\r\n}: DialogContentProps) {\r\n const [selectedTab, setSelectedTab] = React.useState(getDefaultSelectedTab(dateRange))\r\n\r\n const [state, setState] = React.useState(getDefaultSelectedDate({ dateRange, anchorDate }))\r\n\r\n const { current: onChange } = React.useRef((kind: CustomRangeType, newValue: Partial) => {\r\n setState((prevState) => {\r\n if (kind === CustomRangeType.Manual) {\r\n const defaults = prevState?.kind === CustomRangeType.Manual ? prevState : DEFAULT_MANUAL_RANGE\r\n return { ...defaults, ...newValue } as ManualRange\r\n }\r\n if (kind === CustomRangeType.StartEnd) {\r\n const defaults = prevState?.kind === CustomRangeType.StartEnd ? prevState : DEFAULT_START_END_RANGE\r\n\r\n const newState = { ...defaults, ...newValue }\r\n if (newState.start && newState.end && newState.start.getTime() > newState.end.getTime()) {\r\n const newEnd = new Date(newState.start.getTime())\r\n newState.start = newState.end\r\n newState.end = newEnd\r\n }\r\n return newState\r\n }\r\n return prevState\r\n })\r\n })\r\n\r\n const handleSubmit = (ev: React.FormEvent) => {\r\n ev.preventDefault()\r\n\r\n let dateRange = null\r\n\r\n if (state?.kind === CustomRangeType.StartEnd && isValidStartEndRangeState(state)) {\r\n dateRange = getCustomStartEndDateRangeUrlParam({ start: state.start, end: state.end })\r\n } else if (state?.kind === CustomRangeType.Manual && isValidManualRangeState(state)) {\r\n dateRange = getPrevPeriodDateRangeUrlParam({\r\n days: state.days ?? 0,\r\n months: state.months ?? 0,\r\n years: state.years ?? 0,\r\n })\r\n }\r\n\r\n onDialogSubmit({ dateRange })\r\n }\r\n\r\n const isAbsolute = state?.kind === CustomRangeType.StartEnd\r\n const fromDate = isAbsolute ? state.start : DEFAULT_START_END_RANGE.start\r\n const toDate = isAbsolute ? state.end : DEFAULT_START_END_RANGE.end\r\n\r\n const manualRange = {\r\n ...DEFAULT_MANUAL_RANGE,\r\n ...(state?.kind === CustomRangeType.Manual ? state : {}),\r\n }\r\n\r\n return (\r\n \r\n \r\n Custom Date Range\r\n \r\n
\r\n \r\n \r\n setSelectedTab(CustomRangeType.StartEnd)}\r\n >\r\n Start / End\r\n \r\n setSelectedTab(CustomRangeType.Manual)}\r\n >\r\n Range\r\n \r\n \r\n\r\n {selectedTab === CustomRangeType.StartEnd ? (\r\n
\r\n onChange(CustomRangeType.StartEnd, { start })}\r\n >\r\n \r\n \r\n onChange(CustomRangeType.StartEnd, { end })}\r\n >\r\n \r\n \r\n
\r\n ) : (\r\n
\r\n ) =>\r\n onChange(CustomRangeType.Manual, { years: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { months: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { days: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n
\r\n )}\r\n
\r\n \r\n
\r\n \r\n setState(state.kind === CustomRangeType.Manual ? DEFAULT_MANUAL_RANGE : DEFAULT_START_END_RANGE)\r\n }\r\n >\r\n Reset\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\nimport { To, useNavigate } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { useDialogState } from '../dialog'\r\nimport { getTimeframeFromDateRange } from './custom-date-range-utils'\r\n\r\ninterface IPathForTimeframeDateRangeProps {\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n ticker?: string\r\n}\r\n\r\ninterface IUseCustomDateRangeDialogSubmitProps {\r\n anchorDate?: Date\r\n instrument?: Instrument\r\n shouldReloadOnNavigate?: boolean\r\n pathGenerator?: ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\r\n pathname: string\r\n search: string\r\n }\r\n}\r\n\r\nexport function useCustomDateRangeDialog({\r\n anchorDate,\r\n instrument,\r\n pathGenerator,\r\n shouldReloadOnNavigate = false,\r\n}: IUseCustomDateRangeDialogSubmitProps) {\r\n const navigate = useNavigate()\r\n const customDateRangeDialogState = useDialogState()\r\n\r\n const isPremium = FinvizSettings.hasUserPremium\r\n\r\n const handleDateRangeSelect = React.useCallback(\r\n (\r\n { value, timeframe, href }: { value: string; timeframe?: TIMEFRAME; href?: To },\r\n callback?: ({ value, timeframe, href }: { value: string; timeframe: TIMEFRAME; href?: To }) => void\r\n ) => {\r\n if (!timeframe) {\r\n if (isPremium) {\r\n customDateRangeDialogState.show()\r\n }\r\n return\r\n }\r\n\r\n if (!href && pathGenerator) {\r\n const path = pathGenerator({ timeframe, dateRange: value })\r\n if (shouldReloadOnNavigate) {\r\n window.location.href = `${path.pathname}?${path.search}`\r\n } else {\r\n navigate(path)\r\n }\r\n }\r\n\r\n callback?.({ value, timeframe, href })\r\n },\r\n [navigate, customDateRangeDialogState, isPremium, pathGenerator, shouldReloadOnNavigate]\r\n )\r\n\r\n const getDateRangeTimeframe = React.useCallback(\r\n (dateRange: string | null) => {\r\n if (!anchorDate || !instrument || !dateRange) return null\r\n\r\n return {\r\n value: dateRange,\r\n timeframe: getTimeframeFromDateRange({\r\n dateRange: dateRange!,\r\n anchorDate,\r\n isPremium,\r\n instrument,\r\n }),\r\n }\r\n },\r\n [anchorDate, instrument, isPremium]\r\n )\r\n\r\n const onDialogSubmit = React.useCallback(\r\n ({ value: dateRange, timeframe: newTimeframe }: { value: string; timeframe: TIMEFRAME }) => {\r\n handleDateRangeSelect({\r\n value: dateRange,\r\n timeframe: newTimeframe,\r\n })\r\n customDateRangeDialogState.hide()\r\n },\r\n // We only want `customDateRangeDialogState.hide`, not the whole dialog\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [customDateRangeDialogState.hide, handleDateRangeSelect]\r\n )\r\n\r\n return { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { useSyncLocalStorage } from '../../hooks/use-sync-local-storage'\r\n\r\ntype FavoriteTimeframesMap = { [K in TIMEFRAME | 'intraday']?: boolean }\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS = {\r\n [TIMEFRAME.i1]: true,\r\n [TIMEFRAME.i2]: false,\r\n [TIMEFRAME.i3]: true,\r\n [TIMEFRAME.i5]: true,\r\n [TIMEFRAME.i10]: false,\r\n [TIMEFRAME.i15]: true,\r\n [TIMEFRAME.i30]: true,\r\n [TIMEFRAME.h]: true,\r\n [TIMEFRAME.h2]: false,\r\n [TIMEFRAME.h4]: false,\r\n [TIMEFRAME.d]: true,\r\n [TIMEFRAME.w]: true,\r\n [TIMEFRAME.m]: true,\r\n}\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS_FREE = {\r\n ...TIMEFRAME_FAVORITE_DEFAULTS,\r\n intraday: true,\r\n}\r\n\r\nconst LOCAL_STORAGE_KEY = 'favoriteTimeframesMap'\r\n\r\nexport function useFavoriteTimeframes(isPremium = true) {\r\n const { state, setState } = useSyncLocalStorage(\r\n LOCAL_STORAGE_KEY,\r\n isPremium ? TIMEFRAME_FAVORITE_DEFAULTS : TIMEFRAME_FAVORITE_DEFAULTS_FREE\r\n )\r\n\r\n const toggleFavoriteTimeframe = React.useCallback(\r\n (timeframe: TIMEFRAME) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n [timeframe]: !prevState[timeframe],\r\n }))\r\n },\r\n [setState]\r\n )\r\n\r\n const favoriteTimeframes = React.useMemo(\r\n () => Object.keys(state).filter((key) => state[key as keyof FavoriteTimeframesMap]),\r\n [state]\r\n )\r\n\r\n return {\r\n favoriteTimeframes: isPremium ? favoriteTimeframes : Object.keys(TIMEFRAME_FAVORITE_DEFAULTS_FREE),\r\n toggleFavoriteTimeframe,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { getExtendedDialogState } from './dialog'\r\nimport { Input, InputHTMLProps, InputProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipTrigger, useTooltipState } from './tooltip'\r\n\r\ntype TooltipInputProps = InputProps & InputHTMLProps & { isInteractive?: boolean }\r\n\r\nexport interface TooltipInputWrapperProps extends Pick {\r\n children: React.ReactElement\r\n /**\r\n * Tooltip text content\r\n */\r\n tooltipContent?: React.ReactNode\r\n tooltipColor?: keyof typeof TooltipColor\r\n tooltipSettings?: Reakit.TooltipInitialState\r\n}\r\n\r\nfunction TooltipInputWrapper({\r\n children,\r\n tooltipContent,\r\n tooltipColor,\r\n tooltipSettings,\r\n name,\r\n}: TooltipInputWrapperProps) {\r\n const tooltip = useTooltipState({ placement: 'bottom', ...tooltipSettings })\r\n const { isFullyClosed } = getExtendedDialogState(tooltip)\r\n\r\n return (\r\n <>\r\n ev.preventDefault()}\r\n onMouseLeave={(ev) => ev.preventDefault()}\r\n >\r\n {children}\r\n \r\n {tooltipContent && !isFullyClosed && (\r\n \r\n {tooltipContent}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n {\r\n tooltipContent,\r\n tooltipColor,\r\n tooltipSettings,\r\n isInteractive = true,\r\n ...props\r\n }: TooltipInputProps & Omit,\r\n ref: React.ForwardedRef\r\n) {\r\n const input = \r\n\r\n if (!isInteractive) {\r\n return input\r\n }\r\n\r\n return (\r\n \r\n {input}\r\n \r\n )\r\n}\r\n\r\nexport const TooltipInput = React.forwardRef(TooltipInputComponent)\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipColor } from './types'\r\n\r\nexport interface TooltipBoxProps extends Omit, 'ref'> {\r\n /**\r\n * Color of the tooltip. If se to `none`, the tooltip will have default color\r\n * based on light/dark theme\r\n *\r\n * @default 'none'\r\n */\r\n color?: keyof typeof TooltipColor\r\n}\r\n\r\nexport const TooltipBox = React.forwardRef(function TooltipBox(\r\n { color = 'none', ...props }: TooltipBoxProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const tooltipColor = TooltipColor[color]\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n})\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { TooltipArrow } from './tooltip-arrow'\r\nimport { TooltipBox, TooltipBoxProps } from './tooltip-box'\r\n\r\ninterface TooltipProps extends TooltipBoxProps {\r\n /**\r\n * The returned object from `useTooltipState`\r\n */\r\n state: Reakit.TooltipStateReturn\r\n}\r\n\r\nexport function Tooltip({ state, children, color = 'none', ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...tooltipProps }) => (\r\n
\r\n \r\n \r\n \r\n \r\n {children}\r\n \r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\ninterface TooltipButtonProps extends Reakit.TooltipReferenceHTMLProps {\r\n state: Reakit.TooltipStateReturn\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 ({ state, ...props }: TooltipButtonProps, ref: React.ForwardedRef) => (\r\n \r\n {props.children}\r\n \r\n )\r\n)\r\n","import * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\n/**\r\n * Hook which provides state to tooltips\r\n */\r\nexport function useTooltipState(settings?: Reakit.TooltipInitialState) {\r\n return Reakit.useTooltipState({\r\n ...settings,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { TooltipColor } from './types'\r\n\r\ntype PositionMain = 'auto' | 'top' | 'bottom' | 'left' | 'right'\r\ntype PositionSecondary = 'start' | 'end'\r\ntype Placement = PositionMain | `${PositionMain}-${PositionSecondary}`\r\n\r\nconst transformMap: Record = {\r\n auto: '',\r\n top: 'rotateZ(180deg)',\r\n right: 'rotateZ(-90deg)',\r\n bottom: 'rotateZ(360deg)',\r\n left: 'rotateZ(90deg)',\r\n}\r\n\r\ninterface TooltipArrowProps {\r\n color?: keyof typeof TooltipColor\r\n placement: Placement\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\r\n const arrowColor = TooltipColor[color]\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","export enum TooltipColor {\r\n none,\r\n green,\r\n red,\r\n orange,\r\n blue,\r\n dark,\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ComponentProps, ElementType, HTMLProps, PropsWithChildren, ReactNode } from 'react'\r\n\r\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6\r\n\r\ninterface HeadingProps extends HTMLProps {\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({ level, children, ...props }: PropsWithChildren) {\r\n return React.createElement(\r\n 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 'text-sm': level === 5,\r\n 'text-2xs': level === 6,\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface ParagraphProps extends Omit>, 'size' | 'as'> {\r\n /**\r\n * Determines which element the text should render to\r\n *\r\n * @default p\r\n */\r\n as?: ElementType\r\n\r\n /**\r\n * Font size for the paragraph\r\n * - tiny - 10px\r\n * - small - 12px\r\n * - default - 14px\r\n * - medium - 16px\r\n * - large - 18px\r\n *\r\n * @default default\r\n */\r\n size?: 'tiny' | 'small' | 'default' | 'medium' | 'large'\r\n\r\n /**\r\n * Paragraph font weight\r\n */\r\n medium?: boolean\r\n}\r\n\r\nexport function Paragraph({\r\n as = 'p',\r\n size = 'default',\r\n medium,\r\n children,\r\n ...props\r\n}: PropsWithChildren>) {\r\n return React.createElement(\r\n as,\r\n {\r\n ...props,\r\n className: classnames(props.className, {\r\n 'font-medium': medium,\r\n 'text-lg': size === 'large',\r\n 'text-sm': size === 'default',\r\n 'text-2xs': size === 'small',\r\n 'text-3xs': size === 'tiny',\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface LabelProps extends Omit, 'title'> {\r\n title?: ReactNode\r\n titleClassName?: string\r\n}\r\n\r\nexport function Label({ title, titleClassName, children, ...props }: PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","export const CRYPTO_TICKERS = [\r\n 'BTCUSD',\r\n 'LTCUSD',\r\n 'ETHUSD',\r\n 'XRPUSD',\r\n 'BCHUSD',\r\n 'BTCEUR',\r\n 'LTCEUR',\r\n 'ETHEUR',\r\n 'XRPEUR',\r\n 'BCHEUR',\r\n 'LTCBTC',\r\n 'ETHBTC',\r\n 'XRPBTC',\r\n 'BCHBTC',\r\n]\r\n\r\n// Keep in sync with the copy in Charts repo - app/constants/common.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n","// Copy if this file is in charts repo in app/utils/ folder\r\nimport * as React from 'react'\r\n\r\nexport function useIsMounted() {\r\n const isMountedRef = React.useRef(false)\r\n const getIsMounted = React.useCallback(() => isMountedRef.current, [])\r\n\r\n React.useEffect(() => {\r\n isMountedRef.current = true\r\n return () => {\r\n isMountedRef.current = false\r\n }\r\n }, [])\r\n\r\n return getIsMounted\r\n}\r\n","import debounce from 'lodash.debounce'\r\nimport * as React from 'react'\r\n\r\nimport { useIsMounted } from './use-is-mounted'\r\nimport { useResizeObserver } from './use-resize-observer'\r\n\r\nexport function useElementMeasure(elementOverride: HTMLElement | null = null) {\r\n const ResizeObserver = useResizeObserver()\r\n const getIsMounted = useIsMounted()\r\n const [elementRef, setElementRef] = React.useState(elementOverride)\r\n const [elementWidth, setElementWidth] = React.useState(elementRef?.offsetWidth ?? 0)\r\n const [elementHeight, setElementHeight] = React.useState(elementRef?.offsetHeight ?? 0)\r\n\r\n React.useEffect(() => {\r\n if (!ResizeObserver) {\r\n return\r\n }\r\n\r\n const measureElement = () => {\r\n if (!getIsMounted()) {\r\n return\r\n }\r\n const newElementWidth = elementRef?.offsetWidth\r\n const newElementHeight = elementRef?.offsetHeight\r\n if (newElementWidth !== elementWidth) {\r\n setElementWidth(newElementWidth ?? 0)\r\n }\r\n if (newElementHeight !== elementHeight) {\r\n setElementHeight(newElementHeight ?? 0)\r\n }\r\n }\r\n const measureElementDebounced = debounce(measureElement, 200)\r\n\r\n const resizeObserver = new ResizeObserver((entries) => {\r\n /**\r\n * the reason for requestAnimationFrame is described here https://github.com/quasarframework/quasar/issues/2233\r\n * their approach was mostly to intercept and silence the error but I managed to avoid the error using requestAnimationFrame\r\n * */\r\n window.requestAnimationFrame(() => {\r\n if (Array.isArray(entries) && entries.length > 0) {\r\n measureElementDebounced()\r\n }\r\n })\r\n })\r\n\r\n if (elementRef) {\r\n resizeObserver.observe(elementRef)\r\n }\r\n\r\n measureElement()\r\n\r\n return () => {\r\n measureElementDebounced.cancel()\r\n resizeObserver?.disconnect()\r\n }\r\n }, [ResizeObserver, elementWidth, elementRef, elementHeight, getIsMounted])\r\n\r\n return { setElementRef: elementOverride ? () => {} : setElementRef, elementWidth, elementHeight }\r\n}\r\n","import React from 'react'\r\n\r\nimport { DropdownStateReturn } from '../components/dropdown'\r\nimport { PopoverStateReturn } from '../components/popover'\r\nimport { useWindowSize } from './use-window-size'\r\n\r\ntype Props = {\r\n maxHeightLimit: number\r\n hasViewportHeightLimit: boolean\r\n offsets: [number, number]\r\n state: PopoverStateReturn | DropdownStateReturn\r\n}\r\n\r\nconst MAX_HEIGHT_PROPERTY = '--popover-max-height'\r\nconst POPOVER_HEIGHT_LIMIT_STYLE = {\r\n maxHeight: `calc(var(${MAX_HEIGHT_PROPERTY}) - env(safe-area-inset-bottom))`,\r\n}\r\n\r\n/**\r\n * Limit popover height to be always in viewport is `hasViewportHeightLimit` is true\r\n */\r\nexport function usePopoverMaxHeight({ maxHeightLimit, hasViewportHeightLimit, offsets, state }: Props) {\r\n const { innerHeight } = useWindowSize({ isWatching: state.visible || state.animating })\r\n const buttonElement = state.unstable_referenceRef.current\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !hasViewportHeightLimit) return\r\n\r\n // calculate height\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const [, offsetY] = offsets\r\n let elementMaxHeight = 'auto'\r\n if (state.placement.startsWith('bottom')) {\r\n let height = innerHeight - buttonRect.bottom - offsetY * 2\r\n // when used on pages where is scrollable content, buttonRect.bottom is sometimes negative\r\n // in that case we need to subtract window.scrollY\r\n if (buttonRect.bottom < 0) height -= window.scrollY\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n } else {\r\n const height = buttonRect.top - offsetY * 2\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n }\r\n\r\n // set height\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n popoverWrapper?.style.setProperty(MAX_HEIGHT_PROPERTY, elementMaxHeight)\r\n }, [buttonElement, innerHeight, maxHeightLimit, hasViewportHeightLimit, offsets, state.placement, state.visible])\r\n\r\n return hasViewportHeightLimit ? POPOVER_HEIGHT_LIMIT_STYLE : undefined\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { loadResizeObserverPolyfill } from '../util'\r\n\r\nexport function useResizeObserver() {\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const [ResizeObserver, setResizeObserver] = React.useState(\r\n () => window.ResizeObserver\r\n )\r\n\r\n React.useEffect(() => {\r\n if (typeof ResizeObserver === 'undefined') {\r\n loadResizeObserverPolyfill().then((polyfill) => {\r\n if (!controller.current?.signal.aborted) {\r\n setResizeObserver(() => polyfill)\r\n }\r\n })\r\n }\r\n }, [ResizeObserver])\r\n\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n return ResizeObserver\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SortDirectionValue, SortableValue } from '../types'\r\nimport { sortByColumn } from '../util'\r\n\r\nexport interface SortByShape {\r\n id: IdType\r\n\r\n /**\r\n * Provide value calculation for sort when value is computed in column renderer\r\n */\r\n getValueForSort?: (row: DataType) => SortableValue\r\n}\r\n\r\nexport function isSortByShape(sortBy?: unknown): sortBy is SortByShape {\r\n return sortBy?.hasOwnProperty?.('id') === true\r\n}\r\n\r\n/**\r\n * Default value getter which gets row data by `getValueForSort` defined on the column\r\n * If no sort value getter is provided, it falls back to getting data by column.id or returns the whole row\r\n */\r\nexport function getDefaultValueGetter(column: SortBy) {\r\n return (row: DataType): SortableValue => {\r\n let value = null\r\n\r\n if (isSortByShape(column)) {\r\n if (typeof column.getValueForSort === 'function') value = column.getValueForSort(row)\r\n else if (typeof row === 'object') value = row?.[column.id as keyof typeof row]\r\n } else {\r\n value = row\r\n }\r\n\r\n return (value as SortableValue) ?? null\r\n }\r\n}\r\n\r\nexport function useSortData({\r\n data,\r\n sortBy,\r\n direction,\r\n valueGetter = getDefaultValueGetter,\r\n}: {\r\n data: DataType[]\r\n sortBy: SortBy\r\n direction: SortDirectionValue\r\n valueGetter?: (sortBy: SortBy) => (row: DataType) => SortableValue\r\n}) {\r\n return React.useMemo(\r\n () =>\r\n [...data].sort((a, b) =>\r\n sortByColumn({\r\n a,\r\n b,\r\n direction,\r\n valueGetter: valueGetter(sortBy),\r\n })\r\n ),\r\n [sortBy, data, direction, valueGetter]\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport * as storage from '../services/local-storage'\r\n\r\n/**\r\n * Hook to synchronize localStorage.setItem across all components on the page on all open tabs\r\n */\r\nexport function useSyncLocalStorage(storageKey: string, defaultValue: ValueType) {\r\n const [state, setState] = React.useState(storage.getValue(storageKey, defaultValue))\r\n\r\n React.useEffect(() => {\r\n const subscription = storage.subscribeToChanges(storageKey, defaultValue, setState)\r\n\r\n return () => {\r\n subscription.unsubscribe()\r\n }\r\n }, [storageKey, defaultValue])\r\n\r\n const setValue = React.useCallback(\r\n (valueGetter: React.SetStateAction) => storage.setValue(storageKey, valueGetter, defaultValue),\r\n [defaultValue, storageKey]\r\n )\r\n\r\n return {\r\n state,\r\n setState: setValue,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport * as tracking from '../../app/shared/tracking'\r\n\r\nexport function useTrackPageView(props?: { trackInitial?: boolean; trackAutomatically?: boolean }) {\r\n const { trackInitial = false, trackAutomatically = true } = props ?? {}\r\n const initialRender = React.useRef(trackInitial)\r\n const location = useLocation()\r\n\r\n const handleTrackView = React.useCallback(() => {\r\n tracking.trackPageView({ pathname: location.pathname, query: location.search })\r\n }, [location.pathname, location.search])\r\n\r\n React.useEffect(() => {\r\n if (!trackAutomatically) return\r\n if (initialRender.current) handleTrackView()\r\n initialRender.current = true\r\n }, [trackAutomatically, handleTrackView, trackInitial])\r\n\r\n return handleTrackView\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","import * as React from 'react'\r\nimport { usePopper } from 'react-popper'\r\n\r\nimport { usePopoverMaxHeight } from '../../hooks/use-popover-maxHeight'\r\nimport { Button } from '../button'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { Dropdown, DropdownItem, DropdownSeparator, useDropdownState } from '../dropdown'\r\nimport { ObjectHash } from '../types'\r\n\r\nconst DEFAULT_OFFSETS: [number, number] = [5, 5]\r\n\r\nfunction getVirtualRef(top: number, left: number) {\r\n return {\r\n getBoundingClientRect(): DOMRect {\r\n const rect = {\r\n top: top - window.scrollY,\r\n x: top - window.scrollY,\r\n left: left - window.scrollX,\r\n y: left - window.scrollX,\r\n bottom: top,\r\n right: left,\r\n width: 0,\r\n height: 0,\r\n }\r\n\r\n return {\r\n ...rect,\r\n toJSON: () => rect,\r\n }\r\n },\r\n }\r\n}\r\n\r\nexport interface IContextMenuOption {\r\n type?: never\r\n id: string\r\n label: React.ReactNode\r\n onClick?: () => void\r\n options?: ContextMenuItem[]\r\n gtag?: ObjectHash\r\n}\r\n\r\ninterface IContextMenuDivider {\r\n type: 'divider'\r\n label?: React.ReactNode\r\n}\r\n\r\nexport type ContextMenuItem = IContextMenuOption | IContextMenuDivider\r\n\r\ninterface ContextMenuProps {\r\n /**\r\n * Top coordinate of the click\r\n */\r\n top: number\r\n\r\n /**\r\n * Left coordinate of the click\r\n */\r\n left: number\r\n\r\n /**\r\n * Can limit the max height of the menu\r\n *\r\n * @default undefined\r\n */\r\n menuMaxHeight?: number\r\n\r\n /**\r\n * Items visible in the menu\r\n */\r\n items: ContextMenuItem[]\r\n\r\n /**\r\n * Callback to hide the menu\r\n */\r\n hide: () => void\r\n}\r\n\r\nexport function ContextMenu({ top, left, menuMaxHeight, hide, items }: ContextMenuProps) {\r\n const [popperElement, setPopperElement] = React.useState(null)\r\n const virtualRef = React.useMemo(() => getVirtualRef(top, left), [left, top])\r\n const dropdownState = useDropdownState({ placement: 'bottom-start' })\r\n const { isFullyClosed } = getExtendedDialogState(dropdownState)\r\n const hasBeenOpen = React.useRef(false)\r\n\r\n const { styles, attributes } = usePopper(virtualRef, popperElement, {\r\n placement: 'auto-end',\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: DEFAULT_OFFSETS,\r\n },\r\n },\r\n ],\r\n })\r\n\r\n /**\r\n * This effect handles closing the context menu (parent element) itself\r\n */\r\n React.useEffect(() => {\r\n if (isFullyClosed && hasBeenOpen.current) hide()\r\n }, [isFullyClosed, hide])\r\n\r\n /**\r\n * This effect handles opening/closing the inner dropdown\r\n */\r\n React.useEffect(() => {\r\n dropdownState.show()\r\n hasBeenOpen.current = true // This acts as a way to differentiate the first render\r\n\r\n return () => dropdownState.hide()\r\n // This needs to run only on mount/unmount for obvious reasons\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return (\r\n \r\n }\r\n menuMaxHeight={menuMaxHeight}\r\n state={dropdownState}\r\n items={items}\r\n isStatic\r\n />\r\n \r\n )\r\n}\r\n\r\ninterface ContextMenuInnerProps {\r\n label: JSX.Element\r\n items: ContextMenuItem[]\r\n state: ReturnType\r\n isStatic?: boolean\r\n menuMaxHeight?: number\r\n}\r\n\r\nfunction ContextMenuInner(\r\n { label, items, state, isStatic, menuMaxHeight = Number.MAX_SAFE_INTEGER }: ContextMenuInnerProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const innerState = useDropdownState({ placement: 'right-start' })\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: menuMaxHeight,\r\n hasViewportHeightLimit: true,\r\n offsets: DEFAULT_OFFSETS,\r\n state,\r\n })\r\n\r\n return (\r\n \r\n {items.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return {item.label}\r\n }\r\n\r\n if (item?.options !== undefined) {\r\n return (\r\n \r\n {item.label}\r\n \r\n }\r\n items={item.options}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n {\r\n item.onClick?.()\r\n window.gtag?.('event', 'context-menu', Object.assign({ menu_option: item.id }, item.gtag))\r\n }}\r\n data-testid={`dropdown-menu-${item.id}`}\r\n className=\"shrink-0\"\r\n >\r\n {item.label}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nconst ContextMenuDropdown = React.forwardRef(ContextMenuInner)\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\ninterface GridLayoutProps extends React.HTMLProps {\r\n /**\r\n * Number of columns\r\n */\r\n columns?: number\r\n\r\n /**\r\n * Number of rows\r\n */\r\n rows?: number\r\n\r\n /**\r\n * Whether or not a border is rendered between and around items. eg. charts\r\n * on HP won’t have a border\r\n *\r\n * @default false\r\n */\r\n border?: boolean\r\n}\r\n\r\nexport const ChartGridCell = React.forwardRef(\r\n ({ children, gridArea, className, ...props }, ref) => (\r\n \r\n {children}\r\n \r\n )\r\n)\r\n\r\ninterface ChartGridCellProps extends React.HTMLProps {\r\n /**\r\n * Css grid-area value\r\n */\r\n gridArea?: string\r\n}\r\n\r\nexport function GridLayout({ columns = 1, rows = 1, border = false, children, className, ...props }: GridLayoutProps) {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\ninterface ChartGridProps extends GridLayoutProps {\r\n isResizable?: boolean\r\n}\r\n\r\nexport const ChartGrid: React.FC = (props) => \r\n","import * as React from 'react'\r\n\r\nimport { PropsWithAs, RequireByKey } from '../types'\r\n\r\nconst defaultValueAccessor: ValueAccessor = (data) => data\r\n\r\nconst DEFAULT_VALUE_KEY = 'value'\r\nconst DEFAULT_CHANGE_KEY = 'onChange'\r\n\r\ntype ValueAccessor<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n> = (...args: Parameters[ChangeKey]>) => React.ComponentProps[ValueKey]\r\n\r\nexport type InnerStateProps<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps,\r\n ChangeKey extends keyof React.ComponentProps,\r\n> = RequireByKey, 'as'> & {\r\n valueKey?: ValueKey\r\n changeKey?: ChangeKey\r\n valueAccessor?: ValueAccessor\r\n}\r\n\r\nexport function InnerState<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n>({\r\n as: asComponent,\r\n valueKey = 'value' as ValueKey,\r\n changeKey = 'onChange' as ChangeKey,\r\n valueAccessor = defaultValueAccessor,\r\n ...props\r\n}: InnerStateProps) {\r\n const { [valueKey]: value, [changeKey]: onChange } = props\r\n const [state, setState] = React.useState[ValueKey]>(value)\r\n\r\n const handleChange = React.useCallback>(\r\n (...args) => {\r\n setState(valueAccessor(...args))\r\n onChange(...args)\r\n },\r\n [onChange, valueAccessor]\r\n )\r\n\r\n return React.createElement(asComponent, {\r\n ...props,\r\n [valueKey]: state,\r\n [changeKey]: handleChange,\r\n })\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { getDefaultValueGetter } from '../../hooks/use-sort-data'\r\nimport { columnMap } from '../../modules/portfolio/constants/columns'\r\nimport { ColumnId, PortfolioGroup, RowKind, TableColumnDefinition } from '../../modules/portfolio/types'\r\nimport { getColumnsByKeys } from '../../modules/portfolio/utils'\r\nimport { SortableValue } from '../../types'\r\nimport { SortDirection, Table, TableCell, TableHead, TableHeaderSortable, TableRow, useTableSort } from '../Table'\r\n\r\ninterface PortfolioWatchlistTableProps {\r\n data: PortfolioGroup[]\r\n selectedPortfolio: number\r\n handleTickerSelect: (ticker: string) => void\r\n chartTicker?: string\r\n isSelectClosed: boolean\r\n tableOrder: ColumnId\r\n handleOrderChange: (column: ColumnId) => void\r\n}\r\n\r\nconst visibleColumns = getColumnsByKeys([\r\n ColumnId.Ticker,\r\n ColumnId.LastClose,\r\n ColumnId.LastChangePct,\r\n ColumnId.LastChange,\r\n])\r\nconst sortableColumns = [columnMap[ColumnId.Order], ...visibleColumns]\r\n\r\nconst IS_MOBILE = isMobile()\r\n\r\nfunction isElementOverflowing(el: HTMLElement, containerElement?: HTMLDivElement) {\r\n if (!containerElement) return false\r\n\r\n const element = el.getBoundingClientRect()\r\n const container = containerElement.getBoundingClientRect()\r\n\r\n return element.top >= container.top && element.bottom <= container.bottom\r\n}\r\n\r\nfunction valueGetter(column: TableColumnDefinition) {\r\n const columnValueGetter = column.getValueForSort\r\n\r\n if (typeof columnValueGetter === 'undefined') return getDefaultValueGetter(column)\r\n\r\n return (row: PortfolioGroup): SortableValue => columnValueGetter({ kind: RowKind.Group, row }) ?? null\r\n}\r\n\r\nexport function PortfolioWatchlistTable({\r\n data,\r\n handleTickerSelect,\r\n chartTicker,\r\n selectedPortfolio,\r\n isSelectClosed,\r\n tableOrder,\r\n handleOrderChange,\r\n}: PortfolioWatchlistTableProps) {\r\n const tableSort = useTableSort({ data, columns: sortableColumns, valueGetter })\r\n const [selectedRow, setSelectedRow] = React.useState()\r\n const [containerElement, setContainerElement] = React.useState()\r\n\r\n React.useEffect(() => {\r\n const element = document.querySelector('[data-js=\"portfolio-watchlist-table-sidebar-container\"]')\r\n if (element) setContainerElement(element as HTMLDivElement)\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n const rowElement = document.querySelector(`[data-ticker=\"${chartTicker}\"]`) as HTMLElement\r\n if (isSelectClosed && rowElement !== document.activeElement && data.some(({ ticker }) => chartTicker === ticker)) {\r\n setSelectedRow(chartTicker)\r\n rowElement?.focus()\r\n }\r\n // We want to trigger this only on portfolio change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectedPortfolio, isSelectClosed, chartTicker])\r\n\r\n const handleKeyDown = (ev: React.KeyboardEvent, index: number) => {\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault()\r\n } else {\r\n return\r\n }\r\n\r\n const prevSibling = ev.currentTarget.previousElementSibling as HTMLElement | null\r\n const nextSibling = ev.currentTarget.nextElementSibling as HTMLElement | null\r\n const firstElement = ev.currentTarget.parentElement?.firstElementChild as HTMLElement | null\r\n const lastElement = ev.currentTarget.parentElement?.lastElementChild as HTMLElement | null\r\n\r\n if (ev.key === 'ArrowDown') {\r\n nextSibling?.focus({ preventScroll: true })\r\n if (!nextSibling) firstElement?.focus({ preventScroll: true })\r\n const el = document.activeElement as HTMLElement | null\r\n if (el && !isElementOverflowing(el, containerElement)) {\r\n document.activeElement?.scrollIntoView(false)\r\n }\r\n }\r\n if (ev.key === 'ArrowUp') {\r\n prevSibling?.focus({ preventScroll: true })\r\n if (!prevSibling) lastElement?.focus({ preventScroll: true })\r\n const el = document.activeElement as HTMLElement | null\r\n if (el && !isElementOverflowing(el, containerElement)) {\r\n document.activeElement?.scrollIntoView(index <= 1 ? false : true)\r\n }\r\n }\r\n\r\n const ticker = (document.activeElement as HTMLElement | null)?.dataset.ticker\r\n\r\n if (ticker) {\r\n setSelectedRow(ticker)\r\n }\r\n }\r\n\r\n const handleKeyUp = React.useCallback(\r\n (ev: React.KeyboardEvent) => {\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault()\r\n const ticker = (document.activeElement as HTMLElement | null)?.dataset.ticker\r\n if (ticker) {\r\n handleTickerSelect(ticker)\r\n }\r\n }\r\n },\r\n [handleTickerSelect]\r\n )\r\n\r\n const handleTableMouseMove = (ev: React.MouseEvent) => {\r\n if (!selectedRow) {\r\n ev.currentTarget.focus({ preventScroll: true })\r\n }\r\n }\r\n\r\n const handleSortChange = React.useCallback(\r\n (column: TableColumnDefinition) => {\r\n let newSort = column\r\n if (tableSort.sort.column.id === column.id && tableSort.sort.direction === SortDirection.Descending) {\r\n newSort = sortableColumns[0]\r\n }\r\n\r\n tableSort.changeSort(newSort)\r\n handleOrderChange(newSort.id)\r\n },\r\n [handleOrderChange, tableSort]\r\n )\r\n\r\n // Update sort when props change (used for watchlist sidebar header)\r\n React.useEffect(() => {\r\n if (tableOrder !== tableSort.sort.column.id) tableSort.changeSort(columnMap[tableOrder])\r\n // Only run this on props change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [tableOrder])\r\n\r\n return (\r\n \r\n \r\n {visibleColumns.map((column) => (\r\n handleSortChange(column)}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n \r\n {tableSort.data.map((entry, index) => (\r\n {\r\n setSelectedRow(entry.ticker)\r\n handleTickerSelect(entry.ticker)\r\n }}\r\n onMouseMove={handleTableMouseMove}\r\n onKeyDown={(ev) => handleKeyDown(ev, index)}\r\n onKeyUp={handleKeyUp}\r\n >\r\n {visibleColumns.map((column) => (\r\n \r\n {column.renderColumn({ kind: RowKind.Watchlist, row: entry, index })}\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react'\r\n\r\nimport { Label } from './typography'\r\n\r\nexport enum RangeSize {\r\n small = 'sm:h-6', // 24px height\r\n regular = 'sm:h-7', // 28px height\r\n medium = 'sm:h-8', // 32px height\r\n large = 'sm:h-9', // 36px height\r\n}\r\n\r\ntype InputProps = HTMLProps\r\n\r\ninterface RangeSliderProps extends Omit {\r\n /**\r\n * Label which is rendered above the select\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Range size. All inputs have forced height on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof RangeSize\r\n\r\n /**\r\n * Element which will be rendered on the left side of the slider\r\n */\r\n leftContent?: ReactNode\r\n\r\n /**\r\n * Element which will be rendered on the right side of the slider\r\n */\r\n rightContent?: ReactNode\r\n\r\n /**\r\n * Class name for the wrapper element\r\n */\r\n className?: string\r\n\r\n /**\r\n * Class name for the input element\r\n */\r\n inputClassName?: string\r\n\r\n /**\r\n * Min value for the input\r\n *\r\n * @default 0\r\n */\r\n min?: number\r\n\r\n /**\r\n * Max value for the input\r\n *\r\n * @default 100\r\n */\r\n max?: number\r\n\r\n /**\r\n * Step value for the input\r\n *\r\n * @default 1\r\n */\r\n step?: number\r\n\r\n /**\r\n * Current value\r\n */\r\n value: number\r\n\r\n /**\r\n * Callback when value changes\r\n */\r\n onChange: InputProps['onChange']\r\n}\r\n\r\nexport function RangeSlider({\r\n label,\r\n size = 'regular',\r\n leftContent,\r\n rightContent,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n className,\r\n inputClassName,\r\n ...props\r\n}: RangeSliderProps) {\r\n const [hasTrack, setHasTrack] = useState(false)\r\n const trackRef = useRef(null)\r\n const thumbRef = useRef(null)\r\n\r\n useEffect(() => {\r\n setHasTrack(Boolean(trackRef.current && thumbRef.current))\r\n }, [])\r\n\r\n const thumbLeft = useMemo(() => {\r\n const track = trackRef.current\r\n const thumb = thumbRef.current\r\n const valuePercent = (props.value - min) / (max - min)\r\n\r\n if (!hasTrack || !track || !thumb) return\r\n\r\n const trackBox = track.getBoundingClientRect()\r\n const thumbBox = thumb.getBoundingClientRect()\r\n\r\n return ((valuePercent * (trackBox.width - thumbBox.width)) / trackBox.width) * 100\r\n }, [min, max, props.value, hasTrack])\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { ButtonRoundingType, ButtonThemeType } from '../button'\r\nimport { IconNameType } from '../icon'\r\n\r\nexport enum ToolbarTheme {\r\n chipTransparent, // (default)\r\n alternative,\r\n}\r\n\r\nexport enum ToolbarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n\r\nexport type ToolbarDirectionType = keyof typeof ToolbarDirection\r\n\r\nexport interface IButtonThemeSettings {\r\n className?: string\r\n theme: ButtonThemeType\r\n rounding: ButtonRoundingType\r\n}\r\n\r\nexport interface IToolbarItem {\r\n id: string\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport type ToolbarThemeType = keyof typeof ToolbarTheme\r\n","import * as React from 'react'\r\n\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\nexport interface IToolbarContext {\r\n direction: ToolbarDirection\r\n theme: ToolbarTheme\r\n isWrapped: boolean\r\n isStretched: boolean\r\n isMobile: boolean\r\n}\r\n\r\nexport const ToolbarContext = React.createContext({\r\n direction: ToolbarDirection.vertical,\r\n theme: ToolbarTheme.chipTransparent,\r\n isWrapped: false,\r\n isStretched: false,\r\n isMobile: false,\r\n})\r\n\r\nexport function useToolbarContext() {\r\n return React.useContext(ToolbarContext)\r\n}\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport React from 'react'\r\n\r\nimport { isSafariDesktop } from '../../../app/shared/isMobile'\r\nimport { IToolbarContext, ToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarDirectionType, ToolbarTheme, ToolbarThemeType } from './interfaces'\r\n\r\nconst getToolbarSettings = ({\r\n direction,\r\n isWrapped,\r\n isMobile,\r\n theme,\r\n}: IToolbarContext): React.HTMLProps => {\r\n switch (isWrapped) {\r\n case true:\r\n return {\r\n className: classnames('shrink-0 items-center bg-white dark:bg-gray-800', {\r\n 'flex flex-wrap justify-between': direction === ToolbarDirection.vertical,\r\n 'grid border border-gray-100 dark:border-gray-600 p-1.5 gap-1 border-box rounded-md grid-cols-2':\r\n FinvizSettings.hasRedesignEnabled,\r\n }),\r\n }\r\n\r\n default:\r\n return {\r\n className: classnames('flex shrink-0 items-center p-1.5 bg-white dark:bg-gray-800', {\r\n 'space-x-1.5 px-1.5': direction === ToolbarDirection.horizontal && FinvizSettings.hasRedesignEnabled,\r\n 'flex-col overflow-hidden overflow-y-auto [--inset-l:0.5rem] landscape-primary:pl-inset-left':\r\n direction === ToolbarDirection.vertical,\r\n 'space-y-2': direction === ToolbarDirection.vertical && !isMobile,\r\n 'pb-inset-bottom [--inset-b:0.5rem]': theme !== ToolbarTheme.alternative && !isMobile,\r\n 'w-screen space-x-2 overflow-hidden overflow-x-auto':\r\n direction === ToolbarDirection.horizontal && theme !== ToolbarTheme.alternative,\r\n 'overflow-x-hidden': theme === ToolbarTheme.alternative,\r\n 'relative z-10 rounded-md border border-gray-100 dark:border-gray-600': isMobile,\r\n }),\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarProps {\r\n /**\r\n * Toolbar direction\r\n *\r\n * @default vertical\r\n */\r\n direction?: ToolbarDirectionType\r\n\r\n /**\r\n * Toolbar buttons theme\r\n *\r\n * @default light\r\n */\r\n theme?: ToolbarThemeType\r\n\r\n /**\r\n * Charts mobile design\r\n *\r\n * @default false\r\n */\r\n isMobile?: boolean\r\n\r\n className?: string\r\n}\r\n\r\nexport function Toolbar({\r\n direction = 'vertical',\r\n theme = 'chipTransparent',\r\n isMobile = false,\r\n children,\r\n className,\r\n}: React.PropsWithChildren) {\r\n const toolbarRef = React.useRef(null)\r\n const contextProviderValue = React.useMemo(\r\n () => ({\r\n direction: ToolbarDirection[direction],\r\n theme: ToolbarTheme[theme],\r\n isWrapped:\r\n ToolbarDirection[direction] === ToolbarDirection.vertical && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isStretched:\r\n ToolbarDirection[direction] === ToolbarDirection.horizontal && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isMobile,\r\n }),\r\n [direction, theme, isMobile]\r\n )\r\n const toolbarSettings = getToolbarSettings(contextProviderValue)\r\n\r\n React.useLayoutEffect(() => {\r\n // Workaround for Safari scrollbar bug https://github.com/finvizhq/charts/issues/1038\r\n // Safari injects scrollbar after layout render and doesn't trigger reflow\r\n if (ToolbarTheme[theme] !== ToolbarTheme.alternative && isSafariDesktop()) {\r\n const forceReflow = throttle(() => {\r\n if (toolbarRef.current !== null) {\r\n const originalWidth = toolbarRef.current.style.width\r\n toolbarRef.current.style.width = '0'\r\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\r\n toolbarRef.current.offsetWidth\r\n toolbarRef.current.style.width = originalWidth\r\n }\r\n }, 200)\r\n\r\n forceReflow()\r\n window.addEventListener('resize', forceReflow)\r\n\r\n return () => {\r\n window.removeEventListener('resize', forceReflow)\r\n }\r\n }\r\n }, [theme])\r\n\r\n // reason for key is that popover is sealing initial state, description in\r\n // https://github.com/finvizhq/Finviz-Website/pull/402\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon } from '../icon'\r\nimport { Spinner } from '../spinner'\r\nimport { PropsWithAs } from '../types'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\n\r\nfunction getButtonThemeSettings({\r\n theme,\r\n isActive,\r\n isStretched,\r\n isInAction,\r\n}: {\r\n theme: ToolbarTheme\r\n isStretched: boolean\r\n isActive?: boolean\r\n isInAction?: boolean\r\n}): Omit & ButtonProps {\r\n const includeRedesign = FinvizSettings.hasRedesignEnabled\r\n switch (theme) {\r\n case ToolbarTheme.alternative:\r\n return {\r\n className: classnames(\r\n {\r\n grow: isStretched,\r\n 'h-10 w-10': !isStretched && !includeRedesign,\r\n 'animate-pulse': isInAction,\r\n },\r\n\r\n !includeRedesign && {\r\n 'active:bg-white disabled:bg-white disabled:text-gray-300 disabled:hover:text-gray-300': true,\r\n 'border border-white text-gray-500 hover:border-gray-100 hover:text-gray-900': !isActive,\r\n 'border border-gray-900 text-gray-900': isActive,\r\n }\r\n ),\r\n theme: includeRedesign ? 'chipTransparent' : 'transparent',\r\n rounding: includeRedesign ? undefined : 'none',\r\n size: isStretched || includeRedesign ? undefined : 'none',\r\n }\r\n default:\r\n return {\r\n className: classnames(\r\n 'border dark:disabled:bg-gray-800 dark:disabled:text-gray-600 disabled:text-gray-300 disabled:bg-white dark:disabled:hover:bg-gray-800 dark:disabled:hover:text-gray-600 disabled:hover:text-gray-300 disabled:hover:bg-white',\r\n {\r\n 'animate-pulse': isInAction,\r\n 'border-transparent text-gray-500 hover:bg-gray-100 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200':\r\n !isActive,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': isActive,\r\n }\r\n ),\r\n theme: 'transparent',\r\n rounding: 'small',\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarButtonProps extends Omit {\r\n item: IToolbarItem\r\n disabledTooltip?: string\r\n isInAction?: boolean\r\n isLoading?: boolean\r\n}\r\n\r\nexport function ToolbarButton({\r\n item,\r\n disabledTooltip,\r\n isInAction: isInActionProp,\r\n isLoading,\r\n ...props\r\n}: PropsWithAs & ToolbarButtonProps) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const isInAction = isInActionProp && item.iconAction !== undefined\r\n const buttonSettings = getButtonThemeSettings({\r\n theme,\r\n isStretched,\r\n isActive: props.active,\r\n isInAction: isInAction,\r\n })\r\n\r\n const getMainIcon = () => (\r\n \r\n )\r\n\r\n return (\r\n & ToolbarButtonProps)}\r\n appearance={props.appearance ?? 'square'}\r\n title={props.disabled && disabledTooltip ? disabledTooltip : (props.active && item.titleActive) || item.title}\r\n size={\r\n buttonSettings.size ??\r\n (theme === ToolbarTheme.chipTransparent || FinvizSettings.hasRedesignEnabled ? 'medium' : 'large')\r\n }\r\n >\r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {props.children ??\r\n (isInAction ? (\r\n \r\n \r\n \r\n ) : (\r\n getMainIcon()\r\n ))}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Icon } from '../icon'\r\nimport { PopoverTrigger, useHoverPopover } from '../popover'\r\nimport { SelectOption } from '../select'\r\nimport { useSelect } from '../select/hooks'\r\nimport { NativeSelect } from '../select/native-select'\r\nimport { SelectList } from '../select/select-list'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\nimport { ToolbarButton } from './toolbar-button'\r\n\r\nexport interface ToolbarGroupProps {\r\n /**\r\n * Main button item\r\n */\r\n defaultItem: IToolbarItem\r\n\r\n /**\r\n * Shows spinner instead of icon\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Current selected item id\r\n */\r\n isActive: boolean\r\n\r\n /**\r\n * Should indicate some action in progress\r\n */\r\n isInAction?: boolean\r\n\r\n /**\r\n * Array of items\r\n */\r\n groupItems: IToolbarItem[]\r\n\r\n /**\r\n * Expand group button label\r\n */\r\n groupTitle?: string\r\n\r\n /**\r\n * On item select callback\r\n */\r\n onChange: (id: string, trigger: 'button' | 'select' | 'group') => void\r\n\r\n /**\r\n * Use native select for mobile devices\r\n *\r\n * @default true\r\n */\r\n useNativeSelect?: boolean\r\n\r\n /**\r\n * Is item disabled\r\n */\r\n disabled?: boolean\r\n\r\n /**\r\n * Tooltip message if item is disabled\r\n */\r\n disabledTooltip?: string\r\n}\r\n\r\nexport function ToolbarGroup({\r\n defaultItem,\r\n isActive,\r\n isLoading,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect = isMobile(),\r\n disabled,\r\n disabledTooltip,\r\n}: ToolbarGroupProps) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const [selectedItem, setSelectedItem] = React.useState(defaultItem)\r\n const groupId = groupTitle?.replace(/\\s/g, '-').toLocaleLowerCase()\r\n const isAlternativeTheme = theme === ToolbarTheme.alternative\r\n const popoverState = useHoverPopover({\r\n placement: isAlternativeTheme && isStretched ? 'bottom' : 'right-start',\r\n })\r\n const select = useSelect(\r\n popoverState,\r\n selectedItem.id,\r\n groupItems?.map((i) => ({ value: i.id, label: i.title })) ?? [],\r\n (option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }\r\n )\r\n\r\n return (\r\n \r\n ) => {\r\n ev.preventDefault()\r\n ev.stopPropagation()\r\n onChange(selectedItem.id, 'group')\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n {useNativeSelect ? (\r\n ({ value: item.id, label: item.title }))}\r\n onChange={select.onItemChange}\r\n onClick={() => onChange(selectedItem.id, 'select')}\r\n />\r\n ) : (\r\n \r\n {groupItems.map((item) => (\r\n }\r\n data-testid={`toolbar-group-${groupId}-${item.id}`}\r\n >\r\n {item.title}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { PartialBy } from '../../types'\r\nimport { ToolbarButton } from './toolbar-button'\r\nimport { ToolbarGroup, ToolbarGroupProps } from './toolbar-group'\r\n\r\nexport function ToolbarItem({\r\n defaultItem,\r\n isLoading,\r\n isActive,\r\n isInAction,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect,\r\n disabled,\r\n disabledTooltip,\r\n}: PartialBy) {\r\n const isItemActive = isActive && !disabled\r\n\r\n if (!!groupItems?.length) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n {\r\n onChange(defaultItem.id, 'button')\r\n }}\r\n />\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { useToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\ntype ToolbarDividerProps = {\r\n className?: string\r\n}\r\n\r\nexport function ToolbarDivider({ className }: ToolbarDividerProps) {\r\n const { direction, theme } = useToolbarContext()\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Box } from '../box'\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { TourStep } from './types'\r\n\r\nexport function StepContent({ step }: { step: TourStep }) {\r\n return (\r\n \r\n {step.title && (\r\n \r\n {step.title}\r\n \r\n )}\r\n {step.body && {step.body}}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as ReactDOM from 'react-dom/server'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport {\r\n BUTTON_BASE_CLASS,\r\n BUTTON_FOCUS_STYLES,\r\n ButtonPadding,\r\n ButtonRounding,\r\n ButtonSize,\r\n ButtonTheme,\r\n getButtonTheme,\r\n} from '../button'\r\nimport { StepContent } from './step-content'\r\nimport { TourDefinition, TourStep } from './types'\r\n\r\ntype ExcludesFalse = (x: T | false) => x is T\r\n\r\n/**\r\n * Async load Shepherd module when we need it\r\n */\r\nlet shepherdLibrary: typeof Shepherd\r\nexport async function loadShepherdLibrary(setLoading: (state: boolean) => void) {\r\n if (shepherdLibrary) return shepherdLibrary\r\n\r\n try {\r\n setLoading(true)\r\n const shepherdPromise = await import('shepherd.js')\r\n shepherdLibrary = shepherdPromise.default\r\n setLoading(false)\r\n\r\n return shepherdLibrary\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Get buttons based on index in the step array\r\n */\r\nconst buttonClasses = classnames(BUTTON_BASE_CLASS, BUTTON_FOCUS_STYLES, ButtonSize.regular, ButtonRounding.regular)\r\nfunction getStepButtons(tour: Shepherd.Tour, step: TourStep, index: number, arr: TourStep[]) {\r\n return [\r\n {\r\n action: tour.complete,\r\n classes: classnames(buttonClasses, 'mr-auto', getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: 'Exit',\r\n },\r\n index > 0 && {\r\n action: tour.back,\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: step.backButton ?? 'Back',\r\n },\r\n {\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.blue).button, ButtonPadding.regular),\r\n action: tour.next,\r\n text: step.nextButton ?? (index === arr.length - 1 ? 'Finish' : 'Next'),\r\n },\r\n ].filter(Boolean as unknown as ExcludesFalse)\r\n}\r\n\r\n/**\r\n * Convert tour steps to Shepherd steps\r\n */\r\nexport function processSteps(tour: Shepherd.Tour, steps: TourStep[]): Shepherd.Step.StepOptions[] {\r\n return steps.map((step, index) => ({\r\n attachTo: { element: step.target, on: step.placement ?? 'auto' },\r\n classes: 'z-dialog',\r\n // Add offset\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: step.offset ?? [0, 10],\r\n },\r\n },\r\n ],\r\n },\r\n // Render the body\r\n text: ReactDOM.renderToString(React.createElement(StepContent, { step })),\r\n // Add buttons\r\n buttons: getStepButtons(tour, step, index, steps),\r\n modalOverlayOpeningRadius: step.overlayRadius ?? 8,\r\n modalOverlayOpeningPadding: step.overlayPadding ?? 0,\r\n }))\r\n}\r\n\r\nexport function getTourKey() {\r\n return `tour${window.location.pathname.replace(/[/.]/g, '-')}`\r\n}\r\n\r\nexport function getStepsForUser(tours: TourDefinition[]) {\r\n const lastFinishedTour = localStorage.getItem(getTourKey())\r\n const lastTourIndex = tours.findIndex((tour) => tour.id === lastFinishedTour)\r\n const allToursViewed = lastTourIndex === tours.length - 1 || tours.slice(lastTourIndex + 1).every((item) => item.skip)\r\n const toursToView = allToursViewed ? tours : tours.slice(lastTourIndex + 1)\r\n const userTour = toursToView.reduce(\r\n (acc, current) =>\r\n current.skip\r\n ? acc\r\n : {\r\n ...acc,\r\n id: current.id,\r\n steps: [...acc.steps, ...current.steps],\r\n },\r\n { id: 'tour', steps: [], initialTour: toursToView[0].id }\r\n )\r\n\r\n return { hasNewTours: !allToursViewed, tour: userTour }\r\n}\r\n\r\nexport function completeTour(key: string) {\r\n localStorage.setItem(getTourKey(), key)\r\n}\r\n","import * as React from 'react'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport { TourDefinition } from './types'\r\nimport * as tourUtils from './utils'\r\n\r\nexport const DEFAULT_OPTIONS = {\r\n exitOnEsc: true,\r\n useModalOverlay: true,\r\n}\r\n\r\n/**\r\n * Hook which controls shepherd.js. The library is lazy-loaded when the tour starts\r\n *\r\n * Returns:\r\n * - `isLoading`: state of the library loading\r\n * - `currentTour`: tour object, only defined after library has loaded\r\n * - `startTour`: load the library and start tour. Returns `currentTour`\r\n * - `getStepsForUser`: returns a list of tour steps based on tours the user finished\r\n * - `completeTour`: persists the last finished tour to local storage\r\n */\r\nexport function useTour(options?: Shepherd.Tour.TourOptions) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [currentTour, setTour] = React.useState(null)\r\n\r\n /**\r\n * We’re loading shepherd asynchronously and want to have loading state so we use\r\n * AbortController to check if the component is still mounted.\r\n */\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const loadingSetter = React.useRef((state: boolean) => {\r\n if (controller.current?.signal.aborted) return\r\n\r\n setIsLoading(state)\r\n })\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n const startTour = React.useCallback(\r\n async (definition: TourDefinition, setComplete = true) => {\r\n const shepherdLibrary = await tourUtils.loadShepherdLibrary(loadingSetter.current)\r\n\r\n if (shepherdLibrary && !controller.current?.signal.aborted) {\r\n const tour = currentTour ?? new shepherdLibrary.Tour({ ...DEFAULT_OPTIONS, ...options })\r\n\r\n if (!currentTour) setTour(tour)\r\n\r\n // Reset the tour steps in case they were updated\r\n Array.from(tour.steps).forEach((step) => tour.removeStep(step.id))\r\n\r\n const processedSteps = tourUtils.processSteps(tour, definition.steps)\r\n tour.addSteps(processedSteps)\r\n\r\n if (setComplete) {\r\n tourUtils.completeTour(definition.id)\r\n }\r\n\r\n tour.start()\r\n window.gtag?.('event', 'tour-start', { event_label: definition.initialTour ?? definition.id })\r\n\r\n return tour\r\n }\r\n },\r\n [currentTour, options]\r\n )\r\n\r\n return {\r\n isLoading,\r\n currentTour,\r\n startTour,\r\n getStepsForUser: tourUtils.getStepsForUser,\r\n completeTour: tourUtils.completeTour,\r\n }\r\n}\r\n","import * as time from '../../app/header/time'\r\nimport * as button from './button'\r\nimport * as buttonGroup from './button-group'\r\nimport * as checkbox from './checkbox'\r\nimport * as colorPicker from './color-picker'\r\nimport * as contextMenu from './context-menu'\r\nimport * as copyToClipboard from './copy-to-clipboard'\r\nimport * as datePicker from './date-picker'\r\nimport * as delayed from './delayed'\r\nimport * as dialog from './dialog'\r\nimport * as dropdown from './dropdown'\r\nimport * as grid from './grid'\r\nimport * as icon from './icon'\r\nimport * as innerState from './inner-state'\r\nimport * as input from './input'\r\nimport * as list from './list'\r\nimport * as notification from './notification'\r\nimport * as popover from './popover'\r\nimport * as portfolio from './portfolio'\r\nimport * as range from './range'\r\nimport * as search from './search'\r\nimport * as select from './select'\r\nimport * as spinner from './spinner'\r\nimport * as timeframeBar from './timeframe-bar'\r\nimport * as toolbar from './toolbar'\r\nimport * as tooltip from './tooltip'\r\nimport * as tooltipInput from './tooltip-input'\r\nimport * as tour from './tour'\r\nimport * as typography from './typography'\r\n\r\nfunction exportAsGlobal(win: any, key: string) {\r\n if (!(key in win)) win[key] = {}\r\n\r\n win[key].components = {\r\n ...button,\r\n ...buttonGroup,\r\n ...checkbox,\r\n ...colorPicker,\r\n ...contextMenu,\r\n ...copyToClipboard,\r\n ...delayed,\r\n ...dialog,\r\n ...datePicker,\r\n ...dropdown,\r\n ...grid,\r\n ...icon,\r\n ...innerState,\r\n ...input,\r\n ...list,\r\n ...notification,\r\n ...popover,\r\n ...range,\r\n ...search,\r\n ...select,\r\n ...spinner,\r\n ...time,\r\n ...timeframeBar,\r\n ...toolbar,\r\n ...tooltip,\r\n ...tooltipInput,\r\n ...tour,\r\n ...typography,\r\n ...portfolio,\r\n }\r\n}\r\n\r\nexportAsGlobal(window, 'FLibs')\r\n","/**\r\n * Expose loader doesn’t map these to window.FLibs until we import them somewhere.\r\n * Until we figure out a better way, this file needs to be included on the charts page\r\n */\r\n// eslint-disable-next-line react/no-typos\r\nimport 'classnames'\r\nimport { max, nice, scaleLinear, scaleSymlog } from 'd3'\r\nimport {\r\n add,\r\n addBusinessDays,\r\n differenceInCalendarDays,\r\n eachDayOfInterval,\r\n endOfDay,\r\n intervalToDuration,\r\n isSameMonth,\r\n isSameWeek,\r\n isWeekend,\r\n isWithinInterval,\r\n startOfDay,\r\n startOfYear,\r\n sub,\r\n subMonths,\r\n subYears,\r\n} from 'date-fns'\r\nimport 'hammerjs'\r\n// eslint-disable-next-line react/no-typos\r\nimport 'react'\r\nimport 'react-dom'\r\nimport * as ReactRouterDOM from 'react-router-dom'\r\n\r\nimport { getFormattedDateString } from '../app/header/utils'\r\nimport { decodeQueryString, encodeQueryString } from '../app/queryString'\r\nimport logo from '../app/shared/assets/logo.png'\r\nimport logo_light from '../app/shared/assets/logo_light.png'\r\nimport { getHoverChartImg } from '../app/shared/hover-chart'\r\nimport { getSanitizedTicker } from '../app/shared/ticker-sanitizer'\r\nimport { formatDateToStringUS, getIsDrawingEnabledOnQuotePage } from '../app/shared/utils'\r\nimport './components/index'\r\nimport { useSyncLocalStorage } from './hooks/use-sync-local-storage'\r\nimport { useTrackPageView } from './hooks/use-track-pageview'\r\nimport * as localStorage from './services/local-storage'\r\n\r\ndeclare const FLibs: any\r\n\r\nFLibs.ReactRouterDOM = ReactRouterDOM\r\nFLibs.getHoverChartImg = getHoverChartImg\r\nFLibs.getSanitizedTicker = getSanitizedTicker\r\nFLibs.decodeQueryString = decodeQueryString\r\nFLibs.encodeQueryString = encodeQueryString\r\nFLibs.getFormattedDateString = getFormattedDateString\r\nFLibs.formatDateToStringUS = formatDateToStringUS\r\nFLibs.useSyncLocalStorage = useSyncLocalStorage\r\nFLibs.useTrackPageView = useTrackPageView\r\nFLibs.getIsDrawingEnabledOnQuotePage = getIsDrawingEnabledOnQuotePage\r\nFLibs.localStorage = localStorage\r\nFLibs.d3 = { max, nice, scaleLinear, scaleSymlog }\r\nFLibs.DateFns = {\r\n add,\r\n addBusinessDays,\r\n differenceInCalendarDays,\r\n eachDayOfInterval,\r\n endOfDay,\r\n intervalToDuration,\r\n isSameMonth,\r\n isSameWeek,\r\n isWeekend,\r\n isWithinInterval,\r\n startOfDay,\r\n startOfYear,\r\n sub,\r\n subMonths,\r\n subYears,\r\n}\r\nFLibs.assets = {\r\n logo,\r\n logo_light,\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { RedGreenMultiline, RedGreenText } from '../../../components/RedGreenText'\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, PortfolioTransaction, RowKind, TableAlign, TableColumnDefinition } from '../types'\r\nimport { PORTFOLIO_DATE_FORMAT_VIEW, TRANSACTION_LABEL } from './general'\r\n\r\nexport const columnMap: Record = Object.freeze({\r\n [ColumnId.Spacer]: {\r\n id: ColumnId.Spacer,\r\n urlSort: '',\r\n name: '',\r\n renderColumn: () => null,\r\n },\r\n [ColumnId.Ticker]: {\r\n id: ColumnId.Ticker,\r\n urlSort: 'ticker',\r\n name: 'Ticker',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Group:\r\n case RowKind.Trade:\r\n return (\r\n ev.stopPropagation()}\r\n >\r\n {args.row.ticker}\r\n \r\n )\r\n default:\r\n return {args.row.ticker}\r\n }\r\n },\r\n },\r\n [ColumnId.Company]: {\r\n id: ColumnId.Company,\r\n urlSort: 'company',\r\n name: 'Company',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return null\r\n case RowKind.Summary:\r\n return (\r\n \r\n Summary:{' '}\r\n \r\n {args.row.tickers} Ticker{args.row.tickers === 1 ? '' : 's'}\r\n \r\n / \r\n \r\n {args.row.transactions} Transaction{args.row.transactions === 1 ? '' : 's'}\r\n \r\n \r\n )\r\n default:\r\n return
{args.row.company}
\r\n }\r\n },\r\n },\r\n [ColumnId.CostAvg]: {\r\n id: ColumnId.CostAvg,\r\n urlSort: 'costavg',\r\n name: 'Avg. Cost',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Trade: {\r\n if (args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.costAvg)\r\n }\r\n default:\r\n return formatNumber(args.row.costAvg)\r\n }\r\n },\r\n },\r\n [ColumnId.LastClose]: {\r\n id: ColumnId.LastClose,\r\n urlSort: 'price',\r\n name: 'Price',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n default:\r\n return formatNumber(args.row.lastClose)\r\n }\r\n },\r\n },\r\n [ColumnId.LastChange]: {\r\n id: ColumnId.LastChange,\r\n urlSort: 'lastchange',\r\n name: 'Change $',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => (args.kind === RowKind.Group ? args.row.lastClose - args.row.prevClose : null),\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n default:\r\n const lastChange = args.row.lastClose - args.row.prevClose\r\n return (\r\n \r\n {formatNumber(lastChange, {\r\n showPlusSign: true,\r\n fractions: args.row.lastClose < 1 ? 4 : 2,\r\n })}\r\n \r\n )\r\n }\r\n },\r\n },\r\n [ColumnId.LastChangePct]: {\r\n id: ColumnId.LastChangePct,\r\n urlSort: 'changepct',\r\n name: 'Change %',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return null\r\n default:\r\n return (\r\n \r\n {formatNumber(args.row.lastChangePct, { showPlusSign: true })}\r\n \r\n )\r\n }\r\n },\r\n },\r\n [ColumnId.LastVolume]: {\r\n id: ColumnId.LastVolume,\r\n urlSort: 'volume',\r\n name: 'Volume',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Group:\r\n case RowKind.Trade:\r\n return formatNumber(args.row.lastVolume, { fractions: 0 })\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Transaction]: {\r\n id: ColumnId.Transaction,\r\n urlSort: 'transaction',\r\n name: 'Transaction',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return TRANSACTION_LABEL[args.row.transaction]\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Date]: {\r\n id: ColumnId.Date,\r\n urlSort: 'date',\r\n name: 'Date',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return (\r\n
\r\n {dateFns.format(new Date(args.row.date), PORTFOLIO_DATE_FORMAT_VIEW)}\r\n
\r\n )\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Shares]: {\r\n id: ColumnId.Shares,\r\n urlSort: 'shares',\r\n name: 'Shares',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Trade: {\r\n if (args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.shares, { fractions: 0 })\r\n }\r\n default:\r\n return formatNumber(args.row.shares, { fractions: 0 })\r\n }\r\n },\r\n },\r\n [ColumnId.Price]: {\r\n id: ColumnId.Price,\r\n urlSort: 'cost',\r\n name: 'Cost / Share',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return formatNumber(args.row.price)\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.ValuePaid]: {\r\n id: ColumnId.ValuePaid,\r\n urlSort: 'totalcost',\r\n name: 'Total Cost',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.valuePaid)\r\n },\r\n },\r\n [ColumnId.ValueMarket]: {\r\n id: ColumnId.ValueMarket,\r\n urlSort: 'marketvalue',\r\n name: 'Market Value',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.valueMarket)\r\n },\r\n },\r\n [ColumnId.GainMarketUsd]: {\r\n id: ColumnId.GainMarketUsd,\r\n urlSort: 'gainusd',\r\n name: 'Total Gain $',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainMarketUsd)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainMarketPct]: {\r\n id: ColumnId.GainMarketPct,\r\n urlSort: 'gainpct',\r\n name: 'Total Gain %',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainMarketPct)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainMarketCombined]: {\r\n id: ColumnId.GainMarketCombined,\r\n urlSort: 'gainmarket',\r\n name: 'Total Gain',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.gainMarketPct,\r\n renderColumn: (args) => (\r\n \r\n {formatNumber(args.row.gainMarketUsd)}\r\n \r\n {formatNumber(args.row.gainMarketPct)}\r\n \r\n \r\n ),\r\n },\r\n [ColumnId.GainTodayUsd]: {\r\n id: ColumnId.GainTodayUsd,\r\n urlSort: 'changeusd',\r\n name: 'Today’s Gain $',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainTodayUsd)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainTodayCombined]: {\r\n id: ColumnId.GainTodayCombined,\r\n urlSort: 'gaintoday',\r\n name: 'Today’s Gain',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.lastChangePct,\r\n renderColumn: (args) => (\r\n \r\n {formatNumber(args.row.gainTodayUsd)}\r\n \r\n {formatNumber(args.row.lastChangePct)}\r\n \r\n \r\n ),\r\n },\r\n [ColumnId.Order]: {\r\n id: ColumnId.Order,\r\n urlSort: 'order',\r\n name: 'Order',\r\n align: TableAlign.Right,\r\n renderColumn: () => null,\r\n },\r\n})\r\n\r\nexport const columns = Object.values(columnMap)\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { PortfolioTransaction } from '../types'\r\n\r\nexport const PORTFOLIO_DATE_FORMAT_VIEW = 'MM-dd-yyyy'\r\nexport const PORTFOLIO_DATE_FORMAT_DATA = \"yyyy-MM-dd'T00:00:00'\"\r\n\r\nexport const PORTFOLIO_REFRESH_INTERVAL = (FinvizSettings.hasUserPremium ? 20 : 120) * 1000\r\n\r\nexport const TRANSACTION_LABEL: Record = {\r\n [PortfolioTransaction.Watch]: 'Watch',\r\n [PortfolioTransaction.Buy]: 'Buy',\r\n [PortfolioTransaction.Short]: 'Short Sell',\r\n}\r\n\r\nexport const EMPTY_FORM_ENTRY = {\r\n ticker: '',\r\n date: `${dateFns.format(new Date(), PORTFOLIO_DATE_FORMAT_DATA)}`,\r\n shares: undefined,\r\n price: undefined,\r\n transaction: PortfolioTransaction.Buy,\r\n}\r\n\r\nexport const PORTFOLIO_INPUT_NAME = 'portfolio_name'\r\nexport const PORTFOLIO_INPUT_EMPTY_ERROR = 'Please enter portfolio name.'\r\nexport const PORTFOLIO_INPUT_EXISTS_ERROR = 'Portfolio with that name already exists.'\r\nexport const TICKERS_INPUT_NAME = 'tickers'\r\nexport const TICKERS_INPUT_FORMAT_TIP = 'Separate multiple tickers by a comma, e.g.: AAPL, MSFT, GOOG.'\r\n","import { getSanitizedTicker } from '../../../../app/shared/ticker-sanitizer'\r\nimport { ContentType, apiRequest } from '../../../services/api'\r\nimport {\r\n PortfolioDefinition,\r\n PortfolioEntryBase,\r\n PortfolioFormGroup,\r\n PortfolioInitData,\r\n PortfolioTransaction,\r\n PortfolioTransactionWatch,\r\n} from '../types'\r\n\r\nexport const EMPTY_RESPONSE: PortfolioInitData = {\r\n limit: 0,\r\n selectedPortfolio: 0,\r\n limitTransactions: 0,\r\n portfolio: [],\r\n news: [],\r\n portfolios: [],\r\n}\r\n\r\nexport function portfolioData(portfolioId?: string | number | null) {\r\n return apiRequest('/api/portfolio_data.ashx', { query: { pid: portfolioId ?? '' } })\r\n}\r\n\r\nexport function deletePortfolio(portfolioId?: string | number) {\r\n return apiRequest('/request_portfolio_delete.ashx', { query: { pid: portfolioId } })\r\n}\r\n\r\nexport function portfolioEntry(query?: Record, method?: string, body?: PortfolioEntryBase) {\r\n return apiRequest('/api/portfolio_entry.ashx', {\r\n query,\r\n method,\r\n body: JSON.stringify(body),\r\n })\r\n}\r\n\r\nexport const QUOTE_INVALID_TICKER_REQUEST = '_UNKNOWN'\r\nexport const QUOTE_INVALID_TICKER_RESPONSE = 'NA'\r\nexport const QUOTE_TICKER_DELIMITER = ','\r\n\r\nexport function quoteData(tickers: string[]) {\r\n return apiRequest('request_quote.ashx', {\r\n query: { t: tickers.filter((ticker) => ticker.length).join(',') },\r\n headers: { 'Content-Type': ContentType.Html },\r\n })\r\n}\r\n\r\nexport async function validateTickers(tickers: string[]) {\r\n try {\r\n const response = await apiRequest<{ tickers: string }>('/portfolio_tickers.ashx', {\r\n query: { json: true },\r\n })\r\n\r\n const parsedTickers = response?.tickers.split('|') ?? []\r\n\r\n return tickers.map((ticker) => parsedTickers.includes(ticker))\r\n } catch {\r\n return tickers.map(() => false)\r\n }\r\n}\r\n\r\nexport async function recalculatePortfolio(\r\n rows: PortfolioFormGroup[],\r\n numberOfTransactions: number,\r\n totalValue = 100000.0\r\n): Promise {\r\n const tickers = Object.values(rows).map((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim())\r\n return ticker.length ? ticker : QUOTE_INVALID_TICKER_REQUEST\r\n })\r\n const pricePerColumn = totalValue / numberOfTransactions\r\n\r\n const response = await quoteData(tickers)\r\n const prices = response?.split(QUOTE_TICKER_DELIMITER)\r\n\r\n if (prices?.length !== tickers.length) {\r\n window.Sentry?.captureMessage('Invalid recalculated data', {\r\n extra: {\r\n requestTickers: tickers,\r\n requestTickersLength: tickers.length,\r\n responseLength: prices?.length,\r\n },\r\n })\r\n\r\n return []\r\n }\r\n\r\n const tickerPrices = Object.fromEntries(\r\n prices.map((price, index) => {\r\n const tickerPrice = price === QUOTE_INVALID_TICKER_RESPONSE ? NaN : parseFloat(price)\r\n\r\n return [tickers[index], isNaN(tickerPrice) ? NaN : tickerPrice]\r\n })\r\n )\r\n\r\n return rows.map((row) => ({\r\n id: row.id,\r\n ticker: row.ticker,\r\n transactions: row.transactions.map((transaction) => {\r\n const price = tickerPrices[row.ticker]\r\n const shares = Math.round((pricePerColumn / price) * 10000) / 10000\r\n\r\n return {\r\n ...transaction,\r\n transaction:\r\n transaction.transaction === PortfolioTransaction.Watch ? PortfolioTransaction.Buy : transaction.transaction,\r\n price: isNaN(price) ? transaction.price : price,\r\n shares: isNaN(shares) ? transaction.shares : shares,\r\n }\r\n }),\r\n }))\r\n}\r\n\r\nexport function submitForm(data: URLSearchParams) {\r\n return apiRequest('/portfolio_submit.ashx', {\r\n method: 'POST',\r\n body: data.toString(),\r\n headers: { 'Content-Type': ContentType.FormUrlEncoded },\r\n })\r\n}\r\n\r\ntype TickersApiResponse = {\r\n portfolioId: number\r\n message?: string\r\n portfolioEntries: Record>\r\n}\r\n\r\nexport enum ErrorSource {\r\n Portfolio,\r\n Tickers,\r\n}\r\n\r\nexport type TickersApiErrorResponse = {\r\n source: ErrorSource\r\n message: string\r\n}\r\n\r\nexport function portfolioTickers({\r\n tickers,\r\n portfolioName,\r\n portfolioId,\r\n}: {\r\n tickers: string\r\n portfolioName?: string\r\n portfolioId?: number\r\n}) {\r\n const query = Object.assign(\r\n { tickers },\r\n typeof portfolioName !== 'undefined' && { portfolio_name: portfolioName },\r\n typeof portfolioId !== 'undefined' && { pid: portfolioId }\r\n )\r\n\r\n return apiRequest(\r\n '/api/portfolio_tickers.ashx',\r\n {\r\n method: 'POST',\r\n query,\r\n },\r\n true\r\n )\r\n}\r\n\r\nexport function submitEditForm(data: string | URLSearchParams) {\r\n return apiRequest('/portfolio_submit.ashx', {\r\n method: 'POST',\r\n body: data.toString(),\r\n headers: { 'Content-Type': ContentType.FormUrlEncoded },\r\n })\r\n}\r\n\r\nexport function reorderPortfolios(body: PortfolioDefinition[]) {\r\n return apiRequest('/api/portfolio_reorder.ashx', {\r\n method: 'PUT',\r\n body: JSON.stringify(body),\r\n })\r\n}\r\n","import { SortByShape } from '../../hooks/use-sort-data'\r\nimport { NullableNumbers } from '../../types'\r\n\r\nexport enum PortfolioQuery {\r\n View = 'v',\r\n TableView = 'tv',\r\n PortfolioId = 'pid',\r\n Order = 'o',\r\n Tickers = 't',\r\n Map = 'map',\r\n Size = 'mapSize',\r\n Subtype = 'subtype',\r\n Group = 'group',\r\n}\r\n\r\nexport enum PortfolioMapSizeKey {\r\n MarketValue = 'market',\r\n Gain = 'gain',\r\n}\r\n\r\nexport enum PortfolioView {\r\n View = '1',\r\n Edit = '2',\r\n}\r\n\r\nexport enum PortfolioTableView {\r\n Ticker = '1',\r\n Trade = '2',\r\n}\r\n\r\nexport const PortfolioTableViewLabels = {\r\n [PortfolioTableView.Ticker]: 'Tickers',\r\n [PortfolioTableView.Trade]: 'Trades',\r\n}\r\n\r\nexport enum PortfolioTransaction {\r\n Watch = 0,\r\n Buy = 1,\r\n Short = 2,\r\n}\r\n\r\nexport enum NumberOfShares {\r\n None = 0,\r\n /**\r\n * The usage of this is technically incorrect. The value for `PositiveNumber` is 1.\r\n * But we don’t care in this context, because we only want to differentiate betwen zero/non-zero values,\r\n * which helps us get correct types.\r\n *\r\n * # Don’t compare `entry.shares === NumberOfShares.PositiveNumber`\r\n */\r\n PositiveNumber = 1,\r\n}\r\n\r\nexport interface PortfolioEntryBase {\r\n id?: number\r\n ticker: string\r\n date: string\r\n transaction: PortfolioTransaction\r\n shares: number\r\n price: number\r\n}\r\n\r\n/**\r\n * Base type which lists all common properties\r\n */\r\nexport interface PortfolioEntryComputed {\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketPrev: number\r\n gainMarket: number\r\n gainMarketPct: number\r\n gainMarketUsd: number\r\n gainTodayUsd: number\r\n lastChangePct: number\r\n}\r\n\r\n/**\r\n * Transaction with > 0 shares\r\n */\r\nexport interface PortfolioTransactionStake extends PortfolioEntryBase, PortfolioEntryComputed {\r\n id: number\r\n shares: NumberOfShares.PositiveNumber\r\n}\r\n\r\n/**\r\n * Transaction with 0 shares\r\n */\r\nexport interface PortfolioTransactionWatch\r\n extends Omit,\r\n NullableNumbers {\r\n id: number\r\n shares: NumberOfShares.None\r\n transaction: PortfolioTransaction\r\n}\r\n\r\nexport type PortfolioEntryTransaction = PortfolioTransactionStake | PortfolioTransactionWatch\r\n\r\n/**\r\n * Top level portfolio entry\r\n */\r\nexport interface PortfolioGroup extends PortfolioEntryComputed {\r\n ticker: string\r\n shares: number\r\n industry: string\r\n country: string\r\n company: string\r\n marketCap: number\r\n prevClose: number\r\n lastClose: number\r\n lastVolume: number\r\n perfWeek: number\r\n costAvg: number\r\n transactions: PortfolioEntryTransaction[]\r\n order: number\r\n id: number\r\n date: string\r\n}\r\n\r\nexport type PortfolioTrade = Omit & PortfolioEntryTransaction\r\n\r\nexport type PortfolioMapEntry = Omit & PortfolioTransactionStake\r\n\r\n/**\r\n * Summary row for the whole portfolio\r\n */\r\nexport interface PortfolioSummary {\r\n tickers: number\r\n transactions: number\r\n shares: number\r\n lastChangePct: number\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketPrev: number\r\n gainMarketUsd: number\r\n gainMarketPct: number\r\n gainTodayUsd: number\r\n}\r\n\r\nexport interface PortfolioDefinition {\r\n id: number\r\n name: string\r\n order: number\r\n}\r\n\r\nexport interface PortfolioInitData {\r\n limit: number\r\n limitTransactions: number\r\n selectedPortfolio: number\r\n portfolios: PortfolioDefinition[]\r\n portfolio: PortfolioGroup[]\r\n news: string[]\r\n version?: number\r\n}\r\n\r\nexport interface PortfolioFormEntry\r\n extends Pick,\r\n Partial> {\r\n uuid: string\r\n}\r\n\r\nexport interface PortfolioFormGroup extends Pick {\r\n id: string\r\n transactions: PortfolioFormEntry[]\r\n}\r\n\r\nexport enum TableAlign {\r\n Left,\r\n Center,\r\n Right,\r\n}\r\n\r\nexport enum ColumnId {\r\n Spacer = 'spacer',\r\n Ticker = 'ticker',\r\n Company = 'company',\r\n LastClose = 'lastClose',\r\n CostAvg = 'costAvg',\r\n LastChange = 'lastChange',\r\n LastChangePct = 'lastChangePct',\r\n LastVolume = 'lastVolume',\r\n Transaction = 'transaction',\r\n Date = 'date',\r\n Shares = 'shares',\r\n Price = 'price',\r\n ValuePaid = 'valuePaid',\r\n ValueMarket = 'valueMarket',\r\n GainMarketUsd = 'gainMarketUsd',\r\n GainMarketPct = 'gainMarketPct',\r\n GainMarketCombined = 'gainMarketCombined',\r\n GainTodayUsd = 'gainTodayUsd',\r\n GainTodayCombined = 'gainTodayCombined',\r\n Order = 'order',\r\n}\r\n\r\nexport enum RowKind {\r\n Group, // A group of transactions\r\n Transaction, // A transaction made inside ticker\r\n Summary, // Portfolio summary\r\n Watchlist, // Charts portfolio watchlist table\r\n Trade,\r\n}\r\n\r\ninterface GroupProps {\r\n kind: RowKind.Group\r\n row: PortfolioGroup\r\n}\r\ninterface TradeProps {\r\n kind: RowKind.Trade\r\n row: PortfolioTrade\r\n}\r\n\r\ninterface TransactionProps {\r\n kind: RowKind.Transaction\r\n row: PortfolioEntryTransaction\r\n}\r\n\r\ninterface SummaryProps {\r\n kind: RowKind.Summary\r\n row: PortfolioSummary\r\n}\r\n\r\ninterface WatchlistProps {\r\n index: number\r\n kind: RowKind.Watchlist\r\n row: PortfolioGroup\r\n}\r\n\r\nexport interface TableColumnDefinition<\r\n PropsType = GroupProps | TradeProps | TransactionProps | SummaryProps | WatchlistProps,\r\n> extends SortByShape {\r\n urlSort: string\r\n name: string\r\n align?: TableAlign\r\n\r\n /**\r\n * Get the value of the column and render it\r\n */\r\n renderColumn: (props: PropsType) => React.ReactNode\r\n}\r\n\r\nexport enum ActionKind {\r\n AddTickers,\r\n RemoveTicker,\r\n AddTransaction,\r\n EditTransaction,\r\n RemoveTransaction,\r\n ReorderTickers,\r\n PortfoliosReorder,\r\n}\r\n\r\nexport interface Action {\r\n kind: ActionKind\r\n payload: PayloadType\r\n}\r\n\r\nexport type AddTickersError = {\r\n tickers?: string\r\n}\r\n\r\nexport interface CreatePortfolioErrors extends AddTickersError {\r\n portfolioName?: string\r\n}\r\n\r\nexport interface CreatePortfolioData {\r\n tickers: string\r\n portfolioName: string\r\n}\r\n\r\nexport type FormErrors = Partial>\r\n\r\nexport interface PortfolioBulkEditErrors {\r\n portfolioName: boolean\r\n rows: Record\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { MapDataNode, MapDataRoot, MapSubtypeId, PerfData } from '../../../app/maps/types'\r\nimport { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { parseInitData } from '../../../app/shared/utils'\r\nimport * as storage from '../../services/local-storage'\r\nimport { getUuid } from '../../util'\r\nimport { columnMap } from './constants/columns'\r\nimport { EMPTY_FORM_ENTRY, PORTFOLIO_DATE_FORMAT_DATA, PORTFOLIO_DATE_FORMAT_VIEW } from './constants/general'\r\nimport * as api from './services/api'\r\nimport {\r\n ColumnId,\r\n FormErrors,\r\n NumberOfShares,\r\n PortfolioEntryBase,\r\n PortfolioEntryTransaction,\r\n PortfolioFormEntry,\r\n PortfolioFormGroup,\r\n PortfolioGroup,\r\n PortfolioInitData,\r\n PortfolioMapEntry,\r\n PortfolioMapSizeKey,\r\n PortfolioQuery,\r\n PortfolioSummary,\r\n PortfolioTransaction,\r\n PortfolioView,\r\n} from './types'\r\n\r\nexport enum PortfolioDataKey {\r\n LongGainers = 'longGainers',\r\n LongLosers = 'longLosers',\r\n ShortGainers = 'shortGainers',\r\n ShortLosers = 'shortLosers',\r\n}\r\n\r\nconst industryLabelKey = 'description'\r\n\r\nconst groupPrefix = {\r\n long: 'Long',\r\n short: 'Short',\r\n}\r\n\r\nconst groupLabel = {\r\n gainers: 'Gainers',\r\n losers: 'Losers',\r\n}\r\n\r\nexport const LOCAL_STORAGE_KEY = 'portfolio-map'\r\n\r\ntype PortfolioMapData = { [key in PortfolioDataKey]: MapDataNode[] }\r\n\r\nexport interface PortfolioSavedSettings {\r\n tableView: '1' | '2'\r\n showMap: boolean\r\n showIndustries: boolean\r\n subtype: MapSubtypeId\r\n tableOrder: string\r\n}\r\n\r\nexport const DEFAULT_SETTINGS: PortfolioSavedSettings = {\r\n tableView: '1',\r\n showMap: true,\r\n showIndustries: true,\r\n subtype: MapSubtypeId.PortfolioGainPct,\r\n tableOrder: columnMap[ColumnId.Order].urlSort,\r\n}\r\n\r\n/**\r\n * Map param in query/local storage is string but we need a boolean\r\n */\r\nexport function parseBoolFromValue(value?: string | null) {\r\n try {\r\n if (value) {\r\n return Boolean(JSON.parse(value))\r\n }\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function getMapSettingFromLocalStorage() {\r\n const savedSettings = storage.getValue(LOCAL_STORAGE_KEY, DEFAULT_SETTINGS)\r\n\r\n return { ...DEFAULT_SETTINGS, ...savedSettings }\r\n}\r\n\r\nexport function saveMapSettingToLocalStorage(\r\n key: keyof PortfolioSavedSettings,\r\n value: PortfolioSavedSettings[typeof key]\r\n) {\r\n storage.setValue(\r\n LOCAL_STORAGE_KEY,\r\n (prevState) => {\r\n const itemToStore = { ...prevState, [key]: value }\r\n // TODO: remove - temporary code to remove removed property from settings\r\n if ('customTickersOrder' in itemToStore) delete itemToStore.customTickersOrder\r\n return itemToStore\r\n },\r\n DEFAULT_SETTINGS\r\n )\r\n}\r\n\r\nconst SUMMARY_DEFAULT: PortfolioSummary = {\r\n tickers: 0,\r\n transactions: 0,\r\n shares: 0,\r\n lastChangePct: 0,\r\n valuePaid: 0,\r\n valueMarket: 0,\r\n valueMarketPrev: 0,\r\n gainMarketUsd: 0,\r\n gainMarketPct: 0,\r\n gainTodayUsd: 0,\r\n}\r\n\r\nexport function getSummary(data: PortfolioGroup[]) {\r\n let transactions = 0\r\n\r\n const computed = data.reduce((prev, current) => {\r\n transactions += current.transactions.length || 1\r\n\r\n const valueMarket = prev.valueMarket + current.valueMarket\r\n const valueMarketPrev = prev.valueMarketPrev + current.valueMarketPrev\r\n const valuePaid = prev.valuePaid + current.valuePaid\r\n const lastChangePct = valueMarketPrev <= 0 ? 0 : (valueMarket / valueMarketPrev - 1) * 100\r\n const gainMarketPct = valuePaid <= 0 ? 0 : (valueMarket / valuePaid - 1) * 100\r\n\r\n return {\r\n ...prev,\r\n valueMarket,\r\n valueMarketPrev,\r\n lastChangePct,\r\n gainMarketPct,\r\n shares: prev.shares + current.shares,\r\n valuePaid: prev.valuePaid + current.valuePaid,\r\n gainMarketUsd: prev.gainMarketUsd + current.gainMarketUsd,\r\n gainTodayUsd: prev.gainTodayUsd + current.gainTodayUsd,\r\n }\r\n }, SUMMARY_DEFAULT)\r\n\r\n return {\r\n ...computed,\r\n transactions,\r\n tickers: data.length,\r\n }\r\n}\r\n\r\n/**\r\n * Goes through all the items and merges them together so that we don’t end up\r\n * with multiple map tiles with same ticker & transaction\r\n */\r\nexport function flattenAndDedupe(data: PortfolioGroup[]) {\r\n const result: PortfolioMapEntry[] = []\r\n\r\n data.forEach((group) => {\r\n group.transactions.forEach((entry) => {\r\n if (entry.shares === NumberOfShares.None) return\r\n\r\n const previouslyAdded = result.findIndex(\r\n (prev) => prev.ticker === entry.ticker && prev.transaction === entry.transaction\r\n )\r\n\r\n if (previouslyAdded < 0) {\r\n const newEntry = { ...group, ...entry, transactions: undefined }\r\n delete newEntry.transactions\r\n result.push(newEntry)\r\n } else {\r\n const prevEntry = result[previouslyAdded]\r\n const valueMarket = prevEntry.valueMarket + entry.valueMarket\r\n const valuePaid = prevEntry.valuePaid + entry.valuePaid\r\n\r\n result[previouslyAdded] = {\r\n ...prevEntry,\r\n valuePaid,\r\n valueMarket,\r\n shares: prevEntry.shares + entry.shares,\r\n valueMarketPrev: prevEntry.valueMarketPrev + entry.valueMarketPrev,\r\n gainMarketUsd: prevEntry.gainMarketUsd + entry.gainMarketUsd,\r\n gainMarketPct: (valueMarket / valuePaid - 1) * 100,\r\n gainTodayUsd: prevEntry.gainTodayUsd + entry.gainTodayUsd,\r\n }\r\n }\r\n })\r\n })\r\n\r\n return Object.values(result)\r\n}\r\n\r\n/**\r\n * Checks if item is loser/gainer and returns the appropriate flag\r\n */\r\nfunction getEntryGroup(gain: number, transaction: PortfolioTransaction) {\r\n switch (transaction) {\r\n case PortfolioTransaction.Short: {\r\n return gain > 0 ? PortfolioDataKey.ShortGainers : PortfolioDataKey.ShortLosers\r\n }\r\n\r\n default:\r\n case PortfolioTransaction.Buy: {\r\n return gain >= 0 ? PortfolioDataKey.LongGainers : PortfolioDataKey.LongLosers\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates industry node with children\r\n */\r\nfunction getIndustries(industries: Record) {\r\n return Object.keys(industries).map((industry) => ({\r\n name: industry,\r\n children: industries[industry],\r\n }))\r\n}\r\n\r\n/**\r\n * Group items by key\r\n * @see https://stackoverflow.com/a/47385953\r\n */\r\nfunction groupByKey(list: Item[], key: keyof Item) {\r\n return list.reduce>((hash, obj) => {\r\n if (obj[key] === undefined) return hash\r\n return Object.assign(hash, { [obj[key] as string]: (hash[obj[key] as string] || []).concat(obj) })\r\n }, {})\r\n}\r\n\r\n/**\r\n * Creates long/short gainers/losers group with all the children, optionally grouping them by industry\r\n */\r\nfunction createGroup(key: PortfolioDataKey, data: PortfolioMapData, groupByIndustry = true) {\r\n const isLong = [PortfolioDataKey.LongGainers, PortfolioDataKey.LongLosers].includes(key)\r\n const isGainer = [PortfolioDataKey.LongGainers, PortfolioDataKey.ShortGainers].includes(key)\r\n const longPrefix = data.shortGainers.length || data.shortLosers.length ? `${groupPrefix.long}: ` : ''\r\n const shortPrefix = data.longGainers.length || data.longLosers.length ? `${groupPrefix.short}: ` : ''\r\n const groupName = `${isLong ? longPrefix : shortPrefix}${isGainer ? groupLabel.gainers : groupLabel.losers}`\r\n\r\n if (groupByIndustry) {\r\n const children = getIndustries(groupByKey(data[key], industryLabelKey))\r\n return { name: groupName, children }\r\n }\r\n\r\n return { name: groupName, children: data[key] }\r\n}\r\n\r\nexport function getPerfText(node: PortfolioMapEntry, subtype: MapSubtypeId) {\r\n switch (subtype) {\r\n case MapSubtypeId.PortfolioGainPct:\r\n return node.gainMarketPct\r\n case MapSubtypeId.PortfolioGainUsd:\r\n return node.gainMarketUsd\r\n case MapSubtypeId.PortfolioChangePct:\r\n return node.lastChangePct\r\n case MapSubtypeId.PortfolioChangeUsd:\r\n return node.gainTodayUsd\r\n }\r\n}\r\n\r\nfunction getPerfForTicker | any[]>(\r\n ticker: string,\r\n list?: ListType,\r\n group?: PortfolioDataKey\r\n) {\r\n if (Array.isArray(list)) {\r\n return list.find((item) => item.name === ticker && item.data?.group === group)?.perf\r\n }\r\n\r\n return list?.[ticker]\r\n}\r\n\r\n/**\r\n * Returns data for the map. This data is deduped and split into gainers/losers & industries\r\n */\r\nexport function getMapData({\r\n data,\r\n perfData,\r\n size,\r\n subtype,\r\n groupByIndustry,\r\n}: {\r\n data?: PortfolioGroup[]\r\n perfData?: PerfData\r\n size: PortfolioMapSizeKey\r\n subtype: MapSubtypeId\r\n groupByIndustry?: boolean\r\n}) {\r\n if (!data) return { hasData: false }\r\n\r\n const dedupedData = flattenAndDedupe(data)\r\n\r\n const parsedData = dedupedData.reduce(\r\n (prev: PortfolioMapData, current) => {\r\n const group = getEntryGroup(current.gainMarketPct / 100, current.transaction)\r\n // The map can’t display negative values so we need to Math.abs\r\n let value = Math.abs(size === PortfolioMapSizeKey.MarketValue ? current.valueMarket : current.gainMarketUsd)\r\n if (!Number.isFinite(value)) value = 0\r\n\r\n const subtypePerf = getPerfText(current, subtype)\r\n const perfText = subtype.startsWith('portfolio')\r\n ? subtypePerf\r\n : getPerfForTicker(current.ticker, perfData?.nodes, group)\r\n\r\n const entry = {\r\n name: current.ticker,\r\n value,\r\n perf: perfText ?? subtypePerf,\r\n additional: getPerfForTicker(current.ticker, perfData?.additional, group),\r\n description: current.industry,\r\n data: { perfWeek: current.perfWeek, group },\r\n } as MapDataNode\r\n\r\n if (value > 0) {\r\n return { ...prev, [group]: [...prev[group], entry] }\r\n }\r\n\r\n return prev\r\n },\r\n {\r\n [PortfolioDataKey.LongGainers]: [],\r\n [PortfolioDataKey.LongLosers]: [],\r\n [PortfolioDataKey.ShortGainers]: [],\r\n [PortfolioDataKey.ShortLosers]: [],\r\n }\r\n )\r\n\r\n return {\r\n hasData: Object.values(parsedData).some((arr) => arr.length > 0),\r\n data: {\r\n name: 'Root',\r\n children: Object.keys(parsedData)\r\n .map((key) => createGroup(key as PortfolioDataKey, parsedData, groupByIndustry))\r\n .filter((category) => category.children.length),\r\n } as MapDataRoot,\r\n }\r\n}\r\n\r\nexport function parsePortfolioQuery(params: URLSearchParams, defaultPortfolioId: number) {\r\n const currentPortfolio = Number.parseInt(params.get(PortfolioQuery.PortfolioId) ?? '')\r\n const portfolioId =\r\n Number.isFinite(currentPortfolio) && currentPortfolio !== 0 ? currentPortfolio : defaultPortfolioId\r\n\r\n return {\r\n portfolioId,\r\n params: Object.fromEntries(params.entries()) as Record, // Re-export the original query as key/val\r\n view: params.get(PortfolioQuery.View) ?? PortfolioView.View,\r\n tableView: params.get(PortfolioQuery.TableView) ?? undefined,\r\n map: parseBoolFromValue(params.get(PortfolioQuery.Map)) ?? getMapSettingFromLocalStorage().showMap,\r\n size: (params.get(PortfolioQuery.Size) ?? PortfolioMapSizeKey.MarketValue) as PortfolioMapSizeKey,\r\n subtype: (params.get(PortfolioQuery.Subtype) ?? getMapSettingFromLocalStorage().subtype) as MapSubtypeId,\r\n group: params.get(PortfolioQuery.Group)?.toUpperCase().split(',') ?? [],\r\n tickers: params.get(PortfolioQuery.Tickers)?.split(',') ?? [],\r\n }\r\n}\r\n\r\nexport function getColumnsByKeys(keys: ColumnId[]) {\r\n return keys.map((key) => columnMap[key])\r\n}\r\n\r\nexport function getFormattedDate(format = PORTFOLIO_DATE_FORMAT_DATA) {\r\n return `${dateFns.format(new Date(), format)}`\r\n}\r\n\r\nexport function validateEditRow(\r\n state: Partial,\r\n dateFormat = PORTFOLIO_DATE_FORMAT_DATA,\r\n checkFormat = true\r\n) {\r\n const formErrors: FormErrors = {}\r\n\r\n if (state.ticker !== undefined && state.ticker.trim().length === 0) {\r\n formErrors.ticker = true\r\n }\r\n\r\n if (!state.date || !dateFns.isValid(parseInputAsDate({ input: state.date, format: dateFormat, checkFormat }))) {\r\n formErrors.date = true\r\n }\r\n\r\n if (\r\n state.shares === undefined ||\r\n isNaN(state.shares) ||\r\n (state.shares < 0 && state.transaction !== PortfolioTransaction.Watch)\r\n ) {\r\n formErrors.shares = true\r\n }\r\n\r\n if (\r\n state.price === undefined ||\r\n isNaN(state.price) ||\r\n (state.price <= 0 && state.transaction !== PortfolioTransaction.Watch)\r\n ) {\r\n formErrors.price = true\r\n }\r\n\r\n return { isValid: Object.keys(formErrors).length === 0, errors: formErrors }\r\n}\r\n\r\nexport function parseInputAsDate({\r\n input,\r\n format = PORTFOLIO_DATE_FORMAT_VIEW,\r\n checkFormat = true,\r\n}: {\r\n input: Date | string\r\n format?: string\r\n checkFormat?: boolean\r\n}) {\r\n if (checkFormat && typeof input === 'string' && input.length !== format.length) {\r\n return new Date('Invalid Date')\r\n }\r\n if (input instanceof Date && dateFns.isValid(input)) return input\r\n\r\n return dateFns.parse(input.toString(), format, new Date())\r\n}\r\n\r\nexport const FORM_ENTRY_KEYS = Object.keys(EMPTY_FORM_ENTRY)\r\n\r\nfunction appendRowToFormData(serializer: URLSearchParams, row: Partial, index: number) {\r\n FORM_ENTRY_KEYS.forEach((key) => serializer.append(`${key}${index}`, `${row[key as keyof PortfolioEntryBase] ?? ''}`))\r\n}\r\n\r\nexport function getBulkEditData(data: Array): Record {\r\n return data.reduce(\r\n (acc, row) => {\r\n const existingId = (row as PortfolioFormGroup).id\r\n const id = existingId ? `${existingId}` : getUuid()\r\n const transactions = row.transactions.length\r\n ? row.transactions.map((transaction) => ({\r\n ...transaction,\r\n uuid: transaction.id ? `${transaction.id}` : getUuid(),\r\n }))\r\n : [getNewTransaction(row.ticker, PortfolioTransaction.Watch)]\r\n return {\r\n ...acc,\r\n [id]: { ...row, id, transactions },\r\n }\r\n },\r\n {} as Record\r\n )\r\n}\r\n\r\nexport function serializeFormData<\r\n EntryType extends { ticker: string; transactions?: Array> },\r\n>(entries: EntryType[]) {\r\n const serializer = new URLSearchParams()\r\n entries\r\n .flatMap((entry) => {\r\n if (!entry.transactions || entry.transactions?.length === 0) {\r\n return getNewTransaction(entry.ticker, PortfolioTransaction.Watch)\r\n }\r\n\r\n return entry.transactions\r\n })\r\n .forEach((entry, index) => {\r\n if (entry.ticker.length) appendRowToFormData(serializer, entry, index)\r\n })\r\n\r\n return serializer\r\n}\r\n\r\nexport async function validateFormData(data: PortfolioFormGroup[]) {\r\n if (data.length === 0) return { isValid: true, errors: {} }\r\n\r\n let isValid = true\r\n const errors: Record = {}\r\n\r\n try {\r\n const tickers = data.map((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim())\r\n return ticker.length ? ticker : api.QUOTE_INVALID_TICKER_REQUEST\r\n })\r\n const validatedTickers = await api.validateTickers(tickers)\r\n\r\n isValid = tickers.length === validatedTickers.length\r\n\r\n // Validate fields\r\n data.forEach((row, index) => {\r\n const validationResult = row.transactions.map((transaction) =>\r\n validateEditRow(transaction, PORTFOLIO_DATE_FORMAT_DATA, false)\r\n )\r\n\r\n const hasInvalidEntries = validationResult.some((result) => !result.isValid)\r\n const isInvalidTicker = validatedTickers[index] !== true\r\n\r\n if (hasInvalidEntries || isInvalidTicker) {\r\n isValid = false\r\n }\r\n\r\n errors[row.id] = validationResult.map((result) => ({ ...result.errors, ticker: isInvalidTicker }))\r\n })\r\n } catch {\r\n return {\r\n isValid: false,\r\n errors: {},\r\n }\r\n }\r\n\r\n return { isValid, errors }\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 getNewTransaction(ticker: string, transaction = PortfolioTransaction.Buy): PortfolioFormEntry {\r\n return {\r\n ...EMPTY_FORM_ENTRY,\r\n uuid: getUuid() as string,\r\n ticker,\r\n date: getFormattedDate(PORTFOLIO_DATE_FORMAT_DATA),\r\n transaction,\r\n shares: transaction === PortfolioTransaction.Watch ? 0 : undefined,\r\n price: transaction === PortfolioTransaction.Watch ? 0 : undefined,\r\n }\r\n}\r\n\r\nexport function getPortfolioInitData() {\r\n let returnData = { isInitData: false, initData: api.EMPTY_RESPONSE }\r\n const initDataElement = document.getElementById('portfolio-init-data')\r\n if (initDataElement) {\r\n const initData = parseInitData('portfolio-init-data')\r\n initDataElement.remove()\r\n returnData = { isInitData: !!initData, initData: initData ?? api.EMPTY_RESPONSE }\r\n }\r\n return returnData\r\n}\r\n\r\nconst EMPTY_TRANSACTION = { transaction: PortfolioTransaction.Watch, index: 0, price: 0 }\r\n\r\nexport function getTradesStructureData(portfolioData: PortfolioGroup[]) {\r\n return portfolioData\r\n .flatMap((ticker) => {\r\n const transactions = [...ticker.transactions]\r\n if (transactions.length === 0) {\r\n transactions.push(EMPTY_TRANSACTION as unknown as PortfolioEntryTransaction)\r\n }\r\n return transactions.map((transaction) => {\r\n const obj = { ...ticker } as Omit & {\r\n transactions?: PortfolioEntryTransaction[]\r\n }\r\n delete obj.transactions\r\n return { ...obj, ...transaction }\r\n })\r\n })\r\n .sort((a, b) => a.id - b.id)\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { Instrument } from '../types'\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/charts/blob/master/app/utils/fetch_api.ts\r\n// START\r\nexport enum ContentType {\r\n ApplicationJson = 'application/json',\r\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n switch (contentType) {\r\n case ContentType.ApplicationJson:\r\n case ContentType.ApplicationJsonUTF:\r\n case ContentType.FormUrlEncoded:\r\n return JSON.parse(response)\r\n default:\r\n return response\r\n }\r\n}\r\n// END\r\n\r\nexport class ThrowableError extends Error {\r\n status: number\r\n isServerError = false\r\n body: unknown\r\n extra: Record = {}\r\n\r\n constructor(status: number, message = 'ThrowableError', body = '', extra: Record = {}) {\r\n super(`${status} ${message}`)\r\n this.status = status\r\n this.isServerError = status >= 500\r\n this.body = body\r\n this.extra = extra\r\n }\r\n}\r\n\r\nexport interface CancelablePromise extends Promise {\r\n cancel?: () => void\r\n}\r\n\r\n/**\r\n * General api fetch utility which returns a cancelable promise\r\n */\r\nexport function apiRequest(\r\n url: string,\r\n { query, headers = {}, ...options }: RequestInit & { query?: Record } = {},\r\n throwOnAllErrors = false\r\n): CancelablePromise {\r\n const controller = 'AbortController' in window ? new AbortController() : undefined\r\n const requestUrl = query ? `${url}?${new URLSearchParams(query)}` : url\r\n const contentType: ContentType = (headers as any)['Content-Type'] ?? ContentType.ApplicationJson\r\n\r\n const requestOptions = {\r\n ...options,\r\n headers: {\r\n 'Content-Type': contentType,\r\n ...headers,\r\n },\r\n }\r\n const request = fetch(requestUrl, { ...requestOptions, signal: controller?.signal })\r\n\r\n const cancelableRequest: CancelablePromise = request\r\n .then(async (response) => {\r\n const textResponse = await response.text()\r\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n\r\n try {\r\n const parsedResponse = parseResponseForContentType(textResponse, responseContentType)\r\n if (!response.ok || response.status >= 500) {\r\n throw new ThrowableError(response.status, response.statusText, parsedResponse, {\r\n rayId: response.headers.get('cf-ray'),\r\n })\r\n }\r\n\r\n return parsedResponse\r\n } catch (error: any) {\r\n if (error instanceof ThrowableError) {\r\n throw error\r\n }\r\n throw new ThrowableError(500, error.message, textResponse, { rayId: response.headers.get('cf-ray') })\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 = () => controller.abort()\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 = '', instrument?: Instrument) {\r\n return apiRequest('/api/suggestions.ashx', { query: { input, instrument } }, true)\r\n}\r\n","import { EventEmitter } from 'events'\r\nimport * as React from 'react'\r\n\r\nlet emitter: EventEmitter | undefined\r\n\r\n/**\r\n * Get the emitter which is used to sync components across the page, subscibe to\r\n * changes and attach event which handles changes across windows\r\n */\r\nexport function subscribeToChanges(\r\n key: string,\r\n defaultValue: ValueType,\r\n changeCallback?: (value: React.SetStateAction) => void\r\n) {\r\n if (!emitter) emitter = new EventEmitter()\r\n\r\n const onChange = (value: React.SetStateAction) => {\r\n const newValue = value ?? getValue(key, defaultValue)\r\n setValue(key, newValue, defaultValue, false)\r\n changeCallback?.(newValue)\r\n }\r\n\r\n const onStorageChange = (ev: StorageEvent) => {\r\n if (ev.key === key) {\r\n try {\r\n const value = ev.newValue ? JSON.parse(ev.newValue) : null\r\n onChange(value ?? defaultValue)\r\n } catch {\r\n onChange(defaultValue)\r\n }\r\n }\r\n }\r\n\r\n emitter.addListener(key, onChange)\r\n window.addEventListener('storage', onStorageChange)\r\n\r\n return {\r\n emitter,\r\n unsubscribe: () => {\r\n emitter?.removeListener(key, onChange)\r\n window.removeEventListener('storage', onStorageChange)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Get value from local storage or fall back to `defaultValue`\r\n */\r\nexport function getValue(key: string, defaultValue: ValueType): ValueType {\r\n try {\r\n const value = localStorage.getItem(key)\r\n const parsedValue = value ? JSON.parse(value) : null\r\n return parsedValue ?? defaultValue\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\n/**\r\n * Set value to local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function setValue(\r\n key: string,\r\n valueGetter: React.SetStateAction,\r\n defaultValue: ValueType,\r\n emit = true\r\n) {\r\n try {\r\n const state = getValue(key, defaultValue)\r\n const valueToStore = valueGetter instanceof Function ? valueGetter(state) : valueGetter\r\n\r\n localStorage.setItem(key, JSON.stringify(valueToStore))\r\n if (emit) emitter?.emit(key, valueToStore)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Removes value from local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function removeValue(key: string, emit = true) {\r\n try {\r\n localStorage.removeItem(key)\r\n if (emit) emitter?.emit(key, undefined)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Helper function to migrate old value type to new one (eg. boolean to object)\r\n */\r\nexport function migrateValue(\r\n key: string,\r\n /**\r\n * The migrate function might get called multiple times on the page, so `oldValue` in the callback\r\n * can actually be the already migrated value. Make sure to add a condition to only migrate once.\r\n */\r\n transformValue: NewValue | ((oldValue: PrevValue | NewValue) => NewValue),\r\n defaultValue: NewValue\r\n) {\r\n try {\r\n const oldValue = getValue(key, undefined)\r\n if (typeof oldValue === 'undefined') return\r\n const migratedValue = transformValue instanceof Function ? transformValue(oldValue) : transformValue\r\n setValue(key, migratedValue, defaultValue, false) // don’t emit to other components\r\n } catch {}\r\n}\r\n","import * as pathToRegexp from 'path-to-regexp'\r\n\r\nimport { cleanTicker } from '../util'\r\n\r\n/**\r\n * Compile route path by applying parameters to it\r\n *\r\n * @example\r\n * // Outputs /route/1?query=foo\r\n * compilePath('/route/:id?query=:query', { id: 1, query: 'foo' })\r\n */\r\nfunction compilePath(\r\n path: string,\r\n params?: Record,\r\n options?: pathToRegexp.ParseOptions & pathToRegexp.TokensToFunctionOptions\r\n) {\r\n return pathToRegexp.compile(path, options)(params)\r\n}\r\n\r\nexport const path = {\r\n home: '/',\r\n news: '/news.ashx',\r\n screener: '/screener.ashx',\r\n charts: '/charts',\r\n groups: '/groups.ashx',\r\n portfolio: '/portfolio.ashx',\r\n insider: '/insidertrading.ashx',\r\n elite: '/elite.ashx',\r\n search: '/search.ashx\\\\?p=:ticker?',\r\n quote: '/quote.ashx\\\\?t=:ticker',\r\n contact: '/contact.ashx',\r\n\r\n alerts: '/alerts.ashx',\r\n help: '/help/screener.ashx',\r\n account: '/myaccount.ashx',\r\n login: '/login.ashx',\r\n logout: '/logout.ashx',\r\n\r\n // Maps\r\n maps: '/map.ashx',\r\n bubbles: '/bubbles.ashx',\r\n\r\n // Futures\r\n futures: '/futures.ashx',\r\n futuresPerf: '/futures_performance.ashx',\r\n futuresCharts: '/futures_charts.ashx',\r\n futuresChartDetail: '/futures_charts.ashx\\\\?t=:ticker',\r\n\r\n // Forex\r\n forex: '/forex.ashx',\r\n forexPerf: '/forex_performance.ashx',\r\n forexCharts: '/forex_charts.ashx',\r\n forexChartDetail: '/forex_charts.ashx\\\\?t=:ticker',\r\n\r\n // Crypto\r\n crypto: '/crypto.ashx',\r\n cryptoPerf: '/crypto_performance.ashx',\r\n cryptoCharts: '/crypto_charts.ashx',\r\n cryptoChartDetail: '/crypto_charts.ashx\\\\?t=:ticker',\r\n\r\n // Backtsest\r\n backtests: '/backtests.ashx',\r\n backtestCreate: '/backtest_create.ashx',\r\n backtestDetail: '/backtest_detail.ashx\\\\?id=:backtestId',\r\n backtestPresets: 'backtests.ashx\\\\?presets=1',\r\n}\r\n\r\nexport const link = {\r\n toHome: () => path.home,\r\n toNews: () => path.news,\r\n toScreener: () => path.screener,\r\n toCharts: () => path.charts,\r\n toGroups: () => path.groups,\r\n toPortfolio: () => path.portfolio,\r\n toInsider: () => path.insider,\r\n toElite: () => path.elite,\r\n toSearch: (ticker: string) => compilePath(path.search, { ticker }, { validate: false }),\r\n toQuote: (ticker: string) => compilePath(path.quote, { ticker }),\r\n toContact: () => path.contact,\r\n\r\n toAlerts: () => path.alerts,\r\n toHelp: () => path.help,\r\n toAccount: () => path.account,\r\n toLogin: () => path.login,\r\n toLogout: () => path.logout,\r\n\r\n toMaps: () => path.maps,\r\n toBubbles: () => path.bubbles,\r\n\r\n toFutures: () => path.futures,\r\n toFuturesPerf: () => path.futuresPerf,\r\n toFuturesCharts: () => path.futuresCharts,\r\n toFuturesChartDetail: (ticker: string) => compilePath(path.futuresChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toForex: () => path.forex,\r\n toForexPerf: () => path.forexPerf,\r\n toForexCharts: () => path.forexCharts,\r\n toForexChartDetail: (ticker: string) => compilePath(path.forexChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toCrypto: () => path.crypto,\r\n toCryptoPerf: () => path.cryptoPerf,\r\n toCryptoCharts: () => path.cryptoCharts,\r\n toCryptoChartDetail: (ticker: string) => compilePath(path.cryptoChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toBacktests: () => path.backtests,\r\n toBacktestCreate: () => path.backtestCreate,\r\n toBacktestDetail: (backtestId: string | number) => compilePath(path.backtestDetail, { backtestId }),\r\n toBacktestPresets: () => path.backtestPresets,\r\n}\r\n","export enum Instrument {\r\n Stock = 'stock',\r\n Forex = 'forex',\r\n Crypto = 'crypto',\r\n Futures = 'futures',\r\n MarketSentiment = 'market_sentiment',\r\n Group = 'group',\r\n}\r\n\r\nexport type RecordType = Record\r\n\r\nexport type PartialBy = Omit & Partial>\r\n\r\nexport type NullableNumbers = { [K in keyof Obj]: Obj[K] extends number ? number | null : Obj[K] }\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport type SortableValue = string | null | number | Date\r\nexport type SortDirectionValue = 1 | -1\r\n","import isPlainObject from 'lodash.isplainobject'\r\nimport { ComponentType, LazyExoticComponent, lazy } from 'react'\r\nimport { ShouldRevalidateFunction } from 'react-router-dom'\r\n\r\nimport { getCookie } from '../app/shared/cookie'\r\nimport { parseInitData } from '../app/shared/utils'\r\nimport { CRYPTO_TICKERS } from './constants'\r\nimport { Instrument, SortDirectionValue, SortableValue } from './types'\r\nimport { RecordType } from './types'\r\n\r\n/**\r\n * Function which wraps React.lazy and checks whether a chunk is preloaded\r\n * from async-manifest. If yes, kick in the promise resolve early so we can\r\n * instantly render the component\r\n */\r\nexport function lazyLoadComponent({\r\n chunkName,\r\n load,\r\n}: {\r\n chunkName: string\r\n load: () => Promise<{ default: ComponentType }>\r\n}): LazyExoticComponent> {\r\n // Resolve earlier if prefetch element is present\r\n const hasPreloadElement = document.querySelector(`[data-chunk-id=${chunkName}]`)\r\n\r\n if (hasPreloadElement) {\r\n const componentLoader = load()\r\n\r\n return lazy(() => componentLoader)\r\n }\r\n\r\n return lazy(load)\r\n}\r\n\r\nconst isObject = (value: any): value is RecordType => isPlainObject(value)\r\n\r\n/**\r\n * Parse text as JSON\r\n */\r\nexport function parseAsJSON(value: unknown | Shape): Shape | undefined {\r\n if (isObject(value)) {\r\n return value as Shape\r\n }\r\n\r\n let parsedValue\r\n try {\r\n if (typeof value === 'string') {\r\n parsedValue = JSON.parse(value)\r\n }\r\n } catch (e) {\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\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 hasDarkModeFeature() {\r\n const ff = getCookie('featureFlags')\r\n return ff.includes('dark:1')\r\n}\r\n\r\nexport function hasRedesignFeature() {\r\n const ff = getCookie('featureFlags')\r\n return ff.includes('redesign:1')\r\n}\r\n\r\nexport function isRedesignFeatureEnabled() {\r\n return hasRedesignFeature() || hasDarkModeFeature()\r\n}\r\n\r\nexport function isDarkModeFeatureEnabled() {\r\n const theme = getCookie('chartsTheme')\r\n return isRedesignFeatureEnabled() && theme.includes('dark')\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 showPlusSign: boolean\r\n defaultValue: string\r\n}\r\n\r\nconst intlCache: { [key: number]: Intl.NumberFormat } = {}\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\nexport function shortFormatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n let num = value\r\n if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n let suffix = ''\r\n if (num >= 1e9) {\r\n num /= 1e9\r\n suffix = 'B'\r\n } else if (num >= 1e6) {\r\n num /= 1e6\r\n suffix = 'M'\r\n } else if (num >= 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\r\n}\r\n\r\nexport function formatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n if (value === undefined || value === null) return defaultValue\r\n\r\n const fixedValue = value.toFixed(fractions)\r\n const prefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n return {prefix + fixedValue}\r\n }\r\n\r\n const formatted = getIntl(fractions).format(value)\r\n\r\n return prefix + formatted\r\n}\r\n\r\nexport function sortByColumn(options: {\r\n a: ItemType\r\n b: ItemType\r\n direction: SortDirectionValue\r\n valueGetter?: (row: ItemType) => SortableValue\r\n}) {\r\n const valueA = options.valueGetter?.(options.a)\r\n const valueB = options.valueGetter?.(options.b)\r\n if (typeof valueA === 'string' && typeof valueB === 'string') return valueA.localeCompare(valueB) * options.direction\r\n if (valueA === null) return -options.direction\r\n if (valueB === null) return options.direction\r\n return (Number(valueA) - Number(valueB)) * options.direction\r\n}\r\n\r\nexport function moveItemInArray(arr: ItemType[], sourceIndex: number, destinationIndex: number) {\r\n // make sure sourceIndex and destinationIndex are inside of arr\r\n const from = Math.max(0, Math.min(sourceIndex, arr.length - 1))\r\n const to = Math.min(arr.length - 1, Math.max(destinationIndex, 0))\r\n\r\n const items = [...arr]\r\n const [removed] = items.splice(from, 1)\r\n items.splice(to, 0, removed)\r\n\r\n return items\r\n}\r\n\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n/**\r\n * This fn creates a revalidator rule which always revalidates loader when the\r\n * specified keys change but ignores changes to other keys. It also allows\r\n * `revalidator.revalidate` to work even if the query didn’t\r\n */\r\nexport function revalidateOnQueryChange(keys: string[]): ShouldRevalidateFunction {\r\n return (args) => {\r\n const prevParams = args.currentUrl.searchParams\r\n const nextParams = args.nextUrl.searchParams\r\n const requiredChanged = keys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n const otherQueryKeys = [...prevParams.keys(), ...nextParams.keys()].filter(\r\n (key, index, arr) => !keys.includes(key) && arr.indexOf(key) === index\r\n )\r\n const otherChanged = otherQueryKeys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n\r\n if (!requiredChanged && otherChanged) {\r\n return false\r\n }\r\n\r\n return args.defaultShouldRevalidate\r\n }\r\n}\r\n\r\nexport function parseRouteInitData({\r\n elementId = 'route-init-data',\r\n fallback,\r\n removeElement = true,\r\n}: { elementId?: string; fallback?: DataType; removeElement?: boolean } = {}): DataType | null {\r\n const element = document.getElementById(elementId)\r\n let initialData = fallback\r\n\r\n if (!element) return fallback ?? null\r\n\r\n try {\r\n const parsedData = parseInitData(elementId)\r\n if (removeElement) element.remove()\r\n\r\n if (parsedData) initialData = parsedData\r\n } catch {\r\n initialData = fallback\r\n }\r\n\r\n return initialData ?? null\r\n}\r\n"],"names":["MarketBadgeType","getMarketBadgeText","type","_date","Open","label","Closed","Premarket","Aftermarket","getMarketBadgeType","time","hasUserPremium","isHoliday","isPremarket","isAftermarket","None","MarketBadge","_ref","badge","className","_jsx","classnames","includes","TimeBreakpointMode","BREAKPOINTS","minWidth","Infinity","marketBadgeText","timeFormat","getTimeState","fixedTime","arguments","length","undefined","FinvizSettings","getDate","TooltipBadge","props","state","useTooltipState","placement","_jsxs","_Fragment","children","TooltipTrigger","Tooltip","Heading","level","StaticBadge","findMatchingBreakpoint","compareWidth","breakpoints","filter","breakpoint","pop","getCurrentWidth","mode","element","window","innerWidth","clientWidth","Time","breakpointMode","ResizeObserver","useResizeObserver","rootRef","React","setState","currentBreakpoint","setBreakpoint","interval","setInterval","clearInterval","current","currentWidth","handleResize","throttle","foundBreakpoint","observer","entries","requestAnimationFrame","Array","isArray","observe","addEventListener","disconnect","removeEventListener","ref","getFormattedDateString","seed","date","Date","dateAsNY","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","isDst","dayNumber","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","setUTCHours","getWeekDay","toLocaleDateString","weekday","uppercase","name","month","toUpperCase","toString","padStart","getTime","toLocaleString","hour","minute","hour12","TimeFormat","format","long","getFullYear","short","dateOnly","timeOnly","formatDate","value","inputOrOutputFormat","outputFormat","dateFns","isPremium","dayOfWeek","min","getMinutes","hours","getHours","HOLIDAY_DATES","test","day","getHoliday","find","holiday","MapTypeId","MapSubtypeId","ScaleId","NodeDepth","decodeQueryString","search","location","vars","substring","split","obj","forEach","pair","delimiterPos","indexOf","key","decodeURIComponent","encodeQueryString","values","whitelistedValues","Object","keys","reduce","prev","encodeURIComponent","SpecificChartFunctionality","getStaticChartConfig","width","height","ticker","timeframe","paneElements","specificChartFunctionality","default","colorsOverride","theme","colors","getCustomColorsFromCookies","refreshData","layout","barWidth","barMargin","scrollable","editable","charts","scale","leftOffset","instrument","stretch","panes","elements","JSON","parse","getParsedCookies","cookieName","parseCookies","document","cookie","map","cookieString","acc","v","trim","getCookie","re","RegExp","replace","DEFAULT_OVERLAYS","getHoverChartUrl","escaped","hoverCharts","stock","dateRange","documentElement","classList","contains","overlays","patterns","query","cs","t","tf","ct","r","tm","imgUrl","nodeChartsDomain","timeframeToDeprecatedTimeframe","timeframeString","getOldChartsUrl","oldPeriod","Instrument","cleanTicker","toLowerCase","getHoverChartDimensions","getReferrerPolicy","getHoverChartImg","useOldCharts","hasForexFuturesCryptoNodeCharts","chartSize","referrerPolicy","url","srcSet","getSrcSet","srcsetString","img","hasUserRetinaNodeCharts","matchesAndroid","navigator","userAgent","match","matchesWebOS","matchesIPhone","matchesiPad","matchesIPod","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","maxTouchPoints","isMobileDevice","isMobile","isIphone","isIpad","isSafariDesktop","isIos","getSanitizedSingleTicker","rawTicker","x","join","getSanitizedTicker","isMulti","AdsProvider","getAdsProvider","adsProvider","Freestar","InvestingChannel","trackPageView","pathname","freestarPageView","gtag","freestar","queue","push","trackPageview","formatDateToStringUS","year","DRAWING_QUOTE_PAGE_COOKIE_NAME","getIsDrawingEnabledOnQuotePage","parseInitData","elementId","initDataElement","getElementById","textContent","e","Sentry","captureException","getSidebarFromCookie","chartsUrl","sidebar","RedGreenText","rightContent","rightClass","hasValue","Number","isFinite","Icon","RedGreenMultiline","_ref2","child","Table","TableHead","TableBody","spacing","TableFooter","TableAlign","TableCell","isFirst","isLast","align","Left","hasPadding","Center","Right","TableSortIndicator","isActive","direction","invisible","TableHeader","as","asComponent","hasHover","componentToRender","disabled","TableHeaderSortable","_ref3","isDisabled","TableRow","isHoverable","SortDirection","getDefaultSortFromUrl","columns","order","idKey","isDesc","startsWith","queryParam","column","Descending","Ascending","useTableSort","data","defaultSort","valueGetter","urlPersistKey","searchParams","setSearchParams","useSearchParams","defaultSortRef","get","isSortByShape","id","getDefaultSort","sort","setSort","changeSort","newSort","newParams","URLSearchParams","previousOrder","isDescOrder","set","saveSortToUrl","preventScrollReset","prevSort","useSortData","sortBy","BoxRounding","BoxTheme","Box","rounding","GroupTheme","ButtonGroup","hasDivider","hasBorder","childComponent","buttonRounding","ButtonRounding","groupTheme","dark","wrapper","divider","getGroupTheme","role","border","index","Button","Boolean","BUTTON_DEFAULT_ELEMENT","BUTTON_BASE_CLASS","BUTTON_SQUARE_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","ButtonPadding","ButtonAlign","ButtonSquareSize","ButtonTheme","getButtonTheme","active","light","button","blue","violet","blueHover","red","headerItem","icon","menuItem","menuItemDark","opacity","outline","chip","chipTransparent","ButtonComponent","size","focusRing","appearance","padding","contentClass","leftContent","isSquare","buttonTheme","buttonPadding","buttonSize","hasIcons","isValidIconName","left","center","none","small","regular","medium","large","CheckboxComponent","isSmall","checked","defaultChecked","Checkbox","forwardRef","clamp","num","max","isTouch","event","getRelativePosition","node","rect","getBoundingClientRect","pointer","touches","pageX","pageXOffset","top","pageY","pageYOffset","preventDefaultMove","preventDefault","DraggablePickerComponent","onMove","onKey","container","useRef","hasTouched","isDragging","setDragging","useState","isValid","handleMove","useCallback","buttons","handleMoveStart","nativeEvent","handleKeyDown","keyCode","which","handleMoveEnd","toggleDocumentEvents","toggleEvent","useLayoutEffect","onTouchStart","onMouseDown","onKeyDown","tabIndex","DraggablePicker","memo","Pointer","color","style","backgroundColor","hexStringToRGBA","hexString","hexColor","removeHashSymbol","g","b","a","Math","round","hexStringToHSVA","rgbaToHSVA","hexStringToHSLA","rgbaToHSLA","alphaToHex","alpha","rgbaToHexString","hsvaToHEXString","rgbaColor","hsvaToRGBA","hslaToHexString","hslaToRGBA","c","h","s","f","abs","l","n","k","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","green","slice","String","parseInt","parseFloat","hslaToHSLAString","strColor","isValidColor","isRgb","Option","convertColorToHEX","getIsRgb","isAlphaAllowed","rgbKeys","some","getHSVAFromColor","stringifyHSVAColor","output","canSelectAlpha","getLumaFromRGBA","getIsColorTooLightOrTransparent","getHEXWithSpecificAplha","getRGBAValueFromValidColorString","Alpha","onChange","changeLightness","pos","gradientPreview","useMemo","backgroundImage","DEFAULT_COLORS","title","ColorPalette","lowerCaseColor","colorObj","isSelected","onClick","HueSaturation","position","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","isTooLight","PickerInput","inputClass","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","useEffect","handleColorInputChange","currentTarget","colorValue","Input","ColorPicker","canSelectCustom","onPaletteItemClick","cachedColor","hsvaColor","setColor","currentColor","newColor","onChangeCallback","stringColor","onSetCustomCodeClick","prompt","alert","_hex","orignalColor","InputColorPicker","inputDataTestId","popoverState","usePopoverState","PopoverTrigger","Popover","focusOnShow","hide","MultiColorPicker","colorInputLabel","ColorTabButton","ButtonColorPicker","buttonPickerDataTestId","hideOnClickOutside","onOverlayClick","isMultiPicker","activeColorIndex","setActiveColorIndex","handleColorChange","originalColor","colorObject","visible","_ref4","_ref5","COMPONENT_ANIMATION_DURATION","CopyToClipboard","text","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","timeout","resetTimer","clearTimeout","setTimeout","Textarea","readOnly","select","DatePickerComponent","StatelessDatePicker","zIndex","isFullyClosed","getExtendedDialogState","triggerProps","ZIndexContext","fallback","Spinner","locale","minDetail","ev","DatePicker","popover","Delayed","delay","throwOnTimeout","delayComponent","timeoutComponent","setVisible","hasTimedOut","setHasTimedOut","visibilityTimeout","failedTimeout","Error","useZIndex","useDialogState","settings","Reakit","animated","DialogDragContext","enabled","handleRef","boxPosition","y","resetBoxPosition","setBoxPosition","useDrag","dragging","handleElement","boxPositionRef","dragDiff","scrollX","scrollY","onMouseUp","onMouseMove","body","DialogBox","onUnmount","wrapperRef","setElementRef","elementHeight","useElementMeasure","dialogDrag","onResize","bottom","right","clientHeight","prevPosition","dialogBoxStyle","transform","DialogOverlay","isFullyOpened","animating","DialogType","DIALOG_BACKDROP_WIDTH_CSS_VAR","setProperty","Dialog","finalFocusRef","onHide","hideOnEsc","isDraggable","isBackdropDisabled","overlayClass","ariaLabel","DialogWrapper","modal","Portal","unstable_finalFocusRef","onTransitionEnd","onAnimationEnd","innerProps","drawer","getFlexAlignClasses","ChildPosition","Provider","DialogBody","scrollDivRef","scrollBox","disableBodyScroll","enableBodyScroll","ConfirmationDialog","Paragraph","actions","DialogTrigger","dropdownContext","DropdownContext","root","DialogFooter","DialogHeader","onCloseClick","hasHorizontalPadding","hasMinHeight","useDropdownState","context","loop","unstable_virtual","unstable_offset","DropdownComponent","isNested","isStatic","dropdownState","ContainerElement","buttonProps","parent","orientation","Dropdown","NestedDropdownWrapper","parentState","itemProps","DropdownBar","DropdownItemComponent","subtitle","closeOnClick","hasSubmenu","iconTheme","DropdownItem","DropdownSeparator","MoreButtonDropdown","Component","iconList","add","SVG","viewBox","d","arrowDownShort","arrowForward","arrowUpShort","briefcase","fillRule","calendar","candleBarBasic","candleBarHeikinAshi","candleBarHollow","caretDown","caretLeft","caretRight","caretUp","caretVertical","chartBar","chartBubble","cx","cy","chartPie","chartTable","chartTreemap","chevronDown","chevronRight","close","darkMode","diamondOutlined","done","drag","draw","clipRule","drawingActionDelete","drawingSettingAutosaveOff","drawingSettingAutosaveOn","drawingSettingAutosaveSaving","drawingSettingDrawingMode","drawingSettingDrawingModeActive","drawingSettingHide","drawingSettingLock","drawingSettingPreserveDrawings","drawingSettingPreserveDrawingsActive","drawingSettingShow","drawingSettingUnlock","empty","exitFullscreen","flash","fullscreen","gesture","gift","hamburger","help","idea","ideaLoad","ideaSave","info","layout1h1v","layout1h2v","layout1h3v","layout1l2r","layout1t2b","layout2h1v","layout2h2v","layout3h1v","layout3h2v","lightMode","lineChartType","lock","menuClose","minus","more","note","ohlcChartType","palette","profile","publish","refresh","remove","restore","settingsWheel","share","signOut","star","starOutlined","switchHorizontal","switchVertical","tabKey","template","toolArrow","toolBrush","toolCallout","toolCurve","toolElliottWave","toolEllipse","toolExpand","toolFibonacci","toolLine","fill","stroke","toolMeasure","toolMidLineH","toolMidLineV","toolMouse","toolPitchfork","toolPolygon","toolPosition","toolRect","toolRectRotated","toolText","toolTriangle","toolXABCD","trashCan","trendingDown","trendingUp","triangle","triangleOutlineDown","triangleOutlineUp","warning","xmlns","InputTheme","InputRounding","InputSize","getInputTheme","isError","input","navigationBar","InputComponent","showNumberStepper","error","caption","isMobileStyleEnabled","inputTheme","isLeftStringIcon","isRightStringIcon","inputSize","commonSideContentClassnames","Label","InputCaption","TextareaComponent","textareaTheme","ListContext","useListState","options","ListItem","activeTheme","onSelectItem","onKeyPress","closeOnSelect","List","selectedIndex","includeBaseStyles","prevSelected","items","move","closeParent","findIndex","item","NotificationPosition","NotificationContext","show","useNotification","getViewport","visualViewport","innerHeight","offsetTop","offsetLeft","NotificationWrapper","notification","setNotification","viewport","setViewport","positionClass","BottomLeft","TopLeft","TopRight","BottomRight","WrapperComponent","inline","unstable_autoFocusOnShow","willChange","Notification","timeoutId","timeoutInMs","withNotificationContext","WrappedComponent","displayName","WithNotificationContext","notificationContext","focusOnHide","hasArrow","hasBackdrop","popoverWrapperStyle","popoverMaxHeight","MAX_SAFE_INTEGER","hasViewportHeightLimit","hasButtonWidthLimit","useWindowSize","isWatching","buttonElement","unstable_referenceRef","maxHeightStyle","usePopoverMaxHeight","maxHeightLimit","offsets","buttonRect","popoverId","getAttribute","popoverWrapper","unstable_autoFocusOnHide","TooltipArrow","DEFAULT_OFFSET","useHoverPopover","showTimeout","hideTimeout","clearTimeouts","showPopover","hidePopover","onMouseOver","onMouseOut","ComboBoxItem","selected","currentId","ComboBox","inputProps","popoverProps","inputTestId","inputValue","INSTRUMENT_CATEGORIES","Centered","SearchError","href","link","resetErrorBoundary","Highlight","highlight","processedText","before","after","SearchItem","chartIndex","company","exchange","getRedirectForTicker","tickerRaw","redirectLink","getInstrumentForTicker","quoteSearchExt","SearchList","isLoading","useQuery","searchApiRequest","keepPreviousData","cacheTime","staleTime","setAnimated","isShowAllVisible","isSearchItemLink","onTickerSelected","setInputValue","currentValue","Search","isSearchIcon","reset","useQueryErrorResetBoundary","minValueLength","defaultValue","defaultPlacement","listState","category","setCategory","changeCategory","first","onInputKeyDown","stopPropagation","autoFocus","placeholder","autoComplete","autoCorrect","autoCapitalize","maxLength","onBlur","popoverClass","isMatchInputAndBoxWidth","maxWidth","allowCategorySwitching","ErrorBoundary","FallbackComponent","onReset","resetKeys","getSelectedItemIndex","useSelect","setSelectedIndex","closePopover","newIndex","onItemChange","selectedItem","reloadDocument","newUrl","URL","hash","SelectButton","isPopoverTrigger","themeProps","getButtonProps","Select","popoverStateSettings","onIsInteractingChange","StatelessSelect","labelClassName","labelTitleClassName","buttonContent","listProps","isNativeMobileSelect","hasPopoverViewportHeightLimit","hasPopoverButtonWidthLimit","showMobileSelect","NativeSelectComponent","useInRouterContext","NativeSelectInRouterContext","NativeSelect","titleClassName","relative","SelectList","SelectPlaceholder","SelectOption","SelectWithTooltip","tooltipLabel","tooltip","unstable_timeout","isTooltipIgnored","visibilityState","activeElement","onSelectFocus","onSelectBlur","onFocus","showPlaceholder","handleNativeSelectChange","itemIndex","target","hidden","i","navigate","useNavigate","onChangeWithNavigate","isProgressBar","progress","radius","strokeWidth","circleXY","circumference","PI","strokeDasharray","strokeDashoffset","strokeLinecap","DATERANGE_TOOLTIP","DateRangeSelect","dateRangeGroups","selectedDateRange","onDateRangeSelect","flatDateRanges","flatMap","dateRanges","selectWithTooltipListProps","withReload","linkProps","Link","to","_createElement","LabelWithDelayedSpinner","TIMEFRAME_TOOLTIP","TimeframeSelect","timeFrameGroups","selectedTimeframe","favoriteTimeframes","isCompactView","isCompactOnly","onTimeframeSelect","onFavoriteTimeframeToggle","isFavoritesEnabled","flatTimeframes","timeframes","getSelectedTimeframeLabel","selectedTimeframeItem","labelShort","groupIndex","isIconButtonActive","classNames","getTimeframeChipElementId","getButtonPadding","TimeframeBar","compactViewMaxBreakpointPx","loadingTimeframe","isDateRangeAvailable","containerElement","isScrollIntoViewEnabled","isTimeframeSelectEnabled","scrollWrapperElement","setScrollWrapperElement","timeframeButtonsScrollLocation","setTimeframeButtonsScrollLocation","isOnLeftEdge","isOnRightEdge","elementWidth","timeframesInExpandedPanel","checkTimeframeWrapperScrollPosition","scrollLeft","ceil","offsetWidth","scrollWidth","timeframeElement","scrollTo","onScroll","onWheel","absDx","deltaX","deltaY","generateTimeframeGroups","premiumTimeframes","TIMEFRAME","labelPageTitle","freeTimeframes","getTimeframeGroups","generateDateRangeGroups","isStock","DateRangeType","getDateRangeGroups","customRange","isCustomAvailable","rangeGroups","dateRangePrefix","DATE_RANGE_PREFIX_DELMITER","CustomDateRangePrefixEnum","CUSTOM_DATE_RANGE","getDateRangeGroupsWithHref","generatePath","dateRangeGroup","FREE_PERIODS_STOCK","generatePathForTimeframeDateRange","utmCampaign","dateRangeQueryKey","p","utm_source","utm_medium","utm_campaign","timeframeUtm","daterangeUtm","getParsedDateRange","parseCustomDateRangeUrlParam","anchorDate","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","start","isNaN","end","Prev","years","months","days","getCustomStartEndDateRangeUrlParam","startString","endString","getPrevPeriodDateRangeUrlParam","getTimeframeForDateRangeType","_ref6","getTimeframeFromDateRange","_ref7","dateRangeTimeframe","startNyTime","startToReferenceDateNumOfDays","rangeNumOfDays","DATE_PICKER_MIN_DATE","YEARS_MAX_VALUE","TAB_BUTTON_COMMON_PROPS","CustomRangeType","DEFAULT_MANUAL_RANGE","kind","Manual","DEFAULT_START_END_RANGE","StartEnd","CustomDateRange","dialogState","onDialogSubmit","isFetching","selectedTab","setSelectedTab","getDefaultSelectedTab","getDefaultSelectedDate","newValue","prevState","newState","newEnd","isAbsolute","fromDate","toDate","manualRange","onSubmit","isValidStartEndRangeState","isValidManualRangeState","minDate","useCustomDateRangeDialog","pathGenerator","shouldReloadOnNavigate","customDateRangeDialogState","handleDateRangeSelect","callback","path","getDateRangeTimeframe","newTimeframe","TIMEFRAME_FAVORITE_DEFAULTS","TIMEFRAME_FAVORITE_DEFAULTS_FREE","intraday","LOCAL_STORAGE_KEY","useFavoriteTimeframes","useSyncLocalStorage","toggleFavoriteTimeframe","TooltipInputWrapper","tooltipContent","tooltipColor","tooltipSettings","onMouseEnter","onMouseLeave","TooltipInputComponent","isInteractive","TooltipInput","TooltipBox","TooltipColor","tooltipProps","transformMap","auto","positionMain","arrowColor","getHeadingElement","CRYPTO_TICKERS","useIsMounted","isMountedRef","getIsMounted","elementOverride","elementRef","setElementWidth","setElementHeight","offsetHeight","measureElement","newElementWidth","newElementHeight","measureElementDebounced","debounce","resizeObserver","cancel","MAX_HEIGHT_PROPERTY","POPOVER_HEIGHT_LIMIT_STYLE","maxHeight","offsetY","elementMaxHeight","controller","AbortController","setResizeObserver","loadResizeObserverPolyfill","then","polyfill","signal","aborted","abort","hasOwnProperty","getDefaultValueGetter","row","getValueForSort","sortByColumn","storageKey","storage","subscription","unsubscribe","useTrackPageView","trackInitial","trackAutomatically","initialRender","useLocation","handleTrackView","tracking","throttleWaitInMs","setSize","DEFAULT_OFFSETS","ContextMenu","menuMaxHeight","popperElement","setPopperElement","virtualRef","toJSON","getVirtualRef","hasBeenOpen","styles","attributes","usePopper","modifiers","offset","popper","ContextMenuDropdown","ContextMenuInner","innerState","assign","menu_option","ChartGridCell","gridArea","GridLayout","rows","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","InnerState","valueKey","changeKey","valueAccessor","handleChange","visibleColumns","getColumnsByKeys","ColumnId","sortableColumns","columnMap","IS_MOBILE","isElementOverflowing","el","columnValueGetter","RowKind","PortfolioWatchlistTable","handleTickerSelect","chartTicker","selectedPortfolio","isSelectClosed","tableOrder","handleOrderChange","tableSort","selectedRow","setSelectedRow","setContainerElement","querySelector","rowElement","focus","handleKeyUp","dataset","handleTableMouseMove","preventScroll","handleSortChange","entry","prevSibling","previousElementSibling","nextSibling","nextElementSibling","firstElement","parentElement","firstElementChild","lastElement","lastElementChild","scrollIntoView","onKeyUp","renderColumn","RangeSize","RangeSlider","step","inputClassName","hasTrack","setHasTrack","trackRef","thumbRef","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","ToolbarTheme","ToolbarDirection","ToolbarContext","vertical","isWrapped","isStretched","useToolbarContext","Toolbar","toolbarRef","contextProviderValue","alternative","horizontal","toolbarSettings","hasRedesignEnabled","getToolbarSettings","forceReflow","originalWidth","ToolbarButton","disabledTooltip","isInAction","isInActionProp","iconAction","buttonSettings","includeRedesign","grow","getButtonThemeSettings","getMainIcon","iconActive","titleActive","ToolbarGroup","defaultItem","groupItems","groupTitle","useNativeSelect","setSelectedItem","groupId","toLocaleLowerCase","isAlternativeTheme","option","ToolbarItem","isItemActive","ToolbarDivider","StepContent","shepherdLibrary","async","loadShepherdLibrary","setLoading","shepherdPromise","buttonClasses","getStepButtons","tour","arr","action","complete","classes","back","backButton","next","nextButton","processSteps","steps","attachTo","on","popperOptions","ReactDOM","modalOverlayOpeningRadius","overlayRadius","modalOverlayOpeningPadding","overlayPadding","getTourKey","getStepsForUser","tours","lastFinishedTour","localStorage","getItem","lastTourIndex","allToursViewed","every","skip","toursToView","hasNewTours","initialTour","completeTour","setItem","DEFAULT_OPTIONS","exitOnEsc","useModalOverlay","useTour","setIsLoading","currentTour","setTour","loadingSetter","startTour","definition","setComplete","tourUtils","Tour","from","removeStep","processedSteps","addSteps","event_label","win","components","buttonGroup","checkbox","colorPicker","contextMenu","copyToClipboard","delayed","dialog","datePicker","dropdown","grid","list","range","spinner","timeframeBar","toolbar","tooltipInput","typography","portfolio","FLibs","ReactRouterDOM","d3","nice","scaleLinear","scaleSymlog","DateFns","addBusinessDays","differenceInCalendarDays","eachDayOfInterval","endOfDay","intervalToDuration","isSameMonth","isSameWeek","isWeekend","isWithinInterval","startOfDay","startOfYear","sub","subMonths","subYears","assets","logo","logo_light","freeze","urlSort","args","tickers","transactions","transaction","PortfolioTransaction","formatNumber","costAvg","lastClose","prevClose","lastChange","showPlusSign","fractions","lastChangePct","lastVolume","TRANSACTION_LABEL","PORTFOLIO_DATE_FORMAT_VIEW","shares","price","valuePaid","valueMarket","gainMarketUsd","gainMarketPct","gainTodayUsd","PORTFOLIO_DATE_FORMAT_DATA","PORTFOLIO_REFRESH_INTERVAL","EMPTY_FORM_ENTRY","PORTFOLIO_INPUT_NAME","PORTFOLIO_INPUT_EMPTY_ERROR","PORTFOLIO_INPUT_EXISTS_ERROR","TICKERS_INPUT_NAME","TICKERS_INPUT_FORMAT_TIP","EMPTY_RESPONSE","limit","limitTransactions","news","portfolios","portfolioData","portfolioId","apiRequest","pid","deletePortfolio","portfolioEntry","method","stringify","QUOTE_INVALID_TICKER_REQUEST","QUOTE_INVALID_TICKER_RESPONSE","quoteData","headers","ContentType","validateTickers","parsedTickers","json","recalculatePortfolio","numberOfTransactions","totalValue","pricePerColumn","response","prices","captureMessage","extra","requestTickers","requestTickersLength","responseLength","tickerPrices","fromEntries","tickerPrice","NaN","submitForm","ErrorSource","portfolioTickers","portfolioName","portfolio_name","submitEditForm","reorderPortfolios","PortfolioQuery","PortfolioMapSizeKey","PortfolioView","PortfolioTableView","PortfolioTableViewLabels","Ticker","Trade","NumberOfShares","ActionKind","PortfolioDataKey","industryLabelKey","groupPrefix","groupLabel","DEFAULT_SETTINGS","tableView","showMap","showIndustries","subtype","parseBoolFromValue","getMapSettingFromLocalStorage","savedSettings","saveMapSettingToLocalStorage","itemToStore","customTickersOrder","SUMMARY_DEFAULT","valueMarketPrev","getSummary","getIndustries","industries","industry","groupByKey","concat","getPerfForTicker","group","perf","getMapData","perfData","groupByIndustry","hasData","dedupedData","result","previouslyAdded","newEntry","prevEntry","flattenAndDedupe","parsedData","gain","ShortGainers","ShortLosers","LongGainers","LongLosers","getEntryGroup","subtypePerf","getPerfText","perfText","nodes","additional","description","perfWeek","isLong","isGainer","longPrefix","shortGainers","shortLosers","shortPrefix","longGainers","longLosers","groupName","createGroup","parsePortfolioQuery","params","defaultPortfolioId","currentPortfolio","view","getFormattedDate","validateEditRow","dateFormat","checkFormat","formErrors","parseInputAsDate","errors","FORM_ENTRY_KEYS","getBulkEditData","existingId","getUuid","uuid","getNewTransaction","serializeFormData","serializer","append","appendRowToFormData","validateFormData","api","validatedTickers","validationResult","hasInvalidEntries","isInvalidTicker","getNumberValue","getPortfolioInitData","returnData","isInitData","initData","EMPTY_TRANSACTION","getTradesStructureData","parseResponseForContentType","contentType","ApplicationJson","ApplicationJsonUTF","FormUrlEncoded","ThrowableError","status","isServerError","constructor","super","this","throwOnAllErrors","requestUrl","requestOptions","request","fetch","cancelableRequest","textResponse","responseContentType","Html","parsedResponse","ok","statusText","rayId","message","catch","scope","setContext","emitter","subscribeToChanges","changeCallback","EventEmitter","getValue","setValue","onStorageChange","addListener","removeListener","emit","valueToStore","Function","removeValue","removeItem","migrateValue","transformValue","oldValue","compilePath","pathToRegexp","toHome","toNews","toScreener","toCharts","toGroups","toPortfolio","toInsider","toElite","toSearch","validate","toQuote","toContact","toAlerts","toHelp","toAccount","toLogin","toLogout","toMaps","toBubbles","toFutures","toFuturesPerf","toFuturesCharts","toFuturesChartDetail","toForex","toForexPerf","toForexCharts","toForexChartDetail","toCrypto","toCryptoPerf","toCryptoCharts","toCryptoChartDetail","toBacktests","toBacktestCreate","toBacktestDetail","backtestId","toBacktestPresets","lazyLoadComponent","chunkName","load","componentLoader","lazy","cleanedTicker","resizeObserverPolyfill","getIsBrave","brave","isBrave","topLeft","bottomLeft","leftCenter","topCenter","bottomCenter","topRight","bottomRight","rightCenter","intlCache","getIntl","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","shortFormatNumber","suffix","formatted","fixedValue","toFixed","prefix","valueA","valueB","localeCompare","moveItemInArray","sourceIndex","destinationIndex","removed","splice","crypto","randomUUID","getRandomValues","Uint8Array","revalidateOnQueryChange","prevParams","currentUrl","nextParams","nextUrl","requiredChanged","otherChanged","defaultShouldRevalidate","parseRouteInitData","removeElement","initialData"],"sourceRoot":""}