{"version":3,"file":"libs_init.fc6c3ee1.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/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-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}\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}: 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: false,\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((acc, v) => {\r\n acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())\r\n return acc\r\n }, {} as Record)\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","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 Custom Date Range\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 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 { 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 * 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.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}\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((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 }, {} as Record)\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\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 = new Intl.NumberFormat('en-US', {\r\n minimumFractionDigits: fractions,\r\n maximumFractionDigits: fractions,\r\n }).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 = new Intl.NumberFormat('en-US', {\r\n minimumFractionDigits: fractions,\r\n maximumFractionDigits: fractions,\r\n }).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","layout","barWidth","barMargin","scrollable","editable","charts","scale","leftOffset","instrument","refreshData","stretch","panes","elements","JSON","parse","getParsedCookies","cookieName","parseCookies","document","cookie","map","cookieString","acc","v","trim","getCookie","re","RegExp","replace","setCookie","expires","toUTCString","hostname","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","formatDateToStringUS","year","DRAWING_QUOTE_PAGE_COOKIE_NAME","getIsDrawingEnabledOnQuotePage","async","setIsDrawingEnabledOnQuotePage","isEnabled","fetch","catch","then","res","ok","setMonth","setIsDrawingEnabledOnQuotePageCookieViaJS","i","idea","rest","reload","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","push","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","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","pathname","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","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","polyfill","signal","aborted","abort","hasOwnProperty","getDefaultValueGetter","row","getValueForSort","sortByColumn","storageKey","storage","subscription","unsubscribe","throttleWaitInMs","setSize","DEFAULT_OFFSETS","ContextMenu","menuMaxHeight","popperElement","setPopperElement","virtualRef","toJSON","getVirtualRef","hasBeenOpen","styles","attributes","usePopper","modifiers","offset","popper","ContextMenuDropdown","ContextMenuInner","innerState","gtag","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","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","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","cancelableRequest","textResponse","responseContentType","Html","parsedResponse","statusText","rayId","message","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","shortFormatNumber","suffix","formatted","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","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":""}