{"version":3,"file":"libs_init.e44566bc.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/quote/save-to-portfolio/PortfolioInput.tsx","webpack://@finviz/website/./js/app/quote/save-to-portfolio/utils.ts","webpack://@finviz/website/./js/app/quote/save-to-portfolio/FormContent.tsx","webpack://@finviz/website/./js/app/quote/save-to-portfolio/SuccessContent.tsx","webpack://@finviz/website/./js/app/quote/save-to-portfolio/SaveToPortfolio.tsx","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/cookie.ts","webpack://@finviz/website/./js/app/shared/hover-chart.ts","webpack://@finviz/website/./js/app/shared/isMobile.ts","webpack://@finviz/website/./js/app/shared/ticker-sanitizer.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/app/shared/utils.ts","webpack://@finviz/website/./js/main/components/RedGreenText.tsx","webpack://@finviz/website/./js/main/components/Table/Table.tsx","webpack://@finviz/website/./js/main/components/Table/types.ts","webpack://@finviz/website/./js/main/components/Table/TableCell.tsx","webpack://@finviz/website/./js/main/components/Table/TableHeader.tsx","webpack://@finviz/website/./js/main/components/Table/TableRow.tsx","webpack://@finviz/website/./js/main/components/Table/hooks.ts","webpack://@finviz/website/./js/main/components/box.tsx","webpack://@finviz/website/./js/main/components/button-group/button-group.tsx","webpack://@finviz/website/./js/main/components/button.tsx","webpack://@finviz/website/./js/main/components/checkbox.tsx","webpack://@finviz/website/./js/main/components/color-picker/draggable.tsx","webpack://@finviz/website/./js/main/components/color-picker/pointer.tsx","webpack://@finviz/website/./js/main/components/color-picker/util.ts","webpack://@finviz/website/./js/main/components/color-picker/alpha.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-palette.tsx","webpack://@finviz/website/./js/main/components/color-picker/hue-saturation.tsx","webpack://@finviz/website/./js/main/components/color-picker/lightness.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-preview.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-input.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-button.tsx","webpack://@finviz/website/./js/main/components/constants.ts","webpack://@finviz/website/./js/main/components/copy-to-clipboard/copy-to-clipboard.tsx","webpack://@finviz/website/./js/main/components/date-picker/index.tsx","webpack://@finviz/website/./js/main/components/delayed.tsx","webpack://@finviz/website/./js/main/components/dialog/hooks.ts","webpack://@finviz/website/./js/main/components/dialog/dialog-box.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-overlay.tsx","webpack://@finviz/website/./js/main/components/dialog/utils.ts","webpack://@finviz/website/./js/main/components/dialog/dialog.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-body.tsx","webpack://@finviz/website/./js/main/components/dialog/confirmation-dialog.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-trigger.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-footer.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-header.tsx","webpack://@finviz/website/./js/main/components/dropdown/hooks.ts","webpack://@finviz/website/./js/main/components/dropdown/dropdown.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-bar.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-item.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-separator.tsx","webpack://@finviz/website/./js/main/components/dropdown/more-button.tsx","webpack://@finviz/website/./js/main/components/icon/icon.tsx","webpack://@finviz/website/./js/main/components/icon/index.tsx","webpack://@finviz/website/./js/main/components/icon/add.tsx","webpack://@finviz/website/./js/main/components/icon/arrow-down-short.tsx","webpack://@finviz/website/./js/main/components/icon/arrow-forward.tsx","webpack://@finviz/website/./js/main/components/icon/arrow-up-short.tsx","webpack://@finviz/website/./js/main/components/icon/briefcase.tsx","webpack://@finviz/website/./js/main/components/icon/calendar.tsx","webpack://@finviz/website/./js/main/components/icon/candle-bar-basic.tsx","webpack://@finviz/website/./js/main/components/icon/candle-bar-heikin-ashi.tsx","webpack://@finviz/website/./js/main/components/icon/candle-bar-hollow.tsx","webpack://@finviz/website/./js/main/components/icon/caret-down.tsx","webpack://@finviz/website/./js/main/components/icon/caret-left.tsx","webpack://@finviz/website/./js/main/components/icon/caret-right.tsx","webpack://@finviz/website/./js/main/components/icon/caret-up.tsx","webpack://@finviz/website/./js/main/components/icon/caretVertical.tsx","webpack://@finviz/website/./js/main/components/icon/chart-bar.tsx","webpack://@finviz/website/./js/main/components/icon/chart-bubble.tsx","webpack://@finviz/website/./js/main/components/icon/chart-pie.tsx","webpack://@finviz/website/./js/main/components/icon/chart-table.tsx","webpack://@finviz/website/./js/main/components/icon/chart-treemap.tsx","webpack://@finviz/website/./js/main/components/icon/chevron-down.tsx","webpack://@finviz/website/./js/main/components/icon/chevron-right.tsx","webpack://@finviz/website/./js/main/components/icon/menu-close.tsx","webpack://@finviz/website/./js/main/components/icon/dark-mode.tsx","webpack://@finviz/website/./js/main/components/icon/diamond-outlined.tsx","webpack://@finviz/website/./js/main/components/icon/done.tsx","webpack://@finviz/website/./js/main/components/icon/drag.tsx","webpack://@finviz/website/./js/main/components/icon/draw.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-action-delete.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-autosave-off.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-autosave-on.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-autosave-saving.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-drawing-mode.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-drawing-mode-active.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-hide.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-lock.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-preserve-drawings.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-preserve-drawings-active.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-show.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-unlock.tsx","webpack://@finviz/website/./js/main/components/icon/exit-fullscreen.tsx","webpack://@finviz/website/./js/main/components/icon/flash.tsx","webpack://@finviz/website/./js/main/components/icon/fullscreen.tsx","webpack://@finviz/website/./js/main/components/icon/gesture.tsx","webpack://@finviz/website/./js/main/components/icon/gift.tsx","webpack://@finviz/website/./js/main/components/icon/hamburger.tsx","webpack://@finviz/website/./js/main/components/icon/help.tsx","webpack://@finviz/website/./js/main/components/icon/idea.tsx","webpack://@finviz/website/./js/main/components/icon/idea-load.tsx","webpack://@finviz/website/./js/main/components/icon/idea-save.tsx","webpack://@finviz/website/./js/main/components/icon/info.tsx","webpack://@finviz/website/./js/main/components/icon/interval.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1h1v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1h2v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1h3v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1l2r.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1t2b.tsx","webpack://@finviz/website/./js/main/components/icon/layout-2h1v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-2h2v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-3h1v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-3h2v.tsx","webpack://@finviz/website/./js/main/components/icon/light-mode.tsx","webpack://@finviz/website/./js/main/components/icon/line-chart-type.tsx","webpack://@finviz/website/./js/main/components/icon/lock.tsx","webpack://@finviz/website/./js/main/components/icon/close.tsx","webpack://@finviz/website/./js/main/components/icon/minus.tsx","webpack://@finviz/website/./js/main/components/icon/more.tsx","webpack://@finviz/website/./js/main/components/icon/note.tsx","webpack://@finviz/website/./js/main/components/icon/ohlc-chart-type.tsx","webpack://@finviz/website/./js/main/components/icon/palette.tsx","webpack://@finviz/website/./js/main/components/icon/profile.tsx","webpack://@finviz/website/./js/main/components/icon/publish.tsx","webpack://@finviz/website/./js/main/components/icon/refresh.tsx","webpack://@finviz/website/./js/main/components/icon/remove.tsx","webpack://@finviz/website/./js/main/components/icon/restore.tsx","webpack://@finviz/website/./js/main/components/icon/search.tsx","webpack://@finviz/website/./js/main/components/icon/settings.tsx","webpack://@finviz/website/./js/main/components/icon/settings-wheel.tsx","webpack://@finviz/website/./js/main/components/icon/share.tsx","webpack://@finviz/website/./js/main/components/icon/sign-out.tsx","webpack://@finviz/website/./js/main/components/icon/star.tsx","webpack://@finviz/website/./js/main/components/icon/star-outlined.tsx","webpack://@finviz/website/./js/main/components/icon/switch-horizontal.tsx","webpack://@finviz/website/./js/main/components/icon/switch-vertical.tsx","webpack://@finviz/website/./js/main/components/icon/tab-key.tsx","webpack://@finviz/website/./js/main/components/icon/template.tsx","webpack://@finviz/website/./js/main/components/icon/tool-arrow.tsx","webpack://@finviz/website/./js/main/components/icon/tool-brush.tsx","webpack://@finviz/website/./js/main/components/icon/tool-callout.tsx","webpack://@finviz/website/./js/main/components/icon/tool-curve.tsx","webpack://@finviz/website/./js/main/components/icon/tool-elliott-wave.tsx","webpack://@finviz/website/./js/main/components/icon/tool-ellipse.tsx","webpack://@finviz/website/./js/main/components/icon/tool-expand.tsx","webpack://@finviz/website/./js/main/components/icon/tool-fibonacci.tsx","webpack://@finviz/website/./js/main/components/icon/tool-line.tsx","webpack://@finviz/website/./js/main/components/icon/tool-measure.tsx","webpack://@finviz/website/./js/main/components/icon/tool-midline-h.tsx","webpack://@finviz/website/./js/main/components/icon/tool-midline-v.tsx","webpack://@finviz/website/./js/main/components/icon/tool-mouse.tsx","webpack://@finviz/website/./js/main/components/icon/tool-pitchfork.tsx","webpack://@finviz/website/./js/main/components/icon/tool-polygon.tsx","webpack://@finviz/website/./js/main/components/icon/tool-position.tsx","webpack://@finviz/website/./js/main/components/icon/tool-rect.tsx","webpack://@finviz/website/./js/main/components/icon/tool-rect-rotated.tsx","webpack://@finviz/website/./js/main/components/icon/tool-text.tsx","webpack://@finviz/website/./js/main/components/icon/tool-triangle.tsx","webpack://@finviz/website/./js/main/components/icon/tool-xabcd.tsx","webpack://@finviz/website/./js/main/components/icon/trash-can.tsx","webpack://@finviz/website/./js/main/components/icon/trending-down.tsx","webpack://@finviz/website/./js/main/components/icon/trending-up.tsx","webpack://@finviz/website/./js/main/components/icon/triangle.tsx","webpack://@finviz/website/./js/main/components/icon/triangle-outline-down.tsx","webpack://@finviz/website/./js/main/components/icon/triangle-outline-up.tsx","webpack://@finviz/website/./js/main/components/icon/warning.tsx","webpack://@finviz/website/./js/main/components/icon/svg.tsx","webpack://@finviz/website/./js/main/components/input.tsx","webpack://@finviz/website/./js/main/components/list/hooks.tsx","webpack://@finviz/website/./js/main/components/list/list-item.tsx","webpack://@finviz/website/./js/main/components/list/list.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./js/main/components/popover/popover.tsx","webpack://@finviz/website/./js/main/components/popover/hooks.ts","webpack://@finviz/website/./js/main/components/popover/popover-trigger.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box-item.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box.tsx","webpack://@finviz/website/./js/main/components/search/constants.ts","webpack://@finviz/website/./js/main/components/centered.tsx","webpack://@finviz/website/./js/main/components/search/search-error.tsx","webpack://@finviz/website/./js/main/components/highlight.tsx","webpack://@finviz/website/./js/main/components/search/search-item.tsx","webpack://@finviz/website/./js/main/components/search/util.ts","webpack://@finviz/website/./js/main/components/search/search-list.tsx","webpack://@finviz/website/./js/main/components/search/search.tsx","webpack://@finviz/website/./js/main/components/combo-box/hooks.ts","webpack://@finviz/website/./js/main/components/select/hooks.ts","webpack://@finviz/website/./js/main/components/select/select-button.tsx","webpack://@finviz/website/./js/main/components/select/select.tsx","webpack://@finviz/website/./js/main/components/select/select-with-tooltip.tsx","webpack://@finviz/website/./js/main/components/select/native-select.tsx","webpack://@finviz/website/./js/main/components/select/select-list.tsx","webpack://@finviz/website/./js/main/components/spinner.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/daterange-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/label-with-delayed-spinner.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-bar.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range-utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-custom-date-range-dialog.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-favorite-timeframes.tsx","webpack://@finviz/website/./js/main/components/tooltip-input.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip-box.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip-trigger.tsx","webpack://@finviz/website/./js/main/components/tooltip/hooks.ts","webpack://@finviz/website/./js/main/components/tooltip/tooltip-arrow.tsx","webpack://@finviz/website/./js/main/components/tooltip/types.ts","webpack://@finviz/website/./js/main/components/typography.tsx","webpack://@finviz/website/./js/main/constants.ts","webpack://@finviz/website/./js/main/hooks/use-is-mounted.ts","webpack://@finviz/website/./js/main/hooks/use-element-measure.ts","webpack://@finviz/website/./js/main/hooks/use-popover-maxHeight.ts","webpack://@finviz/website/./js/main/hooks/use-resize-observer.ts","webpack://@finviz/website/./js/main/hooks/use-sort-data.ts","webpack://@finviz/website/./js/main/hooks/use-sync-local-storage.ts","webpack://@finviz/website/./js/main/hooks/use-track-pageview.ts","webpack://@finviz/website/./js/main/hooks/use-window-size.tsx","webpack://@finviz/website/./js/main/components/context-menu/context-menu.tsx","webpack://@finviz/website/./js/main/components/grid/grid.tsx","webpack://@finviz/website/./js/main/components/inner-state/inner-state.tsx","webpack://@finviz/website/./js/main/components/portfolio/PortfolioWatchlistTable.tsx","webpack://@finviz/website/./js/main/components/range.tsx","webpack://@finviz/website/./js/main/components/toolbar/interfaces.ts","webpack://@finviz/website/./js/main/components/toolbar/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/toolbar.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-button.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-group.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-item.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-divider.tsx","webpack://@finviz/website/./js/main/components/tour/step-content.tsx","webpack://@finviz/website/./js/main/components/tour/utils.ts","webpack://@finviz/website/./js/main/components/tour/hooks.tsx","webpack://@finviz/website/./js/main/components/index.ts","webpack://@finviz/website/./js/main/libs-init.ts","webpack://@finviz/website/./js/main/modules/portfolio/components/EditableColumns/CostPerShare.tsx","webpack://@finviz/website/./js/main/modules/portfolio/components/EditableColumns/Date.tsx","webpack://@finviz/website/./js/main/modules/portfolio/components/EditableColumns/Shares.tsx","webpack://@finviz/website/./js/main/modules/portfolio/components/EditableColumns/Ticker.tsx","webpack://@finviz/website/./js/main/modules/portfolio/components/EditableColumns/Transaction.tsx","webpack://@finviz/website/./js/main/modules/portfolio/components/PortfolioBulkEditRowContext.tsx","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 classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Select, SelectOption } from '../../../main/components/select'\r\nimport { TooltipInput } from '../../../main/components/tooltip-input'\r\nimport { PortfolioOptions, SaveToPortfolioInputProps } from './types'\r\n\r\ntype PortfolioInputProps = {\r\n portfolios: PortfolioOptions\r\n} & SaveToPortfolioInputProps\r\n\r\nexport default function PortfolioInput(props: PortfolioInputProps) {\r\n const handleChange = React.useCallback(\r\n (ev: React.ChangeEvent) => {\r\n const portfolio = ev.currentTarget.value\r\n if (portfolio.trim().length >= 0 && props.errors?.portfolioName) {\r\n props.setErrors?.((errors) => ({ ...errors, portfolio: false }))\r\n }\r\n\r\n props.setState((prev) => ({ ...prev, portfolioName: portfolio }))\r\n },\r\n [props]\r\n )\r\n\r\n const handleSelect = React.useCallback(\r\n (option: { value: number; label: string }) => {\r\n props.setState((prev) => ({ ...prev, portfolioId: option.value }))\r\n props.setErrors?.((errors) => ({ ...errors, portfolioId: false }))\r\n },\r\n [props]\r\n )\r\n\r\n const tooltipContent = props.errors?.portfolioName ? 'Missing portfolio name' : undefined\r\n\r\n return (\r\n <>\r\n {props.portfolios.length > 0 ? (\r\n
\r\n \r\n \r\n {props.portfolios.map((item) => (\r\n {item.label}\r\n ))}\r\n \r\n
\r\n ) : (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { PORTFOLIO_DATE_FORMAT_DATA } from '../../../main/modules/portfolio/constants/general'\r\nimport { portfolioEntry, portfolioTickers, validateTickers } from '../../../main/modules/portfolio/services/api'\r\nimport { PortfolioTransaction } from '../../../main/modules/portfolio/types'\r\nimport { validateEditRow } from '../../../main/modules/portfolio/utils'\r\nimport { portfolioLimitRequest } from '../../../main/services/api'\r\nimport { FormErrors, SaveToPortfolioEntry } from './types'\r\n\r\nexport const PORTFOLIO_BASE_URL = '/portfolio.ashx?pid='\r\n\r\nexport async function validateState(state: SaveToPortfolioEntry) {\r\n const validation = validateEditRow(state, PORTFOLIO_DATE_FORMAT_DATA, false)\r\n const formErrors: FormErrors = { ...validation.errors }\r\n\r\n if (state.portfolioId === 0 && state.portfolioName.trim().length === 0) {\r\n formErrors.portfolioName = true\r\n }\r\n\r\n if (state.portfolioId !== 0) {\r\n const limitResponse = await portfolioLimitRequest(state.portfolioId)\r\n if (!limitResponse || limitResponse.transactions >= limitResponse.limitTransactions) formErrors.portfolioId = true\r\n }\r\n\r\n if (!formErrors.ticker) {\r\n const isInvalidTicker = !(await validateTickers([state.ticker]))[0]\r\n formErrors.ticker = isInvalidTicker\r\n }\r\n\r\n return { isValid: !Object.values(formErrors).some(Boolean), errors: formErrors }\r\n}\r\n\r\nexport async function submitForm(state: SaveToPortfolioEntry): Promise<{ message?: string; isSuccess: boolean }> {\r\n let pid = state.portfolioId\r\n\r\n try {\r\n if (!!state.portfolioName) {\r\n const createdPortfolioResponse = await portfolioTickers({\r\n tickers: state.ticker,\r\n portfolioName: state.portfolioName,\r\n })\r\n\r\n if (!createdPortfolioResponse) throw new Error()\r\n if (state.transaction === PortfolioTransaction.Watch) return { isSuccess: true }\r\n\r\n pid = createdPortfolioResponse.portfolioId\r\n }\r\n\r\n await portfolioEntry({ pid }, 'POST', state)\r\n return { isSuccess: true }\r\n } catch (error) {\r\n const result = {\r\n message: 'There’s been an error saving to portfolio, make sure you’re connected to the Internet and try again.',\r\n isSuccess: false,\r\n }\r\n\r\n if (!!error && typeof error === 'object' && 'body' in error) {\r\n const apiError = error as { body: { message: string } }\r\n result.message = apiError.body.message\r\n }\r\n\r\n return result\r\n }\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogFooter } from '../../../main/components/dialog'\r\nimport { Paragraph } from '../../../main/components/typography'\r\nimport { CostPerShareEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/CostPerShare'\r\nimport { DateEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/Date'\r\nimport { SharesEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/Shares'\r\nimport { TickerEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/Ticker'\r\nimport { TransactionEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/Transaction'\r\nimport { PortfolioBulkEditRowContextProvider } from '../../../main/modules/portfolio/components/PortfolioBulkEditRowContext'\r\nimport { PORTFOLIO_DATE_FORMAT_DATA, TRANSACTION_LABEL } from '../../../main/modules/portfolio/constants/general'\r\nimport { PortfolioTransaction } from '../../../main/modules/portfolio/types'\r\nimport { lastCloseRequest, portfoliosRequest } from '../../../main/services/api'\r\nimport PortfolioInput from './PortfolioInput'\r\nimport { FormErrors, PortfolioOptions, SaveToPortfolioEntry } from './types'\r\nimport { submitForm, validateState } from './utils'\r\n\r\nconst DEFAULT_STATE: SaveToPortfolioEntry = {\r\n portfolioId: 0,\r\n portfolioName: '',\r\n ticker: '',\r\n transaction: PortfolioTransaction.Watch,\r\n date: dateFns.format(new Date(), PORTFOLIO_DATE_FORMAT_DATA),\r\n shares: 0,\r\n price: 0,\r\n}\r\n\r\nconst TRANSACTION_OPTIONS = Object.entries(TRANSACTION_LABEL).map(([value, label]) => ({\r\n value: Number(value),\r\n label,\r\n}))\r\n\r\ntype FormContentProps = {\r\n ticker: string\r\n onSubmit: (portfolioId: number) => void\r\n onClose?: () => void\r\n}\r\n\r\nexport default function FormContent({ ticker, onClose, onSubmit }: FormContentProps) {\r\n const [state, setState] = React.useState({ ...DEFAULT_STATE, ticker })\r\n const [errors, setErrors] = React.useState({})\r\n const [portfolios, setPortfolios] = React.useState([])\r\n const [apiError, setApiError] = React.useState()\r\n const formRef = React.useRef(null)\r\n\r\n // fetch portfolios and stock data on mount\r\n React.useEffect(() => {\r\n const fetchPortfolios = async () => {\r\n const response = await portfoliosRequest()\r\n if (response && response.portfolios.length > 0) {\r\n setState((prev) => ({ ...prev, portfolioId: response.portfolios[0].id }))\r\n setPortfolios(response.portfolios.map((p) => ({ value: p.id, label: p.name })))\r\n }\r\n }\r\n const fetchLastClose = async () => {\r\n const lastClose = await lastCloseRequest(ticker)\r\n if (lastClose) {\r\n setState((prev) => ({ ...prev, price: +lastClose }))\r\n }\r\n }\r\n\r\n try {\r\n fetchPortfolios()\r\n if (!!ticker) {\r\n fetchLastClose()\r\n }\r\n } catch (error) {}\r\n\r\n // this should be run only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleSubmit = async (event: React.FormEvent) => {\r\n event.preventDefault()\r\n\r\n const { isValid, errors } = await validateState(state)\r\n setErrors(errors)\r\n\r\n if (!isValid) {\r\n setTimeout(() => {\r\n formRef.current?.querySelector('.is-error input')?.focus?.()\r\n })\r\n return\r\n }\r\n\r\n const entry = {\r\n ...state,\r\n ...(state.transaction === PortfolioTransaction.Watch && {\r\n date: DEFAULT_STATE.date,\r\n shares: DEFAULT_STATE.shares,\r\n price: DEFAULT_STATE.price,\r\n }),\r\n }\r\n\r\n const result = await submitForm(entry)\r\n if (!result.isSuccess) {\r\n setApiError(result.message)\r\n } else {\r\n onSubmit(state.portfolioId)\r\n }\r\n }\r\n\r\n const commonProps = {\r\n entry: state,\r\n errors,\r\n setState,\r\n setErrors,\r\n isHorizontalLabel: true,\r\n className: 'w-56',\r\n labelClassName: 'flex-row items-center justify-between',\r\n size: 'small' as const,\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n {(errors.portfolioId || apiError) && (\r\n \r\n {apiError ?? 'Portfolio limit exceeded, select another portfolio.'}\r\n \r\n )}\r\n \r\n \r\n \r\n {state.transaction !== PortfolioTransaction.Watch && (\r\n <>\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n {onClose && (\r\n \r\n )}\r\n \r\n \r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogFooter } from '../../../main/components/dialog'\r\nimport { Paragraph } from '../../../main/components/typography'\r\n\r\ntype SuccessContentProps = {\r\n portfolioUrl: string\r\n onClose?: () => void\r\n}\r\n\r\nexport default function SuccessContent({ portfolioUrl, onClose }: SuccessContentProps) {\r\n return (\r\n <>\r\n \r\n
\r\n Successfully saved to portfolio.\r\n Do you wish to proceed to the portfolio?\r\n
\r\n
\r\n \r\n {onClose && }\r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { DialogHeader } from '../../../main/components/dialog'\r\nimport FormContent from './FormContent'\r\nimport SuccessContent from './SuccessContent'\r\nimport { PORTFOLIO_BASE_URL } from './utils'\r\n\r\ntype SaveToPortfolioProps = {\r\n ticker: string\r\n isInlined?: boolean\r\n onClose?: () => void\r\n}\r\n\r\nexport function SaveToPortfolio({ ticker, onClose, isInlined }: SaveToPortfolioProps) {\r\n const [isSubmitted, setIsSubmitted] = React.useState(false)\r\n const [portfolioUrl, setPortfolioUrl] = React.useState(PORTFOLIO_BASE_URL)\r\n\r\n const handleFromSubmitted = (portfolioId: number) => {\r\n if (isInlined) {\r\n // @ts-ignore\r\n window.location = PORTFOLIO_BASE_URL + portfolioId\r\n return\r\n }\r\n\r\n setPortfolioUrl(PORTFOLIO_BASE_URL + portfolioId)\r\n setIsSubmitted(true)\r\n }\r\n\r\n return (\r\n <>\r\n Save to Portfolio\r\n\r\n {isSubmitted ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps {\r\n type: string\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n overlays: string[]\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n width?: number\r\n height?: number\r\n ticker: string\r\n timeframe: string\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n theme?: 'dark' | 'light'\r\n colors?: ReturnType\r\n refreshData?: boolean\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n width = 800,\r\n height = 400,\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n theme,\r\n colors = getCustomColorsFromCookies(),\r\n refreshData = false,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: '1h1v',\r\n width,\r\n height,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n theme,\r\n colors,\r\n charts: [\r\n {\r\n height,\r\n timeframe,\r\n scale: 'linear',\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData,\r\n stretch: true,\r\n panes: [\r\n {\r\n height,\r\n elements: paneElements,\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n try {\r\n return JSON.parse(getParsedCookies('customColors') as string)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n","export function getParsedCookies(cookieName: string) {\r\n const parseCookies = document.cookie\r\n .split(';')\r\n .map((cookieString) => cookieString.split('='))\r\n .reduce(\r\n (acc, v) => {\r\n acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())\r\n return acc\r\n },\r\n {} as Record\r\n )\r\n\r\n return cookieName ? parseCookies[cookieName] : parseCookies\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n var re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n}\r\n\r\nexport function setCookie(name: string, value: string, expires: Date) {\r\n var cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (/\\bfinviz\\b/.test(document.location.hostname)) {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n}\r\n","import { HTMLAttributeReferrerPolicy } from 'react'\r\n\r\nimport { Instrument } from '../../main/types'\r\nimport { cleanTicker } from '../../main/util'\r\nimport { encodeQueryString } from '../queryString'\r\n\r\nconst DEFAULT_OVERLAYS =\r\n '&o[0][ot]=sma&o[0][op]=50&o[0][oc]=FF8F33C6&o[1][ot]=sma&o[1][op]=200&o[1][oc]=DCB3326D&o[2][ot]=patterns&o[2][op]=&o[2][oc]=000'\r\n\r\nexport function getHoverChartUrl(\r\n ticker: string,\r\n escaped: boolean = false,\r\n timeframe = FinvizSettings.hoverCharts?.stock?.timeframe,\r\n dateRange = FinvizSettings.hoverCharts?.stock?.dateRange\r\n): string {\r\n const theme = document.documentElement.classList.contains('dark') ? 'd' : undefined\r\n const overlays = FinvizSettings.hasUserPremium && FinvizSettings.hoverCharts?.stock?.patterns ? DEFAULT_OVERLAYS : ''\r\n const query = encodeQueryString({\r\n cs: 'm',\r\n t: ticker,\r\n tf: timeframe ?? 'd',\r\n ct: 'candle_stick',\r\n r: dateRange,\r\n tm: theme,\r\n })\r\n\r\n let imgUrl = `${FinvizSettings.nodeChartsDomain}/chart.ashx?${query}${overlays}`\r\n\r\n if (escaped) {\r\n // \"Escaping\" [ and ] because of how boxover.js works\r\n imgUrl = imgUrl.replace(/\\[/g, '[[').replace(/]/g, ']]')\r\n }\r\n return imgUrl\r\n}\r\n\r\nfunction timeframeToDeprecatedTimeframe(timeframeString: string) {\r\n switch (timeframeString) {\r\n case 'i1':\r\n case 'i2':\r\n return 'm1'\r\n case 'i3':\r\n return 'm3'\r\n case 'i5':\r\n return 'm5'\r\n case 'i10':\r\n case 'i15':\r\n return 'm15'\r\n case 'i30':\r\n return 'm30'\r\n case 'h':\r\n case 'h2':\r\n case 'h4':\r\n return 'h1'\r\n case 'w':\r\n return 'w1'\r\n case 'm':\r\n return 'mo'\r\n default:\r\n case 'd':\r\n return 'd1'\r\n }\r\n}\r\n\r\nfunction getOldChartsUrl(ticker: string, timeframe: string = 'd1', instrument: Instrument) {\r\n const oldPeriod = timeframeToDeprecatedTimeframe(timeframe)\r\n\r\n switch (instrument) {\r\n case Instrument.Crypto:\r\n case Instrument.Forex:\r\n return `/fx_image.ashx?${cleanTicker(ticker).toLowerCase()}_${oldPeriod}_s.png`\r\n default:\r\n case Instrument.Futures:\r\n return `/fut_image.ashx?${cleanTicker(ticker).toLowerCase()}_${oldPeriod}_s.png`\r\n }\r\n}\r\n\r\nexport function getHoverChartDimensions() {\r\n switch (FinvizSettings.hoverCharts?.stock?.timeframe) {\r\n case 'i3':\r\n case 'i15':\r\n return { width: 584, height: 180 }\r\n case 'i5':\r\n return { width: 376, height: 180 }\r\n case 'd':\r\n if (FinvizSettings.hoverCharts?.stock?.patterns) return { width: 464, height: 230 }\r\n return { width: 324, height: 180 }\r\n default:\r\n return { width: 324, height: 180 }\r\n }\r\n}\r\n\r\nexport function getReferrerPolicy(): HTMLAttributeReferrerPolicy {\r\n return 'no-referrer-when-downgrade'\r\n}\r\n\r\nexport function getHoverChartImg(\r\n ticker: string,\r\n escaped: boolean = false,\r\n timeframe = FinvizSettings.hoverCharts?.stock?.timeframe,\r\n dateRange?: string,\r\n instrument: Instrument = Instrument.Stock\r\n) {\r\n const useOldCharts = !FinvizSettings.hasForexFuturesCryptoNodeCharts && instrument !== Instrument.Stock\r\n const chartSize = useOldCharts ? { width: 320, height: 180 } : getHoverChartDimensions()\r\n const referrerPolicy = getReferrerPolicy()\r\n const url = useOldCharts\r\n ? getOldChartsUrl(ticker, timeframe, instrument)\r\n : getHoverChartUrl(ticker, escaped, timeframe, dateRange)\r\n const srcSet = useOldCharts ? '' : getSrcSet(url)\r\n const srcsetString = srcSet?.length ? ` srcset='${srcSet}'` : ''\r\n\r\n return {\r\n img: ``,\r\n ...chartSize,\r\n }\r\n}\r\n\r\nexport function getSrcSet(url: string) {\r\n // You must keep a space after , for refresh to work\r\n return FinvizSettings.hasUserRetinaNodeCharts ? `${url} 1x, ${url}&sf=2 2x` : undefined\r\n}\r\n","const matchesAndroid = navigator.userAgent.match(/Android/i)\r\nconst matchesWebOS = navigator.userAgent.match(/webOS/i)\r\nconst matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\nconst matchesiPad = navigator.userAgent.match(/iPad/i)\r\nconst matchesIPod = navigator.userAgent.match(/iPod/i)\r\nconst matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\r\nconst matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\r\nconst matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\nconst isMobileDevice =\r\n matchesAndroid ||\r\n matchesWebOS ||\r\n matchesIPhone ||\r\n matchesiPad ||\r\n matchesIPod ||\r\n matchesBlackBerry ||\r\n matchesWindowsPhone ||\r\n matchesIOSLike\r\n\r\nexport function isMobile() {\r\n return !!isMobileDevice\r\n}\r\n\r\nexport function isIphone() {\r\n return !!(matchesIPhone && !matchesiPad)\r\n}\r\n\r\nexport function isIpad() {\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesiPad\r\n}\r\n\r\nexport function isSafariDesktop() {\r\n return /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && navigator.maxTouchPoints === 0\r\n}\r\n\r\nexport function isIos() {\r\n return matchesIOSLike && !isSafariDesktop()\r\n}\r\n","function getSanitizedSingleTicker(rawTicker: string) {\r\n return rawTicker\r\n .replace(/\\.+/gi, '-')\r\n .split('-')\r\n .map((x) => x.replace(/([^a-z0-9@-])+/gi, ''))\r\n .filter((x) => !!x)\r\n .join('-')\r\n .toUpperCase()\r\n}\r\n\r\nexport function getSanitizedTicker(rawTicker: string, isMulti = false) {\r\n if (isMulti) {\r\n return rawTicker\r\n .replace(/ /g, ',')\r\n .split(',')\r\n .map(getSanitizedSingleTicker)\r\n .filter((x) => !!x)\r\n .join(',')\r\n }\r\n\r\n return getSanitizedSingleTicker(rawTicker)\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","import { decodeQueryString, encodeQueryString } from '../queryString'\r\nimport { getCookie, setCookie } from './cookie'\r\n\r\nexport const formatDateToStringUS = (date: Date) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })\r\n\r\nconst DRAWING_QUOTE_PAGE_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabledOnQuotePage() {\r\n return getCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport async function setIsDrawingEnabledOnQuotePage(isEnabled: boolean) {\r\n return fetch('/api/set_cookie.ashx?cookie=' + DRAWING_QUOTE_PAGE_COOKIE_NAME + '&value=' + (isEnabled ? 'on' : 'off'))\r\n .catch(() => {})\r\n .then((res) => {\r\n if (!res?.ok) {\r\n // fallback to JS otherwise draw toggle won't work if API don't work\r\n setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled)\r\n }\r\n\r\n const { i: idea, ...rest } = decodeQueryString()\r\n if (idea) {\r\n document.location = `quote.ashx?${encodeQueryString(rest)}`\r\n } else {\r\n document.location.reload()\r\n }\r\n })\r\n}\r\n\r\nfunction setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n setCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME, isEnabled ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function parseInitData(elementId: string): T | undefined {\r\n try {\r\n const initDataElement = document.getElementById(elementId)!\r\n return JSON.parse(initDataElement.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return\r\n }\r\n}\r\n\r\nexport function getSidebarFromCookie() {\r\n const chartsUrl = getCookie('chartsUrl')\r\n const decodedCookie = chartsUrl ? decodeQueryString<{ sidebar?: string }>(chartsUrl) : null\r\n return decodedCookie?.sidebar || undefined\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\ninterface RedGreenTextProps {\r\n value?: number | null\r\n children: any\r\n rightContent?: React.ReactNode\r\n className?: string\r\n rightClass?: string\r\n}\r\n\r\n/**\r\n * Component which renders red/green text based on whether the value is positive or negative if value\r\n * is 0, it will not be colored and it will not display the guide triangle\r\n */\r\nexport function RedGreenText({ value, children, className, rightContent, rightClass }: RedGreenTextProps) {\r\n const hasValue = value && Number.isFinite(value)\r\n\r\n return (\r\n 0,\r\n 'text-red-500 dark:text-red-400': hasValue && value < 0,\r\n })}\r\n >\r\n {children}\r\n \r\n {rightContent === undefined && hasValue && value !== 0 ? (\r\n 0 ? 'arrowUpShort' : 'arrowDownShort'} className=\"block\" />\r\n ) : null}\r\n {rightContent}\r\n \r\n \r\n )\r\n}\r\n\r\n/**\r\n * Used to position multiple lines of RedGreen text, this component will make sure all numbers are\r\n * in line with their `rightContent`\r\n */\r\nexport function RedGreenMultiline({ className, children, ...props }: React.PropsWithChildren) {\r\n return (\r\n
\r\n {React.Children.map(children, (child: React.ReactElement) => {\r\n if (React.isValidElement(child) && child.type === RedGreenText) {\r\n return React.cloneElement(child, {\r\n className: classnames(child.props.className, 'table-row'),\r\n rightClass: 'table-cell align-middle',\r\n })\r\n }\r\n\r\n return child\r\n })}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport const Table = React.forwardRef(\r\n (props: React.PropsWithChildren>, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableHead(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n\r\ninterface TableBodyProps extends React.HTMLProps {\r\n spacing?: 'regular' | 'large' | 'none'\r\n}\r\n\r\nexport const TableBody = React.forwardRef(\r\n (\r\n { spacing = 'none', ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n ) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableFooter(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","export enum TableAlign {\r\n Left,\r\n Center,\r\n Right,\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign } from './types'\r\n\r\nexport interface TableCellProps extends React.HTMLProps {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n}\r\n\r\nexport function TableCell({\r\n isFirst,\r\n isLast,\r\n align = TableAlign.Left,\r\n hasPadding = true,\r\n className,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { TableAlign } from './types'\r\n\r\nconst TABLE_HEADER_DEFAULT_ELEMENT = 'th'\r\n\r\ninterface SortProps {\r\n isActive: boolean\r\n direction: 1 | -1\r\n}\r\n\r\nfunction TableSortIndicator({ isActive, direction, className }: Partial & { className?: string }) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ninterface TableHeaderProps extends Omit, 'as'> {\r\n isActive?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n hasHover?: boolean\r\n}\r\n\r\nexport function TableHeader({\r\n as: asComponent,\r\n align,\r\n children,\r\n isActive,\r\n hasPadding = true,\r\n hasHover,\r\n ...props\r\n}: Omit, 'align'> & TableHeaderProps) {\r\n const componentToRender = asComponent ?? TABLE_HEADER_DEFAULT_ELEMENT\r\n\r\n return React.createElement(\r\n componentToRender,\r\n {\r\n ...props,\r\n className: classnames(\r\n props.className,\r\n 'whitespace-nowrap font-normal h-5.5 hover:first:rounded-l-md hover:last:rounded-r-md',\r\n {\r\n 'cursor-pointer hover:select-none hover:bg-gray-100 dark:hover:bg-gray-700': hasHover && !props.disabled,\r\n 'text-gray-500 dark:text-gray-300': props.disabled,\r\n 'text-gray-600 dark:text-gray-200': !isActive && !props.disabled,\r\n 'font-medium text-gray-800 dark:text-gray-50': isActive,\r\n 'text-left': align === TableAlign.Left,\r\n 'text-center': align === TableAlign.Center,\r\n 'text-right': align === TableAlign.Right,\r\n 'px-1': hasPadding,\r\n 'p-0': !hasPadding,\r\n }\r\n ),\r\n },\r\n children\r\n )\r\n}\r\n\r\nexport function TableHeaderSortable({\r\n direction,\r\n ...props\r\n}: Omit, 'align'> & Partial & TableHeaderProps) {\r\n const isDisabled = props.disabled === true\r\n\r\n return (\r\n \r\n \r\n {props.align === TableAlign.Right && (\r\n \r\n )}\r\n {props.children}\r\n {props.align !== TableAlign.Right && (\r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface TableRowProps extends React.PropsWithChildren> {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n isHoverable?: boolean\r\n}\r\n\r\nexport const TableRow = React.forwardRef(\r\n ({ isFirst, isLast, isHoverable = true, ...props }: TableRowProps, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape, isSortByShape, useSortData } from '../../hooks/use-sort-data'\r\nimport { SortableValue } from '../../types'\r\n\r\nexport enum SortDirection {\r\n Ascending = 1,\r\n Descending = -1,\r\n}\r\n\r\nexport interface TableSort {\r\n column: ColumnType\r\n direction: SortDirection\r\n}\r\n\r\n/**\r\n * Default sort getter which either gets column matching by `defaultSortId` or returns the first column\r\n */\r\nexport function getDefaultSort(\r\n columns: ColumnType[],\r\n defaultSort?: DefaultSort\r\n): TableSort {\r\n if (defaultSort && typeof defaultSort === 'object') return defaultSort as unknown as TableSort\r\n\r\n const foundColumn = columns.find((column) => isSortByShape(column) && column.id === defaultSort)\r\n\r\n return {\r\n column: foundColumn ?? (defaultSort as unknown as ColumnType | undefined) ?? columns[0],\r\n direction: SortDirection.Ascending,\r\n }\r\n}\r\n\r\n/**\r\n * Get default sorting from url when persisting sort\r\n */\r\nexport function getDefaultSortFromUrl>(\r\n columns: ColumnType[],\r\n order?: string | null,\r\n idKey: keyof ColumnType = 'id'\r\n) {\r\n const isDesc = order?.startsWith('-')\r\n const queryParam = isDesc ? order?.substring(1) : order\r\n const column = columns.find((column) => column[idKey] === queryParam)\r\n\r\n if (column) {\r\n return { column, direction: isDesc ? SortDirection.Descending : SortDirection.Ascending }\r\n } else {\r\n return { column: columns[0], direction: SortDirection.Ascending }\r\n }\r\n}\r\n\r\nexport function saveSortToUrl>(\r\n prev: URLSearchParams,\r\n urlPersistKey: string,\r\n newSort: ColumnType,\r\n idKey: keyof ColumnType = 'id',\r\n defaultSort: unknown = null\r\n) {\r\n const newParams = new URLSearchParams(prev)\r\n const previousOrder = newParams.get(urlPersistKey) ?? defaultSort\r\n const isDescOrder = previousOrder?.toString().startsWith('-')\r\n newParams.set(urlPersistKey, `${!isDescOrder && previousOrder === newSort[idKey] ? '-' : ''}${newSort[idKey]}`)\r\n\r\n return newParams\r\n}\r\n\r\nexport function useTableSort<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort,\r\n>({\r\n data,\r\n columns,\r\n defaultSort,\r\n valueGetter,\r\n urlPersistKey,\r\n idKey = 'id',\r\n}: {\r\n data: DataType[]\r\n columns: ColumnType[]\r\n\r\n /**\r\n * When set, the sorting will be persisted in the URL. Loading the\r\n *\r\n * @default undefined\r\n */\r\n urlPersistKey?: string\r\n\r\n /**\r\n * Key to get value of the URL sort from a column\r\n * @deafult \"id\"\r\n */\r\n idKey?: keyof ColumnType\r\n\r\n /**\r\n * You can either provide id of the column or whole shape\r\n * defaultSort: { column: columns[0], direction: -1 }\r\n * If your ids are constants (or enums), you will get name suggestions\r\n */\r\n defaultSort?: DefaultSort\r\n\r\n /**\r\n * Custom value getter. By default these can be defined on every column using `getValueForSort`\r\n */\r\n valueGetter?: (column: ColumnType) => (row: DataType) => SortableValue\r\n}) {\r\n const [searchParams, setSearchParams] = useSearchParams()\r\n const defaultSortRef = React.useRef(\r\n urlPersistKey && typeof defaultSort === 'string'\r\n ? getDefaultSortFromUrl(columns, searchParams.get(urlPersistKey) ?? defaultSort, idKey)\r\n : getDefaultSort(columns, defaultSort)\r\n )\r\n const [sort, setSort] = React.useState(defaultSortRef.current)\r\n\r\n const changeSort = React.useCallback(\r\n (newSort: ColumnType) => {\r\n if (urlPersistKey) {\r\n setSearchParams(\r\n (prev) => saveSortToUrl(prev, urlPersistKey, newSort, idKey, defaultSortRef.current.column[idKey]),\r\n { preventScrollReset: true }\r\n )\r\n }\r\n\r\n setSort((prevSort) => {\r\n if (prevSort.column.id === newSort.id) {\r\n return { ...prevSort, direction: prevSort.direction * -1 } as TableSort\r\n }\r\n\r\n return { column: newSort, direction: SortDirection.Ascending }\r\n })\r\n },\r\n [idKey, setSearchParams, urlPersistKey]\r\n )\r\n\r\n /**\r\n * Update sort from url\r\n */\r\n React.useEffect(() => {\r\n if (!urlPersistKey) return\r\n\r\n const newSort = searchParams.get(urlPersistKey)\r\n if (newSort) {\r\n const sort = getDefaultSortFromUrl(columns, newSort, idKey)\r\n setSort(sort)\r\n }\r\n }, [columns, idKey, searchParams, urlPersistKey])\r\n\r\n const sortedData = useSortData({ data, direction: sort.direction, sortBy: sort.column, valueGetter })\r\n\r\n return {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport enum BoxRounding {\r\n none = '',\r\n regular = 'rounded-md', // 6px\r\n}\r\n\r\nexport enum BoxTheme {\r\n none = '',\r\n light = 'bg-white dark:bg-gray-800 border border-gray-100 dark:border-gray-600',\r\n dark = 'bg-gray-800 border border-gray-600',\r\n}\r\n\r\nexport interface BoxProps extends Omit, 'ref'> {\r\n rounding?: keyof typeof BoxRounding\r\n theme?: keyof typeof BoxTheme\r\n}\r\n\r\nexport const Box = React.forwardRef(function Box(\r\n { rounding = 'regular', theme = 'light', ...props }: BoxProps,\r\n ref: React.ForwardedRef\r\n) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n})\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonRounding, ButtonRoundingType } from '../button'\r\n\r\nexport enum GroupTheme {\r\n light,\r\n dark,\r\n}\r\n\r\nexport interface ButtonGroupProps {\r\n children: React.ReactNode\r\n\r\n /**\r\n * Border radius of entire group wrapper\r\n *\r\n * @default \"regular\"\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n className?: string\r\n\r\n /**\r\n * If a pipe divider between buttons should be rendered\r\n *\r\n * @default true\r\n */\r\n hasDivider?: boolean\r\n\r\n /**\r\n * If group wrapper has a border\r\n *\r\n * @default true\r\n */\r\n hasBorder?: boolean\r\n\r\n /**\r\n * Group color theme\r\n *\r\n * @default \"light\"\r\n */\r\n theme?: keyof typeof GroupTheme\r\n\r\n /**\r\n * Custom button component which extends Button\r\n *\r\n * @default undefined\r\n */\r\n childComponent?: string | React.JSXElementConstructor\r\n}\r\n\r\nfunction getGroupTheme(theme: GroupTheme) {\r\n switch (theme) {\r\n case GroupTheme.dark:\r\n return {\r\n wrapper: 'bg-gray-800 border-gray-600',\r\n divider: 'bg-gray-600',\r\n }\r\n default:\r\n return {\r\n wrapper: 'bg-white dark:bg-gray-800 border-gray-100 dark:border-gray-600',\r\n divider: 'bg-gray-100 dark:bg-gray-600',\r\n }\r\n }\r\n}\r\n\r\nexport function ButtonGroup({\r\n className,\r\n children,\r\n theme = 'light',\r\n hasDivider = true,\r\n hasBorder = true,\r\n rounding = 'regular',\r\n childComponent,\r\n}: ButtonGroupProps) {\r\n const buttonRounding = ButtonRounding[rounding]\r\n const groupTheme = React.useMemo(() => getGroupTheme(GroupTheme[theme]), [theme])\r\n return (\r\n \r\n {React.Children.map(children, (child, index) => {\r\n if (!React.isValidElement(child) || ![Button, childComponent].filter(Boolean).includes(child.type)) {\r\n return child\r\n }\r\n\r\n return (\r\n \r\n {hasDivider && index > 0 &&
}\r\n {React.cloneElement(child as React.ReactElement>, {\r\n rounding: child.props.rounding ?? 'none',\r\n theme: child.props.theme ?? (GroupTheme[theme] === GroupTheme.dark ? 'menuItemDark' : 'menuItem'),\r\n })}\r\n \r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { PropsWithAs } from './types'\r\n\r\nexport const BUTTON_DEFAULT_ELEMENT = 'button'\r\n\r\nexport const BUTTON_BASE_CLASS =\r\n 'flex shrink-0 items-center justify-center font-medium whitespace-nowrap focus:outline-none'\r\nexport const BUTTON_SQUARE_BASE_CLASS = 'shrink-0 justify-center'\r\nexport const BUTTON_FOCUS_STYLES = 'focus-visible:ring-2 ring-gray-200 dark:ring-gray-500'\r\n\r\nexport enum ButtonSize {\r\n none = '', // Do not set fixed dimensions\r\n small = 'text-2xs h-6 min-w-6', // 24px height\r\n regular = 'text-2xs h-7 min-w-7', // 28px height\r\n medium = 'text-sm h-8 min-w-8', // 32px height\r\n large = 'text-sm h-9 min-w-9', // 36px height\r\n}\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum ButtonPadding {\r\n none = '',\r\n small = 'px-1.5', // 6px padding\r\n regular = 'px-2', // 8px padding\r\n medium = 'px-2.5', // 10px padding\r\n large = 'px-3', // 12px padding\r\n}\r\n\r\nexport enum ButtonAlign {\r\n none = '',\r\n left = 'text-left',\r\n center = 'text-center',\r\n right = 'text-right',\r\n}\r\n\r\nexport type ButtonSizeType = keyof typeof ButtonSize\r\n\r\nexport enum ButtonSquareSize {\r\n none = '', // Do not set fixed dimensions\r\n small = 'h-6 w-6', // 24x24px\r\n regular = 'h-7 w-7', // 28x28px\r\n medium = 'h-8 w-8', // 32x32px\r\n large = 'h-9 w-9', // 36x36px\r\n}\r\n\r\nexport enum ButtonRounding {\r\n none = '',\r\n small = 'rounded', // 4px\r\n regular = 'rounded-md', // 6px\r\n full = 'rounded-full', // 9999px\r\n}\r\n\r\nexport type ButtonRoundingType = keyof typeof ButtonRounding\r\n\r\nexport enum ButtonTheme {\r\n transparent, // Only basic shape is rendered\r\n light,\r\n dark,\r\n blue,\r\n violet,\r\n blueHover,\r\n red,\r\n headerItem,\r\n menuItem,\r\n menuItemDark,\r\n opacity,\r\n outline,\r\n chipTransparent,\r\n chip,\r\n}\r\n\r\nexport type ButtonThemeType = keyof typeof ButtonTheme\r\n\r\n/**\r\n * Get button theme\r\n */\r\nexport function getButtonTheme(theme: ButtonTheme, active = false) {\r\n switch (theme) {\r\n case ButtonTheme.light: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-gray-200 disabled:bg-gray-50 disabled:text-gray-400 disabled:hover:bg-gray-50 disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500 dark:disabled:bg-gray-700 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-700 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-gray-50 hover:bg-gray-100 dark:bg-gray-700 dark:hover:bg-gray-600': !active,\r\n 'bg-gray-200 dark:bg-gray-500': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.dark: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-gray-50 active:bg-gray-500 disabled:bg-gray-700 disabled:text-gray-300 disabled:hover:bg-gray-700 disabled:hover:text-gray-300',\r\n {\r\n 'bg-gray-700 hover:bg-gray-600': !active,\r\n 'bg-gray-500': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blue: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white hover:text-white active:bg-blue-600 disabled:bg-blue-200 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-blue-400 hover:bg-blue-500': !active,\r\n 'bg-blue-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.violet: {\r\n return {\r\n button: classnames(\r\n 'text-white hover:text-white disabled:bg-violet-200 dark:disabled:text-gray-300 disabled:hover:bg-violet-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-violet-400 hover:bg-violet-500': !active,\r\n 'bg-violet-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blueHover: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-blue-600 disabled:bg-blue-200 disabled:text-gray-400 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 disabled:hover:text-gray-400 dark:disabled:hover:text-gray-300',\r\n {\r\n 'text-blue-600 hover:bg-blue-400 hover:text-white dark:text-blue-500 dark:hover:text-white': !active,\r\n 'bg-blue-400 text-white': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.red: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white active:bg-red-600 disabled:bg-red-200 disabled:text-gray-300 disabled:hover:bg-red-200 disabled:hover:text-gray-300',\r\n {\r\n 'bg-red-400 hover:bg-red-500': !active,\r\n 'bg-red-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.headerItem: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent bg-gray-800 text-gray-300 hover:bg-gray-900 hover:text-white disabled:hover:text-gray-300 disabled:bg-gray-700 disabled:hover:bg-gray-700' // Base\r\n ),\r\n icon: 'text-white',\r\n }\r\n }\r\n case ButtonTheme.menuItem: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent dark:disabled:hover:bg-transparent disabled:hover:bg-transparent',\r\n {\r\n 'hover:bg-gray-50 disabled:text-gray-400 disabled:hover:text-gray-400 dark:hover:bg-gray-700': !active,\r\n 'bg-gray-50 dark:bg-gray-700': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.menuItemDark: {\r\n return {\r\n button: classnames('border border-transparent text-white dark:disabled:hover:bg-transparent', {\r\n 'hover:bg-gray-700': !active,\r\n 'bg-gray-700': active,\r\n }),\r\n }\r\n }\r\n case ButtonTheme.opacity:\r\n return {\r\n button: classnames(\r\n 'border border-transparent disabled:opacity-50 disabled:hover:opacity-50 dark:text-gray-400',\r\n {\r\n 'opacity-70 hover:opacity-100': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.outline:\r\n return {\r\n button: classnames(\r\n // Base styles\r\n 'border border-gray-100 active:border-blue-400 disabled:border-gray-100 disabled:bg-gray-50 disabled:text-gray-500 disabled:hover:border-gray-100 disabled:hover:bg-gray-50 disabled:hover:text-gray-500',\r\n // Dark styles\r\n 'dark:border-gray-600 dark:bg-gray-800 dark:text-gray-50 dark:active:border-blue-400 dark:disabled:border-transparent dark:disabled:bg-gray-700 dark:disabled:text-gray-400 dark:disabled:hover:border-transparent dark:disabled:hover:bg-gray-700 dark:disabled:hover:text-gray-400',\r\n {\r\n 'border-blue-400 dark:border-blue-400': active,\r\n 'hover:border-gray-300 dark:hover:border-gray-400': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.chip:\r\n return {\r\n button: classnames('border dark:disabled:hover:bg-gray-700 disabled:hover:bg-gray-50', {\r\n 'border-transparent bg-gray-50 hover:bg-gray-100 dark:bg-gray-700 dark:hover:bg-gray-600': !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:border-blue-400 dark:bg-gray-700 dark:text-white': active,\r\n }),\r\n }\r\n case ButtonTheme.chipTransparent:\r\n return {\r\n button: classnames(\r\n 'border dark:disabled:hover:bg-transparent disabled:hover:bg-transparent dark:disabled:hover:text-gray-400 disabled:hover:text-gray-500', // Base styles\r\n {\r\n 'border-transparent text-gray-500 hover:bg-gray-100 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200':\r\n !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n default:\r\n return {}\r\n }\r\n}\r\n\r\n/**\r\n * Export Button html props type so we don’t always have to omit\r\n */\r\nexport type ButtonHTMLProps = Omit, 'ref' | 'type' | 'size' | 'content' | 'align'>\r\n\r\nexport interface ButtonProps {\r\n /**\r\n * Visual appearance of the button\r\n */\r\n theme?: ButtonThemeType\r\n\r\n /**\r\n * Sets if button is square or normal.\r\n *\r\n * @default 'regular'\r\n */\r\n appearance?: 'regular' | 'square'\r\n\r\n /**\r\n * Size of the button\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: ButtonSizeType\r\n\r\n /**\r\n * Override align of the text for a button\r\n *\r\n * @default center, left when `leftContent` or `rightContent` are defined\r\n */\r\n align?: keyof typeof ButtonAlign\r\n\r\n /**\r\n * Override button padding\r\n *\r\n * @default undefined\r\n */\r\n padding?: keyof typeof ButtonPadding\r\n\r\n /**\r\n * Render button in an active state (darker background, etc.)\r\n */\r\n active?: boolean\r\n\r\n /**\r\n * Sets if the button has focus ring\r\n *\r\n * @default true\r\n */\r\n focusRing?: boolean\r\n\r\n /**\r\n * Sets rounded corners for the button\r\n *\r\n * @default regular\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n /**\r\n * Class for the content wrapper\r\n */\r\n contentClass?: string\r\n\r\n /**\r\n * Name of left icon\r\n */\r\n leftContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Name of right icon\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n}\r\n\r\nexport type ButtonComponentProps =\r\n PropsWithAs & ButtonProps\r\n\r\nfunction ButtonComponent(\r\n {\r\n as: asComponent,\r\n theme = 'light',\r\n size = 'regular',\r\n rounding = 'regular',\r\n focusRing = true,\r\n appearance = 'regular',\r\n align,\r\n padding = size, // same as size\r\n active,\r\n contentClass,\r\n leftContent,\r\n rightContent,\r\n className,\r\n children,\r\n ...props\r\n }: ButtonComponentProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const isSquare = appearance === 'square'\r\n const buttonTheme = React.useMemo(() => getButtonTheme(ButtonTheme[theme], active), [theme, active])\r\n const buttonPadding = React.useMemo(() => (isSquare ? null : ButtonPadding[padding]), [isSquare, padding])\r\n const buttonSize = isSquare ? ButtonSquareSize[size] : ButtonSize[size]\r\n const buttonRounding = ButtonRounding[rounding]\r\n const hasIcons = leftContent || rightContent\r\n\r\n return React.createElement(\r\n asComponent ?? BUTTON_DEFAULT_ELEMENT,\r\n {\r\n ...props,\r\n ref,\r\n className: classnames(\r\n BUTTON_BASE_CLASS,\r\n buttonTheme.button,\r\n buttonPadding,\r\n buttonSize,\r\n buttonRounding,\r\n {\r\n [BUTTON_SQUARE_BASE_CLASS]: isSquare,\r\n [BUTTON_FOCUS_STYLES]: focusRing,\r\n },\r\n className\r\n ),\r\n },\r\n <>\r\n {leftContent && (\r\n
\r\n {isValidIconName(leftContent) ? : leftContent}\r\n
\r\n )}\r\n {children && !isSquare ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n children\r\n )}\r\n {rightContent && (\r\n
\r\n {isValidIconName(rightContent) ? : rightContent}\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const Button = React.forwardRef(ButtonComponent) as <\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & ButtonProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef } from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\ninterface CheckboxProps extends Omit, 'label'> {\r\n /**\r\n * Text that gets displayed on the right side of the checkbox\r\n */\r\n label?: ReactNode\r\n\r\n checked: boolean\r\n isSmall?: boolean\r\n}\r\n\r\nfunction CheckboxComponent(\r\n { className, label, isSmall, children, ...props }: PropsWithChildren,\r\n ref: ForwardedRef\r\n) {\r\n const checked = props.checked ?? props.defaultChecked\r\n\r\n return (\r\n \r\n
\r\n \r\n {checked && }\r\n
\r\n {label ?? children}\r\n \r\n )\r\n}\r\n\r\nexport const Checkbox = forwardRef(CheckboxComponent)\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren, memo, useCallback, useLayoutEffect, useRef, useState } from 'react'\r\n\r\nexport interface Interaction {\r\n left: number\r\n top: number\r\n}\r\n\r\n/**\r\n * Clamp value between two bounds\r\n */\r\nfunction clamp(num: number, min = 0, max = 1) {\r\n return num > max ? max : num < min ? min : num\r\n}\r\n\r\n/**\r\n * Check if an event was triggered by touch\r\n */\r\nfunction isTouch(event: MouseEvent | TouchEvent): event is TouchEvent {\r\n return 'touches' in event\r\n}\r\n\r\n/**\r\n * Returns a relative position of the pointer inside the node's bounding box\r\n */\r\nfunction getRelativePosition(node: HTMLDivElement, event: MouseEvent | TouchEvent): Interaction {\r\n const rect = node.getBoundingClientRect()\r\n\r\n // Get user's pointer position from `touches` array if it's a `TouchEvent`\r\n const pointer = isTouch(event) ? event.touches[0] : (event as MouseEvent)\r\n\r\n return {\r\n left: clamp((pointer.pageX - (rect.left + window.pageXOffset)) / rect.width),\r\n top: clamp((pointer.pageY - (rect.top + window.pageYOffset)) / rect.height),\r\n }\r\n}\r\n\r\n/**\r\n * Browsers introduced an intervention, making touch events passive by default.\r\n * This workaround removes `preventDefault` call from the touch handlers.\r\n * @see https://github.com/facebook/react/issues/19651\r\n */\r\nfunction preventDefaultMove(event: MouseEvent | TouchEvent) {\r\n !isTouch(event) && event.preventDefault()\r\n}\r\n\r\ninterface Props {\r\n onMove: (interaction: Interaction) => void\r\n onKey: (offset: Interaction) => void\r\n}\r\n\r\nfunction DraggablePickerComponent({\r\n onMove,\r\n onKey,\r\n className,\r\n ...props\r\n}: PropsWithChildren & HTMLProps) {\r\n const container = useRef(null)\r\n const hasTouched = useRef(false)\r\n const [isDragging, setDragging] = useState(false)\r\n\r\n /**\r\n * Prevent mobile browsers from handling mouse events (conflicting with touch ones).\r\n * If we detected a touch interaction before, we prefer reacting to touch events only.\r\n */\r\n const isValid = useRef((event: MouseEvent | TouchEvent): boolean => {\r\n if (hasTouched.current && !isTouch(event)) return false\r\n if (!hasTouched.current) hasTouched.current = isTouch(event)\r\n return true\r\n })\r\n\r\n const handleMove = useCallback(\r\n (event: MouseEvent | TouchEvent) => {\r\n preventDefaultMove(event)\r\n\r\n // If user moves the pointer outside of the window or iframe bounds and release it there,\r\n // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor\r\n // after the user has moved the mouse/finger back to the document, we check `event.buttons`\r\n // and `event.touches`. It allows us to detect that the user is just moving his pointer\r\n // without pressing it down\r\n const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0\r\n\r\n if (isDown && container.current) {\r\n onMove(getRelativePosition(container.current, event))\r\n } else {\r\n setDragging(false)\r\n }\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleMoveStart = useCallback(\r\n ({ nativeEvent }: React.MouseEvent | React.TouchEvent) => {\r\n preventDefaultMove(nativeEvent)\r\n\r\n if (!isValid.current(nativeEvent)) return\r\n\r\n // The node/ref must actually exist when user start an interaction.\r\n // We won't suppress the ESLint warning though, as it should probably be something to be aware of.\r\n onMove(getRelativePosition(container.current!, nativeEvent))\r\n setDragging(true)\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n const keyCode = event.which || event.keyCode\r\n\r\n // Ignore all keys except arrow ones\r\n if (keyCode < 37 || keyCode > 40) return\r\n // Do not scroll page by arrow keys when document is focused on the element\r\n event.preventDefault()\r\n // Send relative offset to the parent component.\r\n // We use codes (37←, 38↑, 39→, 40↓) instead of keys ('ArrowRight', 'ArrowDown', etc)\r\n // to reduce the size of the library\r\n onKey({\r\n left: keyCode === 39 ? 0.05 : keyCode === 37 ? -0.05 : 0,\r\n top: keyCode === 40 ? 0.05 : keyCode === 38 ? -0.05 : 0,\r\n })\r\n },\r\n [onKey]\r\n )\r\n\r\n const handleMoveEnd = useCallback(() => setDragging(false), [])\r\n\r\n const toggleDocumentEvents = useCallback(\r\n (state) => {\r\n // add or remove additional pointer event listeners\r\n const toggleEvent = state ? window.addEventListener : window.removeEventListener\r\n toggleEvent(hasTouched.current ? 'touchmove' : 'mousemove', handleMove)\r\n toggleEvent(hasTouched.current ? 'touchend' : 'mouseup', handleMoveEnd)\r\n },\r\n [handleMove, handleMoveEnd]\r\n )\r\n\r\n useLayoutEffect(() => {\r\n toggleDocumentEvents(isDragging)\r\n return () => {\r\n isDragging && toggleDocumentEvents(false)\r\n }\r\n }, [isDragging, toggleDocumentEvents])\r\n\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport const DraggablePicker = memo(DraggablePickerComponent)\r\n","interface PointerProps {\r\n className?: string\r\n top?: number\r\n left: number\r\n color: string\r\n}\r\n\r\nexport function Pointer({ color, left, top = 0.5 }: PointerProps) {\r\n return (\r\n \r\n
\r\n
\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `app/utils/colors.ts` in charts repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string) {\r\n const isRgb = getIsRgb(strColor)\r\n\r\n if (isRgb) {\r\n return rgbaToHexString(rgbaStringToObject(strColor), true)\r\n }\r\n\r\n return strColor\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Alpha({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, a: 1 - pos.left }), [onChange, color])\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ ...color, a: 1 })\r\n const gradientTo = hsvaToHEXString({ ...color, a: 0 }, true)\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n // Don’t recalculate when alpha changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [color.h, color.s, color.v])\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { Icon } from '../icon'\r\nimport { HSVA, hexStringToHSVA } from './util'\r\n\r\nconst DEFAULT_COLORS = [\r\n { title: 'Rose', value: '#f43f5e' },\r\n { title: 'Pink', value: '#db2777' },\r\n { title: 'Fuchsia', value: '#c026d3' },\r\n { title: 'Purple', value: '#9333ea' },\r\n { title: 'Violet', value: '#7c3aed' },\r\n { title: 'Indigo', value: '#4f46e5' },\r\n { title: 'Blue', value: '#2563eb' },\r\n { title: 'Light Blue', value: '#0284c7' },\r\n { title: 'Cyan', value: '#0891b2' },\r\n { title: 'Teal', value: '#0d9488' },\r\n { title: 'Emerald', value: '#059669' },\r\n { title: 'Green', value: '#16a34a' },\r\n { title: 'Lime', value: '#65a30d' },\r\n { title: 'Yellow', value: '#eab308' },\r\n { title: 'Amber', value: '#d97706' },\r\n { title: 'Red', value: '#dc2626' },\r\n]\r\n\r\ninterface ColorItem {\r\n /**\r\n * Name of the color\r\n */\r\n title: string\r\n\r\n /**\r\n * Hex value\r\n */\r\n value: string\r\n}\r\n\r\ninterface ColorPaletteProps {\r\n /**\r\n * Current selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * List of colors to display in the palette\r\n *\r\n * @default DEFAULT_COLORS\r\n */\r\n colors?: ColorItem[]\r\n\r\n /**\r\n * Callback when user picks a color\r\n */\r\n onChange: (color: string, originalColor: HSVA) => void\r\n}\r\n\r\nexport function ColorPalette({ color, colors = DEFAULT_COLORS, onChange }: ColorPaletteProps) {\r\n const lowerCaseColor = color.toLowerCase()\r\n\r\n return (\r\n
\r\n {colors.map((colorObj) => {\r\n const isSelected = lowerCaseColor.startsWith(colorObj.value)\r\n return (\r\n onChange(colorObj.value, hexStringToHSVA(colorObj.value))}\r\n >\r\n {isSelected && }\r\n
\r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface HueSaturationProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nfunction getPositionFromHSLA(color: HSVA) {\r\n return {\r\n left: color.h / 360,\r\n top: 1 - color.s,\r\n }\r\n}\r\n\r\nexport function HueSaturation({ color, onChange }: HueSaturationProps) {\r\n const position = useMemo(() => getPositionFromHSLA(color), [color])\r\n\r\n const colorPreview = useMemo(() => hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 }), [color.h, color.s])\r\n\r\n const changeSaturation = useCallback(\r\n (pos: Interaction) =>\r\n onChange({\r\n h: Math.round(pos.left * 360),\r\n s: 1 - pos.top,\r\n v: 1,\r\n a: color.a,\r\n }),\r\n [color.a, onChange]\r\n )\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Lightness({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, v: 1 - pos.left }), [onChange, color])\r\n\r\n const colorPreview = useMemo(\r\n () => hsvaToHEXString({ h: color.h, s: color.s, v: color.v, a: 1 }),\r\n [color.h, color.s, color.v]\r\n )\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 })\r\n const gradientTo = hsvaToHEXString({ h: color.h, s: color.s, v: 0, a: 1 })\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n }, [color.h, color.s])\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { getIsColorTooLightOrTransparent, hexStringToRGBA } from './util'\r\n\r\ninterface ColorPreviewProps {\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * One or more colors to show in the preview\r\n */\r\n color: string | string[]\r\n\r\n /**\r\n * Wrapper classname\r\n */\r\n className?: string\r\n}\r\n\r\nexport function ColorPreview({ icon, color, className }: ColorPreviewProps) {\r\n const colors = Array.isArray(color) ? color : [color]\r\n const isTooLight = getIsColorTooLightOrTransparent(hexStringToRGBA(colors[0]))\r\n return (\r\n \r\n {icon && (\r\n
\r\n {isValidIconName(icon) ? (\r\n \r\n ) : (\r\n icon\r\n )}\r\n
\r\n )}\r\n {colors.map((color, index) => (\r\n //   has to be there because of a bug on safari which ignores h-full when empty element\r\n
\r\n  \r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ForwardedRef, useCallback, useEffect, useState } from 'react'\r\n\r\nimport { Input, InputComponentProps } from '../input'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPickerProps } from './picker'\r\nimport * as colorUtil from './util'\r\n\r\ninterface PickerInputProps extends Omit {\r\n color: ColorPickerProps['color']\r\n onChange: ColorPickerProps['onChange']\r\n\r\n /*\r\n * Is color preview square visible\r\n *\r\n * @default true\r\n * */\r\n hasColorPreview?: boolean\r\n}\r\nexport const PickerInput = React.forwardRef(\r\n (\r\n { color, inputClass, hasColorPreview = true, onChange, ...props }: PickerInputProps,\r\n ref: ForwardedRef\r\n ) => {\r\n const [colorInput, setColorInput] = useState(colorUtil.removeHashSymbol(color))\r\n const isRgba = colorUtil.getIsRgb(colorInput)\r\n\r\n useEffect(() => {\r\n setColorInput(colorUtil.removeHashSymbol(color))\r\n }, [color])\r\n\r\n const handleColorInputChange = useCallback(\r\n (event) => {\r\n const value = colorUtil.removeHashSymbol(event.currentTarget.value)\r\n const isRgba = value.startsWith('rgba')\r\n const colorValue = isRgba ? value : `#${value}`\r\n\r\n setColorInput(value)\r\n if ((value.length >= 6 || (isRgba && value.length >= 16)) && colorUtil.isValidColor(colorValue)) {\r\n onChange(colorValue, colorUtil.hexStringToHSVA(colorValue))\r\n }\r\n },\r\n [onChange]\r\n )\r\n return (\r\n \r\n {hasColorPreview && (\r\n
\r\n \r\n
\r\n )}\r\n {!isRgba && #}\r\n
\r\n }\r\n onChange={handleColorInputChange}\r\n />\r\n )\r\n }\r\n)\r\n","import classnames from 'classnames'\r\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button } from '../button'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Alpha } from './alpha'\r\nimport { ColorPalette } from './color-palette'\r\nimport { HueSaturation } from './hue-saturation'\r\nimport { Lightness } from './lightness'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\nexport interface ColorPickerProps {\r\n /**\r\n * The selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * Whether or not the user is able to select custom color\r\n *\r\n * @default true\r\n */\r\n canSelectCustom?: boolean\r\n\r\n /**\r\n * Whether or not the user is able to change alpha channel. Only applicable\r\n * when `canSelectCustom` is true\r\n *\r\n * @default true\r\n */\r\n canSelectAlpha?: boolean\r\n\r\n /**\r\n * Sets the output format for the color picker\r\n *\r\n * @default 'hex'\r\n */\r\n outputFormat?: 'hex' | 'rgba'\r\n\r\n /**\r\n * Callback when user changes color. Use the second parameter to do color space\r\n * conversions otherwise the color could differ due to rounding\r\n */\r\n onChange: (color: string, originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Callback when user clicks on a palette item. Used to close popover\r\n */\r\n onPaletteItemClick?: () => void\r\n}\r\n\r\nexport function ColorPicker({\r\n color,\r\n canSelectCustom = true,\r\n canSelectAlpha = true,\r\n outputFormat = 'hex',\r\n onChange,\r\n onPaletteItemClick,\r\n}: ColorPickerProps) {\r\n const cachedColor = useRef(color)\r\n const [hsvaColor, setColor] = useState(colorUtil.getHSVAFromColor(color))\r\n\r\n /**\r\n * Update state if the color from outside changed\r\n */\r\n useEffect(() => {\r\n const currentColor = colorUtil.removeHashSymbol(cachedColor.current)\r\n const newColor = colorUtil.removeHashSymbol(color)\r\n\r\n if (currentColor === newColor || !colorUtil.isValidColor(newColor)) return\r\n\r\n cachedColor.current = color\r\n setColor(colorUtil.getHSVAFromColor(color))\r\n }, [color])\r\n\r\n /**\r\n * Handle color change\r\n * 1. update cache so we can correctly check when outside color updates\r\n * 2. Update internal color representation\r\n * 3. call onChange with string color\r\n */\r\n const onChangeCallback = useCallback(\r\n (color: colorUtil.HSVA) => {\r\n const stringColor = colorUtil.stringifyHSVAColor(color, outputFormat, canSelectAlpha)\r\n cachedColor.current = stringColor\r\n onChange(stringColor, color)\r\n setColor(color)\r\n },\r\n [onChange, canSelectAlpha, outputFormat]\r\n )\r\n\r\n const onSetCustomCodeClick = useCallback(() => {\r\n const value = prompt('Enter a color code')?.trim()\r\n\r\n if (!value) return\r\n\r\n const isValid = colorUtil.isValidColor(value)\r\n\r\n if (!isValid) {\r\n return alert('The code is not a valid color')\r\n }\r\n\r\n onChangeCallback(colorUtil.getHSVAFromColor(value))\r\n }, [onChangeCallback])\r\n\r\n return (\r\n
\r\n {canSelectCustom && (\r\n <>\r\n {isMobile() && (\r\n \r\n )}\r\n \r\n \r\n\r\n {canSelectAlpha && }\r\n \r\n )}\r\n\r\n \r\n {\r\n onPaletteItemClick?.()\r\n onChangeCallback({ ...orignalColor, a: hsvaColor.a })\r\n }}\r\n />\r\n
\r\n \r\n )\r\n}\r\n\r\ninterface InputColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for the input\r\n */\r\n label?: ReactNode\r\n inputDataTestId?: string\r\n}\r\n\r\nexport function InputColorPicker({ label, inputDataTestId, onChange, ...props }: InputColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const canSelectCustom = props.canSelectCustom !== false\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {\r\n if (canSelectCustom) return\r\n popoverState.hide()\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button, ButtonComponentProps, ButtonRounding, ButtonSizeType } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { IconNameType } from '../icon'\r\nimport { Popover, PopoverProps, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPicker, ColorPickerProps } from './picker'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\ninterface MultiColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n}\r\n\r\nexport function MultiColorPicker({\r\n colorInputLabel,\r\n onChange,\r\n canSelectCustom = true,\r\n ...props\r\n}: MultiColorPickerProps) {\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n {canSelectCustom && !isMobileDevice && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n {}} />\r\n \r\n \r\n )\r\n}\r\n\r\ninterface ColorTabButtonProps extends ButtonComponentProps {\r\n /*\r\n * Preview color\r\n * */\r\n color: string\r\n}\r\n\r\nexport function ColorTabButton({ color, children, ...props }: ColorTabButtonProps) {\r\n return (\r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n\r\ntype ButtonColorProperties = { color: string; label: string }\r\n\r\ninterface ButtonColorPickerProps\r\n extends Omit {\r\n /**\r\n * Temporary prop to enable/disable multi picker funcionality,\r\n * in the future we'll only use secondaryColor prop to decide if the picker is multi picker or not\r\n *\r\n * @default undefined\r\n */\r\n isMultiPicker?: boolean\r\n\r\n /**\r\n * Button classname\r\n */\r\n className?: string\r\n\r\n /**\r\n * Array of objects with color and value\r\n */\r\n colors: ColorType[]\r\n\r\n /**\r\n * Color onchange callback\r\n */\r\n onChange: (colors: ColorType[], originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Button size\r\n *\r\n * @default undefined\r\n */\r\n size?: ButtonSizeType\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Hides color picker when clicked outside of popover,\r\n * works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside: PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Popover overlay click callback, if nothing's provided it calls hide when clicked outside of popover on its overlay\r\n * If false is provided, overlay click calls hide func on popover state object\r\n *\r\n * @default undefined\r\n */\r\n onOverlayClick?: (() => void) | false\r\n\r\n /**\r\n * Identifier for e2e testing\r\n *\r\n * @default undefined\r\n */\r\n buttonPickerDataTestId?: string\r\n}\r\n\r\nexport function ButtonColorPicker({\r\n size,\r\n icon,\r\n colors,\r\n className,\r\n onChange,\r\n buttonPickerDataTestId,\r\n hideOnClickOutside = true,\r\n onOverlayClick,\r\n ...props\r\n}: ButtonColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const isMultiPicker = !!props.isMultiPicker && colors.length > 1\r\n const [activeColorIndex, setActiveColorIndex] = React.useState(0)\r\n const handleColorChange = React.useCallback(\r\n (color: string, originalColor: colorUtil.HSVA) => {\r\n onChange(\r\n colors.map((colorObject, index) => (index === activeColorIndex ? { ...colorObject, color } : colorObject)),\r\n originalColor\r\n )\r\n },\r\n [activeColorIndex, colors, onChange]\r\n )\r\n return (\r\n <>\r\n \r\n color)}\r\n className={classnames('h-full w-full', ButtonRounding.small)}\r\n />\r\n \r\n \r\n {isMultiPicker && (\r\n
\r\n \r\n {colors.map(({ color, label }, index) => (\r\n setActiveColorIndex(index)}\r\n >\r\n {label}\r\n \r\n ))}\r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n )\r\n}\r\n","/**\r\n * Used for reakit as the duration of a open/close animation. The animation itself is done using css\r\n */\r\nexport const COMPONENT_ANIMATION_DURATION = 250\r\n","import copy from 'copy-to-clipboard'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { InputProps, Textarea } from '../input'\r\n\r\ninterface Props extends Pick {\r\n className?: string\r\n text: string\r\n bottomLeftContent?: React.ReactNode\r\n}\r\n\r\nexport const CopyToClipboard: React.FC = ({ className, label, text, bottomLeftContent }) => {\r\n const [isCopied, setIsCopied] = React.useState(false)\r\n\r\n const handleCopyToClipboard = React.useCallback(() => {\r\n setIsCopied(true)\r\n copy(text)\r\n }, [text])\r\n\r\n React.useEffect(() => {\r\n let timeout: NodeJS.Timeout\r\n const resetTimer = () => {\r\n if (!timeout) return\r\n clearTimeout(timeout)\r\n }\r\n if (isCopied) {\r\n resetTimer()\r\n timeout = setTimeout(() => {\r\n setIsCopied(false)\r\n }, 2000)\r\n }\r\n\r\n return () => {\r\n resetTimer()\r\n }\r\n }, [isCopied])\r\n\r\n return (\r\n
\r\n e.currentTarget.select()}\r\n inputClass=\"h-12\"\r\n data-testid=\"copy-to-clipboard-textarea\"\r\n value={text}\r\n />\r\n
\r\n {bottomLeftContent &&
{bottomLeftContent}
}\r\n \r\n {isCopied ? 'Copied' : 'Copy'}\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { CalendarProps } from 'react-calendar'\r\n\r\nimport { Box } from '../box'\r\nimport { ZIndexContext, getExtendedDialogState } from '../dialog'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Spinner } from '../spinner'\r\n\r\nconst DatePickerComponent = React.lazy(() => import('./picker'))\r\n\r\ntype RangePickerCallback = (value: [Date, Date], ev: React.ChangeEvent) => void\r\ntype PickerCallback = (value: Date, ev: React.ChangeEvent) => void\r\n\r\ninterface DatePickerProps extends Omit {\r\n /**\r\n * Trigger element for the picker\r\n */\r\n children: JSX.Element\r\n\r\n onChange: PickerCallback | RangePickerCallback\r\n\r\n zIndex?: string\r\n}\r\n\r\nexport function StatelessDatePicker({\r\n state,\r\n children,\r\n zIndex,\r\n ...props\r\n}: DatePickerProps & { state: ReturnType; zIndex?: string }) {\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n return (\r\n <>\r\n \r\n {(triggerProps: React.HTMLProps) =>\r\n React.Children.map(children, (child) => {\r\n if (React.isValidElement(child))\r\n return React.cloneElement(child, { ...triggerProps, ...(child.props as any) })\r\n })\r\n }\r\n \r\n {!isFullyClosed && (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n ) => {\r\n state.hide()\r\n props.onChange?.(value, ev)\r\n }}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport function DatePicker(props: DatePickerProps) {\r\n const popover = usePopoverState()\r\n\r\n return \r\n}\r\n","import * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Dialog'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport const ZIndexContext = React.createContext('z-50')\r\n\r\nexport function useZIndex() {\r\n return React.useContext(ZIndexContext)\r\n}\r\n\r\nexport type DialogStateReturn = ReturnType\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function useDialogState(settings?: Reakit.DialogInitialState) {\r\n return Reakit.useDialogState({ ...settings, animated: COMPONENT_ANIMATION_DURATION })\r\n}\r\n\r\nexport const DialogDragContext = React.createContext<{\r\n enabled?: boolean\r\n handleRef?: React.RefObject\r\n boxPosition: { x: number; y: number }\r\n resetBoxPosition: () => void\r\n setBoxPosition: React.Dispatch>\r\n}>({\r\n enabled: false,\r\n handleRef: undefined,\r\n boxPosition: { x: 0, y: 0 },\r\n resetBoxPosition: () => {},\r\n setBoxPosition: () => {},\r\n})\r\n\r\n/**\r\n * Hook which allows an element on the page to become draggable\r\n */\r\nexport function useDrag(enabled?: boolean) {\r\n const dragging = React.useRef(false)\r\n const handleRef = React.useRef(null)\r\n const handleElement = handleRef.current\r\n\r\n /**\r\n * Set box position in both state for the component to re-render and as a ref\r\n * so that we don’t have to re-run the whole effect on every change\r\n */\r\n const [boxPosition, setBoxPosition] = React.useState({ x: 0, y: 0 })\r\n const boxPositionRef = React.useRef({ x: 0, y: 0 })\r\n const dragDiff = React.useRef({ x: 0, y: 0 })\r\n\r\n const { current: resetBoxPosition } = React.useRef(() => {\r\n setBoxPosition({ x: 0, y: 0 })\r\n })\r\n\r\n React.useEffect(() => {\r\n boxPositionRef.current = { ...boxPosition }\r\n }, [boxPosition])\r\n\r\n React.useEffect(() => {\r\n if (!enabled || !handleElement || isMobile()) return\r\n\r\n const onMouseDown = (ev: MouseEvent) => {\r\n dragging.current = true\r\n\r\n dragDiff.current = {\r\n x: ev.pageX - boxPositionRef.current.x - window.scrollX,\r\n y: ev.pageY - boxPositionRef.current.y - window.scrollY,\r\n }\r\n }\r\n\r\n const onMouseUp = () => {\r\n dragging.current = false\r\n }\r\n\r\n const onMouseMove = (ev: MouseEvent) => {\r\n if (!dragging.current) return\r\n\r\n const x = ev.pageX - dragDiff.current.x - window.scrollX\r\n const y = ev.pageY - dragDiff.current.y - window.scrollY\r\n\r\n setBoxPosition({ x, y })\r\n }\r\n\r\n handleElement.addEventListener('pointerdown', onMouseDown)\r\n handleElement.addEventListener('dblclick', resetBoxPosition)\r\n window.addEventListener('pointerup', onMouseUp)\r\n document.body.addEventListener('pointermove', onMouseMove)\r\n\r\n return () => {\r\n handleElement.removeEventListener('pointerdown', onMouseDown)\r\n handleElement.removeEventListener('dblclick', resetBoxPosition)\r\n window.removeEventListener('pointerup', onMouseUp)\r\n document.body.removeEventListener('pointermove', onMouseMove)\r\n }\r\n }, [enabled, handleElement, resetBoxPosition])\r\n\r\n return {\r\n enabled,\r\n handleRef,\r\n boxPosition,\r\n setBoxPosition,\r\n resetBoxPosition,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { useElementMeasure } from '../../hooks/use-element-measure'\r\nimport { Box, BoxProps } from '../box'\r\nimport { DialogDragContext } from './hooks'\r\n\r\n/**\r\n * Public props for the component\r\n */\r\nexport type DialogBoxProps = BoxProps\r\n\r\ninterface DialogBoxOwnProps extends DialogBoxProps {\r\n /**\r\n * This callback serves as a way to account for the time between dialog close\r\n * and animation finish. The box isn’t rendered when the dialog closes but we still\r\n * want to display content when the dialog is closing\r\n */\r\n onUnmount?: () => void\r\n}\r\n\r\n/**\r\n * Dialog content container\r\n */\r\nexport function DialogBox({ onUnmount, style, ...props }: React.PropsWithChildren) {\r\n const wrapperRef = React.useRef(null)\r\n const { setElementRef, elementHeight } = useElementMeasure()\r\n const dialogDrag = React.useContext(DialogDragContext)\r\n\r\n React.useEffect(() => {\r\n const onResize = () => {\r\n const { top = 0, bottom = 0, left = 0, right = 0 } = dialogDrag.handleRef?.current?.getBoundingClientRect() ?? {}\r\n const { clientHeight, clientWidth } = window.document.documentElement\r\n if (top < 0 || bottom > clientHeight || left < 0 || right > clientWidth) {\r\n dialogDrag.resetBoxPosition()\r\n }\r\n }\r\n\r\n window.addEventListener('resize', onResize)\r\n onResize()\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize)\r\n onUnmount?.()\r\n }\r\n // Set up an effect which only calls resetBoxPosition which is ref fn with state setter call and the unmount callback\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n setElementRef(wrapperRef.current)\r\n }, [setElementRef])\r\n\r\n React.useEffect(() => {\r\n dialogDrag.setBoxPosition((prevPosition) => {\r\n const { top = 0 } = dialogDrag.handleRef?.current?.getBoundingClientRect() ?? {}\r\n return { ...prevPosition, y: prevPosition.y - Math.min(top, 0) }\r\n })\r\n // We want to call it only on elementHeight change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [elementHeight])\r\n\r\n const dialogBoxStyle = React.useMemo(() => {\r\n if (dialogDrag.enabled) {\r\n return { ...style, transform: `translate3d(${dialogDrag.boxPosition.x}px, ${dialogDrag.boxPosition.y}px, 0)` }\r\n }\r\n return style\r\n }, [style, dialogDrag])\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\n/**\r\n * The backdrop of the dialog, closes the dialog on click\r\n */\r\nexport function DialogOverlay(props: React.HTMLProps) {\r\n return (\r\n \r\n )\r\n}\r\n","export function getExtendedDialogState(state: { visible: boolean; animating: boolean }) {\r\n return {\r\n isFullyOpened: state.visible && !state.animating,\r\n isFullyClosed: !state.visible && !state.animating,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Dialog'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { ChildPosition, getFlexAlignClasses } from '../../util'\r\nimport { DialogBox, DialogBoxProps } from './dialog-box'\r\nimport { DialogOverlay } from './dialog-overlay'\r\nimport { DialogDragContext, DialogStateReturn, ZIndexContext, useDrag } from './hooks'\r\nimport { getExtendedDialogState } from './utils'\r\n\r\nexport enum DialogType {\r\n modal,\r\n drawer,\r\n}\r\n\r\nexport interface DialogProps extends DialogBoxProps, Pick {\r\n /**\r\n * The returned object from `useDialogState`\r\n */\r\n state: DialogStateReturn\r\n\r\n /**\r\n * Any additional props to the Reakit Dialog component\r\n */\r\n finalFocusRef?: React.RefObject\r\n\r\n /**\r\n * Callback which is called when the dialog closes and all animations complete\r\n */\r\n onHide?: () => void\r\n\r\n /**\r\n * Callback which is called when the dialog overlay is clicked\r\n * default behavior (closing the dialog) will be overridden so it has to be called manually\r\n */\r\n onOverlayClick?: () => void\r\n\r\n /**\r\n * Sets if the dialog can be dragged across the screen\r\n *\r\n * @default false\r\n */\r\n isDraggable?: boolean\r\n\r\n /**\r\n * Type of dialog\r\n *\r\n * @default modal\r\n */\r\n type?: keyof typeof DialogType\r\n\r\n /**\r\n * Dialog position on the screen\r\n *\r\n * @default center\r\n */\r\n position?: keyof typeof ChildPosition\r\n\r\n overlayClass?: string\r\n\r\n /**\r\n * Sets if backdrop overlay prevents interaction with rest of page, onOverlayClick will have no effect if isBackdropDisabled is true\r\n *\r\n * @default false\r\n */\r\n isBackdropDisabled?: boolean\r\n}\r\n\r\nconst DIALOG_BACKDROP_WIDTH_CSS_VAR = '--dialog-backgrop-width'\r\n\r\nconst onResize = () => {\r\n // Save to css var because it can change and that could make modal dialog jump on open\r\n document.body.style.setProperty(DIALOG_BACKDROP_WIDTH_CSS_VAR, `${document.documentElement.clientWidth}px`)\r\n}\r\n\r\n/**\r\n * The actual dialog component which renders overlay, box and handles all the\r\n * functionality like focus trapping, etc.\r\n */\r\nexport function Dialog({\r\n state,\r\n finalFocusRef,\r\n onHide,\r\n onOverlayClick,\r\n children,\r\n hide,\r\n hideOnEsc,\r\n isDraggable = false,\r\n position = 'center',\r\n isBackdropDisabled = false,\r\n type = 'modal',\r\n overlayClass,\r\n 'aria-label': ariaLabel,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const dialogDrag = useDrag(isDraggable)\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n\r\n React.useEffect(() => {\r\n if (isFullyClosed) {\r\n return\r\n }\r\n\r\n window.addEventListener('resize', onResize)\r\n onResize()\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize)\r\n }\r\n }, [isFullyClosed])\r\n\r\n if (isFullyClosed) {\r\n return null\r\n }\r\n\r\n const DialogWrapper = state.modal ? React.Fragment : Portal\r\n return (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n {!isBackdropDisabled && (\r\n \r\n )}\r\n \r\n \r\n {\r\n onHide?.()\r\n dialogDrag.resetBoxPosition()\r\n }}\r\n >\r\n {children}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\n\r\ninterface DialogBodyProps extends React.HTMLProps {\r\n /**\r\n * Whether or not the dialog body will have padding\r\n *\r\n * @default true\r\n */\r\n hasPadding?: boolean\r\n}\r\n\r\n/**\r\n * Content wrapper which handles scrolling on mobile\r\n */\r\nexport function DialogBody({ hasPadding = true, ...props }: React.PropsWithChildren) {\r\n const scrollDivRef = React.useRef(null)\r\n\r\n React.useEffect(() => {\r\n const scrollBox = scrollDivRef.current\r\n\r\n if (isMobile() && scrollBox) {\r\n disableBodyScroll(scrollBox)\r\n\r\n return () => enableBodyScroll(scrollBox)\r\n }\r\n }, [])\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { Dialog, DialogProps } from './dialog'\r\nimport { DialogBody } from './dialog-body'\r\nimport { DialogStateReturn } from './hooks'\r\n\r\ninterface ConfirmationDialogProps {\r\n state: DialogStateReturn\r\n title: React.ReactNode\r\n actions: React.ReactNode\r\n 'aria-label': string\r\n position?: DialogProps['position']\r\n}\r\n\r\nexport function ConfirmationDialog({ position, ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n \r\n \r\n {props.title}\r\n \r\n {props.children}\r\n
{props.actions}
\r\n
\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Dialog'\r\n\r\nimport { DropdownContext } from '../dropdown'\r\nimport { DialogStateReturn } from './hooks'\r\n\r\ninterface DialogButtonProps extends Reakit.DialogDisclosureHTMLProps {\r\n state: DialogStateReturn\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const DialogTrigger = React.forwardRef(\r\n ({ state, ...props }: DialogButtonProps, ref: React.ForwardedRef) => {\r\n const dropdownContext = React.useContext(DropdownContext)\r\n\r\n return (\r\n ) => {\r\n // Close dropdown if we’re inside one\r\n dropdownContext?.root.hide()\r\n props.onClick?.(ev)\r\n }}\r\n >\r\n {props.children}\r\n \r\n )\r\n }\r\n)\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface DialogFooterProps extends React.HTMLProps {\r\n padding?: boolean\r\n}\r\n\r\n/**\r\n * Footer container which renders border and aligns items to right\r\n */\r\nexport function DialogFooter({ padding = true, ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { Icon } from '../icon'\r\nimport { Heading } from '../typography'\r\nimport { DialogDragContext } from './hooks'\r\n\r\ninterface DialogHeaderProps {\r\n /**\r\n * Callback when user clicks on close button. The button will be hidden if not set\r\n */\r\n onCloseClick?: () => void\r\n\r\n /**\r\n * Additional class names for the component\r\n */\r\n className?: string\r\n\r\n /**\r\n * Whether or not the dialog header will have default horizontal padding\r\n *\r\n * @default true\r\n */\r\n hasHorizontalPadding?: boolean\r\n\r\n /**\r\n * Whether or not the dialog header will have default min height\r\n *\r\n * @default true\r\n */\r\n hasMinHeight?: boolean\r\n}\r\n\r\n/**\r\n * Component which renders title and a close button\r\n */\r\nexport function DialogHeader({\r\n onCloseClick,\r\n children,\r\n className,\r\n hasHorizontalPadding = true,\r\n hasMinHeight = true,\r\n}: React.PropsWithChildren) {\r\n const dialogDrag = React.useContext(DialogDragContext)\r\n\r\n return (\r\n \r\n {children && (\r\n \r\n {children}\r\n \r\n )}\r\n {onCloseClick && (\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport type DropdownStateReturn = ReturnType\r\n\r\nexport const DropdownContext = React.createContext<{\r\n parent: Reakit.MenuStateReturn\r\n root: Reakit.MenuStateReturn\r\n} | null>(null)\r\n\r\nexport function useDropdownState(settings?: Reakit.MenuInitialState) {\r\n const context = React.useContext(DropdownContext)\r\n\r\n return Reakit.useMenuState({\r\n ...settings,\r\n loop: true,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n unstable_virtual: true,\r\n unstable_offset: context?.root ? [-5, 4] : [0, 5],\r\n modal: false,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { Box, BoxProps, BoxRounding } from '../box'\r\nimport { getExtendedDialogState, useZIndex } from '../dialog'\r\nimport { DropdownContext, useDropdownState } from './hooks'\r\n\r\ninterface DropdownBaseProps extends Omit {\r\n /**\r\n * Trigger button for the dropdown\r\n */\r\n label: JSX.Element\r\n\r\n /**\r\n * @private\r\n * Any additional props to the trigger button. Used by nested dropdown wrapper\r\n */\r\n triggerProps?: Reakit.MenuButtonHTMLProps\r\n\r\n /**\r\n * Rounding of all trigger button, dropdown wrapper and dropdown items\r\n */\r\n rounding?: keyof typeof BoxRounding\r\n}\r\n\r\ninterface RootDropdownProps {\r\n /**\r\n * The returned object from `useDropdownState`. For nested dropdowns use the `isNested` prop\r\n */\r\n state: Reakit.MenuStateReturn\r\n isNested?: never\r\n /**\r\n * When set to true the dropdown will not render in Portal and will not use position absolute + transform.\r\n */\r\n isStatic?: boolean\r\n}\r\n\r\ninterface NestedDropdownProps {\r\n state?: never\r\n /**\r\n * When set to true the dropdown will compute its own state. Only usable with\r\n * nested dropdowns\r\n */\r\n isNested: true\r\n\r\n isStatic?: never\r\n}\r\n\r\ntype DropdownProps = DropdownBaseProps & (RootDropdownProps | NestedDropdownProps)\r\n\r\nfunction DropdownComponent(\r\n {\r\n label,\r\n triggerProps,\r\n state,\r\n 'aria-label': ariaLabel,\r\n children,\r\n isNested,\r\n rounding,\r\n isStatic,\r\n ...props\r\n }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n const zIndex = useZIndex()\r\n const context = React.useContext(DropdownContext)\r\n // Required due to the way conditional props work\r\n const dropdownState = state!\r\n const { isFullyClosed } = getExtendedDialogState(state ?? { visible: false, animating: false })\r\n\r\n if (!isNested && !dropdownState) {\r\n throw new Error('Dropdowns require either `state` or `isNested` prop defined!')\r\n }\r\n\r\n const ContainerElement = React.useRef(isNested || isStatic ? React.Fragment : Portal).current\r\n\r\n return (\r\n <>\r\n \r\n {(buttonProps) =>\r\n React.cloneElement(label, {\r\n ...buttonProps,\r\n ...label.props,\r\n rounding,\r\n active: label.props.active ?? dropdownState.visible,\r\n })\r\n }\r\n \r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === Dropdown) {\r\n return {child}\r\n }\r\n\r\n return React.cloneElement(child, {\r\n ...child.props,\r\n rounding,\r\n })\r\n })}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const Dropdown = React.forwardRef(DropdownComponent)\r\n\r\ninterface NestedDropdownWrapperProps {\r\n /**\r\n * State of parrent dropdown to be passed to MenuItem for correct navigation\r\n * handling\r\n */\r\n parentState: Reakit.MenuStateReturn\r\n\r\n /**\r\n * Nested dropdown element\r\n */\r\n children: JSX.Element\r\n}\r\n\r\n/**\r\n * The `useDropdownState` requires parent context to be defined in order to work\r\n * with nested Dropdowns. So we need to create a wrapper to be able to get to the\r\n * parent context\r\n */\r\nfunction NestedDropdownWrapper({ parentState, children }: NestedDropdownWrapperProps) {\r\n const state = useDropdownState()\r\n\r\n return (\r\n \r\n {(itemProps) => React.cloneElement(children, { ...children.props, triggerProps: itemProps, state })}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\n/**\r\n * When rendering multiple dropdowns, wrap them in `DropdownBar` so they can be\r\n * navigated between\r\n */\r\nexport function DropdownBar({ children, ...props }: Partial) {\r\n const state = Reakit.useMenuBarState()\r\n\r\n return (\r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n return (\r\n \r\n {(itemProps) => React.cloneElement(child, itemProps)}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\nimport { Button, ButtonProps } from '../button'\r\nimport { Icon, isValidIconName } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { DropdownContext } from './hooks'\r\n\r\nconst DEFAULT_ELEMENT = 'button'\r\n\r\ninterface DropdownItemProps extends ButtonProps {\r\n subtitle?: React.ReactNode\r\n\r\n /**\r\n * Whether clicking the item should also close the dropdown. Only applies to\r\n * items without a submenu\r\n *\r\n * @default true\r\n */\r\n closeOnClick?: boolean\r\n}\r\n\r\nfunction DropdownItemComponent(\r\n {\r\n as: asComponent,\r\n state,\r\n subtitle,\r\n closeOnClick = true,\r\n children,\r\n rounding,\r\n size,\r\n ...props\r\n }: PropsWithAs & DropdownItemProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const context = React.useContext(DropdownContext)\r\n\r\n return (\r\n \r\n {(itemProps) => {\r\n const active = itemProps['aria-selected'] && !context?.parent.animating\r\n const hasSubmenu = Boolean(itemProps['aria-haspopup'])\r\n\r\n const iconTheme = {\r\n 'text-gray-300': !active,\r\n 'text-gray-white dark:text-white': active,\r\n }\r\n\r\n return (\r\n \r\n ) : (\r\n props.leftContent\r\n )\r\n }\r\n rightContent={\r\n isValidIconName(props.rightContent) ? (\r\n \r\n ) : (\r\n props.rightContent\r\n )\r\n }\r\n onClick={(ev: React.MouseEvent) => {\r\n // Close if we clicked on an item which doesn’t have a submenu\r\n if (closeOnClick && !hasSubmenu) {\r\n context?.root.hide()\r\n }\r\n\r\n itemProps.onClick?.(ev)\r\n }}\r\n >\r\n {children}\r\n {subtitle &&
{subtitle}
}\r\n \r\n )\r\n }}\r\n
\r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const DropdownItem = React.forwardRef(DropdownItemComponent) as <\r\n TagType extends React.ElementType = typeof DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & DropdownItemProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import * as Reakit from 'reakit/Menu'\r\n\r\nimport { Paragraph } from '../typography'\r\n\r\nexport function DropdownSeparator(props: Partial) {\r\n return (\r\n \r\n
\r\n {props.children && (\r\n \r\n {props.children}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Button, ButtonProps } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { Icon } from '../icon'\r\nimport { Dropdown } from './dropdown'\r\nimport { useDropdownState } from './hooks'\r\n\r\ninterface MoreButtonDropdownProps extends ButtonProps {\r\n /**\r\n * Children of the button\r\n */\r\n label?: React.ReactNode\r\n\r\n /**\r\n * Additional handler when user clicks on the button\r\n */\r\n onClick?: (event: React.MouseEvent) => void\r\n\r\n /**\r\n * Accessibility label for the dropdown component\r\n */\r\n 'aria-label': string\r\n}\r\n\r\nexport function MoreButtonDropdown({\r\n label,\r\n children,\r\n onClick,\r\n 'aria-label': ariaLabel,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const state = useDropdownState({ placement: 'bottom-end' })\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n {children}\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { IconNameType, iconList } from '.'\r\nimport { SVGProps } from './svg'\r\n\r\nexport interface IconProps extends SVGProps {\r\n /**\r\n * Icon name\r\n */\r\n name?: IconNameType\r\n\r\n /**\r\n * Alternative way to pass icon to render if you want to render a custom component\r\n * or use `iconList` object lookup\r\n */\r\n as?: React.FC\r\n}\r\n\r\nexport function Icon({ name, as: asComponent, ...props }: IconProps) {\r\n const Component = name && iconList[name] ? iconList[name] : asComponent\r\n\r\n if (name && asComponent) {\r\n throw new Error('Specifying both \"name\" and \"as\" on Icon component is not supported')\r\n }\r\n\r\n if (!Component) {\r\n throw new Error('No icon to render!')\r\n }\r\n\r\n return \r\n}\r\n","import { IconAdd } from './add'\r\nimport { IconArrowDownShort } from './arrow-down-short'\r\nimport { IconArrowForward } from './arrow-forward'\r\nimport { IconArrowUpShort } from './arrow-up-short'\r\nimport { IconBriefcase } from './briefcase'\r\nimport { IconCalendar } from './calendar'\r\nimport { IconCandleBarBasic } from './candle-bar-basic'\r\nimport { IconCandleBarHeikinAshi } from './candle-bar-heikin-ashi'\r\nimport { IconCandleBarHollow } from './candle-bar-hollow'\r\nimport { IconCaretDown } from './caret-down'\r\nimport { IconCaretLeft } from './caret-left'\r\nimport { IconCaretRight } from './caret-right'\r\nimport { IconCaretUp } from './caret-up'\r\nimport { IconCaretVertical } from './caretVertical'\r\nimport { IconChartBar } from './chart-bar'\r\nimport { IconChartBubble } from './chart-bubble'\r\nimport { IconChartPie } from './chart-pie'\r\nimport { IconChartTable } from './chart-table'\r\nimport { IconChartTreemap } from './chart-treemap'\r\nimport { IconChevronDown } from './chevron-down'\r\nimport { IconChevronRight } from './chevron-right'\r\nimport { IconClose } from './close'\r\nimport { IconDarkMode } from './dark-mode'\r\nimport { IconDiamondOutlined } from './diamond-outlined'\r\nimport { IconDone } from './done'\r\nimport { IconDrag } from './drag'\r\nimport { IconDraw } from './draw'\r\nimport { IconDrawingActionDelete } from './drawing-action-delete'\r\nimport { IconDrawingSettingAutosaveOff } from './drawing-setting-autosave-off'\r\nimport { IconDrawingSettingAutosaveOn } from './drawing-setting-autosave-on'\r\nimport { IconDrawingSettingAutosaveSaving } from './drawing-setting-autosave-saving'\r\nimport { IconDrawingSettingDrawingMode } from './drawing-setting-drawing-mode'\r\nimport { IconDrawingSettingDrawingModeActive } from './drawing-setting-drawing-mode-active'\r\nimport { IconDrawingSettingHide } from './drawing-setting-hide'\r\nimport { IconDrawingSettingLock } from './drawing-setting-lock'\r\nimport { IconDrawingSettingPreserveDrawings } from './drawing-setting-preserve-drawings'\r\nimport { IconDrawingSettingPreserveDrawingsActive } from './drawing-setting-preserve-drawings-active'\r\nimport { IconDrawingSettingShow } from './drawing-setting-show'\r\nimport { IconDrawingSettingUnlock } from './drawing-setting-unlock'\r\nimport { IconExitFullscreen } from './exit-fullscreen'\r\nimport { IconFlash } from './flash'\r\nimport { IconFullscreen } from './fullscreen'\r\nimport { IconGesture } from './gesture'\r\nimport { IconGift } from './gift'\r\nimport { IconHamburger } from './hamburger'\r\nimport { IconHelp } from './help'\r\nimport { IconIdea } from './idea'\r\nimport { IconIdeaLoad } from './idea-load'\r\nimport { IconIdeaSave } from './idea-save'\r\nimport { IconInfo } from './info'\r\nimport { IconInterval } from './interval'\r\nimport { IconLayout1h1v } from './layout-1h1v'\r\nimport { IconLayout1h2v } from './layout-1h2v'\r\nimport { IconLayout1h3v } from './layout-1h3v'\r\nimport { IconLayout1l2r } from './layout-1l2r'\r\nimport { IconLayout1t2b } from './layout-1t2b'\r\nimport { IconLayout2h1v } from './layout-2h1v'\r\nimport { IconLayout2h2v } from './layout-2h2v'\r\nimport { IconLayout3h1v } from './layout-3h1v'\r\nimport { IconLayout3h2v } from './layout-3h2v'\r\nimport { IconLightMode } from './light-mode'\r\nimport { IconLineChartType } from './line-chart-type'\r\nimport { IconLock } from './lock'\r\nimport { IconMenuClose } from './menu-close'\r\nimport { IconMinus } from './minus'\r\nimport { IconMore } from './more'\r\nimport { IconNote } from './note'\r\nimport { IconOhlcChartType } from './ohlc-chart-type'\r\nimport { IconPalette } from './palette'\r\nimport { IconProfile } from './profile'\r\nimport { IconPublish } from './publish'\r\nimport { IconRefresh } from './refresh'\r\nimport { IconRemove } from './remove'\r\nimport { IconRestore } from './restore'\r\nimport { IconSearch } from './search'\r\nimport { IconSettings } from './settings'\r\nimport { IconSettingsWheel } from './settings-wheel'\r\nimport { IconShare } from './share'\r\nimport { IconSignOut } from './sign-out'\r\nimport { IconStar } from './star'\r\nimport { IconStarOutlined } from './star-outlined'\r\nimport { SVG, SVGProps } from './svg'\r\nimport { IconSwitchHorizontal } from './switch-horizontal'\r\nimport { IconSwitchVertical } from './switch-vertical'\r\nimport { IconTabKey } from './tab-key'\r\nimport { IconTemplate } from './template'\r\nimport { IconToolArrow } from './tool-arrow'\r\nimport { IconToolBrush } from './tool-brush'\r\nimport { IconToolCallout } from './tool-callout'\r\nimport { IconToolCurve } from './tool-curve'\r\nimport { IconToolElliottWave } from './tool-elliott-wave'\r\nimport { IconToolEllipse } from './tool-ellipse'\r\nimport { IconToolExpand } from './tool-expand'\r\nimport { IconToolFibonacci } from './tool-fibonacci'\r\nimport { IconToolLine } from './tool-line'\r\nimport { IconToolMeasure } from './tool-measure'\r\nimport { IconToolMidlineH } from './tool-midline-h'\r\nimport { IconToolMidlineV } from './tool-midline-v'\r\nimport { IconToolMouse } from './tool-mouse'\r\nimport { IconToolPitchFork } from './tool-pitchfork'\r\nimport { IconToolPolygon } from './tool-polygon'\r\nimport { IconToolPosition } from './tool-position'\r\nimport { IconToolRect } from './tool-rect'\r\nimport { IconToolRectRotated } from './tool-rect-rotated'\r\nimport { IconToolText } from './tool-text'\r\nimport { IconToolTriangle } from './tool-triangle'\r\nimport { IconToolXABCD } from './tool-xabcd'\r\nimport { IconTrashCan } from './trash-can'\r\nimport { IconTrendingDown } from './trending-down'\r\nimport { IconTrendingUp } from './trending-up'\r\nimport { IconTriangle } from './triangle'\r\nimport { IconTriangleOutlineDown } from './triangle-outline-down'\r\nimport { IconTriangleOutlineUp } from './triangle-outline-up'\r\nimport { IconWarning } from './warning'\r\n\r\n// Export the Icon component itself\r\nexport * from './icon'\r\n\r\nexport function isValidIconName(name?: unknown): name is IconNameType {\r\n if (!name || typeof name !== 'string') return false\r\n\r\n return !!iconList[name as IconNameType]\r\n}\r\n\r\nexport type IconNameType = keyof typeof iconList\r\n\r\n// Export list of icon components\r\nexport const iconList = {\r\n add: IconAdd,\r\n arrowDownShort: IconArrowDownShort,\r\n arrowForward: IconArrowForward,\r\n arrowUpShort: IconArrowUpShort,\r\n briefcase: IconBriefcase,\r\n calendar: IconCalendar,\r\n candleBarBasic: IconCandleBarBasic,\r\n candleBarHeikinAshi: IconCandleBarHeikinAshi,\r\n candleBarHollow: IconCandleBarHollow,\r\n caretDown: IconCaretDown,\r\n caretLeft: IconCaretLeft,\r\n caretRight: IconCaretRight,\r\n caretUp: IconCaretUp,\r\n caretVertical: IconCaretVertical,\r\n chartBar: IconChartBar,\r\n chartBubble: IconChartBubble,\r\n chartPie: IconChartPie,\r\n chartTable: IconChartTable,\r\n chartTreemap: IconChartTreemap,\r\n chevronDown: IconChevronDown,\r\n chevronRight: IconChevronRight,\r\n close: IconMenuClose,\r\n darkMode: IconDarkMode,\r\n diamondOutlined: IconDiamondOutlined,\r\n done: IconDone,\r\n drag: IconDrag,\r\n draw: IconDraw,\r\n drawingActionDelete: IconDrawingActionDelete,\r\n drawingSettingAutosaveOff: IconDrawingSettingAutosaveOff,\r\n drawingSettingAutosaveOn: IconDrawingSettingAutosaveOn,\r\n drawingSettingAutosaveSaving: IconDrawingSettingAutosaveSaving,\r\n drawingSettingDrawingMode: IconDrawingSettingDrawingMode,\r\n drawingSettingDrawingModeActive: IconDrawingSettingDrawingModeActive,\r\n drawingSettingHide: IconDrawingSettingHide,\r\n drawingSettingLock: IconDrawingSettingLock,\r\n drawingSettingPreserveDrawings: IconDrawingSettingPreserveDrawings,\r\n drawingSettingPreserveDrawingsActive: IconDrawingSettingPreserveDrawingsActive,\r\n drawingSettingShow: IconDrawingSettingShow,\r\n drawingSettingUnlock: IconDrawingSettingUnlock,\r\n empty: (props: SVGProps) => ,\r\n exitFullscreen: IconExitFullscreen,\r\n flash: IconFlash,\r\n fullscreen: IconFullscreen,\r\n gesture: IconGesture,\r\n gift: IconGift,\r\n hamburger: IconHamburger,\r\n help: IconHelp,\r\n idea: IconIdea,\r\n ideaLoad: IconIdeaLoad,\r\n ideaSave: IconIdeaSave,\r\n info: IconInfo,\r\n interval: IconInterval,\r\n layout1h1v: IconLayout1h1v,\r\n layout1h2v: IconLayout1h2v,\r\n layout1h3v: IconLayout1h3v,\r\n layout1l2r: IconLayout1l2r,\r\n layout1t2b: IconLayout1t2b,\r\n layout2h1v: IconLayout2h1v,\r\n layout2h2v: IconLayout2h2v,\r\n layout3h1v: IconLayout3h1v,\r\n layout3h2v: IconLayout3h2v,\r\n lightMode: IconLightMode,\r\n lineChartType: IconLineChartType,\r\n lock: IconLock,\r\n menuClose: IconClose,\r\n minus: IconMinus,\r\n more: IconMore,\r\n note: IconNote,\r\n ohlcChartType: IconOhlcChartType,\r\n palette: IconPalette,\r\n profile: IconProfile,\r\n publish: IconPublish,\r\n refresh: IconRefresh,\r\n remove: IconRemove,\r\n restore: IconRestore,\r\n search: IconSearch,\r\n settings: IconSettings,\r\n settingsWheel: IconSettingsWheel,\r\n share: IconShare,\r\n signOut: IconSignOut,\r\n star: IconStar,\r\n starOutlined: IconStarOutlined,\r\n switchHorizontal: IconSwitchHorizontal,\r\n switchVertical: IconSwitchVertical,\r\n tabKey: IconTabKey,\r\n template: IconTemplate,\r\n toolArrow: IconToolArrow,\r\n toolBrush: IconToolBrush,\r\n toolCallout: IconToolCallout,\r\n toolCurve: IconToolCurve,\r\n toolElliottWave: IconToolElliottWave,\r\n toolEllipse: IconToolEllipse,\r\n toolExpand: IconToolExpand,\r\n toolFibonacci: IconToolFibonacci,\r\n toolLine: IconToolLine,\r\n toolMeasure: IconToolMeasure,\r\n toolMidLineH: IconToolMidlineH,\r\n toolMidLineV: IconToolMidlineV,\r\n toolMouse: IconToolMouse,\r\n toolPitchfork: IconToolPitchFork,\r\n toolPolygon: IconToolPolygon,\r\n toolPosition: IconToolPosition,\r\n toolRect: IconToolRect,\r\n toolRectRotated: IconToolRectRotated,\r\n toolText: IconToolText,\r\n toolTriangle: IconToolTriangle,\r\n toolXABCD: IconToolXABCD,\r\n trashCan: IconTrashCan,\r\n trendingDown: IconTrendingDown,\r\n trendingUp: IconTrendingUp,\r\n triangle: IconTriangle,\r\n triangleOutlineDown: IconTriangleOutlineDown,\r\n triangleOutlineUp: IconTriangleOutlineUp,\r\n warning: IconWarning,\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconAdd(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconArrowDownShort(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconArrowForward(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconArrowUpShort(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconBriefcase(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCalendar(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCandleBarBasic(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCandleBarHeikinAshi(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCandleBarHollow(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretLeft(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretRight(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretUp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretVertical(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartBar(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartBubble(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartPie(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartTable(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartTreemap(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChevronDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChevronRight(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconMenuClose(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDarkMode(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDiamondOutlined(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDone(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrag(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDraw(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingActionDelete(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingAutosaveOff(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingAutosaveOn(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingAutosaveSaving(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingDrawingMode(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingDrawingModeActive(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingHide(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingLock(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingPreserveDrawings(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingPreserveDrawingsActive(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingShow(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingUnlock(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconExitFullscreen(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconFlash(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconFullscreen(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconGesture(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconGift(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconHamburger(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconHelp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconIdea(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconIdeaLoad(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconIdeaSave(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconInfo(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconInterval(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1h1v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1h2v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1h3v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1l2r(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1t2b(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout2h1v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout2h2v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout3h1v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout3h2v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLightMode(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLineChartType(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLock(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconClose(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconMinus(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconMore(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconNote(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconOhlcChartType(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconPalette(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconProfile(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconPublish(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconRefresh(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconRemove(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconRestore(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSearch(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSettings(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSettingsWheel(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconShare(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSignOut(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconStar(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconStarOutlined(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSwitchHorizontal(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSwitchVertical(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTabKey(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTemplate(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolArrow(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolBrush(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolCallout(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolCurve(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolElliottWave(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolEllipse(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolExpand(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolFibonacci(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolLine(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMeasure(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMidlineH(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMidlineV(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMouse(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolPitchFork(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolPolygon(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolPosition(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolRect(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolRectRotated(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolText(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolTriangle(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolXABCD(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTrashCan(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTrendingDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTrendingUp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTriangle(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTriangleOutlineDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTriangleOutlineUp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconWarning(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport type SVGProps = React.SVGProps\r\n\r\nexport function SVG({ className, width = 16, height = width, ...props }: SVGProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef, useMemo } from 'react'\r\n\r\nimport { ButtonPadding } from './button'\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { Label } from './typography'\r\n\r\nexport enum InputTheme {\r\n none,\r\n light,\r\n dark,\r\n navigationBar,\r\n}\r\n\r\nexport enum InputRounding {\r\n none = '',\r\n regular = 'rounded-md',\r\n}\r\n\r\n/**\r\n * Enum for input size. Only set size on larger viewports to avoid page zooming\r\n */\r\nexport enum InputSize {\r\n small = 'h-6 text-2xs', // 24px height\r\n regular = 'h-7 text-2xs', // 28px height\r\n medium = 'h-8 text-sm', // 32px height\r\n large = 'h-9 text-sm', // 36px height\r\n}\r\n\r\nfunction getInputTheme(theme: InputTheme, isError = false) {\r\n switch (theme) {\r\n case InputTheme.none:\r\n return {}\r\n case InputTheme.dark:\r\n return {\r\n input: classnames('border bg-gray-800 text-gray-50 disabled:bg-gray-700 disabled:text-gray-400', {\r\n 'border-gray-600 hover:border-gray-400 focus:border-blue-400 focus:hover:border-blue-400 disabled:border-gray-700':\r\n !isError,\r\n 'border-red-400': isError,\r\n }),\r\n icon: classnames({\r\n 'text-gray-500 group-focus-within:text-blue-400': !isError,\r\n 'text-red-400': isError,\r\n }),\r\n }\r\n case InputTheme.navigationBar:\r\n return {\r\n input: classnames(\r\n 'border bg-transparent disabled:border-gray-700 disabled:bg-gray-700 disabled:text-gray-400',\r\n {\r\n 'border-gray-100 dark:border-gray-600 text-gray-750 dark:text-gray-50':\r\n !isError && !FinvizSettings.hasUserPremium,\r\n 'border-gray-600 text-gray-50': !isError && FinvizSettings.hasUserPremium,\r\n 'border-red-400': isError,\r\n }\r\n ),\r\n icon: classnames({\r\n 'text-gray-500': !isError,\r\n 'text-red-400': isError,\r\n }),\r\n }\r\n default:\r\n return {\r\n input: classnames(\r\n 'border', // Base styles\r\n 'bg-white disabled:bg-gray-50 disabled:text-gray-500', // Light\r\n 'dark:bg-gray-800 dark:disabled:bg-gray-700 dark:disabled:text-gray-400', // Dark\r\n {\r\n 'border-gray-100 hover:border-gray-300 focus:border-blue-400 hover:focus:border-blue-400 disabled:hover:border-gray-100 dark:border-gray-600 dark:hover:border-gray-400 dark:focus:border-blue-400 dark:hover:focus:border-blue-400 dark:disabled:border-gray-700':\r\n !isError,\r\n 'border-red-400': isError,\r\n }\r\n ),\r\n icon: classnames({\r\n 'text-gray-300 group-focus-within:text-blue-400 dark:text-gray-500': !isError,\r\n 'text-red-400': isError,\r\n }),\r\n }\r\n }\r\n}\r\n\r\ntype OmitNativeProps = Omit, 'label' | 'size'>\r\n\r\nexport interface InputProps {\r\n /**\r\n * Label which is rendered above the input\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Optional label layout switch\r\n */\r\n isHorizontalLabel?: boolean\r\n\r\n /**\r\n * Optional label className override\r\n */\r\n labelClassName?: string\r\n\r\n /**\r\n * Theme for the input\r\n *\r\n * @default light\r\n */\r\n theme?: keyof typeof InputTheme\r\n\r\n /**\r\n * Input size. This setting is ignored on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof InputSize\r\n\r\n /**\r\n * Border radius of the input\r\n *\r\n * @default regular\r\n */\r\n rounding?: keyof typeof InputRounding\r\n\r\n /**\r\n * Hide value stepper for number inputs\r\n */\r\n showNumberStepper?: boolean\r\n\r\n /**\r\n * Element to display on left the side of the input or name of the icon\r\n */\r\n leftContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Element to display on right the side of the input or name of the icon\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Additional class names for the input\r\n */\r\n inputClass?: string\r\n\r\n /**\r\n * Error label to display under the input\r\n */\r\n error?: ReactNode\r\n\r\n /**\r\n * Additional info to display under the input\r\n */\r\n caption?: ReactNode\r\n\r\n /**\r\n * Disables setting text size to 16px on mobile. Only use for pages which aren’t\r\n * responsive\r\n */\r\n isMobileStyleEnabled?: boolean\r\n}\r\n\r\nexport type InputHTMLProps = OmitNativeProps\r\n\r\nexport type InputComponentProps = InputProps & InputHTMLProps\r\n\r\nfunction InputComponent(\r\n {\r\n label,\r\n isHorizontalLabel,\r\n labelClassName,\r\n size = 'regular',\r\n theme = 'light',\r\n rounding = 'regular',\r\n type,\r\n showNumberStepper = type === 'number',\r\n leftContent,\r\n rightContent,\r\n inputClass,\r\n error,\r\n caption,\r\n className,\r\n isMobileStyleEnabled = true,\r\n ...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 * 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\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 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 && value !== 0) 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 layout switch\r\n */\r\n isHorizontalLabel?: boolean\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 isHorizontalLabel,\r\n value,\r\n items = [],\r\n onChange,\r\n labelClassName,\r\n labelTitleClassName,\r\n 'aria-label': ariaLabel,\r\n // Button\r\n theme,\r\n buttonContent,\r\n placeholder = 'Select value',\r\n // Popover\r\n popoverState,\r\n listProps,\r\n isNativeMobileSelect = true,\r\n hasPopoverViewportHeightLimit = false,\r\n hasPopoverButtonWidthLimit = true,\r\n children,\r\n ...props\r\n}: StatelessSelectProps) {\r\n const { selectedIndex, onItemChange } = useSelect(popoverState, value, items, (item) => onChange?.(item, name!))\r\n const showMobileSelect = isNativeMobileSelect && isMobile()\r\n\r\n /** Items can have `href` and be router Links. We need a way to account for this in native select */\r\n const isInRouterContext = useInRouterContext()\r\n const NativeSelectComponent = isInRouterContext ? NativeSelectInRouterContext : NativeSelect\r\n\r\n return (\r\n \r\n \r\n {buttonContent ?? items[selectedIndex!]?.label ?? placeholder}\r\n \r\n {showMobileSelect ? (\r\n
\r\n }\r\n buttonContent={getSelectedTimeframeLabel()}\r\n data-testid={`chart-${chartIndex}-timeframes-select`}\r\n hasPopoverViewportHeightLimit\r\n isNativeMobileSelect={false}\r\n hasPopoverButtonWidthLimit={false}\r\n listProps={selectWithTooltipListProps}\r\n >\r\n {timeFrameGroups.flatMap(({ timeframes }, groupIndex) => [\r\n ,\r\n ...timeframes.map((item) => {\r\n const isIconButtonActive = favoriteTimeframes.includes(item.value)\r\n let linkProps = {}\r\n if (item.href) {\r\n linkProps = {\r\n as: Link,\r\n to: item.href,\r\n reloadDocument: !!item.withReload,\r\n }\r\n }\r\n return (\r\n ) => {\r\n ev.stopPropagation()\r\n ev.preventDefault()\r\n onFavoriteTimeframeToggle(item)\r\n }}\r\n className={classNames('group -mr-2', {\r\n 'text-gray-300': !isIconButtonActive,\r\n 'text-yellow-200': isIconButtonActive,\r\n })}\r\n >\r\n \r\n \r\n \r\n ) : undefined\r\n }\r\n >\r\n {item.label}\r\n \r\n )\r\n }),\r\n ])}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Link } from 'react-router-dom'\r\n\r\nimport { useElementMeasure } from '../../hooks/use-element-measure'\r\nimport { BoxRounding } from '../box'\r\nimport { Button, ButtonPadding, ButtonProps, ButtonSize, ButtonSizeType } from '../button'\r\nimport { DateRangeBaseOption, DateRangeSelect } from './daterange-select'\r\nimport { LabelWithDelayedSpinner } from './label-with-delayed-spinner'\r\nimport { TimeframeBaseOption, TimeframeSelect } from './timeframe-select'\r\n\r\ninterface Props {\r\n isPremium?: boolean\r\n chartIndex?: number\r\n compactViewMaxBreakpointPx?: number\r\n timeFrameGroups: Array<{ label: string; timeframes: TimeFrame[] }>\r\n dateRangeGroups: Array<{ label?: string; dateRanges: DateRange[] }>\r\n selectedTimeframe: string\r\n selectedDateRange: string | null\r\n onTimeframeSelect: (value: TimeFrame) => void\r\n onDateRangeSelect: (value: DateRange) => void\r\n favoriteTimeframes: string[]\r\n onFavoriteTimeframeToggle: (value: TimeFrame) => void\r\n size?: ButtonSizeType\r\n loadingTimeframe?: string\r\n rounding?: keyof typeof BoxRounding\r\n isDateRangeAvailable?: boolean\r\n containerElement?: HTMLElement\r\n className?: string\r\n isFavoritesEnabled?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n isTimeframeSelectEnabled?: boolean\r\n isCompactOnly?: boolean\r\n theme?: ButtonProps['theme']\r\n}\r\n\r\nfunction getTimeframeChipElementId({ timeframe, chartIndex }: { timeframe: string; chartIndex: number }) {\r\n return `${chartIndex}-${timeframe}`\r\n}\r\n\r\nfunction getButtonPadding(size: ButtonSize): keyof typeof ButtonPadding {\r\n switch (size) {\r\n case ButtonSize.small:\r\n case ButtonSize.regular:\r\n return 'small'\r\n case ButtonSize.medium:\r\n return 'regular'\r\n case ButtonSize.large:\r\n return 'medium'\r\n case ButtonSize.none:\r\n return 'none'\r\n }\r\n}\r\n\r\nexport function TimeframeBar({\r\n isPremium = FinvizSettings.hasUserPremium,\r\n chartIndex = 0,\r\n compactViewMaxBreakpointPx = 400,\r\n timeFrameGroups,\r\n dateRangeGroups,\r\n selectedTimeframe,\r\n selectedDateRange,\r\n favoriteTimeframes,\r\n loadingTimeframe,\r\n onTimeframeSelect,\r\n onDateRangeSelect,\r\n onFavoriteTimeframeToggle,\r\n size,\r\n rounding = 'regular',\r\n isDateRangeAvailable = true,\r\n containerElement,\r\n className,\r\n isFavoritesEnabled = true,\r\n isScrollIntoViewEnabled = true,\r\n isTimeframeSelectEnabled,\r\n isCompactOnly = false,\r\n theme,\r\n}: Props) {\r\n const [scrollWrapperElement, setScrollWrapperElement] = React.useState(null)\r\n const [timeframeButtonsScrollLocation, setTimeframeButtonsScrollLocation] = React.useState({\r\n isOnLeftEdge: true,\r\n isOnRightEdge: true,\r\n })\r\n const { setElementRef, elementWidth } = useElementMeasure(containerElement)\r\n const flatTimeframes = React.useMemo(() => timeFrameGroups.flatMap(({ timeframes }) => timeframes), [timeFrameGroups])\r\n\r\n const timeframesInExpandedPanel = React.useMemo(\r\n () =>\r\n isFavoritesEnabled\r\n ? flatTimeframes.filter(({ value }) => value === selectedTimeframe || favoriteTimeframes.includes(value))\r\n : flatTimeframes,\r\n [flatTimeframes, selectedTimeframe, favoriteTimeframes, isFavoritesEnabled]\r\n )\r\n\r\n const isCompactView =\r\n isCompactOnly || elementWidth < compactViewMaxBreakpointPx || timeframesInExpandedPanel.length <= 1\r\n const checkTimeframeWrapperScrollPosition = React.useCallback(() => {\r\n if (scrollWrapperElement) {\r\n const isOnLeftEdge = scrollWrapperElement.scrollLeft === 0\r\n const isOnRightEdge =\r\n Math.ceil(scrollWrapperElement.offsetWidth + scrollWrapperElement.scrollLeft) >=\r\n scrollWrapperElement.scrollWidth\r\n\r\n if (\r\n timeframeButtonsScrollLocation.isOnLeftEdge !== isOnLeftEdge ||\r\n timeframeButtonsScrollLocation.isOnRightEdge !== isOnRightEdge\r\n ) {\r\n setTimeframeButtonsScrollLocation({ isOnLeftEdge, isOnRightEdge })\r\n }\r\n }\r\n }, [timeframeButtonsScrollLocation, scrollWrapperElement])\r\n\r\n React.useEffect(() => {\r\n checkTimeframeWrapperScrollPosition()\r\n }, [checkTimeframeWrapperScrollPosition, scrollWrapperElement, elementWidth])\r\n\r\n React.useEffect(() => {\r\n if (!isCompactView && isScrollIntoViewEnabled) {\r\n const timeframeElement = document.getElementById(\r\n getTimeframeChipElementId({ chartIndex, timeframe: selectedTimeframe })\r\n )\r\n\r\n if (timeframeElement && scrollWrapperElement) {\r\n const leftOffset =\r\n timeframeElement.offsetLeft + timeframeElement.clientWidth / 2 - scrollWrapperElement.clientWidth / 2\r\n\r\n scrollWrapperElement.scrollTo(Math.max(0, Math.min(leftOffset, scrollWrapperElement.scrollWidth)), 0)\r\n }\r\n }\r\n }, [isCompactView, chartIndex, selectedTimeframe, elementWidth, isScrollIntoViewEnabled, scrollWrapperElement])\r\n\r\n return (\r\n \r\n {(isTimeframeSelectEnabled ?? isFavoritesEnabled) && (\r\n
\r\n \r\n
\r\n )}\r\n {!isCompactView && (\r\n
\r\n \r\n {\r\n /*\r\n * Vertical scrolling doesn't scroll horizontally by default (it's possible when holding shift)\r\n * When using touchpad we may get values in both delatX and deltaY, so if someone's scrolling horizontally we don't want to do anything\r\n * but if they are scrolling vertically (deltaY > deltaX) we want to scroll horizontally the value they would nativally scroll in vertical direction\r\n * */\r\n const absDx = Math.abs(event.deltaX)\r\n const absDy = Math.abs(event.deltaY)\r\n if (absDy > absDx) {\r\n event.currentTarget.scrollLeft += event.deltaY\r\n }\r\n }}\r\n >\r\n {timeframesInExpandedPanel.map((timeframe) => {\r\n let linkProps = {}\r\n if (timeframe.href) {\r\n linkProps = {\r\n as: Link,\r\n to: timeframe.href,\r\n reloadDocument: timeframe.withReload ?? !isPremium,\r\n onClick: () => onTimeframeSelect(timeframe),\r\n }\r\n } else {\r\n linkProps = {\r\n onClick: (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n onTimeframeSelect(timeframe)\r\n },\r\n }\r\n }\r\n return (\r\n \r\n \r\n \r\n )\r\n })}\r\n
\r\n \r\n \r\n )}\r\n {isDateRangeAvailable && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { type To } from 'react-router-dom'\r\n\r\nimport { decodeQueryString, encodeQueryString } from '../../../app/queryString'\r\nimport { SpecificChartFunctionality } from '../../../app/shared/chartLayoutConfig'\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { DateRangeType, Instrument } from '../../types'\r\nimport { CUSTOM_DATE_RANGE, CustomDateRangePrefixEnum, DATE_RANGE_PREFIX_DELMITER } from './custom-date-range-utils'\r\n\r\ninterface ITimeFrame {\r\n value: TIMEFRAME | 'intraday'\r\n label: string\r\n labelShort: string\r\n labelPageTitle?: string\r\n}\r\n\r\nexport interface ITimeframeGroup {\r\n label: string\r\n timeframes: ITimeFrame[]\r\n}\r\n\r\ninterface IDateRange {\r\n value: string\r\n label: string\r\n timeframe?: TIMEFRAME\r\n}\r\n\r\nexport interface IRangeGroup {\r\n label?: string\r\n dateRanges: IDateRange[]\r\n}\r\n\r\nexport const generateTimeframeGroups = (isPremium = true): ITimeframeGroup[] => {\r\n const premiumTimeframes: ITimeframeGroup[] = [\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.i1, label: '1 Minute', labelShort: '1M' },\r\n { value: TIMEFRAME.i2, label: '2 Minutes', labelShort: '2M' },\r\n { value: TIMEFRAME.i3, label: '3 Minutes', labelShort: '3M' },\r\n { value: TIMEFRAME.i5, label: '5 Minutes', labelShort: '5M' },\r\n { value: TIMEFRAME.i10, label: '10 Minutes', labelShort: '10M' },\r\n { value: TIMEFRAME.i15, label: '15 Minutes', labelShort: '15M' },\r\n { value: TIMEFRAME.i30, label: '30 Minutes', labelShort: '30M' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.h, label: '1 Hour', labelShort: '1H', labelPageTitle: 'Hourly' },\r\n { value: TIMEFRAME.h2, label: '2 Hours', labelShort: '2H' },\r\n { value: TIMEFRAME.h4, label: '4 Hours', labelShort: '4H' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'D', labelPageTitle: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'W', labelPageTitle: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'M', labelPageTitle: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n const freeTimeframes = [\r\n {\r\n // intradayTimeframe is only for non premium users used as redirect to elite subscription\r\n label: '',\r\n timeframes: [{ value: 'intraday' as const, label: 'Intraday', labelShort: 'Intraday' }],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n return isPremium ? premiumTimeframes : freeTimeframes\r\n}\r\n\r\nexport function getTimeframeGroups(isPremium: boolean) {\r\n return generateTimeframeGroups(isPremium)\r\n}\r\n\r\nexport const generateDateRangeGroups = ({\r\n isPremium,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n instrument: Instrument\r\n}): IRangeGroup[] => {\r\n const isStock = instrument === Instrument.Stock\r\n const rangeGroups: Array<{ label?: string; dateRanges: IDateRange[] }> = [\r\n {\r\n label: 'Days',\r\n dateRanges: [\r\n { value: DateRangeType.d1, label: '1 Day', timeframe: isStock ? TIMEFRAME.i1 : TIMEFRAME.i5 },\r\n { value: DateRangeType.d5, label: '5 Days', timeframe: isStock ? TIMEFRAME.i5 : TIMEFRAME.i30 },\r\n ],\r\n },\r\n {\r\n label: 'Months',\r\n dateRanges: [\r\n { value: DateRangeType.m1, label: '1 Month', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m3, label: '3 Months', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m6, label: '6 Months', timeframe: TIMEFRAME.d },\r\n ],\r\n },\r\n {\r\n label: 'Years',\r\n dateRanges: [\r\n { value: DateRangeType.ytd, label: 'Year to Date', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y1, label: '1 Year', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y2, label: '2 Years', timeframe: TIMEFRAME.w },\r\n { value: DateRangeType.y5, label: '5 Years', timeframe: isPremium ? TIMEFRAME.w : TIMEFRAME.m },\r\n { value: DateRangeType.max, label: 'Max', timeframe: TIMEFRAME.m },\r\n ],\r\n },\r\n ]\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroups({\r\n isPremium,\r\n customRange,\r\n isCustomAvailable = true,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n customRange?: string\r\n isCustomAvailable?: boolean\r\n instrument: Instrument\r\n}) {\r\n const rangeGroups = generateDateRangeGroups({ isPremium, instrument })\r\n\r\n if (isPremium && isCustomAvailable !== false) {\r\n const [dateRangePrefix] = customRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n rangeGroups.push({\r\n dateRanges: [\r\n {\r\n value:\r\n customRange && Object.values(CustomDateRangePrefixEnum).includes(dateRangePrefix)\r\n ? customRange\r\n : CUSTOM_DATE_RANGE,\r\n label: 'Custom',\r\n },\r\n ],\r\n })\r\n }\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroupsWithHref({\r\n isPremium,\r\n customRange,\r\n generatePath,\r\n withReload,\r\n isCustomAvailable,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n isCustomAvailable?: boolean\r\n customRange?: string\r\n withReload?: boolean\r\n instrument: Instrument\r\n generatePath: (dateRange: IDateRange) => To\r\n}) {\r\n return getDateRangeGroups({\r\n isPremium,\r\n isCustomAvailable,\r\n customRange,\r\n instrument,\r\n }).map((dateRangeGroup: IRangeGroup) => ({\r\n label: dateRangeGroup.label,\r\n dateRanges: dateRangeGroup.dateRanges.map((dateRange) => ({\r\n ...dateRange,\r\n href:\r\n !isPremium || Object.values(DateRangeType).includes(dateRange.value as DateRangeType)\r\n ? generatePath(dateRange)\r\n : undefined,\r\n withReload: withReload ?? !isPremium,\r\n })),\r\n }))\r\n}\r\n\r\nconst FREE_PERIODS_STOCK = ['d', 'w', 'm']\r\n\r\nexport function generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname,\r\n timeframe,\r\n dateRange,\r\n utmCampaign,\r\n freeTimeframes = FREE_PERIODS_STOCK,\r\n dateRangeQueryKey = 'r',\r\n}: {\r\n isPremium: boolean\r\n pathname: string\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n utmCampaign?: string\r\n freeTimeframes?: string[]\r\n dateRangeQueryKey?: string\r\n}) {\r\n if (isPremium || freeTimeframes.includes(timeframe)) {\r\n return {\r\n pathname,\r\n search: `?${encodeQueryString({\r\n ...decodeQueryString(),\r\n i: undefined,\r\n p: timeframe,\r\n [dateRangeQueryKey]: dateRange ?? undefined,\r\n })}`,\r\n }\r\n }\r\n\r\n return {\r\n pathname: '/elite.ashx',\r\n search: `?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign || window.location.pathname,\r\n })}`,\r\n }\r\n}\r\n\r\nexport const timeframeUtm: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-timeframe',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe',\r\n}\r\n\r\nexport const daterangeUtm: Partial> = {\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe-daterange',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe-daterange',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe-daterange',\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { generateDateRangeGroups } from './utils'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// charts: app/utils/chart-date-range-utils.ts\r\n// *********************************\r\n\r\nexport enum CustomDateRangePrefixEnum {\r\n Range = 'range',\r\n Prev = 'prev',\r\n}\r\n\r\nexport const CUSTOM_DATE_RANGE = 'custom'\r\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\r\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\r\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\r\n\r\nexport function getParsedDateRange(dateRange?: string) {\r\n return dateRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n}\r\n\r\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\r\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\r\n const dateFrom = dateFromString ? new Date(dateFromString) : null\r\n const dateTo = dateToString ? new Date(dateToString) : null\r\n return {\r\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\r\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\r\n }\r\n }\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\r\n\r\n if ([years, months, days].some(Number.isNaN)) {\r\n return { start: null, end: null }\r\n }\r\n\r\n return {\r\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\r\n end: anchorDate,\r\n }\r\n }\r\n\r\n return { start: null, end: anchorDate }\r\n}\r\n\r\n// **************END**************\r\n// Functions below don't need to be\r\n// in sync with Website repository\r\n// *******************************\r\n\r\nconst DAYS_IN_YEAR = 365\r\n\r\nexport function getCustomStartEndDateRangeUrlParam({ start, end }: { start: Date | null; end: Date | null }) {\r\n const startString = start ? formatDateToStringUS(start) : ''\r\n const endString = end ? formatDateToStringUS(end) : ''\r\n\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Range,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n startString,\r\n CUSTOM_DATE_RANGE_DELIMITER,\r\n endString,\r\n ]\r\n\r\n return stringParts.join('').replace(/\\//g, '-')\r\n}\r\n\r\nexport function getPrevPeriodDateRangeUrlParam({\r\n years,\r\n months,\r\n days,\r\n}: {\r\n years: number\r\n months: number\r\n days: number\r\n}) {\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Prev,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n years,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n months,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n days,\r\n ]\r\n\r\n return stringParts.join('')\r\n}\r\n\r\nexport function getTimeframeForDateRangeType({\r\n dateRange,\r\n isPremium = true,\r\n instrument,\r\n}: {\r\n dateRange: string\r\n isPremium?: boolean\r\n instrument: Instrument\r\n}) {\r\n const dateRanges = generateDateRangeGroups({ isPremium, instrument }).flatMap(({ dateRanges }) => dateRanges)\r\n return dateRanges.find(({ value }) => value === dateRange)?.timeframe ?? null\r\n}\r\n\r\nexport function getTimeframeFromDateRange({\r\n dateRange,\r\n anchorDate,\r\n instrument,\r\n isPremium,\r\n}: {\r\n dateRange: string\r\n anchorDate: Date\r\n instrument: Instrument\r\n isPremium: boolean\r\n}) {\r\n const dateRangeTimeframe = getTimeframeForDateRangeType({ dateRange, instrument })\r\n if (dateRangeTimeframe) {\r\n return dateRangeTimeframe\r\n }\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n const startNyTime = start ?? new Date(0)\r\n const startToReferenceDateNumOfDays = dateFns.differenceInCalendarDays(anchorDate, startNyTime) + 1\r\n const rangeNumOfDays = dateFns.differenceInCalendarDays(end ?? anchorDate, startNyTime) + 1\r\n /**\r\n * DB_BARS_LIMIT - code below is dependent on amount of data we store for specific timeframes\r\n * Search DB_BARS_LIMIT in the project to find other places with such code.\r\n */\r\n if (rangeNumOfDays > 6 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 4 * DAYS_IN_YEAR) {\r\n return isPremium ? TIMEFRAME.w : TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 1.5 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.w\r\n }\r\n\r\n // Keep these values in sync with values in FetchQuoteIntraday in quote.cs\r\n if (instrument === Instrument.Stock) {\r\n if (rangeNumOfDays <= 1 && startToReferenceDateNumOfDays <= 11) {\r\n return TIMEFRAME.i1\r\n }\r\n\r\n if (rangeNumOfDays <= 5 && startToReferenceDateNumOfDays <= 16) {\r\n return TIMEFRAME.i5\r\n }\r\n\r\n if (rangeNumOfDays <= 7 && startToReferenceDateNumOfDays <= 200) {\r\n return TIMEFRAME.i30\r\n }\r\n } else {\r\n if (startToReferenceDateNumOfDays <= 2) {\r\n return TIMEFRAME.i5\r\n }\r\n if (startToReferenceDateNumOfDays <= 7) {\r\n return TIMEFRAME.i30\r\n }\r\n }\r\n\r\n return TIMEFRAME.d\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { Button } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { DatePicker } from '../date-picker'\r\nimport { Delayed } from '../delayed'\r\nimport { Dialog, DialogBody, DialogFooter, DialogHeader } from '../dialog'\r\nimport { Input } from '../input'\r\nimport { Spinner } from '../spinner'\r\nimport {\r\n CustomDateRangePrefixEnum,\r\n getCustomStartEndDateRangeUrlParam,\r\n getParsedDateRange,\r\n getPrevPeriodDateRangeUrlParam,\r\n parseCustomDateRangeUrlParam,\r\n} from './custom-date-range-utils'\r\n\r\nconst DATA_YEAR_START = 1980\r\nconst DATE_PICKER_MIN_DATE = new Date(`01/01/${DATA_YEAR_START}`)\r\nconst YEARS_MAX_VALUE = new Date().getFullYear() - DATA_YEAR_START\r\n\r\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button', className: 'flex-1', contentClass: 'text-center' } as const\r\n\r\nexport enum CustomRangeType {\r\n StartEnd,\r\n Manual,\r\n}\r\n\r\ninterface StartEndRange {\r\n kind: CustomRangeType.StartEnd\r\n start: Date | null\r\n end: Date | null\r\n}\r\n\r\ninterface ManualRange {\r\n kind: CustomRangeType.Manual\r\n days?: number\r\n months?: number\r\n years?: number\r\n}\r\n\r\nexport type CustomDateRangeType = StartEndRange | ManualRange\r\n\r\ninterface DialogContentProps {\r\n /**\r\n * Dialog state\r\n */\r\n dialogState: any\r\n dateRange?: string\r\n anchorDate: Date\r\n onDialogSubmit: (args: { dateRange: string | null }) => void\r\n isFetching?: boolean\r\n}\r\n\r\nconst DEFAULT_MANUAL_RANGE: ManualRange = {\r\n kind: CustomRangeType.Manual,\r\n days: 0,\r\n months: 0,\r\n years: 0,\r\n}\r\n\r\nconst DEFAULT_START_END_RANGE: StartEndRange = {\r\n kind: CustomRangeType.StartEnd,\r\n start: null,\r\n end: null,\r\n}\r\n\r\nfunction isValidManualRangeState({ years = 0, months = 0, days = 0 }: ManualRange) {\r\n return years + months + days > 0\r\n}\r\n\r\nfunction isValidStartEndRangeState({ start, end }: StartEndRange) {\r\n return !!(start || end)\r\n}\r\n\r\nfunction getDefaultSelectedTab(dateRange?: string) {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return CustomRangeType.StartEnd\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n return CustomRangeType.Manual\r\n }\r\n }\r\n return CustomRangeType.StartEnd\r\n}\r\n\r\nfunction getDefaultSelectedDate({\r\n dateRange,\r\n anchorDate,\r\n}: {\r\n dateRange?: string\r\n anchorDate: Date\r\n}): CustomDateRangeType {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return { kind: CustomRangeType.StartEnd, start, end }\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev && start && end) {\r\n const { years, months, days } = dateFns.intervalToDuration({\r\n start: dateFns.sub(start, { days: 1 }),\r\n end,\r\n })\r\n return { kind: CustomRangeType.Manual, years, months, days }\r\n }\r\n }\r\n\r\n return DEFAULT_START_END_RANGE\r\n}\r\n\r\nexport function CustomDateRange({\r\n dialogState,\r\n dateRange,\r\n anchorDate,\r\n onDialogSubmit,\r\n isFetching,\r\n}: DialogContentProps) {\r\n const [selectedTab, setSelectedTab] = React.useState(getDefaultSelectedTab(dateRange))\r\n\r\n const [state, setState] = React.useState(getDefaultSelectedDate({ dateRange, anchorDate }))\r\n\r\n const { current: onChange } = React.useRef((kind: CustomRangeType, newValue: Partial) => {\r\n setState((prevState) => {\r\n if (kind === CustomRangeType.Manual) {\r\n const defaults = prevState?.kind === CustomRangeType.Manual ? prevState : DEFAULT_MANUAL_RANGE\r\n return { ...defaults, ...newValue } as ManualRange\r\n }\r\n if (kind === CustomRangeType.StartEnd) {\r\n const defaults = prevState?.kind === CustomRangeType.StartEnd ? prevState : DEFAULT_START_END_RANGE\r\n\r\n const newState = { ...defaults, ...newValue }\r\n if (newState.start && newState.end && newState.start.getTime() > newState.end.getTime()) {\r\n const newEnd = new Date(newState.start.getTime())\r\n newState.start = newState.end\r\n newState.end = newEnd\r\n }\r\n return newState\r\n }\r\n return prevState\r\n })\r\n })\r\n\r\n const handleSubmit = (ev: React.FormEvent) => {\r\n ev.preventDefault()\r\n\r\n let dateRange = null\r\n\r\n if (state?.kind === CustomRangeType.StartEnd && isValidStartEndRangeState(state)) {\r\n dateRange = getCustomStartEndDateRangeUrlParam({ start: state.start, end: state.end })\r\n } else if (state?.kind === CustomRangeType.Manual && isValidManualRangeState(state)) {\r\n dateRange = getPrevPeriodDateRangeUrlParam({\r\n days: state.days ?? 0,\r\n months: state.months ?? 0,\r\n years: state.years ?? 0,\r\n })\r\n }\r\n\r\n onDialogSubmit({ dateRange })\r\n }\r\n\r\n const isAbsolute = state?.kind === CustomRangeType.StartEnd\r\n const fromDate = isAbsolute ? state.start : DEFAULT_START_END_RANGE.start\r\n const toDate = isAbsolute ? state.end : DEFAULT_START_END_RANGE.end\r\n\r\n const manualRange = {\r\n ...DEFAULT_MANUAL_RANGE,\r\n ...(state?.kind === CustomRangeType.Manual ? state : {}),\r\n }\r\n\r\n return (\r\n \r\n \r\n Custom Date Range\r\n \r\n
\r\n \r\n \r\n setSelectedTab(CustomRangeType.StartEnd)}\r\n >\r\n Start / End\r\n \r\n setSelectedTab(CustomRangeType.Manual)}\r\n >\r\n Range\r\n \r\n \r\n\r\n {selectedTab === CustomRangeType.StartEnd ? (\r\n
\r\n onChange(CustomRangeType.StartEnd, { start })}\r\n >\r\n \r\n \r\n onChange(CustomRangeType.StartEnd, { end })}\r\n >\r\n \r\n \r\n
\r\n ) : (\r\n
\r\n ) =>\r\n onChange(CustomRangeType.Manual, { years: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { months: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { days: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n
\r\n )}\r\n
\r\n \r\n
\r\n \r\n setState(state.kind === CustomRangeType.Manual ? DEFAULT_MANUAL_RANGE : DEFAULT_START_END_RANGE)\r\n }\r\n >\r\n Reset\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\nimport { To, useNavigate } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { useDialogState } from '../dialog'\r\nimport { getTimeframeFromDateRange } from './custom-date-range-utils'\r\n\r\ninterface IPathForTimeframeDateRangeProps {\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n ticker?: string\r\n}\r\n\r\ninterface IUseCustomDateRangeDialogSubmitProps {\r\n anchorDate?: Date\r\n instrument?: Instrument\r\n shouldReloadOnNavigate?: boolean\r\n pathGenerator?: ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\r\n pathname: string\r\n search: string\r\n }\r\n}\r\n\r\nexport function useCustomDateRangeDialog({\r\n anchorDate,\r\n instrument,\r\n pathGenerator,\r\n shouldReloadOnNavigate = false,\r\n}: IUseCustomDateRangeDialogSubmitProps) {\r\n const navigate = useNavigate()\r\n const customDateRangeDialogState = useDialogState()\r\n\r\n const isPremium = FinvizSettings.hasUserPremium\r\n\r\n const handleDateRangeSelect = React.useCallback(\r\n (\r\n { value, timeframe, href }: { value: string; timeframe?: TIMEFRAME; href?: To },\r\n callback?: ({ value, timeframe, href }: { value: string; timeframe: TIMEFRAME; href?: To }) => void\r\n ) => {\r\n if (!timeframe) {\r\n if (isPremium) {\r\n customDateRangeDialogState.show()\r\n }\r\n return\r\n }\r\n\r\n if (!href && pathGenerator) {\r\n const path = pathGenerator({ timeframe, dateRange: value })\r\n if (shouldReloadOnNavigate) {\r\n window.location.href = `${path.pathname}?${path.search}`\r\n } else {\r\n navigate(path)\r\n }\r\n }\r\n\r\n callback?.({ value, timeframe, href })\r\n },\r\n [navigate, customDateRangeDialogState, isPremium, pathGenerator, shouldReloadOnNavigate]\r\n )\r\n\r\n const getDateRangeTimeframe = React.useCallback(\r\n (dateRange: string | null) => {\r\n if (!anchorDate || !instrument || !dateRange) return null\r\n\r\n return {\r\n value: dateRange,\r\n timeframe: getTimeframeFromDateRange({\r\n dateRange: dateRange!,\r\n anchorDate,\r\n isPremium,\r\n instrument,\r\n }),\r\n }\r\n },\r\n [anchorDate, instrument, isPremium]\r\n )\r\n\r\n const onDialogSubmit = React.useCallback(\r\n ({ value: dateRange, timeframe: newTimeframe }: { value: string; timeframe: TIMEFRAME }) => {\r\n handleDateRangeSelect({\r\n value: dateRange,\r\n timeframe: newTimeframe,\r\n })\r\n customDateRangeDialogState.hide()\r\n },\r\n // We only want `customDateRangeDialogState.hide`, not the whole dialog\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [customDateRangeDialogState.hide, handleDateRangeSelect]\r\n )\r\n\r\n return { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { useSyncLocalStorage } from '../../hooks/use-sync-local-storage'\r\n\r\ntype FavoriteTimeframesMap = { [K in TIMEFRAME | 'intraday']?: boolean }\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS = {\r\n [TIMEFRAME.i1]: true,\r\n [TIMEFRAME.i2]: false,\r\n [TIMEFRAME.i3]: true,\r\n [TIMEFRAME.i5]: true,\r\n [TIMEFRAME.i10]: false,\r\n [TIMEFRAME.i15]: true,\r\n [TIMEFRAME.i30]: true,\r\n [TIMEFRAME.h]: true,\r\n [TIMEFRAME.h2]: false,\r\n [TIMEFRAME.h4]: false,\r\n [TIMEFRAME.d]: true,\r\n [TIMEFRAME.w]: true,\r\n [TIMEFRAME.m]: true,\r\n}\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS_FREE = {\r\n ...TIMEFRAME_FAVORITE_DEFAULTS,\r\n intraday: true,\r\n}\r\n\r\nconst LOCAL_STORAGE_KEY = 'favoriteTimeframesMap'\r\n\r\nexport function useFavoriteTimeframes(isPremium = true) {\r\n const { state, setState } = useSyncLocalStorage(\r\n LOCAL_STORAGE_KEY,\r\n isPremium ? TIMEFRAME_FAVORITE_DEFAULTS : TIMEFRAME_FAVORITE_DEFAULTS_FREE\r\n )\r\n\r\n const toggleFavoriteTimeframe = React.useCallback(\r\n (timeframe: TIMEFRAME) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n [timeframe]: !prevState[timeframe],\r\n }))\r\n },\r\n [setState]\r\n )\r\n\r\n const favoriteTimeframes = React.useMemo(\r\n () => Object.keys(state).filter((key) => state[key as keyof FavoriteTimeframesMap]),\r\n [state]\r\n )\r\n\r\n return {\r\n favoriteTimeframes: isPremium ? favoriteTimeframes : Object.keys(TIMEFRAME_FAVORITE_DEFAULTS_FREE),\r\n toggleFavoriteTimeframe,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { getExtendedDialogState } from './dialog'\r\nimport { Input, InputHTMLProps, InputProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipTrigger, useTooltipState } from './tooltip'\r\n\r\ntype TooltipInputProps = InputProps & InputHTMLProps & { isInteractive?: boolean }\r\n\r\nexport interface TooltipInputWrapperProps extends Pick {\r\n children: React.ReactElement\r\n /**\r\n * Tooltip text content\r\n */\r\n tooltipContent?: React.ReactNode\r\n tooltipColor?: keyof typeof TooltipColor\r\n tooltipSettings?: Reakit.TooltipInitialState\r\n}\r\n\r\nfunction TooltipInputWrapper({\r\n children,\r\n tooltipContent,\r\n tooltipColor,\r\n tooltipSettings,\r\n name,\r\n}: TooltipInputWrapperProps) {\r\n const tooltip = useTooltipState({ placement: 'bottom', ...tooltipSettings })\r\n const { isFullyClosed } = getExtendedDialogState(tooltip)\r\n\r\n return (\r\n <>\r\n ev.preventDefault()}\r\n onMouseLeave={(ev) => ev.preventDefault()}\r\n >\r\n {children}\r\n \r\n {tooltipContent && !isFullyClosed && (\r\n \r\n {tooltipContent}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n {\r\n tooltipContent,\r\n tooltipColor,\r\n tooltipSettings,\r\n isInteractive = true,\r\n ...props\r\n }: TooltipInputProps & Omit,\r\n ref: React.ForwardedRef\r\n) {\r\n const input = \r\n\r\n if (!isInteractive) {\r\n return input\r\n }\r\n\r\n return (\r\n \r\n {input}\r\n \r\n )\r\n}\r\n\r\nexport const TooltipInput = React.forwardRef(TooltipInputComponent)\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipColor } from './types'\r\n\r\nexport interface TooltipBoxProps extends Omit, 'ref'> {\r\n /**\r\n * Color of the tooltip. If se to `none`, the tooltip will have default color\r\n * based on light/dark theme\r\n *\r\n * @default 'none'\r\n */\r\n color?: keyof typeof TooltipColor\r\n}\r\n\r\nexport const TooltipBox = React.forwardRef(function TooltipBox(\r\n { color = 'none', ...props }: TooltipBoxProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const tooltipColor = TooltipColor[color]\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n})\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { TooltipArrow } from './tooltip-arrow'\r\nimport { TooltipBox, TooltipBoxProps } from './tooltip-box'\r\n\r\ninterface TooltipProps extends TooltipBoxProps {\r\n /**\r\n * The returned object from `useTooltipState`\r\n */\r\n state: Reakit.TooltipStateReturn\r\n}\r\n\r\nexport function Tooltip({ state, children, color = 'none', ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...tooltipProps }) => (\r\n
\r\n \r\n \r\n \r\n \r\n {children}\r\n \r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\ninterface TooltipButtonProps extends Reakit.TooltipReferenceHTMLProps {\r\n state: Reakit.TooltipStateReturn\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const TooltipTrigger = React.forwardRef(\r\n ({ state, ...props }: TooltipButtonProps, ref: React.ForwardedRef) => (\r\n \r\n {props.children}\r\n \r\n )\r\n)\r\n","import * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\n/**\r\n * Hook which provides state to tooltips\r\n */\r\nexport function useTooltipState(settings?: Reakit.TooltipInitialState) {\r\n return Reakit.useTooltipState({\r\n ...settings,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { TooltipColor } from './types'\r\n\r\ntype PositionMain = 'auto' | 'top' | 'bottom' | 'left' | 'right'\r\ntype PositionSecondary = 'start' | 'end'\r\ntype Placement = PositionMain | `${PositionMain}-${PositionSecondary}`\r\n\r\nconst transformMap: Record = {\r\n auto: '',\r\n top: 'rotateZ(180deg)',\r\n right: 'rotateZ(-90deg)',\r\n bottom: 'rotateZ(360deg)',\r\n left: 'rotateZ(90deg)',\r\n}\r\n\r\ninterface TooltipArrowProps {\r\n color?: keyof typeof TooltipColor\r\n placement: Placement\r\n className?: string\r\n}\r\n\r\n/**\r\n * Custom arrow for the dropdown\r\n */\r\nexport function TooltipArrow({ placement, color = 'none', className }: TooltipArrowProps) {\r\n const positionMain = placement.split('-')[0] as PositionMain\r\n const arrowColor = TooltipColor[color]\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","export enum TooltipColor {\r\n none,\r\n green,\r\n red,\r\n orange,\r\n blue,\r\n dark,\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ComponentProps, ElementType, HTMLProps, PropsWithChildren, ReactNode } from 'react'\r\n\r\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6\r\n\r\ninterface HeadingProps extends HTMLProps {\r\n /**\r\n * Heading level\r\n */\r\n level: HeadingLevel\r\n}\r\n\r\nfunction getHeadingElement(level: HeadingLevel) {\r\n switch (level) {\r\n case 1:\r\n return 'h1'\r\n case 2:\r\n return 'h2'\r\n case 3:\r\n return 'h3'\r\n case 4:\r\n return 'h4'\r\n case 5:\r\n return 'h5'\r\n default:\r\n return 'h6'\r\n }\r\n}\r\n\r\nexport function Heading({ level, children, ...props }: PropsWithChildren) {\r\n return React.createElement(\r\n getHeadingElement(level),\r\n {\r\n ...props,\r\n className: classnames(props.className, 'font-bold', {\r\n 'text-3xl': level === 1,\r\n 'text-2xl': level === 2,\r\n 'text-xl': level === 3,\r\n 'text-sm': level === 5,\r\n 'text-2xs': level === 6,\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface ParagraphProps extends Omit>, 'size' | 'as'> {\r\n /**\r\n * Determines which element the text should render to\r\n *\r\n * @default p\r\n */\r\n as?: ElementType\r\n\r\n /**\r\n * Font size for the paragraph\r\n * - tiny - 10px\r\n * - small - 12px\r\n * - default - 14px\r\n * - medium - 16px\r\n * - large - 18px\r\n *\r\n * @default default\r\n */\r\n size?: 'tiny' | 'small' | 'default' | 'medium' | 'large'\r\n\r\n /**\r\n * Paragraph font weight\r\n */\r\n medium?: boolean\r\n}\r\n\r\nexport function Paragraph({\r\n as = 'p',\r\n size = 'default',\r\n medium,\r\n children,\r\n ...props\r\n}: PropsWithChildren>) {\r\n return React.createElement(\r\n as,\r\n {\r\n ...props,\r\n className: classnames(props.className, {\r\n 'font-medium': medium,\r\n 'text-lg': size === 'large',\r\n 'text-sm': size === 'default',\r\n 'text-2xs': size === 'small',\r\n 'text-3xs': size === 'tiny',\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface LabelProps extends Omit, 'title'> {\r\n title?: ReactNode\r\n titleClassName?: string\r\n isHorizontal?: boolean\r\n}\r\n\r\nexport function Label({ title, titleClassName, isHorizontal, children, ...props }: PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","export const CRYPTO_TICKERS = [\r\n 'BTCUSD',\r\n 'LTCUSD',\r\n 'ETHUSD',\r\n 'XRPUSD',\r\n 'BCHUSD',\r\n 'BTCEUR',\r\n 'LTCEUR',\r\n 'ETHEUR',\r\n 'XRPEUR',\r\n 'BCHEUR',\r\n 'LTCBTC',\r\n 'ETHBTC',\r\n 'XRPBTC',\r\n 'BCHBTC',\r\n]\r\n\r\n// Keep in sync with the copy in Charts repo - app/constants/common.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n","// Copy if this file is in charts repo in app/utils/ folder\r\nimport * as React from 'react'\r\n\r\nexport function useIsMounted() {\r\n const isMountedRef = React.useRef(false)\r\n const getIsMounted = React.useCallback(() => isMountedRef.current, [])\r\n\r\n React.useEffect(() => {\r\n isMountedRef.current = true\r\n return () => {\r\n isMountedRef.current = false\r\n }\r\n }, [])\r\n\r\n return getIsMounted\r\n}\r\n","import debounce from 'lodash.debounce'\r\nimport * as React from 'react'\r\n\r\nimport { useIsMounted } from './use-is-mounted'\r\nimport { useResizeObserver } from './use-resize-observer'\r\n\r\nexport function useElementMeasure(elementOverride: HTMLElement | null = null) {\r\n const ResizeObserver = useResizeObserver()\r\n const getIsMounted = useIsMounted()\r\n const [elementRef, setElementRef] = React.useState(elementOverride)\r\n const [elementWidth, setElementWidth] = React.useState(elementRef?.offsetWidth ?? 0)\r\n const [elementHeight, setElementHeight] = React.useState(elementRef?.offsetHeight ?? 0)\r\n\r\n React.useEffect(() => {\r\n if (!ResizeObserver) {\r\n return\r\n }\r\n\r\n const measureElement = () => {\r\n if (!getIsMounted()) {\r\n return\r\n }\r\n const newElementWidth = elementRef?.offsetWidth\r\n const newElementHeight = elementRef?.offsetHeight\r\n if (newElementWidth !== elementWidth) {\r\n setElementWidth(newElementWidth ?? 0)\r\n }\r\n if (newElementHeight !== elementHeight) {\r\n setElementHeight(newElementHeight ?? 0)\r\n }\r\n }\r\n const measureElementDebounced = debounce(measureElement, 200)\r\n\r\n const resizeObserver = new ResizeObserver((entries) => {\r\n /**\r\n * the reason for requestAnimationFrame is described here https://github.com/quasarframework/quasar/issues/2233\r\n * their approach was mostly to intercept and silence the error but I managed to avoid the error using requestAnimationFrame\r\n * */\r\n window.requestAnimationFrame(() => {\r\n if (Array.isArray(entries) && entries.length > 0) {\r\n measureElementDebounced()\r\n }\r\n })\r\n })\r\n\r\n if (elementRef) {\r\n resizeObserver.observe(elementRef)\r\n }\r\n\r\n measureElement()\r\n\r\n return () => {\r\n measureElementDebounced.cancel()\r\n resizeObserver?.disconnect()\r\n }\r\n }, [ResizeObserver, elementWidth, elementRef, elementHeight, getIsMounted])\r\n\r\n return { setElementRef: elementOverride ? () => {} : setElementRef, elementWidth, elementHeight }\r\n}\r\n","import React from 'react'\r\n\r\nimport { DropdownStateReturn } from '../components/dropdown'\r\nimport { PopoverStateReturn } from '../components/popover'\r\nimport { useWindowSize } from './use-window-size'\r\n\r\ntype Props = {\r\n maxHeightLimit: number\r\n hasViewportHeightLimit: boolean\r\n offsets: [number, number]\r\n state: PopoverStateReturn | DropdownStateReturn\r\n}\r\n\r\nconst MAX_HEIGHT_PROPERTY = '--popover-max-height'\r\nconst POPOVER_HEIGHT_LIMIT_STYLE = {\r\n maxHeight: `calc(var(${MAX_HEIGHT_PROPERTY}) - env(safe-area-inset-bottom))`,\r\n}\r\n\r\n/**\r\n * Limit popover height to be always in viewport is `hasViewportHeightLimit` is true\r\n */\r\nexport function usePopoverMaxHeight({ maxHeightLimit, hasViewportHeightLimit, offsets, state }: Props) {\r\n const { innerHeight } = useWindowSize({ isWatching: state.visible || state.animating })\r\n const buttonElement = state.unstable_referenceRef.current\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !hasViewportHeightLimit) return\r\n\r\n // calculate height\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const [, offsetY] = offsets\r\n let elementMaxHeight = 'auto'\r\n if (state.placement.startsWith('bottom')) {\r\n let height = innerHeight - buttonRect.bottom - offsetY * 2\r\n // when used on pages where is scrollable content, buttonRect.bottom is sometimes negative\r\n // in that case we need to subtract window.scrollY\r\n if (buttonRect.bottom < 0) height -= window.scrollY\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n } else {\r\n const height = buttonRect.top - offsetY * 2\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n }\r\n\r\n // set height\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n popoverWrapper?.style.setProperty(MAX_HEIGHT_PROPERTY, elementMaxHeight)\r\n }, [buttonElement, innerHeight, maxHeightLimit, hasViewportHeightLimit, offsets, state.placement, state.visible])\r\n\r\n return hasViewportHeightLimit ? POPOVER_HEIGHT_LIMIT_STYLE : undefined\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { loadResizeObserverPolyfill } from '../util'\r\n\r\nexport function useResizeObserver() {\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const [ResizeObserver, setResizeObserver] = React.useState(\r\n () => window.ResizeObserver\r\n )\r\n\r\n React.useEffect(() => {\r\n if (typeof ResizeObserver === 'undefined') {\r\n loadResizeObserverPolyfill().then((polyfill) => {\r\n if (!controller.current?.signal.aborted) {\r\n setResizeObserver(() => polyfill)\r\n }\r\n })\r\n }\r\n }, [ResizeObserver])\r\n\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n return ResizeObserver\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SortDirectionValue, SortableValue } from '../types'\r\nimport { sortByColumn } from '../util'\r\n\r\nexport interface SortByShape {\r\n id: IdType\r\n\r\n /**\r\n * Provide value calculation for sort when value is computed in column renderer\r\n */\r\n getValueForSort?: (row: DataType) => SortableValue\r\n}\r\n\r\nexport function isSortByShape(sortBy?: unknown): sortBy is SortByShape {\r\n return sortBy?.hasOwnProperty?.('id') === true\r\n}\r\n\r\n/**\r\n * Default value getter which gets row data by `getValueForSort` defined on the column\r\n * If no sort value getter is provided, it falls back to getting data by column.id or returns the whole row\r\n */\r\nexport function getDefaultValueGetter(column: SortBy) {\r\n return (row: DataType): SortableValue => {\r\n let value = null\r\n\r\n if (isSortByShape(column)) {\r\n if (typeof column.getValueForSort === 'function') value = column.getValueForSort(row)\r\n else if (typeof row === 'object') value = row?.[column.id as keyof typeof row]\r\n } else {\r\n value = row\r\n }\r\n\r\n return (value as SortableValue) ?? null\r\n }\r\n}\r\n\r\nexport function useSortData({\r\n data,\r\n sortBy,\r\n direction,\r\n valueGetter = getDefaultValueGetter,\r\n}: {\r\n data: DataType[]\r\n sortBy: SortBy\r\n direction: SortDirectionValue\r\n valueGetter?: (sortBy: SortBy) => (row: DataType) => SortableValue\r\n}) {\r\n return React.useMemo(\r\n () =>\r\n [...data].sort((a, b) =>\r\n sortByColumn({\r\n a,\r\n b,\r\n direction,\r\n valueGetter: valueGetter(sortBy),\r\n })\r\n ),\r\n [sortBy, data, direction, valueGetter]\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport * as storage from '../services/local-storage'\r\n\r\n/**\r\n * Hook to synchronize localStorage.setItem across all components on the page on all open tabs\r\n */\r\nexport function useSyncLocalStorage(storageKey: string, defaultValue: ValueType) {\r\n const [state, setState] = React.useState(storage.getValue(storageKey, defaultValue))\r\n\r\n React.useEffect(() => {\r\n const subscription = storage.subscribeToChanges(storageKey, defaultValue, setState)\r\n\r\n return () => {\r\n subscription.unsubscribe()\r\n }\r\n }, [storageKey, defaultValue])\r\n\r\n const setValue = React.useCallback(\r\n (valueGetter: React.SetStateAction) => storage.setValue(storageKey, valueGetter, defaultValue),\r\n [defaultValue, storageKey]\r\n )\r\n\r\n return {\r\n state,\r\n setState: setValue,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport * as tracking from '../../app/shared/tracking'\r\n\r\nexport function useTrackPageView(props?: { trackInitial?: boolean; trackAutomatically?: boolean }) {\r\n const { trackInitial = false, trackAutomatically = true } = props ?? {}\r\n const initialRender = React.useRef(trackInitial)\r\n const location = useLocation()\r\n\r\n const handleTrackView = React.useCallback(() => {\r\n tracking.trackPageView({ pathname: location.pathname, query: location.search })\r\n }, [location.pathname, location.search])\r\n\r\n React.useEffect(() => {\r\n if (!trackAutomatically) return\r\n if (initialRender.current) handleTrackView()\r\n initialRender.current = true\r\n }, [trackAutomatically, handleTrackView, trackInitial])\r\n\r\n return handleTrackView\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","import * as React from 'react'\r\nimport { usePopper } from 'react-popper'\r\n\r\nimport { usePopoverMaxHeight } from '../../hooks/use-popover-maxHeight'\r\nimport { Button } from '../button'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { Dropdown, DropdownItem, DropdownSeparator, useDropdownState } from '../dropdown'\r\nimport { ObjectHash } from '../types'\r\n\r\nconst DEFAULT_OFFSETS: [number, number] = [5, 5]\r\n\r\nfunction getVirtualRef(top: number, left: number) {\r\n return {\r\n getBoundingClientRect(): DOMRect {\r\n const rect = {\r\n top: top - window.scrollY,\r\n x: top - window.scrollY,\r\n left: left - window.scrollX,\r\n y: left - window.scrollX,\r\n bottom: top,\r\n right: left,\r\n width: 0,\r\n height: 0,\r\n }\r\n\r\n return {\r\n ...rect,\r\n toJSON: () => rect,\r\n }\r\n },\r\n }\r\n}\r\n\r\nexport interface IContextMenuOption {\r\n type?: never\r\n id: string\r\n label: React.ReactNode\r\n onClick?: () => void\r\n options?: ContextMenuItem[]\r\n gtag?: ObjectHash\r\n}\r\n\r\ninterface IContextMenuDivider {\r\n type: 'divider'\r\n label?: React.ReactNode\r\n}\r\n\r\nexport type ContextMenuItem = IContextMenuOption | IContextMenuDivider\r\n\r\ninterface ContextMenuProps {\r\n /**\r\n * Top coordinate of the click\r\n */\r\n top: number\r\n\r\n /**\r\n * Left coordinate of the click\r\n */\r\n left: number\r\n\r\n /**\r\n * Can limit the max height of the menu\r\n *\r\n * @default undefined\r\n */\r\n menuMaxHeight?: number\r\n\r\n /**\r\n * Items visible in the menu\r\n */\r\n items: ContextMenuItem[]\r\n\r\n /**\r\n * Callback to hide the menu\r\n */\r\n hide: () => void\r\n}\r\n\r\nexport function ContextMenu({ top, left, menuMaxHeight, hide, items }: ContextMenuProps) {\r\n const [popperElement, setPopperElement] = React.useState(null)\r\n const virtualRef = React.useMemo(() => getVirtualRef(top, left), [left, top])\r\n const dropdownState = useDropdownState({ placement: 'bottom-start' })\r\n const { isFullyClosed } = getExtendedDialogState(dropdownState)\r\n const hasBeenOpen = React.useRef(false)\r\n\r\n const { styles, attributes } = usePopper(virtualRef, popperElement, {\r\n placement: 'auto-end',\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: DEFAULT_OFFSETS,\r\n },\r\n },\r\n ],\r\n })\r\n\r\n /**\r\n * This effect handles closing the context menu (parent element) itself\r\n */\r\n React.useEffect(() => {\r\n if (isFullyClosed && hasBeenOpen.current) hide()\r\n }, [isFullyClosed, hide])\r\n\r\n /**\r\n * This effect handles opening/closing the inner dropdown\r\n */\r\n React.useEffect(() => {\r\n dropdownState.show()\r\n hasBeenOpen.current = true // This acts as a way to differentiate the first render\r\n\r\n return () => dropdownState.hide()\r\n // This needs to run only on mount/unmount for obvious reasons\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return (\r\n \r\n }\r\n menuMaxHeight={menuMaxHeight}\r\n state={dropdownState}\r\n items={items}\r\n isStatic\r\n />\r\n \r\n )\r\n}\r\n\r\ninterface ContextMenuInnerProps {\r\n label: JSX.Element\r\n items: ContextMenuItem[]\r\n state: ReturnType\r\n isStatic?: boolean\r\n menuMaxHeight?: number\r\n}\r\n\r\nfunction ContextMenuInner(\r\n { label, items, state, isStatic, menuMaxHeight = Number.MAX_SAFE_INTEGER }: ContextMenuInnerProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const innerState = useDropdownState({ placement: 'right-start' })\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: menuMaxHeight,\r\n hasViewportHeightLimit: true,\r\n offsets: DEFAULT_OFFSETS,\r\n state,\r\n })\r\n\r\n return (\r\n \r\n {items.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return {item.label}\r\n }\r\n\r\n if (item?.options !== undefined) {\r\n return (\r\n \r\n {item.label}\r\n \r\n }\r\n items={item.options}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n {\r\n item.onClick?.()\r\n window.gtag?.('event', 'context-menu', Object.assign({ menu_option: item.id }, item.gtag))\r\n }}\r\n data-testid={`dropdown-menu-${item.id}`}\r\n className=\"shrink-0\"\r\n >\r\n {item.label}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nconst ContextMenuDropdown = React.forwardRef(ContextMenuInner)\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\ninterface GridLayoutProps extends React.HTMLProps {\r\n /**\r\n * Number of columns\r\n */\r\n columns?: number\r\n\r\n /**\r\n * Number of rows\r\n */\r\n rows?: number\r\n\r\n /**\r\n * Whether or not a border is rendered between and around items. eg. charts\r\n * on HP won’t have a border\r\n *\r\n * @default false\r\n */\r\n border?: boolean\r\n}\r\n\r\nexport const ChartGridCell = React.forwardRef(\r\n ({ children, gridArea, className, ...props }, ref) => (\r\n \r\n {children}\r\n \r\n )\r\n)\r\n\r\ninterface ChartGridCellProps extends React.HTMLProps {\r\n /**\r\n * Css grid-area value\r\n */\r\n gridArea?: string\r\n}\r\n\r\nexport function GridLayout({ columns = 1, rows = 1, border = false, children, className, ...props }: GridLayoutProps) {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\ninterface ChartGridProps extends GridLayoutProps {\r\n isResizable?: boolean\r\n}\r\n\r\nexport const ChartGrid: React.FC = (props) => \r\n","import * as React from 'react'\r\n\r\nimport { PropsWithAs, RequireByKey } from '../types'\r\n\r\nconst defaultValueAccessor: ValueAccessor = (data) => data\r\n\r\nconst DEFAULT_VALUE_KEY = 'value'\r\nconst DEFAULT_CHANGE_KEY = 'onChange'\r\n\r\ntype ValueAccessor<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n> = (...args: Parameters[ChangeKey]>) => React.ComponentProps[ValueKey]\r\n\r\nexport type InnerStateProps<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps,\r\n ChangeKey extends keyof React.ComponentProps,\r\n> = RequireByKey, 'as'> & {\r\n valueKey?: ValueKey\r\n changeKey?: ChangeKey\r\n valueAccessor?: ValueAccessor\r\n}\r\n\r\nexport function InnerState<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n>({\r\n as: asComponent,\r\n valueKey = 'value' as ValueKey,\r\n changeKey = 'onChange' as ChangeKey,\r\n valueAccessor = defaultValueAccessor,\r\n ...props\r\n}: InnerStateProps) {\r\n const { [valueKey]: value, [changeKey]: onChange } = props\r\n const [state, setState] = React.useState[ValueKey]>(value)\r\n\r\n const handleChange = React.useCallback>(\r\n (...args) => {\r\n setState(valueAccessor(...args))\r\n onChange(...args)\r\n },\r\n [onChange, valueAccessor]\r\n )\r\n\r\n return React.createElement(asComponent, {\r\n ...props,\r\n [valueKey]: state,\r\n [changeKey]: handleChange,\r\n })\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { getDefaultValueGetter } from '../../hooks/use-sort-data'\r\nimport { columnMap } from '../../modules/portfolio/constants/columns'\r\nimport { ColumnId, PortfolioGroup, RowKind, TableColumnDefinition } from '../../modules/portfolio/types'\r\nimport { getColumnsByKeys } from '../../modules/portfolio/utils'\r\nimport { SortableValue } from '../../types'\r\nimport { SortDirection, Table, TableCell, TableHead, TableHeaderSortable, TableRow, useTableSort } from '../Table'\r\n\r\ninterface PortfolioWatchlistTableProps {\r\n data: PortfolioGroup[]\r\n selectedPortfolio: number\r\n handleTickerSelect: (ticker: string) => void\r\n chartTicker?: string\r\n isSelectClosed: boolean\r\n tableOrder: ColumnId\r\n handleOrderChange: (column: ColumnId) => void\r\n}\r\n\r\nconst visibleColumns = getColumnsByKeys([\r\n ColumnId.Ticker,\r\n ColumnId.LastClose,\r\n ColumnId.LastChangePct,\r\n ColumnId.LastChange,\r\n])\r\nconst sortableColumns = [columnMap[ColumnId.Order], ...visibleColumns]\r\n\r\nconst IS_MOBILE = isMobile()\r\n\r\nfunction isElementOverflowing(el: HTMLElement, containerElement?: HTMLDivElement) {\r\n if (!containerElement) return false\r\n\r\n const element = el.getBoundingClientRect()\r\n const container = containerElement.getBoundingClientRect()\r\n\r\n return element.top >= container.top && element.bottom <= container.bottom\r\n}\r\n\r\nfunction valueGetter(column: TableColumnDefinition) {\r\n const columnValueGetter = column.getValueForSort\r\n\r\n if (typeof columnValueGetter === 'undefined') return getDefaultValueGetter(column)\r\n\r\n return (row: PortfolioGroup): SortableValue => columnValueGetter({ kind: RowKind.Group, row }) ?? null\r\n}\r\n\r\nexport function PortfolioWatchlistTable({\r\n data,\r\n handleTickerSelect,\r\n chartTicker,\r\n selectedPortfolio,\r\n isSelectClosed,\r\n tableOrder,\r\n handleOrderChange,\r\n}: PortfolioWatchlistTableProps) {\r\n const tableSort = useTableSort({ data, columns: sortableColumns, valueGetter })\r\n const [selectedRow, setSelectedRow] = React.useState()\r\n const [containerElement, setContainerElement] = React.useState()\r\n\r\n React.useEffect(() => {\r\n const element = document.querySelector('[data-js=\"portfolio-watchlist-table-sidebar-container\"]')\r\n if (element) setContainerElement(element as HTMLDivElement)\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n const rowElement = document.querySelector(`[data-ticker=\"${chartTicker}\"]`) as HTMLElement\r\n if (isSelectClosed && rowElement !== document.activeElement && data.some(({ ticker }) => chartTicker === ticker)) {\r\n setSelectedRow(chartTicker)\r\n rowElement?.focus()\r\n }\r\n // We want to trigger this only on portfolio change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectedPortfolio, isSelectClosed, chartTicker])\r\n\r\n const handleKeyDown = (ev: React.KeyboardEvent, index: number) => {\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault()\r\n } else {\r\n return\r\n }\r\n\r\n const prevSibling = ev.currentTarget.previousElementSibling as HTMLElement | null\r\n const nextSibling = ev.currentTarget.nextElementSibling as HTMLElement | null\r\n const firstElement = ev.currentTarget.parentElement?.firstElementChild as HTMLElement | null\r\n const lastElement = ev.currentTarget.parentElement?.lastElementChild as HTMLElement | null\r\n\r\n if (ev.key === 'ArrowDown') {\r\n nextSibling?.focus({ preventScroll: true })\r\n if (!nextSibling) firstElement?.focus({ preventScroll: true })\r\n const el = document.activeElement as HTMLElement | null\r\n if (el && !isElementOverflowing(el, containerElement)) {\r\n document.activeElement?.scrollIntoView(false)\r\n }\r\n }\r\n if (ev.key === 'ArrowUp') {\r\n prevSibling?.focus({ preventScroll: true })\r\n if (!prevSibling) lastElement?.focus({ preventScroll: true })\r\n const el = document.activeElement as HTMLElement | null\r\n if (el && !isElementOverflowing(el, containerElement)) {\r\n document.activeElement?.scrollIntoView(index <= 1 ? false : true)\r\n }\r\n }\r\n\r\n const ticker = (document.activeElement as HTMLElement | null)?.dataset.ticker\r\n\r\n if (ticker) {\r\n setSelectedRow(ticker)\r\n }\r\n }\r\n\r\n const handleKeyUp = React.useCallback(\r\n (ev: React.KeyboardEvent) => {\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault()\r\n const ticker = (document.activeElement as HTMLElement | null)?.dataset.ticker\r\n if (ticker) {\r\n handleTickerSelect(ticker)\r\n }\r\n }\r\n },\r\n [handleTickerSelect]\r\n )\r\n\r\n const handleTableMouseMove = (ev: React.MouseEvent) => {\r\n if (!selectedRow) {\r\n ev.currentTarget.focus({ preventScroll: true })\r\n }\r\n }\r\n\r\n const handleSortChange = React.useCallback(\r\n (column: TableColumnDefinition) => {\r\n let newSort = column\r\n if (tableSort.sort.column.id === column.id && tableSort.sort.direction === SortDirection.Descending) {\r\n newSort = sortableColumns[0]\r\n }\r\n\r\n tableSort.changeSort(newSort)\r\n handleOrderChange(newSort.id)\r\n },\r\n [handleOrderChange, tableSort]\r\n )\r\n\r\n // Update sort when props change (used for watchlist sidebar header)\r\n React.useEffect(() => {\r\n if (tableOrder !== tableSort.sort.column.id) tableSort.changeSort(columnMap[tableOrder])\r\n // Only run this on props change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [tableOrder])\r\n\r\n return (\r\n \r\n \r\n {visibleColumns.map((column) => (\r\n handleSortChange(column)}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n \r\n {tableSort.data.map((entry, index) => (\r\n {\r\n setSelectedRow(entry.ticker)\r\n handleTickerSelect(entry.ticker)\r\n }}\r\n onMouseMove={handleTableMouseMove}\r\n onKeyDown={(ev) => handleKeyDown(ev, index)}\r\n onKeyUp={handleKeyUp}\r\n >\r\n {visibleColumns.map((column) => (\r\n \r\n {column.renderColumn({ kind: RowKind.Watchlist, row: entry, index })}\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react'\r\n\r\nimport { Label } from './typography'\r\n\r\nexport enum RangeSize {\r\n small = 'sm:h-6', // 24px height\r\n regular = 'sm:h-7', // 28px height\r\n medium = 'sm:h-8', // 32px height\r\n large = 'sm:h-9', // 36px height\r\n}\r\n\r\ntype InputProps = HTMLProps\r\n\r\ninterface RangeSliderProps extends Omit {\r\n /**\r\n * Label which is rendered above the select\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Range size. All inputs have forced height on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof RangeSize\r\n\r\n /**\r\n * Element which will be rendered on the left side of the slider\r\n */\r\n leftContent?: ReactNode\r\n\r\n /**\r\n * Element which will be rendered on the right side of the slider\r\n */\r\n rightContent?: ReactNode\r\n\r\n /**\r\n * Class name for the wrapper element\r\n */\r\n className?: string\r\n\r\n /**\r\n * Class name for the input element\r\n */\r\n inputClassName?: string\r\n\r\n /**\r\n * Min value for the input\r\n *\r\n * @default 0\r\n */\r\n min?: number\r\n\r\n /**\r\n * Max value for the input\r\n *\r\n * @default 100\r\n */\r\n max?: number\r\n\r\n /**\r\n * Step value for the input\r\n *\r\n * @default 1\r\n */\r\n step?: number\r\n\r\n /**\r\n * Current value\r\n */\r\n value: number\r\n\r\n /**\r\n * Callback when value changes\r\n */\r\n onChange: InputProps['onChange']\r\n}\r\n\r\nexport function RangeSlider({\r\n label,\r\n size = 'regular',\r\n leftContent,\r\n rightContent,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n className,\r\n inputClassName,\r\n ...props\r\n}: RangeSliderProps) {\r\n const [hasTrack, setHasTrack] = useState(false)\r\n const trackRef = useRef(null)\r\n const thumbRef = useRef(null)\r\n\r\n useEffect(() => {\r\n setHasTrack(Boolean(trackRef.current && thumbRef.current))\r\n }, [])\r\n\r\n const thumbLeft = useMemo(() => {\r\n const track = trackRef.current\r\n const thumb = thumbRef.current\r\n const valuePercent = (props.value - min) / (max - min)\r\n\r\n if (!hasTrack || !track || !thumb) return\r\n\r\n const trackBox = track.getBoundingClientRect()\r\n const thumbBox = thumb.getBoundingClientRect()\r\n\r\n return ((valuePercent * (trackBox.width - thumbBox.width)) / trackBox.width) * 100\r\n }, [min, max, props.value, hasTrack])\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { ButtonRoundingType, ButtonThemeType } from '../button'\r\nimport { IconNameType } from '../icon'\r\n\r\nexport enum ToolbarTheme {\r\n chipTransparent, // (default)\r\n alternative,\r\n}\r\n\r\nexport enum ToolbarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n\r\nexport type ToolbarDirectionType = keyof typeof ToolbarDirection\r\n\r\nexport interface IButtonThemeSettings {\r\n className?: string\r\n theme: ButtonThemeType\r\n rounding: ButtonRoundingType\r\n}\r\n\r\nexport interface IToolbarItem {\r\n id: string\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport type ToolbarThemeType = keyof typeof ToolbarTheme\r\n","import * as React from 'react'\r\n\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\nexport interface IToolbarContext {\r\n direction: ToolbarDirection\r\n theme: ToolbarTheme\r\n isWrapped: boolean\r\n isStretched: boolean\r\n isMobile: boolean\r\n}\r\n\r\nexport const ToolbarContext = React.createContext({\r\n direction: ToolbarDirection.vertical,\r\n theme: ToolbarTheme.chipTransparent,\r\n isWrapped: false,\r\n isStretched: false,\r\n isMobile: false,\r\n})\r\n\r\nexport function useToolbarContext() {\r\n return React.useContext(ToolbarContext)\r\n}\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport React from 'react'\r\n\r\nimport { isSafariDesktop } from '../../../app/shared/isMobile'\r\nimport { IToolbarContext, ToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarDirectionType, ToolbarTheme, ToolbarThemeType } from './interfaces'\r\n\r\nconst getToolbarSettings = ({\r\n direction,\r\n isWrapped,\r\n isMobile,\r\n theme,\r\n}: IToolbarContext): React.HTMLProps => {\r\n switch (isWrapped) {\r\n case true:\r\n return {\r\n className: classnames('shrink-0 items-center bg-white dark:bg-gray-800', {\r\n 'flex flex-wrap justify-between': direction === ToolbarDirection.vertical,\r\n 'grid border border-gray-100 dark:border-gray-600 p-1.5 gap-1 border-box rounded-md grid-cols-2':\r\n FinvizSettings.hasRedesignEnabled,\r\n }),\r\n }\r\n\r\n default:\r\n return {\r\n className: classnames('flex shrink-0 items-center p-1.5 bg-white dark:bg-gray-800', {\r\n 'space-x-1.5 px-1.5': direction === ToolbarDirection.horizontal && FinvizSettings.hasRedesignEnabled,\r\n 'flex-col overflow-hidden overflow-y-auto [--inset-l:0.5rem] landscape-primary:pl-inset-left':\r\n direction === ToolbarDirection.vertical,\r\n 'space-y-2': direction === ToolbarDirection.vertical && !isMobile,\r\n 'pb-inset-bottom [--inset-b:0.5rem]': theme !== ToolbarTheme.alternative && !isMobile,\r\n 'w-screen space-x-2 overflow-hidden overflow-x-auto':\r\n direction === ToolbarDirection.horizontal && theme !== ToolbarTheme.alternative,\r\n 'overflow-x-hidden': theme === ToolbarTheme.alternative,\r\n 'relative z-10 rounded-md border border-gray-100 dark:border-gray-600': isMobile,\r\n }),\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarProps {\r\n /**\r\n * Toolbar direction\r\n *\r\n * @default vertical\r\n */\r\n direction?: ToolbarDirectionType\r\n\r\n /**\r\n * Toolbar buttons theme\r\n *\r\n * @default light\r\n */\r\n theme?: ToolbarThemeType\r\n\r\n /**\r\n * Charts mobile design\r\n *\r\n * @default false\r\n */\r\n isMobile?: boolean\r\n\r\n className?: string\r\n}\r\n\r\nexport function Toolbar({\r\n direction = 'vertical',\r\n theme = 'chipTransparent',\r\n isMobile = false,\r\n children,\r\n className,\r\n}: React.PropsWithChildren) {\r\n const toolbarRef = React.useRef(null)\r\n const contextProviderValue = React.useMemo(\r\n () => ({\r\n direction: ToolbarDirection[direction],\r\n theme: ToolbarTheme[theme],\r\n isWrapped:\r\n ToolbarDirection[direction] === ToolbarDirection.vertical && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isStretched:\r\n ToolbarDirection[direction] === ToolbarDirection.horizontal && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isMobile,\r\n }),\r\n [direction, theme, isMobile]\r\n )\r\n const toolbarSettings = getToolbarSettings(contextProviderValue)\r\n\r\n React.useLayoutEffect(() => {\r\n // Workaround for Safari scrollbar bug https://github.com/finvizhq/charts/issues/1038\r\n // Safari injects scrollbar after layout render and doesn't trigger reflow\r\n if (ToolbarTheme[theme] !== ToolbarTheme.alternative && isSafariDesktop()) {\r\n const forceReflow = throttle(() => {\r\n if (toolbarRef.current !== null) {\r\n const originalWidth = toolbarRef.current.style.width\r\n toolbarRef.current.style.width = '0'\r\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\r\n toolbarRef.current.offsetWidth\r\n toolbarRef.current.style.width = originalWidth\r\n }\r\n }, 200)\r\n\r\n forceReflow()\r\n window.addEventListener('resize', forceReflow)\r\n\r\n return () => {\r\n window.removeEventListener('resize', forceReflow)\r\n }\r\n }\r\n }, [theme])\r\n\r\n // reason for key is that popover is sealing initial state, description in\r\n // https://github.com/finvizhq/Finviz-Website/pull/402\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon } from '../icon'\r\nimport { Spinner } from '../spinner'\r\nimport { PropsWithAs } from '../types'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\n\r\nfunction getButtonThemeSettings({\r\n theme,\r\n isActive,\r\n isStretched,\r\n isInAction,\r\n}: {\r\n theme: ToolbarTheme\r\n isStretched: boolean\r\n isActive?: boolean\r\n isInAction?: boolean\r\n}): Omit & ButtonProps {\r\n const includeRedesign = FinvizSettings.hasRedesignEnabled\r\n switch (theme) {\r\n case ToolbarTheme.alternative:\r\n return {\r\n className: classnames(\r\n {\r\n grow: isStretched,\r\n 'h-10 w-10': !isStretched && !includeRedesign,\r\n 'animate-pulse': isInAction,\r\n },\r\n\r\n !includeRedesign && {\r\n 'active:bg-white disabled:bg-white disabled:text-gray-300 disabled:hover:text-gray-300': true,\r\n 'border border-white text-gray-500 hover:border-gray-100 hover:text-gray-900': !isActive,\r\n 'border border-gray-900 text-gray-900': isActive,\r\n }\r\n ),\r\n theme: includeRedesign ? 'chipTransparent' : 'transparent',\r\n rounding: includeRedesign ? undefined : 'none',\r\n size: isStretched || includeRedesign ? undefined : 'none',\r\n }\r\n default:\r\n return {\r\n className: classnames(\r\n 'border dark:disabled:bg-gray-800 dark:disabled:text-gray-600 disabled:text-gray-300 disabled:bg-white dark:disabled:hover:bg-gray-800 dark:disabled:hover:text-gray-600 disabled:hover:text-gray-300 disabled:hover:bg-white',\r\n {\r\n 'animate-pulse': isInAction,\r\n 'border-transparent text-gray-500 hover:bg-gray-100 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200':\r\n !isActive,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': isActive,\r\n }\r\n ),\r\n theme: 'transparent',\r\n rounding: 'small',\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarButtonProps extends Omit {\r\n item: IToolbarItem\r\n disabledTooltip?: string\r\n isInAction?: boolean\r\n isLoading?: boolean\r\n}\r\n\r\nexport function ToolbarButton({\r\n item,\r\n disabledTooltip,\r\n isInAction: isInActionProp,\r\n isLoading,\r\n ...props\r\n}: PropsWithAs & ToolbarButtonProps) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const isInAction = isInActionProp && item.iconAction !== undefined\r\n const buttonSettings = getButtonThemeSettings({\r\n theme,\r\n isStretched,\r\n isActive: props.active,\r\n isInAction: isInAction,\r\n })\r\n\r\n const getMainIcon = () => (\r\n \r\n )\r\n\r\n return (\r\n & ToolbarButtonProps)}\r\n appearance={props.appearance ?? 'square'}\r\n title={props.disabled && disabledTooltip ? disabledTooltip : (props.active && item.titleActive) || item.title}\r\n size={\r\n buttonSettings.size ??\r\n (theme === ToolbarTheme.chipTransparent || FinvizSettings.hasRedesignEnabled ? 'medium' : 'large')\r\n }\r\n >\r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {props.children ??\r\n (isInAction ? (\r\n \r\n \r\n \r\n ) : (\r\n getMainIcon()\r\n ))}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Icon } from '../icon'\r\nimport { PopoverTrigger, useHoverPopover } from '../popover'\r\nimport { SelectOption } from '../select'\r\nimport { useSelect } from '../select/hooks'\r\nimport { NativeSelect } from '../select/native-select'\r\nimport { SelectList } from '../select/select-list'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\nimport { ToolbarButton } from './toolbar-button'\r\n\r\nexport interface ToolbarGroupProps {\r\n /**\r\n * Main button item\r\n */\r\n defaultItem: IToolbarItem\r\n\r\n /**\r\n * Shows spinner instead of icon\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Current selected item id\r\n */\r\n isActive: boolean\r\n\r\n /**\r\n * Should indicate some action in progress\r\n */\r\n isInAction?: boolean\r\n\r\n /**\r\n * Array of items\r\n */\r\n groupItems: IToolbarItem[]\r\n\r\n /**\r\n * Expand group button label\r\n */\r\n groupTitle?: string\r\n\r\n /**\r\n * On item select callback\r\n */\r\n onChange: (id: string, trigger: 'button' | 'select' | 'group') => void\r\n\r\n /**\r\n * Use native select for mobile devices\r\n *\r\n * @default true\r\n */\r\n useNativeSelect?: boolean\r\n\r\n /**\r\n * Is item disabled\r\n */\r\n disabled?: boolean\r\n\r\n /**\r\n * Tooltip message if item is disabled\r\n */\r\n disabledTooltip?: string\r\n}\r\n\r\nexport function ToolbarGroup({\r\n defaultItem,\r\n isActive,\r\n isLoading,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect = isMobile(),\r\n disabled,\r\n disabledTooltip,\r\n}: ToolbarGroupProps) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const [selectedItem, setSelectedItem] = React.useState(defaultItem)\r\n const groupId = groupTitle?.replace(/\\s/g, '-').toLocaleLowerCase()\r\n const isAlternativeTheme = theme === ToolbarTheme.alternative\r\n const popoverState = useHoverPopover({\r\n placement: isAlternativeTheme && isStretched ? 'bottom' : 'right-start',\r\n })\r\n const select = useSelect(\r\n popoverState,\r\n selectedItem.id,\r\n groupItems?.map((i) => ({ value: i.id, label: i.title })) ?? [],\r\n (option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }\r\n )\r\n\r\n return (\r\n \r\n ) => {\r\n ev.preventDefault()\r\n ev.stopPropagation()\r\n onChange(selectedItem.id, 'group')\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n {useNativeSelect ? (\r\n ({ value: item.id, label: item.title }))}\r\n onChange={select.onItemChange}\r\n onClick={() => onChange(selectedItem.id, 'select')}\r\n />\r\n ) : (\r\n \r\n {groupItems.map((item) => (\r\n }\r\n data-testid={`toolbar-group-${groupId}-${item.id}`}\r\n >\r\n {item.title}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { PartialBy } from '../../types'\r\nimport { ToolbarButton } from './toolbar-button'\r\nimport { ToolbarGroup, ToolbarGroupProps } from './toolbar-group'\r\n\r\nexport function ToolbarItem({\r\n defaultItem,\r\n isLoading,\r\n isActive,\r\n isInAction,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect,\r\n disabled,\r\n disabledTooltip,\r\n}: PartialBy) {\r\n const isItemActive = isActive && !disabled\r\n\r\n if (!!groupItems?.length) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n {\r\n onChange(defaultItem.id, 'button')\r\n }}\r\n />\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { useToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\ntype ToolbarDividerProps = {\r\n className?: string\r\n}\r\n\r\nexport function ToolbarDivider({ className }: ToolbarDividerProps) {\r\n const { direction, theme } = useToolbarContext()\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Box } from '../box'\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { TourStep } from './types'\r\n\r\nexport function StepContent({ step }: { step: TourStep }) {\r\n return (\r\n \r\n {step.title && (\r\n \r\n {step.title}\r\n \r\n )}\r\n {step.body && {step.body}}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as ReactDOM from 'react-dom/server'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport {\r\n BUTTON_BASE_CLASS,\r\n BUTTON_FOCUS_STYLES,\r\n ButtonPadding,\r\n ButtonRounding,\r\n ButtonSize,\r\n ButtonTheme,\r\n getButtonTheme,\r\n} from '../button'\r\nimport { StepContent } from './step-content'\r\nimport { TourDefinition, TourStep } from './types'\r\n\r\ntype ExcludesFalse = (x: T | false) => x is T\r\n\r\n/**\r\n * Async load Shepherd module when we need it\r\n */\r\nlet shepherdLibrary: typeof Shepherd\r\nexport async function loadShepherdLibrary(setLoading: (state: boolean) => void) {\r\n if (shepherdLibrary) return shepherdLibrary\r\n\r\n try {\r\n setLoading(true)\r\n const shepherdPromise = await import('shepherd.js')\r\n shepherdLibrary = shepherdPromise.default\r\n setLoading(false)\r\n\r\n return shepherdLibrary\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Get buttons based on index in the step array\r\n */\r\nconst buttonClasses = classnames(BUTTON_BASE_CLASS, BUTTON_FOCUS_STYLES, ButtonSize.regular, ButtonRounding.regular)\r\nfunction getStepButtons(tour: Shepherd.Tour, step: TourStep, index: number, arr: TourStep[]) {\r\n return [\r\n {\r\n action: tour.complete,\r\n classes: classnames(buttonClasses, 'mr-auto', getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: 'Exit',\r\n },\r\n index > 0 && {\r\n action: tour.back,\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: step.backButton ?? 'Back',\r\n },\r\n {\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.blue).button, ButtonPadding.regular),\r\n action: tour.next,\r\n text: step.nextButton ?? (index === arr.length - 1 ? 'Finish' : 'Next'),\r\n },\r\n ].filter(Boolean as unknown as ExcludesFalse)\r\n}\r\n\r\n/**\r\n * Convert tour steps to Shepherd steps\r\n */\r\nexport function processSteps(tour: Shepherd.Tour, steps: TourStep[]): Shepherd.Step.StepOptions[] {\r\n return steps.map((step, index) => ({\r\n attachTo: { element: step.target, on: step.placement ?? 'auto' },\r\n classes: 'z-dialog',\r\n // Add offset\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: step.offset ?? [0, 10],\r\n },\r\n },\r\n ],\r\n },\r\n // Render the body\r\n text: ReactDOM.renderToString(React.createElement(StepContent, { step })),\r\n // Add buttons\r\n buttons: getStepButtons(tour, step, index, steps),\r\n modalOverlayOpeningRadius: step.overlayRadius ?? 8,\r\n modalOverlayOpeningPadding: step.overlayPadding ?? 0,\r\n }))\r\n}\r\n\r\nexport function getTourKey() {\r\n return `tour${window.location.pathname.replace(/[/.]/g, '-')}`\r\n}\r\n\r\nexport function getStepsForUser(tours: TourDefinition[]) {\r\n const lastFinishedTour = localStorage.getItem(getTourKey())\r\n const lastTourIndex = tours.findIndex((tour) => tour.id === lastFinishedTour)\r\n const allToursViewed = lastTourIndex === tours.length - 1 || tours.slice(lastTourIndex + 1).every((item) => item.skip)\r\n const toursToView = allToursViewed ? tours : tours.slice(lastTourIndex + 1)\r\n const userTour = toursToView.reduce(\r\n (acc, current) =>\r\n current.skip\r\n ? acc\r\n : {\r\n ...acc,\r\n id: current.id,\r\n steps: [...acc.steps, ...current.steps],\r\n },\r\n { id: 'tour', steps: [], initialTour: toursToView[0].id }\r\n )\r\n\r\n return { hasNewTours: !allToursViewed, tour: userTour }\r\n}\r\n\r\nexport function completeTour(key: string) {\r\n localStorage.setItem(getTourKey(), key)\r\n}\r\n","import * as React from 'react'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport { TourDefinition } from './types'\r\nimport * as tourUtils from './utils'\r\n\r\nexport const DEFAULT_OPTIONS = {\r\n exitOnEsc: true,\r\n useModalOverlay: true,\r\n}\r\n\r\n/**\r\n * Hook which controls shepherd.js. The library is lazy-loaded when the tour starts\r\n *\r\n * Returns:\r\n * - `isLoading`: state of the library loading\r\n * - `currentTour`: tour object, only defined after library has loaded\r\n * - `startTour`: load the library and start tour. Returns `currentTour`\r\n * - `getStepsForUser`: returns a list of tour steps based on tours the user finished\r\n * - `completeTour`: persists the last finished tour to local storage\r\n */\r\nexport function useTour(options?: Shepherd.Tour.TourOptions) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [currentTour, setTour] = React.useState(null)\r\n\r\n /**\r\n * We’re loading shepherd asynchronously and want to have loading state so we use\r\n * AbortController to check if the component is still mounted.\r\n */\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const loadingSetter = React.useRef((state: boolean) => {\r\n if (controller.current?.signal.aborted) return\r\n\r\n setIsLoading(state)\r\n })\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n const startTour = React.useCallback(\r\n async (definition: TourDefinition, setComplete = true) => {\r\n const shepherdLibrary = await tourUtils.loadShepherdLibrary(loadingSetter.current)\r\n\r\n if (shepherdLibrary && !controller.current?.signal.aborted) {\r\n const tour = currentTour ?? new shepherdLibrary.Tour({ ...DEFAULT_OPTIONS, ...options })\r\n\r\n if (!currentTour) setTour(tour)\r\n\r\n // Reset the tour steps in case they were updated\r\n Array.from(tour.steps).forEach((step) => tour.removeStep(step.id))\r\n\r\n const processedSteps = tourUtils.processSteps(tour, definition.steps)\r\n tour.addSteps(processedSteps)\r\n\r\n if (setComplete) {\r\n tourUtils.completeTour(definition.id)\r\n }\r\n\r\n tour.start()\r\n window.gtag?.('event', 'tour-start', { event_label: definition.initialTour ?? definition.id })\r\n\r\n return tour\r\n }\r\n },\r\n [currentTour, options]\r\n )\r\n\r\n return {\r\n isLoading,\r\n currentTour,\r\n startTour,\r\n getStepsForUser: tourUtils.getStepsForUser,\r\n completeTour: tourUtils.completeTour,\r\n }\r\n}\r\n","import * as time from '../../app/header/time'\r\nimport * as saveToPortfolio from '../../app/quote/save-to-portfolio'\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 ...saveToPortfolio,\r\n }\r\n}\r\n\r\nexportAsGlobal(window, 'FLibs')\r\n","/**\r\n * Expose loader doesn’t map these to window.FLibs until we import them somewhere.\r\n * Until we figure out a better way, this file needs to be included on the charts page\r\n */\r\n// eslint-disable-next-line react/no-typos\r\nimport 'classnames'\r\nimport { max, nice, scaleLinear, scaleSymlog } from 'd3'\r\nimport {\r\n add,\r\n addBusinessDays,\r\n differenceInCalendarDays,\r\n eachDayOfInterval,\r\n endOfDay,\r\n intervalToDuration,\r\n isSameMonth,\r\n isSameWeek,\r\n isWeekend,\r\n isWithinInterval,\r\n startOfDay,\r\n startOfYear,\r\n sub,\r\n subMonths,\r\n subYears,\r\n} from 'date-fns'\r\nimport 'hammerjs'\r\n// eslint-disable-next-line react/no-typos\r\nimport 'react'\r\nimport 'react-dom'\r\nimport * as ReactRouterDOM from 'react-router-dom'\r\n\r\nimport { getFormattedDateString } from '../app/header/utils'\r\nimport { decodeQueryString, encodeQueryString } from '../app/queryString'\r\nimport logo from '../app/shared/assets/logo.png'\r\nimport logo_light from '../app/shared/assets/logo_light.png'\r\nimport { getHoverChartImg } from '../app/shared/hover-chart'\r\nimport { getSanitizedTicker } from '../app/shared/ticker-sanitizer'\r\nimport { formatDateToStringUS, getIsDrawingEnabledOnQuotePage } from '../app/shared/utils'\r\nimport './components/index'\r\nimport { useSyncLocalStorage } from './hooks/use-sync-local-storage'\r\nimport { useTrackPageView } from './hooks/use-track-pageview'\r\nimport * as localStorage from './services/local-storage'\r\n\r\ndeclare const FLibs: any\r\n\r\nFLibs.ReactRouterDOM = ReactRouterDOM\r\nFLibs.getHoverChartImg = getHoverChartImg\r\nFLibs.getSanitizedTicker = getSanitizedTicker\r\nFLibs.decodeQueryString = decodeQueryString\r\nFLibs.encodeQueryString = encodeQueryString\r\nFLibs.getFormattedDateString = getFormattedDateString\r\nFLibs.formatDateToStringUS = formatDateToStringUS\r\nFLibs.useSyncLocalStorage = useSyncLocalStorage\r\nFLibs.useTrackPageView = useTrackPageView\r\nFLibs.getIsDrawingEnabledOnQuotePage = getIsDrawingEnabledOnQuotePage\r\nFLibs.localStorage = localStorage\r\nFLibs.d3 = { max, nice, scaleLinear, scaleSymlog }\r\nFLibs.DateFns = {\r\n add,\r\n addBusinessDays,\r\n differenceInCalendarDays,\r\n eachDayOfInterval,\r\n endOfDay,\r\n intervalToDuration,\r\n isSameMonth,\r\n isSameWeek,\r\n isWeekend,\r\n isWithinInterval,\r\n startOfDay,\r\n startOfYear,\r\n sub,\r\n subMonths,\r\n subYears,\r\n}\r\nFLibs.assets = {\r\n logo,\r\n logo_light,\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipInput } from '../../../../components/tooltip-input'\r\nimport { getNumberValue } from '../../utils'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\nconst MAX_PRICE = 999999999\r\n\r\nexport function CostPerShareEditColumn<\r\n StateType extends {\r\n price?: number\r\n },\r\n ErrorsType extends {\r\n price?: boolean\r\n },\r\n>(props: EditColumnProps) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n const [rawValue, setRawValue] = React.useState(props.entry.price ?? '')\r\n const handleBlur = React.useCallback(\r\n (ev: React.ChangeEvent) => {\r\n setIsInteracting(false)\r\n const price = ev.currentTarget.valueAsNumber\r\n\r\n if (price > 0 && props.errors?.price) props.setErrors((errors) => ({ ...errors, price: false }))\r\n if (price > MAX_PRICE) return\r\n props.setState((entry) => ({ ...entry, price }))\r\n },\r\n [props, setIsInteracting]\r\n )\r\n\r\n const value = getNumberValue(props.entry.price)\r\n const isNaNValue = isNaN(value)\r\n\r\n let tooltipContent = undefined\r\n if (props.errors?.price && isActive) {\r\n if (isNaNValue) tooltipContent = 'Missing price'\r\n if (value <= 0 || typeof rawValue === 'string') tooltipContent = 'Invalid number, please enter a positive number'\r\n }\r\n\r\n const showError = props.errors?.price && (isNaN(Number(rawValue)) || Number(rawValue) <= 0 || rawValue === '')\r\n\r\n React.useEffect(() => {\r\n const priceValue = getNumberValue(props.entry.price)\r\n if (!isNaN(priceValue)) setRawValue(priceValue)\r\n }, [props.entry.price])\r\n\r\n return (\r\n {\r\n if (props.updateOnChange !== false) {\r\n const numberValue = ev.currentTarget.valueAsNumber\r\n props.setState((entry) => ({ ...entry, price: numberValue }))\r\n }\r\n setRawValue(ev.currentTarget.value)\r\n }}\r\n onBlur={handleBlur}\r\n size={props.size}\r\n tooltipColor=\"red\"\r\n tooltipSettings={{ unstable_offset: [10, 10] }}\r\n tooltipContent={showError ? tooltipContent : undefined}\r\n className={classNames(props.className, { 'is-error': props.errors?.price })}\r\n isInteractive={isActive}\r\n onFocus={() => setIsInteracting(true)}\r\n />\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as dateFns from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport { StatelessDatePicker } from '../../../../components/date-picker'\r\nimport { getExtendedDialogState } from '../../../../components/dialog'\r\nimport { Input, InputComponentProps } from '../../../../components/input'\r\nimport { usePopoverState } from '../../../../components/popover'\r\nimport { Tooltip, TooltipTrigger, useTooltipState } from '../../../../components/tooltip'\r\nimport { PORTFOLIO_DATE_FORMAT_DATA, PORTFOLIO_DATE_FORMAT_VIEW } from '../../constants/general'\r\nimport { parseInputAsDate } from '../../utils'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\nconst DATE_MAX_LENGTH = 10\r\n\r\nfunction preventDefault(ev: React.MouseEvent) {\r\n ev.preventDefault()\r\n}\r\n\r\ninterface StateType {\r\n date?: string\r\n}\r\ninterface ErrorsType {\r\n date?: boolean\r\n}\r\n\r\ninterface DateEditColumnWithPickerProps extends EditColumnProps {\r\n onIsInteractingChange: (isInteracting: boolean) => void\r\n inputElement: React.ReactElement\r\n value: { input: string | undefined; picker: Date }\r\n}\r\n\r\nexport function DateEditColumnWithPicker(\r\n props: DateEditColumnWithPickerProps\r\n) {\r\n const pickerState = usePopoverState()\r\n const pickerExtendedState = getExtendedDialogState(pickerState)\r\n const tooltipState = useTooltipState({ placement: 'top', unstable_offset: [-9, 10] })\r\n const tooltipExtendedState = getExtendedDialogState(tooltipState)\r\n const WrapperComponent = props.errors?.date ? TooltipTrigger : React.Fragment\r\n const wrapperProps = props.errors?.date\r\n ? {\r\n state: tooltipState,\r\n tabIndex: -1,\r\n onMouseEnter: preventDefault,\r\n onMouseLeave: preventDefault,\r\n }\r\n : {}\r\n\r\n const isInteractingWithDateInput = !pickerExtendedState.isFullyClosed || !tooltipExtendedState.isFullyClosed\r\n React.useEffect(() => {\r\n props.onIsInteractingChange(isInteractingWithDateInput)\r\n // We don't need to pass entire props as we check only if onIsInteractingChange changed\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [props.onIsInteractingChange, isInteractingWithDateInput])\r\n\r\n /**\r\n * Handle date changes\r\n */\r\n const onDateChange = React.useRef((dateValue: Date | string) => {\r\n // Convert input to correct format if valid\r\n const parsedDate = parseInputAsDate({ input: dateValue })\r\n\r\n if (typeof dateValue === 'string' && !dateFns.isValid(parsedDate)) {\r\n props.setState((entry) => ({ ...entry, date: dateValue }))\r\n return\r\n }\r\n\r\n const date = dateFns.format(parsedDate, PORTFOLIO_DATE_FORMAT_DATA)\r\n props.setErrors((errors) => ({ ...errors, date: false }))\r\n props.setState((entry) => ({ ...entry, date }))\r\n tooltipState.hide()\r\n })\r\n\r\n /**\r\n * Reset error state on blur when editing manually\r\n */\r\n const handleBlur = React.useRef(() => {\r\n const date = parseInputAsDate({ input: props.entry.date ?? '' })\r\n if (dateFns.isValid(date)) {\r\n props.setErrors((errors) => ({ ...errors, date: false }))\r\n tooltipState.hide()\r\n }\r\n })\r\n\r\n return (\r\n \r\n \r\n {React.cloneElement(props.inputElement, {\r\n onChange: (ev) => onDateChange.current(ev.currentTarget.value),\r\n onKeyDown: () => pickerState.hide(),\r\n onBlur: handleBlur.current,\r\n })}\r\n \r\n {!tooltipExtendedState.isFullyClosed && (\r\n \r\n Invalid date, please enter date in MM-DD-YYYY format.\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport function DateEditColumn(\r\n props: EditColumnProps\r\n) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n\r\n /**\r\n * Get formatted value for picker and input\r\n */\r\n const value = React.useMemo(() => {\r\n try {\r\n const parsedDate = parseInputAsDate({\r\n input: props.entry.date ?? '',\r\n format: PORTFOLIO_DATE_FORMAT_DATA,\r\n checkFormat: false,\r\n })\r\n\r\n return {\r\n input: dateFns.format(parsedDate, PORTFOLIO_DATE_FORMAT_VIEW),\r\n picker: parsedDate,\r\n }\r\n } catch {\r\n return {\r\n input: props.entry.date,\r\n picker: new Date(),\r\n }\r\n }\r\n }, [props.entry.date])\r\n\r\n const inputElement = (\r\n {}}\r\n error={props.errors?.date}\r\n size={props.size}\r\n maxLength={DATE_MAX_LENGTH}\r\n data-testid=\"input-date\"\r\n />\r\n )\r\n\r\n if (isActive) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return inputElement\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipInput } from '../../../../components/tooltip-input'\r\nimport { getNumberValue } from '../../utils'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\nconst MAX_SHARES = 999999999\r\n\r\nexport function SharesEditColumn<\r\n StateType extends {\r\n shares?: number\r\n },\r\n ErrorsType extends {\r\n shares?: boolean\r\n },\r\n>(props: EditColumnProps) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n const [rawValue, setRawValue] = React.useState(props.entry.shares ?? '')\r\n const handleBlur = React.useCallback(\r\n (ev: React.ChangeEvent) => {\r\n setIsInteracting(false)\r\n const shares = ev.currentTarget.valueAsNumber\r\n\r\n if (shares >= 0 && props.errors?.shares) props.setErrors((errors) => ({ ...errors, shares: false }))\r\n if (shares > MAX_SHARES) return\r\n props.setState((entry) => ({ ...entry, shares }))\r\n },\r\n [props, setIsInteracting]\r\n )\r\n\r\n const value = getNumberValue(props.entry.shares)\r\n const isNaNValue = isNaN(value)\r\n\r\n let tooltipContent = undefined\r\n if (props.errors?.shares && isActive) {\r\n if (isNaNValue) tooltipContent = 'Missing number of shares'\r\n if (value < 0 || typeof rawValue === 'string') tooltipContent = 'Invalid number, please enter a positive number'\r\n }\r\n\r\n const showError = props.errors?.shares && (isNaN(Number(rawValue)) || Number(rawValue) <= 0 || rawValue === '')\r\n\r\n React.useEffect(() => {\r\n const sharesValue = getNumberValue(props.entry.shares)\r\n if (!isNaN(sharesValue)) setRawValue(sharesValue)\r\n }, [props.entry.shares])\r\n\r\n return (\r\n {\r\n if (props.updateOnChange !== false) {\r\n const numberValue = ev.currentTarget.valueAsNumber\r\n props.setState((entry) => ({ ...entry, shares: numberValue }))\r\n }\r\n setRawValue(ev.currentTarget.value)\r\n }}\r\n onBlur={handleBlur}\r\n size={props.size}\r\n tooltipColor=\"red\"\r\n tooltipSettings={{ unstable_offset: [10, 10] }}\r\n tooltipContent={showError ? tooltipContent : undefined}\r\n isInteractive={isActive}\r\n onFocus={() => setIsInteracting(true)}\r\n />\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipInput } from '../../../../components/tooltip-input'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\nconst TICKER_MAX_LENGTH = 10\r\n\r\nexport function TickerEditColumn<\r\n StateType extends {\r\n ticker: string\r\n },\r\n ErrorsType extends {\r\n ticker?: boolean\r\n },\r\n>(props: EditColumnProps) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n const handleChange = React.useCallback(\r\n (ev: React.ChangeEvent) => {\r\n const ticker = ev.currentTarget.value\r\n if (ticker.trim().length >= 0 && props.errors?.ticker) props.setErrors((errors) => ({ ...errors, ticker: false }))\r\n props.setState((entry) => ({ ...entry, ticker }))\r\n },\r\n [props]\r\n )\r\n\r\n let tooltipContent = undefined\r\n if (props.errors?.ticker && isActive) {\r\n tooltipContent = props.entry.ticker.length === 0 ? 'Missing ticker' : 'Invalid ticker'\r\n }\r\n\r\n return (\r\n setIsInteracting(true)}\r\n onBlur={() => setIsInteracting(false)}\r\n />\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Select, SelectOption, SelectPlaceholder } from '../../../../components/select'\r\nimport { SelectListProps } from '../../../../components/select/select-list'\r\nimport { TRANSACTION_LABEL } from '../../constants/general'\r\nimport { PortfolioTransaction } from '../../types'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\nconst TRANSACTION_OPTIONS = Object.entries(TRANSACTION_LABEL)\r\n .filter(([transaction]) => parseInt(transaction) !== PortfolioTransaction.Watch)\r\n .map(([value, label]) => ({ value: Number(value), label }))\r\n\r\ninterface TransactionEditColumnProps extends EditColumnProps {\r\n transactions?: typeof TRANSACTION_OPTIONS\r\n optionListProps?: Omit\r\n}\r\n\r\nexport function TransactionEditColumn<\r\n StateType extends {\r\n transaction?: number\r\n },\r\n ErrorsType extends {\r\n transaction?: boolean\r\n },\r\n>({\r\n transactions = TRANSACTION_OPTIONS,\r\n optionListProps = { className: 'min-w-28' },\r\n ...props\r\n}: TransactionEditColumnProps) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n\r\n return (\r\n <>\r\n \r\n {isActive ? (\r\n props.setState((entry) => ({ ...entry, transaction: item.value }))}\r\n listProps={optionListProps}\r\n size={props.size}\r\n data-testid=\"transaction-select\"\r\n onIsInteractingChange={setIsInteracting}\r\n >\r\n {transactions.map((item) => (\r\n \r\n {item.label}\r\n \r\n ))}\r\n \r\n ) : (\r\n value === props.entry.transaction)?.label ?? transactions[0].label\r\n }\r\n />\r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\n/*\r\n * Context.\r\n */\r\n\r\nexport interface PortfolioBulkEditRowContextProps {\r\n isActive: boolean\r\n setIsInteracting: React.Dispatch>\r\n setIsInView: React.Dispatch>\r\n}\r\n\r\nexport const PortfolioBulkEditRowContext = React.createContext({\r\n isActive: false,\r\n setIsInteracting: () => {},\r\n setIsInView: () => {},\r\n})\r\n\r\n/*\r\n * Hook.\r\n */\r\n\r\nexport function usePortfolioBulkEditRowContext(): PortfolioBulkEditRowContextProps {\r\n return React.useContext(PortfolioBulkEditRowContext)\r\n}\r\n\r\n/*\r\n * Component.\r\n */\r\n\r\ninterface PortfolioBulkEditRowContextProviderProps {\r\n children: React.ReactNode\r\n hasAlwaysActiveOverride?: boolean\r\n}\r\nexport const PortfolioBulkEditRowContextProvider = ({\r\n children,\r\n hasAlwaysActiveOverride = false,\r\n}: PortfolioBulkEditRowContextProviderProps) => {\r\n const [isInteracting, setIsInteracting] = React.useState(false)\r\n const [isInView, setIsInView] = React.useState(false)\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\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(\r\n '/api/portfolio_entry.ashx',\r\n {\r\n query,\r\n method,\r\n body: JSON.stringify(body),\r\n },\r\n true\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 const response = await apiRequest<{ tickers: string }>(\r\n '/portfolio_tickers.ashx',\r\n {\r\n query: { json: true },\r\n },\r\n 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}\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\nexport type 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 isNotification?: boolean\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 (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (!state.date || !dateFns.isValid(parseInputAsDate({ input: state.date, format: dateFormat, checkFormat })))\r\n ) {\r\n formErrors.date = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (state.shares === undefined || isNaN(state.shares) || state.shares < 0)\r\n ) {\r\n formErrors.shares = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (state.price === undefined || isNaN(state.price) || state.price <= 0)\r\n ) {\r\n formErrors.price = true\r\n }\r\n\r\n return { isValid: Object.keys(formErrors).length === 0, errors: formErrors }\r\n}\r\n\r\nexport function parseInputAsDate({\r\n input,\r\n format = PORTFOLIO_DATE_FORMAT_VIEW,\r\n checkFormat = true,\r\n}: {\r\n input: Date | string\r\n format?: string\r\n checkFormat?: boolean\r\n}) {\r\n if (checkFormat && typeof input === 'string' && input.length !== format.length) {\r\n return new Date('Invalid Date')\r\n }\r\n if (input instanceof Date && dateFns.isValid(input)) return input\r\n\r\n return dateFns.parse(input.toString(), format, new Date())\r\n}\r\n\r\nexport const FORM_ENTRY_KEYS = Object.keys(EMPTY_FORM_ENTRY)\r\n\r\nfunction appendRowToFormData(serializer: URLSearchParams, row: Partial, index: number) {\r\n FORM_ENTRY_KEYS.forEach((key) => serializer.append(`${key}${index}`, `${row[key as keyof PortfolioEntryBase] ?? ''}`))\r\n}\r\n\r\nexport function getBulkEditData(data: Array): Record {\r\n return data.reduce(\r\n (acc, row) => {\r\n const existingId = (row as PortfolioFormGroup).id\r\n const id = existingId ? `${existingId}` : getUuid()\r\n const transactions = row.transactions.length\r\n ? row.transactions.map((transaction) => ({\r\n ...transaction,\r\n uuid: transaction.id ? `${transaction.id}` : getUuid(),\r\n }))\r\n : [getNewTransaction(row.ticker, PortfolioTransaction.Watch)]\r\n return {\r\n ...acc,\r\n [id]: { ...row, id, transactions },\r\n }\r\n },\r\n {} as Record\r\n )\r\n}\r\n\r\nexport function serializeFormData<\r\n EntryType extends { ticker: string; transactions?: Array> },\r\n>(entries: EntryType[]) {\r\n const serializer = new URLSearchParams()\r\n entries\r\n .flatMap((entry) => {\r\n if (!entry.transactions || entry.transactions?.length === 0) {\r\n return getNewTransaction(entry.ticker, PortfolioTransaction.Watch)\r\n }\r\n\r\n return entry.transactions\r\n })\r\n .forEach((entry, index) => {\r\n if (entry.ticker.length) appendRowToFormData(serializer, entry, index)\r\n })\r\n\r\n return serializer\r\n}\r\n\r\nexport async function validateFormData(data: PortfolioFormGroup[]) {\r\n if (data.length === 0) return { isValid: true, errors: {} }\r\n\r\n let isValid = true\r\n const errors: Record = {}\r\n\r\n 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\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 { PortfolioDefinition } from '../modules/portfolio/types'\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\r\nexport function portfoliosRequest() {\r\n return apiRequest<{ portfolios: PortfolioDefinition[] }>('/api/portfolio_data.ashx', {\r\n query: {\r\n fields: 'portfolios',\r\n },\r\n })\r\n}\r\n\r\nexport function lastCloseRequest(ticker: string) {\r\n return apiRequest('/request_quote.ashx', {\r\n query: {\r\n t: ticker,\r\n },\r\n })\r\n}\r\n\r\ninterface PortfolioLimitResult {\r\n transactions: number\r\n limitTransactions: number\r\n}\r\n\r\nexport function portfolioLimitRequest(portfolioId: number) {\r\n return apiRequest('/api/portfolio_data.ashx', {\r\n query: {\r\n pid: portfolioId,\r\n fields: 'transactions,limitTransactions',\r\n },\r\n })\r\n}\r\n","import { EventEmitter } from 'events'\r\nimport * as React from 'react'\r\n\r\nlet emitter: EventEmitter | undefined\r\n\r\n/**\r\n * Get the emitter which is used to sync components across the page, subscibe to\r\n * changes and attach event which handles changes across windows\r\n */\r\nexport function subscribeToChanges(\r\n key: string,\r\n defaultValue: ValueType,\r\n changeCallback?: (value: React.SetStateAction) => void\r\n) {\r\n if (!emitter) emitter = new EventEmitter()\r\n\r\n const onChange = (value: React.SetStateAction) => {\r\n const newValue = value ?? getValue(key, defaultValue)\r\n setValue(key, newValue, defaultValue, false)\r\n changeCallback?.(newValue)\r\n }\r\n\r\n const onStorageChange = (ev: StorageEvent) => {\r\n if (ev.key === key) {\r\n try {\r\n const value = ev.newValue ? JSON.parse(ev.newValue) : null\r\n onChange(value ?? defaultValue)\r\n } catch {\r\n onChange(defaultValue)\r\n }\r\n }\r\n }\r\n\r\n emitter.addListener(key, onChange)\r\n window.addEventListener('storage', onStorageChange)\r\n\r\n return {\r\n emitter,\r\n unsubscribe: () => {\r\n emitter?.removeListener(key, onChange)\r\n window.removeEventListener('storage', onStorageChange)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Get value from local storage or fall back to `defaultValue`\r\n */\r\nexport function getValue(key: string, defaultValue: ValueType): ValueType {\r\n try {\r\n const value = localStorage.getItem(key)\r\n const parsedValue = value ? JSON.parse(value) : null\r\n return parsedValue ?? defaultValue\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\n/**\r\n * Set value to local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function setValue(\r\n key: string,\r\n valueGetter: React.SetStateAction,\r\n defaultValue: ValueType,\r\n emit = true\r\n) {\r\n try {\r\n const state = getValue(key, defaultValue)\r\n const valueToStore = valueGetter instanceof Function ? valueGetter(state) : valueGetter\r\n\r\n localStorage.setItem(key, JSON.stringify(valueToStore))\r\n if (emit) emitter?.emit(key, valueToStore)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Removes value from local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function removeValue(key: string, emit = true) {\r\n try {\r\n localStorage.removeItem(key)\r\n if (emit) emitter?.emit(key, undefined)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Helper function to migrate old value type to new one (eg. boolean to object)\r\n */\r\nexport function migrateValue(\r\n key: string,\r\n /**\r\n * The migrate function might get called multiple times on the page, so `oldValue` in the callback\r\n * can actually be the already migrated value. Make sure to add a condition to only migrate once.\r\n */\r\n transformValue: NewValue | ((oldValue: PrevValue | NewValue) => NewValue),\r\n defaultValue: NewValue\r\n) {\r\n try {\r\n const oldValue = getValue(key, undefined)\r\n if (typeof oldValue === 'undefined') return\r\n const migratedValue = transformValue instanceof Function ? transformValue(oldValue) : transformValue\r\n setValue(key, migratedValue, defaultValue, false) // don’t emit to other components\r\n } catch {}\r\n}\r\n","import * as pathToRegexp from 'path-to-regexp'\r\n\r\nimport { cleanTicker } from '../util'\r\n\r\n/**\r\n * Compile route path by applying parameters to it\r\n *\r\n * @example\r\n * // Outputs /route/1?query=foo\r\n * compilePath('/route/:id?query=:query', { id: 1, query: 'foo' })\r\n */\r\nfunction compilePath(\r\n path: string,\r\n params?: Record,\r\n options?: pathToRegexp.ParseOptions & pathToRegexp.TokensToFunctionOptions\r\n) {\r\n return pathToRegexp.compile(path, options)(params)\r\n}\r\n\r\nexport const path = {\r\n home: '/',\r\n news: '/news.ashx',\r\n screener: '/screener.ashx',\r\n charts: '/charts',\r\n groups: '/groups.ashx',\r\n portfolio: '/portfolio.ashx',\r\n insider: '/insidertrading.ashx',\r\n elite: '/elite.ashx',\r\n search: '/search.ashx\\\\?p=:ticker?',\r\n quote: '/quote.ashx\\\\?t=:ticker',\r\n contact: '/contact.ashx',\r\n\r\n alerts: '/alerts.ashx',\r\n help: '/help/screener.ashx',\r\n account: '/myaccount.ashx',\r\n login: '/login.ashx',\r\n logout: '/logout.ashx',\r\n\r\n // Maps\r\n maps: '/map.ashx',\r\n bubbles: '/bubbles.ashx',\r\n\r\n // Futures\r\n futures: '/futures.ashx',\r\n futuresPerf: '/futures_performance.ashx',\r\n futuresCharts: '/futures_charts.ashx',\r\n futuresChartDetail: '/futures_charts.ashx\\\\?t=:ticker',\r\n\r\n // Forex\r\n forex: '/forex.ashx',\r\n forexPerf: '/forex_performance.ashx',\r\n forexCharts: '/forex_charts.ashx',\r\n forexChartDetail: '/forex_charts.ashx\\\\?t=:ticker',\r\n\r\n // Crypto\r\n crypto: '/crypto.ashx',\r\n cryptoPerf: '/crypto_performance.ashx',\r\n cryptoCharts: '/crypto_charts.ashx',\r\n cryptoChartDetail: '/crypto_charts.ashx\\\\?t=:ticker',\r\n\r\n // Backtsest\r\n backtests: '/backtests.ashx',\r\n backtestCreate: '/backtest_create.ashx',\r\n backtestDetail: '/backtest_detail.ashx\\\\?id=:backtestId',\r\n backtestPresets: 'backtests.ashx\\\\?presets=1',\r\n}\r\n\r\nexport const link = {\r\n toHome: () => path.home,\r\n toNews: () => path.news,\r\n toScreener: () => path.screener,\r\n toCharts: () => path.charts,\r\n toGroups: () => path.groups,\r\n toPortfolio: () => path.portfolio,\r\n toInsider: () => path.insider,\r\n toElite: () => path.elite,\r\n toSearch: (ticker: string) => compilePath(path.search, { ticker }, { validate: false }),\r\n toQuote: (ticker: string) => compilePath(path.quote, { ticker }),\r\n toContact: () => path.contact,\r\n\r\n toAlerts: () => path.alerts,\r\n toHelp: () => path.help,\r\n toAccount: () => path.account,\r\n toLogin: () => path.login,\r\n toLogout: () => path.logout,\r\n\r\n toMaps: () => path.maps,\r\n toBubbles: () => path.bubbles,\r\n\r\n toFutures: () => path.futures,\r\n toFuturesPerf: () => path.futuresPerf,\r\n toFuturesCharts: () => path.futuresCharts,\r\n toFuturesChartDetail: (ticker: string) => compilePath(path.futuresChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toForex: () => path.forex,\r\n toForexPerf: () => path.forexPerf,\r\n toForexCharts: () => path.forexCharts,\r\n toForexChartDetail: (ticker: string) => compilePath(path.forexChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toCrypto: () => path.crypto,\r\n toCryptoPerf: () => path.cryptoPerf,\r\n toCryptoCharts: () => path.cryptoCharts,\r\n toCryptoChartDetail: (ticker: string) => compilePath(path.cryptoChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toBacktests: () => path.backtests,\r\n toBacktestCreate: () => path.backtestCreate,\r\n toBacktestDetail: (backtestId: string | number) => compilePath(path.backtestDetail, { backtestId }),\r\n toBacktestPresets: () => path.backtestPresets,\r\n}\r\n","export enum Instrument {\r\n Stock = 'stock',\r\n Forex = 'forex',\r\n Crypto = 'crypto',\r\n Futures = 'futures',\r\n MarketSentiment = 'market_sentiment',\r\n Group = 'group',\r\n}\r\n\r\nexport type RecordType = Record\r\n\r\nexport type PartialBy = Omit & Partial>\r\n\r\nexport type NullableNumbers = { [K in keyof Obj]: Obj[K] extends number ? number | null : Obj[K] }\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport type SortableValue = string | null | number | Date\r\nexport type SortDirectionValue = 1 | -1\r\n","import isPlainObject from 'lodash.isplainobject'\r\nimport { ComponentType, LazyExoticComponent, lazy } from 'react'\r\nimport { ShouldRevalidateFunction } from 'react-router-dom'\r\n\r\nimport { getCookie } from '../app/shared/cookie'\r\nimport { parseInitData } from '../app/shared/utils'\r\nimport { CRYPTO_TICKERS } from './constants'\r\nimport { Instrument, SortDirectionValue, SortableValue } from './types'\r\nimport { RecordType } from './types'\r\n\r\n/**\r\n * Function which wraps React.lazy and checks whether a chunk is preloaded\r\n * from async-manifest. If yes, kick in the promise resolve early so we can\r\n * instantly render the component\r\n */\r\nexport function lazyLoadComponent({\r\n chunkName,\r\n load,\r\n}: {\r\n chunkName: string\r\n load: () => Promise<{ default: ComponentType }>\r\n}): LazyExoticComponent> {\r\n // Resolve earlier if prefetch element is present\r\n const hasPreloadElement = document.querySelector(`[data-chunk-id=${chunkName}]`)\r\n\r\n if (hasPreloadElement) {\r\n const componentLoader = load()\r\n\r\n return lazy(() => componentLoader)\r\n }\r\n\r\n return lazy(load)\r\n}\r\n\r\nconst isObject = (value: any): value is RecordType => isPlainObject(value)\r\n\r\n/**\r\n * Parse text as JSON\r\n */\r\nexport function parseAsJSON(value: unknown | Shape): Shape | undefined {\r\n if (isObject(value)) {\r\n return value as Shape\r\n }\r\n\r\n let parsedValue\r\n try {\r\n if (typeof value === 'string') {\r\n parsedValue = JSON.parse(value)\r\n }\r\n } catch (e) {\r\n return\r\n }\r\n return parsedValue\r\n}\r\n\r\n/**\r\n * remove @ symbol from a ticker\r\n */\r\nexport function cleanTicker(ticker: string) {\r\n return ticker.startsWith('@') ? ticker.substring(1) : ticker\r\n}\r\n\r\n/**\r\n * Get instrument for a ticker.\r\n *\r\n * - If ticker doesn’t start with `@` - stock\r\n * - Otherwise\r\n * - one of `CRYPTO_TICKERS` - crypto\r\n * - has length of 6 - forex\r\n * - none of above - future\r\n *\r\n * NOTE: counterpart in charts 'charts/app/utils/chart.js'\r\n */\r\n\r\nexport function getInstrumentForTicker(ticker: string): Instrument {\r\n if (!ticker?.startsWith('@')) return Instrument.Stock\r\n\r\n const cleanedTicker = cleanTicker(ticker)\r\n\r\n if (CRYPTO_TICKERS.includes(cleanedTicker.toUpperCase())) return Instrument.Crypto\r\n if (cleanedTicker.length === 6) return Instrument.Forex\r\n\r\n return Instrument.Futures\r\n}\r\n\r\n/**\r\n * Async load Resize observer polyfill when we need it\r\n */\r\nlet resizeObserverPolyfill: typeof window.ResizeObserver\r\nexport async function loadResizeObserverPolyfill() {\r\n if (typeof window.ResizeObserver === 'undefined') {\r\n const polyfill = await import('resize-observer-polyfill')\r\n resizeObserverPolyfill = polyfill.default\r\n window.ResizeObserver = resizeObserverPolyfill\r\n return resizeObserverPolyfill as typeof window.ResizeObserver\r\n }\r\n}\r\n\r\nexport async function getIsBrave() {\r\n return (navigator.brave && (await navigator.brave.isBrave())) || false\r\n}\r\n\r\nexport function hasDarkModeFeature() {\r\n const ff = getCookie('featureFlags')\r\n return ff.includes('dark:1')\r\n}\r\n\r\nexport function hasRedesignFeature() {\r\n const ff = getCookie('featureFlags')\r\n return ff.includes('redesign:1')\r\n}\r\n\r\nexport function isRedesignFeatureEnabled() {\r\n return hasRedesignFeature() || hasDarkModeFeature()\r\n}\r\n\r\nexport function isDarkModeFeatureEnabled() {\r\n const theme = getCookie('chartsTheme')\r\n return isRedesignFeatureEnabled() && theme.includes('dark')\r\n}\r\n\r\nexport enum ChildPosition {\r\n topLeft,\r\n topRight,\r\n bottomLeft,\r\n bottomRight,\r\n center,\r\n topCenter,\r\n rightCenter,\r\n bottomCenter,\r\n leftCenter,\r\n}\r\n\r\nexport function getFlexAlignClasses(position: ChildPosition) {\r\n return {\r\n 'justify-start': [ChildPosition.topLeft, ChildPosition.bottomLeft, ChildPosition.leftCenter].includes(position),\r\n 'justify-center': [ChildPosition.center, ChildPosition.topCenter, ChildPosition.bottomCenter].includes(position),\r\n 'justify-end': [ChildPosition.topRight, ChildPosition.bottomRight, ChildPosition.rightCenter].includes(position),\r\n 'items-start': [ChildPosition.topLeft, ChildPosition.topRight, ChildPosition.topCenter].includes(position),\r\n 'items-center': [ChildPosition.center, ChildPosition.rightCenter, ChildPosition.leftCenter].includes(position),\r\n 'items-end': [ChildPosition.bottomLeft, ChildPosition.bottomRight, ChildPosition.bottomCenter].includes(position),\r\n }\r\n}\r\n\r\ninterface NumberFormatOptions {\r\n fractions: number\r\n showPlusSign: boolean\r\n defaultValue: string\r\n}\r\n\r\nconst intlCache: { [key: number]: Intl.NumberFormat } = {}\r\nfunction getIntl(fractions: number) {\r\n if (!intlCache[fractions])\r\n intlCache[fractions] = new Intl.NumberFormat('en-US', {\r\n minimumFractionDigits: fractions,\r\n maximumFractionDigits: fractions,\r\n })\r\n return intlCache[fractions]\r\n}\r\n\r\nexport function shortFormatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n let num = value\r\n if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n let suffix = ''\r\n if (num >= 1e9) {\r\n num /= 1e9\r\n suffix = 'B'\r\n } else if (num >= 1e6) {\r\n num /= 1e6\r\n suffix = 'M'\r\n } else if (num >= 1000) {\r\n num /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n const formatted = getIntl(fractions).format(num)\r\n\r\n return (showPlusSign && num > 0 ? '+' : '') + formatted + suffix\r\n}\r\n\r\nexport function formatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n if (value === undefined || value === null) return defaultValue\r\n\r\n const fixedValue = value.toFixed(fractions)\r\n const prefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n return {prefix + fixedValue}\r\n }\r\n\r\n const formatted = getIntl(fractions).format(value)\r\n\r\n return prefix + formatted\r\n}\r\n\r\nexport function sortByColumn(options: {\r\n a: ItemType\r\n b: ItemType\r\n direction: SortDirectionValue\r\n valueGetter?: (row: ItemType) => SortableValue\r\n}) {\r\n const valueA = options.valueGetter?.(options.a)\r\n const valueB = options.valueGetter?.(options.b)\r\n if (typeof valueA === 'string' && typeof valueB === 'string') return valueA.localeCompare(valueB) * options.direction\r\n if (valueA === null) return -options.direction\r\n if (valueB === null) return options.direction\r\n return (Number(valueA) - Number(valueB)) * options.direction\r\n}\r\n\r\nexport function moveItemInArray(arr: ItemType[], sourceIndex: number, destinationIndex: number) {\r\n // make sure sourceIndex and destinationIndex are inside of arr\r\n const from = Math.max(0, Math.min(sourceIndex, arr.length - 1))\r\n const to = Math.min(arr.length - 1, Math.max(destinationIndex, 0))\r\n\r\n const items = [...arr]\r\n const [removed] = items.splice(from, 1)\r\n items.splice(to, 0, removed)\r\n\r\n return items\r\n}\r\n\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n/**\r\n * This fn creates a revalidator rule which always revalidates loader when the\r\n * specified keys change but ignores changes to other keys. It also allows\r\n * `revalidator.revalidate` to work even if the query didn’t\r\n */\r\nexport function revalidateOnQueryChange(keys: string[]): ShouldRevalidateFunction {\r\n return (args) => {\r\n const prevParams = args.currentUrl.searchParams\r\n const nextParams = args.nextUrl.searchParams\r\n const requiredChanged = keys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n const otherQueryKeys = [...prevParams.keys(), ...nextParams.keys()].filter(\r\n (key, index, arr) => !keys.includes(key) && arr.indexOf(key) === index\r\n )\r\n const otherChanged = otherQueryKeys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n\r\n if (!requiredChanged && otherChanged) {\r\n return false\r\n }\r\n\r\n return args.defaultShouldRevalidate\r\n }\r\n}\r\n\r\nexport function parseRouteInitData({\r\n elementId = 'route-init-data',\r\n fallback,\r\n removeElement = true,\r\n}: { elementId?: string; fallback?: DataType; removeElement?: boolean } = {}): DataType | null {\r\n const element = document.getElementById(elementId)\r\n let initialData = fallback\r\n\r\n if (!element) return fallback ?? null\r\n\r\n try {\r\n const parsedData = parseInitData(elementId)\r\n if (removeElement) element.remove()\r\n\r\n if (parsedData) initialData = parsedData\r\n } catch {\r\n initialData = fallback\r\n }\r\n\r\n return initialData ?? null\r\n}\r\n"],"names":["MarketBadgeType","getMarketBadgeText","type","_date","Open","label","Closed","Premarket","Aftermarket","getMarketBadgeType","time","hasUserPremium","isHoliday","isPremarket","isAftermarket","None","MarketBadge","_ref","badge","className","_jsx","classnames","includes","TimeBreakpointMode","BREAKPOINTS","minWidth","Infinity","marketBadgeText","timeFormat","getTimeState","fixedTime","arguments","length","undefined","FinvizSettings","getDate","TooltipBadge","props","state","useTooltipState","placement","_jsxs","_Fragment","children","TooltipTrigger","Tooltip","Heading","level","StaticBadge","findMatchingBreakpoint","compareWidth","breakpoints","filter","breakpoint","pop","getCurrentWidth","mode","element","window","innerWidth","clientWidth","Time","breakpointMode","ResizeObserver","useResizeObserver","rootRef","React","setState","currentBreakpoint","setBreakpoint","interval","setInterval","clearInterval","current","currentWidth","handleResize","throttle","foundBreakpoint","observer","entries","requestAnimationFrame","Array","isArray","observe","addEventListener","disconnect","removeEventListener","ref","getFormattedDateString","seed","date","Date","dateAsNY","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","isDst","dayNumber","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","setUTCHours","getWeekDay","toLocaleDateString","weekday","uppercase","name","month","toUpperCase","toString","padStart","getTime","toLocaleString","hour","minute","hour12","TimeFormat","format","long","getFullYear","short","dateOnly","timeOnly","formatDate","value","inputOrOutputFormat","outputFormat","dateFns","isPremium","dayOfWeek","min","getMinutes","hours","getHours","HOLIDAY_DATES","test","day","getHoliday","find","holiday","MapTypeId","MapSubtypeId","ScaleId","NodeDepth","decodeQueryString","search","location","vars","substring","split","obj","forEach","pair","delimiterPos","indexOf","key","decodeURIComponent","encodeQueryString","values","whitelistedValues","Object","keys","reduce","prev","encodeURIComponent","PortfolioInput","handleChange","ev","portfolio","currentTarget","trim","errors","portfolioName","setErrors","handleSelect","option","portfolioId","tooltipContent","portfolios","Select","size","isHorizontalLabel","labelClassName","listProps","items","onChange","hasPopoverViewportHeightLimit","map","item","SelectOption","TooltipInput","isMobileStyleEnabled","maxLength","error","classNames","tooltipColor","PORTFOLIO_BASE_URL","DEFAULT_STATE","ticker","transaction","PortfolioTransaction","PORTFOLIO_DATE_FORMAT_DATA","shares","price","TRANSACTION_OPTIONS","TRANSACTION_LABEL","Number","FormContent","_ref2","onClose","onSubmit","setPortfolios","apiError","setApiError","formRef","async","response","portfoliosRequest","id","p","fetchPortfolios","lastClose","lastCloseRequest","fetchLastClose","commonProps","entry","PortfolioBulkEditRowContextProvider","hasAlwaysActiveOverride","noValidate","autoComplete","event","preventDefault","isValid","formErrors","validateEditRow","limitResponse","portfolioLimitRequest","transactions","limitTransactions","isInvalidTicker","validateTickers","some","Boolean","validateState","setTimeout","querySelector","focus","result","pid","createdPortfolioResponse","portfolioTickers","tickers","Error","isSuccess","portfolioEntry","message","body","submitForm","DialogBody","Paragraph","TickerEditColumn","TransactionEditColumn","optionListProps","DateEditColumn","SharesEditColumn","inputClassName","CostPerShareEditColumn","DialogFooter","Button","onClick","theme","SuccessContent","portfolioUrl","as","href","SaveToPortfolio","isInlined","isSubmitted","setIsSubmitted","setPortfolioUrl","DialogHeader","onCloseClick","SpecificChartFunctionality","getStaticChartConfig","width","height","timeframe","paneElements","specificChartFunctionality","default","colorsOverride","colors","getCustomColorsFromCookies","refreshData","layout","barWidth","barMargin","scrollable","editable","charts","scale","leftOffset","instrument","stretch","panes","elements","JSON","parse","getParsedCookies","cookieName","parseCookies","document","cookie","cookieString","acc","v","getCookie","re","RegExp","replace","DEFAULT_OVERLAYS","getHoverChartUrl","escaped","hoverCharts","stock","dateRange","documentElement","classList","contains","overlays","patterns","query","cs","t","tf","ct","r","tm","imgUrl","nodeChartsDomain","timeframeToDeprecatedTimeframe","timeframeString","getOldChartsUrl","oldPeriod","Instrument","cleanTicker","toLowerCase","getHoverChartDimensions","getReferrerPolicy","getHoverChartImg","useOldCharts","hasForexFuturesCryptoNodeCharts","chartSize","referrerPolicy","url","srcSet","getSrcSet","srcsetString","img","hasUserRetinaNodeCharts","matchesAndroid","navigator","userAgent","match","matchesWebOS","matchesIPhone","matchesiPad","matchesIPod","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","maxTouchPoints","isMobileDevice","isMobile","isIphone","isIpad","isSafariDesktop","isIos","getSanitizedSingleTicker","rawTicker","x","join","getSanitizedTicker","isMulti","AdsProvider","getAdsProvider","adsProvider","Freestar","InvestingChannel","trackPageView","pathname","freestarPageView","gtag","freestar","queue","push","trackPageview","formatDateToStringUS","year","DRAWING_QUOTE_PAGE_COOKIE_NAME","getIsDrawingEnabledOnQuotePage","parseInitData","elementId","initDataElement","getElementById","textContent","e","Sentry","captureException","getSidebarFromCookie","chartsUrl","sidebar","RedGreenText","rightContent","rightClass","hasValue","isFinite","Icon","RedGreenMultiline","child","Table","TableHead","TableBody","spacing","TableFooter","TableAlign","TableCell","isFirst","isLast","align","Left","hasPadding","Center","Right","TableSortIndicator","isActive","direction","invisible","TableHeader","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","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_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","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","getRelativePosition","node","rect","getBoundingClientRect","pointer","touches","pageX","pageXOffset","top","pageY","pageYOffset","preventDefaultMove","DraggablePickerComponent","onMove","onKey","container","useRef","hasTouched","isDragging","setDragging","useState","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","getHSVAFromColor","stringifyHSVAColor","output","canSelectAlpha","getLumaFromRGBA","getIsColorTooLightOrTransparent","getHEXWithSpecificAplha","getRGBAValueFromValidColorString","Alpha","changeLightness","pos","gradientPreview","useMemo","backgroundImage","DEFAULT_COLORS","title","ColorPalette","lowerCaseColor","colorObj","isSelected","HueSaturation","position","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","isTooLight","PickerInput","inputClass","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","useEffect","handleColorInputChange","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","Textarea","readOnly","select","DatePickerComponent","StatelessDatePicker","zIndex","isFullyClosed","getExtendedDialogState","triggerProps","ZIndexContext","fallback","Spinner","locale","minDetail","DatePicker","popover","Delayed","delay","throwOnTimeout","delayComponent","timeoutComponent","setVisible","hasTimedOut","setHasTimedOut","visibilityTimeout","failedTimeout","useZIndex","useDialogState","settings","Reakit","animated","DialogDragContext","enabled","handleRef","boxPosition","y","resetBoxPosition","setBoxPosition","useDrag","dragging","handleElement","boxPositionRef","dragDiff","scrollX","scrollY","onMouseUp","onMouseMove","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","scrollDivRef","scrollBox","disableBodyScroll","enableBodyScroll","ConfirmationDialog","actions","DialogTrigger","dropdownContext","DropdownContext","root","hasHorizontalPadding","hasMinHeight","useDropdownState","context","loop","unstable_virtual","unstable_offset","DropdownComponent","isNested","isStatic","dropdownState","ContainerElement","buttonProps","parent","orientation","Dropdown","NestedDropdownWrapper","parentState","itemProps","DropdownBar","DropdownItemComponent","subtitle","closeOnClick","hasSubmenu","iconTheme","DropdownItem","DropdownSeparator","MoreButtonDropdown","Component","iconList","add","SVG","viewBox","d","arrowDownShort","arrowForward","arrowUpShort","briefcase","fillRule","calendar","candleBarBasic","candleBarHeikinAshi","candleBarHollow","caretDown","caretLeft","caretRight","caretUp","caretVertical","chartBar","chartBubble","cx","cy","chartPie","chartTable","chartTreemap","chevronDown","chevronRight","close","darkMode","diamondOutlined","done","drag","draw","clipRule","drawingActionDelete","drawingSettingAutosaveOff","drawingSettingAutosaveOn","drawingSettingAutosaveSaving","drawingSettingDrawingMode","drawingSettingDrawingModeActive","drawingSettingHide","drawingSettingLock","drawingSettingPreserveDrawings","drawingSettingPreserveDrawingsActive","drawingSettingShow","drawingSettingUnlock","empty","exitFullscreen","flash","fullscreen","gesture","gift","hamburger","help","idea","ideaLoad","ideaSave","info","layout1h1v","layout1h2v","layout1h3v","layout1l2r","layout1t2b","layout2h1v","layout2h2v","layout3h1v","layout3h2v","lightMode","lineChartType","lock","menuClose","minus","more","note","ohlcChartType","palette","profile","publish","refresh","remove","restore","settingsWheel","share","signOut","star","starOutlined","switchHorizontal","switchVertical","tabKey","template","toolArrow","toolBrush","toolCallout","toolCurve","toolElliottWave","toolEllipse","toolExpand","toolFibonacci","toolLine","fill","stroke","toolMeasure","toolMidLineH","toolMidLineV","toolMouse","toolPitchfork","toolPolygon","toolPosition","toolRect","toolRectRotated","toolText","toolTriangle","toolXABCD","trashCan","trendingDown","trendingUp","triangle","triangleOutlineDown","triangleOutlineUp","warning","xmlns","InputTheme","InputRounding","InputSize","getInputTheme","isError","input","navigationBar","InputComponent","showNumberStepper","caption","inputTheme","isLeftStringIcon","isRightStringIcon","inputSize","commonSideContentClassnames","Label","isHorizontal","InputCaption","TextareaComponent","textareaTheme","ListContext","useListState","options","ListItem","activeTheme","onSelectItem","onKeyPress","closeOnSelect","List","selectedIndex","includeBaseStyles","prevSelected","move","closeParent","findIndex","NotificationPosition","NotificationContext","show","useNotification","getViewport","visualViewport","innerHeight","offsetTop","offsetLeft","NotificationWrapper","notification","setNotification","viewport","setViewport","positionClass","WrapperComponent","inline","unstable_autoFocusOnShow","willChange","withNotificationContext","WrappedComponent","displayName","WithNotificationContext","notificationContext","Notification","timeoutId","timeoutInMs","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","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","autoCorrect","autoCapitalize","onBlur","popoverClass","isMatchInputAndBoxWidth","maxWidth","allowCategorySwitching","ErrorBoundary","FallbackComponent","onReset","resetKeys","getSelectedItemIndex","useSelect","setSelectedIndex","closePopover","newIndex","onItemChange","selectedItem","reloadDocument","newUrl","URL","hash","SelectButton","isPopoverTrigger","themeProps","getButtonProps","popoverStateSettings","onIsInteractingChange","StatelessSelect","labelTitleClassName","buttonContent","isNativeMobileSelect","hasPopoverButtonWidthLimit","showMobileSelect","NativeSelectComponent","useInRouterContext","NativeSelectInRouterContext","NativeSelect","titleClassName","relative","SelectList","SelectPlaceholder","SelectWithTooltip","tooltipLabel","tooltip","unstable_timeout","isTooltipIgnored","visibilityState","activeElement","onSelectFocus","onSelectBlur","onFocus","showPlaceholder","handleNativeSelectChange","itemIndex","target","hidden","i","navigate","useNavigate","onChangeWithNavigate","isProgressBar","progress","radius","strokeWidth","circleXY","circumference","PI","strokeDasharray","strokeDashoffset","strokeLinecap","DATERANGE_TOOLTIP","DateRangeSelect","dateRangeGroups","selectedDateRange","onDateRangeSelect","flatDateRanges","flatMap","dateRanges","selectWithTooltipListProps","withReload","linkProps","Link","to","_createElement","LabelWithDelayedSpinner","TIMEFRAME_TOOLTIP","TimeframeSelect","timeFrameGroups","selectedTimeframe","favoriteTimeframes","isCompactView","isCompactOnly","onTimeframeSelect","onFavoriteTimeframeToggle","isFavoritesEnabled","flatTimeframes","timeframes","getSelectedTimeframeLabel","selectedTimeframeItem","labelShort","groupIndex","isIconButtonActive","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","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","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","tooltipSettings","onMouseEnter","onMouseLeave","TooltipInputComponent","isInteractive","TooltipBox","TooltipColor","tooltipProps","transformMap","auto","positionMain","arrowColor","getHeadingElement","CRYPTO_TICKERS","useIsMounted","isMountedRef","getIsMounted","elementOverride","elementRef","setElementWidth","setElementHeight","offsetHeight","measureElement","newElementWidth","newElementHeight","measureElementDebounced","debounce","resizeObserver","cancel","MAX_HEIGHT_PROPERTY","POPOVER_HEIGHT_LIMIT_STYLE","maxHeight","offsetY","elementMaxHeight","controller","AbortController","setResizeObserver","loadResizeObserverPolyfill","then","polyfill","signal","aborted","abort","hasOwnProperty","getDefaultValueGetter","row","getValueForSort","sortByColumn","storageKey","storage","subscription","unsubscribe","useTrackPageView","trackInitial","trackAutomatically","initialRender","useLocation","handleTrackView","tracking","throttleWaitInMs","setSize","DEFAULT_OFFSETS","ContextMenu","menuMaxHeight","popperElement","setPopperElement","virtualRef","toJSON","getVirtualRef","hasBeenOpen","styles","attributes","usePopper","modifiers","offset","popper","ContextMenuDropdown","ContextMenuInner","innerState","assign","menu_option","ChartGridCell","gridArea","GridLayout","rows","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","InnerState","valueKey","changeKey","valueAccessor","visibleColumns","getColumnsByKeys","ColumnId","sortableColumns","columnMap","IS_MOBILE","isElementOverflowing","el","columnValueGetter","RowKind","PortfolioWatchlistTable","handleTickerSelect","chartTicker","selectedPortfolio","isSelectClosed","tableOrder","handleOrderChange","tableSort","selectedRow","setSelectedRow","setContainerElement","rowElement","handleKeyUp","dataset","handleTableMouseMove","preventScroll","handleSortChange","prevSibling","previousElementSibling","nextSibling","nextElementSibling","firstElement","parentElement","firstElementChild","lastElement","lastElementChild","scrollIntoView","onKeyUp","renderColumn","RangeSize","RangeSlider","step","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","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","saveToPortfolio","FLibs","ReactRouterDOM","d3","nice","scaleLinear","scaleSymlog","DateFns","addBusinessDays","differenceInCalendarDays","eachDayOfInterval","endOfDay","intervalToDuration","isSameMonth","isSameWeek","isWeekend","isWithinInterval","startOfDay","startOfYear","sub","subMonths","subYears","assets","logo","logo_light","MAX_PRICE","setIsInteracting","usePortfolioBulkEditRowContext","rawValue","setRawValue","handleBlur","valueAsNumber","getNumberValue","isNaNValue","showError","priceValue","form","updateOnChange","numberValue","DateEditColumnWithPicker","pickerState","pickerExtendedState","tooltipState","tooltipExtendedState","wrapperProps","isInteractingWithDateInput","onDateChange","dateValue","parsedDate","parseInputAsDate","picker","inputElement","checkFormat","PORTFOLIO_DATE_FORMAT_VIEW","MAX_SHARES","sharesValue","PortfolioBulkEditRowContext","setIsInView","isInteracting","isInView","freeze","urlSort","args","formatNumber","costAvg","prevClose","lastChange","showPlusSign","fractions","lastChangePct","lastVolume","valuePaid","valueMarket","gainMarketUsd","gainMarketPct","gainTodayUsd","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","news","portfolioData","apiRequest","deletePortfolio","method","stringify","QUOTE_INVALID_TICKER_REQUEST","QUOTE_INVALID_TICKER_RESPONSE","quoteData","headers","ContentType","parsedTickers","json","recalculatePortfolio","numberOfTransactions","totalValue","pricePerColumn","prices","captureMessage","extra","requestTickers","requestTickersLength","responseLength","tickerPrices","fromEntries","tickerPrice","NaN","ErrorSource","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","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","dateFormat","FORM_ENTRY_KEYS","getBulkEditData","existingId","getUuid","uuid","getNewTransaction","serializeFormData","serializer","append","appendRowToFormData","validateFormData","api","validatedTickers","validationResult","hasInvalidEntries","getPortfolioInitData","returnData","isInitData","initData","EMPTY_TRANSACTION","getTradesStructureData","parseResponseForContentType","contentType","ApplicationJson","ApplicationJsonUTF","FormUrlEncoded","ThrowableError","status","isServerError","constructor","super","this","throwOnAllErrors","requestUrl","requestOptions","request","fetch","cancelableRequest","textResponse","responseContentType","Html","parsedResponse","ok","statusText","rayId","catch","scope","setContext","fields","emitter","subscribeToChanges","changeCallback","EventEmitter","getValue","setValue","onStorageChange","addListener","removeListener","emit","valueToStore","Function","removeValue","removeItem","migrateValue","transformValue","oldValue","compilePath","pathToRegexp","toHome","toNews","toScreener","toCharts","toGroups","toPortfolio","toInsider","toElite","toSearch","validate","toQuote","toContact","toAlerts","toHelp","toAccount","toLogin","toLogout","toMaps","toBubbles","toFutures","toFuturesPerf","toFuturesCharts","toFuturesChartDetail","toForex","toForexPerf","toForexCharts","toForexChartDetail","toCrypto","toCryptoPerf","toCryptoCharts","toCryptoChartDetail","toBacktests","toBacktestCreate","toBacktestDetail","backtestId","toBacktestPresets","lazyLoadComponent","chunkName","load","componentLoader","lazy","cleanedTicker","resizeObserverPolyfill","getIsBrave","brave","isBrave","topLeft","bottomLeft","leftCenter","topCenter","bottomCenter","topRight","bottomRight","rightCenter","intlCache","getIntl","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","shortFormatNumber","suffix","formatted","fixedValue","toFixed","prefix","valueA","valueB","localeCompare","moveItemInArray","sourceIndex","destinationIndex","removed","splice","crypto","randomUUID","getRandomValues","Uint8Array","revalidateOnQueryChange","prevParams","currentUrl","nextParams","nextUrl","requiredChanged","otherChanged","defaultShouldRevalidate","parseRouteInitData","removeElement","initialData"],"sourceRoot":""}