{"version":3,"file":"libs_init.a4295a33.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/create-alert/EventCheckboxes.tsx","webpack://@finviz/website/./js/app/quote/create-alert/PriceInput.tsx","webpack://@finviz/website/./js/app/quote/create-alert/FormContent.tsx","webpack://@finviz/website/./js/app/quote/create-alert/utils.ts","webpack://@finviz/website/./js/app/quote/create-alert/SuccessContent.tsx","webpack://@finviz/website/./js/app/quote/create-alert/CreateAlert.tsx","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-focus-input-on-error.tsx","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: string\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 React from 'react'\r\n\r\nimport { Checkbox } from '../../../main/components/checkbox'\r\nimport { CreateAlertInputProps } from './types'\r\n\r\ntype EventType = 'news' | 'rating' | 'insider'\r\ntype EventOptionType = {\r\n name: EventType\r\n label: string\r\n}\r\n\r\nconst EVENTS: EventOptionType[] = [\r\n {\r\n name: 'news',\r\n label: 'News',\r\n },\r\n {\r\n name: 'rating',\r\n label: 'Ratings',\r\n },\r\n {\r\n name: 'insider',\r\n label: 'Insiders',\r\n },\r\n]\r\n\r\nexport default function EventCheckboxes(props: CreateAlertInputProps) {\r\n const handleChange = React.useCallback(\r\n (ev: React.FormEvent, name: EventType) => {\r\n const checked = ev.currentTarget.checked\r\n\r\n if (checked && !props.errors?.isEmpty) props.setErrors((errors) => ({ ...errors, isEmpty: false }))\r\n props.setState((prev) => ({ ...prev, [name]: checked }))\r\n },\r\n [props]\r\n )\r\n\r\n return (\r\n
\r\n {EVENTS.map((event) => (\r\n handleChange(e, event.name)}\r\n >\r\n {event.label}\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 { TooltipInput } from '../../../main/components/tooltip-input'\r\nimport { CreateAlertInputProps } from './types'\r\n\r\ntype PriceInputProps = {\r\n name: 'priceAbove' | 'priceBelow'\r\n label: string\r\n} & CreateAlertInputProps\r\n\r\nexport function PriceInput({ name, label, ...props }: PriceInputProps) {\r\n const [rawValue, setRawValue] = React.useState(props.state[name] ?? '')\r\n\r\n const handleBlur = React.useCallback(\r\n (ev: React.ChangeEvent) => {\r\n const price = ev.currentTarget.valueAsNumber\r\n\r\n if (price > 0 && props.errors?.[name]) props.setErrors((errors) => ({ ...errors, [name]: false }))\r\n props.setState((prev) => ({ ...prev, [name]: price }))\r\n },\r\n [name, props]\r\n )\r\n\r\n const tooltipContent = props.errors?.[name] ? 'Invalid number, please enter a positive number' : undefined\r\n\r\n React.useEffect(() => {\r\n const priceValue = Number(props.state[name] !== '' ? props.state[name] : undefined)\r\n if (!isNaN(priceValue)) setRawValue(priceValue.toString())\r\n }, [name, props.state])\r\n\r\n return (\r\n setRawValue(ev.currentTarget.value)}\r\n onBlur={handleBlur}\r\n tooltipColor=\"red\"\r\n tooltipContent={tooltipContent}\r\n isInteractive\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\nimport { useFocusInputOnError } from '../../../main/hooks/use-focus-input-on-error'\r\nimport { TickerEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/Ticker'\r\nimport { PortfolioBulkEditRowContextProvider } from '../../../main/modules/portfolio/components/PortfolioBulkEditRowContext'\r\nimport EventCheckboxes from './EventCheckboxes'\r\nimport { PriceInput } from './PriceInput'\r\nimport { CreateAlertEntry, FormErrors } from './types'\r\nimport { submit, validateState } from './utils'\r\n\r\nconst DEFAULT_STATE: CreateAlertEntry = {\r\n ticker: '',\r\n news: false,\r\n rating: false,\r\n insider: false,\r\n priceAbove: '',\r\n priceBelow: '',\r\n}\r\n\r\ntype FormContentProps = {\r\n ticker: string\r\n onSubmit: () => void\r\n onClose?: () => void\r\n}\r\n\r\nexport default function FormContent({ ticker, onSubmit, onClose }: FormContentProps) {\r\n const [state, setState] = React.useState({ ...DEFAULT_STATE, ticker })\r\n const [errors, setErrors] = React.useState({})\r\n const [apiError, setApiError] = React.useState()\r\n const formRef = React.useRef(null)\r\n\r\n useFocusInputOnError(errors)\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 return\r\n }\r\n\r\n const alert = Object.assign(\r\n state,\r\n typeof state.priceAbove === 'string' && { priceAbove: null },\r\n typeof state.priceBelow === 'string' && { priceBelow: null }\r\n )\r\n\r\n const result = await submit(alert)\r\n if (!result.isSuccess) {\r\n setApiError(result.message)\r\n } else {\r\n onSubmit()\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Get instant email notifications on the selected events.\r\n \r\n {(apiError || errors.isEmpty) && (\r\n \r\n {apiError ?? 'Please choose at least 1 event trigger'}\r\n \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","import { validateTickers } from '../../../main/modules/portfolio/services/api'\r\nimport { createAlertRequest } from '../../../main/services/api'\r\nimport { CreateAlertEntry, FormErrors } from './types'\r\n\r\nexport async function validateState(state: CreateAlertEntry) {\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 } else if (state.ticker !== undefined) {\r\n const validatedTickers = await validateTickers([state.ticker.toUpperCase()])\r\n formErrors.ticker = validatedTickers[0] !== true\r\n }\r\n\r\n if (state.priceAbove !== '' && Number(state.priceAbove) <= 0) {\r\n formErrors.priceAbove = true\r\n }\r\n\r\n if (state.priceBelow !== '' && Number(state.priceBelow) <= 0) {\r\n formErrors.priceBelow = true\r\n }\r\n\r\n const eventTriggers = { ...state, ticker: undefined }\r\n delete eventTriggers.ticker\r\n formErrors.isEmpty = Object.values(eventTriggers).every((trigger) => trigger !== 0 && !trigger)\r\n\r\n return { isValid: !Object.values(formErrors).some(Boolean), errors: formErrors }\r\n}\r\n\r\nexport async function submit(alert: CreateAlertEntry): Promise<{ isSuccess: boolean; message?: string }> {\r\n try {\r\n await createAlertRequest(alert)\r\n return { isSuccess: true }\r\n } catch (error) {\r\n const result = {\r\n isSuccess: false,\r\n message: 'There’s been an error creating the alert, make sure you’re connected to the Internet and try again.',\r\n }\r\n if (!!error && typeof error === 'object' && 'body' in error) {\r\n const apiError = error as { body: string }\r\n result.message = apiError.body\r\n }\r\n\r\n return result\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 onClose?: () => void\r\n}\r\n\r\nexport default function SuccessContent({ onClose }: SuccessContentProps) {\r\n return (\r\n <>\r\n \r\n
\r\n Alert successfully created.\r\n Do you wish to proceed to alerts?\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\n\r\ntype CreateAlertProps = {\r\n ticker: string\r\n isInlined?: boolean\r\n onClose?: () => void\r\n}\r\n\r\nexport function CreateAlert({ ticker, onClose, isInlined }: CreateAlertProps) {\r\n const [isSubmitted, setIsSubmitted] = React.useState(false)\r\n\r\n const handleFromSubmitted = () => {\r\n if (isInlined) {\r\n // @ts-ignore\r\n window.location = '/alerts.ashx'\r\n return\r\n }\r\n\r\n setIsSubmitted(true)\r\n }\r\n\r\n return (\r\n <>\r\n Create Alert\r\n\r\n {isSubmitted ? (\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 { 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 validatedTickers = await validateTickers([state.ticker.toUpperCase()])\r\n formErrors.ticker = validatedTickers[0] !== true\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 { useFocusInputOnError } from '../../../main/hooks/use-focus-input-on-error'\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 { PortfolioSymbolType, PortfolioTransaction } from '../../../main/modules/portfolio/types'\r\nimport { getTransactionsForSymbolType } from '../../../main/modules/portfolio/utils'\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 = [\r\n PortfolioTransaction.Watch,\r\n ...getTransactionsForSymbolType(PortfolioSymbolType.Stock),\r\n].map((value) => ({ label: TRANSACTION_LABEL[value], value }))\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 useFocusInputOnError(errors)\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 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 \r\n {onClose && (\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, specialTickers: string[] = []) {\r\n return rawTicker\r\n .replace(/\\.+/gi, '-')\r\n .split('-')\r\n .map((x) => {\r\n if (specialTickers.includes(x.toUpperCase())) return x\r\n return x.replace(/([^a-z0-9@-])+/gi, '')\r\n })\r\n .filter((x) => !!x)\r\n .join('-')\r\n .toUpperCase()\r\n}\r\n\r\nexport function getSanitizedTicker(rawTicker: string, isMulti = false, specialTickers: string[] = []) {\r\n if (isMulti) {\r\n return rawTicker\r\n .replace(/ /g, ',')\r\n .split(',')\r\n .map((x) => getSanitizedSingleTicker(x, specialTickers))\r\n .filter((x) => !!x)\r\n .join(',')\r\n }\r\n\r\n return getSanitizedSingleTicker(rawTicker, specialTickers)\r\n}\r\n","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-200/30 dark:hover:bg-gray-500/30':\r\n 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\ninterface UseTableSortProps<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort,\r\n> {\r\n data: DataType[]\r\n columns: 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\r\ninterface UseTableSortWithUrlProps<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort,\r\n> extends UseTableSortProps {\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\nexport function useTableSort<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort,\r\n>({ data, columns, defaultSort, valueGetter }: UseTableSortProps) {\r\n const [sort, setSort] = React.useState(getDefaultSort(columns, defaultSort))\r\n\r\n const changeSort = React.useCallback((newSort: ColumnType, direction?: SortDirection) => {\r\n setSort((prevSort) => {\r\n if (newSort && direction) {\r\n return { column: newSort, direction }\r\n }\r\n\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\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\r\nexport function useTableSortWithUrl<\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}: UseTableSortWithUrlProps) {\r\n const {\r\n data: sortedData,\r\n changeSort: changeSortState,\r\n sort,\r\n } = useTableSort({ data, columns, defaultSort, valueGetter })\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\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 changeSortState(newSort)\r\n },\r\n [idKey, setSearchParams, urlPersistKey, changeSortState]\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 changeSortState(sort.column, sort.direction)\r\n }\r\n }, [columns, idKey, searchParams, urlPersistKey, changeSortState])\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 lightTransparent,\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/90 disabled:bg-gray-200/30 disabled:text-gray-400 disabled:hover:bg-gray-200/30 disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-gray-200/30 hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n 'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.lightTransparent: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-gray-200/90 disabled:bg-transparent disabled:text-gray-400 disabled:hover:bg-transparent disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-transparent hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n 'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.dark: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-gray-50 active:bg-gray-500/90 disabled:bg-gray-500/30 disabled:text-gray-300 disabled:hover:bg-gray-500/30 disabled:hover:text-gray-300',\r\n {\r\n 'bg-gray-500/30 hover:bg-gray-500/50': !active,\r\n 'bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blue: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white hover:text-white active:bg-blue-600 disabled:bg-blue-200 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-blue-400 hover:bg-blue-500': !active,\r\n 'bg-blue-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.violet: {\r\n return {\r\n button: classnames(\r\n 'text-white hover:text-white 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-200/30 disabled:text-gray-400 disabled:hover:text-gray-400 dark:hover:bg-gray-500/30':\r\n !active,\r\n 'bg-gray-200/30 dark:bg-gray-500/30': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.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-200/30 hover:bg-gray-200/30 dark:bg-gray-700 dark:hover:bg-gray-500/30': !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:border-blue-400 dark:bg-gray-500/30 dark:text-white': active,\r\n }),\r\n }\r\n case ButtonTheme.chipTransparent:\r\n return {\r\n button: classnames(\r\n 'border dark:disabled:hover:bg-transparent disabled:hover:bg-transparent dark:disabled:hover:text-gray-400 disabled:hover:text-gray-500', // Base styles\r\n {\r\n 'border-transparent text-gray-500 hover:bg-gray-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-500/30 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n 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 \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 * Whether or not should trigger element call blur to return focus back to body after click\r\n *\r\n * @default false\r\n */\r\n isBlurAfterClick?: boolean\r\n\r\n /**\r\n * Whether to ignore default mouse enter/leave tooltip trigger interactions\r\n * and hide tooltip only after clicking outside of the trigger element\r\n *\r\n * @default false\r\n */\r\n isHideOnClickOutside?: boolean\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const TooltipTrigger = React.forwardRef(\r\n (\r\n {\r\n state,\r\n isBlurAfterClick,\r\n isHideOnClickOutside,\r\n onClick,\r\n onMouseEnter,\r\n onMouseLeave,\r\n ...props\r\n }: TooltipButtonProps,\r\n ref: React.ForwardedRef\r\n ) => (\r\n {\r\n if (isBlurAfterClick && document.activeElement instanceof HTMLElement) {\r\n document.activeElement.blur()\r\n }\r\n onClick?.(e)\r\n }}\r\n onMouseEnter={(e) => {\r\n if (isHideOnClickOutside) e.preventDefault()\r\n onMouseEnter?.(e)\r\n }}\r\n onMouseLeave={(e) => {\r\n if (isHideOnClickOutside) e.preventDefault()\r\n onMouseLeave?.(e)\r\n }}\r\n {...props}\r\n {...state}\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 * as React from 'react'\r\n\r\n/**\r\n * This hook is used to manually blur & focus first error input (or the one which is focussed now and has error)\r\n * The reason for this workaround is that we use reakit tooltips to show error message but the tooltip wrapper\r\n * is not rendered until there's actually an error but the tooltip trigger is rendered, and also it's open state is true\r\n * if the error input is currently the focused one. Focusing the input sets tooltip open state to true but nothing\r\n * is shown because there's no error thus the wrapper is not rendered.\r\n *\r\n * The issue is that if it's in open state (the input is focussed) and the input becomes invalid (has error)\r\n * it renderes tooltip wrapper with error message, but it doesn't recalculate (actually it doesn't calculate anything\r\n * unless both tooltip trigger and tooltip wrapper are rendered) its position, so it seems nothing is shown.\r\n *\r\n * This magic workaround triggers changes in effect hook inside reakit, so it recalculates tooltip position, it basically\r\n * closes and openes the tooltip again. Btw calling manually hide & show after doesn't work the same way.\r\n *\r\n * */\r\nexport function useFocusInputOnError(errors: unknown) {\r\n const lastFocusedElement = React.useRef(null)\r\n React.useEffect(() => {\r\n let errorInputToFocus = document.querySelector('.is-error input')\r\n const activeElement = document.activeElement\r\n if (lastFocusedElement.current === activeElement) {\r\n // this is done to prevent focusing another element if user types something\r\n // into current error input which resets the input error and triggers this effect\r\n lastFocusedElement.current = null\r\n return\r\n }\r\n if (activeElement?.classList.contains('is-error')) {\r\n errorInputToFocus = activeElement as HTMLInputElement\r\n }\r\n\r\n lastFocusedElement.current = errorInputToFocus\r\n\r\n errorInputToFocus?.blur?.()\r\n setTimeout(() => errorInputToFocus?.focus?.())\r\n }, [errors])\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 {\r\n ColumnId,\r\n PortfolioGroup,\r\n PortfolioSymbolType,\r\n RowKind,\r\n TableColumnDefinition,\r\n} 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 stockRows = React.useMemo(() => data.filter((group) => group.type !== PortfolioSymbolType.Cash), [data])\r\n const tableSort = useTableSort({ data: stockRows, 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-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n !isActive,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': isActive,\r\n }\r\n ),\r\n theme: 'transparent',\r\n rounding: 'small',\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarButtonProps extends Omit {\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 createAlert from '../../app/quote/create-alert'\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 ...createAlert,\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\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 isHideOnClickOutside: true,\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 ? { ...errors, date: false } : errors))\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 ? { ...errors, date: false } : errors))\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, SelectItem, SelectOption, SelectPlaceholder } from '../../../../components/select'\r\nimport { SelectListProps } from '../../../../components/select/select-list'\r\nimport { TRANSACTION_LABEL } from '../../constants/general'\r\nimport { getSymbolType, getTransactionsForSymbolType } from '../../utils'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\ninterface TransactionEditColumnProps extends EditColumnProps {\r\n transactions?: Array>\r\n optionListProps?: Omit\r\n}\r\n\r\nexport function TransactionEditColumn<\r\n StateType extends {\r\n ticker: string\r\n transaction?: number\r\n },\r\n ErrorsType extends {\r\n transaction?: boolean\r\n },\r\n>({\r\n transactions,\r\n optionListProps = { className: 'min-w-28' },\r\n ...props\r\n}: TransactionEditColumnProps) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n const transactionOptions = React.useMemo[]>(() => {\r\n if (transactions?.length) return transactions\r\n const symbolType = getSymbolType(props.entry.ticker)\r\n const options = getTransactionsForSymbolType(symbolType)\r\n\r\n return options.map((value) => ({ label: TRANSACTION_LABEL[value], value }))\r\n }, [props.entry.ticker, transactions])\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 {transactionOptions.map((item) => (\r\n \r\n {item.label}\r\n \r\n ))}\r\n \r\n ) : (\r\n value === props.entry.transaction)?.label ??\r\n transactionOptions[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 classNames from 'classnames'\r\nimport * as dateFns from 'date-fns'\r\n\r\nimport { RedGreenMultiline, RedGreenText } from '../../../components/RedGreenText'\r\nimport { TableAlign } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, PortfolioSymbolType, PortfolioTransaction, RowKind, 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 if (args.row.type === PortfolioSymbolType.Stock) {\r\n return (\r\n ev.stopPropagation()}\r\n >\r\n {args.row.ticker}\r\n \r\n )\r\n }\r\n\r\n return {args.row.ticker}\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 if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\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 if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\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 if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\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 if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\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 if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\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 if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\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.Summary && args.row.type === PortfolioSymbolType.Cash) return null\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.Amount]: {\r\n id: ColumnId.Amount,\r\n urlSort: 'amount',\r\n name: 'Amount',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.valuePaid,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Trade && args.kind !== RowKind.Transaction) return null\r\n return formatNumber(args.row.price)\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.Summary && args.row.type === PortfolioSymbolType.Cash) return null\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.Summary && args.row.type === PortfolioSymbolType.Cash) return null\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.Summary && args.row.type === PortfolioSymbolType.Cash) return null\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_CASH_SYMBOL = '$CASH'\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\r\n // Stock transactions\r\n [PortfolioTransaction.Buy]: 'Buy',\r\n [PortfolioTransaction.Short]: 'Short Sell',\r\n\r\n // Cash transactions\r\n [PortfolioTransaction.CashDeposit]: 'Cash Deposit',\r\n [PortfolioTransaction.CashWithdraw]: 'Cash Withdraw',\r\n [PortfolioTransaction.CashIncome]: 'Income',\r\n [PortfolioTransaction.CashFee]: 'Fee',\r\n}\r\n\r\nexport const STOCK_TRANSACTIONS = [PortfolioTransaction.Buy, PortfolioTransaction.Short]\r\n\r\nexport const CASH_TRANSACTIONS = [\r\n PortfolioTransaction.CashDeposit,\r\n PortfolioTransaction.CashWithdraw,\r\n PortfolioTransaction.CashIncome,\r\n PortfolioTransaction.CashFee,\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 { PORTFOLIO_CASH_SYMBOL } from '../constants/general'\r\nimport {\r\n PortfolioDefinition,\r\n PortfolioEntryBase,\r\n PortfolioFormGroup,\r\n PortfolioInitData,\r\n PortfolioSymbolType,\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?: Omit) {\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; specialSymbols: Record }>(\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 const specialTickers = Object.keys(response?.specialSymbols ?? [])\r\n\r\n return tickers.map((ticker) => [...specialTickers, ...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(), false, [PORTFOLIO_CASH_SYMBOL])\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 const calculatedPrice = isNaN(price) ? transaction.price : price\r\n const calculatedShares = isNaN(shares) ? transaction.shares : shares\r\n\r\n return {\r\n ...transaction,\r\n transaction:\r\n transaction.transaction === PortfolioTransaction.Watch ? PortfolioTransaction.Buy : transaction.transaction,\r\n price: transaction.type === PortfolioSymbolType.Cash ? 0 : calculatedPrice,\r\n shares: transaction.type === PortfolioSymbolType.Cash ? 0 : calculatedShares,\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 { TableAlign } from '../../components/Table'\r\nimport { 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 PortfolioSymbolType {\r\n Stock = 'stock',\r\n Cash = 'cash',\r\n}\r\n\r\nexport enum PortfolioTransaction {\r\n Watch = 0,\r\n\r\n // Stock transactions\r\n Buy = 1,\r\n Short = 2,\r\n\r\n // Cash transactions\r\n CashDeposit = 200,\r\n CashWithdraw = 201,\r\n CashIncome = 202,\r\n CashFee = 203,\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 type: PortfolioSymbolType\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\nexport type PortfolioActionType = PortfolioEntryTransaction & { isNotification?: boolean; message?: string }\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 type: PortfolioSymbolType\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 valueMarketStocks: number\r\n valueMarketStocksPrev: 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 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 Amount = 'amount',\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 { formatNumber, getUuid } from '../../util'\r\nimport { columnMap } from './constants/columns'\r\nimport {\r\n CASH_TRANSACTIONS,\r\n EMPTY_FORM_ENTRY,\r\n PORTFOLIO_CASH_SYMBOL,\r\n PORTFOLIO_DATE_FORMAT_DATA,\r\n PORTFOLIO_DATE_FORMAT_VIEW,\r\n STOCK_TRANSACTIONS,\r\n} from './constants/general'\r\nimport * as api from './services/api'\r\nimport {\r\n ColumnId,\r\n FormErrors,\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 PortfolioSymbolType,\r\n PortfolioTransaction,\r\n PortfolioTransactionStake,\r\n PortfolioView,\r\n} from './types'\r\n\r\nexport enum PortfolioDataKey {\r\n Cash = 'cash',\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 valueMarketStocks: 0,\r\n valueMarketStocksPrev: 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 valueMarketStocks =\r\n prev.valueMarketStocks + (current.type === PortfolioSymbolType.Cash ? 0 : current.valueMarket)\r\n const valueMarketStocksPrev =\r\n prev.valueMarketStocksPrev + (current.type === PortfolioSymbolType.Cash ? 0 : current.valueMarketPrev)\r\n const valuePaid = prev.valuePaid + current.valuePaid\r\n const lastChangePct = valueMarketStocksPrev <= 0 ? 0 : (valueMarketStocks / valueMarketStocksPrev - 1) * 100\r\n const gainMarketPct = valuePaid <= 0 ? 0 : (valueMarketStocks / valuePaid - 1) * 100\r\n\r\n return {\r\n ...prev,\r\n valueMarket: valueMarket,\r\n valueMarketStocks,\r\n valueMarketStocksPrev,\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\nfunction isMapTransaction(entry: PortfolioEntryTransaction): entry is PortfolioTransactionStake {\r\n return entry.shares > 0 || entry.type === PortfolioSymbolType.Cash\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 (!isMapTransaction(entry)) return\r\n\r\n const previouslyAdded = result.findIndex(\r\n (prev) =>\r\n prev.ticker === entry.ticker &&\r\n (entry.type === PortfolioSymbolType.Cash ? true : 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(type: PortfolioSymbolType, gain: number, transaction: PortfolioTransaction) {\r\n if (type === PortfolioSymbolType.Cash) return PortfolioDataKey.Cash\r\n\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 let groupName = ''\r\n switch (key) {\r\n case PortfolioDataKey.Cash:\r\n groupName = 'Other'\r\n break\r\n default:\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 groupName = `${isLong ? longPrefix : shortPrefix}${isGainer ? groupLabel.gainers : groupLabel.losers}`\r\n break\r\n }\r\n\r\n if (groupByIndustry) {\r\n let children: Array<{ name: string; children: MapDataNode[] }> = []\r\n if (key === PortfolioDataKey.Cash && data[key].length) children = [{ name: 'Cash', children: data[key] }]\r\n else 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.type, 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: current.type === PortfolioSymbolType.Cash ? null : perfText ?? subtypePerf,\r\n additional:\r\n current.type === PortfolioSymbolType.Cash\r\n ? formatNumber(current.valueMarket)\r\n : 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.Cash]: [],\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: 'Portfolio',\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(\r\n data: Array,\r\n options: { resetCash?: boolean } = {}\r\n): 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 =\r\n row.transactions.length === 0 || (options.resetCash && getSymbolType(row.ticker) === PortfolioSymbolType.Cash)\r\n ? [getNewTransaction(row.ticker, PortfolioTransaction.Watch)]\r\n : row.transactions.map((transaction) => ({\r\n ...transaction,\r\n uuid: transaction.id ? `${transaction.id}` : getUuid(),\r\n }))\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[], validateFields = true) {\r\n if (data.length === 0) return { isValid: true, errors: {} }\r\n\r\n let isValid = true\r\n const errors: Record = {}\r\n\r\n try {\r\n const tickers = data.map((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim(), false, [PORTFOLIO_CASH_SYMBOL])\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 if (validateFields) {\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 } catch {\r\n return {\r\n isValid: false,\r\n errors: {},\r\n }\r\n }\r\n\r\n return { isValid, errors }\r\n}\r\n\r\nexport function getNumberValue(value?: number) {\r\n if (value === undefined || isNaN(value)) return NaN\r\n return value\r\n}\r\n\r\nexport function getNewTransaction(ticker: string, transaction = PortfolioTransaction.Buy): PortfolioFormEntry {\r\n const symbolType = getSymbolType(ticker)\r\n const allowedTransactions = getTransactionsForSymbolType(symbolType)\r\n\r\n return {\r\n ...EMPTY_FORM_ENTRY,\r\n uuid: getUuid() as string,\r\n ticker,\r\n type: getSymbolType(ticker),\r\n date: getFormattedDate(PORTFOLIO_DATE_FORMAT_DATA),\r\n transaction: [PortfolioTransaction.Watch, ...allowedTransactions].includes(transaction)\r\n ? transaction\r\n : allowedTransactions[0],\r\n shares: transaction === PortfolioTransaction.Watch || symbolType === PortfolioSymbolType.Cash ? 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\r\nexport function getSymbolType(symbol?: string) {\r\n if (symbol?.toUpperCase() === PORTFOLIO_CASH_SYMBOL) return PortfolioSymbolType.Cash\r\n\r\n return PortfolioSymbolType.Stock\r\n}\r\n\r\nexport function isStockTransaction(transaction: PortfolioTransaction) {\r\n return STOCK_TRANSACTIONS.includes(transaction)\r\n}\r\n\r\nexport function isCashTransaction(transaction: PortfolioTransaction) {\r\n return CASH_TRANSACTIONS.includes(transaction)\r\n}\r\n\r\nexport function getTransactionsForSymbolType(symbolType: PortfolioSymbolType) {\r\n switch (symbolType) {\r\n case PortfolioSymbolType.Cash:\r\n return CASH_TRANSACTIONS\r\n default:\r\n return STOCK_TRANSACTIONS\r\n }\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { CreateAlertEntry } from '../../app/quote/create-alert/types'\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\r\nexport function createAlertRequest(state: CreateAlertEntry) {\r\n return apiRequest(\r\n '/create_alert.ashx',\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(state),\r\n },\r\n true\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","EVENTS","EventCheckboxes","handleChange","ev","checked","currentTarget","errors","isEmpty","setErrors","map","event","Checkbox","isSmall","onChange","e","PriceInput","rawValue","setRawValue","handleBlur","price","valueAsNumber","tooltipContent","priceValue","Number","isNaN","TooltipInput","isMobileStyleEnabled","showNumberStepper","error","classNames","onBlur","tooltipColor","isInteractive","DEFAULT_STATE","ticker","news","rating","insider","priceAbove","priceBelow","FormContent","onSubmit","onClose","apiError","setApiError","formRef","useFocusInputOnError","PortfolioBulkEditRowContextProvider","hasAlwaysActiveOverride","DialogBody","id","noValidate","autoComplete","async","preventDefault","isValid","formErrors","trim","validatedTickers","validateTickers","eventTriggers","every","trigger","some","Boolean","validateState","alert","assign","result","createAlertRequest","isSuccess","message","body","submit","Paragraph","size","TickerEditColumn","entry","DialogFooter","Button","onClick","form","theme","SuccessContent","as","href","CreateAlert","isInlined","isSubmitted","setIsSubmitted","DialogHeader","onCloseClick","handleFromSubmitted","PortfolioInput","portfolio","portfolioName","handleSelect","option","portfolioId","portfolios","Select","isHorizontalLabel","labelClassName","listProps","items","hasPopoverViewportHeightLimit","item","SelectOption","maxLength","PORTFOLIO_BASE_URL","transaction","PortfolioTransaction","PORTFOLIO_DATE_FORMAT_DATA","shares","TRANSACTION_OPTIONS","getTransactionsForSymbolType","PortfolioSymbolType","TRANSACTION_LABEL","setPortfolios","response","portfoliosRequest","p","fetchPortfolios","lastClose","lastCloseRequest","fetchLastClose","commonProps","validateEditRow","limitResponse","portfolioLimitRequest","transactions","limitTransactions","pid","createdPortfolioResponse","portfolioTickers","tickers","Error","portfolioEntry","submitForm","TransactionEditColumn","optionListProps","DateEditColumn","SharesEditColumn","inputClassName","CostPerShareEditColumn","portfolioUrl","SaveToPortfolio","setPortfolioUrl","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","specialTickers","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","Sentry","captureException","getSidebarFromCookie","chartsUrl","sidebar","RedGreenText","rightContent","rightClass","hasValue","isFinite","Icon","RedGreenMultiline","_ref2","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","getDefaultSort","columns","defaultSort","column","isSortByShape","Ascending","getDefaultSortFromUrl","order","idKey","isDesc","startsWith","queryParam","Descending","useTableSort","data","valueGetter","sort","setSort","changeSort","newSort","prevSort","useSortData","sortBy","useTableSortWithUrl","urlPersistKey","sortedData","changeSortState","searchParams","setSearchParams","useSearchParams","defaultSortRef","get","newParams","URLSearchParams","previousOrder","isDescOrder","set","saveSortToUrl","preventScrollReset","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","lightTransparent","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","defaultChecked","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","_hex","orignalColor","InputColorPicker","inputDataTestId","popoverState","usePopoverState","PopoverTrigger","Popover","focusOnShow","hide","MultiColorPicker","colorInputLabel","ColorTabButton","ButtonColorPicker","buttonPickerDataTestId","hideOnClickOutside","onOverlayClick","isMultiPicker","activeColorIndex","setActiveColorIndex","handleColorChange","originalColor","colorObject","visible","_ref4","_ref5","COMPONENT_ANIMATION_DURATION","CopyToClipboard","text","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","timeout","resetTimer","clearTimeout","setTimeout","Textarea","readOnly","select","DatePickerComponent","StatelessDatePicker","zIndex","isFullyClosed","getExtendedDialogState","triggerProps","ZIndexContext","fallback","Spinner","locale","minDetail","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","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","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","isBlurAfterClick","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","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","isHideOnClickOutside","TooltipInputComponent","TooltipBox","TooltipColor","tooltipProps","onMouseEnter","onMouseLeave","HTMLElement","blur","transformMap","auto","positionMain","arrowColor","getHeadingElement","CRYPTO_TICKERS","useIsMounted","isMountedRef","getIsMounted","elementOverride","elementRef","setElementWidth","setElementHeight","offsetHeight","measureElement","newElementWidth","newElementHeight","measureElementDebounced","debounce","resizeObserver","cancel","lastFocusedElement","errorInputToFocus","querySelector","focus","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","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","stockRows","group","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","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","createAlert","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","getNumberValue","isNaNValue","showError","updateOnChange","numberValue","DateEditColumnWithPicker","pickerState","pickerExtendedState","tooltipState","tooltipExtendedState","wrapperProps","isInteractingWithDateInput","onDateChange","dateValue","parsedDate","parseInputAsDate","picker","inputElement","checkFormat","PORTFOLIO_DATE_FORMAT_VIEW","MAX_SHARES","sharesValue","transactionOptions","symbolType","getSymbolType","PortfolioBulkEditRowContext","setIsInView","isInteracting","isInView","freeze","urlSort","args","formatNumber","costAvg","prevClose","lastChange","showPlusSign","fractions","lastChangePct","lastVolume","valuePaid","valueMarket","gainMarketUsd","gainMarketPct","gainTodayUsd","PORTFOLIO_CASH_SYMBOL","PORTFOLIO_REFRESH_INTERVAL","STOCK_TRANSACTIONS","CASH_TRANSACTIONS","EMPTY_FORM_ENTRY","PORTFOLIO_INPUT_NAME","PORTFOLIO_INPUT_EMPTY_ERROR","PORTFOLIO_INPUT_EXISTS_ERROR","TICKERS_INPUT_NAME","TICKERS_INPUT_FORMAT_TIP","EMPTY_RESPONSE","limit","portfolioData","apiRequest","deletePortfolio","method","stringify","QUOTE_INVALID_TICKER_REQUEST","QUOTE_INVALID_TICKER_RESPONSE","quoteData","headers","ContentType","json","parsedTickers","specialSymbols","recalculatePortfolio","numberOfTransactions","totalValue","pricePerColumn","prices","captureMessage","extra","requestTickers","requestTickersLength","responseLength","tickerPrices","fromEntries","tickerPrice","NaN","calculatedPrice","calculatedShares","ErrorSource","portfolio_name","submitEditForm","reorderPortfolios","PortfolioQuery","PortfolioMapSizeKey","PortfolioView","PortfolioTableView","PortfolioTableViewLabels","Ticker","Trade","ActionKind","PortfolioDataKey","industryLabelKey","groupPrefix","groupLabel","DEFAULT_SETTINGS","tableView","showMap","showIndustries","subtype","parseBoolFromValue","getMapSettingFromLocalStorage","savedSettings","saveMapSettingToLocalStorage","itemToStore","customTickersOrder","SUMMARY_DEFAULT","valueMarketStocks","valueMarketStocksPrev","getSummary","valueMarketPrev","flattenAndDedupe","isMapTransaction","previouslyAdded","newEntry","prevEntry","getIndustries","industries","industry","groupByKey","concat","getPerfForTicker","perf","getMapData","perfData","groupByIndustry","hasData","parsedData","gain","Cash","ShortGainers","ShortLosers","LongGainers","LongLosers","getEntryGroup","subtypePerf","getPerfText","perfText","nodes","additional","description","perfWeek","groupName","isLong","isGainer","longPrefix","shortGainers","shortLosers","shortPrefix","longGainers","longLosers","createGroup","parsePortfolioQuery","params","defaultPortfolioId","currentPortfolio","view","getFormattedDate","dateFormat","FORM_ENTRY_KEYS","getBulkEditData","existingId","getUuid","resetCash","getNewTransaction","uuid","serializeFormData","serializer","append","appendRowToFormData","validateFormData","validateFields","api","validationResult","hasInvalidEntries","isInvalidTicker","allowedTransactions","getPortfolioInitData","returnData","isInitData","initData","EMPTY_TRANSACTION","getTradesStructureData","symbol","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":""}