{"version":3,"file":"main.8045c958.js","mappings":"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","sources":["webpack://charts/./app/modals/background.tsx","webpack://charts/./app/modals/color_range_row.tsx","webpack://charts/./app/modals/border.tsx","webpack://charts/./app/modals/checkbox.tsx","webpack://charts/./app/modals/font.tsx","webpack://charts/./app/modals/line.tsx","webpack://charts/./app/modals/multiline_string.tsx","webpack://charts/./app/modals/number.tsx","webpack://charts/./app/modals/string.tsx","webpack://charts/./app/modals/trend.tsx","webpack://charts/./app/modals/visibility/visibility-input.tsx","webpack://charts/./app/modals/visibility/index.tsx","webpack://charts/./app/modals/element_style.tsx","webpack://charts/./app/controllers/autosave/utils.ts","webpack://charts/./app/controllers/autosave/constants.ts","webpack://charts/./app/controllers/autosave/use-drawing-autosave-api.ts","webpack://charts/./app/utils/string-byte-length.ts","webpack://charts/./app/controllers/autosave/use-drawing-auto-save-controls.ts","webpack://charts/./app/controllers/autosave/use-is-auto-save-active.ts","webpack://charts/./app/controllers/autosave/with-auto-save.tsx","webpack://charts/./app/utils/use-prev-state.ts","webpack://charts/./app/modals/ideas.tsx","webpack://charts/./app/controllers/header/ideas_dropdown.tsx","webpack://charts/./app/modals/publish/async-modules.ts","webpack://charts/./app/controllers/header/publish.tsx","webpack://charts/./app/controllers/header/tour_button.tsx","webpack://charts/./app/controllers/chart-controls/chart-type-select.tsx","webpack://charts/./app/controllers/chart-controls/use-chart-types.ts","webpack://charts/./app/controllers/chart-controls/daily-change-display.tsx","webpack://charts/./app/controllers/chart-controls/draw-button.tsx","webpack://charts/./app/controllers/chart-controls/fullscreen-button.tsx","webpack://charts/./app/controllers/chart-controls/search.tsx","webpack://charts/./app/controllers/chart-controls/settings-button.tsx","webpack://charts/./app/controllers/chart-controls/use-chart-controls.ts","webpack://charts/./app/model-hooks/useModelRef.ts","webpack://charts/./app/controllers/chart-controls/chart-controls.tsx","webpack://charts/external var \"FLibs.Hammerjs\"","webpack://charts/./app/controllers/chart-events/badges/get-chart-event-badge-element.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/chart-event-popover-table-row.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/dividends-popover-content.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/earnings-popover-content.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/split-popover-content.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/chart-event-popover.tsx","webpack://charts/./app/controllers/chart-events/chart-event-popover/chart-event-popover-with-state.tsx","webpack://charts/./app/utils/use-click-away.ts","webpack://charts/./app/controllers/chart_layout/constants.ts","webpack://charts/./app/models/context_menu.ts","webpack://charts/./app/controllers/context_menu.tsx","webpack://charts/./app/controllers/pane/load-latest-data-button.tsx","webpack://charts/./app/controllers/pane/zoom_controls.tsx","webpack://charts/./app/controllers/pane/pane.tsx","webpack://charts/./app/controllers/pane/with-pane-model.tsx","webpack://charts/./app/controllers/chart/chart-spinner-overlay.tsx","webpack://charts/./app/controllers/chart/constants.ts","webpack://charts/./app/controllers/chart/chart.tsx","webpack://charts/./app/controllers/chart/with-chart-init.tsx","webpack://charts/./app/controllers/chart/with-watched-panes-on-chart-model.tsx","webpack://charts/./app/controllers/sidebar/modules/portfolio-watchlist/async-modules.ts","webpack://charts/./app/controllers/sidebar/modules/module-load-failed.tsx","webpack://charts/./app/controllers/sidebar/modules/modules.ts","webpack://charts/./app/controllers/sidebar/modules/with-module-async-load.tsx","webpack://charts/./app/controllers/sidebar/sidebar-content.tsx","webpack://charts/./app/controllers/sidebar/sidebar-tabs.tsx","webpack://charts/./app/controllers/sidebar/sidebar.tsx","webpack://charts/./app/creators/async-modules.ts","webpack://charts/./app/controllers/toolbar/drawingActions.tsx","webpack://charts/./app/controllers/toolbar/drawingSettings.tsx","webpack://charts/./app/controllers/toolbar/drawingTools.ts","webpack://charts/./app/controllers/toolbar/toolbar.tsx","webpack://charts/./app/controllers/toolbar/index.ts","webpack://charts/./app/controllers/toolbar/auto-save-notes/auto-save-notes.tsx","webpack://charts/./app/controllers/toolbar/auto-save-notes/auto-save-notes-dialog.tsx","webpack://charts/./app/controllers/toolbar/confirmation_dialog.tsx","webpack://charts/./app/controllers/toolbar/mobile/tool-button.tsx","webpack://charts/./app/controllers/toolbar/mobile/toolbar-mobile.tsx","webpack://charts/./app/controllers/chart_layout/auto-save-state-indicator.tsx","webpack://charts/./app/controllers/chart_layout/chart-layout-auto-save-note.tsx","webpack://charts/./app/controllers/chart_layout/publish_old_button_click_listener.tsx","webpack://charts/./app/controllers/autosave/idea-leave-dialog.tsx","webpack://charts/./app/controllers/chart_layout/with-chart-route-change.tsx","webpack://charts/./app/controllers/chart_layout/with-complete-layout-model-init.tsx","webpack://charts/./app/controllers/chart_layout/with-quote-cache-management.tsx","webpack://charts/./app/controllers/chart_layout/with-quote-polling.tsx","webpack://charts/./app/controllers/chart_layout/chart_layout_component.tsx","webpack://charts/./app/controllers/with_dialog_state_hook.tsx","webpack://charts/./app/controllers/chart_layout/with-chart-page-title.tsx","webpack://charts/./app/controllers/chart_layout/with-idea-model-state.tsx","webpack://charts/./app/controllers/chart_layout/chart_layout.tsx","webpack://charts/./app/controllers/header/fullscreen_button.tsx","webpack://charts/./app/controllers/header/layout_dropdown.tsx","webpack://charts/./app/helpers/sorter.ts","webpack://charts/./app/controllers/header/theme_toggle_button.tsx","webpack://charts/./app/controllers/header/index.tsx","webpack://charts/./app/controllers/chart-controls/stock-detail-timeframe-bar.tsx","webpack://charts/./app/utils/convert_ta.ts","webpack://charts/./node_modules/@finviz/spine/lib/ sync $^","webpack://charts/./app/components.js","webpack://charts/./app/constants/colors.js","webpack://charts/./app/website-shared.js","webpack://charts/./app/lib-export.js","webpack://charts/./app/canvas/arrow.ts","webpack://charts/./app/canvas/brush/brush_v1.ts","webpack://charts/./app/canvas/callout/callout_utils.ts","webpack://charts/./app/canvas/callout/callout_v1.ts","webpack://charts/./app/canvas/curve.ts","webpack://charts/./app/canvas/ellipse.ts","webpack://charts/./app/canvas/rotated_rectangle.ts","webpack://charts/./app/canvas/symbol.ts","webpack://charts/./app/canvas/drawingTools.ts","webpack://charts/./app/canvas/element.ts","webpack://charts/./app/canvas/elliott_waves/elliott_waves.ts","webpack://charts/./app/canvas/ellipse/ellipse_v1.ts","webpack://charts/./app/canvas/fibonacci_retracements.ts","webpack://charts/./app/canvas/horizontal_line.ts","webpack://charts/./app/canvas/line.ts","webpack://charts/./app/canvas/measure.ts","webpack://charts/./app/canvas/pitchfork/pitchfork_utils.ts","webpack://charts/./app/canvas/pitchfork/pitchfork_v1.ts","webpack://charts/./app/canvas/polygon.ts","webpack://charts/./app/canvas/position.ts","webpack://charts/./app/canvas/rectangle.ts","webpack://charts/./app/canvas/rotated_rectangle/rotated_rectangle_v1.ts","webpack://charts/./app/canvas/scaled_line.ts","webpack://charts/./app/canvas/scaled_text.ts","webpack://charts/./app/canvas/text.ts","webpack://charts/./app/canvas/thumb.ts","webpack://charts/./app/canvas/triangle.ts","webpack://charts/./app/canvas/vertical_line.ts","webpack://charts/./app/canvas/xabcd.ts","webpack://charts/./app/canvas/cache.js","webpack://charts/./app/charts/utils.ts","webpack://charts/./app/charts/base_chart.ts","webpack://charts/./app/charts/candle_stick.ts","webpack://charts/./app/charts/candle_stick_hollow.ts","webpack://charts/./app/charts/heikin_ashi.ts","webpack://charts/./app/charts/line_chart.ts","webpack://charts/./app/charts/market_sentiment.ts","webpack://charts/./app/charts/multi_line_chart.ts","webpack://charts/./app/charts/ohlc_chart.ts","webpack://charts/./app/charts/perf_chart.ts","webpack://charts/./app/charts/charts.ts","webpack://charts/./app/constants/common.ts","webpack://charts/./app/controllers/chart-controls/use-chart-model-custom-date-range-values.tsx","webpack://charts/./app/controllers/chart-controls/use-charts-path-location.ts","webpack://charts/./app/controllers/chart-controls/utils.ts","webpack://charts/./app/controllers/chart-events/badges/chart-badge-svg-by-type.ts","webpack://charts/./app/controllers/chart-events/badges/earnings.ts","webpack://charts/./app/controllers/chart-events/badges/chart-badges-svg-by-type.ts","webpack://charts/./app/controllers/chart-events/badges/split.ts","webpack://charts/./app/controllers/chart-events/badges/dividends.ts","webpack://charts/./app/controllers/chart-events/badges/earnings-positive.ts","webpack://charts/./app/controllers/chart-events/badges/earnings-negative.ts","webpack://charts/./app/controllers/chart-events/badges/earnings-neutral.ts","webpack://charts/./app/controllers/chart-events/badges/earnings-future.ts","webpack://charts/./app/controllers/chart-events/utils.ts","webpack://charts/./app/controllers/chart-settings/async-modules.ts","webpack://charts/./app/utils/chart-date-range-utils.ts","webpack://charts/./app/controllers/renderUtils.ts","webpack://charts/./app/controllers/sidebar/constants.ts","webpack://charts/./app/controllers/sidebar/hooks/sidebar-context.tsx","webpack://charts/./app/controllers/toolbar/interfaces.ts","webpack://charts/./app/controllers/utils.ts","webpack://charts/./app/helpers/atr.ts","webpack://charts/./app/helpers/ema.ts","webpack://charts/./app/chart-events/chart-event.ts","webpack://charts/./app/chart-events/dividends.ts","webpack://charts/./app/chart-events/earnings.ts","webpack://charts/./app/chart-events/split.ts","webpack://charts/./app/chart-events/index.ts","webpack://charts/./app/helpers/get-canvas-element-by-type.ts","webpack://charts/./app/helpers/math.ts","webpack://charts/./app/logger.js","webpack://charts/./app/models/chart-event-element.ts","webpack://charts/./app/models/indicator.ts","webpack://charts/./app/models/overlay.ts","webpack://charts/./app/models/relationships.ts","webpack://charts/./app/index.ts","webpack://charts/./app/indicators/indicator.ts","webpack://charts/./app/utils/canvas-render.ts","webpack://charts/./app/indicators/adx.ts","webpack://charts/./app/indicators/aro.ts","webpack://charts/./app/indicators/aroosc.ts","webpack://charts/./app/indicators/atr.ts","webpack://charts/./app/indicators/cci.ts","webpack://charts/./app/indicators/cot.ts","webpack://charts/./app/indicators/fi.ts","webpack://charts/./app/indicators/macd.ts","webpack://charts/./app/indicators/mfi.ts","webpack://charts/./app/indicators/none.ts","webpack://charts/./app/indicators/obv.ts","webpack://charts/./app/indicators/perf.ts","webpack://charts/./app/indicators/rmi.ts","webpack://charts/./app/indicators/roc.ts","webpack://charts/./app/indicators/rsi.ts","webpack://charts/./app/indicators/rvol.ts","webpack://charts/./app/indicators/rwi.ts","webpack://charts/./app/indicators/stofu.ts","webpack://charts/./app/indicators/stofa.ts","webpack://charts/./app/indicators/stosl.ts","webpack://charts/./app/indicators/trix.ts","webpack://charts/./app/indicators/ult.ts","webpack://charts/./app/indicators/vol.ts","webpack://charts/./app/indicators/wr.ts","webpack://charts/./app/indicators/indicators.ts","webpack://charts/./app/lib/shims.ts","webpack://charts/./app/model-hooks/use-model-state.ts","webpack://charts/./app/models/chart.ts","webpack://charts/./app/models/chart/contstants.ts","webpack://charts/./app/models/chart_layout.ts","webpack://charts/./app/models/chart_settings/constants.ts","webpack://charts/./app/models/chart_settings/be_large_chart_with_overlays.ts","webpack://charts/./app/models/chart_settings/be_large_chart_without_overlays.ts","webpack://charts/./app/models/chart_settings/be_small_chart_with_overlays.ts","webpack://charts/./app/models/chart_settings/be_small_chart_without_overlays.ts","webpack://charts/./app/models/chart_settings/index.ts","webpack://charts/./app/models/chart_settings/interactive_chart_settings.ts","webpack://charts/./app/models/chart_settings/interfaces.ts","webpack://charts/./app/models/constants.ts","webpack://charts/./app/models/drawings-internal-store.ts","webpack://charts/./app/models/element.ts","webpack://charts/./app/models/mouse/mouse-utils.ts","webpack://charts/./app/models/mouse/mouse.ts","webpack://charts/./app/models/pane.ts","webpack://charts/./app/models/quoteCache.ts","webpack://charts/./app/models/quote.ts","webpack://charts/./app/models/quote/constants.ts","webpack://charts/./app/models/settings.ts","webpack://charts/./app/models/utils.ts","webpack://charts/./app/overlays/overlay.ts","webpack://charts/./app/overlays/bb.ts","webpack://charts/./app/overlays/dch.ts","webpack://charts/./app/overlays/ema.ts","webpack://charts/./app/overlays/ema2.ts","webpack://charts/./app/overlays/hilo.ts","webpack://charts/./app/overlays/hline.ts","webpack://charts/./app/overlays/ic.ts","webpack://charts/./app/overlays/icf.ts","webpack://charts/./app/overlays/kch.ts","webpack://charts/./app/overlays/none.ts","webpack://charts/./app/overlays/patterns.ts","webpack://charts/./app/overlays/sar.ts","webpack://charts/./app/overlays/sma.ts","webpack://charts/./app/overlays/sma2.ts","webpack://charts/./app/overlays/str.ts","webpack://charts/./app/overlays/vp.ts","webpack://charts/./app/overlays/vwap.ts","webpack://charts/./app/overlays/overlays.ts","webpack://charts/./app/utils.ts","webpack://charts/./app/utils/abort_controller.ts","webpack://charts/./app/utils/async-modules-utils.tsx","webpack://charts/./app/utils/chart.ts","webpack://charts/./app/utils/colors.ts","webpack://charts/./app/utils/cursor.ts","webpack://charts/./app/utils/draw_in_visible_area.ts","webpack://charts/./app/utils/fetch_api.ts","webpack://charts/./app/utils/force-update.ts","webpack://charts/./app/utils/helpers.ts","webpack://charts/./app/utils/hlc.ts","webpack://charts/./app/utils/query_string.ts","webpack://charts/./app/utils/use-is-mounted.ts","webpack://charts/./types/shared.ts","webpack://charts/external var \"FLibs.DateFns\"","webpack://charts/external var \"FLibs.React\"","webpack://charts/external var \"FLibs.ReactDOM\"","webpack://charts/external var \"FLibs.ReactRouterDOM\"","webpack://charts/external var \"FLibs.classnames\"","webpack://charts/external var \"FLibs.d3\""],"sourcesContent":["import * as React from 'react'\n\nimport { InputColorPicker, convertColorToHEX } from '../components'\n\ninterface BackgroundInputProps {\n label: string\n value: string\n onChange: (color: string) => void\n}\n\nexport function BackgroundInput({ label = 'Background', value, onChange }: BackgroundInputProps) {\n return (\n \n )\n}\n","import React, { useCallback } from 'react'\n\nimport { ObjectHash } from '../../types/shared'\nimport { InputColorPicker, Paragraph, RangeSlider } from '../components'\n\ninterface ColorRangeRowInputProps {\n label: string\n colorValue: string\n colorTestId: string\n rangeValue: string\n rangeTestId: string\n rangeLabel: string\n rangeProps: ObjectHash\n onChange: (colorValue: string, value: string) => void\n}\n\nexport function ColorRangeRowInput({\n label,\n colorValue,\n colorTestId,\n rangeValue,\n rangeTestId,\n rangeLabel,\n rangeProps,\n onChange,\n}: ColorRangeRowInputProps) {\n const handleRangeChange = useCallback(\n (ev) => {\n const value = ev.currentTarget.value\n onChange(colorValue, value)\n },\n [onChange, colorValue]\n )\n const handleColorChange = useCallback(\n (color) => {\n onChange(color, rangeValue)\n },\n [onChange, rangeValue]\n )\n return (\n
\n
\n \n
\n
\n \n {rangeValue}\n \n }\n onChange={handleRangeChange}\n value={rangeValue}\n data-testid={rangeTestId}\n />\n
\n
\n )\n}\n","import * as React from 'react'\n\nimport { convertColorToHEX } from '../components'\nimport { ColorRangeRowInput } from './color_range_row'\n\ninterface Value {\n color: string\n width: string\n}\n\ninterface BorderInputProps {\n label: string\n value: Value\n min: number\n max: number\n onChange: (value: Value) => void\n}\n\nexport function BorderInput({ label = 'Border', value, onChange, min, max }: BorderInputProps) {\n return (\n onChange({ color, width })}\n />\n )\n}\n","import React from 'react'\n\nimport { Checkbox } from '../components'\n\ninterface CheckBoxProps {\n label: string\n value: boolean\n onChange: (isChecked: boolean) => void\n}\n\nexport function CheckBox({ label, value, onChange }: CheckBoxProps) {\n return (\n ) => onChange(ev.currentTarget.checked)}\n data-testid=\"chart-modal-checkbox\"\n >\n {label}\n \n )\n}\n","import React, { useCallback, useState } from 'react'\n\nimport { Checkbox, Input, Select, SelectOption } from '../components'\n\nconst FONT_VALUES = [\n { value: 'Arial', label: 'Arial' },\n { value: 'Verdana', label: 'Verdana' },\n]\n\ninterface InputProps {\n family: string\n size: string\n style: string\n weight: string\n}\n\ninterface FontInputProps {\n value: InputProps\n onChange: (values: InputProps) => void\n}\n\nexport function FontInput({ value, onChange }: FontInputProps) {\n const [family, setFamily] = useState(value.family)\n const [size, setSize] = useState(value.size)\n const [style, setStyle] = useState(value.style)\n const [weight, setWeight] = useState(value.weight)\n\n const setValue = useCallback(\n (key, valueSetter, value) => {\n valueSetter(value)\n onChange({ family, size, style, weight, [key]: value })\n },\n [family, size, style, weight, onChange]\n )\n\n return (\n
\n
\n
\n option.value === value.family)?.value}\n onChange={(selected: { value: string }) => setValue('family', setFamily, selected.value)}\n data-testid=\"chart-modal-font-select\"\n >\n {FONT_VALUES.map((option) => (\n {option.label}\n ))}\n \n
\n ) => setValue('size', setSize, ev.currentTarget.value)}\n value={size}\n data-testid=\"chart-modal-font-size\"\n />\n\n ) =>\n setValue('weight', setWeight, ev.currentTarget.checked ? 'bold' : 'normal')\n }\n data-testid=\"chart-modal-font-weight\"\n >\n Bold\n \n ) =>\n setValue('style', setStyle, ev.currentTarget.checked ? 'italic' : 'normal')\n }\n data-testid=\"chart-modal-font-style\"\n >\n Italic\n \n
\n
\n )\n}\n","import * as React from 'react'\n\nimport { convertColorToHEX } from '../components'\nimport { ColorRangeRowInput } from './color_range_row'\n\ninterface LineInputValue {\n color: string\n width: string\n}\n\ninterface LineInputProps {\n label: string\n value: LineInputValue\n onChange: (value: LineInputValue) => void\n}\n\nexport function LineInput({ label = 'Line', value, onChange }: LineInputProps) {\n return (\n onChange({ color, width })}\n />\n )\n}\n","import React from 'react'\n\nimport { Textarea } from '../components'\n\ninterface MultilineStringInputProps {\n label: string\n value: string\n required: boolean\n onChange: (value: string) => void\n}\n\nexport function MultilineStringInput({ label, value, required, onChange }: MultilineStringInputProps) {\n return (\n ) => onChange(e.target.value)}\n value={value}\n autoFocus\n data-testid=\"chart-modal-multiline-string-textarea\"\n />\n )\n}\n","import React from 'react'\n\nimport { Input } from '../components'\n\ninterface NumberInputProps {\n label: string\n name: string\n value: number\n required: boolean\n min?: number\n max?: number\n allowDecimal?: boolean\n step?: number\n onChange: (value: number) => void\n}\n\nexport function NumberInput(props: NumberInputProps) {\n const { label, name, value, required, min, max, step, allowDecimal = false } = props\n\n return (\n ) =>\n props.onChange(allowDecimal ? parseFloat(e.target.value) : parseInt(e.target.value, 10))\n }\n data-testid=\"chart-modal-number-input\"\n />\n )\n}\n","import React from 'react'\n\nimport { Input } from '../components'\n\ninterface StringInputProps {\n label: string\n name: string\n value: string\n required: boolean\n onChange: (value: string) => void\n}\n\nexport function StringInput(props: StringInputProps) {\n const { label, name, value, required } = props\n\n return (\n ) => props.onChange(e.target.value)}\n data-testid=\"chart-modal-string-textinput\"\n />\n )\n}\n","import React from 'react'\n\nimport { Checkbox, Input, InputColorPicker, convertColorToHEX } from '../components'\n\ninterface InputProps {\n active: boolean\n trend: number\n color: string\n}\n\ninterface trendInputProps {\n value: InputProps\n onChange: (values: InputProps) => void\n}\n\nexport function Trend({ value, onChange }: trendInputProps) {\n return (\n
\n ) => onChange({ ...value, active: ev.currentTarget.checked })}\n data-testid=\"chart-modal-trend-active\"\n />\n ) =>\n onChange({ ...value, trend: ev.currentTarget.valueAsNumber })\n }\n value={value.trend}\n data-testid=\"chart-modal-trend-value\"\n />\n onChange({ ...value, color: color })}\n inputDataTestId=\"chart-modal-trend-color\"\n />\n
\n )\n}\n","import React from 'react'\n\nimport { Checkbox, Input, Paragraph } from '../../components'\nimport { MacroTimeframe } from '../../constants/common'\nimport { DEFAULTS } from './index'\n\nexport interface InputProps {\n macroKey: MacroTimeframe\n isOff: boolean\n from: number\n to: number\n}\n\ninterface VisibilityInputProps {\n value: InputProps\n onChange: (value: InputProps) => void\n isCheckboxOnly: boolean\n}\n\nexport function VisibilityInput({ value, onChange, isCheckboxOnly }: VisibilityInputProps) {\n const [isOff, setIsOff] = React.useState(value.isOff)\n const [from, setFrom] = React.useState(value.from)\n const [to, setTo] = React.useState(value.to)\n const { macroKey } = value\n const macroLabel = macroKey.charAt(0).toUpperCase() + macroKey.slice(1)\n\n const setValue = React.useCallback(\n (key, valueSetter, value) => {\n valueSetter(value)\n onChange({ macroKey, isOff, from, to, [key]: value })\n },\n [macroKey, isOff, from, to, onChange]\n )\n return (\n
\n
\n ) => setValue('isOff', setIsOff, !e.target.checked)}\n >\n {isCheckboxOnly && macroLabel}\n \n {!isCheckboxOnly && (\n <>\n ) =>\n setValue('from', setFrom, Number(ev.currentTarget.value))\n }\n data-testid={`visibility-input-${macroKey}-from`}\n />\n -\n ) =>\n setValue('to', setTo, Number(ev.currentTarget.value))\n }\n data-testid={`visibility-input-${macroKey}-to`}\n />\n {macroLabel}\n \n )}\n
\n
\n )\n}\n","import merge from 'lodash.merge'\nimport React from 'react'\n\nimport { IVisibility, MacroTimeframe, MicroTimeframeRange } from '../../constants/common'\nimport { isInRange } from '../../utils/helpers'\nimport { InputProps, VisibilityInput } from './visibility-input'\n\ninterface VisibilityProps {\n label: string\n name: string\n value: IVisibility\n onChange: (value: IVisibility) => void\n handleDisableSubmit: (value: string | false) => void\n}\n\ntype Micro = { isOff: boolean; from: number; to: number }\nexport type DEFAULTS_TYPE = { [key in MacroTimeframe]: Micro }\n\nexport const DEFAULTS: DEFAULTS_TYPE = {\n // [MacroTimeframe.seconds]: { isOff: false, from: 1, to: 59 },\n [MacroTimeframe.minutes]: { isOff: false, from: 1, to: 59 },\n [MacroTimeframe.hours]: { isOff: false, from: 1, to: 24 },\n [MacroTimeframe.days]: { isOff: false, from: 1, to: 366 },\n [MacroTimeframe.weeks]: { isOff: false, from: 1, to: 52 },\n [MacroTimeframe.months]: { isOff: false, from: 1, to: 12 },\n}\n\nconst INPUTS_AVAILABLE = [MacroTimeframe.minutes, MacroTimeframe.hours]\n\nconst getInitialState = (value: IVisibility) => {\n const visibilities = merge({}, DEFAULTS)\n for (const visibility in visibilities) {\n const macroTimeframe = visibility as MacroTimeframe\n const valueMacroTimeframe = value?.[macroTimeframe]\n if (!valueMacroTimeframe) continue\n if (Object.keys(valueMacroTimeframe).length === 0) {\n visibilities[macroTimeframe] = { ...visibilities[macroTimeframe], isOff: true }\n } else {\n visibilities[macroTimeframe] = { ...visibilities[macroTimeframe], ...valueMacroTimeframe }\n }\n }\n return visibilities\n}\n\nconst getIsVisibilityOutsideAvailableTimeframes = (value: IVisibility) => {\n const result = Object.keys(MacroTimeframe).every((macrotimeframe) => {\n const macroRange = value[macrotimeframe as MacroTimeframe]\n\n return (\n macroRange &&\n (Object.keys(macroRange).length === 0 ||\n !MicroTimeframeRange[macrotimeframe as MacroTimeframe].some((item) =>\n isInRange({\n value: item,\n min: macroRange?.from ?? DEFAULTS[macrotimeframe as MacroTimeframe].from,\n max: macroRange?.to ?? DEFAULTS[macrotimeframe as MacroTimeframe].to,\n })\n ))\n )\n })\n return result\n}\n\nexport function Visibility(props: VisibilityProps) {\n const initialVisibilityRef = React.useRef(getInitialState(props.value))\n\n const handleChange = (value: InputProps) => {\n const result: IVisibility = props.value ? merge({}, props.value) : {}\n result[value.macroKey] = {}\n\n if (value.isOff) {\n props.onChange(result)\n } else if (value.from === DEFAULTS[value.macroKey].from && value.to === DEFAULTS[value.macroKey].to) {\n delete result[value.macroKey]\n props.onChange(result)\n } else {\n if (value.from !== DEFAULTS[value.macroKey].from) {\n result[value.macroKey]!.from = value.from\n }\n if (value.to !== DEFAULTS[value.macroKey].to) {\n result[value.macroKey]!.to = value.to\n }\n props.onChange(result)\n }\n\n props.handleDisableSubmit(\n getIsVisibilityOutsideAvailableTimeframes(result)\n ? 'The chosen timeframes would make the drawing invisible on all supported timeframes.'\n : false\n )\n }\n\n return Object.keys(initialVisibilityRef.current).map((macroKey) => (\n \n ))\n}\n","import debounce from 'lodash.debounce'\nimport * as React from 'react'\n\nimport { ObjectHash } from '../../types/shared'\nimport CanvasElement from '../canvas/element'\nimport { Button, ButtonGroup, Dialog, DialogBody, DialogFooter, DialogHeader, useDialogState } from '../components'\nimport { BackgroundInput } from './background'\nimport { BorderInput } from './border'\nimport { CheckBox } from './checkbox'\nimport { FontInput } from './font'\nimport { LineInput } from './line'\nimport { MultilineStringInput } from './multiline_string'\nimport { NumberInput } from './number'\nimport { StringInput } from './string'\nimport { Trend } from './trend'\nimport { Visibility } from './visibility'\n\n/**\n * Dialogs require element to restore focus when closing. Restore focus to the\n * currently selected chart or body\n */\nfunction getElementToFocus() {\n return document.querySelector('.chart.active') ?? document.body\n}\n\nfunction getInputForType(type: string) {\n switch (type) {\n case 'number':\n return NumberInput\n case 'string':\n return StringInput\n case 'text':\n return StringInput\n case 'background':\n return BackgroundInput\n case 'border':\n return BorderInput\n case 'line':\n return LineInput\n case 'multiline_string':\n return MultilineStringInput\n case 'font':\n return FontInput\n case 'checkbox':\n return CheckBox\n case 'trend':\n return Trend\n case 'visibility':\n return Visibility\n default:\n return () =>
ERROR: Unknown input type
\n }\n}\n\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button', className: 'flex-1', contentClass: 'text-center' }\n\ntype OnSubmitType = ((value: ObjectHash) => void) | null\ntype OnDismissType = (() => void) | null\n\nexport interface ElementStyleDialogProps {\n state: any\n element: ElementType\n onSubmit: ((values: ElementType['attrs']) => void) | null\n onDismiss: (() => void) | null\n onHide: () => void\n}\n\nexport type StyleDialogOpener = (\n element: ElementType,\n onSubmit: ElementStyleDialogProps['onSubmit'],\n onDismiss: ElementStyleDialogProps['onDismiss']\n) => void\n\nfunction getValuesFromFormState(formState: ObjectHash) {\n return formState.reduce((acc: ObjectHash, cur: ObjectHash) => {\n acc[cur.name] = cur.value\n return acc\n }, {} as ObjectHash)\n}\n\nenum DialogTabs {\n Style,\n Visibility,\n}\n\nexport function ElementStyleDialog(props: ElementStyleDialogProps) {\n const config = props.element.getModalConfig()\n const initialFormStateRef = React.useRef[]>(JSON.parse(JSON.stringify(config.inputs)))\n const [formState, setFormState] = React.useState[]>(config.inputs)\n const finalFocusRef = React.useRef(getElementToFocus())\n const [selectedTab, setSelectedTab] = React.useState(DialogTabs.Style)\n const [isSubmitDisabled, setIsSubmitDisabled] = React.useState(false) // If string, the value is used as title for disabled button.\n\n const isDrawingElement = props.element.getIsDrawing()\n\n React.useEffect(() => {\n props.element.isEditInProgress = true\n return () => {\n props.element.isEditInProgress = false\n props.element.trigger('change', props.element)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const handleValuesChange = React.useCallback(\n ({\n values,\n shouldSubmit = false,\n shouldDismiss = false,\n }: {\n values: ObjectHash\n shouldSubmit?: boolean\n shouldDismiss?: boolean\n }) => {\n const hasOnSubmit = typeof props.onSubmit === 'function'\n const hasOnDismiss = typeof props.onDismiss === 'function'\n\n props.element.set(values)\n if (shouldSubmit && hasOnSubmit) {\n props.onSubmit!(values)\n } else if (shouldDismiss && hasOnDismiss) {\n props.onDismiss!()\n }\n\n if (shouldSubmit || shouldDismiss) {\n props.state.hide()\n }\n },\n [props]\n )\n\n const handleValuesChangeDebounceRef = React.useRef(\n debounce(\n (newFormState) => {\n const values = getValuesFromFormState(newFormState)\n handleValuesChange({ values })\n },\n 50,\n { maxWait: 100 }\n )\n )\n\n React.useEffect(\n () => () => {\n handleValuesChangeDebounceRef.current.cancel()\n },\n []\n )\n\n const onSubmit: React.FormEventHandler = React.useCallback(\n (ev: React.FormEvent) => {\n ev.preventDefault()\n if (ev.currentTarget.checkValidity()) {\n const values = getValuesFromFormState(formState)\n handleValuesChange({ values, shouldSubmit: true })\n }\n },\n [formState, handleValuesChange]\n )\n\n const handleCloseDialog = React.useCallback(() => {\n const values = getValuesFromFormState(initialFormStateRef.current)\n handleValuesChange({ values, shouldDismiss: true })\n }, [handleValuesChange])\n\n const getShouldRenderInputForTab = (inputType: string) => {\n if (selectedTab === DialogTabs.Visibility && inputType === 'visibility') return true\n if (selectedTab !== DialogTabs.Visibility && inputType !== 'visibility') return true\n return false\n }\n\n return (\n \n {config.title}\n
\n \n {isDrawingElement && (\n \n setSelectedTab(DialogTabs.Style)}\n data-testid=\"dialog-tab-button-style\"\n >\n Style\n \n setSelectedTab(DialogTabs.Visibility)}\n data-testid=\"dialog-tab-button-visibility\"\n >\n Visibility\n \n \n )}\n\n {formState.map((input) => {\n const InputComponent = getInputForType(input.type) as React.FC<{\n onChange: (value: string) => void\n handleDisableSubmit?: typeof setIsSubmitDisabled\n }>\n return (\n getShouldRenderInputForTab(input.type) && (\n {\n setFormState((prevState) => {\n const newFormState = prevState.map((stateInput) => {\n if (stateInput.name === input.name) {\n return { ...stateInput, value }\n }\n return stateInput\n })\n handleValuesChangeDebounceRef.current(newFormState)\n return newFormState\n })\n }}\n handleDisableSubmit={setIsSubmitDisabled}\n />\n )\n )\n })}\n \n \n \n Close\n \n \n Save\n \n \n
\n \n )\n}\n\nexport const ElementStyleDialogContext = React.createContext>(() => {})\n\nexport function withElementStyleDialogState

(Component: React.ComponentType

) {\n return function WrappedComponent(props: P) {\n const context = React.useContext(ElementStyleDialogContext)\n\n return \n }\n}\n\nexport function ElementStyleDialogWrapper(props: { children: React.ReactNode }) {\n const [element, setElement] = React.useState(null)\n const [onSubmit, setOnSubmit] = React.useState(null)\n const [onDismiss, setOnDismiss] = React.useState(null)\n const dialog = useDialogState({ modal: false })\n\n const openDialog = (element: CanvasElement, onSubmit?: OnSubmitType, onDismiss?: OnDismissType) => {\n if (onSubmit) {\n setOnSubmit(() => onSubmit)\n }\n if (onDismiss) {\n setOnDismiss(() => onDismiss)\n }\n\n setElement(element)\n dialog.show()\n }\n\n const onHide = () => {\n setElement(null)\n setOnSubmit(null)\n setOnDismiss(null)\n }\n\n return (\n \n {props.children}\n {element && (\n \n )}\n \n )\n}\n","import { ChartConfigChartPane } from '../../../types/shared'\nimport { IndicatorType } from '../../constants/common'\nimport ChartLayout from '../../models/chart_layout'\nimport Element from '../../models/element'\nimport PaneModel from '../../models/pane'\nimport { HLC, compareHlc, incrementHlc, receiveHlc } from '../../utils/hlc'\nimport {\n AutoSaveChangeType,\n AutoSaveElement,\n AutoSaveElementDBRecord,\n DrawingChangeTimestamp,\n DrawingContainerType,\n} from './constants'\n\nexport function getContainerTypeFromPaneConfig(pane: ChartConfigChartPane) {\n const indicatorElement = pane.elements.find((el) => el.type.startsWith('indicators/'))\n if (indicatorElement) {\n return indicatorElement.type as DrawingContainerType\n }\n const chartElement = pane.elements.find((el) => el.type.startsWith('charts/'))\n if (chartElement) {\n return 'chart'\n }\n return null\n}\n\nexport function getContainerType(model: PaneModel) {\n const mainElement = model.mainElement()\n const indicatorType = mainElement?.instance?.type ?? null\n if (mainElement?.isIndicator() && indicatorType !== IndicatorType.None) {\n return indicatorType as DrawingContainerType\n }\n if (mainElement?.isChart()) {\n return 'chart'\n }\n return null\n}\n\nexport function updateInternalStoreWithChangedElement({\n element,\n changeType,\n currentInternalStore,\n lastUpdateTimestamp,\n}: {\n element: Element\n changeType: AutoSaveChangeType\n currentInternalStore: AutoSaveElement[]\n lastUpdateTimestamp: HLC\n}) {\n const paneModel = element.pane()\n const ticker = paneModel.getQuoteRawTicker()\n const containerType = getContainerType(paneModel)\n if (ticker && paneModel && containerType && (!element.destroyed || changeType === 'destroy')) {\n const instanceJson = element.instance.toAutosaveConfig()\n const newDrawing: AutoSaveElement = {\n elementId: element.elementId!,\n zIndex: element.zIndex,\n ticker,\n lastChange: lastUpdateTimestamp,\n changeType,\n containerType,\n elementAttrs: JSON.stringify(instanceJson),\n }\n\n const newInternalStore = [...currentInternalStore]\n const updateDrawingIndex = newInternalStore.findIndex(\n (drawingElement) => drawingElement.elementId === newDrawing.elementId\n )\n\n let shouldSyncAndSave = false\n if (updateDrawingIndex > -1) {\n const updatedRecord = newInternalStore[updateDrawingIndex]\n const hasChangedZIndex = updatedRecord.zIndex !== newDrawing.zIndex\n const hasChangedType = updatedRecord.changeType !== newDrawing.changeType\n const hasChangedAttrs = updatedRecord.elementAttrs !== newDrawing.elementAttrs\n const hasChange = hasChangedType || hasChangedAttrs || hasChangedZIndex\n if (\n !element.instance.isEditInProgress &&\n updatedRecord.ticker === ticker &&\n hasChange &&\n updatedRecord.changeType !== 'destroy'\n ) {\n newInternalStore[updateDrawingIndex] = newDrawing\n shouldSyncAndSave = true\n }\n } else {\n newInternalStore.push(newDrawing)\n shouldSyncAndSave = true\n }\n\n return {\n newInternalStore,\n shouldSyncAndSave,\n newDrawing,\n }\n }\n}\n\nexport function getTickersAndContainerTypesInLayoutModel(chartLayout: ChartLayout) {\n const tickers: string[] = []\n const containerTypes: Array = ['note']\n\n chartLayout.getAllPanes().forEach((paneModel) => {\n const ticker = paneModel.getQuoteRawTicker()\n const containerType = getContainerType(paneModel)\n if (ticker && !tickers.includes(ticker)) {\n tickers.push(ticker)\n }\n if (containerType && !containerTypes.includes(containerType)) {\n containerTypes.push(containerType)\n }\n })\n return { tickers, containerTypes }\n}\n\nexport function mergeUpdatedDrawingsToInternalStore({\n updatedDrawings,\n currentInternalStore,\n lastUpdateTimestamp,\n isRefetchAll,\n}: {\n updatedDrawings: AutoSaveElement[]\n currentInternalStore: AutoSaveElement[]\n lastUpdateTimestamp: DrawingChangeTimestamp\n isRefetchAll: boolean\n}) {\n let newLastUpdateTimestamp = lastUpdateTimestamp\n const newInternalStore = [...currentInternalStore]\n const updatedElementIds: string[] = []\n\n updatedDrawings.forEach((drawing) => {\n newLastUpdateTimestamp = receiveHlc(newLastUpdateTimestamp, drawing.lastChange)\n const drawingIndex = newInternalStore.findIndex(({ elementId }) => drawing.elementId === elementId)\n const currentDrawing = drawingIndex > -1 ? newInternalStore[drawingIndex] : null\n if (currentDrawing === null) {\n newInternalStore.push(drawing)\n updatedElementIds.push(drawing.elementId)\n } else if (currentDrawing.containerType === 'note' && isRefetchAll) {\n const currentNote = getElementNoteText(currentDrawing)\n const autoSavedNote = getElementNoteText(drawing)\n if (currentNote !== autoSavedNote) {\n newInternalStore[drawingIndex] = {\n ...drawing,\n lastChange: incrementHlc(receiveHlc(currentDrawing.lastChange, drawing.lastChange), Date.now()),\n elementAttrs: JSON.stringify({\n ...JSON.parse(drawing.elementAttrs),\n text: `${currentNote}\\r\\n${autoSavedNote}`,\n }),\n }\n }\n updatedElementIds.push(drawing.elementId)\n } else if (compareHlc(newInternalStore[drawingIndex].lastChange, drawing.lastChange) < 0) {\n newInternalStore[drawingIndex] = drawing\n updatedElementIds.push(drawing.elementId)\n }\n })\n return { newLastUpdateTimestamp, newInternalStore, updatedElementIds }\n}\n\nexport function getInitialStoreDrawings(): null | AutoSaveElement[] {\n const initialDrawings = (\n window.FinvizSettings?.initialDrawingsStore ?? window.FinvizChartsSettings?.initialDrawingsStore\n )?.drawings as null | AutoSaveElementDBRecord[]\n\n return initialDrawings?.map((item) => getAutosaveElementFromDBRecord(item)) ?? null\n}\n\nexport function handleCallMethodOnAllDrawings({\n chartLayoutModel,\n elementMethod,\n}: {\n chartLayoutModel: ChartLayout\n elementMethod: keyof Pick\n}) {\n chartLayoutModel.getAllElements().forEach((element) => {\n if (element.isDrawing()) {\n element[elementMethod]()\n }\n })\n}\n\nexport function getNoteElementId(ticker: string) {\n return `note-${ticker}`\n}\n\nexport function getElementNoteText(noteElement?: AutoSaveElement) {\n return (noteElement ? JSON.parse(noteElement.elementAttrs)?.text : '') ?? ''\n}\n\nexport function getTickerNoteText({ ticker, elements }: { ticker: string; elements: AutoSaveElement[] }) {\n const noteElement = elements.find(({ elementId }) => elementId === getNoteElementId(ticker))\n return getElementNoteText(noteElement)\n}\n\nexport function getAutosaveElementFromDBRecord(item: AutoSaveElementDBRecord): AutoSaveElement {\n return {\n elementId: item.elementId,\n ticker: item.ticker,\n zIndex: item.zIndex,\n changeType: item.changeType,\n containerType: item.containerType,\n elementAttrs: item.elementAttrs,\n lastChange: {\n ts: item.lastChangeTimestamp,\n count: item.lastChangeCounter,\n uuid: item.lastChangeNodeUUID,\n },\n }\n}\n\nexport function getDBRecordFromAutosaveElement(item: AutoSaveElement): Omit {\n return {\n elementId: item.elementId,\n ticker: item.ticker,\n zIndex: item.zIndex,\n changeType: item.changeType,\n containerType: item.containerType,\n elementAttrs: JSON.stringify(item.elementAttrs),\n lastChangeTimestamp: item.lastChange.ts,\n lastChangeCounter: item.lastChange.count,\n lastChangeNodeUUID: item.lastChange.uuid,\n }\n}\n","import { IndicatorType } from '../../constants/common'\nimport { HLC } from '../../utils/hlc'\n\nexport type DrawingChangeTimestamp = HLC\nexport type DrawingContainerType = IndicatorType | 'chart' | 'note' | null\nexport type AutoSaveChangeType = 'update' | 'destroy'\n\nexport interface AutoSaveElement {\n elementId: string\n ticker: string\n zIndex: number\n lastChange: DrawingChangeTimestamp\n changeType: AutoSaveChangeType\n containerType: DrawingContainerType\n elementAttrs: string\n}\n\nexport type AutoSaveElementDBRecord = Omit & { lastChange: string } & {\n lastChangeTimestamp: number\n lastChangeCounter: number\n lastChangeNodeUUID: string\n}\n\nexport const DRAWINGS_UPDATE_INTERVAL_MS = process.env.IS_E2E_TESTING ? 3000 : 15000\nexport const DRAWINGS_SAVE_INTERVAL_MS = 250\n","import React from 'react'\n\nimport fetchApi, {\n ContentType,\n ForbiddenError,\n GenericStatusCodeError,\n InternalServerError,\n} from '../../utils/fetch_api'\nimport { getUuid } from '../../utils/helpers'\nimport { HLC, compareHlc, incrementHlc } from '../../utils/hlc'\nimport { getByteLengthOfString } from '../../utils/string-byte-length'\nimport { AutoSaveElement, AutoSaveElementDBRecord, DrawingContainerType } from './constants'\nimport { getAutosaveElementFromDBRecord, getDBRecordFromAutosaveElement } from './utils'\n\nconst RETRY_LIMIT = 5\n\nexport function useDrawingAutoSaveApi() {\n const postRetryCountRef = React.useRef(0)\n const deleteRetryCountRef = React.useRef(0)\n\n const fetchDrawings = React.useCallback(\n async ({\n tickers,\n containerTypes,\n lastChange,\n }: {\n tickers: string[]\n containerTypes: DrawingContainerType[]\n lastChange: HLC\n }) => {\n try {\n const data = await fetchApi<{\n drawings: AutoSaveElementDBRecord[]\n }>({\n location: '/api/auto_save.ashx',\n queryParameters: {\n ticker: tickers.join(','),\n containerTypes: containerTypes.join(',') || undefined,\n lastChangeTimestamp: lastChange.ts,\n lastChangeCounter: lastChange.count,\n lastChangeNodeUUID: lastChange.uuid,\n },\n throwOnStatusCodes: [403, 404],\n })\n return data.drawings.map((drawing) => getAutosaveElementFromDBRecord(drawing))\n } catch {\n // ignore error\n }\n\n return []\n },\n []\n )\n\n const saveDrawings = React.useCallback(async (drawings: AutoSaveElement[]): Promise => {\n if (drawings.length === 0) {\n return undefined\n }\n\n try {\n const bodyJsonString = JSON.stringify(drawings.map((item) => getDBRecordFromAutosaveElement(item)))\n let keepalive = false\n try {\n keepalive = getByteLengthOfString(bodyJsonString) < 64000\n } catch (error: any) {\n window.Sentry?.captureException(error)\n }\n await fetchApi({\n location: '/api/auto_save.ashx',\n method: 'POST',\n throwOnStatusCodes: [400, 403, 404, 500],\n contentType: ContentType.ApplicationJson,\n body: bodyJsonString,\n keepalive,\n })\n const [latestChangeHlc] = [...drawings].sort((a, b) => compareHlc(b.lastChange, a.lastChange))\n postRetryCountRef.current = 0\n return latestChangeHlc.lastChange\n } catch (error) {\n if (error instanceof InternalServerError) {\n // try again\n if (postRetryCountRef.current < RETRY_LIMIT) {\n postRetryCountRef.current = postRetryCountRef.current + 1\n await new Promise((r) => setTimeout(r, 1000))\n return saveDrawings(drawings)\n } else {\n // continue to report to Sentry\n postRetryCountRef.current = 0\n }\n } else if (error instanceof ForbiddenError) {\n // ignore error\n return undefined\n }\n\n // report error to Sentry\n window.Sentry?.captureException(error, {\n extra: (error instanceof GenericStatusCodeError\n ? (error.response as ObjectHash).invalidItems\n : drawings\n ).reduce(\n (acc: ObjectHash, cur: ObjectHash, index: number) => ({ ...acc, [`item-${index}`]: JSON.stringify(cur) }),\n {} as ObjectHash\n ),\n })\n\n return undefined\n }\n }, [])\n\n const deleteAllDrawings = React.useCallback(\n async ({ tickers, lastLocalChange }: { tickers: string[]; lastLocalChange: HLC }): Promise => {\n try {\n const newHlc = {\n ...incrementHlc(lastLocalChange, Date.now()),\n uuid: getUuid(), // we provide new UUID for HLC so we can fetch 'destroy' changes in next GET request\n }\n await fetchApi({\n location: `/api/auto_save.ashx?ticker=${tickers.join(',')}&lastChangeTimestamp=${\n newHlc.ts\n }&lastChangeCounter=${newHlc.count}&lastChangeNodeUUID=${newHlc.uuid}`,\n method: 'DELETE',\n throwOnStatusCodes: [403, 404, 500],\n keepalive: true,\n })\n deleteRetryCountRef.current = 0\n } catch (error) {\n if (error instanceof InternalServerError) {\n // try again\n if (deleteRetryCountRef.current < RETRY_LIMIT) {\n deleteRetryCountRef.current = deleteRetryCountRef.current + 1\n await new Promise((r) => setTimeout(r, 1000))\n return deleteAllDrawings({ tickers, lastLocalChange })\n } else {\n // continue to report to Sentry\n deleteRetryCountRef.current = 0\n }\n } else if (error instanceof ForbiddenError) {\n // ignore error\n return\n }\n\n // report error to Sentry\n window.Sentry?.captureException(error)\n }\n },\n []\n )\n\n return { fetchDrawings, saveDrawings, deleteAllDrawings }\n}\n","// byteLengthCharCode2 from https://stackoverflow.com/a/63893237\n\nexport function getByteLengthOfString(s: string) {\n //assuming the String is UCS-2(aka UTF-16) encoded\n let n = 0\n for (let i = 0, l = s.length; i < l; i++) {\n const hi = s.charCodeAt(i)\n if (hi < 0x0080) {\n n += 1\n } else if (hi < 0x0800) {\n n += 2\n } else if (hi < 0xd800) {\n n += 3\n } else if (hi < 0xdc00) {\n const lo = s.charCodeAt(++i)\n if (i < l && lo >= 0xdc00 && lo <= 0xdfff) {\n n += 4\n } else {\n throw new Error('UCS-2 String malformed')\n }\n } else if (hi < 0xe000) {\n throw new Error('UCS-2 String malformed')\n } else {\n n += 3\n }\n }\n return n\n}\n","import React from 'react'\n\nimport { DrawingSpineOptions, DrawingSpineOptionsEvent } from '../../../types/shared'\nimport ElementCanvas from '../../canvas/element'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { getCanvasElementByType } from '../../helpers/get-canvas-element-by-type'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\nimport Element from '../../models/element'\nimport { compareHlc, incrementHlc, initHlc, receiveHlc } from '../../utils/hlc'\nimport { AutoSaveChangeType, AutoSaveElement, DRAWINGS_SAVE_INTERVAL_MS } from './constants'\nimport { useDrawingAutoSaveApi } from './use-drawing-autosave-api'\nimport { useIsAutoSaveActive } from './use-is-auto-save-active'\nimport {\n getContainerType,\n getNoteElementId,\n getTickerNoteText,\n getTickersAndContainerTypesInLayoutModel,\n mergeUpdatedDrawingsToInternalStore,\n updateInternalStoreWithChangedElement,\n} from './utils'\n\nexport function useDrawingAutoSaveControls(chartLayout: ChartLayout) {\n const { fetchDrawings, saveDrawings, deleteAllDrawings } = useDrawingAutoSaveApi()\n const isAutoSaveActive = useIsAutoSaveActive(chartLayout)\n const drawingsInternalStore = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\n const saveTimeoutRef = React.useRef()\n\n React.useEffect(\n () => () => {\n if (saveTimeoutRef.current) {\n clearTimeout(saveTimeoutRef.current)\n }\n },\n []\n )\n\n const saveLatestChanges = React.useCallback(\n (\n withDelayInMs = DRAWINGS_SAVE_INTERVAL_MS,\n saveQueueExtraFilterCallback: ((item: AutoSaveElement) => boolean) | null = null\n ) => {\n if (saveTimeoutRef.current) {\n clearTimeout(saveTimeoutRef.current)\n }\n const saveQueue = drawingsInternalStore.elements.filter(\n (item) =>\n compareHlc(item.lastChange, drawingsInternalStore.latestLocalUpdateTimestamp) > 0 &&\n item.lastChange.uuid === drawingsInternalStore.instanceUUID &&\n (saveQueueExtraFilterCallback === null || saveQueueExtraFilterCallback(item))\n )\n if (saveQueue.length === 0) {\n return\n }\n\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Unsaved)\n\n const save = async () => {\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saving)\n const result = await saveDrawings(saveQueue)\n if (result) {\n drawingsInternalStore.updateAttributes({\n latestLocalUpdateTimestamp: receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, result),\n })\n }\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saved)\n\n return result\n }\n\n if (withDelayInMs === 0) {\n return save()\n }\n\n saveTimeoutRef.current = setTimeout(save, withDelayInMs)\n },\n [saveDrawings, drawingsInternalStore]\n )\n\n const syncChartLayoutDrawings = React.useCallback(\n (drawing: AutoSaveElement) => {\n if (drawing.containerType === 'note') {\n return\n }\n const isRemove = drawing.changeType === 'destroy'\n\n chartLayout.getAllPanes().forEach((paneModel) => {\n const ticker = paneModel.getQuoteRawTicker()\n const paneContainerType = getContainerType(paneModel)\n if (!paneContainerType || drawing.ticker !== ticker) {\n return\n }\n const paneInternalStoreElements = drawingsInternalStore.elements.filter(\n (autoSaveElement) => autoSaveElement.ticker === ticker && autoSaveElement.containerType === paneContainerType\n )\n const paneElements = paneModel.getAllElements()\n let element: Element | undefined\n paneElements.forEach((paneElement) => {\n if (paneElement.isDrawing() && !paneElement.instance.isCreator) {\n const paneDrawing = paneInternalStoreElements.find(({ elementId }) => elementId === paneElement.elementId)\n if (!paneDrawing || paneDrawing.changeType === 'destroy') {\n paneElement.destroyCascade()\n } else if (paneElement.elementId && paneElement.elementId === drawing.elementId) {\n element = paneElement\n }\n }\n })\n\n const parsedElementAttrs = JSON.parse(drawing.elementAttrs)\n if (element) {\n if (drawing.elementAttrs !== JSON.stringify(element.instance.toAutosaveConfig())) {\n if (element.pane().selection !== element.instance && !element.hasOngoingInteraction()) {\n element.instance.set(parsedElementAttrs)\n element.instance.updateScales()\n }\n }\n if (drawing.zIndex !== element.zIndex) {\n element.updateAttributes({ zIndex: drawing.zIndex })\n }\n if (isRemove || paneContainerType !== drawing.containerType) {\n element.destroyCascade()\n }\n } else if (!isRemove && paneContainerType === drawing.containerType) {\n const instance = getCanvasElementByType(parsedElementAttrs.type).fromObject(\n parsedElementAttrs,\n paneModel\n ) as ElementCanvas\n paneModel.elements().create({ elementId: drawing.elementId, instance, zIndex: drawing.zIndex })\n instance.updateScales()\n }\n })\n },\n [chartLayout, drawingsInternalStore]\n )\n\n const handleAutoSaveNoteChange = React.useCallback(\n (note: string, ticker?: string) => {\n if (ticker) {\n const newNoteElement: AutoSaveElement = {\n elementId: getNoteElementId(ticker),\n zIndex: 0,\n ticker: ticker,\n lastChange: incrementHlc(drawingsInternalStore.latestLocalUpdateTimestamp, Date.now()),\n changeType: 'update',\n containerType: 'note',\n elementAttrs: JSON.stringify({ text: note }),\n }\n\n drawingsInternalStore.updateAttributes({\n elements: [\n ...drawingsInternalStore.elements.filter(({ elementId }) => elementId !== newNoteElement.elementId),\n newNoteElement,\n ],\n })\n }\n },\n [drawingsInternalStore]\n )\n\n const handleIdeaNoteChange = React.useCallback(\n (note: string) => {\n if (chartLayout.idea?.note !== note && (chartLayout.idea || note)) {\n chartLayout.updateAttribute('idea', { ...chartLayout.idea, note })\n handleAutoSaveNoteChange(note, chartLayout.activeChart?.getQuoteRawTicker() ?? undefined)\n }\n },\n [chartLayout, handleAutoSaveNoteChange]\n )\n\n const checkDrawingUpdate = React.useCallback(\n async (isRefetchAll = false) => {\n const { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\n if (isRefetchAll) {\n drawingsInternalStore.updateAttributes({\n latestRemoteUpdateTimestamp: initHlc(drawingsInternalStore.instanceUUID, 0),\n })\n }\n\n const updatedDrawings = await fetchDrawings({\n tickers,\n containerTypes,\n lastChange: drawingsInternalStore.latestRemoteUpdateTimestamp,\n })\n const { newLastUpdateTimestamp, updatedElementIds, newInternalStore } = mergeUpdatedDrawingsToInternalStore({\n updatedDrawings,\n currentInternalStore: drawingsInternalStore.elements,\n lastUpdateTimestamp: drawingsInternalStore.latestRemoteUpdateTimestamp,\n isRefetchAll,\n })\n\n drawingsInternalStore.updateAttributes({\n // Even if there are no changes in elements, newInternalStore is new array with the same content which may cause unnecessary rerenders\n ...(updatedElementIds.length > 0 ? { elements: newInternalStore } : {}),\n latestRemoteUpdateTimestamp: newLastUpdateTimestamp,\n latestLocalUpdateTimestamp:\n isRefetchAll && newInternalStore.length > 0\n ? receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, newLastUpdateTimestamp)\n : drawingsInternalStore.latestLocalUpdateTimestamp,\n })\n\n if (updatedElementIds.length > 0 || isRefetchAll) {\n saveLatestChanges(0)\n const allElements = chartLayout.getAllElements()\n updatedElementIds.forEach((elementId) => {\n const element = allElements.find((element) => element.elementId === elementId)\n\n if (element && element.isDrawing() && !element.hasOngoingInteraction()) {\n element.destroyCascade()\n }\n })\n\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\n chartLayout.getAllPanes().forEach((paneModel) => {\n paneModel.normalizeZIndexes()\n })\n\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage) {\n const activeTicker = chartLayout.activeChart?.getQuoteRawTicker() ?? ''\n handleIdeaNoteChange(getTickerNoteText({ ticker: activeTicker, elements: newInternalStore }))\n }\n }\n },\n [\n chartLayout,\n drawingsInternalStore,\n syncChartLayoutDrawings,\n fetchDrawings,\n handleIdeaNoteChange,\n saveLatestChanges,\n ]\n )\n\n const updateInternalStoreWithElement = React.useCallback(\n (element: Element, changeType: AutoSaveChangeType) => {\n const updateResult = updateInternalStoreWithChangedElement({\n element,\n changeType,\n currentInternalStore: drawingsInternalStore.elements,\n lastUpdateTimestamp: incrementHlc(\n receiveHlc(\n drawingsInternalStore.latestLocalUpdateTimestamp,\n drawingsInternalStore.latestRemoteUpdateTimestamp\n ),\n Date.now()\n ),\n })\n\n if (updateResult) {\n const { shouldSyncAndSave, newInternalStore, newDrawing } = updateResult\n if (shouldSyncAndSave) {\n drawingsInternalStore.updateAttributes({ elements: newInternalStore })\n syncChartLayoutDrawings(newDrawing)\n }\n }\n },\n [syncChartLayoutDrawings, drawingsInternalStore]\n )\n\n const deleteAllAutoSavedElements = React.useCallback(async () => {\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayout)\n\n await deleteAllDrawings({ tickers, lastLocalChange: drawingsInternalStore.latestLocalUpdateTimestamp })\n await checkDrawingUpdate()\n }, [chartLayout, deleteAllDrawings, drawingsInternalStore, checkDrawingUpdate])\n\n const onElementChange = React.useCallback(\n (element: Element, _?: any, options?: DrawingSpineOptions) => {\n const elementPane = element.pane()\n // This may happen if pane had been removed already, in most cases \"element.destroyed\" should be true,\n // but we would need to check if it was destroyed by delete drawing action or not, and checking if pane exists covers all cases\n if (!element.isDrawing() || element.instance.isCreator || !elementPane) {\n return\n }\n const elementContainerType = getContainerType(elementPane)\n const elementPaneTicker = elementPane.getQuoteRawTicker()\n const isElementInCurrentChartLayout = chartLayout\n .getAllPanes()\n .some(\n (model) => getContainerType(model) === elementContainerType && model.getQuoteRawTicker() === elementPaneTicker\n )\n if (isElementInCurrentChartLayout) {\n const isRemove = options?.eventType === DrawingSpineOptionsEvent.Remove\n updateInternalStoreWithElement(element, isRemove ? 'destroy' : 'update')\n }\n },\n [updateInternalStoreWithElement, chartLayout]\n )\n\n return {\n drawingsInternalStore,\n onElementChange,\n handleIdeaNoteChange,\n deleteAllAutoSavedElements,\n isAutoSaveActive,\n handleAutoSaveNoteChange,\n syncChartLayoutDrawings,\n saveLatestChanges,\n checkDrawingUpdate,\n }\n}\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\n\nexport function useIsAutoSaveActive(chartLayout: ChartLayout) {\n const chartLayoutModel = useModelState(chartLayout, {\n watchProperties: ['isInit', 'isPreserveDrawingsActive', 'idea'],\n })\n const { idea, isInit, isPreserveDrawingsActive } = chartLayoutModel\n return React.useMemo(\n () =>\n getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel) && isPreserveDrawingsActive && !!isInit && !idea?.id,\n [isPreserveDrawingsActive, isInit, idea?.id, chartLayoutModel]\n )\n}\n","import React from 'react'\n\nimport { CustomSpineEvents } from '../../../types/shared'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartModel from '../../models/chart'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\nimport Element from '../../models/element'\nimport { usePrevious } from '../../utils/use-prev-state'\nimport { DRAWINGS_UPDATE_INTERVAL_MS } from './constants'\nimport { useDrawingAutoSaveControls } from './use-drawing-auto-save-controls'\nimport { getTickersAndContainerTypesInLayoutModel } from './utils'\n\nfunction useDrawingAutoSave(chartLayout: ChartLayout) {\n const {\n onElementChange,\n deleteAllAutoSavedElements,\n checkDrawingUpdate,\n syncChartLayoutDrawings,\n saveLatestChanges,\n isAutoSaveActive,\n } = useDrawingAutoSaveControls(chartLayout)\n\n const drawingsInternalStoreUnwatched = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\n const drawingsInternalStore = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['elements'] })\n const prevIsAutoSaveActive = usePrevious(isAutoSaveActive)\n\n const runInitialSaveAndRefetchUpdate = React.useCallback(async () => {\n chartLayout.getAllElements().forEach((element) => {\n // Adds drawings to internal store if isAutoSaveActive and they are not in the store yet\n if (!drawingsInternalStore.elements.some((drawing) => drawing.elementId === element.elementId)) {\n onElementChange(element)\n }\n })\n\n // We want to save everything except notes because saving notes can overwrite those already saved in db. Each drawing has different id but there is only one note per ticker\n // Notes are merged in checkDrawingUpdate fn\n await saveLatestChanges(0, (item) => item.containerType !== 'note')\n\n checkDrawingUpdate(true)\n }, [checkDrawingUpdate, chartLayout, onElementChange, drawingsInternalStore.elements, saveLatestChanges])\n\n React.useEffect(() => {\n if (isAutoSaveActive) {\n saveLatestChanges()\n }\n }, [saveLatestChanges, drawingsInternalStore.elements, isAutoSaveActive])\n\n React.useEffect(() => {\n if (!isAutoSaveActive) {\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Off)\n return\n }\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Saved)\n if (!prevIsAutoSaveActive && isAutoSaveActive) {\n runInitialSaveAndRefetchUpdate()\n }\n\n let { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\n\n const onChartOrIndicatorChange = () => {\n const { tickers: newTickers, containerTypes: newContainerTypes } =\n getTickersAndContainerTypesInLayoutModel(chartLayout)\n if (\n JSON.stringify(tickers) !== JSON.stringify(newTickers) ||\n JSON.stringify(containerTypes) !== JSON.stringify(newContainerTypes)\n ) {\n tickers = newTickers\n containerTypes = newContainerTypes\n checkDrawingUpdate(true)\n }\n }\n\n ChartModel.bind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\n Element.bind('change', onElementChange)\n\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\n const checkDrawingUpdateInterval = setInterval(checkDrawingUpdate, DRAWINGS_UPDATE_INTERVAL_MS)\n\n return () => {\n clearInterval(checkDrawingUpdateInterval)\n ChartModel.unbind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\n Element.unbind('change', onElementChange)\n }\n }, [\n chartLayout,\n drawingsInternalStore,\n checkDrawingUpdate,\n onElementChange,\n syncChartLayoutDrawings,\n isAutoSaveActive,\n prevIsAutoSaveActive,\n runInitialSaveAndRefetchUpdate,\n ])\n\n return { deleteAllAutoSavedElements, isAutoSaveActive }\n}\n\ninterface Props {\n chartLayoutModel: ChartLayout\n}\n\nexport const withDrawingsAutoSave = (Component: any) => (props: Props) => {\n const { deleteAllAutoSavedElements, isAutoSaveActive } = useDrawingAutoSave(props.chartLayoutModel)\n\n return (\n \n )\n}\n","import React from 'react'\n\nexport function usePrevious(value: any) {\n const ref = React.useRef()\n React.useEffect(() => {\n ref.current = value\n }, [value])\n return ref.current\n}\n","import omit from 'lodash.omit'\nimport queryString from 'query-string'\nimport React, { useEffect, useRef, useState } from 'react'\n\nimport { Instrument, ObjectHash } from '../../types/shared'\nimport { Button, Dialog, DialogBody, DialogFooter, DialogHeader } from '../components'\nimport { ChartsOrQuotePageQueryParams, LayoutType } from '../constants/common'\nimport { getTickerNoteText } from '../controllers/autosave/utils'\nimport ChartLayout from '../models/chart_layout'\nimport Quote from '../models/quote'\nimport { getInstrument } from '../utils/chart'\nimport fetchApi, { getFormDataFromObject } from '../utils/fetch_api'\nimport { captureException } from '../utils/helpers'\nimport { decodeQueryString } from '../utils/query_string'\n\ninterface IIdea {\n ticker: string\n instrument: string\n period: string\n company?: string\n date: string\n note: string\n id: string\n}\n\nfunction getIdeaUrl({ ticker, instrument, period, id }: Pick) {\n const searchObject = { t: ticker, p: period, i: id }\n const isStock = instrument === Instrument.Stock\n const isQuotePage = /\\/quote\\b/.test(window.location.pathname)\n const isStockOnQute = isQuotePage && isStock\n const path = !isQuotePage || isStock ? window.location.pathname : '/charts.ashx'\n\n return `${path}?${queryString.stringify({ ...searchObject, ...(isStockOnQute ? { ta: '2' } : { l: '1h1v' }) })}`\n}\n\nfunction IdeasList() {\n const [hasError, setHasError] = useState(false)\n const [hasFetched, setHasFetched] = useState(false)\n const [isDeleting, setIsDeleting] = useState(false)\n const [ideas, setIdeas] = useState([])\n const { i: currentIdea } = decodeQueryString()\n\n useEffect(() => {\n async function fetchIdeas() {\n window.gtag?.('event', 'load', { event_category: 'ideas' })\n try {\n const data = await fetchApi({ location: '/api/ideas_load.ashx', throwOnStatusCodes: [404] })\n const ideas = data.ideas.map((idea: IIdea) => ({\n ...idea,\n instrument: getInstrument(idea.ticker),\n }))\n\n setIdeas(ideas)\n setHasFetched(true)\n } catch {\n setHasError(true)\n }\n }\n\n fetchIdeas()\n }, [])\n\n const onDeleteIdeaClick = useRef(async (idea: IIdea) => {\n if (!window.confirm('Do you really want to delete this idea?')) return\n\n const body = [\n ['id', idea.id],\n ['ticker', idea.ticker],\n ['queryString', document.location.search],\n ['locationPathname', document.location.pathname],\n ['currentIdea', currentIdea],\n ]\n .map((row) => row.join('='))\n .join('&')\n\n setIsDeleting(true)\n\n const response = await fetch('/api/idea_delete.ashx', {\n body,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'post',\n })\n\n if (currentIdea === String(idea.id)) {\n window.location.href = response.url\n return\n }\n\n // Check if the page was loaded with the idea which is going to be deleted here\n // If that's the case, refresh the page to remove idea data from the page so when user navigates back to idea page it shows idea 404\n const configIdeaId = window.FinvizChartsSettings?.ideaChart?.idea?.id ?? window.globalChartConfig?.idea?.id\n if (configIdeaId === idea.id) {\n window.location.reload()\n return\n }\n\n setIdeas((ideas) => ideas.filter((stateIdea) => stateIdea.id !== idea.id))\n setIsDeleting(false)\n })\n\n if (!hasFetched || hasError) {\n return (\n

\n {hasError ? 'Unexpected error occured, please refresh the page.' : 'Loading…'}\n
\n )\n }\n\n if (ideas.length === 0) {\n return (\n \n No saved ideas.\n \n )\n }\n\n return (\n <>\n {ideas.map((idea) => (\n (document.location = getIdeaUrl(idea))}\n >\n
\n

\n {idea.ticker}\n {idea.company && ' - ' + idea.company}\n

\n \n {idea.date}\n \n {idea.note !== '' ? (\n

{idea.note}

\n ) : null}\n
\n
\n \n ) => {\n ev.stopPropagation()\n onDeleteIdeaClick.current(idea)\n }}\n >\n Delete\n \n
\n \n ))}\n \n )\n}\n\nexport function IdeasDialog(props: any) {\n return (\n \n props.state.hide()}>Your ideas\n \n \n \n \n \n \n \n )\n}\n\nexport async function saveIdea(layoutModel: ChartLayout) {\n const activeChart = layoutModel.activeChart\n const activeChartQuote = activeChart.quote().toJSON()\n const { ticker, instrument, cid } = activeChart\n const period = activeChartQuote.timeframe\n const { ChartSettings } = layoutModel.settings\n const layout: ObjectHash = layoutModel.toObject()\n layout.layout = LayoutType['1h1v']\n layout.barWidth = ChartSettings.center.barWidth\n layout.barMargin = ChartSettings.center.barMargin\n layout.charts = layout.charts\n .filter((c: ObjectHash) => c.chartId === cid)\n .map((c: ObjectHash) => ({ ...c, dateRange: null, refreshData: false }))\n\n delete layout.charts[0].chartId\n\n // TODO: replace with better solution after indicators overhaul\n const getChartTickers = (layoutModelObjectPanes: { elements: { type: string; tickers: string }[] }[]) => {\n let tickers = []\n let tickersString = ''\n for (const pane of layoutModelObjectPanes) {\n for (const element of pane.elements) {\n if (element.type === 'indicators/perf') {\n tickersString = element.tickers\n }\n }\n }\n tickers = tickersString.split(',').filter((item) => item)\n if (!tickers.includes(ticker)) {\n tickers.push(ticker.replace('@', ''))\n }\n return tickers\n }\n const tickers = getChartTickers(layout.charts[0].panes)\n const quotes = Quote.select(\n (quote: Quote) =>\n tickers.includes(quote.ticker) && quote.timeframe === activeChart.timeframe && layoutModel.isIdeaId(quote.ideaID)\n ).filter((element, index, array) => array.findIndex((t) => t.ticker === element.ticker) === index)\n const quotesJsonString = JSON.stringify(quotes.map((q) => omit(q.toJSON(), ['ideaID', 'chartUuid'])))\n\n const chart = JSON.stringify(layout)\n const note =\n layoutModel.idea?.note ||\n getTickerNoteText({ ticker, elements: layoutModel.drawingsInternalStore().elements }) ||\n ''\n window.gtag?.('event', 'save', { event_category: 'ideas' })\n\n if (tickers.length !== quotes.length) {\n captureException(new Error('Idea saved with inconsistent quotes data'), {\n extra: {\n tickers,\n quoteTickersTimeframes: quotes.map((quote) => ({ ticker: quote.ticker, timeframe: quote.timeframe })),\n chartLayout: layoutModel.toConfig(['colors', 'panes']),\n },\n })\n }\n\n const data = await fetchApi<{ id: string }>({\n location: '/api/idea_save.ashx',\n method: 'POST',\n body: getFormDataFromObject({ ticker, period, chart, quotes: quotesJsonString, note }),\n })\n\n const ideaUrl = getIdeaUrl({\n ticker,\n period,\n instrument,\n id: data.id,\n })\n\n if (process.env.IS_E2E_TESTING) {\n window.location.href = ideaUrl\n } else {\n // need to be in setTimeout because Safari block any call to window.open made in async,\n // this is hack to force run window.open in main thread\n setTimeout(() => {\n window.open(ideaUrl, 'FinvizSavedIdea')\n })\n }\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport {\n Button,\n DialogTrigger,\n Dropdown,\n DropdownItem,\n Spinner,\n Tooltip,\n TooltipTrigger,\n useDialogState,\n useDropdownState,\n useTooltipState,\n} from '../../components'\nimport { IdeasDialog, saveIdea } from '../../modals/ideas'\nimport ChartLayout from '../../models/chart_layout'\nimport Quote from '../../models/quote'\nimport { getIsMobileScreenSize } from '../../utils'\nimport { encodeQueryString } from '../../utils/query_string'\n\ninterface IdeaDropdownProps {\n model: ChartLayout\n rounding?: 'none' | 'regular'\n theme?: string\n size?: string\n dropdownButtonClassName?: string\n}\n\nexport function IdeasDropdown({\n model,\n rounding,\n dropdownButtonClassName,\n ...props\n}: React.PropsWithChildren) {\n const tooltipState = useTooltipState({ placement: 'right-start' })\n const [isAnyQuoteLoading, setIsAnyQuoteLoading] = React.useState(false)\n const ref = React.useRef(null)\n const dialog = useDialogState()\n const dropdown = useDropdownState()\n const hideTooltip = tooltipState.hide\n\n React.useEffect(() => {\n const checkIfAnyQuoteIsLoading = () => {\n const fetchingQuotes = Quote.select((quote) => quote.isFetching && quote.fetchedAt === -1)\n setIsAnyQuoteLoading(fetchingQuotes.length > 0)\n }\n\n Quote.bind('change', checkIfAnyQuoteIsLoading)\n return () => {\n Quote.unbind('change', checkIfAnyQuoteIsLoading)\n }\n }, [])\n\n React.useEffect(() => {\n if (!isAnyQuoteLoading || !dropdown.visible) {\n hideTooltip()\n }\n }, [isAnyQuoteLoading, dropdown.visible, hideTooltip])\n\n if (!window.FinvizSettings.hasUserPremium) {\n return (\n \n )\n }\n\n return (\n <>\n \n }\n >\n {\n if (isAnyQuoteLoading) {\n tooltipState.show()\n return\n }\n saveIdea(model)\n }}\n >\n Save idea\n \n \n Load idea\n \n \n \n \n
\n \n
\n \n Some data is still loading. Please wait.\n \n
\n \n )\n}\n","export const publishModalAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"modals-publish\" */ './module-entry'),\n cacheKey: 'modals-publish',\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport { Button, Delayed, DialogTrigger, Icon, Spinner, useDialogState } from '../../components'\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\nimport ChartLayout from '../../models/chart_layout'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\n\ninterface PublishProps {\n model: ChartLayout\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function Publish({ model, ...props }: React.PropsWithChildren) {\n const dialog = useDialogState()\n const [publishModalModule, { isLoading }] = useAsyncModule({\n ...publishModalAsyncModule,\n shouldLoadModule: dialog.visible,\n errorSeverity: 'medium',\n onError: () => dialog.hide(),\n })\n const PublishDialog = publishModalModule?.default\n const buttonProps = isLoading\n ? {\n leftContent: (\n \n }\n >\n \n \n ),\n }\n : {\n as: DialogTrigger,\n state: dialog,\n leftContent: 'share',\n }\n return (\n <>\n \n {PublishDialog && }\n \n )\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport { Button, Delayed, Icon, Spinner, useTour } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { getRequestFullscreen, isRedesignEnabled } from '../../utils'\nimport { encodeQueryString } from '../../utils/query_string'\n\ninterface TourDefinition {\n id: string\n steps: Array<{\n title?: React.ReactNode\n body: React.ReactNode\n target?: string\n placement?: string\n overlayRadius?: number\n overlayPadding?: number\n }>\n skip?: boolean\n}\n\nconst isPremium = window.FinvizSettings.hasUserPremium\n\n// If we need to update / discontinue some tour we can use skip flag on legacy version to ensure that it won't reset users tour but won't include it in new tours\nfunction getTour(page: SpecificChartFunctionality): TourDefinition[] {\n return [\n {\n id: 'chart-tour',\n steps: [\n {\n title: 'Chart Tour',\n body: 'Discover powerful Chart features in the 2-min tour to master your analysis of trading opportunities.',\n },\n ...(isPremium\n ? [\n {\n title: 'Scale the Timeline',\n body: 'Grab the timeline to zoom it in and out. Double-click the timeline to reset the scaling.',\n target: '[data-testid=\"chart-0-pane-0-zoomer\"]',\n },\n {\n title: 'Scale the Price Axis',\n body: 'Grab the Price Axis to zoom it in and out. Move the chart around freely in any direction when Price Axis has custom scale. Double-click the Price Axis to reset the scaling.',\n target: '[data-testid=\"chart-0-pane-0-scaler\"]',\n },\n {\n title: 'Drawing tools & settings',\n body: 'Pick any Drawing Tool to analyze the market. Tailor your drawing experience with additional settings.',\n target: '#toolbar',\n },\n {\n title: 'Fine-tune Drawings',\n body: 'Double-click on a chart drawing to tweak its color and style. Right-click on a drawing to access other options, such as changing its visibility, order, and more.',\n target: '[data-testid=\"chart-0-pane-0\"]',\n },\n ]\n : [\n {\n title: 'Enable Drawing mode',\n body: (\n <>\n \n Finviz*Elite\n {' '}\n subscribers get access a whole suite of drawing tools which allow them to draw on and annotate the\n chart.
\n While in drawing mode, you can also pan the chart, scale the timeline and price axis and much more.\n \n ),\n target: '[data-testid=\"quote-toggle-draw-btn\"]',\n placement: 'bottom-start',\n },\n ]),\n {\n title: 'Save your best Ideas',\n body: isPremium\n ? 'Besides your drawings being autosaved, you can manually save ideas that you wish to revisit later.'\n : 'Your drawings will be saved automatically, but you can also manually save ideas that you wish to revisit later.',\n target: '[data-testid=\"chart-toolbar-ideas\"]',\n placement: 'bottom-start',\n },\n ...(page === SpecificChartFunctionality.quotePage\n ? []\n : [\n {\n title: 'Chart Layouts & Charts Sync',\n body: 'Switch between Chart Layouts to view multiple charts on your screen. Synchronize Ticker, Timeframe or Crosshair position across your charts.',\n target: '[data-testid=\"chart-layout-layout\"]',\n },\n ]),\n ...(!getRequestFullscreen(document.documentElement) && page === SpecificChartFunctionality.chartPage\n ? []\n : [\n {\n title: 'Fullscreen mode',\n body:\n page === SpecificChartFunctionality.quotePage\n ? 'Open the chart in an expanded view for full-page display and split-screen charts.'\n : 'Toggle the window to fill your entire screen.',\n target: '[data-testid=\"chart-layout-fullscreen\"]',\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\n },\n ]),\n {\n title: 'Share chart',\n body: 'Share a chart together with your analysis and ideas.',\n target: '[data-testid=\"chart-toolbar-publish\"]',\n overlayPadding: page === SpecificChartFunctionality.quotePage ? 3 : undefined,\n placement: 'bottom',\n },\n ...(isRedesignEnabled() || page === SpecificChartFunctionality.chartPage\n ? [\n {\n title: 'Theme',\n body: 'Switch between the Light and Dark theme.',\n target: '[data-testid=\"chart-layout-theme\"]',\n },\n ]\n : []),\n {\n title: 'Study Settings',\n body: 'Customize the Chart Type and appearance. Add Overlays, Indicators and toggle Extended Hours.',\n target: '[data-testid=\"chart-settings-open-btn\"]',\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\n },\n ],\n },\n page === SpecificChartFunctionality.chartPage && {\n id: 'sidebar-watchlist',\n steps: [\n {\n title: 'Explore Your Portfolios',\n body: 'Effortlessly navigate through your portfolio holdings. With just a click, visualize individual stock charts, gain insights, and stay updated on your investments.',\n target: '[data-testid=\"sidebar-portfolio-btn\"]',\n placement: 'left-start',\n },\n ],\n },\n ].filter(Boolean) as TourDefinition[]\n}\n\ninterface TourButtonProps {\n page: SpecificChartFunctionality\n rounding?: 'none' | 'regular'\n size?: string\n theme?: string\n className?: string\n}\n\nexport function TourButton({ page, className, theme, ...props }: React.PropsWithChildren) {\n const tour = useTour()\n const pageTours = getTour(page)\n const [userTour, setCurrentTour] = React.useState(tour.getStepsForUser(pageTours))\n const buttonTheme = userTour.hasNewTours ? 'blue' : theme ?? 'headerItem'\n\n return (\n \n }\n >\n \n \n ) : (\n \n )\n }\n className={className}\n contentClass={page !== SpecificChartFunctionality.quotePage ? 'hidden lg:flex' : ''}\n title=\"Explore new features\"\n onClick={async () => {\n if (userTour) {\n const activeTour = await tour.startTour(userTour.tour)\n activeTour?.once('inactive', () => {\n setCurrentTour(tour.getStepsForUser(pageTours))\n })\n }\n }}\n />\n )\n}\n","import * as React from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { Icon, Select, SelectOption } from '../../components'\nimport ChartLayout from '../../models/chart_layout'\nimport { useChartTypes } from './use-chart-types'\nimport { TypeBaseOption } from './utils'\n\nconst isNativeMobileSelect = true // explicitly enable native select for mobile devices\n\nexport function ChartTypesSelect({\n isPremium,\n model,\n ...props\n}: {\n isPremium: boolean\n model: ChartLayout\n theme?: string\n size?: string\n rounding?: string\n}) {\n const { chartTypes, getCurrentType } = useChartTypes({ isPremium, model })\n const currentType = getCurrentType()\n const [selectedType, setSelectedType] = React.useState(currentType)\n const icon = chartTypes.find((item) => item.value === selectedType)?.iconName\n\n React.useEffect(() => {\n setSelectedType(currentType)\n }, [currentType])\n\n return (\n item.value === selectedType)?.iconName} className=\"text-gray-300\" />\n )\n }\n rightContent={props.theme === 'chip' ? 'caretDown' : undefined}\n hasPopoverButtonWidthLimit={false}\n isNativeMobileSelect={isNativeMobileSelect}\n onChange={(item: TypeBaseOption) => setSelectedType(item.value)}\n >\n {chartTypes.map((item) => (\n \n {item.label}\n \n ))}\n \n )\n}\n","import * as React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport ChartLayout from '../../models/chart_layout'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\nimport {\n DEFAULT_TYPES,\n FREE_TYPES_QUOTE,\n FREE_TYPES_QUOTE_VALUES,\n QuoteLongToShortType,\n QuoteNodeChartTypes,\n QuoteShortToLongType,\n QuoteUrlChartTypes,\n TypeBaseOption,\n} from './utils'\n\nexport function useChartTypes({ isPremium, model }: { isPremium: boolean; model: ChartLayout }) {\n const location = useLocation()\n const { b, t, ta, ty, p = 'd', r } = decodeQueryString(location.search)\n const taInt = ta ? Number.parseInt(ta) : 1\n const isQuotePage = model.specificChartFunctionality === SpecificChartFunctionality.quotePage\n\n const getCurrentType = React.useCallback(() => {\n const defaultType =\n ((ty as QuoteUrlChartTypes | undefined) && QuoteShortToLongType[ty as QuoteUrlChartTypes]) ??\n (window.FinvizQuoteTypeCurrent as QuoteNodeChartTypes)\n\n return !isPremium && defaultType === QuoteNodeChartTypes.candlestick && taInt === 0\n ? QuoteNodeChartTypes.candlesticksimple\n : defaultType\n }, [isPremium, taInt, ty])\n\n const generateRouterPath = React.useCallback(\n (type: QuoteNodeChartTypes) => {\n if (isPremium || FREE_TYPES_QUOTE_VALUES.includes(type)) {\n return `${location.pathname}?${encodeQueryString({\n b,\n t,\n r,\n ty:\n type === QuoteNodeChartTypes.candlesticksimple\n ? QuoteLongToShortType.candlestick\n : QuoteLongToShortType[type],\n ta: type === QuoteNodeChartTypes.candlestick ? '1' : '0',\n p,\n })}`\n }\n return `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: 'quote-chart-type-select',\n })}`\n },\n [isPremium, location.pathname, b, t, r, p]\n )\n\n const chartTypes = React.useMemo(() => {\n const options = isPremium || !isQuotePage ? DEFAULT_TYPES : FREE_TYPES_QUOTE\n\n return options.map((item) => ({\n ...item,\n href: generateRouterPath(item.value as QuoteNodeChartTypes),\n reloadDocument: !isPremium,\n })) as TypeBaseOption[]\n }, [generateRouterPath, isPremium, isQuotePage])\n\n return { getCurrentType, chartTypes }\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport { Paragraph } from '../../components'\nimport math from '../../helpers/math'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport { useAsyncModule, withSuspense } from '../../utils/async-modules-utils'\nimport { getTickerChange } from '../../utils/chart'\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\n\ninterface Props {\n chartIndex: number\n}\n\ninterface ChangeLabelProps {\n children: React.ReactNode\n changePoints: number\n isTiny: boolean\n}\n\nconst CHANGE_UPATE_EVENTS = ['change', 'update']\nconst QUOTE_MODEL_CHANGE_EVENTS = [...CHANGE_UPATE_EVENTS, ...Object.values(QuoteFetchType)]\n\nfunction ChangeLabel({ children, changePoints, isTiny }: ChangeLabelProps) {\n return (\n 0,\n 'text-red-400': changePoints < 0,\n })}\n >\n {children}\n \n )\n}\n\nexport function DailyChangeDisplayComponent({ chartIndex }: Props) {\n const [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { chartLayoutModel } = chartsModule.useChartLayoutGlobalModel()\n const chartModel = useModelState(chartLayoutModel?.getAllCharts()[chartIndex] ?? null, {\n watchProperties: ['quote'],\n listenOnEvents: CHANGE_UPATE_EVENTS,\n })\n const quoteModel = useModelState(chartModel?.quote() ?? null, {\n watchProperties: ['lastClose', 'prevClose', 'afterClose'],\n listenOnEvents: QUOTE_MODEL_CHANGE_EVENTS,\n })\n\n const tickerChange = quoteModel && getTickerChange({ data: quoteModel })\n const isTiny =\n !!tickerChange?.tickerChange &&\n math.getInstrumentDecimalPlaces({\n instrument: quoteModel!.instrument,\n value: quoteModel!.lastClose,\n }) >= 6\n\n return (\n
\n {tickerChange?.tickerChange && (\n <>\n {tickerChange.tickerAfterChange && (\n \n {tickerChange.tickerAfterChange.string}\n \n )}\n \n {tickerChange.tickerChange.string}\n \n \n )}\n
\n )\n}\n\nexport const DailyChangeDisplay = React.memo(\n withSuspense(DailyChangeDisplayComponent),\n (prevProps, nextProps) => prevProps.chartIndex === nextProps.chartIndex\n)\n","import * as React from 'react'\n\nimport { Button } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport utils from '../../utils'\nimport { DRAWING_COOKIE_NAME, getIsDrawingEnabled } from '../../utils/chart'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\n\nconst utmCampaign: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-draw-button',\n [SpecificChartFunctionality.futuresPage]: 'futures-interactive-chart',\n [SpecificChartFunctionality.forexPage]: 'forex-interactive-chart',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-interactive-chart',\n}\n\nconst testId: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-toggle-draw-btn',\n [SpecificChartFunctionality.futuresPage]: 'futures-interactive',\n [SpecificChartFunctionality.forexPage]: 'forex-interactive',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-interactive',\n}\n\ninterface DrawButtonProps {\n isPremium: boolean\n specificChartFunctionality: SpecificChartFunctionality\n active?: boolean\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function DrawButton({\n isPremium,\n specificChartFunctionality,\n ...props\n}: React.PropsWithChildren) {\n const buttonProps = React.useMemo(() => {\n if (!isPremium) {\n return {\n as: 'a',\n href: `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: utmCampaign[specificChartFunctionality],\n })}`,\n }\n }\n\n return {\n onClick: (ev: React.MouseEvent) => {\n ev.preventDefault()\n const newValue = getIsDrawingEnabled() ? 'off' : 'on'\n\n fetch('/api/set_cookie.ashx?cookie=' + DRAWING_COOKIE_NAME + '&value=' + newValue)\n .catch(() => {})\n .then((res) => {\n if (!res?.ok) {\n // fallback to JS otherwise draw toggle won't work if API don't work\n const expires = new Date()\n expires.setMonth(expires.getMonth() + 1)\n utils.setCookie(DRAWING_COOKIE_NAME, newValue, expires)\n }\n\n const { i: idea, ...rest } = decodeQueryString()\n if (idea) {\n document.location = `quote.ashx?${encodeQueryString(rest)}`\n } else {\n document.location.reload()\n }\n })\n },\n }\n }, [isPremium, specificChartFunctionality])\n\n return (\n \n )\n}\n","import * as React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { Button } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport ChartLayout from '../../models/chart_layout'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\n\nfunction getTickersString(tickers: string[], tickersCount: number) {\n return Array.from({ length: Math.min(tickersCount, 6) })\n .map((_, index) => tickers[index] ?? tickers[tickers.length - 1])\n .join(',')\n}\n\nfunction getLayoutType(tickersCount: number) {\n switch (tickersCount) {\n case 0: // shouldn't happen\n case 1:\n return '1h1v'\n case 2:\n return '2h1v'\n case 3:\n return '3h1v'\n case 4:\n return '2h2v'\n case 5:\n default:\n // 6 and more\n return '3h2v'\n }\n}\n\nconst utmCampaign: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-fullscreen-button',\n [SpecificChartFunctionality.futuresPage]: 'futures-fullscreen-button',\n [SpecificChartFunctionality.forexPage]: 'forex-fullscreen-button',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-fullscreen-button',\n}\n\ninterface FullscreenButtonProps {\n model: ChartLayout\n isPremium: boolean\n title?: string\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function FullscreenButton({ model, isPremium, ...props }: React.PropsWithChildren) {\n const location = useLocation()\n const { i, p = 'd', r } = decodeQueryString(location.search)\n const urlTickers = model\n .charts()\n .all()\n .map((chart) => chart.quote().getRawTicker())\n\n return (\n p).join(','),\n l: getLayoutType(urlTickers.length),\n r,\n })}`\n : `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: utmCampaign[model.specificChartFunctionality],\n })}`\n }\n />\n )\n}\n","import React from 'react'\n\nimport { Instrument } from '../../../types/shared'\nimport {\n Button,\n Dialog,\n DialogTrigger,\n Dropdown,\n DropdownItem,\n Icon,\n SaveToPortfolio,\n Search as WebsiteSearchComponent,\n useDialogState,\n useDropdownState,\n} from '../../components'\n\ninterface SearchProps {\n ticker: string\n instrument: Instrument\n onTickerSelected: (ticker: string) => void\n chartIndex: number\n}\n\nexport default function Search({ ticker, instrument, onTickerSelected, chartIndex }: SearchProps) {\n const dropdownState = useDropdownState({ placement: 'bottom-end' })\n const dialog = useDialogState()\n\n const detailLink = React.useMemo(() => {\n const formattedTicker = ticker.replace('@', '')\n\n switch (instrument) {\n case Instrument.Stock:\n return `/quote.ashx?t=${formattedTicker}`\n case Instrument.Futures:\n return `/futures_charts.ashx?t=${formattedTicker}`\n case Instrument.Forex:\n return `/forex_charts.ashx?t=${formattedTicker}`\n case Instrument.Crypto:\n return `/crypto_charts.ashx?t=${formattedTicker}`\n }\n }, [ticker, instrument])\n\n return (\n
\n }\n />\n }\n >\n \n {instrument === Instrument.Stock ? 'Open Stock Detail' : 'Open Detail'}\n \n {instrument === Instrument.Stock && (\n \n Save to Portfolio\n \n )}\n {instrument === Instrument.Stock && (\n \n Create Alert\n \n )}\n \n }\n />\n \n \n \n
\n )\n}\n","import React from 'react'\n\nimport {\n Button,\n Popover,\n PopoverTrigger,\n getExtendedDialogState,\n useElementMeasure,\n usePopoverState,\n} from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { chartSettingsAsyncModule } from '../../controllers/chart-settings/async-modules'\nimport ChartLayout from '../../models/chart_layout'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\nimport { encodeQueryString } from '../../utils/query_string'\n\nconst SETTINGS_WIDTH = 580 // w-145\nconst BUTTON_POPOVER_GUTTER = 16\nconst SETTINGS_POPOVER_ID = 'settings-popover'\n\nconst utmCampaign: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-settings-button',\n [SpecificChartFunctionality.futuresPage]: 'futures-settings-button',\n [SpecificChartFunctionality.forexPage]: 'forex-settings-button',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-settings-button',\n}\n\ntype PopoverStylesType = { body?: React.CSSProperties; wrapper?: React.CSSProperties }\n\nexport function ScrollableChartSettingsPopover({ state, model }: { state: any; model: ChartLayout }) {\n const { elementWidth: bodyWidth } = useElementMeasure(document.body)\n const [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { PreventClosingUnsavedChanges, ChartSettings } = chartsModule\n const { isFullyClosed } = getExtendedDialogState(state)\n const chartElement = document.getElementById('chart')\n const popoverContentElement = document.getElementById(SETTINGS_POPOVER_ID)\n const settingsButton: HTMLButtonElement = state.unstable_referenceRef.current\n\n const popoverStyles = React.useMemo(() => {\n const newPopoverStyles: PopoverStylesType = {}\n if (!settingsButton || !chartElement) {\n return newPopoverStyles\n }\n const buttonRect = settingsButton.getBoundingClientRect()\n const topOffset = buttonRect.top + buttonRect.height\n newPopoverStyles.body = {\n maxHeight: window.innerHeight - topOffset - BUTTON_POPOVER_GUTTER * 2,\n position: 'sticky',\n top: -topOffset + BUTTON_POPOVER_GUTTER - window.scrollY,\n }\n if (!popoverContentElement) {\n return newPopoverStyles\n }\n const chartHeight = chartElement.clientHeight\n const popoverContentHeight = popoverContentElement.offsetHeight\n const emptySpaceDiff = bodyWidth - model.width\n const maxOffset = SETTINGS_WIDTH - buttonRect.width\n\n let rightOffset = emptySpaceDiff > 150 ? (emptySpaceDiff / 2) * -1 : 0\n if (emptySpaceDiff / 2 > maxOffset) rightOffset = maxOffset * -1\n\n newPopoverStyles.wrapper = {\n height: popoverContentHeight < chartHeight ? chartHeight : undefined,\n marginRight: rightOffset,\n }\n\n return newPopoverStyles\n }, [settingsButton, chartElement, popoverContentElement, model.width, bodyWidth])\n\n return (\n \n {({ checkForUnsavedChangesAndClose }) => (\n \n {!isFullyClosed && {}} onClose={checkForUnsavedChangesAndClose} />}\n \n )}\n \n )\n}\n\ninterface ChartSettingsButtonProps {\n isPremium: boolean\n placement?: string\n model: ChartLayout\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function ChartSettingsButton({\n isPremium,\n model,\n placement,\n ...props\n}: React.PropsWithChildren) {\n const settingsPopoverState = usePopoverState({ placement: placement ?? 'bottom-end' })\n\n const buttonProps = React.useMemo(() => {\n if (model.specificChartFunctionality !== SpecificChartFunctionality.quotePage && !isPremium) {\n return {\n as: 'a',\n href: `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: utmCampaign[model.specificChartFunctionality],\n })}`,\n }\n }\n\n return {\n as: PopoverTrigger,\n state: settingsPopoverState,\n active: settingsPopoverState.visible,\n }\n }, [model, isPremium, settingsPopoverState])\n\n return (\n <>\n \n \n \n )\n}\n","import * as React from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { ChartsOrQuotePageQueryParams, SpecificChartFunctionality } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { useModelRef } from '../../model-hooks/useModelRef'\nimport Chart from '../../models/chart'\nimport Quote from '../../models/quote'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport { createRequestAbortController, removeFromAbortCache } from '../../utils/abort_controller'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\nimport { getLeftOffset } from '../renderUtils'\n\nconst getQuoteRequestKey = (chartModel: Chart) =>\n `quoteReq-${chartModel.ticker}-${chartModel.instrument}-${chartModel.id}`\n\nexport function useChartControls({\n chartModel: unwatchedChartModel,\n isInteractive,\n}: {\n chartModel: Chart | null\n isInteractive: boolean\n}) {\n const location = useLocation()\n const navigate = useNavigate()\n const chartModel = useModelState(unwatchedChartModel, {\n watchProperties: ['ticker', 'timeframe', 'dateRange'],\n })\n const chartLayoutModel = useModelState(chartModel?.chart_layout() ?? null, {\n watchProperties: ['idea', 'settings'],\n })\n const chartModelRef = useModelRef(chartModel)\n const [isLoading, setIsLoading] = React.useState(false)\n const abortControllerKeyRef = React.useRef('')\n const isIdeaChart = !!chartLayoutModel?.idea?.id\n\n const updateChartModelWithNewQuote = React.useCallback((quote: Quote) => {\n const chart = chartModelRef.current\n if (!chart) {\n return\n }\n\n const chartLayoutModel = chart.chart_layout()\n const isSameTicker = chart.getQuoteRawTicker() === quote.getRawTicker()\n\n chart.getAllPanes().forEach((pane) => {\n if (!!pane.getChartOrIndicatorElement()) {\n pane.updateAttribute('scaleRange', null)\n }\n })\n\n chart.updateAttributes({ leftOffset: getLeftOffset({ quote, chartModel: chart }), quote, isScrolled: true })\n\n // Refetch all other chart quotes as the main one is already refetched so we can filter it out but other quotes (from perf for example) should be refetched as well\n chart\n .getAllQuotes()\n .filter((chartQuote) => !chartQuote.eql(quote))\n .forEach((quote) => {\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\n })\n\n const chartPane = chart.getChartPane()\n chartLayoutModel.activeChartEvent?.instance.toggleIsOpen(false)\n\n const elements = [...chart.getAllElements(), ...(chartPane?.getAllChartEvents(false) ?? [])]\n for (const element of elements) {\n const isDrawing = element.isDrawing()\n const isChartEvent = element.isChartEvent()\n if (isDrawing || isChartEvent) {\n // We want to remove all drawings on ticker change but if autosave is enabled we let the autosave hook take care of that\n if (isSameTicker && (isChartEvent || chartLayoutModel.isPreserveDrawingsActive)) {\n element.instance.updateScales()\n } else {\n element.destroyCascade()\n }\n }\n }\n\n chart.setChartEvents(quote.chartEvents, true)\n\n chartPane?.updateChartEventsZIndexes()\n\n // The only dependency here is a ref , so no need to add it to dependencies\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const fetchQuote = React.useCallback(async () => {\n if (!isInteractive || !chartModel || isIdeaChart) {\n return\n }\n setIsLoading(true)\n\n const { ticker, instrument, timeframe, hasChartEvents } = chartModel\n const { premarket, aftermarket } = Quote.first()\n const patterns = chartModel.getHasPatterns()\n const currentQuote = chartModel.quote()\n if (currentQuote.getRawTicker() !== ticker || currentQuote.timeframe !== timeframe) {\n abortControllerKeyRef.current = getQuoteRequestKey(chartModel)\n const abortController = createRequestAbortController({\n key: abortControllerKeyRef.current,\n shouldAbortRunningRequest: !Quote.select(\n (quote) =>\n quote.ticker === ticker &&\n quote.timeframe === timeframe &&\n quote.isFetching &&\n chartModel.chart_layout().isIdeaId(quote.ideaID)\n ),\n })\n\n const quote = await Quote.get({\n ticker,\n instrument,\n timeframe,\n options: {\n premarket,\n aftermarket,\n events: hasChartEvents,\n patterns,\n cachePredicate: (quote) => quote.ideaID === undefined,\n fetchNewDataOnCachedQuote: true,\n },\n abortController,\n })\n\n if (quote.wasFetchAborted) {\n // Check if the quote is also used in other chars, as the quote may be reused if we already have a quote with the same options\n const isQuoteUsedInOtherCharts = chartModel\n .chart_layout()\n .getAllCharts()\n .filter((chart) => !chartModel.eql(chart))\n .some((chart) => quote.eql(chart.quote()))\n\n // If the quote hasn't been fetched yet and is not anywhere else we can destroy the model\n if (quote.fetchedAt === -1 && !isQuoteUsedInOtherCharts) {\n quote.destroy()\n }\n\n return\n }\n\n removeFromAbortCache(abortControllerKeyRef.current)\n\n updateChartModelWithNewQuote(quote)\n }\n\n setIsLoading(false)\n\n // We don't want to create new function on any chartModel change as it may be the same chart with different object instance\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n chartModel?.id,\n chartModel?.ticker,\n chartModel?.timeframe,\n chartModel?.instrument,\n isIdeaChart,\n updateChartModelWithNewQuote,\n isInteractive,\n ])\n\n React.useEffect(() => {\n fetchQuote()\n }, [fetchQuote])\n\n // There are several ways how to turn off dateRange, e.g. moving the charts\n // This effect listens to dateRange changes on chartmodel and updates the url if there's a change\n // Consider refactoring this part so we only update chart models on route changes not the other way around\n React.useEffect(() => {\n if (chartModel) {\n const decodedQueryString = decodeQueryString(location.search)\n const rangesArray = chartModel\n .chart_layout()\n .getAllCharts()\n .map((chart) => chart.dateRange)\n const ranges = rangesArray.every((i) => !i) ? undefined : rangesArray.join(',')\n\n if (decodedQueryString.r !== ranges) {\n navigate({\n search: `?${encodeQueryString({\n ...decodedQueryString,\n r: ranges,\n })}`,\n })\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chartModel?.dateRange])\n\n // https://github.com/finvizhq/charts/pull/1253/files#r1052266805\n // React.useEffect(\n // () => () => {\n // if (isInteractive && abortControllerKeyRef.current !== '') {\n // abortRequest(abortControllerKeyRef.current)\n // }\n // },\n // [isInteractive]\n // )\n\n React.useEffect(() => {\n const chart = chartModelRef.current\n const quote = chart?.quote()\n\n let shouldRecalculateOnCharts = false\n if (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage && !isIdeaChart) {\n const settings = chartLayoutModel?.settings\n const barWidth = 3\n const barMargin = 1\n if (settings) {\n const hasSameBarWidth = [\n settings.ChartSettings.center.barWidth,\n settings.IndicatorSettings.center.barWidth,\n ].every((value) => value === barWidth)\n const hasSameBarMargin = [\n settings.ChartSettings.center.barMargin,\n settings.IndicatorSettings.center.barMargin,\n ].every((value) => value === barMargin)\n\n shouldRecalculateOnCharts = !hasSameBarWidth || !hasSameBarMargin\n if (shouldRecalculateOnCharts) {\n settings.ChartSettings.center.barWidth = barWidth\n settings.IndicatorSettings.center.barWidth = barWidth\n settings.ChartSettings.center.barMargin = barMargin\n settings.IndicatorSettings.center.barMargin = barMargin\n\n chartLayoutModel.updateAttributes({ settings })\n }\n }\n }\n\n if (\n chart &&\n quote &&\n (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage ||\n shouldRecalculateOnCharts) &&\n !isIdeaChart\n ) {\n const leftOffset = getLeftOffset({ quote, chartModel: chart })\n chart.updateAttributes({ leftOffset })\n }\n // This effect should run only on timeframe change & idea change\n // The reason we need to recalculate the left offset is that quote timeframe change changes chart and chart bars sizes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chartModel?.quote()?.timeframe, chartLayoutModel?.settings, isIdeaChart])\n\n return { isLoading }\n}\n","import Spine from '@finviz/spine'\nimport * as React from 'react'\n\nexport function useModelRef(model: Model | null) {\n const modelRef = React.useRef(model)\n\n React.useEffect(() => {\n modelRef.current = model\n }, [model])\n\n return modelRef\n}\n","import classnames from 'classnames'\nimport React from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport {\n CustomDateRange,\n Heading,\n TimeframeBar,\n useCustomDateRangeDialog,\n useFavoriteTimeframes,\n} from '../../components'\nimport { ChartEditorEnum, SpecificChartFunctionality, TIMEFRAME } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Chart from '../../models/chart'\nimport { IdeasDropdown } from '../header/ideas_dropdown'\nimport { Publish } from '../header/publish'\nimport { TourButton } from '../header/tour_button'\nimport { ChartTypesSelect } from './chart-type-select'\nimport { DailyChangeDisplay } from './daily-change-display'\nimport { DrawButton } from './draw-button'\nimport { FullscreenButton } from './fullscreen-button'\nimport Search from './search'\nimport { ChartSettingsButton } from './settings-button'\nimport { useChartControls } from './use-chart-controls'\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\n\ninterface SettingsComponentProps {\n chartModel: Chart\n chartIndex: number\n}\n\nconst isPremium = window.FinvizSettings.hasUserPremium\nconst hasRedesignEnabled = window.FinvizSettings.hasRedesignEnabled\n\nexport function ChartControls({ chartIndex, chartModel: unwatchedChartModel }: SettingsComponentProps) {\n const rounding = hasRedesignEnabled ? undefined : 'none'\n // This memo is required for publish, otherwise it ends up in a loop\n const chartLayout = React.useMemo(() => unwatchedChartModel.chart_layout(), [unwatchedChartModel])\n const chartModel = useModelState(unwatchedChartModel, {\n watchProperties: ['ticker', 'quote', 'dateRange'],\n })\n const { instrument } = chartModel?.quote() || {}\n const isQuotePage = chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage\n\n const navigate = useNavigate()\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes()\n const { isLoading } = useChartControls({\n chartModel,\n isInteractive: true,\n })\n const {\n anchorDate,\n generateChartLayoutRouterPath,\n timeframeGroupsWithHref,\n dateRangeGroupsWithHref,\n isFetching,\n handleCustomDateRangeValidation,\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\n useCustomDateRangeDialog({\n instrument,\n anchorDate,\n pathGenerator: generateChartLayoutRouterPath,\n })\n\n const handleTickerSelect = React.useCallback(\n (ticker: string) => {\n const upperCaseTicker = ticker.toUpperCase()\n\n navigate(\n generateChartLayoutRouterPath({\n ticker: upperCaseTicker,\n timeframe: chartModel.timeframe,\n dateRange: chartModel.dateRange,\n })\n )\n },\n [chartModel, generateChartLayoutRouterPath, navigate]\n )\n\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\n if (!dateRangeTimeframe) return\n\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\n if (isValid) onDialogSubmit(dateRangeTimeframe)\n }\n\n const timeframeBarProps = React.useMemo(\n () => ({\n size: 'medium',\n chartIndex: chartIndex,\n timeFrameGroups: timeframeGroupsWithHref(isPremium),\n dateRangeGroups: dateRangeGroupsWithHref({ isPremium, customRange: chartModel.dateRange, instrument }),\n selectedTimeframe: chartModel.timeframe,\n onTimeframeSelect: () => {},\n selectedDateRange: chartModel.dateRange,\n favoriteTimeframes: favoriteTimeframes,\n loadingTimeframe: isLoading ? chartModel.timeframe : undefined,\n onDateRangeSelect: handleDateRangeSelect,\n isFavoritesEnabled: isPremium,\n onFavoriteTimeframeToggle: ({ value }: { value: TIMEFRAME }) => {\n toggleFavoriteTimeframe(value)\n },\n }),\n [\n chartIndex,\n chartModel.dateRange,\n chartModel.timeframe,\n dateRangeGroupsWithHref,\n favoriteTimeframes,\n handleDateRangeSelect,\n instrument,\n isLoading,\n timeframeGroupsWithHref,\n toggleFavoriteTimeframe,\n ]\n )\n\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n return (\n
\n {chartModel.chart_layout().canChangeTicker && (\n \n )}\n\n \n\n \n\n \n
\n )\n }\n\n const hasTimeframe = chartLayout.editors.includes(ChartEditorEnum.timeframe)\n\n return (\n \n
\n {!isQuotePage && (\n \n {chartModel.quote().name ?? chartModel.ticker}\n \n )}\n {chartLayout.editors.includes(ChartEditorEnum.tools) && (\n \n Draw\n \n )}\n {chartLayout.editors.includes(ChartEditorEnum.ideas) && (\n \n Ideas\n \n )}\n {!hasTimeframe && (\n
\n \n
\n )}\n
\n\n {hasTimeframe && (\n
\n
\n
\n \n
\n
\n \n \n
\n
\n
\n )}\n\n
\n {chartLayout.editors.includes(ChartEditorEnum.publish) && (\n \n Share\n \n )}\n {isQuotePage && (\n \n )}\n \n {!isQuotePage && 'Fullscreen'}\n \n {chartLayout.editors.includes(ChartEditorEnum.settings) && (\n \n {!isQuotePage && 'Settings'}\n \n )}\n {!isQuotePage && (\n
\n \n
\n )}\n
\n \n )\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = FLibs.Hammerjs;","import React from 'react'\n\nimport { ChartEventBadgeType } from '../../../constants/common'\nimport { IChartEventBadgeProps } from '../utils'\nimport { chartBadgeSvgByType } from './chart-badges-svg-by-type'\n\nexport const getChartEventBadgeElement = (props: IChartEventBadgeProps & { badgeType: ChartEventBadgeType }) => {\n const svgHtmlString = chartBadgeSvgByType[props.badgeType](props)\n\n return \n}\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { Paragraph } from '../../../components'\n\nexport type PopoverTableRowData = Array<{ value: string | number; className?: string; colSpan?: number; href?: string }>\n\nexport function ChartEventPopoverTableRow({ data }: { data: PopoverTableRowData }) {\n return (\n \n {data.map(({ value, className, colSpan, href }, index) => (\n \n \n {value}\n \n \n ))}\n \n )\n}\n","import React from 'react'\n\nimport { Theme } from '../../../../types/shared'\nimport { Heading } from '../../../components'\nimport { ChartEventBadgeType, ChartEventLabels } from '../../../constants/common'\nimport { CHART_EVENT_BADGE_SIZE } from '../badges/chart-badge-svg-by-type'\nimport { getChartEventBadgeElement } from '../badges/get-chart-event-badge-element'\nimport { ChartEventBadgeState, IDividends, getFormattedEventDate, getFormattedValue } from '../utils'\nimport { ChartEventPopoverTableRow, PopoverTableRowData } from './chart-event-popover-table-row'\n\nexport function ChartEventDividendsPopoverContent({\n badgeType,\n rawData,\n theme,\n}: {\n badgeType: ChartEventBadgeType\n rawData: IDividends\n theme: Theme\n}) {\n const data = React.useMemo(() => {\n const dataArray: PopoverTableRowData[] = [\n [{ value: 'Ex-date' }, { value: getFormattedEventDate(rawData.dateTimestamp) }],\n ]\n if (rawData.ordinary > 0) {\n dataArray.push([{ value: 'Amount' }, { value: getFormattedValue({ value: rawData.ordinary }) }])\n }\n if (rawData.special > 0) {\n dataArray.push([{ value: 'Special' }, { value: getFormattedValue({ value: rawData.special }) }])\n }\n return dataArray\n }, [rawData])\n\n return (\n <>\n
\n {getChartEventBadgeElement({\n theme: theme,\n state: ChartEventBadgeState.default,\n width: CHART_EVENT_BADGE_SIZE,\n badgeType,\n })}{' '}\n {ChartEventLabels[badgeType]}\n
\n \n \n {data.map((item, index) => (\n \n ))}\n \n
\n \n )\n}\n","import React from 'react'\n\nimport { Theme } from '../../../../types/shared'\nimport { Heading } from '../../../components'\nimport { ChartEventBadgeType, ChartEventLabels } from '../../../constants/common'\nimport { BigNumber } from '../../../helpers/math'\nimport { encodeQueryString } from '../../../utils/query_string'\nimport { CHART_EVENT_BADGE_SIZE } from '../badges/chart-badge-svg-by-type'\nimport { getChartEventBadgeElement } from '../badges/get-chart-event-badge-element'\nimport { ChartEventBadgeState, IEarnings, getFormattedEventDate, getFormattedValue } from '../utils'\nimport { ChartEventPopoverTableRow, PopoverTableRowData } from './chart-event-popover-table-row'\n\nconst SURPRISE_POSITIVE_COLOR = 'text-green-500 dark:text-green-400'\nconst SURPRISE_NEGATIVE_COLOR = 'text-red-500 dark:text-red-400'\n\nfunction getFormattedFiscalPeriod(fiscalPeriodRaw: string) {\n const fiscalPeriod = fiscalPeriodRaw.toLowerCase()\n if (fiscalPeriod.includes('q')) {\n const [year, quarter] = fiscalPeriod.split('q')\n return `${year} Q${quarter}`\n }\n if (fiscalPeriod.includes('s')) {\n const [year, semester] = fiscalPeriod.split('s')\n return `${year} S${semester}`\n }\n return fiscalPeriodRaw\n}\n\nfunction getPercentValueString(value: number, totalValue: number) {\n if (totalValue === 0) {\n return ''\n }\n const percent = (value / totalValue) * 100\n const percentValue = isNaN(percent) ? 0 : Math.abs(percent)\n\n return `(${getFormattedValue({\n value: percentValue,\n maxDecimalPlaces: 2,\n })}%)`\n}\n\nexport function ChartEventEarningsPopoverContent({\n badgeType,\n rawData,\n theme,\n}: {\n badgeType: ChartEventBadgeType\n rawData: IEarnings\n theme: Theme\n}) {\n const isPremium = window.FinvizSettings.hasUserPremium\n const data = React.useMemo(() => {\n const dataArray: PopoverTableRowData[] = [\n [\n { value: 'Earnings Date' },\n {\n value: getFormattedEventDate(rawData.dateTimestamp, true),\n },\n ],\n [\n { value: 'Fiscal Period' },\n {\n value: getFormattedFiscalPeriod(rawData.fiscalPeriod),\n },\n ],\n [\n { value: 'Period Ending' },\n {\n value: getFormattedEventDate(rawData.fiscalEndDate, false, {\n month: 'short',\n day: undefined,\n }),\n },\n ],\n ]\n\n if (rawData.epsActual !== undefined || rawData.epsEstimate !== undefined) {\n dataArray.push([{ value: 'EPS', className: 'font-medium pt-4' }])\n }\n if (rawData.epsActual !== undefined) {\n dataArray.push([{ value: 'Reported' }, { value: getFormattedValue({ value: rawData.epsActual }) }])\n }\n if (rawData.epsEstimate !== undefined) {\n dataArray.push([{ value: 'Estimate' }, { value: getFormattedValue({ value: rawData.epsEstimate }) }])\n }\n if (rawData.epsActual !== undefined && rawData.epsEstimate !== undefined) {\n const epsSurprise = rawData.epsActual - rawData.epsEstimate\n const epsSurpriseColor = epsSurprise < 0 ? SURPRISE_NEGATIVE_COLOR : SURPRISE_POSITIVE_COLOR\n const percentageValue = getPercentValueString(epsSurprise, rawData.epsEstimate)\n\n dataArray.push([\n { value: 'Surprise', className: epsSurpriseColor },\n {\n value: `${getFormattedValue({ value: epsSurprise })} ${percentageValue}`,\n className: epsSurpriseColor,\n },\n ])\n }\n\n if (rawData.epsReportedActual !== undefined && rawData.epsActual !== rawData.epsReportedActual) {\n dataArray.push([{ value: 'EPS (GAAP)', className: 'font-medium pt-4' }])\n\n if (isPremium) {\n dataArray.push([{ value: 'Reported' }, { value: getFormattedValue({ value: rawData.epsReportedActual }) }])\n\n if (rawData.epsReportedEstimate !== undefined) {\n const epsReportedSurprise = rawData.epsReportedActual - rawData.epsReportedEstimate\n const epsReportedSurpriseColor = epsReportedSurprise < 0 ? SURPRISE_NEGATIVE_COLOR : SURPRISE_POSITIVE_COLOR\n const percentageValue = getPercentValueString(epsReportedSurprise, rawData.epsReportedEstimate)\n\n dataArray.push(\n [{ value: 'Estimate' }, { value: getFormattedValue({ value: rawData.epsReportedEstimate }) }],\n [\n { value: 'Surprise', className: epsReportedSurpriseColor },\n {\n value: `${getFormattedValue({ value: epsReportedSurprise })} ${percentageValue}`,\n className: epsReportedSurpriseColor,\n },\n ]\n )\n }\n } else {\n dataArray.push([\n {\n value: 'Finviz*Elite only',\n className: 'text-gray-500 dark:text-gray-300 hover:underline hover:text-gray-600 dark:hover:text-gray-200',\n colSpan: 2,\n href: `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: 'chart-event-earnings-gaap',\n })}`,\n },\n ])\n }\n }\n\n if (rawData.salesActual !== undefined || rawData.salesEstimate !== undefined) {\n dataArray.push([{ value: 'Revenue', className: 'font-medium pt-4' }])\n }\n if (rawData.salesActual !== undefined) {\n dataArray.push([\n { value: 'Reported' },\n { value: getFormattedValue({ value: rawData.salesActual, bigNumberUnit: BigNumber.Million }) },\n ])\n }\n if (rawData.salesEstimate !== undefined) {\n dataArray.push([\n { value: 'Estimate' },\n { value: getFormattedValue({ value: rawData.salesEstimate, bigNumberUnit: BigNumber.Million }) },\n ])\n }\n if (rawData.salesActual !== undefined && rawData.salesEstimate !== undefined) {\n const revenueSurprise = rawData.salesActual - rawData.salesEstimate\n const revenueSurpriseColor = revenueSurprise < 0 ? SURPRISE_NEGATIVE_COLOR : SURPRISE_POSITIVE_COLOR\n const percentageValue = getPercentValueString(revenueSurprise, rawData.salesEstimate)\n\n dataArray.push([\n { value: 'Surprise', className: revenueSurpriseColor },\n {\n value: `${getFormattedValue({\n value: revenueSurprise,\n bigNumberUnit: BigNumber.Million,\n })} ${percentageValue}`,\n className: revenueSurpriseColor,\n },\n ])\n }\n\n return dataArray\n }, [rawData, isPremium])\n\n return (\n <>\n
\n {getChartEventBadgeElement({\n theme: theme,\n state: ChartEventBadgeState.default,\n width: CHART_EVENT_BADGE_SIZE,\n badgeType,\n })}{' '}\n {ChartEventLabels[badgeType]}\n
\n \n \n {data.map((item, index) => (\n \n ))}\n \n
\n \n )\n}\n","import React from 'react'\n\nimport { Theme } from '../../../../types/shared'\nimport { Heading, Paragraph } from '../../../components'\nimport { ChartEventBadgeType, ChartEventLabels } from '../../../constants/common'\nimport { CHART_EVENT_BADGE_SIZE } from '../badges/chart-badge-svg-by-type'\nimport { getChartEventBadgeElement } from '../badges/get-chart-event-badge-element'\nimport { ChartEventBadgeState, ISplit, getFormattedEventDate } from '../utils'\n\nexport function ChartEventSplitPopoverContent({\n badgeType,\n rawData,\n theme,\n}: {\n badgeType: ChartEventBadgeType\n rawData: ISplit\n theme: Theme\n}) {\n return (\n <>\n
\n {getChartEventBadgeElement({\n theme: theme,\n state: ChartEventBadgeState.default,\n width: CHART_EVENT_BADGE_SIZE,\n badgeType,\n })}{' '}\n {`${ChartEventLabels[badgeType]}: ${rawData.factorFrom}/${rawData.factorTo}`}\n
\n \n \n \n \n \n \n
\n {getFormattedEventDate(rawData.dateTimestamp)}\n
\n \n )\n}\n","import classNames from 'classnames'\nimport React from 'react'\n\nimport { Theme } from '../../../../types/shared'\nimport { DialogBody, Popover, ZIndexContext } from '../../../components'\nimport { ChartEventBadgeType } from '../../../constants/common'\nimport { IDividends, IEarnings, ISplit } from '../utils'\nimport { ChartEventDividendsPopoverContent } from './dividends-popover-content'\nimport { ChartEventEarningsPopoverContent } from './earnings-popover-content'\nimport { ChartEventSplitPopoverContent } from './split-popover-content'\n\ninterface INoteDialog {\n id?: string\n popoverState: any\n badgeType: ChartEventBadgeType\n data: ISplit | IDividends | IEarnings\n theme: Theme\n}\n\nfunction getChartEventContentComponent(\n badgeType: ChartEventBadgeType,\n data: ISplit | IDividends | IEarnings,\n theme: Theme\n) {\n switch (badgeType) {\n case ChartEventBadgeType.Split:\n return \n case ChartEventBadgeType.Dividends:\n return \n case ChartEventBadgeType.EarningsPositive:\n case ChartEventBadgeType.EarningsNegative:\n case ChartEventBadgeType.EarningsFuture:\n case ChartEventBadgeType.EarningsNeutral:\n return \n default:\n return null\n }\n}\n\nexport function ChartEventPopover({ id, popoverState, badgeType, data, theme }: INoteDialog) {\n return (\n \n \n {getChartEventContentComponent(badgeType, data, theme)}\n \n \n )\n}\n","import React from 'react'\n\nimport { PopoverTrigger, getExtendedDialogState, usePopoverState } from '../../../components'\nimport { useModelState } from '../../../model-hooks/use-model-state'\nimport ChartModel from '../../../models/chart'\nimport { useClickAway } from '../../../utils/use-click-away'\nimport { ChartEventPopover } from './chart-event-popover'\n\ninterface ChartEventPopoverWithStateProps {\n chartModel: ChartModel\n}\n\nconst POPOVER_ID = 'badge-popover'\n\nexport function ChartEventPopoverWithState({ chartModel }: ChartEventPopoverWithStateProps) {\n const unwatchedChartLayout = React.useMemo(() => chartModel.chart_layout() ?? null, [chartModel])\n const { activeChartEvent, theme } = useModelState(unwatchedChartLayout, { watchProperties: ['activeChartEvent'] })\n const popoverState = usePopoverState({ placement: 'top' })\n const { isFullyClosed } = getExtendedDialogState(popoverState)\n const [style, setStyle] = React.useState({\n top: 0,\n left: 0,\n })\n const elementId = activeChartEvent?.elementId\n const isChartEventOfThisChart = activeChartEvent?.pane().chart().eql(chartModel)\n const [data, setData] = React.useState(null)\n const clickAwayRef = useClickAway(() => {\n const isAnyBadgeHovered = !!chartModel\n .getChartPane()\n ?.getAllChartEvents()\n .some((chartEvent) => chartEvent.instance.isHovered)\n\n if (!isAnyBadgeHovered && activeChartEvent && isChartEventOfThisChart) {\n activeChartEvent.instance.toggleIsOpen(false)\n }\n }, !!activeChartEvent && isChartEventOfThisChart)\n // This is intentional, it doesn't need to be in useEffect, it would just call effect function which is redundant\n clickAwayRef.current = popoverState.unstable_popoverRef.current\n const popoverShow = popoverState.show\n const popoverHide = popoverState.hide\n\n React.useEffect(() => {\n if (!activeChartEvent?.instance.isOpen || !isChartEventOfThisChart) {\n if (isFullyClosed) {\n return setData(null)\n }\n return popoverHide()\n }\n if (!isChartEventOfThisChart) return\n const { top, left } = activeChartEvent.instance\n const newData = activeChartEvent.getChartEventData()\n if (newData?.elementId !== data?.elementId) {\n setData({\n ...newData,\n badgeType: activeChartEvent.instance.getChartEvenBadgeType(),\n })\n }\n\n if (style.top !== top || style.left !== left) {\n popoverHide()\n setStyle({\n top,\n left,\n })\n }\n if (!popoverState.visible) {\n popoverShow()\n }\n }, [\n elementId,\n isFullyClosed,\n data,\n style,\n popoverShow,\n popoverHide,\n popoverState.visible,\n activeChartEvent,\n chartModel,\n isChartEventOfThisChart,\n ])\n\n return (\n <>\n \n {data && (\n \n )}\n \n )\n}\n","import React from 'react'\n\nimport Utils from '../utils'\n\nexport function useClickAway(callback: (event: MouseEvent | TouchEvent) => void, isListening = true) {\n const ref = React.useRef(null)\n const refCallback = React.useRef(callback)\n\n React.useLayoutEffect(() => {\n refCallback.current = callback\n })\n\n React.useEffect(() => {\n if (!isListening) {\n return\n }\n const isMobile = Utils.isMobile()\n const handler = (e: MouseEvent | TouchEvent) => {\n const element = ref.current\n if (element && e.target && !element.contains(e.target as HTMLElement)) {\n refCallback.current(e)\n }\n }\n\n document.addEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\n\n return () => {\n document.removeEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\n }\n }, [callback, isListening])\n\n return ref\n}\n","export const CHART_LAYOUT_CHILD_CHANGE_EVENT = 'chartLayoutChildChange'\n","import Spine from '@finviz/spine'\n\nimport { TodoObjectHashAnyType } from '../../types/shared'\n\ntype TodoContextConfig = TodoObjectHashAnyType\n\nclass ContextMenu extends Spine.Model {\n static initClass() {\n this.configure('ContextMenu', 'shown', 'config', 'top', 'left')\n }\n\n declare shown: boolean\n declare config: TodoContextConfig\n declare top: number\n declare left: number\n}\n\nContextMenu.initClass()\n\nconst contextMenu = ContextMenu.create() as ContextMenu\ncontextMenu.save()\n\nexport default contextMenu\n","import React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport { ObjectHash } from '../../types/shared'\nimport { ContextMenu as ContextMenuComponent } from '../components'\nimport model from '../models/context_menu'\nimport { ready } from '../utils'\n\nconst selector = '.context-menu'\n\nclass ContextMenu extends React.Component {\n componentDidMount() {\n model.bind('update', this.update)\n }\n\n componentWillUnmount() {\n model.unbind('update', this.update)\n }\n\n update = () => {\n this.forceUpdate()\n }\n\n render() {\n if (model.shown) {\n document.querySelector(selector)?.classList.remove('hidden')\n } else {\n document.querySelector(selector)?.classList.add('hidden')\n return null\n }\n\n return (\n <>\n this.hide()}\n onContextMenu={(e) => e.preventDefault()}\n data-testid=\"charts-context-menu-overlay\"\n >\n \n \n )\n }\n\n hide() {\n model.updateAttribute('shown', false)\n }\n}\nready(() => {\n const el = document.querySelector(selector)\n if (el) {\n ReactDOM.render(, el)\n }\n})\n\nconst contextMenuControl = {\n show: (event: MouseEvent | React.MouseEvent, config: ObjectHash) => {\n model.updateAttributes({\n shown: true,\n config: config,\n top: event.clientY + window.pageYOffset,\n left: event.clientX,\n })\n },\n}\n\nexport default contextMenuControl\n","import React from 'react'\n\nimport { Button, ButtonGroup, Delayed, Icon, Spinner } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Chart from '../../models/chart'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport { useIsMounted } from '../../utils/use-is-mounted'\n\ninterface LoadLatestDataButtonProps {\n chartModel: Chart\n}\n\nexport function LoadLatestDataButton({ chartModel: chartModelUnwatched }: LoadLatestDataButtonProps) {\n const getIsMounted = useIsMounted()\n const chartModel = useModelState(chartModelUnwatched, { watchProperties: ['quote'] })\n const quoteModel = useModelState(chartModel.quote(), { watchProperties: ['isFetching'] })\n const [hasNewDataAvailable, setHasNewDataAvailable] = React.useState(false)\n\n React.useEffect(() => {\n if (!chartModel.getRefreshInterval()) {\n // We will do a check here if we have correct new data\n chartModel\n .quote()\n .isPossibleToFetchSequentialData()\n .then((hasNewData) => {\n if (getIsMounted()) {\n setHasNewDataAvailable(hasNewData)\n }\n })\n }\n // We need to run it only on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const handleLoadLatestData = async () => {\n const promises = chartModel\n .getAllQuotes()\n .map(async (quote) => quote.fetchData({ fetchType: QuoteFetchType.NewerData }))\n chartModel.updateAttributes({ refreshData: true })\n await Promise.all(promises)\n if (getIsMounted()) {\n setHasNewDataAvailable(false)\n window.gtag?.('event', 'load-latest-data', { event_category: 'ideas' })\n }\n }\n\n if (!hasNewDataAvailable) {\n return null\n }\n\n return (\n \n }>\n \n \n ) : (\n 'refresh'\n )\n }\n disabled={quoteModel?.isFetching}\n title=\"Load latest data\"\n onClick={handleLoadLatestData}\n data-testid=\"load-latest-data-button\"\n >\n Load latest data\n \n \n )\n}\n","import classnames from 'classnames'\nimport debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport { Button, ButtonGroup, Icon } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Chart from '../../models/chart'\nimport Utils from '../../utils'\nimport { getLeftOffset } from '../renderUtils'\nimport { LoadLatestDataButton } from './load-latest-data-button'\n\nexport const ZOOM_CONTROLS_ACTIVE_CLASS = 'is-active'\nexport const ZOOM_CONTROLS_IS_IN_AREA_CLASS = 'is-in-area'\n\nconst buttonCommonProps = {\n size: 'none',\n className: 'w-7 h-6',\n contentClass: 'flex justify-center',\n}\n\nconst isMobile = Utils.isMobile()\n\ninterface ZoomControlsProps {\n zoomControlsRef: React.RefObject\n isVisible: boolean\n chartModel: Chart\n onZoomIn: () => void\n onZoomOut: () => void\n onZoomReset: () => void\n}\n\nconst getDefaultLeftOffset = (chartModel: Chart) =>\n getLeftOffset({\n quote: chartModel.quote(),\n chartModel,\n config: {},\n })\n\nexport function ZoomControls({\n zoomControlsRef,\n chartModel,\n isVisible,\n onZoomIn,\n onZoomOut,\n onZoomReset,\n}: ZoomControlsProps) {\n const chartLayoutModel = useModelState(chartModel.chart_layout(), { watchProperties: ['idea'] })\n const [isGoToRecentVisible, setIsGoToRecentVisible] = React.useState(false)\n const { defaultZoomFactor } = chartLayoutModel\n const [isZoomResetVisible, setIsZoomResetVisible] = React.useState(chartModel.zoomFactor !== defaultZoomFactor)\n const handleGoToMostRecent = React.useCallback(() => {\n chartModel.updateAttributes({ leftOffset: getDefaultLeftOffset(chartModel), dateRange: null })\n }, [chartModel])\n\n React.useEffect(() => {\n const handleChartModelChangeDebounced = debounce(\n () => {\n setIsZoomResetVisible(chartModel.zoomFactor !== defaultZoomFactor)\n setIsGoToRecentVisible(chartModel.leftOffset !== getDefaultLeftOffset(chartModel))\n },\n 100,\n { maxWait: 333 }\n )\n chartModel.bind('change', handleChartModelChangeDebounced)\n return () => {\n handleChartModelChangeDebounced.cancel()\n chartModel.unbind('change', handleChartModelChangeDebounced)\n }\n }, [defaultZoomFactor, chartModel])\n\n return (\n \n {!isMobile && (\n
\n {isZoomResetVisible && (\n
\n \n \n \n \n \n
\n )}\n \n \n \n \n\n \n \n
\n )}\n\n
\n {!!chartLayoutModel.idea?.id && }\n\n {isGoToRecentVisible && (\n \n \n \n \n \n )}\n
\n \n )\n}\n","import Spine from '@finviz/spine'\nimport classnames from 'classnames'\nimport Hammer from 'hammerjs'\nimport debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport { CustomSpineEvents, DrawingSpineOptionsEvent, EmptyObject, ObjectHash, PaneArea } from '../../../types/shared'\nimport CanvasElement from '../../canvas/element'\nimport ChartEvent from '../../chart-events/chart-event'\nimport { Button, Notification, Paragraph, withNotificationContext } from '../../components'\nimport { IndicatorType, ScaleType, SetVisibilityTo, SpecificChartFunctionality } from '../../constants/common'\nimport IndicatorElement from '../../indicators/indicator'\nimport { getContextWithCache } from '../../lib/shims'\nimport { withElementStyleDialogState } from '../../modals/element_style'\nimport ChartModel from '../../models/chart'\nimport ChartEventElement from '../../models/chart-event-element'\nimport ElementModel from '../../models/element'\nimport MouseModel from '../../models/mouse'\nimport PaneModel from '../../models/pane'\nimport Quote from '../../models/quote'\nimport { handleRemoveIndicatorPane } from '../../models/utils'\nimport Utils, { isRedesignedPage } from '../../utils'\nimport { getBarWidthWithMargin, unmountCanvas } from '../../utils/chart'\nimport { setElementCursor } from '../../utils/cursor'\nimport { getValueInRange, isPrimaryClick } from '../../utils/helpers'\nimport { getInitialStoreDrawings } from '../autosave/utils'\nimport { ChartEventPopoverWithState } from '../chart-events/chart-event-popover/chart-event-popover-with-state'\nimport { CHART_LAYOUT_CHILD_CHANGE_EVENT } from '../chart_layout/constants'\nimport ContextMenu from '../context_menu'\nimport { getMinMaxLeftOffset, getSettings, recountScale, renderPane } from '../renderUtils'\nimport { DrawingTool } from '../toolbar/interfaces'\nimport { getChartAlt } from '../utils'\nimport { withPaneModel } from './with-pane-model'\nimport { ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS, ZoomControls } from './zoom_controls'\n\n// Indicates how many time lower/higher can new scale be compared to original one\nconst ALLOWED_MIN_MAX_ZOOM = 10000\n\ninterface PaneProps {\n model: PaneModel\n chartModel: ChartModel\n activeTool: DrawingTool\n activeChartInteraction: string | null\n chartIndex: number\n paneIndex: number\n touchEventsDisabled: boolean\n onPaneClick: (model: PaneModel) => void\n onZoomerReset: () => void\n onZoomerMouseDown: React.MouseEventHandler\n onZoomerTouchStart: React.TouchEventHandler\n onAddToZoomFactor: (data: { diff: number; shouldCalculateRightAlign: boolean }) => void\n onResizerMouseDown: (e: React.MouseEvent, model: PaneModel) => void\n onPaneDestroy: (paneId: string) => void\n setActiveChartInteraction: (value: string | null) => void\n openElementStyleDialog?: (element: CanvasElement | IndicatorElement) => void\n notificationContext: { show: (element: JSX.Element, options: { inline?: boolean }) => void; hide: () => void }\n}\n\ninterface PaneState {\n hasSeenCrossNotification: boolean\n}\n\nclass Pane extends React.Component {\n rafId?: number | null = null\n crossRafId?: number | null = null\n quoteModel: Quote\n paneRef = React.createRef()\n scalerRef = React.createRef()\n zoomerRef = React.createRef()\n zoomControlsRef = React.createRef()\n canvasWrapperRef = React.createRef()\n canvasRef = React.createRef()\n crossCanvasRef = React.createRef()\n chartLayoutModel = this.props.chartModel.chart_layout()\n paneHammer!: HammerManager\n scalerHammer!: HammerManager\n zoomerHammer!: HammerManager\n canvasWrapperHammer!: HammerManager\n mouseDown = false\n lastClientX?: number\n lastClientY?: number\n currentViewRange: { min: number; max: number } | null = null\n lastX!: number\n lastY!: number\n lastActiveTool: DrawingTool\n scalerLastY: number | null = null\n isElementHovered = false\n hoveredElement: CanvasElement | null = null\n isMobile: boolean\n isDisableTouchCrossAvailable = true\n\n canvas: HTMLCanvasElement | null = null\n canvasCtx: CanvasRenderingContext2D | null = null\n crossCanvas: HTMLCanvasElement | null = null\n crossCanvasCtx: CanvasRenderingContext2D | null = null\n isIndicatorPane = false\n\n state: PaneState = {\n hasSeenCrossNotification: !!window.localStorage.getItem('hasSeenCrossNotification'),\n }\n\n // expects chartModel, model, onResizerMouseDown, onPaneDestroy\n constructor(props: PaneProps) {\n super(props)\n\n this.quoteModel = this.props.chartModel.quote()\n props.model.updateAttribute('instance', this)\n props.model.bind('update', this.onModelUpdate)\n props.model\n .elements()\n .bind('create', this.onElementCreate)\n .bind('destroy', this.onElementDestroy)\n .bind('replace', this.onElementReplace)\n .bind('select', this.onElementSelect)\n .bind('makeClone', this.onElementClone)\n .bind('change', this.immediateRecountScaleOnChartIndicatorChange)\n .bind('change', debounce(this.recountScale, 50))\n props.model.bind(CustomSpineEvents.ManualChange, this.recountScale)\n\n props.model.chartEvents().bind('create', this.onElementCreate).bind('change', debounce(this.recountScale, 50))\n\n this.props.chartModel.bind('update', this.onChartUpdate)\n this.props.chartModel.bind(`change ${CustomSpineEvents.IndicatorsChange}`, this.recountScale)\n this.quoteModel.bind('change', this.recountScale)\n this.isMobile = !!Utils.isMobile()\n this.lastActiveTool = props.activeTool\n if (!MouseModel.pane()) {\n MouseModel.updateAttribute('pane', props.model)\n }\n this.isIndicatorPane = props.model.getIsIndicatorPane()\n this.recountScale()\n }\n\n componentDidMount() {\n const { model } = this.props\n this.chartLayoutModel.bind('theme', this.renderAll)\n this.chartLayoutModel.bind('theme', this.renderCross)\n\n const initialStoreDrawings = getInitialStoreDrawings() ?? []\n const elements = [...model.getAllElements(), ...model.getAllChartEvents(false)]\n elements.forEach((element) => {\n this.onElementCreate(element)\n if (element.isDrawing()) {\n const hasDrawingInInitialCache = initialStoreDrawings.some(({ elementId }) => element.elementId === elementId)\n if (hasDrawingInInitialCache) {\n element.instance?.updateScales()\n }\n element.instance.cachePointPositionTimestamp()\n } else if (element.isChartEvent()) {\n element.instance?.updateScales()\n }\n })\n\n model?.updateChartEventsZIndexes()\n\n this.canvas = this.canvasRef.current\n this.canvasCtx = getContextWithCache(this.canvasRef.current)\n this.crossCanvas = this.crossCanvasRef.current\n this.crossCanvasCtx = getContextWithCache(this.crossCanvasRef.current)\n\n this.paneHammer = new Hammer.Manager(this.paneRef.current!, { touchAction: 'none' })\n this.paneHammer.add(new Hammer.Press({ threshold: 5, time: 500 })) // chrome simulator \"long touch\" -> \"oncontextmenu\" is 680ms +- 2ms\n this.paneHammer.on('press', this.onPress)\n this.canvasWrapperHammer = new Hammer(this.canvasWrapperRef.current!, { touchAction: 'none' })\n this.canvasWrapperHammer.on('tap', this.onClick)\n this.canvasWrapperRef.current?.addEventListener('touchmove', this.onTouchMove, { passive: false })\n\n if (this.chartLayoutModel.scrollable || !this.isMobile) {\n if (this.scalerRef.current) {\n this.scalerHammer = new Hammer(this.scalerRef.current, { touchAction: 'none' })\n this.scalerHammer.on('doubletap', this.onScalerReset)\n }\n if (this.zoomerRef.current) {\n this.zoomerHammer = new Hammer(this.zoomerRef.current, { touchAction: 'none' })\n this.zoomerHammer.on('doubletap', this.props.onZoomerReset)\n }\n this.canvasWrapperHammer.on('doubletap', this.onDoubleClick)\n }\n\n this.onChartUpdate({ width: this.props.chartModel.width })\n this.onModelUpdate({ height: model.height })\n this.forceUpdate()\n this.chartLayoutModel.trigger(CHART_LAYOUT_CHILD_CHANGE_EVENT)\n }\n\n componentWillUnmount() {\n this.canvasWrapperRef.current?.removeEventListener('touchmove', this.onTouchMove)\n unmountCanvas(this.canvas)\n unmountCanvas(this.crossCanvas)\n this.props.chartModel.unbind('update', this.onChartUpdate)\n this.props.chartModel.unbind('change', this.recountScale)\n this.quoteModel.unbind('change', this.recountScale)\n }\n\n render() {\n const { activeTool, touchEventsDisabled, onPaneClick, paneIndex, chartIndex, model, chartModel } = this.props\n if (touchEventsDisabled) {\n this.paneHammer?.set({ touchAction: 'auto' })\n this.scalerHammer?.set({ touchAction: 'auto' })\n this.zoomerHammer?.set({ touchAction: 'auto' })\n this.canvasWrapperHammer?.set({ touchAction: 'auto' })\n } else {\n const touchAction = this.getIsHammerAllowScrollActive() ? 'auto' : 'none'\n this.scalerHammer?.set({ touchAction: 'none' })\n this.zoomerHammer?.set({ touchAction: 'none' })\n this.paneHammer?.set({ touchAction })\n this.canvasWrapperHammer?.set({ touchAction })\n }\n\n const isChartPane = model.getIsChartPane()\n\n return (\n onPaneClick(model)}\n onTouchStart={() => onPaneClick(model)}\n onContextMenu={this.onContextMenu}\n data-testid={`chart-${chartIndex}-pane-${paneIndex}`}\n >\n {isChartPane && }\n {paneIndex !== 0 && (\n this.props.onResizerMouseDown(e, model)}\n data-testid={`chart-${chartIndex}-pane-${paneIndex}-resizer`}\n />\n )}\n {this.chartLayoutModel.initialScrollable && (\n \n )}\n\n {this.chartLayoutModel.initialScrollable && isChartPane && (\n <>\n \n {\n this.props.onAddToZoomFactor({ diff: 0.1, shouldCalculateRightAlign: true })\n }}\n onZoomOut={() => {\n this.props.onAddToZoomFactor({ diff: -0.1, shouldCalculateRightAlign: true })\n }}\n onZoomReset={this.props.onZoomerReset}\n />\n \n )}\n \n {getChartAlt(this.quoteModel)}\n {this.chartLayoutModel.cross && }\n \n \n )\n }\n\n getIsHammerAllowScrollActive = () =>\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage &&\n !this.chartLayoutModel.isTouchCrossActive &&\n !this.chartLayoutModel.scrollable\n\n onElementCreate = (el: ElementModel | ChartEventElement) => {\n el.instance.bind('change', this.renderAll)\n this.renderAll()\n }\n\n onElementReplace = (el: ElementModel, oldElementInstance: CanvasElement) => {\n oldElementInstance.unbind('change', this.renderAll)\n el.instance.bind('change', this.renderAll)\n if (oldElementInstance === this.props.model.selection && !this.chartLayoutModel.isDrawingModeContinuousActive) {\n this.setSelection(el.instance)\n } else {\n this.setSelection(null)\n }\n this.renderAll()\n }\n\n onElementDestroy = (el: ElementModel) => {\n const { type } = el.instance\n el.instance.unbind('change', this.renderAll)\n if (el.instance === this.props.model.selection) {\n this.setSelection(null)\n }\n if (type.startsWith('charts/') || type.startsWith('indicators/')) {\n this.props.onPaneDestroy(el['pane_id'])\n }\n this.renderAll()\n }\n\n onElementSelect = (el: ElementModel) => {\n this.setSelectedElement(el.instance)\n }\n\n onElementClone = (_: unknown, clonedElementInstance: CanvasElement) => {\n this.setSelectedElement(clonedElementInstance)\n }\n\n onModelUpdate = ({ height }: { height: number }) => {\n this.setCanvasSize({\n width: this.props.chartModel.width,\n height,\n })\n }\n\n onChartUpdate = ({ width }: { width: number }) => {\n const { model, chartModel } = this.props\n this.setCanvasSize({\n width,\n height: model.height,\n })\n const quote = chartModel.quote()\n if (!this.quoteModel.eql(quote)) {\n this.quoteModel.unbind('change', this.recountScale)\n if (quote) {\n this.quoteModel = quote\n this.quoteModel.bind('change', this.recountScale)\n }\n }\n }\n\n onZoomerMouseMove: React.MouseEventHandler = (e) => {\n if (!this.chartLayoutModel.scrollable || (this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) return\n const area = this.getArea(e)\n MouseModel.updateAttributes({\n position: { x: area.x, y: null },\n pane: this.props.model,\n })\n }\n\n onMouseMoveOnScrolling = (event: TouchEvent | MouseEvent) => {\n if (this.props.activeChartInteraction) {\n return\n }\n\n let { clientX, clientY } = event as MouseEvent\n const { model } = this.props\n\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\n if (isTouch && event.targetTouches?.length > 0) {\n clientX = event.targetTouches[0].clientX\n clientY = event.targetTouches[0].clientY\n }\n if (!model.selection && !this.chartLayoutModel.activeChartEvent) {\n if (this.lastClientX != null) {\n const dif = this.lastClientX - clientX\n this.addToLeftOffset(-dif)\n }\n if (model.scaleRange && this.lastClientY != null) {\n let { min, max } = model.scaleRange\n let difY\n switch (this.props.chartModel.scale) {\n case ScaleType.Logarithmic: {\n difY = this.lastClientY - clientY\n min = model.scale.y.invert(model.scale.y(min) + difY)\n max = model.scale.y.invert(model.scale.y(max) + difY)\n break\n }\n default: {\n difY = (this.lastClientY - clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\n min -= difY\n max -= difY\n break\n }\n }\n\n model.updateAttribute('scaleRange', { min, max })\n this.recountScale()\n this.currentViewRange = this.props.model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\n }\n }\n this.lastClientX = clientX\n this.lastClientY = clientY\n }\n\n onScalerTouchStart: React.TouchEventHandler = (e) => {\n if (!this.chartLayoutModel.scrollable || this.props.touchEventsDisabled) return\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\n this.onScalerMouseDown(e.targetTouches[0])\n }\n }\n\n onScalerTouchMove = (e: TouchEvent) => {\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\n this.onScalerMouseMove(e.targetTouches[0])\n }\n }\n\n onScalerTouchEnd = () => {\n if (this.chartLayoutModel.scrollable) {\n this.onScalerMouseUp()\n }\n }\n\n onScalerMouseEnter = () => {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n }\n\n onScalerMouseDown = (event: React.MouseEvent | React.Touch) => {\n const { activeChartInteraction, setActiveChartInteraction, model } = this.props\n if ((event instanceof MouseEvent && event.button) || activeChartInteraction || !this.chartLayoutModel.scrollable) {\n return\n }\n setActiveChartInteraction('scaler')\n\n this.scalerLastY = event.clientY\n // here we need current domain scale or former \"nice\" value\n const [currentDomainMax, currentDomainMin] = model.scale.y.domain()\n this.currentViewRange = { min: currentDomainMin, max: currentDomainMax }\n document.addEventListener<'mousemove'>('mousemove', this.onScalerMouseMove)\n document.addEventListener('mouseup', this.onScalerMouseUp)\n document.addEventListener('touchmove', this.onScalerTouchMove)\n document.addEventListener('touchend', this.onScalerTouchEnd)\n }\n\n onScalerMouseMove = (event: MouseEvent | Touch) => {\n const { model, chartModel } = this.props\n if (model.scaleRange === null && this.currentViewRange === null) {\n return\n }\n let { min, max } = model.scaleRange || this.currentViewRange!\n let difY\n switch (this.props.chartModel.scale) {\n case ScaleType.Logarithmic: {\n difY = this.scalerLastY! - event.clientY\n min = model.scale.y.invert(model.scale.y(min) - difY)\n max = model.scale.y.invert(model.scale.y(max) + difY)\n break\n }\n default: {\n difY = -(this.scalerLastY! - event.clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\n min -= difY\n max += difY\n break\n }\n }\n this.scalerLastY = event.clientY\n\n const originalMinMax = model.getChartOrIndicatorElement()?.instance?.getMinMax?.()\n if (originalMinMax) {\n const currentDiff = Math.abs(max - min)\n const originalDiff = Math.abs(originalMinMax.max - originalMinMax.min)\n\n if (currentDiff > originalDiff * ALLOWED_MIN_MAX_ZOOM || currentDiff < originalDiff / ALLOWED_MIN_MAX_ZOOM) {\n return\n }\n }\n\n model.updateAttribute('scaleRange', { min, max })\n chartModel.updateAttribute('dateRange', null)\n this.recountScale()\n }\n\n onScalerMouseUp = () => {\n this.scalerLastY = null\n\n document.removeEventListener('mousemove', this.onScalerMouseMove)\n document.removeEventListener('mouseup', this.onScalerMouseUp)\n document.removeEventListener('touchmove', this.onScalerTouchMove)\n document.removeEventListener('touchend', this.onScalerTouchEnd)\n this.props.setActiveChartInteraction(null)\n }\n\n onScalerReset = () => {\n const { model, chartModel } = this.props\n if (!this.chartLayoutModel.scrollable) return\n chartModel.updateAttribute('dateRange', null)\n model.updateAttribute('scaleRange', null)\n this.recountScale()\n }\n\n addToLeftOffset = (n: number) => {\n const quote = this.props.chartModel.quote()\n const barWidth = getBarWidthWithMargin({\n chartLayout: this.chartLayoutModel,\n zoomFactor: this.props.chartModel.zoomFactor,\n })\n const leftOffset = getMinMaxLeftOffset({\n newLeftOffset: this.props.chartModel.leftOffset + n,\n chartModel: this.props.chartModel,\n barWidth,\n barIndex: quote.barIndex[quote.open.length - 1],\n })\n\n if (leftOffset > barWidth) {\n quote.fetchOlderData()\n }\n this.props.chartModel.updateAttributes({\n leftOffset,\n dateRange: null,\n })\n }\n\n onDoubleClick = (event: HammerInput) => {\n event.preventDefault()\n const area = this.getArea(event)\n const element = this.props.model.selection || this.getElement(area)\n if (element && element.type !== IndicatorType.Cot) {\n setTimeout(() => {\n this.props.openElementStyleDialog!(element)\n }, 0)\n element.trigger('dblclick', event)\n }\n }\n\n onPress = (e: ObjectHash) => {\n if (e.pointerType !== 'touch') return\n\n e.clientX = e.center.x\n e.clientY = e.center.y\n\n const el = this.props.model.selection || this.getElement(this.getArea(e))\n if (!this.chartLayoutModel.isTouchCrossActive) {\n if (!el) {\n this.onCanvasPress(e as React.MouseEvent)\n } else {\n this.onContextMenu(e as React.MouseEvent, el)\n }\n }\n }\n\n onContextMenu = (e: React.MouseEvent, element?: IndicatorElement | CanvasElement) => {\n e.preventDefault()\n const area = this.getArea(e)\n const elementInArea = this.getElement(area)\n const el = element ?? elementInArea\n if (!el || el.thumbsAreInArea(area)) {\n return\n }\n const elementModel = ElementModel.findByAttribute('instance', el)\n if (!elementModel) return\n this.setSelectedElement(el)\n const hasProperties =\n ['indicator', 'canvas'].some((type) => el.type.startsWith(type)) && el.type !== IndicatorType.Cot\n const isElementDrawing = elementModel.isDrawing()\n\n return ContextMenu.show(\n e,\n [\n hasProperties && {\n id: 'edit',\n label: 'Edit style',\n onClick: () => this.props.openElementStyleDialog!(el),\n },\n\n !(elementModel.isChart() || elementModel?.isIndicator()) && {\n id: 'clone',\n label: 'Clone',\n onClick: () => elementModel.makeClone(),\n },\n\n ...(isElementDrawing\n ? [\n { type: 'divider', label: 'Visibility' },\n\n {\n id: 'visibility-current-and-above',\n label: 'Current interval and above',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndAbove),\n },\n\n {\n id: 'visibility-current-and-below',\n label: 'Current interval and below',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndBelow),\n },\n\n {\n id: 'visibility-current-only',\n label: 'Current interval only',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentOnly),\n },\n\n {\n id: 'visibility-all-intervals',\n label: 'All intervals',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.all),\n },\n ]\n : []),\n\n (isElementDrawing || hasProperties) && { type: 'divider' },\n\n {\n id: 'bring-to-front',\n label: 'Bring to Front',\n onClick: () => elementModel.bringToFront(),\n },\n {\n id: 'send-to-back',\n label: 'Send to Back',\n onClick: () => elementModel.sendToBack(),\n },\n {\n id: 'bring-forward',\n label: 'Bring Forward',\n onClick: () => elementModel.bringForward(),\n },\n {\n id: 'send-backward',\n label: 'Send Backward',\n onClick: () => elementModel.sendBackward(),\n },\n\n { type: 'divider' },\n\n {\n id: 'remove',\n label: 'Remove',\n onClick: () => {\n if (elementModel.isIndicator()) {\n handleRemoveIndicatorPane({ paneIndex: this.props.paneIndex, chartLayoutModel: this.chartLayoutModel })\n } else {\n elementModel.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\n this.props.model.normalizeZIndexes()\n }\n },\n },\n ]\n .filter(Boolean)\n .map((item) => ({ ...item, gtag: { element_type: el.type } }))\n )\n }\n\n immediateRecountScaleOnChartIndicatorChange = (element?: ElementModel) => {\n if (element?.isChart() || element?.isIndicator()) {\n this.recountScale()\n }\n }\n\n recountScale = (_?: unknown, updateType?: Spine.Event) => {\n const { model } = this.props\n const chartModel = model.chart()\n if (updateType === 'destroy' || !chartModel || !chartModel.quote()) {\n return\n }\n\n recountScale({ chartModel, paneModel: model })\n\n if (this.canvasCtx) {\n this.renderAll()\n }\n }\n\n onBlur = () => {\n if (this.props.model.selection?.getIsCreator?.()) {\n this.setSelection(null)\n } else {\n this.setSelectedElement(null)\n }\n if (this.hoveredElement) {\n this.hoveredElement.setIsHovered(false)\n this.hoveredElement = null\n }\n this.props.model.getAllElements().forEach((element) => {\n if (element.instance.getIsCreator?.() && !element.instance.getIsCreatorDialogOpen?.()) {\n element.destroyCascade()\n }\n })\n }\n\n renderAll = (type?: string) => {\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = true\n if (type === 'cross' && this.chartLayoutModel.cross) {\n if (this.crossRafId === null) {\n this.crossRafId = window.requestAnimationFrame(() => {\n this.renderCross()\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = Date.now()\n })\n }\n } else if (this.rafId == null && this.canvasCtx) {\n this.rafId = window.requestAnimationFrame(() => {\n this._renderAll()\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = Date.now()\n })\n }\n }\n\n _renderAll = () => {\n const { model } = this.props\n // _renderAll may be called after Chart was deleted because of requestAnimationFrame\n if (model.chart() === null || this.canvasRef.current === null || !this.canvasCtx) {\n return\n }\n if (this.getIsUpdatedDesign()) {\n if (this.crossRafId === null) {\n this.crossRafId = window.requestAnimationFrame(this.renderCross)\n }\n }\n this.rafId = undefined\n\n renderPane({\n chartLayoutModel: this.chartLayoutModel,\n chartModel: this.props.chartModel,\n paneModel: model,\n canvasCtx: this.canvasCtx,\n })\n }\n\n getIsUpdatedDesign() {\n const { specificChartFunctionality } = this.chartLayoutModel\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isRedesignedFuturesForexCrypto = isRedesignedPage({ specificChartFunctionality })\n\n return isCharts || isRedesignedFuturesForexCrypto\n }\n\n renderCross = () => {\n const { model } = this.props\n const isMouseInPane = MouseModel.getShouldRenderCrossInPane(model)\n this.crossRafId = null\n if (!this.crossCanvasCtx) {\n return\n }\n this.crossCanvasCtx.clearRect(0, 0, this.props.chartModel.width, model.height)\n const isCrossDisabled =\n PaneModel.select((p) => !!p.selection && !p.selection.type.startsWith('indicators/')).length !== 0 ||\n this.props.chartModel.getIsDisabled() ||\n !isMouseInPane\n\n for (const { instance: elementInstance } of model.getAllElements()) {\n if (\n (!isCrossDisabled && elementInstance.renderCross != null) ||\n (isCrossDisabled && elementInstance.renderCrossText != null)\n ) {\n this.crossCanvasCtx.save()\n if (isCrossDisabled) {\n elementInstance.renderCrossText!(this.crossCanvasCtx, Number.NaN)\n } else {\n elementInstance.renderCross!(this.crossCanvasCtx)\n }\n this.crossCanvasCtx.restore()\n }\n }\n }\n\n getArea = (e: ObjectHash, additionalData?: T): PaneArea => {\n const { model } = this.props\n const clientX = e.clientX || additionalData?.clientX\n const clientY = e.clientY || additionalData?.clientY\n const Settings = getSettings(model)\n const areaRectangle = this.canvas!.getBoundingClientRect()\n const areaRectangleCursorX = clientX - areaRectangle.left\n const areaRectangleCursorY = clientY - areaRectangle.top\n const x = areaRectangleCursorX - model.chart().leftOffset - Settings.left.width\n const y = areaRectangleCursorY - Settings.top.height\n const scale = model.scale\n const chartLeftX = areaRectangle.left + Settings.left.width\n const chartRightX = areaRectangle.right - Settings.right.width\n return {\n ...(additionalData as T),\n // TODO: rewrite if canvas uses padding/border\n x: scale.x.invert(x),\n y: scale.y.invert(y),\n scaled: {\n x,\n y,\n },\n width: 1,\n height: 1,\n cursorX: areaRectangleCursorX,\n cursorY: areaRectangleCursorY,\n isCursorInChartWidthBoundaries: clientX > chartLeftX && clientX < chartRightX,\n }\n }\n\n setCanvasSize = ({ width, height }: { width: number; height: number }) => {\n const ratio = Utils.getScaleRatio()\n const canvasElement = this.canvasRef.current\n\n /**\n * It seems that value passed into element attr (e.g. height) is ceiled down,\n * so if you provide canvas element with height 100.5 we'll get integer 100 from canvasElement.height\n * If the difference in values between \"new height\" and canvasElement.height is less than 1, I treat it as the same value\n */\n if (\n this.canvasCtx &&\n canvasElement &&\n (Math.abs(height * ratio - canvasElement.height) >= 1 || Math.abs(width * ratio - canvasElement.width) >= 1)\n ) {\n Utils.setSizeOnCanvasElement({ canvasElement, width, height })\n this.canvasCtx.scale(ratio, ratio)\n if (this.chartLayoutModel.cross && this.crossCanvasCtx) {\n Utils.setSizeOnCanvasElement({\n canvasElement: this.crossCanvasRef.current,\n width,\n height,\n })\n this.crossCanvasCtx.scale(ratio, ratio)\n }\n setTimeout(() => {\n this.recountScale()\n })\n }\n }\n\n onClick = (event: HammerInput) => {\n const area = this.getArea(event, {\n clientX: event.center.x,\n clientY: event.center.y,\n })\n const element = this.props.model.selection || this.getElement(area)\n element?.trigger('click', area)\n\n if (!this.isDisableTouchCrossAvailable) {\n this.isDisableTouchCrossAvailable = true\n return\n }\n\n if (this.chartLayoutModel.isTouchCrossActive) {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n this.chartLayoutModel.updateAttributes({\n scrollable: this.chartLayoutModel.initialScrollable,\n isTouchCrossActive: false,\n })\n } else if (\n this.isMobile &&\n !this.state.hasSeenCrossNotification &&\n this.lastActiveTool === DrawingTool.Mouse &&\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.smallIndex\n ) {\n const isChartsPage = this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\n\n this.setState({ hasSeenCrossNotification: true })\n this.props.notificationContext.show(\n {\n this.props.notificationContext.hide()\n window.localStorage.setItem('hasSeenCrossNotification', 'true')\n }}\n >\n Got it\n \n }\n >\n Long press the chart to show the crosshair.\n ,\n { inline: !isChartsPage }\n )\n }\n\n this.lastActiveTool = this.props.activeTool\n }\n\n onPaneMouseLeave = () => {\n // timout in onPaneMouseMove may cause racecondition where active class is added right after it's been removed\n setTimeout(() => {\n this.zoomControlsRef.current?.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS)\n })\n if (this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n this.renderCross()\n }\n }\n\n onPaneMouseMove = (e: React.MouseEvent | React.Touch, isMouseDownIgnored = false) => {\n const { model, chartModel } = this.props\n const zoomControls = this.zoomControlsRef.current\n const paneHeight = model.height\n if (zoomControls) {\n const area = this.getArea<{ mouseDown: boolean; clientX: number; clientY: number }>(e, {\n mouseDown: !isMouseDownIgnored && this.mouseDown,\n clientX: e.clientX,\n clientY: e.clientY,\n })\n\n // timeout is needed here as adding a classname on parent element of a button where we are listening on a click is not working properly if done synchrnousely\n setTimeout(() => {\n // 103 is the destance between pane bottom and zoom-controls top\n // zoomer bottom (8 px) + zoomer height (20px) - 13px + zoom controls height (75px) = 90px\n const isInArea = model.height - 90 <= area.cursorY && paneHeight > 210\n\n if (\n isInArea &&\n !zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS) &&\n !chartModel.getIsDisabled()\n ) {\n zoomControls.classList.add(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\n } else if (!isInArea && zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS)) {\n zoomControls.classList.remove(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\n }\n\n if (!area.mouseDown && !model.selection && isInArea && !chartModel.getIsDisabled()) {\n if (!zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\n zoomControls.classList.add(ZOOM_CONTROLS_ACTIVE_CLASS)\n }\n } else if (zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\n zoomControls.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS)\n }\n })\n }\n }\n\n onMouseLeave = () => {\n this.mouseDown = false\n }\n\n onTouchStart = (e: React.TouchEvent) => {\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\n const touchEvent = e.targetTouches[0]\n if (this.chartLayoutModel.scrollable) {\n this.onCanvasInteractionStart(touchEvent)\n } else if (this.chartLayoutModel.isTouchCrossActive) {\n this.lastClientX = touchEvent.clientX\n this.lastClientY = touchEvent.clientY\n if (!MouseModel.pane()?.eql(this.props.model)) {\n const area = this.getArea(touchEvent, {\n mouseDown: this.mouseDown,\n clientX: touchEvent.clientX,\n clientY: touchEvent.clientY,\n })\n this.setMousePosition(this.getMousePositionInBoundaries(area))\n this.isDisableTouchCrossAvailable = false\n }\n } else {\n const area = this.getArea(touchEvent, { isTouch: true }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\n const element = this.getElement(area)\n if (element?.getIsChartEvent?.()) {\n const chartEventElement = element as ChartEvent\n chartEventElement.toggleIsOpen()\n }\n }\n this.onPaneMouseMove(touchEvent, true)\n }\n }\n\n onTouchMove = (e: TouchEvent) => {\n if (!this.props.touchEventsDisabled) {\n if (!this.getIsHammerAllowScrollActive()) {\n e.preventDefault()\n }\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\n this.onCanvasInteractionMove(e.targetTouches[0])\n }\n }\n }\n\n onTouchEnd = (e: React.TouchEvent) => {\n if (!this.props.touchEventsDisabled && this.chartLayoutModel.scrollable) {\n this.onCanvasInteractionEnd(e)\n }\n }\n\n onCanvasPress = (e: React.MouseEvent) => {\n if (this.chartLayoutModel.scrollable) {\n this.chartLayoutModel.updateAttribute('scrollable', false)\n document.removeEventListener('touchmove', this.onMouseMoveOnScrolling)\n }\n if (!this.chartLayoutModel.isTouchCrossActive) {\n this.chartLayoutModel.updateAttribute('isTouchCrossActive', true)\n this.onCanvasInteractionMove(e)\n }\n }\n\n onCanvasInteractionStart = (e: React.Touch | React.MouseEvent) => {\n const { activeTool, activeChartInteraction, chartModel, model } = this.props\n const isTouch = typeof Touch !== 'undefined' && e instanceof Touch\n this.lastActiveTool = activeTool\n\n if (isPrimaryClick(e) && !activeChartInteraction && !chartModel.getIsDisabled()) {\n const area = this.getArea(e, { isTouch }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\n const element = this.getElement(area)\n if (this.chartLayoutModel.scrollable) {\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'grabbing' })\n if (model.scaleRange) {\n this.currentViewRange = model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\n }\n document.addEventListener(isTouch ? 'touchmove' : 'mousemove', this.onMouseMoveOnScrolling)\n document.addEventListener(isTouch ? 'touchend' : 'mouseup', this.onCanvasInteractionEnd)\n }\n if (element?.getIsChartEvent?.()) {\n this.setSelectedElement(null)\n const chartEventElement = element as ChartEvent\n chartEventElement.toggleIsOpen()\n } else if (\n activeTool === DrawingTool.Mouse ||\n model.getAllElements().some(({ instance }) => instance.isCreator)\n ) {\n element?.trigger('mousedown', area)\n this.setSelectedElement(element)\n }\n model.trigger('mousedown', model, area, element)\n this.mouseDown = true\n this.lastX = area.x\n this.lastY = area.y\n }\n\n this.lastClientX = e.clientX\n this.lastClientY = e.clientY\n }\n\n onCanvasInteractionMove = (e: React.MouseEvent | React.Touch) => {\n const area = this.getArea(e, {\n mouseDown: this.mouseDown,\n clientX: e.clientX,\n clientY: e.clientY,\n })\n if (!area.isCursorInChartWidthBoundaries) {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n return\n }\n\n const { model } = this.props\n const hoveredElement = this.getElement(area)\n const element = model.selection || hoveredElement\n\n if (!(this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) {\n this.isDisableTouchCrossAvailable = true\n this.setMousePosition(\n this.lastClientX && this.lastClientY && this.chartLayoutModel.isTouchCrossActive && MouseModel.position\n ? this.getMousePositionInBoundaries({\n x: MouseModel.position.x + (model.scale.x.invert(area.clientX) - model.scale.x.invert(this.lastClientX)),\n y: MouseModel.position.y + (model.scale.y.invert(area.clientY) - model.scale.y.invert(this.lastClientY)),\n })\n : { x: area.x, y: area.y }\n )\n }\n\n if (!this.chartLayoutModel.scrollable) {\n this.lastClientX = area.clientX\n this.lastClientY = area.clientY\n }\n\n element?.trigger('mousemove', area)\n if (\n this.mouseDown &&\n model.selection instanceof CanvasElement &&\n !model.selection.activeThumb &&\n !this.chartLayoutModel.activeChartEvent\n ) {\n if (!model.selection.getIsCreator?.()) {\n model.selection.moveBy(area.x - this.lastX, area.y - this.lastY)\n }\n this.lastX = area.x\n this.lastY = area.y\n this.renderAll()\n }\n const isElementHovered =\n this.props.activeTool === DrawingTool.Mouse &&\n ((element && element === hoveredElement) || hoveredElement instanceof CanvasElement)\n\n if (hoveredElement !== this.hoveredElement && this.hoveredElement instanceof CanvasElement) {\n this.hoveredElement.setIsHovered(false)\n this.hoveredElement = null\n }\n\n if (isElementHovered && hoveredElement instanceof CanvasElement) {\n if (!hoveredElement.isHovered && !hoveredElement.isSelected) {\n hoveredElement.setIsHovered(true)\n this.hoveredElement = hoveredElement\n }\n }\n\n if (isElementHovered !== this.isElementHovered && this.canvas && hoveredElement?.type !== IndicatorType.Cot) {\n this.canvas.className = isElementHovered ? 'hover' : ''\n if (this.chartLayoutModel.cross && this.crossCanvas) {\n this.crossCanvas.className = `second${isElementHovered ? ' hover' : ''}`\n }\n this.isElementHovered = isElementHovered\n }\n }\n\n onCanvasInteractionEnd = (event: TouchEvent | MouseEvent | React.TouchEvent) => {\n if (MouseModel.position) {\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'crosshair' })\n } else {\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'default' })\n }\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\n this.mouseDown = false\n const area = this.getArea(event)\n const element = this.props.model.selection || this.getElement(area)\n element?.trigger('mouseup', area)\n document.removeEventListener(isTouch ? 'touchmove' : 'mousemove', this.onMouseMoveOnScrolling)\n document.removeEventListener(isTouch ? 'touchend' : 'mouseup', this.onCanvasInteractionEnd)\n }\n\n getMousePositionInBoundaries = ({ x, y }: { x: number; y: number }) => {\n const { model } = this.props\n const Settings = getSettings(model)\n const canvasAreaRectangle = this.canvas!.getBoundingClientRect()\n const chartLeft = model.scale.x.invert(-model.chart().leftOffset + 1)\n const chartRight = model.scale.x.invert(\n canvasAreaRectangle.width - Settings.right.width - Settings.left.width - model.chart().leftOffset - 1\n )\n const chartTop = model.scale.y.invert(0)\n const chartBottom = model.scale.y.invert(canvasAreaRectangle.height - Settings.bottom.height - Settings.top.height)\n\n return {\n x: getValueInRange({\n value: x,\n min: chartLeft,\n max: chartRight,\n }),\n y: getValueInRange({\n value: y,\n min: chartBottom,\n max: chartTop,\n }),\n }\n }\n\n setMousePosition = ({ x, y }: { x: number; y: number }) => {\n const isSameMouseModel = !!MouseModel.pane()?.eql(this.props.model)\n MouseModel.updateAttributes({\n position: { x, y },\n ...(isSameMouseModel ? {} : { pane: this.props.model }),\n })\n }\n\n setSelection = (selection: IndicatorElement | CanvasElement | null) => {\n if (selection instanceof CanvasElement) {\n selection?.setIsSelected(true)\n }\n\n this.props.model.updateAttribute('selection', selection)\n }\n\n setSelectedElement = (element: IndicatorElement | CanvasElement | null) => {\n const { selection } = this.props.model\n const isSelectionCanvas = selection instanceof CanvasElement\n if (element !== selection || (isSelectionCanvas && element && !selection?.isSelected)) {\n if (isSelectionCanvas) {\n selection?.setIsSelected(false)\n }\n if (isSelectionCanvas && selection?.isCreator) {\n this.setSelection(null)\n } else {\n this.setSelection(element)\n }\n }\n }\n\n getElement = (area: PaneArea) => {\n const elements = this.props.model.getAllElements()\n const chartEvents = this.props.model.getAllChartEvents()\n\n for (let i = chartEvents.length - 1; i >= 0; i--) {\n const el = chartEvents[i].instance\n if (el.isInArea(area)) {\n return el\n }\n }\n\n for (let i = elements.length - 1; i >= 0; i--) {\n const el = elements[i].instance\n if (el.isInArea(area)) {\n return el\n }\n }\n return null\n }\n\n getCanvasDOMNode = () =>\n // This is used in app/modals/publish/publish.jsx\n this.canvasRef.current\n}\n\nexport default withNotificationContext(withElementStyleDialogState(withPaneModel(Pane)))\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport PaneModel from '../../models/pane'\n\nexport function withPaneModel

(Component: React.ComponentType

) {\n return function WrappedComponent(props: P) {\n const model = useModelState(props.model, { watchProperties: ['selection'] })\n\n return \n }\n}\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { Spinner } from '../../components'\n\nexport function ChartSpinnerOverlay({ shouldDisplay, className }: { shouldDisplay: boolean; className: string }) {\n const [isVisible, setIsVisible] = React.useState(shouldDisplay)\n React.useEffect(() => {\n let timeout: number\n if (!shouldDisplay) {\n timeout = window.setTimeout(() => {\n setIsVisible(false)\n }, 400)\n }\n return () => {\n clearTimeout(timeout)\n }\n }, [shouldDisplay])\n\n return (\n <>\n {isVisible && (\n \n \n \n )}\n \n )\n}\n","import React from 'react'\n\nimport { ChartConfigObject } from '../../../types/shared'\nimport ChartModel from '../../models/chart'\nimport ChartLayout from '../../models/chart_layout'\nimport { DrawingTool } from '../toolbar/interfaces'\n\nexport const CHART_CLASS_NAMES = 'chart flex-1 relative'\nexport const DEFAULT_WRAPPER_COMPONENT = 'div'\n\nexport interface ChartProps {\n chartIndex: number\n gridArea?: string\n WrapperComp?: React.RefForwardingComponent\n config: ChartConfigObject\n chartModel: ChartModel\n layoutModel: ChartLayout\n setActiveChartInteraction: (interaction: string | null) => void\n activeChartInteraction: string | null\n activeTool: DrawingTool\n touchEventsDisabled: boolean\n hasOutline?: boolean\n shouldResize?: boolean\n renderChartToolbar?: () => React.ReactNode\n}\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { Instrument } from '../../../types/shared'\nimport { ChartEditorEnum, SpecificChartFunctionality } from '../../constants/common'\nimport math from '../../helpers/math'\nimport ChartModel from '../../models/chart'\nimport ChartLayout from '../../models/chart_layout'\nimport MouseModel from '../../models/mouse'\nimport PaneModel from '../../models/pane'\nimport Quote from '../../models/quote'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport utils, { isRedesignEnabled } from '../../utils'\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../../utils/chart'\nimport { ChartControls } from '../chart-controls'\nimport Pane from '../pane'\nimport {\n getBarIndex,\n getIsSmallIndexChart,\n getLeftOffset,\n getMinMaxLeftOffset,\n updateZoomAndLeftOffsetByDateRange,\n} from '../renderUtils'\nimport { ChartProps } from './constants'\nimport { withChartInit } from './with-chart-init'\nimport { withWatchedPanesOnChartModel } from './with-watched-panes-on-chart-model'\n\nfunction preventDefaultFunc(event: Event) {\n event.preventDefault()\n}\n\nfunction getZoomFactor({\n chartLayout,\n currentZoomFactor,\n diff,\n minBarWidthInPx = 1,\n maxBarWidthInPx = 66,\n}: {\n chartLayout: ChartLayout\n currentZoomFactor: number\n diff: number\n minBarWidthInPx?: number\n maxBarWidthInPx?: number\n}) {\n const minZoomFactor = getZoomFactorForBarsToDisplay({\n chartLayout,\n chartVisibleWidth: minBarWidthInPx,\n numOfVisibleBars: 1,\n })\n const maxZoomFactor = getZoomFactorForBarsToDisplay({\n chartLayout,\n chartVisibleWidth: maxBarWidthInPx,\n numOfVisibleBars: 1,\n })\n const isNegativeDirection = diff < 0\n const newZoomFactor = currentZoomFactor + diff\n const newZoomFactorInRange = Math.min(Math.max(minZoomFactor, newZoomFactor), maxZoomFactor)\n\n if (newZoomFactor > newZoomFactorInRange && currentZoomFactor > newZoomFactorInRange) {\n return isNegativeDirection ? newZoomFactor : currentZoomFactor\n }\n\n if (newZoomFactor < newZoomFactorInRange && currentZoomFactor < newZoomFactorInRange) {\n return !isNegativeDirection ? newZoomFactor : currentZoomFactor\n }\n\n return newZoomFactorInRange\n}\n\ninterface ChartState {\n panesWrapperElement: HTMLDivElement | null\n}\n\nclass Chart extends React.Component {\n lastWidth: number\n mouseWheelTimeout?: number\n setStateWithPanesTimeout?: number\n lastHeight = 0\n lastY: number | null = null\n lastX: number | null = null\n resizerPaneIndex = -1\n minimalPaneHeight = 0\n zoomerRightAlign: {\n barIndex?: number\n index: number\n offsetDiff: number\n } | null = null\n\n // expects model, config, layoutModel\n constructor(props: ChartProps) {\n super(props)\n\n this.lastWidth = props.chartModel.width\n this.props.layoutModel.bind('change', this.onLayoutModelChange)\n this.state = { panesWrapperElement: null }\n }\n\n componentDidMount() {\n const { chartModel } = this.props\n this.lastWidth = this.props.layoutModel.width\n\n chartModel.trigger('change', chartModel)\n chartModel.bind('createPane', this.onPaneCreate)\n\n this.calculateMinimalPaneHeight()\n this.handleQuoteChange(chartModel.quote()!)\n this.onModelChange()\n\n chartModel.bind('update', this.onModelChange)\n chartModel.bind('destroy', () => {\n Quote.unbind('olderData', this.onOlderDataLoaded)\n Quote.unbind(`${QuoteFetchType.Refetch} ${QuoteFetchType.NewerData}`, this.onDataLoaded)\n })\n\n Quote.bind('olderData', this.onOlderDataLoaded)\n Quote.bind(`${QuoteFetchType.Refetch} ${QuoteFetchType.NewerData}`, this.onDataLoaded)\n }\n\n componentDidUpdate(prevProps: Readonly, prevState: Readonly) {\n if (\n prevState.panesWrapperElement !== this.state.panesWrapperElement ||\n prevProps.layoutModel.isWheelZoomEnabled !== this.props.layoutModel.isWheelZoomEnabled\n ) {\n prevState.panesWrapperElement?.removeEventListener('wheel', preventDefaultFunc)\n\n if (this.props.layoutModel.isWheelZoomEnabled) {\n // can't use onWheel as it has passive: true\n this.state.panesWrapperElement?.addEventListener('wheel', preventDefaultFunc, { passive: false })\n }\n }\n }\n\n componentWillUnmount() {\n const { chartModel, layoutModel } = this.props\n if (this.setStateWithPanesTimeout) {\n clearTimeout(this.setStateWithPanesTimeout)\n }\n layoutModel.unbind('change', this.onLayoutModelChange)\n chartModel.unbind('update', this.onModelChange)\n\n this.state.panesWrapperElement?.removeEventListener('wheel', preventDefaultFunc)\n }\n\n handleSetPanesWrapperRef = (panesWrapperElement: HTMLDivElement | null) => {\n this.setState({ panesWrapperElement })\n }\n\n render() {\n const { activeTool, chartIndex, layoutModel, chartModel, renderChartToolbar } = this.props\n const panes =\n layoutModel.specificChartFunctionality === SpecificChartFunctionality.futuresPage\n ? chartModel.getAllValidPanes()\n : chartModel.getAllPanes()\n const showSettings = layoutModel.editors.includes(ChartEditorEnum.settings)\n\n return (\n <>\n this.onClick(undefined)}\n data-testid={`chart-${chartIndex}-settings`}\n onMouseEnter={this.resetMouseModel}\n >\n {showSettings && }\n \n {layoutModel.editable && showSettings && renderChartToolbar && (\n \n {renderChartToolbar()}\n \n )}\n \n {panes.map((pane, index) => (\n \n ))}\n \n \n )\n }\n\n onMouseWheel = (e: React.WheelEvent) => {\n const { chartModel, layoutModel } = this.props\n const isLoading = chartModel.panes().count() < 1\n if (!layoutModel.isWheelZoomEnabled || isLoading) {\n return\n }\n if (!this.zoomerRightAlign) {\n this.calcZoomerRightAlign()\n }\n clearTimeout(this.mouseWheelTimeout)\n this.mouseWheelTimeout = window.setTimeout(() => {\n this.zoomerRightAlign = null\n }, 250)\n this.onZoomerMouseMove(e, undefined, true)\n }\n\n onClick = (activePane: PaneModel | undefined) => {\n if (\n !this.props.layoutModel.activeChart.eql(this.props.chartModel) ||\n !(this.props.layoutModel.activePane?.eql(activePane) || this.props.layoutModel.activePane === activePane)\n ) {\n this.props.layoutModel.updateAttributes({ activeChart: this.props.chartModel, activePane })\n }\n }\n\n onPaneCreate = () => {\n const { chartModel } = this.props\n this.onModelChange()\n this.calculateMinimalPaneHeight()\n chartModel.trigger('change', chartModel)\n }\n\n onPaneDestroy = (paneId: string) => {\n const { chartModel } = this.props\n const pane = chartModel.panes().find(paneId)\n\n if (pane) {\n pane.destroyCascade()\n this.onModelChange()\n chartModel.trigger('change', chartModel)\n }\n }\n\n onModelChange = (chartModelParam?: ChartModel) => {\n const { chartModel, config } = this.props\n const panes = chartModel.getAllPanes()\n const quote = chartModel.quote()\n\n if (panes.length === 0 || !quote || chartModel.leftOffset === undefined) {\n return\n }\n\n const { width, height } = chartModel\n let panesHeight = panes.reduce((sum, pane) => sum + (pane.height ?? 0), 0)\n if (panesHeight !== height) {\n panesHeight = panes.reduce((sum, pane) => {\n const newPaneHeight = Math.round((pane.height / panesHeight) * height)\n if (!Number.isNaN(newPaneHeight)) {\n pane.updateAttribute('height', newPaneHeight)\n }\n return sum + newPaneHeight\n }, 0)\n const chartPane = chartModel.getChartPane()\n if (chartPane && panesHeight !== height) {\n const newChartPaneHeight = chartPane.height + height - panesHeight\n if (!Number.isNaN(newChartPaneHeight)) {\n chartPane.updateAttribute('height', newChartPaneHeight)\n }\n }\n }\n\n const newLeftOffset = getLeftOffset({\n quote,\n chartModel,\n config: config,\n })\n const newIsScrolled = chartModel.leftOffset !== newLeftOffset\n const isScrolled = chartModel.isScrolled\n if (!isScrolled && this.lastWidth !== width) {\n this.lastWidth = width\n chartModel.updateAttribute('leftOffset', newLeftOffset)\n } else if (isScrolled !== newIsScrolled) {\n chartModel.updateAttributes({ isScrolled: newIsScrolled })\n }\n\n if (this.lastHeight !== height) {\n this.lastHeight = height\n this.calculateMinimalPaneHeight()\n }\n\n if (chartModelParam) {\n this.handleQuoteChange(chartModelParam.quote())\n }\n }\n\n onLayoutModelChange = ({ activeChart, activePane }: { activeChart: ChartModel; activePane: PaneModel }) => {\n const { chartModel } = this.props\n if (!activeChart) {\n return\n }\n for (const pane of chartModel.getAllPanes()) {\n if (activePane?.id !== pane.id && pane.selection?.isSelected === true) {\n pane.selection.setIsSelected(false)\n pane.updateAttribute('selection', undefined)\n }\n }\n }\n\n onResizerMouseDown = (e: React.MouseEvent | MouseEvent, model: PaneModel) => {\n if (e.button !== 0) {\n return\n }\n this.lastY = e.clientY\n this.resizerPaneIndex = this.props.chartModel\n .panes()\n .all()\n .findIndex((pane) => pane.eql(model))\n document.addEventListener('mousemove', this.onResizerMouseMove)\n document.addEventListener('mouseup', this.onResizerMouseUp)\n }\n\n onResizerMouseMove = (e: MouseEvent) => {\n if (this.resizerPaneIndex > 0 && this.lastY !== null && this.resizePanesAccordingly(this.lastY! - e.clientY)) {\n this.lastY = e.clientY\n }\n }\n\n onResizerMouseUp = (e: MouseEvent) => {\n const { chartModel } = this.props\n if (this.resizerPaneIndex > 0 && this.lastY !== null) {\n this.resizePanesAccordingly(this.lastY - e.clientY)\n this.lastY = null\n\n chartModel.trigger('change', chartModel)\n }\n\n document.removeEventListener('mousemove', this.onResizerMouseMove)\n document.removeEventListener('mouseup', this.onResizerMouseUp)\n }\n\n calculateMinimalPaneHeight() {\n const { chartModel } = this.props\n const { minHeight, total } = chartModel\n .panes()\n .all()\n .reduce(\n ({ minHeight, total }, pane) => {\n if (minHeight > pane.height) {\n minHeight = pane.height\n }\n total += pane.getIsChartPane() ? 3 : 1\n return { minHeight, total }\n },\n { minHeight: chartModel.height, total: 0 }\n )\n const optiMinHeight = Math.floor(chartModel.height / total)\n this.minimalPaneHeight = Math.min(minHeight, optiMinHeight)\n }\n\n resizePanesAccordingly(difY: number) {\n const { chartModel } = this.props\n const panes = chartModel.panes().all()\n let basePane = this.resizerPaneIndex\n if (!difY) {\n return true\n } else if (difY > 0) {\n let i = basePane\n let pane = panes[i]\n if (pane.height + difY >= this.minimalPaneHeight) {\n pane.updateAttribute('height', pane.height + difY)\n } else {\n pane.updateAttribute('height', this.minimalPaneHeight)\n }\n for (--i; i >= 0; i--) {\n pane = panes[i]\n if (pane.height - difY >= this.minimalPaneHeight) {\n pane.updateAttribute('height', pane.height - difY)\n break\n } else {\n pane.updateAttribute('height', this.minimalPaneHeight)\n }\n }\n } else if (difY < 0) {\n basePane = Math.max(0, basePane - 1)\n let i = basePane\n let pane = panes[i]\n if (pane.height - difY >= this.minimalPaneHeight) {\n pane.updateAttribute('height', pane.height - difY)\n } else {\n pane.updateAttribute('height', this.minimalPaneHeight)\n }\n for (++i; i < panes.length; i++) {\n pane = panes[i]\n if (pane.height + difY >= this.minimalPaneHeight) {\n pane.updateAttribute('height', pane.height + difY)\n break\n } else {\n pane.updateAttribute('height', this.minimalPaneHeight)\n }\n }\n }\n\n const panesHeight = panes.reduce((sum, pane) => sum + pane.height, 0)\n if (panesHeight !== chartModel.height) {\n difY = chartModel.height - panesHeight\n\n const pane = panes[basePane]\n pane.updateAttribute('height', pane.height + difY)\n\n // if we exceeded total height we need to stop updating lastY - return false\n return false\n }\n\n return true\n }\n\n onZoomerTouchStart = (e: React.TouchEvent | TouchEvent) => {\n if (!this.props.layoutModel.scrollable || e.touches.length !== 1 || this.props.touchEventsDisabled) {\n return\n }\n this.onZoomerMouseDown(e.targetTouches[0])\n }\n\n onZoomerTouchMove = (e: TouchEvent) => {\n if (!this.props.layoutModel.scrollable || e.touches.length !== 1) {\n return\n }\n this.onZoomerMouseMove(e.targetTouches[0])\n }\n\n onZoomerTouchEnd = () => {\n if (!this.props.layoutModel.scrollable) {\n return\n }\n this.onZoomerMouseUp()\n }\n\n getRawDistance = (e: Pick) => {\n const p1 = { x: e.touches[0].clientX, y: e.touches[0].clientY }\n const p2 = { x: e.touches[1].clientX, y: e.touches[1].clientY }\n return math.distance(p1, p2)\n }\n\n onPinchStart = (e: React.TouchEvent) => {\n const { chartModel } = this.props\n const { activeChartInteraction, setActiveChartInteraction, touchEventsDisabled } = this.props\n const isLoading = chartModel.panes().count() < 1\n\n if (\n this.props.layoutModel.scrollable &&\n e.touches.length === 2 &&\n !activeChartInteraction &&\n !isLoading &&\n !touchEventsDisabled\n ) {\n setActiveChartInteraction('pinch')\n this.onZoomerMouseDown({ clientX: this.getRawDistance(e as unknown as TouchEvent) })\n\n document.addEventListener('touchmove', this.onPinchMove)\n document.addEventListener('touchend', this.onPinchEnd)\n }\n }\n\n onPinchMove = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n this.onZoomerMouseMove({ clientX: this.getRawDistance(e) })\n }\n }\n\n onPinchEnd = (e: TouchEvent) => {\n if (e.touches.length === 1) {\n this.onZoomerMouseUp()\n document.removeEventListener('touchmove', this.onPinchMove)\n document.removeEventListener('touchend', this.onPinchEnd)\n }\n }\n\n calcZoomerRightAlign = () => {\n const { chartModel } = this.props\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const quote = chartModel.quote()\n const fx = chartModel.panes().first().scale.x\n const barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: this.props.layoutModel })\n const currentLeftOffset = getLeftOffset({ quote, chartModel, config: this.props.config, barWidth })\n this.zoomerRightAlign = null\n\n if (quote.isIntraday && quote.instrument === Instrument.Stock) {\n const barIndex = quote.getBarIndex(quote.close.length - 1)\n let offsetDiff =\n chartModel.leftOffset -\n getLeftOffset({\n quote,\n chartModel: chartModel,\n config: this.props.config,\n barWidth,\n barIndex,\n shouldAlignDaysToLeftApplied: false,\n })\n const offsetBars = ~~(offsetDiff / barWidth)\n offsetDiff -= offsetBars * barWidth\n this.zoomerRightAlign = {\n barIndex,\n index: barIndex - offsetBars,\n offsetDiff,\n }\n } else if (chartModel.leftOffset <= currentLeftOffset) {\n this.zoomerRightAlign = {\n index: quote.getBarIndex(quote.open.length - 1),\n offsetDiff: chartModel.leftOffset - currentLeftOffset,\n }\n } else {\n const offset = chartModel.leftOffset\n for (let i = 0; i < quote.open.length; i += 1) {\n const x = fx(i)\n if (x + offset < 0) {\n continue\n }\n if (x + offset > chartModel.width - ChartSettings.left.width - ChartSettings.right.width) {\n const barIndex = quote.getBarIndex(i - 1)\n let offsetDiff =\n offset -\n getLeftOffset({\n quote,\n chartModel,\n config: this.props.config,\n barWidth,\n barIndex,\n })\n const offsetBars = ~~(offsetDiff / barWidth)\n offsetDiff -= offsetBars * barWidth\n this.zoomerRightAlign = {\n barIndex,\n index: barIndex - offsetBars,\n offsetDiff,\n }\n break\n }\n }\n }\n }\n\n onZoomerMouseDown = (e: Partial) => {\n if ((e.button !== 0 && 'button' in e) || !this.props.layoutModel.scrollable) {\n return\n }\n switch (this.props.activeChartInteraction) {\n case 'pinch':\n break\n case null:\n this.props.setActiveChartInteraction('zoomer')\n break\n default:\n return\n }\n\n this.lastX = e.clientX ?? null\n this.calcZoomerRightAlign()\n\n document.addEventListener('mousemove', this.onZoomerMouseMove)\n document.addEventListener('mouseup', this.onZoomerMouseUp)\n document.addEventListener('touchmove', this.onZoomerTouchMove)\n document.addEventListener('touchend', this.onZoomerTouchEnd)\n }\n\n normalizeWheelDeltaY = (e: WheelEvent) => {\n // because wheel deltaY on mouse and touchpad is quite different we need to normalize it\n const abs = Math.abs(e.deltaY)\n if (abs === 0) return 0\n return Math.log(abs) * Math.sign(e.deltaY) * 10\n }\n\n onZoomerMouseMove = (\n e: React.WheelEvent | MouseEvent | Touch | { clientX: number },\n _?: unknown,\n isMouseWheel = false\n ) => {\n const { chartModel, layoutModel } = this.props\n let difX\n if (!layoutModel.scrollable) return\n if (!isMouseWheel && this.lastX !== null) {\n difX = (this.lastX - e.clientX) / chartModel.width\n this.lastX = e.clientX\n } else {\n // standard difX calculation result is around 0.00x, wheel deltaY is whole px\n // because of that we divide px with 1000\n difX = this.normalizeWheelDeltaY(e as WheelEvent) / 1000\n }\n\n this.addToZoomFactor({ diff: -difX })\n }\n\n addToZoomFactor = ({\n diff,\n shouldCalculateRightAlign = false,\n }: {\n diff: number\n shouldCalculateRightAlign?: boolean\n }) => {\n const { chartModel, layoutModel } = this.props\n if (shouldCalculateRightAlign) {\n this.calcZoomerRightAlign()\n }\n // 6 is default bar width with margin on charts page, so to get the similar feeling when zooming we're multiplying the zoom factor by the coefficient\n const diffCoefficient = chartModel.zoomFactor * (6 / getBarWidthWithMargin({ chartLayout: this.props.layoutModel }))\n const zoomFactor = getZoomFactor({\n chartLayout: layoutModel,\n currentZoomFactor: chartModel.zoomFactor,\n diff: diff * diffCoefficient,\n })\n const barWidth = getBarWidthWithMargin({\n zoomFactor,\n chartLayout: this.props.layoutModel,\n })\n\n let leftOffset\n if (this.props.config.stretch) {\n leftOffset = 0\n } else if (getIsSmallIndexChart(this.props.layoutModel.specificChartFunctionality)) {\n leftOffset = barWidth\n } else if (this.zoomerRightAlign) {\n leftOffset = getMinMaxLeftOffset({\n newLeftOffset:\n getLeftOffset({\n quote: chartModel.quote(),\n chartModel: chartModel,\n config: this.props.config,\n barWidth,\n barIndex: this.zoomerRightAlign.index,\n shouldAlignDaysToLeftApplied: false,\n }) + this.zoomerRightAlign.offsetDiff,\n chartModel: chartModel,\n barWidth,\n barIndex: getBarIndex(chartModel.quote()),\n })\n } else {\n return\n }\n chartModel.updateAttributes({\n zoomFactor,\n leftOffset,\n dateRange: null,\n })\n if (shouldCalculateRightAlign) {\n this.zoomerRightAlign = null\n }\n }\n\n onZoomerMouseUp = () => {\n this.zoomerRightAlign = null\n document.removeEventListener('mousemove', this.onZoomerMouseMove)\n document.removeEventListener('mouseup', this.onZoomerMouseUp)\n document.removeEventListener('touchmove', this.onZoomerTouchMove)\n document.removeEventListener('touchend', this.onZoomerTouchEnd)\n this.props.setActiveChartInteraction(null)\n }\n\n onZoomerReset = () => {\n const { chartModel, layoutModel } = this.props\n const zoomFactor = chartModel.chart_layout().defaultZoomFactor\n const barWidth = getBarWidthWithMargin({ zoomFactor, chartLayout: layoutModel })\n const leftOffset = getLeftOffset({\n quote: chartModel.quote(),\n chartModel,\n config: this.props.config,\n barWidth,\n })\n\n chartModel.updateAttributes({\n zoomFactor,\n leftOffset,\n dateRange: null,\n })\n }\n\n onOlderDataLoaded = () => {\n throw new Error('onOlderDataLoaded not implemented')\n // TODO implement similarly to onDataLoaded\n }\n\n resetMouseModel = () => {\n const isLoading = this.props.chartModel.panes().count() < 1\n if (!isLoading) {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n }\n }\n\n handleQuoteChange = (quote: Quote) => {\n const { chartModel } = this.props\n\n // Update only date range chart\n if (chartModel.dateRange) {\n if (!quote.eql(chartModel.quote()) || chartModel.timeframe !== quote.timeframe || quote.date.length === 0) {\n return\n }\n updateZoomAndLeftOffsetByDateRange({ chartModel, quote })\n }\n }\n\n onDataLoaded = (newQuote: Quote, fetchType: QuoteFetchType) => {\n const { chartModel } = this.props\n const quote = chartModel.quote()\n if (!quote?.eql(newQuote)) {\n return\n }\n\n const shouldForceLeftOffsetUpdate = fetchType === QuoteFetchType.Refetch\n let newLeftOffset = chartModel.leftOffset // TODO find proper fix. If this line is removed (if we don't trigger leftOffset update), the chart stops being updated for the user until they move chart around.\n if (\n (this.props.layoutModel.scrollable === false && !this.props.layoutModel.isTouchCrossActive) ||\n !chartModel.isScrolled ||\n shouldForceLeftOffsetUpdate\n ) {\n newLeftOffset = getLeftOffset({\n quote,\n chartModel: chartModel,\n config: this.props.config,\n })\n }\n\n chartModel.setChartEvents(quote.chartEvents, !quote.events)\n\n if (newLeftOffset !== chartModel.leftOffset) {\n chartModel.getAllElements().forEach((element) => {\n if (element.isDrawing() && !element.isMouseDown()) {\n element.instance.updateScales()\n }\n })\n }\n\n chartModel.updateAttribute('leftOffset', newLeftOffset)\n\n this.handleQuoteChange(quote)\n }\n}\n\nexport default withChartInit(withWatchedPanesOnChartModel(Chart))\n","import classNames from 'classnames'\nimport merge from 'lodash.merge'\nimport React from 'react'\n\nimport { ObjectHash } from '../../../types/shared'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Quote from '../../models/quote'\nimport { getChartsDimensions, isRedesignEnabled } from '../../utils'\nimport { prefetchPerfIndicatorAllQuotes } from '../../utils/chart'\nimport { getLeftOffset } from '../renderUtils'\nimport { ChartSpinnerOverlay } from './chart-spinner-overlay'\nimport { CHART_CLASS_NAMES, ChartProps, DEFAULT_WRAPPER_COMPONENT } from './constants'\n\nexport function withChartInit(Component: React.ComponentType) {\n return function WrappedComponent(props: ChartProps) {\n const { WrapperComp = DEFAULT_WRAPPER_COMPONENT, gridArea } = props\n const isModelDestroyedRef = React.useRef(false)\n const model = useModelState(props.chartModel, { watchProperties: ['panes', 'quote'] })\n const layoutModel = useModelState(props.layoutModel, { watchProperties: ['activeChart'] })\n const quote = model.quote()\n\n const initChartRef = React.useRef(async () => {\n const { chartModel, config } = props\n const { premarket, hasChartEvents, aftermarket, ticker, instrument, timeframe, panes: panesConfig } = config\n\n const options = {\n premarket,\n aftermarket,\n events: hasChartEvents,\n patterns: panesConfig.some(\n (pane) =>\n pane.elements?.some(\n (element) => element.overlays?.some((overlay: ObjectHash) => overlay.type === 'overlays/patterns')\n )\n ),\n }\n\n const quote = await Quote.get({\n ticker,\n instrument,\n timeframe,\n options,\n })\n const panesWithPerfIndicator = panesConfig.filter(({ elements }) =>\n elements.some(({ type }) => type === 'indicators/perf')\n )\n\n if (panesWithPerfIndicator) {\n await Promise.allSettled(\n panesWithPerfIndicator.map((paneWithPerfIndicator) =>\n prefetchPerfIndicatorAllQuotes({ paneWithPerfIndicator, timeframe, options })\n )\n )\n }\n\n if (isModelDestroyedRef.current) {\n return\n }\n\n config.panes.forEach((pane) => {\n const paneProperties = merge({}, pane)\n paneProperties.chart = chartModel\n chartModel.createPaneCascade(paneProperties)\n })\n\n chartModel.updateAttributes({\n quote,\n premarket: options.premarket,\n aftermarket: options.aftermarket,\n })\n\n chartModel.setChartEvents(quote.chartEvents, true)\n\n if (props.shouldResize) {\n const chartsDimensions = getChartsDimensions(props.layoutModel.getHTMLElementId())\n props.layoutModel.updateAttributes(chartsDimensions)\n }\n\n if (chartModel.leftOffset == null) {\n const leftOffset = getLeftOffset({ quote, chartModel: chartModel, config: props.config })\n chartModel.updateAttribute('leftOffset', leftOffset)\n }\n })\n\n React.useEffect(() => {\n const handleModelBeforeDestroy = () => {\n isModelDestroyedRef.current = true\n }\n\n model.bind('beforeDestroy', handleModelBeforeDestroy)\n initChartRef.current()\n return () => {\n model.unbind('beforeDestroy', handleModelBeforeDestroy)\n }\n // We want to run it only on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const isQuotePage = props.layoutModel.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isChartPage = props.layoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isFuturesForexCryptoPage = [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(props.layoutModel.specificChartFunctionality)\n const isModelReady =\n quote && ((quote.fetchedAt === undefined && quote.close.length > 0) || quote.fetchedAt > 0 || quote)\n const loadingStyle =\n !isModelReady && isQuotePage\n ? // 2px is border\n { width: model.width ? model.width + 2 : '100%', height: model.height + 2 }\n : undefined\n\n return (\n \n {isChartPage && (\n \n )}\n {isModelReady && }\n \n )\n }\n}\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartModel from '../../models/chart'\n\nexport function withWatchedPanesOnChartModel

(Component: React.ComponentType

) {\n return function WrappedComponent(props: P) {\n const model = useModelState(props.chartModel, { watchProperties: ['panes'] })\n\n return \n }\n}\n","export const portfolioWatchlistAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist\" */ './portfolio-watchlist'),\n cacheKey: 'portfolio-watchlist',\n}\n","import React from 'react'\n\nimport { Button, Paragraph } from '../../../components'\n\nexport function ModuleLoadFailed() {\n return (\n

\n
\n \n The Sidebar Widget didn't load successfully. Please refresh the page.\n \n \n
\n
\n )\n}\n","import React from 'react'\n\nimport { portfolioWatchlistAsyncModule } from './portfolio-watchlist/async-modules'\nimport { withModuleAsyncLoad } from './with-module-async-load'\n\nexport enum SidebarModule {\n portfolio = 'portfolio',\n}\n\nexport type SidebarModuleType = {\n key: SidebarModule\n icon: string\n description: string\n content: React.ComponentType\n width?: {\n min?: number | string\n max?: number | string\n default?: { desktop?: number; mobile?: number }\n }\n}\n\nexport const sidebarModules: Record = Object.freeze({\n [SidebarModule.portfolio]: {\n key: SidebarModule.portfolio,\n icon: 'briefcase',\n description: 'Portfolio watchlist',\n content: withModuleAsyncLoad(portfolioWatchlistAsyncModule, true),\n width: { min: 200, default: { mobile: 275 } },\n },\n})\n","import React from 'react'\n\nimport { Delayed, Spinner } from '../../../components'\nimport { useAsyncModule } from '../../../utils/async-modules-utils'\nimport { ModuleLoadFailed } from './module-load-failed'\n\nexport function withModuleAsyncLoad<\n T extends { default: React.ComponentType<{ setIsComponentReady: React.Dispatch> }> },\n>(asyncModule: { importFn: () => Promise; cacheKey: string }, withInitialLoading = false) {\n return function InnerFunction() {\n const [isComponentReady, setIsComponentReady] = React.useState(false)\n const [sidebarModule, { isLoading, isError }] = useAsyncModule({\n ...asyncModule,\n shouldLoadModule: true,\n })\n\n const SidebarModule = sidebarModule?.default\n\n if (isError) {\n return \n }\n\n return (\n <>\n {(isLoading || (!isComponentReady && withInitialLoading)) && (\n \n
\n \n
\n
\n )}\n {!!SidebarModule && }\n \n )\n }\n}\n","import { Resizable } from 're-resizable'\nimport React from 'react'\n\nimport Utils from '../../utils'\nimport { DEFAULT_WIDTHS, SidebarDirection } from './constants'\nimport { useSidebarContext } from './hooks/sidebar-context'\n\ntype SidebarContentProps = {\n children: React.ReactNode\n}\n\nexport default function SidebarContent({ children }: SidebarContentProps) {\n const { direction, onResize, close, width } = useSidebarContext()\n const minWidth = width?.min ?? DEFAULT_WIDTHS.min\n const maxWidth = width?.max ?? DEFAULT_WIDTHS.max\n const defaultMobile = width?.default?.mobile ?? minWidth\n const defaultDesktop = width?.default?.desktop ?? maxWidth\n\n return (\n <>\n {direction === SidebarDirection.vertical && (\n \n {children}\n \n )}\n {direction === SidebarDirection.horizontal && (\n <>\n
\n
\n {children}\n
\n \n )}\n \n )\n}\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { Button, Icon, Paragraph, Tooltip, TooltipTrigger, useTooltipState } from '../../components'\nimport { SidebarDirection } from './constants'\nimport { useSidebarContext } from './hooks/sidebar-context'\nimport { sidebarModules } from './modules/modules'\n\nexport const MOBILE_TOOLBAR_DIV_ID = 'toolbar-mobile'\n\ntype SidebarTabsProps = {\n className?: string\n}\n\nexport default function SidebarTabs({ className }: SidebarTabsProps) {\n const { isOpen, direction, activeModule, selectModule } = useSidebarContext()\n const tooltipState = useTooltipState({ placement: 'left', unstable_timeout: 300 })\n\n return (\n \n {/* reserved space for drawing button on mobile devices */}\n {direction === SidebarDirection.horizontal && (\n \n )}\n\n {Object.entries(sidebarModules).map(([key, value]) => {\n const isActive = activeModule?.key === key\n return (\n \n \n {\n selectModule(isActive ? undefined : value.key)\n tooltipState.hide()\n }}\n className={classnames({ 'ml-2': direction === SidebarDirection.horizontal })}\n data-testid={`sidebar-${key}-btn`}\n >\n \n \n \n \n {value.description}\n \n \n )\n })}\n
\n )\n}\n","import React from 'react'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\n\nimport { getIsMobilePortrait } from '../../utils'\nimport { localStorage } from '../../website-shared'\nimport { SidebarDirection } from './constants'\nimport { SidebarContext, SidebarContextType } from './hooks/sidebar-context'\nimport { SidebarModule, SidebarModuleType, sidebarModules } from './modules/modules'\nimport SidebarContent from './sidebar-content'\nimport SidebarTabs from './sidebar-tabs'\n\nexport const SIDEBAR_QUERY_PARAM = 'sidebar'\n\n// This is a temp function, to remove unused property from localstorage\nfunction removeSidebarFromLocalstorage() {\n const SIDEBAR_LOCAL_STORAGE_KEY = 'sidebarModule'\n localStorage.removeValue(SIDEBAR_LOCAL_STORAGE_KEY)\n}\nremoveSidebarFromLocalstorage()\n\ntype SidebarProps = {\n onShouldResize: () => void\n direction: SidebarDirection\n tabsClassName?: string\n}\n\n// Todo - this is not correct approach but this component can unmount/mount on mobile orientation change so we can't keep it inside the component\nlet isInit = false\n\nexport function Sidebar({ onShouldResize, direction, tabsClassName }: SidebarProps) {\n const navigate = useNavigate()\n const [urlSearchParams] = useSearchParams()\n const sidebarModuleKey = (urlSearchParams.get(SIDEBAR_QUERY_PARAM) as keyof typeof sidebarModules | null) || null\n const [activeModule, setActiveModule] = React.useState(null)\n\n const isOpen = !!activeModule\n const handleSelectModule = React.useCallback(\n (key?: SidebarModule) => {\n const newUrlSearchParams = new URLSearchParams(urlSearchParams)\n if (key) {\n newUrlSearchParams.set(SIDEBAR_QUERY_PARAM, key)\n } else {\n newUrlSearchParams.delete(SIDEBAR_QUERY_PARAM)\n }\n navigate({ search: newUrlSearchParams.toString() }, { replace: true })\n },\n [urlSearchParams, navigate]\n )\n\n const handleCloseSidebar = React.useCallback(() => {\n handleSelectModule(undefined)\n }, [handleSelectModule])\n\n // Resize charts every time the sidebar is opened/closed or active module is changed\n React.useEffect(() => {\n onShouldResize()\n }, [activeModule, onShouldResize])\n\n // Set active module based on sidebarModuleKey\n React.useEffect(() => {\n let sidebarModule = sidebarModuleKey && sidebarModules[sidebarModuleKey]\n\n if (!isInit && getIsMobilePortrait()) {\n sidebarModule = null\n handleCloseSidebar()\n }\n\n setActiveModule(sidebarModule)\n isInit = true\n }, [sidebarModuleKey, handleCloseSidebar])\n\n const contextValue: SidebarContextType = React.useMemo(\n () => ({\n direction,\n isOpen,\n isCloseVisible: direction === SidebarDirection.horizontal,\n width: activeModule?.width,\n activeModule,\n onResize: onShouldResize,\n close: handleCloseSidebar,\n selectModule: handleSelectModule,\n }),\n [direction, isOpen, onShouldResize, activeModule, handleCloseSidebar, handleSelectModule]\n )\n\n return (\n \n {activeModule && (\n \n \n \n )}\n \n \n )\n}\n","export const drawingCreatorsAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"drawing-creators\" */ './module-entry'),\n cacheKey: 'drawing-creators',\n}\n","import { DrawingActions, IToolbarDrawingAction, IToolbarDrawingActionItem } from './interfaces'\n\nexport const drawingActions: Record = {\n [DrawingActions.AddNote]: {\n id: DrawingActions.AddNote,\n title: 'Add note',\n icon: 'note',\n },\n [DrawingActions.DeleteDrawings]: {\n id: DrawingActions.DeleteDrawings,\n title: 'Remove all drawings',\n icon: 'drawingActionDelete',\n },\n [DrawingActions.DeleteAutoSavedDrawings]: {\n id: DrawingActions.DeleteAutoSavedDrawings,\n title: 'Remove all autosaved drawings',\n icon: 'drawingActionDelete',\n },\n}\n\nexport const getToolbarDrawingActions = ({\n isAutoSaveActive,\n isAddNoteAvailable = false,\n isIdea,\n}: {\n isAutoSaveActive: boolean\n isAddNoteAvailable?: boolean\n isIdea?: boolean\n}): Array => [\n ...(isAddNoteAvailable\n ? [\n {\n defaultItem: drawingActions[DrawingActions.AddNote],\n isDisabled: isIdea,\n disabledTooltip: 'Add note is not available in ideas',\n },\n ]\n : []),\n {\n defaultItem:\n drawingActions[isAutoSaveActive ? DrawingActions.DeleteAutoSavedDrawings : DrawingActions.DeleteDrawings],\n },\n]\n","import { DrawingSetting, IToolbarDrawingSetting, IToolbarDrawingsSettingItem } from './interfaces'\n\nconst drawingSettings: Record = {\n [DrawingSetting.PreserveDrawings]: {\n id: DrawingSetting.PreserveDrawings,\n icon: 'drawingSettingPreserveDrawings',\n iconActive: 'drawingSettingPreserveDrawingsActive',\n title: 'Preserve drawings: Off',\n titleActive: 'Preserve drawings: On',\n },\n [DrawingSetting.DrawingModeContinuous]: {\n id: DrawingSetting.DrawingModeContinuous,\n icon: 'drawingSettingDrawingMode',\n iconActive: 'drawingSettingDrawingModeActive',\n title: 'Drawing mode: Single',\n titleActive: 'Drawing mode: Continuous',\n },\n [DrawingSetting.HideDrawings]: {\n id: DrawingSetting.HideDrawings,\n icon: 'drawingSettingHide',\n iconActive: 'drawingSettingShow',\n title: 'Hide drawings',\n titleActive: 'Show drawings',\n },\n [DrawingSetting.LockDrawings]: {\n id: DrawingSetting.LockDrawings,\n icon: 'drawingSettingLock',\n iconActive: 'drawingSettingUnlock',\n title: 'Lock drawings',\n titleActive: 'Unlock drawings',\n },\n}\n\nconst preserveDrawingsAutosaveOverride = {\n id: DrawingSetting.PreserveDrawings, // DrawingSetting.PreserveDrawings so it works with current settings sync to DB\n icon: 'drawingSettingAutosaveOff',\n iconActive: 'drawingSettingAutosaveOn',\n iconAction: 'drawingSettingAutosaveSaving',\n title: 'Drawings autosave: Off',\n titleActive: 'Drawings Autosave: On',\n titleAction: 'Drawings Autosave: Saving',\n}\n\nexport const getToolbarDrawingSettings = ({\n isPreserveDrawingsAndAutosaveAvailable,\n isIdea,\n isAutoSaveInProgress,\n}: {\n isPreserveDrawingsAndAutosaveAvailable?: boolean\n isIdea?: boolean\n isAutoSaveInProgress?: boolean\n}): Array => {\n const toolbarSettings = [\n {\n defaultItem: drawingSettings[DrawingSetting.DrawingModeContinuous],\n },\n ...(isPreserveDrawingsAndAutosaveAvailable\n ? [\n {\n defaultItem: preserveDrawingsAutosaveOverride,\n isDisabled: isIdea,\n isInAction: isAutoSaveInProgress,\n disabledTooltip: 'Autosave is not available in ideas',\n },\n ]\n : []),\n {\n defaultItem: drawingSettings[DrawingSetting.HideDrawings],\n },\n {\n defaultItem: drawingSettings[DrawingSetting.LockDrawings],\n },\n ]\n\n return toolbarSettings\n}\n","import { DrawingTool, IToolbarDrawingTool, IToolbarDrawingToolItem } from './interfaces'\n\nexport const drawingTools: Record = {\n [DrawingTool.Mouse]: {\n id: DrawingTool.Mouse,\n title: 'Mouse',\n icon: 'toolMouse',\n },\n [DrawingTool.Measure]: {\n id: DrawingTool.Measure,\n title: 'Measure',\n icon: 'toolMeasure',\n },\n [DrawingTool.ScaledLine]: {\n id: DrawingTool.ScaledLine,\n title: 'Line',\n icon: 'toolLine',\n },\n [DrawingTool.Arrow]: {\n id: DrawingTool.Arrow,\n title: 'Arrow',\n icon: 'toolArrow',\n },\n [DrawingTool.VerticalLine]: {\n id: DrawingTool.VerticalLine,\n title: 'Vertical line',\n icon: 'toolMidLineV',\n },\n [DrawingTool.HorizontalLine]: {\n id: DrawingTool.HorizontalLine,\n title: 'Horizontal line',\n icon: 'toolMidLineH',\n },\n [DrawingTool.Rectangle]: {\n id: DrawingTool.Rectangle,\n title: 'Rectangle',\n icon: 'toolRect',\n },\n [DrawingTool.RotatedRectangle]: {\n id: DrawingTool.RotatedRectangle,\n title: 'Rotated rectangle',\n icon: 'toolRectRotated',\n },\n [DrawingTool.Triangle]: {\n id: DrawingTool.Triangle,\n title: 'Triangle',\n icon: 'toolTriangle',\n },\n [DrawingTool.Ellipse]: {\n id: DrawingTool.Ellipse,\n title: 'Ellipse',\n icon: 'toolEllipse',\n },\n [DrawingTool.Curve]: {\n id: DrawingTool.Curve,\n title: 'Curve',\n icon: 'toolCurve',\n },\n [DrawingTool.Pitchfork]: {\n id: DrawingTool.Pitchfork,\n title: 'Pitchfork',\n icon: 'toolPitchfork',\n },\n [DrawingTool.Polygon]: {\n id: DrawingTool.Polygon,\n title: 'Polygon',\n icon: 'toolPolygon',\n },\n [DrawingTool.Xabcd]: {\n id: DrawingTool.Xabcd,\n title: 'XABCD',\n icon: 'toolXABCD',\n },\n [DrawingTool.ScaledText]: {\n id: DrawingTool.ScaledText,\n title: 'Text',\n icon: 'toolText',\n },\n [DrawingTool.Brush]: {\n id: DrawingTool.Brush,\n title: 'Brush',\n icon: 'toolBrush',\n },\n [DrawingTool.ElliottWaves]: {\n id: DrawingTool.ElliottWaves,\n title: 'Elliott waves',\n icon: 'toolElliottWave',\n },\n [DrawingTool.FibonacciRetracements]: {\n id: DrawingTool.FibonacciRetracements,\n title: 'Fibonacci retracements',\n icon: 'toolFibonacci',\n },\n [DrawingTool.Position]: {\n id: DrawingTool.Position,\n title: 'Position',\n icon: 'toolPosition',\n },\n [DrawingTool.Callout]: {\n id: DrawingTool.Callout,\n title: 'Callout',\n icon: 'toolCallout',\n },\n}\n\nexport const toolbarDrawingTools: Array = [\n {\n defaultItem: drawingTools[DrawingTool.Mouse],\n },\n {\n defaultItem: drawingTools[DrawingTool.Measure],\n },\n {\n defaultItem: drawingTools[DrawingTool.ScaledLine],\n toolGroup: [\n drawingTools[DrawingTool.ScaledLine],\n drawingTools[DrawingTool.VerticalLine],\n drawingTools[DrawingTool.HorizontalLine],\n drawingTools[DrawingTool.Curve],\n ],\n toolGroupTitle: 'Line tools',\n },\n {\n defaultItem: drawingTools[DrawingTool.Arrow],\n },\n {\n defaultItem: drawingTools[DrawingTool.Rectangle],\n },\n {\n defaultItem: drawingTools[DrawingTool.RotatedRectangle],\n },\n {\n defaultItem: drawingTools[DrawingTool.Triangle],\n },\n {\n defaultItem: drawingTools[DrawingTool.Ellipse],\n },\n {\n defaultItem: drawingTools[DrawingTool.Polygon],\n },\n {\n defaultItem: drawingTools[DrawingTool.Xabcd],\n toolGroup: [drawingTools[DrawingTool.Xabcd], drawingTools[DrawingTool.Pitchfork]],\n toolGroupTitle: 'XABCD tools',\n },\n {\n defaultItem: drawingTools[DrawingTool.ScaledText],\n toolGroup: [drawingTools[DrawingTool.ScaledText], drawingTools[DrawingTool.Callout]],\n toolGroupTitle: 'Text tools',\n },\n {\n defaultItem: drawingTools[DrawingTool.Brush],\n },\n {\n defaultItem: drawingTools[DrawingTool.ElliottWaves],\n },\n {\n defaultItem: drawingTools[DrawingTool.FibonacciRetracements],\n },\n {\n defaultItem: drawingTools[DrawingTool.Position],\n },\n]\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { PaneArea } from '../../../types/shared'\nimport { Toolbar as ToolbarComponent, ToolbarDivider, ToolbarItem } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { drawingCreatorsAsyncModule } from '../../creators/async-modules'\nimport { ElementStyleDialogContext } from '../../modals/element_style'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { AutoSaveState } from '../../models/constants'\nimport PaneModel from '../../models/pane'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\nimport { getToolbarDrawingActions } from './drawingActions'\nimport { getToolbarDrawingSettings } from './drawingSettings'\nimport { drawingTools, toolbarDrawingTools } from './drawingTools'\nimport { DrawingSetting, DrawingTool, IToolBarProps } from './interfaces'\n\nexport const DISABLED_ITEM_TOOLTIP_LABEL = \"Disabled due 'lock/hide' drawings active\"\n\nexport default function Toolbar({\n isSidebar,\n isHorizontal,\n isMobileOverlay,\n activeTool,\n chartLayoutModel,\n onActiveToolChange,\n onDrawingActionClick,\n onDrawingSettingClick,\n onDrawingEnd,\n drawingSettings,\n isAlternativeTheme,\n areToolsDisabled,\n}: IToolBarProps) {\n const [drawingCreatorsModule, { isLoading: isDrawingCreatorsModuleLoading }] = useAsyncModule({\n ...drawingCreatorsAsyncModule,\n shouldLoadModule: true,\n })\n const { autoSaveState } = useModelState(\n React.useMemo(() => chartLayoutModel.drawingsInternalStore(), [chartLayoutModel]),\n { watchProperties: ['autoSaveState'] }\n )\n const [isDrawing, setIsDrawing] = React.useState(false)\n const openElementStyleDialog = React.useContext(ElementStyleDialogContext)\n\n const availableDrawingSettings = getToolbarDrawingSettings({\n isPreserveDrawingsAndAutosaveAvailable: getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel),\n isAutoSaveInProgress: autoSaveState === AutoSaveState.Saving,\n isIdea: !!chartLayoutModel.idea?.id,\n })\n\n const availableDrawingActions = getToolbarDrawingActions({\n isAutoSaveActive: autoSaveState !== AutoSaveState.Off,\n isAddNoteAvailable: chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage,\n isIdea: !!chartLayoutModel.idea?.id,\n })\n\n React.useEffect(() => {\n if (!drawingCreatorsModule) {\n return\n }\n\n const onMouseDown = (model: PaneModel, area: PaneArea & { isTouch: boolean }) => {\n const isDrawingModeContinuous = drawingSettings[DrawingSetting.DrawingModeContinuous]\n const hasData = model.chart().quote().close.length > 0\n const hasHiddenDrawings = drawingSettings[DrawingSetting.HideDrawings]\n const tool = drawingTools[activeTool].id\n\n if (tool === DrawingTool.Mouse || isDrawing || hasHiddenDrawings || !hasData) {\n return\n }\n\n setIsDrawing(true)\n const { drawingToolsTouchCreatorsByType, drawingToolsCreatorsByType } = drawingCreatorsModule\n const ToolClass = area.isTouch ? drawingToolsTouchCreatorsByType[tool] : drawingToolsCreatorsByType[tool]\n const element = model.elements().create({\n instance: new ToolClass(area, {}, model, openElementStyleDialog, () => {\n if (!isDrawingModeContinuous) {\n onActiveToolChange(DrawingTool.Mouse)\n }\n setIsDrawing(false)\n onDrawingEnd?.()\n }),\n })\n element.one('destroy', ({ instance }) => {\n if (instance.getIsCreator()) {\n setIsDrawing(false)\n onDrawingEnd?.()\n }\n })\n\n element.trigger('select', element)\n }\n PaneModel.bind('mousedown', onMouseDown)\n return () => {\n PaneModel.unbind('mousedown', onMouseDown)\n }\n }, [\n activeTool,\n onActiveToolChange,\n openElementStyleDialog,\n onDrawingEnd,\n drawingCreatorsModule,\n drawingSettings,\n isDrawing,\n ])\n\n return (\n \n {toolbarDrawingTools.map((item) => {\n const isActive = activeTool === item.defaultItem.id || item.toolGroup?.some((tool) => tool.id === activeTool)\n const isToolLoading = isDrawingCreatorsModuleLoading && isActive\n\n return (\n \n )\n })}\n \n {availableDrawingSettings.map((item) => (\n \n ))}\n {availableDrawingActions.map((item) => (\n \n ))}\n \n )\n}\n","import Toolbar from './toolbar'\n\nexport default Toolbar\n","import React from 'react'\n\nimport { ObjectHash } from '../../../../types/shared'\nimport { Textarea } from '../../../components'\nimport { useModelState } from '../../../model-hooks/use-model-state'\nimport Chart from '../../../models/chart'\nimport ChartLayout from '../../../models/chart_layout'\nimport { useDrawingAutoSaveControls } from '../../autosave/use-drawing-auto-save-controls'\nimport { getElementNoteText, getTickersAndContainerTypesInLayoutModel } from '../../autosave/utils'\n\ninterface ChartAutoSaveNoteProps {\n ticker: string\n note: string\n onNoteChange: (note: string, ticker: string) => void\n}\n\nfunction ChartAutoSaveNote({ ticker, note, onNoteChange }: ChartAutoSaveNoteProps) {\n return (\n ) => {\n onNoteChange(e.target.value, ticker)\n }}\n />\n )\n}\n\ninterface Props {\n chartLayoutModel: ChartLayout\n}\n\nexport function ChartAutoSaveNotes({ chartLayoutModel }: Props) {\n const { handleAutoSaveNoteChange } = useDrawingAutoSaveControls(chartLayoutModel)\n const [tickers, setTickers] = React.useState([])\n const unwatchedInternalStore = React.useMemo(() => chartLayoutModel.drawingsInternalStore(), [chartLayoutModel])\n const drawingsInternalStore = useModelState(unwatchedInternalStore, { watchProperties: ['elements'] })\n\n React.useEffect(() => {\n // There was no better way how to listen on ticker changes which is necessary for displaying correct text areas\n const handleChartChange = () => {\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayoutModel)\n setTickers(tickers)\n }\n\n Chart.bind('change', handleChartChange)\n handleChartChange()\n return () => {\n Chart.unbind('change', handleChartChange)\n }\n }, [chartLayoutModel])\n\n const tickerNoteMap = React.useMemo(() => {\n const map: ObjectHash = {}\n drawingsInternalStore.elements.forEach((element) => {\n if (element.containerType === 'note' && tickers.includes(element.ticker)) {\n map[element.ticker] = getElementNoteText(element)\n }\n })\n\n return map\n }, [drawingsInternalStore.elements, tickers])\n\n return (\n
\n {tickers.map((ticker) => (\n \n ))}\n
\n )\n}\n","import React from 'react'\n\nimport { Dialog, DialogBody, DialogHeader } from '../../../components'\nimport ChartLayout from '../../../models/chart_layout'\nimport { ChartAutoSaveNotes } from './auto-save-notes'\n\ninterface INoteDialog {\n dialogState: any\n chartLayoutModel: ChartLayout\n}\n\nexport function AutoSaveNotesDialog({ dialogState, chartLayoutModel }: INoteDialog) {\n return (\n \n dialogState.hide()}>Notes\n \n {(dialogState.visible || dialogState.animating) && }\n \n \n )\n}\n","import React from 'react'\n\nimport { Button, ConfirmationDialog as ConfirmationDialogComponent } from '../../components'\n\nconst getDialogContent = ({\n isAutosaveDialogContent,\n tickers,\n}: {\n isAutosaveDialogContent: boolean\n tickers: string[]\n}) => {\n if (isAutosaveDialogContent) {\n return {\n title: 'Remove all autosaved drawings?',\n message: (\n <>\n Do you really want to remove all autosaved drawings? This action is irreversible and will remove all\n non-idea drawings for {tickers.join(', ')}.\n \n ),\n }\n }\n return {\n title: 'Remove all drawings?',\n message: `Do you really want to remove all drawings? This action only affects the current page and visible tickers. This action doesn't remove autosaved drawings or ideas.`,\n }\n}\n\nexport interface IConfirmationDialog {\n state: any\n onCancel: () => void\n onAction: () => void\n isAutosaveDialogContent: boolean\n tickers: string[]\n}\n\nexport function ConfirmationDialog({\n onCancel,\n onAction,\n state,\n isAutosaveDialogContent = false,\n tickers,\n}: IConfirmationDialog) {\n const dialogContent = getDialogContent({ isAutosaveDialogContent, tickers })\n\n return (\n \n \n \n \n }\n >\n {dialogContent.message}\n \n )\n}\n","import React from 'react'\n\nimport { Button, Icon } from '../../../components'\nimport { drawingTools } from '../drawingTools'\nimport { DrawingTool } from '../interfaces'\n\ntype ToolButtonProps = {\n onClick: () => void\n activeTool: DrawingTool\n}\n\nexport default function ToolButton({ activeTool, onClick }: ToolButtonProps) {\n return (\n \n )\n}\n","import classNames from 'classnames'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { useSearchParams } from 'react-router-dom'\n\nimport { Button } from '../../../components'\nimport { SIDEBAR_QUERY_PARAM } from '../../sidebar/sidebar'\nimport { MOBILE_TOOLBAR_DIV_ID } from '../../sidebar/sidebar-tabs'\nimport { DrawingActions, DrawingTool, IToolBarProps } from '../interfaces'\nimport Toolbar from '../toolbar'\nimport ToolButton from './tool-button'\n\ntype ToolbarMobileProps = Omit\n\nexport default function ToolbarMobile({\n activeTool,\n onActiveToolChange,\n onDrawingActionClick,\n ...rest\n}: ToolbarMobileProps) {\n const [isToolbarVisible, setIsToolbarVisible] = React.useState(false)\n const [urlSearchParams, setUrlSearchParams] = useSearchParams()\n const [toolbarMobileElement, setToolbarMobileElement] = React.useState(null)\n\n // get toolbar mobile element on first render\n React.useEffect(() => {\n setToolbarMobileElement(document.getElementById(MOBILE_TOOLBAR_DIV_ID))\n }, [])\n\n const handleActiveToolChange = React.useCallback(\n (drawingTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => {\n onActiveToolChange(drawingTool, trigger)\n\n if (trigger !== 'group') return setIsToolbarVisible(false)\n },\n [onActiveToolChange]\n )\n\n // Hide toolbar on click outside\n const wrapperRef = React.useRef(null)\n React.useEffect(() => {\n if (!isToolbarVisible) return\n\n function handleClickOutside(event: TouchEvent | MouseEvent) {\n // Get the currently open select\n const openSelect = document.querySelector('.finviz-popover[data-enter]')\n if (wrapperRef.current?.contains(event.target as Node) || openSelect?.contains(event.target as Node)) return\n setIsToolbarVisible(false)\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('touchstart', handleClickOutside)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('touchstart', handleClickOutside)\n }\n }, [isToolbarVisible])\n\n const handleDrawingActionClick = (actionId: DrawingActions) => {\n onDrawingActionClick?.(actionId)\n setIsToolbarVisible(false)\n }\n\n if (!toolbarMobileElement) return null\n\n return ReactDOM.createPortal(\n <>\n \n \n \n {urlSearchParams.has(SIDEBAR_QUERY_PARAM) || activeTool === DrawingTool.Mouse ? (\n {\n setIsToolbarVisible(true)\n setUrlSearchParams((params) => {\n params.delete(SIDEBAR_QUERY_PARAM)\n return params\n })\n }}\n >\n Draw\n \n ) : (\n {\n setIsToolbarVisible(true)\n }}\n />\n )}\n ,\n toolbarMobileElement\n )\n}\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\n\ninterface LoadLatestDataButtonProps {\n chartLayoutModel: ChartLayout\n}\n\nexport function AutoSaveStateIndicator({ chartLayoutModel }: LoadLatestDataButtonProps) {\n const drawingsInternalStoreUnwatched = React.useMemo(\n () => chartLayoutModel.drawingsInternalStore(),\n [chartLayoutModel]\n )\n const { autoSaveState } = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['autoSaveState'] })!\n const [isVisible, setIsVisible] = React.useState(false)\n\n React.useEffect(() => {\n if (autoSaveState === AutoSaveState.Off) {\n return\n }\n\n let setVisibilityTimeout: NodeJS.Timeout | null = null\n const newIsVisible = autoSaveState !== AutoSaveState.Saved\n\n setVisibilityTimeout = setTimeout(\n () => {\n setIsVisible(newIsVisible)\n },\n newIsVisible ? 0 : 3000\n )\n\n const checkIfNeededPreventLeaving = (event: BeforeUnloadEvent) => {\n if (autoSaveState === AutoSaveState.Saved) {\n return undefined\n }\n\n const message = `Your latest changes haven't been saved yet. If you leave now, your changes might be lost.`\n event.returnValue = message\n return message\n }\n\n window.addEventListener('beforeunload', checkIfNeededPreventLeaving)\n\n return () => {\n window.removeEventListener('beforeunload', checkIfNeededPreventLeaving)\n if (setVisibilityTimeout) {\n clearTimeout(setVisibilityTimeout)\n }\n }\n }, [autoSaveState])\n\n if (!isVisible) {\n return null\n }\n\n // @todo - add proper indicator component here\n return null\n}\n","import React from 'react'\n\nimport { Textarea } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { isRedesignEnabled } from '../../utils'\nimport { useDrawingAutoSaveControls } from '../autosave/use-drawing-auto-save-controls'\n\ninterface Props {\n chartLayoutModel: ChartLayout\n ideaNoteRef?: React.RefObject\n}\n\nconst hasRedesign = isRedesignEnabled()\n\nexport function ChartLayoutAutoSaveNote({ chartLayoutModel: chartLayoutModelUnwatched, ideaNoteRef }: Props) {\n const chartLayoutModel = useModelState(chartLayoutModelUnwatched, {\n watchProperties: ['idea'],\n })!\n const { handleIdeaNoteChange } = useDrawingAutoSaveControls(chartLayoutModel)\n\n if (!chartLayoutModel.editable) {\n return null\n }\n\n return (\n
\n {!hasRedesign &&
Note:
}\n
\n ) => {\n handleIdeaNoteChange(e.target.value)\n }}\n />\n
\n
\n )\n}\n","import React from 'react'\n\nimport { getExtendedDialogState, useDialogState } from '../../components'\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\nimport ChartLayout from '../../models/chart_layout'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\n\ninterface PublishOldButtonClickListenerProps {\n isListening: boolean\n layoutModel: ChartLayout\n}\n\nexport function getPublishChartHtmlElements() {\n const publishChartElements = document.getElementsByClassName('js-publish-chart')\n const publishChartHtmlElements = Array.from(publishChartElements) as HTMLElement[]\n\n return publishChartHtmlElements\n}\n\nfunction getChartImgUrl(index: number) {\n const imgElement = document.getElementById(`chart${index}`) as HTMLImageElement | null\n return imgElement?.src ?? null\n}\n\nexport function PublishOldButtonClickListener({ isListening, layoutModel }: PublishOldButtonClickListenerProps) {\n const dialog = useDialogState()\n const { isFullyClosed } = getExtendedDialogState(dialog)\n const [dialogConfig, setDialogConfig] = React.useState({\n isCanvas: true,\n chartImgUrl: null as null | string,\n timeframe: '',\n ticker: '',\n })\n const [publishModalModule] = useAsyncModule({\n ...publishModalAsyncModule,\n shouldLoadModule: !isFullyClosed,\n })\n const PublishDialog = publishModalModule?.default\n\n React.useEffect(() => {\n const publishChartHtmlElements = getPublishChartHtmlElements()\n const clickHandler = (event: MouseEvent) => {\n const { index, ticker, timeframe } = (event.currentTarget as HTMLElement).dataset\n if (index && ticker && timeframe) {\n const indexInt = Number.parseInt(index)\n setDialogConfig({\n ticker,\n timeframe,\n isCanvas: indexInt === 0,\n chartImgUrl: indexInt > 0 ? getChartImgUrl(indexInt) : null,\n })\n dialog.show()\n }\n }\n\n if (isListening) {\n publishChartHtmlElements.forEach((el) => {\n el.addEventListener('click', clickHandler)\n })\n }\n\n return () => {\n publishChartHtmlElements.forEach((el) => {\n el.removeEventListener('click', clickHandler)\n })\n }\n }, [dialog, isListening])\n\n return PublishDialog ? : null\n}\n","import React from 'react'\n\nimport { Button, Dialog, DialogBody, DialogFooter, DialogHeader, Paragraph } from '../../components'\n\nexport enum IdeaDrawingsConfirmationOptions {\n Merge,\n Override,\n Nothing,\n Cancel,\n}\n\ninterface IIdeaLeaveDialog {\n state: any\n actionCallback: (action: IdeaDrawingsConfirmationOptions) => void\n}\n\nexport function IdeaLeaveDialog({ actionCallback, state }: IIdeaLeaveDialog) {\n return (\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)}\n finalFocusRef={{ current: document.body }}\n >\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)}>\n You’re About to Leave your Idea\n \n \n
\n What would you like to do with the drawings from your current Idea?\n \n Replace Drawings\n
\n Your Autosaved Drawings for this ticker will be deleted, and the Idea Drawings will be copied to the live\n chart.\n
\n \n Combine Drawings\n
\n The Idea Drawings will be copied to the live chart without changing the positions or settings of any\n Autosaved Drawings. This may cause duplicates if some drawings were also autosaved.\n
\n \n Do Nothing\n
\n Close the idea without changing any Autosaved Drawings.\n
\n
\n
\n \n actionCallback(IdeaDrawingsConfirmationOptions.Override)}\n >\n Replace\n \n actionCallback(IdeaDrawingsConfirmationOptions.Merge)}\n >\n Combine\n \n actionCallback(IdeaDrawingsConfirmationOptions.Nothing)}\n >\n Do Nothing\n \n \n \n )\n}\n","import * as dateFns from 'date-fns'\nimport React from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { useDialogState } from '../../components'\nimport {\n ChartElementType,\n ChartsOrQuotePageQueryParams,\n ChartsPageQueryParams,\n QuotePageQueryChartTypes,\n QuotePageQueryParams,\n SpecificChartFunctionality,\n TIMEFRAME,\n} from '../../constants/common'\nimport Chart from '../../models/chart'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport { getRawTickerForInstrument } from '../../models/utils'\nimport utils from '../../utils'\nimport { getInstrument, handleTypeChange } from '../../utils/chart'\nimport { getUuid } from '../../utils/helpers'\nimport { initHlc } from '../../utils/hlc'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\nimport { useTrackPageView } from '../../website-shared'\nimport { IdeaLeaveDialog } from '../autosave/idea-leave-dialog'\nimport { IdeaDrawingsConfirmationOptions } from '../autosave/idea-leave-dialog'\nimport { useDrawingAutoSaveApi } from '../autosave/use-drawing-autosave-api'\nimport { getTickersAndContainerTypesInLayoutModel, handleCallMethodOnAllDrawings } from '../autosave/utils'\nimport { getChartElementTypeFromResponseType } from '../utils'\n\nconst getChartElementTypeFromQueryType = (queryType: QuotePageQueryChartTypes | null) => {\n switch (queryType) {\n case QuotePageQueryChartTypes.l:\n return ChartElementType.LineChart\n case QuotePageQueryChartTypes.hc:\n return ChartElementType.HollowCandleStick\n case QuotePageQueryChartTypes.ha:\n return ChartElementType.HeikinAshi\n case QuotePageQueryChartTypes.o:\n return ChartElementType.OhlcChart\n case QuotePageQueryChartTypes.p:\n return ChartElementType.PerfChart\n case QuotePageQueryChartTypes.c:\n case QuotePageQueryChartTypes.cs:\n return ChartElementType.CandleStick\n default:\n return (\n getChartElementTypeFromResponseType(window.FinvizSettings?.TA?.style ?? null) ?? ChartElementType.CandleStick\n )\n }\n}\n\nconst useChartRouteChange = (chartLayoutModel: ChartLayoutModel | null) => {\n useTrackPageView({ trackInitial: false })\n const location = useLocation()\n const navigate = useNavigate()\n const { deleteAllDrawings } = useDrawingAutoSaveApi()\n const dialog = useDialogState()\n\n const isQuotePage = chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isChartPage = chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isFuturesForexCryptoPage = [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(chartLayoutModel?.specificChartFunctionality as SpecificChartFunctionality)\n\n React.useEffect(() => {\n if (isChartPage) {\n utils.setCookie(\n 'chartsUrl',\n `?${encodeQueryString({ ...decodeQueryString(location.search), i: undefined, settings: undefined })}`,\n dateFns.add(new Date(), { months: 1 })\n )\n }\n }, [isChartPage, location.search])\n\n React.useEffect(() => {\n const decodedQueryString = decodeQueryString(location.search)\n // We can navigate to idea chart without a refresh e.g. using browser back button\n // It breaks charts because we don't have idea data & idea quote anymore\n // So if we end up on a page with idea in the url and we don't have any idea data in chartLayout model we'll refresh the page\n if (chartLayoutModel && decodedQueryString.i && !chartLayoutModel.idea?.id) {\n window.location.reload()\n }\n // No need to have chartLayoutModel as dependecny here , I'm only interested in idea on the model\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [location.search, chartLayoutModel?.idea?.id])\n\n const updateChartConfig = React.useCallback(() => {\n if (!chartLayoutModel) return\n\n const decodedSearch = decodeQueryString(location.search)\n\n const urlType = (decodedSearch as QuotePageQueryParams).ty ?? null\n handleTypeChange({\n type: getChartElementTypeFromQueryType(urlType),\n chartLayoutModel,\n })\n\n if (isChartPage && chartLayoutModel.layout !== (decodedSearch as ChartsPageQueryParams).l) {\n chartLayoutModel.updateAttributes({ layout: (decodedSearch as ChartsPageQueryParams).l })\n }\n\n chartLayoutModel.getAllCharts().forEach((chartModel, chartIndex) => {\n const urlTicker = decodedSearch.t.split(',')[chartIndex] ?? null\n const urlTimeframe = decodedSearch.p?.split(',')[chartIndex] ?? null\n const urlDateRange = decodedSearch.r?.split(',')[chartIndex] ?? null\n const upperCaseTicker = urlTicker?.toUpperCase()\n\n /**\n * Only Charts page charts can change instruments. Other pages need forced\n * instrument because we might not be able to guess it from urlTicker\n */\n let instrument = getInstrument(upperCaseTicker)\n if (chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage) {\n instrument = chartModel.instrument\n }\n\n const newChartConfig = {\n instrument,\n ticker: getRawTickerForInstrument(instrument, upperCaseTicker),\n timeframe: urlTimeframe,\n dateRange: urlDateRange,\n }\n\n if (Object.entries(newChartConfig).some(([key, value]) => chartModel[key as keyof Chart] !== value)) {\n chartModel.updateAttributesAndSync(newChartConfig)\n }\n })\n }, [chartLayoutModel, location.search, isChartPage])\n\n React.useEffect(() => {\n const decodedSearch = decodeQueryString(location.search)\n\n if (\n !chartLayoutModel ||\n !decodedSearch.p ||\n !decodedSearch.t ||\n !(isQuotePage || isChartPage || isFuturesForexCryptoPage)\n ) {\n if (!decodedSearch.p && isQuotePage) {\n navigate(\n {\n search: `?${encodeQueryString({\n ...decodedSearch,\n p: window.FinvizSettings.defaultPeriod ?? TIMEFRAME.d,\n r: window.FinvizSettings.defaultDateRange,\n })}`,\n },\n {\n replace: true,\n }\n )\n }\n return\n }\n if (chartLayoutModel.idea?.id && dialog.visible) {\n dialog.hide()\n }\n\n if (!decodedSearch.i && chartLayoutModel.idea?.id) {\n const urlTicker = decodedSearch.t.split(',')\n const isSameTicker = chartLayoutModel\n .getAllCharts()\n .every((chart, i) => chart.getQuoteRawTicker() === urlTicker[i])\n\n if (isSameTicker && window.FinvizSettings.hasUserPremium && chartLayoutModel.isPreserveDrawingsActive) {\n dialog.show()\n return\n }\n if (!chartLayoutModel.isPreserveDrawingsActive || !isSameTicker) {\n handleCallMethodOnAllDrawings({ chartLayoutModel, elementMethod: 'destroyCascade' })\n }\n chartLayoutModel.exitIdea()\n }\n updateChartConfig()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n location.search,\n dialog.show,\n navigate,\n chartLayoutModel,\n isQuotePage,\n isChartPage,\n isFuturesForexCryptoPage,\n updateChartConfig,\n ])\n\n const handleIdeaLeave = React.useCallback(\n async (action: IdeaDrawingsConfirmationOptions) => {\n if (!chartLayoutModel) return\n if (action === IdeaDrawingsConfirmationOptions.Cancel) {\n navigate(-1)\n return\n }\n switch (action) {\n case IdeaDrawingsConfirmationOptions.Merge: {\n handleCallMethodOnAllDrawings({\n chartLayoutModel,\n elementMethod: 'refreshElementId',\n })\n break\n }\n case IdeaDrawingsConfirmationOptions.Override: {\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayoutModel)\n await deleteAllDrawings({ tickers, lastLocalChange: initHlc(getUuid(), Date.now()) })\n break\n }\n case IdeaDrawingsConfirmationOptions.Nothing: {\n handleCallMethodOnAllDrawings({\n chartLayoutModel,\n elementMethod: 'destroyCascade',\n })\n break\n }\n default:\n break\n }\n chartLayoutModel.exitIdea()\n updateChartConfig()\n dialog.hide()\n },\n [dialog, chartLayoutModel, updateChartConfig, deleteAllDrawings, navigate]\n )\n\n return {\n dialog,\n handleIdeaLeave,\n }\n}\n\nfunction getChartLayoutWithChartRouteChange

(\n Component: React.ComponentType

\n) {\n return function WrappedComponent(props: P) {\n const { dialog, handleIdeaLeave } = useChartRouteChange(props.chartLayoutModel)\n return (\n <>\n \n \n \n )\n }\n}\n\nexport function withChartRouteChange

(\n Component: React.ComponentType

\n) {\n // Chart layout is used in ReactRouter context and also outside of RR context\n // if we use RR hooks outside the context it will crash so this function will return different component for quote & chart pages than for other usecases\n const ChartLayoutComponent = getChartLayoutWithChartRouteChange(Component)\n return function WrappedComponent(props: P) {\n const { ty } = decodeQueryString()\n const isChartPage = props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isQuotePage = props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isFuturesForexCryptoPage = [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(props.chartLayoutModel.specificChartFunctionality)\n if (isChartPage || (isQuotePage && ty !== 'p') || isFuturesForexCryptoPage) {\n return \n }\n\n return \n }\n}\n","import merge from 'lodash.merge'\nimport React from 'react'\n\nimport { RootChartConfigObject, Theme } from '../../../types/shared'\nimport {\n ChartEditorEnum,\n MOBILE_BARS_TO_VIEW,\n MOBILE_VIEW_BREAKPOINT_WIDTH,\n SpecificChartFunctionality,\n} from '../../constants/common'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport DrawingsInternalStore from '../../models/drawings-internal-store'\nimport { getSettings } from '../../models/settings'\nimport utils, { isRedesignedPage } from '../../utils'\nimport { getIsPreserveDrawingsAndAutosaveAvailable, getZoomFactorForBarsToDisplay } from '../../utils/chart'\nimport { getContainerTypeFromPaneConfig, getInitialStoreDrawings } from '../autosave/utils'\nimport { DrawingSetting } from '../toolbar/interfaces'\nimport { CHART_LAYOUT_CHILD_CHANGE_EVENT } from './constants'\n\ninterface Props {\n config: RootChartConfigObject\n onRegisterChartLayoutModel?: (chartLayoutModel: ChartLayoutModel) => void\n parentElement?: HTMLElement\n}\n\nfunction getDefaultZoomFactor(chartLayout: ChartLayoutModel) {\n const innerWidth = window.innerWidth\n if (\n innerWidth >= MOBILE_VIEW_BREAKPOINT_WIDTH ||\n chartLayout.specificChartFunctionality !== SpecificChartFunctionality.chartPage\n ) {\n return 1\n }\n\n return getZoomFactorForBarsToDisplay({\n chartLayout,\n numOfVisibleBars: MOBILE_BARS_TO_VIEW,\n chartVisibleWidth: innerWidth,\n })\n}\n\nfunction OnInitListener({\n chartLayoutModel,\n config,\n onRegisterChartLayoutModel,\n parentElement,\n}: Props & { chartLayoutModel: ChartLayoutModel; parentElement?: HTMLElement }) {\n const [isInit, setIsInit] = React.useState(false)\n\n /*\n * This entire effect is used to check for updates in entire chart layout obj tree.\n * Once config object matches object generated from chart layout, the layout model is completely initialised.\n *\n * We couldn't just add a callback to `componentDidMount` (or equivalent) because its children are rendered asynchronously.\n *\n * */\n React.useEffect(() => {\n if (onRegisterChartLayoutModel && chartLayoutModel && !isInit) {\n const checkIfInitIsComplete = () => {\n const { charts } = chartLayoutModel.toConfig()\n const isReady =\n charts.length === config.charts.length &&\n charts.every(\n (chart, chartIndex) =>\n chart.panes.length === config.charts[chartIndex].panes.length &&\n chart.panes.every(\n (pane, paneIndex) =>\n pane.elements.length === config.charts[chartIndex].panes[paneIndex].elements.length &&\n pane.elements.every(\n (element, elementIndex) =>\n element.overlays?.length ===\n config.charts[chartIndex].panes[paneIndex].elements[elementIndex].overlays?.length\n )\n )\n )\n\n if (isReady) {\n setIsInit(true)\n chartLayoutModel.updateAttributes({ isInit: true })\n onRegisterChartLayoutModel(chartLayoutModel)\n if (parentElement) {\n parentElement.style.opacity = 'unset'\n parentElement.style.minHeight = 'unset'\n }\n }\n }\n\n chartLayoutModel.bind(CHART_LAYOUT_CHILD_CHANGE_EVENT, checkIfInitIsComplete)\n\n checkIfInitIsComplete()\n\n return () => {\n chartLayoutModel.unbind(CHART_LAYOUT_CHILD_CHANGE_EVENT, checkIfInitIsComplete)\n }\n }\n }, [chartLayoutModel, config, isInit, onRegisterChartLayoutModel, parentElement])\n\n return null\n}\n\nexport const withCompleteLayoutModelInit = (Component: any) => (props: Props) => {\n const config = React.useMemo(() => {\n const newConfig = merge({}, props.config, {\n editable: props.config.editable ?? true,\n canChangeTicker: props.config.canChangeTicker ?? true,\n scrollable: props.config.scrollable ?? true,\n cross: props.config.cross ?? true,\n theme:\n props.config.theme && [Theme.light, Theme.dark].includes(props.config.theme) ? props.config.theme : Theme.light,\n editors: props.config.editors ?? [ChartEditorEnum.publish, ChartEditorEnum.tools, ChartEditorEnum.ideas],\n ideas: props.config.ideas ?? true,\n specificChartFunctionality: props.config.specificChartFunctionality ?? SpecificChartFunctionality.default,\n initialStoreDrawings: [],\n })\n\n if (!newConfig.ideas) {\n newConfig.editors = newConfig.editors.filter((x) => x !== 'ideas')\n }\n\n // We need to add these because ideas might not have them and chart controls wouldn’t render properly\n if (isRedesignedPage(newConfig, [SpecificChartFunctionality.quotePage])) {\n newConfig.editors = newConfig.editors.concat([ChartEditorEnum.settings, ChartEditorEnum.timeframe])\n }\n\n const initialStoreDrawings = getInitialStoreDrawings()?.filter(({ changeType }) => changeType !== 'destroy') ?? []\n const isQuotePage = newConfig.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isQuotePageWithDrawingsOff = isQuotePage && utils.getCookie('charts-draw') !== 'on'\n\n if (initialStoreDrawings.length === 0 || isQuotePageWithDrawingsOff) {\n return newConfig\n }\n\n const noteDrawing = initialStoreDrawings.find(\n ({ containerType, ticker }) =>\n containerType === 'note' && props.config.charts.some((chart) => chart.ticker === ticker)\n )\n\n const note = noteDrawing && JSON.parse(noteDrawing.elementAttrs)?.text\n const ideaObject = isQuotePage && note ? { note } : undefined\n\n return {\n ...newConfig,\n initialStoreDrawings,\n idea: newConfig.idea ?? ideaObject,\n charts: newConfig.charts.map((chart) => {\n const { ticker, panes } = chart\n return {\n ...chart,\n panes: panes.map((pane) => {\n const containerType = getContainerTypeFromPaneConfig(pane)\n const newElements = initialStoreDrawings\n .filter(\n (drawing) =>\n drawing.containerType === containerType &&\n drawing.ticker === ticker &&\n !pane.elements.some((paneElement) => paneElement.elementId === drawing.elementId)\n )\n .map(({ elementId, zIndex, elementAttrs }) => ({\n elementId,\n zIndex,\n ...JSON.parse(elementAttrs),\n }))\n return {\n ...pane,\n elements: [...pane.elements, ...newElements],\n }\n }),\n }\n }),\n }\n // We need to disable the eslint check because the hook is supposed to run only once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const chartLayoutModel = React.useMemo(() => {\n const settings = getSettings({ ...config, theme: config.theme! })\n const chartLayout = ChartLayoutModel.create({\n layout: config.layout,\n width: config.width,\n height: config.height,\n editable: config.editable,\n canChangeTicker: config.canChangeTicker,\n scrollable: config.scrollable,\n initialScrollable: config.scrollable,\n cross: config.cross,\n editors: config.editors,\n theme: config.theme,\n idea: config.idea,\n settings,\n isWheelZoomEnabled: config.specificChartFunctionality === SpecificChartFunctionality.chartPage,\n specificChartFunctionality: config.specificChartFunctionality,\n isHideDrawingsActive: false,\n isPreserveDrawingsActive: !!(\n getIsPreserveDrawingsAndAutosaveAvailable(config) &&\n window.FinvizSettings.toolsState?.[DrawingSetting.PreserveDrawings]\n ),\n isLockDrawingsActive: false,\n uuid: config.uuid,\n drawingsInternalStore: DrawingsInternalStore.create({\n elements: config.initialStoreDrawings,\n }),\n })\n\n chartLayout.updateAttributes({ defaultZoomFactor: getDefaultZoomFactor(chartLayout) })\n\n return chartLayout\n\n // We need to disable the eslint check because the hook is supposed to run only once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return chartLayoutModel ? (\n <>\n \n \n \n ) : null\n}\n","import debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport Chart from '../../models/chart'\nimport Quote from '../../models/quote'\n\nconst MAX_QUOTE_CACHE_TIME_IN_MS = 300000 // 5 min\n\nexport const withQuoteCacheManagement = (Component: any) => (props: any) => {\n React.useEffect(() => {\n const cleanupQuoteCache = () => {\n const allQuotes = Quote.all()\n const allCharts = Chart.all()\n const allChartQuotes = allCharts.flatMap((chart) => chart.getAllQuotes())\n\n allQuotes.forEach((quote) => {\n if (\n !allChartQuotes.some((usedQuote) => usedQuote.eql(quote)) &&\n !quote.isFetching &&\n quote.fetchedAt > -1 &&\n quote.fetchedAt < Date.now() - MAX_QUOTE_CACHE_TIME_IN_MS\n ) {\n quote.destroy()\n }\n })\n }\n\n const checkQuoteCacheDebounce = debounce(cleanupQuoteCache, 500)\n\n Quote.bind('change', checkQuoteCacheDebounce)\n return () => {\n checkQuoteCacheDebounce.cancel()\n Quote.unbind('change', checkQuoteCacheDebounce)\n }\n }, [])\n\n return \n}\n","import debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport { ObjectHash } from '../../../types/shared'\nimport { EXTRA_MARKET_BUFFER_MINUTES, QUOTE_FETCH_EVENT } from '../../constants/common'\nimport Chart from '../../models/chart'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport Pane from '../../models/pane'\nimport { QuoteFetchType } from '../../models/quote/constants'\n\ninterface Props {\n chartLayoutModel: ChartLayoutModel\n}\n\ntype PollingIntervalToChartsType = ObjectHash\n\n/*\n * This HOC loops through all charts and checks if they are supposed to be refetch in some interval\n * It creates groups of charts to be refreshed grouped by the refresh interval\n * */\nexport const withQuotePolling = (Component: any) => (props: Props) => {\n const [pollingIntervalToCharts, setPollingIntervalToCharts] = React.useState({})\n const checkForChartsWithPolling = React.useCallback(() => {\n // check for charts which have some refresh interval and group chart ids by the interval value e.g. { interval_in_ms: [id1, id2] }\n const newPollingIntervalToCharts: PollingIntervalToChartsType = {} // example { 60000: ['c-0', 'c-1'], 9000: ['c-4'] }\n props.chartLayoutModel.getAllCharts().forEach((chart) => {\n const chartRefreshInterval = chart.getRefreshInterval()\n\n if (chartRefreshInterval) {\n newPollingIntervalToCharts[chartRefreshInterval] = newPollingIntervalToCharts[chartRefreshInterval] ?? []\n newPollingIntervalToCharts[chartRefreshInterval].push(chart.id)\n }\n })\n\n if (JSON.stringify(newPollingIntervalToCharts) !== JSON.stringify(pollingIntervalToCharts)) {\n setPollingIntervalToCharts(newPollingIntervalToCharts)\n }\n }, [props.chartLayoutModel, pollingIntervalToCharts])\n const intervalIdsRef = React.useRef([])\n\n React.useEffect(() => {\n const checkForChartsWithPollingDebounced = debounce(checkForChartsWithPolling)\n const chartsCheckerIntervalId = window.setInterval(\n checkForChartsWithPollingDebounced,\n EXTRA_MARKET_BUFFER_MINUTES * 1000\n )\n\n // listen on any changes in all charts & panes and call debounced check for charts/indicators with quotes that needs to be refetched periodically\n Chart.bind('change', checkForChartsWithPollingDebounced)\n Pane.bind('change', checkForChartsWithPollingDebounced)\n\n return () => {\n checkForChartsWithPollingDebounced.cancel()\n Chart.unbind('change', checkForChartsWithPollingDebounced)\n Pane.unbind('change', checkForChartsWithPollingDebounced)\n window.clearInterval(chartsCheckerIntervalId)\n }\n }, [checkForChartsWithPolling])\n\n React.useEffect(() => {\n const timeoutDurations = Object.keys(pollingIntervalToCharts).map(Number)\n const allCharts = props.chartLayoutModel.getAllCharts()\n const timeoutDurationsMin = Math.min(...timeoutDurations)\n\n timeoutDurations.forEach((duration) => {\n const timeoutId = window.setInterval(() => {\n const chartIds = pollingIntervalToCharts[duration]\n // get all UNIQUE quotes used in charts and refetch them\n allCharts\n .filter((chart) => chartIds.includes(chart.id))\n .flatMap((chart) => chart.getAllQuotes())\n .filter(\n (quote, index, quotesToUpdate) =>\n !quote.isFetching && index === quotesToUpdate.findIndex((quoteToUpdate) => quote.eql(quoteToUpdate))\n )\n .forEach((quote) => {\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\n })\n if (duration === timeoutDurationsMin) {\n document.dispatchEvent(new Event(QUOTE_FETCH_EVENT))\n }\n }, duration)\n intervalIdsRef.current.push(timeoutId)\n })\n\n return () => {\n if (intervalIdsRef.current.length > 0) {\n intervalIdsRef.current.forEach((timeoutId) => {\n window.clearInterval(timeoutId)\n })\n intervalIdsRef.current = []\n }\n }\n }, [props.chartLayoutModel, pollingIntervalToCharts])\n\n return \n}\n","import Spine from '@finviz/spine'\nimport classnames from 'classnames'\nimport flowRight from 'lodash.flowright'\nimport merge from 'lodash.merge'\nimport throttle from 'lodash.throttle'\nimport React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport { ChartConfigObject, DrawingSpineOptionsEvent, IIdea, RootChartConfigObject } from '../../../types/shared'\nimport { ChartGrid, ChartGridCell } from '../../components'\nimport { ChartEditorEnum, LAYOUTS, LayoutType, SpecificChartFunctionality } from '../../constants/common'\nimport ChartModel from '../../models/chart'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\nimport ElementModel from '../../models/element'\nimport utils, {\n getChartsDimensions,\n getFullscreenStatus,\n getIsMobilePortrait,\n isRedesignEnabled,\n isRedesignedPage,\n} from '../../utils'\nimport { getIsPreserveDrawingsAndAutosaveAvailable, getIsSidebarEnabled } from '../../utils/chart'\nimport fetchApi from '../../utils/fetch_api'\nimport { getTickersAndContainerTypesInLayoutModel } from '../autosave/utils'\nimport { withDrawingsAutoSave } from '../autosave/with-auto-save'\nimport Chart from '../chart'\nimport { SidebarDirection } from '../sidebar/constants'\nimport { Sidebar } from '../sidebar/sidebar'\nimport Toolbar from '../toolbar'\nimport { AutoSaveNotesDialog } from '../toolbar/auto-save-notes'\nimport { ConfirmationDialog } from '../toolbar/confirmation_dialog'\nimport { DrawingActions, DrawingSetting, DrawingTool } from '../toolbar/interfaces'\nimport ToolbarMobile from '../toolbar/mobile/toolbar-mobile'\nimport { withDialogState } from '../with_dialog_state_hook'\nimport { AutoSaveStateIndicator } from './auto-save-state-indicator'\nimport { ChartLayoutAutoSaveNote } from './chart-layout-auto-save-note'\nimport { PublishOldButtonClickListener, getPublishChartHtmlElements } from './publish_old_button_click_listener'\nimport { withChartPageTitle } from './with-chart-page-title'\nimport { withChartRouteChange } from './with-chart-route-change'\nimport { withCompleteLayoutModelInit } from './with-complete-layout-model-init'\nimport { withIdeaModelState } from './with-idea-model-state'\nimport { withQuoteCacheManagement } from './with-quote-cache-management'\nimport { withQuotePolling } from './with-quote-polling'\n\ninterface ChartLayoutComponentProps {\n config: RootChartConfigObject\n confirmationDialogState: any\n noteDialogState: any\n shouldResize?: boolean\n chartLayoutModel: ChartLayoutModel\n idea?: IIdea\n deleteAllAutoSavedElements: () => void\n isAutoSaveActive: boolean\n}\n\ninterface ChartLayoutComponentState {\n editable: boolean\n editors: ChartEditorEnum[]\n layout: LayoutType\n activeChartInteraction: string | null\n touchEventsDisabled: boolean\n isToolbarHorizontal: boolean\n activeTool: DrawingTool\n drawingSettings: Record\n}\n\nclass ChartLayoutComponentBase extends React.Component {\n // expects config, bindPublic\n model: ChartLayoutModel\n isMobile = Boolean(utils.isMobile(true))\n charts: Array<{ model: ChartModel; config: ChartConfigObject }>\n orientationChangeTimeout: number | undefined\n preserveDrawingAbortController = new AbortController()\n\n constructor(props: ChartLayoutComponentProps) {\n super(props)\n\n this.model = props.chartLayoutModel\n const config = props.config\n\n this.charts = []\n for (const chartConfig of config.charts) {\n const modelProperties: Partial = merge({}, chartConfig)\n\n modelProperties.chart_layout = this.model\n delete modelProperties.panes\n if (modelProperties.zoomFactor == null) {\n modelProperties.zoomFactor = this.model.defaultZoomFactor\n }\n if (modelProperties.refreshData == null) {\n modelProperties.refreshData = true\n }\n if (!modelProperties.dateRange) {\n modelProperties.dateRange = null\n }\n modelProperties.isHideDrawingsActive = this.model.isHideDrawingsActive\n modelProperties.isScrolled = false\n const model = this.model.charts().create(modelProperties)\n this.charts.push({ model, config: chartConfig })\n }\n this.model.updateAttribute('activeChart', this.model.charts().first())\n\n this.state = {\n editable: this.model.editable,\n editors: this.model.editors,\n layout: this.model.layout,\n activeChartInteraction: null,\n activeTool: DrawingTool.Mouse,\n touchEventsDisabled: false,\n isToolbarHorizontal: true,\n drawingSettings: {\n [DrawingSetting.DrawingModeContinuous]: false,\n [DrawingSetting.PreserveDrawings]: this.handleInitialPreserveDrawingsState(),\n [DrawingSetting.HideDrawings]: false,\n [DrawingSetting.LockDrawings]: false,\n },\n }\n }\n\n componentDidMount() {\n if (this.state.editable) {\n const DELETE = 46\n window.addEventListener('keyup', (e) => {\n const selected = this.model.getPaneWithSelection()\n if (e.keyCode === DELETE && selected) {\n const element = ElementModel.findByAttribute('instance', selected.selection)\n if (element) {\n const elementPane = element.pane()\n element.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\n elementPane.normalizeZIndexes()\n }\n }\n })\n }\n\n if (this.isMobile) {\n this.model.settings.ThumbSettings.size = this.model.settings.ThumbSettings.touchSize\n }\n\n this.onModelChange()\n\n this.model.bind('change', this.onModelChange)\n this.model.charts().bind('destroy', this.onChartDestroy)\n\n this.setToolbarPosition()\n window.addEventListener('resize', this.onWindowResize)\n window.addEventListener('orientationchange', this.handleOrientationChange)\n\n if (this.isMobile) {\n this.checkTouchEventsDisabled()\n window.addEventListener('touchend', this.checkTouchEventsDisabled)\n }\n }\n\n componentDidUpdate(prevProps: Readonly): void {\n if (prevProps.idea && !this.props.idea) {\n if (this.model.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n this.onWindowResize()\n }\n document.querySelector('#idea-title-container')?.remove()\n }\n\n this.setToolbarPosition()\n }\n\n componentWillUnmount() {\n this.preserveDrawingAbortController.abort()\n this.model.unbind('change', this.onModelChange)\n\n window.removeEventListener('resize', this.onWindowResize)\n window.removeEventListener('orientationchange', this.handleOrientationChange)\n\n if (this.isMobile) {\n window.removeEventListener('touchend', this.checkTouchEventsDisabled)\n }\n\n clearTimeout(this.orientationChangeTimeout)\n this.throttledResize.cancel()\n this.model.destroyCascade()\n }\n\n handleInitialPreserveDrawingsState = () => {\n let preserveDrawings = false\n if (getIsPreserveDrawingsAndAutosaveAvailable(this.model)) {\n if (window.FinvizSettings.toolsState?.[DrawingSetting.PreserveDrawings] !== undefined) {\n preserveDrawings = window.FinvizSettings.toolsState[DrawingSetting.PreserveDrawings]\n } else {\n this.handlePreserveDrawingsSettings()\n }\n }\n this.model.updateAttribute('isPreserveDrawingsActive', preserveDrawings)\n return preserveDrawings\n }\n\n handlePreserveDrawingsSettings = async (value?: boolean) => {\n const setPreserveDrawings = (val: boolean) => {\n this.model.updateAttribute('isPreserveDrawingsActive', val)\n this.setState((prevState) => ({\n drawingSettings: {\n ...prevState.drawingSettings,\n [DrawingSetting.PreserveDrawings]: val,\n },\n }))\n }\n\n try {\n this.preserveDrawingAbortController.abort()\n this.preserveDrawingAbortController = new AbortController()\n const response = await fetchApi({\n location: '/api/tools_state.ashx',\n method: value !== undefined ? 'POST' : 'GET',\n body:\n value !== undefined\n ? new URLSearchParams({ tools_state: JSON.stringify({ [DrawingSetting.PreserveDrawings]: value }) })\n : undefined,\n throwOnStatusCodes: [404],\n abortController: this.preserveDrawingAbortController,\n })\n\n if (value === undefined && response?.[DrawingSetting.PreserveDrawings] !== undefined) {\n setPreserveDrawings(response[DrawingSetting.PreserveDrawings])\n }\n } catch {\n if (value !== undefined) {\n setPreserveDrawings(!value)\n }\n }\n }\n\n handleOrientationChange = () => {\n this.orientationChangeTimeout = window.setTimeout(() => {\n this.setToolbarPosition()\n if (this.props.shouldResize) {\n this.handleResize()\n }\n })\n }\n\n onWindowResize = () => {\n this.setToolbarPosition()\n\n if (this.props.shouldResize) {\n this.throttledResize()\n }\n }\n\n handleResize = () => {\n const modelAttrs: Partial = getChartsDimensions(this.model.getHTMLElementId())\n this.model.updateAttributes(modelAttrs)\n }\n\n throttledResize = throttle(this.handleResize, 200)\n\n setToolbarPosition() {\n // quote page toolbar\n // 210px represents: (20px (toolbar left margin) + 80px (toolbar width) + 5px (toolbar rigth margin)) * 2 (both sides of chart)\n const newIsToolbarHorizontal = this.model.width + 210 > window.innerWidth || window.innerWidth < 1000\n if (newIsToolbarHorizontal !== this.state.isToolbarHorizontal) {\n this.setState({\n isToolbarHorizontal: newIsToolbarHorizontal,\n })\n }\n }\n\n checkTouchEventsDisabled = () => {\n if (!/\\bcharts\\b/.test(window.location.pathname) || getFullscreenStatus() || this.getVisualViewportScale() === 1) {\n this.state?.touchEventsDisabled && this.setState({ touchEventsDisabled: false })\n } else {\n !this.state?.touchEventsDisabled && this.setState({ touchEventsDisabled: true })\n }\n }\n\n getVisualViewportScale = () => {\n if (process.env.IS_E2E_TESTING) {\n return 1\n }\n if (window.visualViewport && this.isMobile) {\n return window.visualViewport.scale\n } else {\n return 1\n }\n }\n\n handleActiveToolChange = (activeTool: DrawingTool) => {\n if (!this.model.isLockDrawingsActive) {\n this.setState({ activeTool })\n }\n }\n\n handleDrawingAction = (actionId: DrawingActions) => {\n switch (actionId) {\n case DrawingActions.AddNote:\n this.props.noteDialogState.toggle()\n break\n case DrawingActions.DeleteDrawings:\n case DrawingActions.DeleteAutoSavedDrawings:\n this.props.confirmationDialogState.show()\n break\n default:\n return\n }\n }\n\n handleConfirmationDialogCloseBtn = () => {\n this.props.confirmationDialogState.hide()\n }\n\n handleConfirmationDialogDeleteBtn = () => {\n if (this.model.drawingsInternalStore().autoSaveState !== AutoSaveState.Off) {\n this.props.deleteAllAutoSavedElements()\n }\n this.model.getAllElements().forEach((element) => element.isDrawing() && element.destroyCascade())\n this.handleConfirmationDialogCloseBtn()\n }\n\n handleDrawingsSetting = (settingId: DrawingSetting) => {\n const newObj = { ...this.state.drawingSettings, [settingId]: !this.state.drawingSettings[settingId] }\n\n switch (settingId) {\n case DrawingSetting.HideDrawings:\n this.handleActiveToolChange(DrawingTool.Mouse)\n this.toggleHideDrawings(newObj[DrawingSetting.HideDrawings])\n this.handleLockDrawings(newObj)\n break\n case DrawingSetting.PreserveDrawings:\n this.handlePreserveDrawingsSettings(newObj[DrawingSetting.PreserveDrawings])\n this.model.updateAttribute('isPreserveDrawingsActive', newObj[DrawingSetting.PreserveDrawings])\n break\n case DrawingSetting.LockDrawings:\n this.handleActiveToolChange(DrawingTool.Mouse)\n this.handleLockDrawings(newObj)\n break\n case DrawingSetting.DrawingModeContinuous:\n this.model.updateAttribute('isDrawingModeContinuousActive', newObj[DrawingSetting.DrawingModeContinuous])\n newObj[DrawingSetting.DrawingModeContinuous] === false && this.handleActiveToolChange(DrawingTool.Mouse)\n break\n default:\n break\n }\n\n this.setState({ drawingSettings: newObj })\n window.gtag?.('event', 'drawings_settings_toggle', {\n event_category: newObj[settingId] ? 'enable' : 'disable',\n event_label: settingId,\n })\n }\n\n handleLockDrawings = (drawingSettings: Record) => {\n this.model.updateAttribute(\n 'isLockDrawingsActive',\n !(!drawingSettings[DrawingSetting.HideDrawings] && !drawingSettings[DrawingSetting.LockDrawings])\n )\n }\n\n toggleHideDrawings(value: boolean) {\n this.model.updateAttribute('isHideDrawingsActive', value)\n this.model.getAllCharts().forEach((chart) => chart.updateAttribute('isHideDrawingsActive', value))\n }\n\n renderToolbar(args: any) {\n const { activeTool, drawingSettings } = this.state\n return args.isOverlayToolbar ? (\n \n ) : (\n \n )\n }\n\n render() {\n const { newCharts, useGrid } = this.props.config\n const { activeTool, editable, editors, isToolbarHorizontal } = this.state\n const publish = editors.includes(ChartEditorEnum.publish) && getPublishChartHtmlElements().length > 0\n const chartLayout = LAYOUTS[this.model.layout]\n const isMobilePortrait = getIsMobilePortrait(this.isMobile)\n const { tickers } = getTickersAndContainerTypesInLayoutModel(this.model)\n\n if (newCharts) {\n const isSidebarEnabled = getIsSidebarEnabled(SpecificChartFunctionality.chartPage)\n return (\n <>\n

\n {!isMobilePortrait &&\n // Due safari iOS flex-column bug not resizing height properly we need to render toolbar\n // outside of flex for portrait and inside for landscape\n // https://github.com/finvizhq/charts/pull/784\n this.renderToolbar({\n isSidebar: true,\n isHorizontal: false,\n })}\n \n \n \n {this.charts.map(({ model, config }, index) => (\n }\n gridArea={chartLayout.gridAreas?.[index]}\n setActiveChartInteraction={this.setActiveChartInteraction}\n activeTool={activeTool}\n activeChartInteraction={this.state.activeChartInteraction}\n touchEventsDisabled={this.state.touchEventsDisabled}\n shouldResize={this.props.shouldResize}\n />\n ))}\n \n \n
\n {isMobilePortrait && isSidebarEnabled && (\n \n )}\n {isMobilePortrait &&\n this.renderToolbar({\n isSidebar: false,\n isHorizontal: true,\n isOverlayToolbar: isSidebarEnabled,\n })}\n {this.props.idea?.note && (\n
\n
\n {this.props.idea.note}\n
\n
\n )}\n \n )\n }\n\n const hasRedesign = isRedesignEnabled()\n const hasChartTools = editable && editors.includes(ChartEditorEnum.tools)\n const renderTools = isRedesignedPage(this.model) ? hasChartTools && !isToolbarHorizontal : hasChartTools\n\n const ideaTitleContainer = document.querySelector('#idea-title-container')\n const ideaTitle = this.props.idea?.date &&\n this.model.specificChartFunctionality === SpecificChartFunctionality.quotePage && (\n

{`Your idea from ${this.props.idea.date}`}

\n )\n\n return (\n <>\n {ideaTitleContainer ? ReactDOM.createPortal(ideaTitle, ideaTitleContainer) : ideaTitle}\n \n {renderTools && (\n \n {this.renderToolbar({\n isHorizontal: isToolbarHorizontal,\n isAlternativeTheme: true,\n })}\n \n )}\n \n \n {this.charts.map(({ model, config }, index) => (\n \n this.renderToolbar({\n isHorizontal: true,\n isAlternativeTheme: true,\n })\n : undefined\n }\n />\n ))}\n \n
\n
\n
\n {this.model.specificChartFunctionality === SpecificChartFunctionality.quotePage && (\n \n )}\n \n \n )\n }\n\n setActiveChartInteraction = (value: string | null) => {\n this.setState({ activeChartInteraction: value })\n }\n\n updateLayout() {\n const layout = LAYOUTS[this.model.layout]\n const charts = this.model.charts().all()\n if (charts.length === 0) {\n return\n }\n\n if (charts.length > layout.count) {\n this.removeCharts(layout.count)\n } else if (charts.length < layout.count) {\n this.addCharts(layout.count - charts.length)\n }\n\n this.model\n .charts()\n .all()\n .forEach((chart, index) => {\n const [rowStart, columnStart, rowEnd, columnEnd] =\n layout.gridAreas?.[index]\n .replace(/ /g, '')\n .split('/')\n .map((num) => Number.parseInt(num)) || []\n const numOfRowsCovered = [rowEnd, rowStart].every((value) => value !== undefined) ? rowEnd - rowStart : 1\n const numOfColumnsCovered = [columnStart, columnEnd].every((value) => value !== undefined)\n ? columnEnd - columnStart\n : 1\n const percentageOfRowsCovered = numOfRowsCovered / layout.rows\n const percentageOfColumnsCovered = numOfColumnsCovered / layout.columns\n const newWidth = ~~(this.model.width * percentageOfColumnsCovered)\n const isChartPage = this.model.specificChartFunctionality === SpecificChartFunctionality.chartPage\n const chartLayoutHeight = isChartPage\n ? this.model.height\n : this.model.charts().first().height || this.model.height\n let newHeight = ~~(chartLayoutHeight * percentageOfRowsCovered)\n\n if (this.model.editors.includes(ChartEditorEnum.settings) && isChartPage) {\n newHeight -= this.model.settings.ChartSettings.general.settingsHeight\n }\n if ((chart.width !== newWidth || chart.height !== newHeight) && newWidth > 0 && newHeight > 0) {\n chart.updateAttributes({ width: newWidth, height: newHeight })\n }\n })\n }\n\n addCharts(count: number) {\n const quote = this.model.charts().last().quote()\n if (!quote) return\n const config = {\n ...this.model.charts().last().toObject(),\n leftOffset: null,\n chart_layout: this.model,\n aftermarket: quote.aftermarket,\n premarket: quote.premarket,\n }\n for (let i = 0; i < count; i++) {\n const model = this.model.charts().create(config)\n this.charts.push({ model, config })\n }\n }\n\n removeCharts(wantedCount: number) {\n while (this.model.charts().count() > wantedCount) {\n const chart = this.model.charts().last()\n chart.destroyCascade()\n this.charts.pop()\n }\n }\n\n onChartDestroy = (chartModel: ChartModel) => {\n this.updateLayout()\n if (this.model.activeChart?.eql(chartModel)) {\n this.model.updateAttribute('activeChart', this.model.charts().last())\n }\n }\n\n onModelChange = (layoutModel?: ChartLayout, event?: Spine.Event) => {\n if (event === 'refresh') {\n return\n }\n this.updateLayout()\n\n if (layoutModel && event === 'update') {\n this.setState({\n editable: layoutModel.editable,\n editors: layoutModel.editors,\n layout: layoutModel.layout,\n })\n }\n }\n}\n\nexport const ChartLayoutComponent = flowRight(\n withQuoteCacheManagement,\n withDialogState,\n withCompleteLayoutModelInit,\n withChartPageTitle,\n withChartRouteChange,\n withIdeaModelState,\n withQuotePolling,\n withDrawingsAutoSave\n)(ChartLayoutComponentBase)\n","import React from 'react'\n\nimport { useDialogState } from '../components'\n\nexport const withDialogState = (Component: any) => (props: any) => {\n const confirmationDialogState = useDialogState()\n const noteDialogState = useDialogState({ modal: false })\n\n return \n}\n","import * as React from 'react'\n\nimport { SpecificChartFunctionality, TIMEFRAME } from '../../constants/common'\nimport math from '../../helpers/math'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport Quote from '../../models/quote'\n\nfunction useChartPageTitle() {\n const defaultDocumentTitleRef = React.useRef(document.title)\n\n const { current: updateChartsTitle } = React.useRef((chartLayoutModel: ChartLayoutModel) => {\n const charts = chartLayoutModel\n .getAllCharts()\n .reduce(\n (acc, current) => {\n if (acc.some(({ ticker }) => ticker === current.ticker)) {\n return acc\n }\n return [...acc, { ticker: current.ticker, timeframe: current.timeframe, instrument: current.instrument }]\n },\n [] as Array<{ ticker: string; timeframe: TIMEFRAME; instrument: string }>\n )\n .map((chart) => {\n const { ticker, timeframe, instrument } = chart\n const quotes = Quote.select(\n (quote: Quote) =>\n quote.ticker === ticker.replace('@', '') &&\n quote.timeframe === timeframe &&\n quote.instrument === instrument &&\n chartLayoutModel.isIdeaId(quote.ideaID)\n )\n if (quotes.length > 0) {\n const { lastClose, instrument, afterClose, prevClose, name } = quotes[0]\n let percentageChange: number\n if (!lastClose) {\n return null\n }\n if (prevClose !== null) {\n percentageChange = (lastClose / prevClose - 1) * 100\n }\n if (afterClose !== null && afterClose !== lastClose) {\n percentageChange = (afterClose / lastClose - 1) * 100\n }\n return `${name || ticker} ${math.round({\n value: lastClose,\n lastClose,\n instrument,\n overridePlaces: undefined,\n })} ${percentageChange! > 0 ? '+' : '-'}${math.round({\n value: Math.abs(percentageChange!),\n overridePlaces: 2,\n })}%`\n }\n return null\n })\n .filter((chart) => chart !== null)\n\n if (charts && charts.length > 0) {\n const title = charts.join(' | ')\n if (document.title !== title) {\n document.title = title\n }\n } else if (document.title !== defaultDocumentTitleRef.current) {\n document.title = defaultDocumentTitleRef.current\n }\n })\n\n return { updateChartsTitle }\n}\n\nexport function withChartPageTitle

(\n Component: React.ComponentType

\n) {\n return function WrappedComponent(props: P) {\n const { updateChartsTitle } = useChartPageTitle()\n\n const handleChartsUpdate = React.useCallback(() => {\n updateChartsTitle(props.chartLayoutModel)\n }, [props.chartLayoutModel, updateChartsTitle])\n\n React.useEffect(() => {\n if (props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n props.chartLayoutModel.charts().bind('change', handleChartsUpdate)\n\n handleChartsUpdate()\n\n return () => {\n props.chartLayoutModel.charts().unbind('change', handleChartsUpdate)\n }\n }\n }, [props.chartLayoutModel, handleChartsUpdate])\n\n return \n }\n}\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayoutModel from '../../models/chart_layout'\n\nexport function withIdeaModelState

(\n Component: React.ComponentType

\n) {\n return function WrappedComponent(props: P) {\n const chartLayoutModel = useModelState(props.chartLayoutModel, { watchProperties: ['idea'] })\n return \n }\n}\n","import React from 'react'\n\nimport { RootChartConfigObject } from '../../../types/shared'\nimport { NotificationWrapper } from '../../components'\nimport { ElementStyleDialogWrapper } from '../../modals/element_style'\nimport { useAsyncModule, withSuspense } from '../../utils/async-modules-utils'\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\nimport { ChartLayoutComponent } from './chart_layout_component'\n\ninterface ChartLayoutProps {\n config: RootChartConfigObject\n shouldResize?: boolean\n parentElement?: HTMLElement\n isWithNotifications?: boolean\n}\n\nexport function ChartLayout({ config, shouldResize, isWithNotifications = true }: ChartLayoutProps) {\n const Wrapper = isWithNotifications ? NotificationWrapper : React.Fragment\n return (\n \n \n \n \n \n )\n}\n\nexport function ChartLayoutWithGlobalStateRaw({\n config,\n shouldResize,\n parentElement,\n}: Omit) {\n const [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { setChartLayoutModel, getChartLayoutModelConfig, lastGlobalRerender } =\n chartsModule.useChartLayoutGlobalModel()\n\n return (\n \n {config && (\n \n )}\n \n )\n}\n\nexport const ChartLayoutWithGlobalState = withSuspense(ChartLayoutWithGlobalStateRaw)\n","import * as React from 'react'\n\nimport { Button } from '../../components'\nimport Utils, { getExitFullscreen, getFullscreenStatus, getRequestFullscreen } from '../../utils'\n\nconst isIPad = Utils.isIPad()\nconst IPAD_FULLSCREEN_CLASS = 'is-ipad-fullscreen'\n\nexport function FullscreenButton() {\n const [isFullscreen, setIsFullscreen] = React.useState(getFullscreenStatus())\n const requestFullscreen = getRequestFullscreen(document.documentElement)\n const exitFullscreen = getExitFullscreen()\n\n const onClick = React.useRef(() => {\n if (getFullscreenStatus()) {\n exitFullscreen.call(document)\n } else {\n requestFullscreen.call(document.documentElement)\n }\n })\n\n React.useEffect(() => {\n const checkFullscreen = () => {\n if (isIPad) {\n if (getFullscreenStatus()) {\n document.body.classList.add(IPAD_FULLSCREEN_CLASS)\n } else {\n document.body.classList.remove(IPAD_FULLSCREEN_CLASS)\n }\n }\n setIsFullscreen(getFullscreenStatus())\n }\n\n document.addEventListener('webkitfullscreenchange', checkFullscreen)\n document.addEventListener('fullscreenchange', checkFullscreen)\n return () => {\n document.removeEventListener('webkitfullscreenchange', checkFullscreen)\n document.removeEventListener('fullscreenchange', checkFullscreen)\n }\n }, [])\n\n if (!requestFullscreen) return null\n\n return (\n \n {isFullscreen ? 'Exit Full screen' : 'Full screen'}\n \n )\n}\n","import * as React from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { Button, Dropdown, DropdownItem, DropdownSeparator, Icon, Paragraph, useDropdownState } from '../../components'\nimport { LAYOUTS } from '../../constants/common'\nimport { sortObjects } from '../../helpers/sorter'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { ChartSyncableParts } from '../../models/chart/contstants'\nimport ChartLayout from '../../models/chart_layout'\nimport { decodeQueryString } from '../../utils/query_string'\nimport { useChartsPathLocation } from '../chart-controls/use-charts-path-location'\n\nconst SORTED_LAYOUT_KEYS = sortObjects(\n Object.entries(LAYOUTS).map(([key, value]) => ({ ...value, key })),\n [{ sortBy: 'columns' }, { sortBy: 'count' }]\n).map(({ key }) => key)\n\nexport function ChartLayoutDropdown({ model }: { model: ChartLayout }) {\n const location = useLocation()\n const navigate = useNavigate()\n const parsedQuery = decodeQueryString(location.search)\n const chartLayoutModel = useModelState(model, { watchProperties: ['layout', 'syncChartParts'] })\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel })\n const state = useDropdownState({ placement: 'bottom', orientation: 'horizontal' })\n\n return (\n \n Layout\n \n }\n >\n

\n
\n {SORTED_LAYOUT_KEYS.map((layout) => (\n {\n navigate(getChartsToPath({ layout }))\n }}\n >\n \n \n ))}\n
\n \n
\n
\n Sync:\n
\n {ChartSyncableParts.map(({ value, label }) => {\n const isChartPartInSync = chartLayoutModel.getIsChartPartInSync(value)\n return (\n {\n chartLayoutModel.setSyncChartParts(value, !isChartPartInSync)\n if (!isChartPartInSync) window.gtag?.('event', 'sync', { event_label: value })\n }}\n >\n {label}\n \n )\n })}\n
\n
\n \n )\n}\n","import { ObjectHash } from '../../types/shared'\nimport { SORT_DIRECTION } from '../constants/common'\n\nexport function sortObjects(\n arr: ObjectHash[],\n options: Array<{ sortBy: string; sortDirection?: keyof typeof SORT_DIRECTION }> = []\n) {\n return arr.sort((a, b) =>\n options.reduce((acc, option) => {\n const { sortBy, sortDirection = SORT_DIRECTION.ASC } = option\n const directionMultiplier = sortDirection === SORT_DIRECTION.ASC ? 1 : -1\n return acc === 0 ? (a[sortBy] - b[sortBy]) * directionMultiplier : acc\n }, 0)\n )\n}\n","import * as React from 'react'\n\nimport { Button } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { updateSettings } from '../../models/settings'\n\nexport function ThemeToggleButton({ model }: { model: ChartLayout }) {\n const chartLayoutModel = useModelState(model, { watchProperties: ['theme'] })\n const isDarkMode = model.theme === 'dark'\n\n const onClick = () => {\n const theme = isDarkMode ? 'light' : 'dark'\n chartLayoutModel.updateAttributes({ theme, settings: updateSettings(chartLayoutModel, theme) })\n chartLayoutModel.trigger('theme', chartLayoutModel)\n fetch(`/api/set_cookie.ashx?cookie=chartsTheme&value=${theme}`).catch(() => {})\n\n if (isDarkMode) {\n document.documentElement.classList.remove('dark')\n } else {\n document.documentElement.classList.add('dark')\n }\n }\n\n if (!chartLayoutModel) {\n return null\n }\n\n return (\n \n )\n}\n","import * as React from 'react'\n\nimport { Button, Time } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { FullscreenButton } from './fullscreen_button'\nimport { IdeasDropdown } from './ideas_dropdown'\nimport { ChartLayoutDropdown } from './layout_dropdown'\nimport { Publish } from './publish'\nimport { ThemeToggleButton } from './theme_toggle_button'\nimport { TourButton } from './tour_button'\n\nconst BREAKPOINTS = [\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\n { minWidth: 550, marketBadgeText: false, timeFormat: 'short' },\n { minWidth: 700, marketBadgeText: false, timeFormat: 'long' },\n { minWidth: 768, marketBadgeText: true, timeFormat: 'long' },\n]\n\ninterface ChartLayoutHeaderProps {\n model: ChartLayout\n onSettingsOpen: () => void\n refreshHeader: () => void\n hasPublish: boolean\n}\n\nexport function ChartLayoutHeaderComponent({ model, onSettingsOpen = () => {}, hasPublish }: ChartLayoutHeaderProps) {\n const chartLayout = useModelState(model, { watchProperties: ['idea'] })!\n\n return (\n <>\n
\n \n Ideas\n \n
\n
\n \n Chart tour\n \n \n \n {hasPublish && (\n \n Share\n \n )}\n \n \n \n
\n \n )\n}\n\nexport const ChartLayoutHeader = React.memo(\n ChartLayoutHeaderComponent,\n (prevProps, nextProps) =>\n prevProps.model === nextProps.model &&\n prevProps.onSettingsOpen === nextProps.onSettingsOpen &&\n prevProps.hasPublish === nextProps.hasPublish\n)\n","import React from 'react'\n\nimport { Instrument } from '../../../types/shared'\nimport { CustomDateRange, TimeframeBar, useCustomDateRangeDialog, useFavoriteTimeframes } from '../../components'\nimport { TIMEFRAME } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { isRedesignEnabled } from '../../utils'\nimport { useAsyncModule, withSuspense } from '../../utils/async-modules-utils'\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\nimport { useChartControls } from './use-chart-controls'\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\n\nfunction StockDetailTimeframeBarRaw({\n size = 'regular',\n className = '!m-0 space-x-2',\n isDateRangeAvailable,\n isPremium,\n isLoadingOverride,\n isScrollIntoViewEnabled = false,\n onTimeframeSelect = () => {},\n onDateRangeSelect = () => {},\n}: {\n size?: string\n className?: string\n isDateRangeAvailable: boolean\n isPremium: boolean\n isLoadingOverride?: boolean\n isScrollIntoViewEnabled?: boolean\n onTimeframeSelect?: (timeframe: any) => void\n onDateRangeSelect?: (timeframe: any) => void\n}) {\n const [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { chartLayoutModel } = chartsModule.useChartLayoutGlobalModel()\n const chartModelUnwatched = React.useMemo(() => chartLayoutModel?.getAllCharts()[0] ?? null, [chartLayoutModel])\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes(isPremium)\n const chartModel = useModelState(chartModelUnwatched, {\n watchProperties: ['timeframe', 'dateRange'],\n })\n const { instrument = Instrument.Stock } = chartModel?.quote() || {}\n const { isLoading } = useChartControls({\n chartModel,\n isInteractive: isDateRangeAvailable,\n })\n\n const {\n anchorDate,\n generateChartLayoutRouterPath,\n timeframeGroupsWithHref,\n dateRangeGroupsWithHref,\n isFetching,\n handleCustomDateRangeValidation,\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\n useCustomDateRangeDialog({\n instrument,\n anchorDate,\n pathGenerator: generateChartLayoutRouterPath,\n })\n\n const dateRangeGroups = dateRangeGroupsWithHref({ isPremium, customRange: chartModel?.dateRange, instrument })\n const timeFrameGroups = timeframeGroupsWithHref(isPremium)\n\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\n if (!dateRangeTimeframe) return\n\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\n if (isValid) onDialogSubmit(dateRangeTimeframe)\n }\n\n return (\n <>\n {\n handleDateRangeSelect(value)\n onDateRangeSelect?.(value)\n }}\n onTimeframeSelect={onTimeframeSelect}\n onFavoriteTimeframeToggle={({ value }: { value: TIMEFRAME }) => {\n toggleFavoriteTimeframe(value)\n }}\n isDateRangeAvailable={isDateRangeAvailable}\n containerElement={document.body}\n className={className}\n isFavoritesEnabled={isPremium}\n isScrollIntoViewEnabled={isScrollIntoViewEnabled}\n />\n\n {chartModel && (\n \n )}\n \n )\n}\n\nexport const StockDetailTimeframeBar = withSuspense(StockDetailTimeframeBarRaw)\n","import { ChartConfigChartPane, Position, RootChartConfigObject, TaConfigObject } from '../../types/shared'\nimport { ChartElementType, IndicatorType, OverlayType, PANE_HEIGHT_DEFAULT, ScaleType } from '../constants/common'\n\nfunction hasPaneWithCOTCode(panes: ChartConfigChartPane[], code: string) {\n return panes.some(({ elements }) =>\n elements.some((element) => element.type === IndicatorType.Cot && element.code === code)\n )\n}\nfunction pushIndicators(\n panes: ChartConfigChartPane[],\n indicator: { name: string; parameters: string },\n options?: { COTs?: string[] }\n) {\n if (indicator.name === 'cot') {\n const cotKeys = options?.COTs ?? []\n if (cotKeys.length === 0) {\n cotKeys.push('')\n }\n cotKeys.forEach(function (code: string) {\n if (!hasPaneWithCOTCode(panes, code)) {\n panes.push({\n height: PANE_HEIGHT_DEFAULT.indicator,\n elements: [\n {\n type: IndicatorType.Cot,\n code,\n },\n ],\n })\n }\n })\n } else {\n panes.push({\n height: PANE_HEIGHT_DEFAULT.indicator,\n elements: [\n {\n type: ('indicators/' + indicator.name) as IndicatorType,\n period: indicator.parameters,\n },\n ],\n })\n }\n}\n\nfunction getChartTypeByTaConfigStyle(style: string) {\n const chartTypeMap = {\n candlestick: ChartElementType.CandleStick,\n heikinashi: ChartElementType.HeikinAshi,\n hollowcandlestick: ChartElementType.HollowCandleStick,\n line: ChartElementType.LineChart,\n ohlc: ChartElementType.OhlcChart,\n }\n return chartTypeMap[style as keyof typeof chartTypeMap]\n}\n\nfunction getChartScaleByTaConfigScale(scale: string | undefined) {\n const chartScaleMap = {\n linear: ScaleType.Linear,\n percentage: ScaleType.Percentage,\n logarithmic: ScaleType.Logarithmic,\n }\n return chartScaleMap[scale as keyof typeof chartScaleMap] ?? ScaleType.Linear\n}\n\n/*\n * Merges chartConfig (in \"chart\" format) with taConfig (in format that TA is preserved in DB)\n */\nexport const mergeChartAndTAConfig = function convertTA(\n chartConfig: RootChartConfigObject,\n taConfig: TaConfigObject,\n options?: { COTs: string[] }\n) {\n const panes = chartConfig.charts[0].panes\n const chart = chartConfig.charts[0]\n\n chart.scale = getChartScaleByTaConfigScale(taConfig.scale)\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Above)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n const overlays = taConfig.overlays.map(function (overlay) {\n return {\n type: ('overlays/' + overlay.name) as OverlayType,\n period: overlay.parameters ?? '',\n color: overlay.color ?? '',\n }\n })\n panes.push({\n height: PANE_HEIGHT_DEFAULT.chart,\n elements: [\n {\n type: getChartTypeByTaConfigStyle(taConfig.style),\n overlays: overlays,\n },\n ],\n })\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Below)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n chartConfig.height = chart.height = PANE_HEIGHT_DEFAULT.chart + (panes.length - 1) * PANE_HEIGHT_DEFAULT.indicator\n}\n\nexport const getPanes = function getPanes(taConfig: TaConfigObject) {\n const options = {}\n const panes: ChartConfigChartPane[] = []\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Above)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n const overlays = taConfig.overlays.map(function (overlay) {\n return {\n type: ('overlays/' + overlay.name) as OverlayType,\n period: overlay.parameters ?? '',\n color: overlay.color ?? '',\n }\n })\n panes.push({\n height: PANE_HEIGHT_DEFAULT.chart,\n elements: [\n {\n type: getChartTypeByTaConfigStyle(taConfig.style),\n overlays: overlays,\n },\n ],\n })\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Below)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n return panes\n}\n","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = () => ([]);\nwebpackEmptyContext.resolve = webpackEmptyContext;\nwebpackEmptyContext.id = 7176;\nmodule.exports = webpackEmptyContext;","/**\n * User type definition\n * @typedef {Object} ComponentsExport\n * @property {import('react').FC} Button\n * @property {import('react').FC} ButtonGroup\n * @property {import('react').FC} Checkbox\n * @property {import('react').FC} ContextMenu\n * @property {import('react').FC} Heading\n * @property {import('react').FC} Paragraph\n * @property {import('react').FC} Label\n * @property {Function} useDialogState\n * @property {Function} getExtendedDialogState\n * @property {Function} useListState\n * @property {import('react').FC} Dialog\n * @property {import('react').FC} DialogBody\n * @property {import('react').FC} DialogFooter\n * @property {import('react').FC} DialogHeader\n * @property {import('react').FC} DialogTrigger\n * @property {import('react').FC} SaveToPortfolio\n * @property {import('react').FC} ConfirmationDialog\n * @property {import('react').VF} CopyToClipboard\n * @property {import('react').FC} DatePicker\n * @property {import('react').VF} ColorPicker\n * @property {import('react').VF} ColorPreview\n * @property {import('react').VF} InputColorPicker\n * @property {Function} useDropdownState\n * @property {import('react').FC} Dropdown\n * @property {import('react').FC} DropdownBar\n * @property {import('react').FC} DropdownItem\n * @property {import('react').FC} DropdownSeparator\n * @property {import('react').FC} MoreButtonDropdown\n * @property {import('react').Context} DropdownContext\n * @property {import('react').FC} GridLayout\n * @property {import('react').FC} ChartGrid\n * @property {import('react').FC} ChartGridCell\n * @property {any} IconName\n * @property {import('react').FC} Icon\n * @property {import('react').FC} Logo\n * @property {import('react').FC} CircleLogo\n * @property {any} InputTheme\n * @property {import('react').FC} Input\n * @property {import('react').FC} InnerState\n * @property {import('react').FC} TooltipInput\n * @property {import('react').FC} Textarea\n * @property {import('react').FC} HighlightedResult\n * @property {import('react').FC} ListItem\n * @property {import('react').FC} List\n * @property {import('react').FC} CategoryList\n * @property {Function} searchByValue\n * @property {Function} sortByLabel\n * @property {Function} useListSearch\n * @property {Function} usePopoverState\n * @property {import('react').FC} PopoverTrigger\n * @property {import('react').FC} Popover\n * @property {import('react').VF} RangeSlider\n * @property {import('react').FC} TickerSearch\n * @property {import('react').FC} Search\n * @property {import('react').FC} Select\n * @property {import('react').FC} StatelessSelect\n * @property {import('react').FC} SelectOption\n * @property {import('react').FC} Spinner\n * @property {import('react').FC} Delayed\n * @property {import('react').FC} ColorSelect\n * @property {import('react').FC} Toolbar\n * @property {import('react').FC} ToolbarItem\n * @property {import('react').FC} PortfolioWatchlistTable\n * @property {import('react').FC} ToolbarDivider\n * @property {import('react').FC} ToolbarButton\n * @property {any} DrawingTool\n * @property {Function} useTooltipState\n * @property {import('react').FC} Tooltip\n * @property {import('react').FC} TooltipTrigger\n * @property {Function} useTour\n * @property {import('react').FC} Paragraph\n * @property {import('react').FC} ButtonColorPicker\n * @property {import('react').FC} InnerState\n * @property {import('react').FC} TimeframeBar\n * @property {(elementOverride?: TElement | null) => { setElementRef: React.Dispatch>; elementWidth: number; elementHeight: number }} useElementMeasure\n * @property {Function} convertColorToHEX\n * @property {Function} hexStringToRGBA\n * @property {Function} rgbaToRGBAString\n * @property {Function} withNotificationContext\n * @property {Function} useNotification\n * @property {import('react').FC} Notification\n * @property {import('react').FC} NotificationWrapper\n * @property {import('react').FC} Time\n * @property {import('react').FC} CustomDateRange\n * @property {import('react').Context} ZIndexContext\n * @property {Function} useCustomDateRangeDialog\n * @property {Function} useFavoriteTimeframes\n * @property {Function} getTimeframeGroups\n * @property {Function} getDateRangeGroups\n * @property {Function} getDateRangeGroupsWithHref\n * @property {Function} generatePathForTimeframeDateRange\n * @property {Record} timeframeUtm\n */\n\n/**\n * Add type so that the properties are suggested\n * @type {ComponentsExport}\n */\nconst componentsLib = window.FLibs.components\n\nmodule.exports = componentsLib\n","// Keep in sync with Website repository colors.js file in: config/colors.js\n\nmodule.exports = {\n white: '#fff',\n black: '#000',\n inherit: 'inherit',\n transparent: 'transparent',\n current: 'currentColor',\n finviz: {\n 'blue-gray': '#262931',\n blue: '#4fa4f4',\n },\n gray: {\n 50: '#f3f3f5',\n 100: '#dedfe5',\n 200: '#c3c6d0',\n 300: '#a3a8b9',\n 400: '#868ea5',\n 500: '#676f85',\n 600: '#4c5263',\n 700: '#353945',\n 750: '#2c303b',\n 800: '#22262f',\n 900: '#14161d',\n },\n red: {\n 50: '#fef0f0',\n 100: '#fcd6d6',\n 200: '#fbb4b4',\n 300: '#fd8487',\n 400: '#fb5057',\n 500: '#d91e2b',\n 600: '#9f1f2a',\n 700: '#691f24',\n 800: '#45171a',\n 900: '#280e0f',\n },\n orange: {\n 50: '#fef2eb',\n 100: '#fdd9c5',\n 200: '#fab889',\n 300: '#ef9323',\n 400: '#ca7b14',\n 500: '#a0600e',\n 600: '#79460a',\n 700: '#583006',\n 800: '#3d1e03',\n 900: '#261101',\n },\n amber: {\n 50: '#fef2e7',\n 100: '#fedab5',\n 200: '#fbba56',\n 300: '#de9c1a',\n 400: '#bb830f',\n 500: '#956600',\n 600: '#704b00',\n 700: '#4f3400',\n 800: '#372200',\n 900: '#211300',\n },\n yellow: {\n 50: '#fdf2df',\n 100: '#fcdc86',\n 200: '#f3c736',\n 300: '#cda30b',\n 400: '#b08900',\n 500: '#8b6a00',\n 600: '#664e21',\n 700: '#46371e',\n 800: '#2f2516',\n 900: '#1b150d',\n },\n brightYellow: {\n 50: '#fff699',\n 100: '#fff200',\n },\n lime: {\n 50: '#ebfad6',\n 100: '#caec90',\n 200: '#aad547',\n 300: '#8db61e',\n 400: '#769913',\n 500: '#5b7800',\n 600: '#435900',\n 700: '#2e3e00',\n 800: '#1e2a00',\n 900: '#111900',\n },\n green: {\n 50: '#e7f7e8',\n 100: '#beeac1',\n 200: '#86d895',\n 300: '#34c062',\n 400: '#00a449',\n 500: '#19803d',\n 600: '#265d35',\n 700: '#1e4027',\n 800: '#162b1b',\n 900: '#0d1810',\n },\n emerald: {\n 50: '#ddfaee',\n 100: '#a2f0d2',\n 200: '#4dddaf',\n 300: '#25be93',\n 400: '#1d9f7b',\n 500: '#157e60',\n 600: '#035d47',\n 700: '#004139',\n 800: '#002c22',\n 900: '#001a13',\n },\n teal: {\n 50: '#e0f8fc',\n 100: '#9beef7',\n 200: '#4fd8e5',\n 300: '#27b9c4',\n 400: '#109ba5',\n 500: '#007c83',\n 600: '#005b62',\n 700: '#004045',\n 800: '#002b2e',\n 900: '#00191b',\n },\n blue: {\n 50: '#ebf4fe',\n 100: '#cae2fc',\n 200: '#9bcbfa',\n 300: '#57aefb',\n 400: '#2f91ef',\n 500: '#306dca',\n 600: '#2f5091',\n 700: '#263766',\n 800: '#1b2542',\n 900: '#101527',\n },\n violet: {\n 50: '#f4f2fe',\n 100: '#e1dbfd',\n 200: '#c9befc',\n 300: '#ad9bfb',\n 400: '#9978f9',\n 500: '#7c51e7',\n 600: '#5e36b8',\n 700: '#402979',\n 800: '#2a1e4e',\n 900: '#18122c',\n },\n purple: {\n 50: '#f9f1fe',\n 100: '#eed8fd',\n 200: '#e1b6fc',\n 300: '#d38bfb',\n 400: '#c85bf9',\n 500: '#ae27e0',\n 600: '#8514ac',\n 700: '#60077e',\n 800: '#44005a',\n 900: '#2a003a',\n },\n pink: {\n 50: '#fef1f4',\n 100: '#fdd6e1',\n 200: '#fcb2c7',\n 300: '#f984aa',\n 400: '#f25090',\n 500: '#cd2a74',\n 600: '#9d1658',\n 700: '#700c42',\n 800: '#4e052b',\n 900: '#32011a',\n },\n}\n","/**\n * Type definitions for assets exported in website FLibs\n * @typedef {Object} AssetsExport\n * @property {string} logo\n * @property {string} logo_light\n */\n\n/**\n * @typedef {Object} LocalStorageService\n * @property {(key: string, defaultValue: ValueType) => ValueType} getValue\n * @property {(key: string, valueGetter: React.SetStateAction, defaultValue: ValueType, emit?: boolean) => void} setValue\n * @property {(key: string, emit?: boolean) => void} removeValue\n * @property {(key: string, transformValue: NewValue | ((oldValue: PrevValue | NewValue) => NewValue), defaultValue: NewValue) => void} migrateValue\n */\n\n/**\n * Type definitions for functions exported in website FLibs\n * @typedef {Object} FLibsExport\n * @property {AssetsExport} assets\n * @property {(date?: Date, format?: TimeFormatType) => string} getFormattedDateString\n * @property {(date: Date) => string} formatDateToStringUS\n * @property {(key: string, defaultValue: ValueType) => ({ state: ValueType, setState: (value: React.SetStateAction) => void })} useSyncLocalStorage\n * @property {(props: { trackInitial?: boolean; trackAutomatically?: boolean; }) => () => void} useTrackPageView\n * @property {LocalStorageService} localStorage\n */\n\n/**\n * Add type so that the properties are suggested\n * @type {FLibsExport}\n */\nconst FLibsExports = window.FLibs\n\nmodule.exports = FLibsExports\n","export { getFullChartWidth, getIntradayChartConfig } from './controllers/renderUtils'\n\nexport { useAsyncModule, withSuspense } from './utils/async-modules-utils'\n\nexport { ChartLayout, ChartLayoutWithGlobalState } from './controllers/chart_layout'\nexport { ChartLayoutHeader } from './controllers/header'\nexport { Sidebar } from './controllers/sidebar/sidebar'\nexport { StockDetailTimeframeBar } from './controllers/chart-controls/stock-detail-timeframe-bar'\nexport { getTimeframeGroupsWithHref } from './controllers/chart-controls/utils'\nexport { useModelState } from './model-hooks/use-model-state'\nexport { default as Quote } from './models/quote'\nexport * as Settings from './models/settings'\nexport { default as Utils } from './utils'\nexport * as convertTa from './utils/convert_ta'\nexport { FREE_DATE_RANGES } from './constants/common'\n\nexport { chartSettingsAsyncModule } from './controllers/chart-settings/async-modules'\n\nexport { withCompleteLayoutModelInit } from './controllers/chart_layout/with-complete-layout-model-init'\nexport { withQuotePolling } from './controllers/chart_layout/with-quote-polling'\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface IArrowAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n border: DrawingBorder\n}\n\nclass Arrow extends Element {\n static type = CanvasElementType.arrow\n\n declare scaled: Pick\n name = 'Arrow'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.renderContent = this.renderContent.bind(this)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'l',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'r',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 3,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n context.set('lineCap', 'round')\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n const angle = Math.PI / 8\n const d = 20\n\n context.beginPath()\n context.moveTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n\n const lineAngle = Math.atan2(roundedXY.y2 - roundedXY.y1, roundedXY.x2 - roundedXY.x1)\n const h = Math.abs(d / Math.cos(angle))\n\n const angle1 = lineAngle + angle\n const topx = roundedXY.x1 + Math.cos(angle1) * h\n const topy = roundedXY.y1 + Math.sin(angle1) * h\n const angle2 = lineAngle - angle\n const botx = roundedXY.x1 + Math.cos(angle2) * h\n const boty = roundedXY.y1 + Math.sin(angle2) * h\n\n context.beginPath()\n context.moveTo(topx, topy)\n context.lineTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(botx, boty)\n context.stroke()\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'l') {\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n } else {\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nArrow.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default Arrow\n","import { DrawingBorder, PaneArea, RequireByKey, ResizeByThumbFuncProps } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport math from '../../helpers/math'\nimport { getContextWithCache } from '../../lib/shims'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Thumb from '../thumb'\n\nexport type BrushPoints = Array<[x: number, y: number]>\n\nexport interface IBrushAttrs {\n points: BrushPoints\n fill: string\n border: DrawingBorder\n isPolyLineClosed: boolean\n positionPointsTimestamps: BrushPoints\n}\n\nclass Brush extends Element {\n static type = CanvasElementType.brushV1\n\n untranslatedContext: CanvasRenderingContext2D | null = null\n\n name = 'Brush'\n\n brushPath: Path2D | null = null\n\n cachedFill = {\n previousFill: '',\n shouldRenderFill: false,\n }\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\n this.setFillCache()\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultTransparentFill,\n border: {\n width: 3,\n color: ElementSettings.Colors.border,\n },\n isPolyLineClosed: false,\n } as Partial\n }\n\n setFillCache() {\n this.cachedFill.previousFill = this.attrs.fill\n if (this.attrs.fill.length === 9) {\n this.cachedFill.shouldRenderFill = this.attrs.fill.slice(7) !== '00'\n } else {\n this.cachedFill.shouldRenderFill = true\n }\n }\n\n getShouldRenderFill() {\n if (this.attrs.fill !== this.cachedFill.previousFill) {\n this.setFillCache()\n }\n return this.cachedFill.shouldRenderFill\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (this.attrs.border != null) {\n context.set('strokeStyle', this.attrs.border.color)\n }\n context.set('lineCap', 'round')\n context.set('lineJoin', 'round')\n\n const brushPath = new Path2D()\n const { points } = this.attrs\n context.beginPath()\n brushPath.moveTo(this.fx(points[0][0]), this.fy(points[0][1]))\n let i\n if (points.length > 3) {\n for (i = 0; i < points.length - 2; i++) {\n const xc = (this.fx(points[i][0]) + this.fx(points[i + 1][0])) / 2\n const yc = (this.fy(points[i][1]) + this.fy(points[i + 1][1])) / 2\n brushPath.quadraticCurveTo(this.fx(points[i][0]), this.fy(points[i][1]), xc, yc)\n }\n brushPath.quadraticCurveTo(\n this.fx(points[i][0]),\n this.fy(points[i][1]),\n this.fx(points[i + 1][0]),\n this.fy(points[i + 1][1])\n )\n } else {\n for (const point of points) {\n brushPath.lineTo(this.fx(point[0]), this.fy(point[1]))\n }\n }\n\n if (this.attrs.isPolyLineClosed) {\n brushPath.closePath()\n }\n this.brushPath = brushPath\n if (this.attrs.fill && this.getShouldRenderFill()) {\n context.set('fillStyle', this.attrs.fill)\n context.fill(brushPath)\n }\n if (this.attrs?.border?.width) {\n context.set('lineWidth', this.attrs.border.width)\n context.stroke(brushPath)\n }\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n const [firstX, firstY] = this.attrs.points[0]\n const [lastX, lastY] = this.attrs.points[this.attrs.points.length - 1]\n\n return [\n new Thumb(\n 'first',\n () => firstX,\n () => firstY,\n this.moveByThumb,\n this.model\n ),\n new Thumb(\n 'last',\n () => lastX,\n () => lastY,\n this.moveByThumb,\n this.model\n ),\n ]\n }\n\n moveByThumb = ({ difX, difY }: RequireByKey) => {\n this.moveBy(difX, difY)\n }\n\n moveBy(x: number, y: number) {\n if (this.getIsCreator()) return\n for (const point of this.attrs.points) {\n point[0] += x\n point[1] += y\n }\n }\n\n onMouseUp() {\n const [currentDomainMax, currentDomainMin] = this.model.scale.y.domain()\n for (const point of this.attrs.points) {\n point[0] = this.roundToFixed(point[0], 2)\n point[1] = this.roundY(point[1], currentDomainMax - currentDomainMin)\n }\n super.onMouseUp()\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const { points } = this.attrs\n if (\n (this.getShouldRenderFill() || this.attrs.isPolyLineClosed) &&\n this.brushPath &&\n this.untranslatedContext?.isPointInPath(this.brushPath, area.scaled.x, area.scaled.y)\n ) {\n return true\n } else if (points.length > 1) {\n for (let i = 0; i < points.length - 1; i++) {\n if (\n math.distanceToSegment(area.scaled, {\n x1: this.fx(points[i][0]),\n y1: this.fy(points[i][1]),\n x2: this.fx(points[i + 1][0]),\n y2: this.fy(points[i + 1][1]),\n }) <= 10\n ) {\n return true\n }\n }\n }\n return super.isInArea(area)\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart()?.quote()\n if (quote) {\n const positionPointsTimestamps = this.attrs.points.map(([x, y]) => [quote.getTimestampFomPositionX(x), y])\n this.set({ positionPointsTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionPointsTimestamps } = this.attrs\n if (!quote || !positionPointsTimestamps) {\n // positionPointsTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const points = positionPointsTimestamps.map(([x, y]) => [quote.getPositionXFromTimestamp(x), y])\n this.set({ points } as Partial)\n }\n\n roundToFixed = (value: number, places: number) => Number.parseFloat(math.round({ value, overridePlaces: places }))\n\n roundY = (y: number, domainDiff: number) => {\n if (domainDiff < 1) {\n const numberOfLeadingZeros = Math.abs(Math.floor(Math.log10(Math.abs(domainDiff)) + 1))\n if (numberOfLeadingZeros > 0) {\n return this.roundToFixed(y, numberOfLeadingZeros + 4)\n } else {\n return this.roundToFixed(y, numberOfLeadingZeros + 3)\n }\n } else if (domainDiff < 10) {\n return this.roundToFixed(y, 3)\n }\n return this.roundToFixed(y, 2)\n }\n\n getAutosaveOmittedProperties() {\n return ['points']\n }\n}\n\nBrush.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, max: 20, default: {} },\n { type: 'checkbox', name: 'isPolyLineClosed', label: 'Close line' },\n ],\n}\n\nexport default Brush\n","import math from '../../helpers/math'\n\ninterface ICoordinates {\n x: number\n y: number\n}\nexport interface IRectangleSidesCoordinates {\n topLeft: ICoordinates\n topRight: ICoordinates\n rightTop: ICoordinates\n rightBottom: ICoordinates\n bottomRight: ICoordinates\n bottomLeft: ICoordinates\n leftBottom: ICoordinates\n leftTop: ICoordinates\n}\n\nexport interface ITailCoordinates {\n tailRoot: ICoordinates\n tailTip: ICoordinates\n}\n\nexport enum TailDirection {\n noTail,\n topLeftCorner,\n topRightCorner,\n bottomLeftCorner,\n bottomRightCorner,\n topSide,\n rightSide,\n bottomSide,\n leftSide,\n}\n\nexport const getRectangleSidesCoordinates = ({\n padding,\n radius,\n x2,\n y2,\n textWidth,\n measuredHeight,\n}: {\n padding: number\n radius: number\n x2: number\n y2: number\n textWidth: number\n measuredHeight: number\n}): IRectangleSidesCoordinates => ({\n topLeft: {\n x: x2 - padding + radius,\n y: y2 - padding,\n },\n topRight: {\n x: x2 + textWidth + padding - radius,\n y: y2 - padding,\n },\n rightTop: {\n x: x2 + textWidth + padding,\n y: y2 - padding + radius,\n },\n rightBottom: {\n x: x2 + textWidth + padding,\n y: y2 + padding + measuredHeight - radius,\n },\n bottomRight: {\n x: x2 + textWidth + padding - radius,\n y: y2 + padding + measuredHeight,\n },\n bottomLeft: {\n x: x2 - padding + radius,\n y: y2 + padding + measuredHeight,\n },\n leftBottom: {\n x: x2 - padding,\n y: y2 + padding + measuredHeight - radius,\n },\n leftTop: {\n x: x2 - padding,\n y: y2 - padding + radius,\n },\n})\n\nexport const getTailCoordinates = ({\n rectangleSides,\n x1,\n y1,\n}: {\n rectangleSides: IRectangleSidesCoordinates\n x1: number\n y1: number\n}): ITailCoordinates => ({\n tailRoot: {\n x: rectangleSides.topLeft.x + (rectangleSides.topRight.x - rectangleSides.topLeft.x) / 2,\n y: rectangleSides.leftTop.y + (rectangleSides.leftBottom.y - rectangleSides.leftTop.y) / 2,\n },\n tailTip: {\n x: x1,\n y: y1,\n },\n})\n\nconst getTailHalfWidth = (halfWidth: number, p1: ICoordinates, p2: ICoordinates): number => {\n const dist = math.distance(p1, p2)\n if (dist < halfWidth * 2) {\n return dist / 2\n } else {\n return halfWidth\n }\n}\n\nexport const getTailToSideIntersection = ({\n tail,\n rectangleSides,\n}: {\n tail: ITailCoordinates\n rectangleSides: IRectangleSidesCoordinates\n}): TailDirection => {\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\n const { tailTip, tailRoot } = tail\n if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, leftTop)) {\n return TailDirection.topLeftCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topRight, rightTop)) {\n return TailDirection.topRightCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, leftBottom)) {\n return TailDirection.bottomLeftCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomRight, rightBottom)) {\n return TailDirection.bottomRightCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)) {\n return TailDirection.topSide\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)) {\n return TailDirection.rightSide\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, bottomRight)) {\n return TailDirection.bottomSide\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)) {\n return TailDirection.leftSide\n } else {\n return TailDirection.noTail\n }\n}\n\ninterface IRenderCallout {\n context: any\n radius: number\n requiredTailHalfWidth: number\n tail: ITailCoordinates\n rectangleSides: IRectangleSidesCoordinates\n tailDirection: TailDirection\n}\n\nexport const renderCallout = ({\n context,\n radius,\n requiredTailHalfWidth,\n tail,\n rectangleSides,\n tailDirection,\n}: IRenderCallout): void => {\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\n const { tailTip, tailRoot } = tail\n\n // draw rounded rectangle from top left corner clockwise\n // !!! ORDER OF RENDER MATTERS !!!\n\n // renderTopLeftCorner\n if (tailDirection === TailDirection.topLeftCorner) {\n context.moveTo(leftTop.x, leftTop.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(topLeft.x, topLeft.y)\n } else {\n context.moveTo(leftTop.x, leftTop.y)\n context.arcTo(leftTop.x, topLeft.y, topLeft.x, topLeft.y, radius)\n }\n\n // renderTopLine\n if (tailDirection === TailDirection.topSide) {\n const tailLineToTopLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)\n if (!tailLineToTopLineIntersection) {\n context.lineTo(topRight.x, topRight.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, topLeft, topRight)\n if (tailLineToTopLineIntersection.x - tailHalfWidth < topLeft.x) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(topLeft.x + tailHalfWidth * 2, tailLineToTopLineIntersection.y)\n } else if (tailLineToTopLineIntersection.x + tailHalfWidth > topRight.x) {\n context.lineTo(topRight.x - tailHalfWidth * 2, tailLineToTopLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(topRight.x, tailLineToTopLineIntersection.y)\n } else {\n context.lineTo(tailLineToTopLineIntersection.x - tailHalfWidth, tailLineToTopLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToTopLineIntersection.x + tailHalfWidth, tailLineToTopLineIntersection.y)\n context.lineTo(topRight.x, topRight.y)\n }\n } else {\n context.lineTo(topRight.x, topRight.y)\n }\n\n // renderTopRightCorner\n if (tailDirection === TailDirection.topRightCorner) {\n context.lineTo(topRight.x, topRight.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(rightTop.x, rightTop.y)\n } else {\n context.arcTo(rightTop.x, topRight.y, rightTop.x, rightTop.y, radius)\n }\n\n // renderRightLine\n if (tailDirection === TailDirection.rightSide) {\n const tailLineToRightLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)\n if (!tailLineToRightLineIntersection) {\n context.lineTo(rightBottom.x, rightBottom.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, rightTop, rightBottom)\n if (tailLineToRightLineIntersection.y - tailHalfWidth < rightTop.y) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(rightTop.x, rightTop.y + tailHalfWidth * 2)\n } else if (tailLineToRightLineIntersection.y + tailHalfWidth > rightBottom.y) {\n context.lineTo(rightBottom.x, rightBottom.y - tailHalfWidth * 2)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(rightBottom.x, rightBottom.y)\n } else {\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y - tailHalfWidth)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y + tailHalfWidth)\n context.lineTo(rightBottom.x, rightBottom.y)\n }\n } else {\n context.lineTo(rightBottom.x, rightBottom.y)\n }\n\n // renderBottomRightCorner\n if (tailDirection === TailDirection.bottomRightCorner) {\n context.lineTo(rightBottom.x, rightBottom.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(bottomRight.x, bottomRight.y)\n } else {\n context.arcTo(rightBottom.x, bottomRight.y, bottomRight.x, bottomRight.y, radius)\n }\n\n // renderBottomLine\n if (tailDirection === TailDirection.bottomSide) {\n const tailLineToBottomLineIntersection = math.twoSegmentLinesIntersection(\n tailTip,\n tailRoot,\n bottomLeft,\n bottomRight\n )\n if (!tailLineToBottomLineIntersection) {\n context.lineTo(bottomLeft.x, bottomLeft.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, bottomLeft, bottomRight)\n if (tailLineToBottomLineIntersection.x + tailHalfWidth > bottomRight.x) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(bottomRight.x - tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\n } else if (tailLineToBottomLineIntersection.x - tailHalfWidth < bottomLeft.x) {\n context.lineTo(bottomLeft.x + tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(bottomLeft.x, tailLineToBottomLineIntersection.y)\n } else {\n context.lineTo(tailLineToBottomLineIntersection.x + tailHalfWidth, tailLineToBottomLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToBottomLineIntersection.x - tailHalfWidth, tailLineToBottomLineIntersection.y)\n context.lineTo(bottomLeft.x, bottomLeft.y)\n }\n } else {\n context.lineTo(bottomLeft.x, bottomLeft.y)\n }\n\n // renderBottomLeftCorner\n if (tailDirection === TailDirection.bottomLeftCorner) {\n context.lineTo(bottomLeft.x, bottomLeft.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(leftBottom.x, leftBottom.y)\n } else {\n context.arcTo(leftBottom.x, bottomLeft.y, leftBottom.x, leftBottom.y, radius)\n }\n\n // renderLeftLine\n if (tailDirection === TailDirection.leftSide) {\n const tailLineToLeftLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)\n if (!tailLineToLeftLineIntersection) {\n context.lineTo(leftTop.x, leftTop.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, leftTop, leftBottom)\n if (tailLineToLeftLineIntersection.y + tailHalfWidth > leftBottom.y) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(leftBottom.x, leftBottom.y - tailHalfWidth * 2)\n } else if (tailLineToLeftLineIntersection.y - tailHalfWidth < leftTop.y) {\n context.lineTo(leftTop.x, leftTop.y + tailHalfWidth * 2)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(leftTop.x, leftTop.y)\n } else {\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y + tailHalfWidth)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y - tailHalfWidth)\n context.lineTo(leftTop.x, leftTop.y)\n }\n } else {\n context.lineTo(leftTop.x, leftTop.y)\n }\n}\n","import merge from 'lodash.merge'\n\nimport { PaneArea, RequireByKey, ResizeByThumbWithTypeAndDifs, TextAttrs } from '../../../types/shared'\nimport { PADDING } from '../../constants/common'\nimport { CanvasElementType } from '../../constants/common'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport Text from '../text'\nimport Thumb from '../thumb'\nimport {\n TailDirection,\n getRectangleSidesCoordinates,\n getTailCoordinates,\n getTailToSideIntersection,\n renderCallout,\n} from './callout_utils'\nimport { IRectangleSidesCoordinates, ITailCoordinates } from './callout_utils'\n\nexport interface ICalloutAttrs {\n x1: number\n y1: number\n x2: number\n y2: number\n}\n\ninterface FontFamilyHeightCoefficient {\n Arial: {\n firstLine: number\n otherLines: number\n }\n Verdana: {\n firstLine: number\n otherLines: number\n }\n}\n\ntype CalloutTextAttrs = ICalloutAttrs & RequireByKey\n\nclass Callout extends Text {\n static type = CanvasElementType.calloutV1\n\n name = 'Callout'\n\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\n declare isActualBoundingBoxAvailable: boolean\n declare lastAttrs: Attrs\n declare scaled: Pick\n declare measuredHeight: number\n declare requiredTailHalfWidth: number\n declare rectangleSides: IRectangleSidesCoordinates\n declare tail: ITailCoordinates\n declare tailDirection: TailDirection\n declare font: string\n declare context: CanvasRenderingContext2D\n declare lines: {\n text: string\n metrics: TextMetrics\n }[]\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'tail',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n getModalConfigBase() {\n return {\n inputs: [\n { type: 'multiline_string', name: 'text', required: true },\n { type: 'font', name: 'font' },\n {\n type: 'background',\n name: 'fillStyle',\n label: 'Color',\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n },\n {\n type: 'background',\n name: 'background',\n label: 'Background',\n default: 'rgba(0,0,0,0)',\n },\n {\n type: 'border',\n name: 'border',\n min: 0,\n },\n ],\n }\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n text: '',\n font: {\n size: 15,\n family: 'Arial',\n style: 'normal',\n weight: 'normal',\n },\n fillStyle: ElementSettings.Colors.textWithoutBackground,\n lineHeight: 15,\n // left | right | center | start | end\n textAlign: 'left',\n // top | middle | alphabetic | bottom\n textBaseline: 'alphabetic',\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n },\n background: ElementSettings.defaultFill,\n border: { color: ElementSettings.Colors.line, width: 1 },\n } as Partial\n }\n\n setupContext(context: CanvasRenderingContext2D) {\n this.context = context\n context.set('font', this.font)\n context.set('fillStyle', this.attrs.fillStyle)\n context.set('textAlign', this.attrs.textAlign)\n context.set('textBaseline', this.attrs.textBaseline)\n this.setupTextMetricsCache()\n }\n\n setupTextMetricsCache() {\n if (\n this.attrs.text !== this.lastAttrs?.text ||\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)\n ) {\n this.lastAttrs = merge({}, this.attrs)\n this.lines = this.getLines().map((line) => ({\n text: line,\n metrics: this.context.measureText(line),\n }))\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\n const lineHeight =\n current.metrics.actualBoundingBoxAscent +\n current.metrics.actualBoundingBoxDescent +\n (currentIndex !== this.lines.length - 1 ? PADDING.S : 0)\n return acc + lineHeight\n }, 0)\n }\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n this.render(context)\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n renderText() {\n let y = this.scaled.y2 + this.attrs.padding.top\n let previousDescent = 0\n this.lines.forEach((line, index) => {\n y += index === 0 ? 0 : line.metrics.actualBoundingBoxAscent + previousDescent + PADDING.S\n this.context.fillText(line.text, this.scaled.x2 + this.attrs.padding.left, y)\n previousDescent = line.metrics.actualBoundingBoxDescent\n })\n }\n\n renderBackground() {\n if (!this.attrs.background) {\n return\n }\n const textWidth = this.attrs.text === '' ? this.attrs.font.size * 2 : this.width\n const minRadius = this.attrs.font.size * 0.5\n const padding = this.attrs.border.width / 2 + this.attrs.font.size * 0.5\n const radius = textWidth < minRadius ? textWidth / 2 : minRadius\n this.requiredTailHalfWidth = minRadius\n if (this.measuredHeight < minRadius) {\n this.measuredHeight = radius * 2\n }\n const y2 =\n this.scaled.y2 -\n (this.lines[0].metrics.actualBoundingBoxAscent\n ? this.lines[0].metrics.actualBoundingBoxAscent\n : this.measuredHeight)\n\n // Points diagram\n //.......X-----------------X.......\n //.................................\n //...X.........................X...\n //...|.........................|...\n //...|.........................|...\n //...X.........................X...\n //.................................\n //.......X-----------------X.......\n\n this.rectangleSides = getRectangleSidesCoordinates({\n padding,\n radius,\n x2: this.scaled.x2,\n y2,\n textWidth,\n measuredHeight: this.measuredHeight,\n })\n this.tail = getTailCoordinates({ rectangleSides: this.rectangleSides, x1: this.scaled.x1, y1: this.scaled.y1 })\n this.tailDirection = getTailToSideIntersection({ tail: this.tail, rectangleSides: this.rectangleSides })\n this.context.beginPath()\n this.context.set('fillStyle', this.attrs.background)\n this.context.lineJoin = 'round'\n renderCallout({\n context: this.context,\n radius,\n requiredTailHalfWidth: this.requiredTailHalfWidth,\n tail: this.tail,\n rectangleSides: this.rectangleSides,\n tailDirection: this.tailDirection,\n })\n this.context.closePath()\n this.context.fill()\n this.context.set('fillStyle', this.attrs.fillStyle)\n this.renderBorder()\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n // is in rectangle\n if (\n this.lines &&\n this.rectangleSides &&\n this.rectangleSides.leftTop.x < area.scaled.x &&\n this.rectangleSides.topLeft.y < area.scaled.y &&\n this.rectangleSides.rightBottom.x > area.scaled.x &&\n this.rectangleSides.bottomRight.y > area.scaled.y\n ) {\n return true\n }\n // is in tail\n if (this.tail) {\n const tailP1 = math.perpendicularPointToLine({\n distance: this.requiredTailHalfWidth,\n line: { x1: this.tail.tailTip.x, y1: this.tail.tailTip.y, x2: this.tail.tailRoot.x, y2: this.tail.tailRoot.y },\n })\n const pointOffsetX = tailP1.x - this.tail.tailRoot.x\n const pointOffsetY = tailP1.y - this.tail.tailRoot.y\n const tailP2 = { x: this.tail.tailRoot.x + -1 * pointOffsetX, y: this.tail.tailRoot.y + -1 * pointOffsetY }\n const polygon = [this.tail.tailTip, tailP1, tailP2]\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n }\n return super.isInArea(area)\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x2 += x\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'tail') {\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n }\n }\n}\n\nexport default Callout\n","import { Bezier } from 'bezier-js'\n\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface ICurveAttrs {\n x1: number\n x2: number\n x3: number\n cp1x: number\n cp2x: number\n y1: number\n y2: number\n y3: number\n cp1y: number\n cp2y: number\n border: DrawingBorder\n}\n\nclass Curve extends Element {\n static type = CanvasElementType.curve\n\n name = 'Curve'\n declare scaled: Pick\n declare curve: Bezier\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.render = this.render.bind(this)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'a',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'b',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.x3 || this.attrs.x2,\n () => this.attrs.y3 || this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 1,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\n\n drawQuadraticCurve(context: CanvasRenderingContext2D, curve: Bezier) {\n const { points } = curve\n context.beginPath()\n context.moveTo(points[0].x, points[0].y)\n context.quadraticCurveTo(points[1].x, points[1].y, points[2].x, points[2].y)\n context.stroke()\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n context.translate(0.5, 0.5)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n if (!x3 || !y3) {\n context.beginPath()\n context.moveTo(x1, y1)\n context.lineTo(x2, y2)\n context.lineTo(x3, y3)\n context.stroke()\n } else {\n this.curve = Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5)\n this.drawQuadraticCurve(context, this.curve)\n }\n\n context.translate(-0.5, -0.5)\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.x3 += x\n this.attrs.cp1x += x\n this.attrs.cp2x += x\n\n this.attrs.y1 += y\n this.attrs.y2 += y\n this.attrs.y3 += y\n this.attrs.cp1y += y\n this.attrs.cp2y += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'a':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'b':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'c':\n this.attrs.x3 += difX\n this.attrs.y3 += difY\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (this.curve && this.curve.project(area.scaled).d! <= 10) {\n return true\n }\n return this.thumbsAreInArea(area)\n }\n}\n\nCurve.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default Curve\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface IEllipseAttrs {\n x1: number\n x2: number\n x3: number\n cp1x: number\n cp2x: number\n y1: number\n y2: number\n y3: number\n cp1y: number\n cp2y: number\n width: number\n fill: string\n border: DrawingBorder\n}\n\ninterface ICoordinates {\n topCenterX: number\n topCenterY: number\n topRightX: number\n topRightY: number\n topLeftX: number\n topLeftY: number\n centerLeftX: number\n centerLeftY: number\n centerRightX: number\n centerRightY: number\n bottomCenterX: number\n bottomCenterY: number\n bottomLeftX: number\n bottomLeftY: number\n bottomRightX: number\n bottomRightY: number\n}\n\n// OLD Ellipse \"v0\" kept for backward-compatibiluty for old saved ideas\n// current Ellipse tool located in ellipse folder\nclass Ellipse extends Element {\n static type = CanvasElementType.ellipse\n\n name = 'Ellipse'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'x1',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'x2',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'lw',\n () => this.model.scale.x.invert(this.getCoordinates().centerLeftX),\n () => this.model.scale.y.invert(this.getCoordinates().centerLeftY),\n this.resize,\n this.model\n ),\n new Thumb(\n 'rw',\n () => this.model.scale.x.invert(this.getCoordinates().centerRightX),\n () => this.model.scale.y.invert(this.getCoordinates().centerRightY),\n this.resize,\n this.model\n ),\n ]\n const boundingPointKeys = this.getBoundingPointKeys()\n this.scale({ x: [...boundingPointKeys.x, 'width'], y: boundingPointKeys.y })\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const c = this.getCoordinates()\n\n context.set('fillStyle', this.attrs.fill)\n\n context.beginPath()\n context.moveTo(c.bottomCenterX, c.bottomCenterY)\n context.bezierCurveTo(c.bottomRightX, c.bottomRightY, c.topRightX, c.topRightY, c.topCenterX, c.topCenterY)\n context.bezierCurveTo(c.topLeftX, c.topLeftY, c.bottomLeftX, c.bottomLeftY, c.bottomCenterX, c.bottomCenterY)\n context.closePath()\n context.fill()\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'x1':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'x2':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'lw':\n this.attrs.width += difX\n break\n case 'rw':\n this.attrs.width -= difX\n break\n default:\n break\n }\n }\n\n getCoordinates(): ICoordinates {\n // TODO cache?\n // http://stackoverflow.com/questions/14169234/the-relation-of-the-bezier-curve-and-ellipse\n const rotationAngle =\n Math.PI + Math.atan(-1 / ((this.scaled.y2 - this.scaled.y1) / (this.scaled.x2 - this.scaled.x1)))\n\n const sign = this.scaled.y1 > this.scaled.y2 ? 1 : -1\n const radiusX = this.scaled.width / 2\n let radiusY = (sign * Math.abs(this.scaled.y1 - this.scaled.y2)) / Math.cos(rotationAngle) / 2\n if (this.scaled.y1 === this.scaled.y2) {\n radiusY = Math.abs(this.scaled.x1 - this.scaled.x2) / 2\n }\n\n const width_two_thirds = (radiusX * 4) / 3\n\n const dx1 = Math.sin(rotationAngle) * radiusY\n const dy1 = Math.cos(rotationAngle) * radiusY\n const dx2 = Math.cos(rotationAngle) * width_two_thirds\n const dy2 = Math.sin(rotationAngle) * width_two_thirds\n\n const x = this.scaled.x1 + dx1\n const y = this.scaled.y1 - dy1\n\n const topCenterX = x - dx1\n const topCenterY = y + dy1\n const topRightX = topCenterX + dx2\n const topRightY = topCenterY + dy2\n const topLeftX = topCenterX - dx2\n const topLeftY = topCenterY - dy2\n\n const bottomCenterX = x + dx1\n const bottomCenterY = y - dy1\n const bottomRightX = bottomCenterX + dx2\n const bottomRightY = bottomCenterY + dy2\n const bottomLeftX = bottomCenterX - dx2\n const bottomLeftY = bottomCenterY - dy2\n\n const centerRightX = x + dx2\n const centerRightY = y + dy2\n const centerLeftX = x - dx2\n const centerLeftY = y - dy2\n\n return {\n topCenterX,\n topCenterY,\n topRightX,\n topRightY,\n topLeftX,\n topLeftY,\n centerLeftX,\n centerLeftY,\n centerRightX,\n centerRightY,\n bottomCenterX,\n bottomCenterY,\n bottomLeftX,\n bottomLeftY,\n bottomRightX,\n bottomRightY,\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const c = this.getCoordinates()\n const left = Math.min(this.scaled.x1, this.scaled.x2, c.centerRightX)\n const right = Math.max(this.scaled.x1, this.scaled.x2, c.centerLeftX)\n const top = Math.min(this.scaled.y1, this.scaled.y2, c.centerRightY)\n const bottom = Math.max(this.scaled.y1, this.scaled.y2, c.centerLeftY)\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nEllipse.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default Ellipse\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\ntype RotatedRectangleCoordiantes = [[number, number], [number, number], [number, number], [number, number]]\n\nexport interface IRotatedRectangleAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n height: number\n fill: string\n border: DrawingBorder\n}\n\n// OLD RotatedRectangle \"v0\" kept for backward-compatibiluty for old saved ideas\n// current RotatedRectangle tool located in rotated_rectangle folder\nclass RotatedRectangle extends Element {\n static type = CanvasElementType.rotatedRectangle\n\n name = 'Rotated rectangle'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n const x = this.model.scale.x.invert\n const y = this.model.scale.y.invert\n this._thumbs = [\n new Thumb(\n 'ml',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'mr',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'tl',\n () => x(this.getRectCoordinates()[0][0]),\n () => y(this.getRectCoordinates()[0][1]),\n this.resize,\n this.model\n ),\n new Thumb(\n 'tr',\n () => x(this.getRectCoordinates()[1][0]),\n () => y(this.getRectCoordinates()[1][1]),\n this.resize,\n this.model\n ),\n new Thumb(\n 'bl',\n () => x(this.getRectCoordinates()[2][0]),\n () => y(this.getRectCoordinates()[2][1]),\n this.resize,\n this.model\n ),\n new Thumb(\n 'br',\n () => x(this.getRectCoordinates()[3][0]),\n () => y(this.getRectCoordinates()[3][1]),\n this.resize,\n this.model\n ),\n ]\n const boundingPointKeys = this.getBoundingPointKeys()\n this.scale({ x: [...boundingPointKeys.x, 'height'], y: boundingPointKeys.y })\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('fillStyle', this.attrs.fill)\n\n context.beginPath()\n const coords = this.getRectCoordinates()\n for (const point of coords) {\n context.lineTo(point[0], point[1])\n }\n context.lineTo(coords[0][0], coords[0][1])\n context.fill()\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getRectCoordinates(): RotatedRectangleCoordiantes {\n const mx1 = this.scaled.x1\n const mx2 = this.scaled.x2\n const my1 = this.scaled.y1\n const my2 = this.scaled.y2\n const { height } = this.scaled\n\n const k = (my2 - my1) / (mx2 - mx1)\n const nk = -1 / k\n\n const sign = my1 > my2 ? 1 : -1\n const dx = (sign * Math.sqrt((height * height) / (1 + nk * nk))) / 2\n const dy = nk * dx\n\n let x1 = mx1 - dx\n let y1 = my1 - dy\n let x2 = mx2 - dx\n let y2 = my2 - dy\n\n let x3 = mx2 + dx\n let y3 = my2 + dy\n let x4 = mx1 + dx\n let y4 = my1 + dy\n\n if (my1 === my2) {\n x1 = mx1\n y1 = my1 - height / 2\n x2 = mx2\n y2 = my2 - height / 2\n\n x3 = mx2\n y3 = my2 + height / 2\n x4 = mx1\n y4 = my1 + height / 2\n }\n\n return [\n [x1, y1],\n [x2, y2],\n [x3, y3],\n [x4, y4],\n ]\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'ml':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'mr':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'tl':\n case 'tr':\n this.attrs.height += difY\n break\n case 'bl':\n case 'br':\n this.attrs.height -= difY\n break\n default:\n return\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const coords = this.getRectCoordinates()\n const polygon = coords.map((c) => ({ x: c[0], y: c[1] }))\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nRotatedRectangle.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default RotatedRectangle\n","// TODO FontAwesome font or similar needs to be loaded before using Symbol\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface ISymbolAttrs {\n x1: number\n scaleX: number\n y1: number\n scaleY: number\n angle: number\n fill: string\n symbol: string\n border: DrawingBorder\n}\n\nclass SymbolElement extends Element {\n static type = CanvasElementType.symbol\n\n name = 'Symbol'\n\n declare textWidth: number\n declare textHeight: number\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n const sx = (sign: number) =>\n this.getRotatedCoordinates(this.scaled.x1 + sign * (this.textWidth / 2) * this.attrs.scaleX, this.scaled.y1)\n const sy = (sign: number) =>\n this.getRotatedCoordinates(this.scaled.x1, this.scaled.y1 + sign * (this.textHeight / 2) * this.attrs.scaleY)\n this._thumbs = [\n new Thumb(\n 'xr',\n () => this.model.scale.x.invert(sx(+1).x),\n () => this.model.scale.y.invert(sx(+1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'xl',\n () => this.model.scale.x.invert(sx(-1).x),\n () => this.model.scale.y.invert(sx(-1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'yt',\n () => this.model.scale.x.invert(sy(+1).x),\n () => this.model.scale.y.invert(sy(+1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'yb',\n () => this.model.scale.x.invert(sy(-1).x),\n () => this.model.scale.y.invert(sy(-1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n this.attrs.angle = this.attrs.angle || 0\n }\n\n getBoundingPointKeys = () => ({ x: ['x1'], y: ['y1'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('font', '36px FontAwesome')\n context.set('fillStyle', this.attrs.fill)\n context.set('textAlign', 'left')\n context.set('textBaseline', 'top')\n\n this.textWidth = context.measureText(this.attrs.symbol).width\n this.textHeight = 36\n const xScale = this.attrs.scaleX\n const yScale = this.attrs.scaleY\n\n const xOffset = this.textWidth / -2\n const yOffset = this.textHeight / -2\n\n context.save()\n context.translate(this.scaled.x1, this.scaled.y1)\n context.rotate(this.attrs.angle)\n context.scale(xScale, yScale)\n context.fillText(this.attrs.symbol, xOffset, yOffset)\n context.restore()\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getRotatedCoordinates(x: number, y: number) {\n const cx = this.scaled.x1\n const cy = this.scaled.y1\n const dx = x - cx\n const dy = y - cy\n const rx = dx * Math.cos(this.attrs.angle) - dy * Math.sin(this.attrs.angle)\n const ry = dy * Math.cos(this.attrs.angle) + dx * Math.sin(this.attrs.angle)\n return { x: cx + rx, y: cy + ry }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n return (this.attrs.y1 += y)\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'xl':\n this.attrs.scaleX -= difX\n break\n case 'xr':\n this.attrs.scaleX += difX\n break\n case 'yt':\n this.attrs.scaleY -= difY\n break\n case 'yb':\n this.attrs.scaleY += difY\n break\n case 'c':\n this.attrs.angle += difX / 5\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const halfWidth = (this.textWidth / 2) * this.attrs.scaleX\n const halfHeight = (this.textHeight / 2) * this.attrs.scaleY\n const left = Math.min(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\n const right = Math.max(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\n const top = Math.min(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\n const bottom = Math.max(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nSymbolElement.prototype.defaults = { fill: 'rgba(0,0,0,1)' }\n\nSymbolElement.prototype.modalConfig = {\n inputs: [{ type: 'background', name: 'fill', label: 'Fill' }],\n}\n\nexport default SymbolElement\n","import { CanvasElementType } from '../constants/common'\nimport arrow from './arrow'\nimport brush_v1 from './brush/brush_v1'\nimport callout_v1 from './callout/callout_v1'\nimport curve from './curve'\nimport element from './element'\nimport elliottWaves from './elliott_waves/elliott_waves'\nimport ellipse from './ellipse'\nimport ellipse_v1 from './ellipse/ellipse_v1'\nimport fibonacci from './fibonacci_retracements'\nimport horizontalLine from './horizontal_line'\nimport line from './line'\nimport measure from './measure'\nimport pitchfork_v1 from './pitchfork/pitchfork_v1'\nimport polygon from './polygon'\nimport position from './position'\nimport rectangle from './rectangle'\nimport rotatedRectangle from './rotated_rectangle'\nimport rotatedRectangle_v1 from './rotated_rectangle/rotated_rectangle_v1'\nimport scaledLine from './scaled_line'\nimport scaledText from './scaled_text'\nimport symbolElement from './symbol'\nimport text from './text'\nimport triangle from './triangle'\nimport verticalLine from './vertical_line'\nimport xabcd from './xabcd'\n\nexport const drawingToolsByType = Object.freeze({\n [CanvasElementType.element]: element,\n [CanvasElementType.arrow]: arrow,\n [CanvasElementType.brushV1]: brush_v1,\n [CanvasElementType.calloutV1]: callout_v1,\n [CanvasElementType.curve]: curve,\n [CanvasElementType.elliottWaves]: elliottWaves,\n [CanvasElementType.ellipse]: ellipse,\n [CanvasElementType.ellipseV1]: ellipse_v1,\n [CanvasElementType.fibonacciRetracements]: fibonacci,\n [CanvasElementType.horizontalLine]: horizontalLine,\n [CanvasElementType.line]: line,\n [CanvasElementType.measure]: measure,\n [CanvasElementType.pitchforkV1]: pitchfork_v1,\n [CanvasElementType.polygon]: polygon,\n [CanvasElementType.position]: position,\n [CanvasElementType.rectangle]: rectangle,\n [CanvasElementType.rotatedRectangle]: rotatedRectangle,\n [CanvasElementType.rotatedRectangleV1]: rotatedRectangle_v1,\n [CanvasElementType.scaledLine]: scaledLine,\n [CanvasElementType.scaledText]: scaledText,\n [CanvasElementType.symbol]: symbolElement,\n [CanvasElementType.text]: text,\n [CanvasElementType.triangle]: triangle,\n [CanvasElementType.verticalLine]: verticalLine,\n [CanvasElementType.xabcd]: xabcd,\n})\n","import Spine from '@finviz/spine'\nimport merge from 'lodash.merge'\nimport mergewith from 'lodash.mergewith'\nimport omit from 'lodash.omit'\n\nimport {\n ChartConfigChartPaneElement,\n ObjectHash,\n PaneArea,\n RequireByKey,\n TodoObjectHashAnyType,\n} from '../../types/shared'\nimport Thumb from '../canvas/thumb'\nimport {\n CanvasElementType,\n ChartElementType,\n ChartEventType,\n IVisibility,\n IndicatorType,\n MacroTimeframe,\n MicroMacroTimeframe,\n OverlayType,\n SetVisibilityTo,\n TIMEFRAME,\n} from '../constants/common'\nimport Chart from '../models/chart'\nimport PaneModel, { ScaleAxis } from '../models/pane'\nimport Quote from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport { isInRange } from '../utils/helpers'\n\nexport type TodoModalConfig = TodoObjectHashAnyType\ntype TodoPositionTimestamps = TodoObjectHashAnyType\n\nexport interface DefaultAttrs extends ObjectHash {\n positionTimestamps?: TodoPositionTimestamps\n visibility?: IVisibility\n}\n\nclass Element extends Spine.Module {\n static type: CanvasElementType | OverlayType | ChartElementType | IndicatorType | ChartEventType =\n CanvasElementType.element\n\n static fromObject(obj: T['attrs'], model: T['model']) {\n return new this(obj, model) as T\n }\n\n static getNumOfBarsBuffer(\n _?: RequireByKey | RequireByKey\n ) {\n return 0\n }\n\n isCreator = false\n isCreatorDialogOpen = false\n attrs: Attrs = {} as Attrs\n\n model: any\n _thumbs: Thumb[]\n\n getDefaults?(): Partial\n renderCross?(ctx: RenderingContext2DType): void\n renderCrossText?(\n ctx: RenderingContext2DType,\n crossIndex: number,\n getDataByCrossIndex?: (key: keyof Quote, shouldReturnRoundedString?: boolean) => string | undefined\n ): void\n\n renderContent?(ctx: RenderingContext2DType): void\n renderGrid?(ctx: RenderingContext2DType): void\n renderLabels?(ctx: RenderingContext2DType): void\n declare defaults?: Partial\n getModalConfigBase?(): TodoModalConfig\n declare modalConfig?: TodoModalConfig\n getMinMax?(): { min: number; max: number }\n setupAxis?(fx: ScaleAxis): void | { min: number; max: number }\n\n activeThumb: Thumb | null = null\n isMouseDown = false\n isSelected = false\n isHovered = false\n isEditInProgress = false\n declare scaled?: ObjectHash | Partial\n\n declare toolsCallback: () => void\n\n constructor(values: Partial, model: Model) {\n super(values, model)\n this.model = model\n if (this.getDefaults) {\n this.set(this.getDefaults() || {})\n } else {\n this.set(this.defaults || {})\n }\n this.set(values)\n this._thumbs = []\n\n this.onMouseDown = this.onMouseDown.bind(this)\n this.onMouseMove = this.onMouseMove.bind(this)\n this.onMouseUp = this.onMouseUp.bind(this)\n this.bind('mousedown', this.onMouseDown)\n this.bind('mousemove', this.onMouseMove)\n this.bind('mouseup', this.onMouseUp)\n this.bind('change', () => {\n // elements is optional because this.model is not Pane in all usecases, e.g. base_chart extends this element and sets Chart as model\n const element = this.getIsChartEvent()\n ? this.model.chartEvents?.()?.findByAttribute('instance', this)\n : this.model.elements?.()?.findByAttribute('instance', this)\n\n element?.trigger('change', element)\n })\n }\n\n get type() {\n return (this.constructor as typeof Element).type\n }\n\n getThumbs() {\n return this._thumbs\n }\n\n moveBy(_: number, __: number) {}\n\n setIsSelected(isSelected: boolean) {\n this.isSelected = isSelected\n this.trigger('change')\n }\n\n setIsHovered(isHovered: boolean) {\n this.isHovered = isHovered\n this.trigger('change')\n }\n\n getShouldRenderThumbs() {\n return this.isSelected || this.isHovered\n }\n\n getIsPaneSelection(): boolean {\n const paneModel = this.model.elements().findByAttribute('instance', this)?.pane() as PaneModel | undefined\n return paneModel?.selection === this\n }\n\n set(obj: Partial) {\n const attrsSubset = Object.keys(obj).reduce(\n (acc, key) => ({ ...acc, [key]: this.attrs[key] }),\n {} as Partial\n )\n if (JSON.stringify(obj) !== JSON.stringify(attrsSubset)) {\n const customizer = (objValue: Partial, srcValue: Partial, key: keyof Attrs) => {\n if (this.getIsDrawing() && key === 'visibility') {\n return srcValue ?? {}\n }\n }\n mergewith(this.attrs, obj, customizer)\n if (this.getIsPaneSelection() && !this.getIsCreator()) {\n this.cachePointPositionTimestamp()\n }\n this.trigger('change', this)\n }\n return this\n }\n\n get(key: T) {\n return this.attrs[key]\n }\n\n getBoundingPointKeys = (): { x: string[]; y: string[] } | void => {}\n\n fx = (x: number) => this.model.scale.x(x)\n\n fy = (y: number) => this.model.scale.y(y)\n\n scale({ x, y }: { x: string[]; y: string[] }) {\n this.scaled = {}\n x.forEach((el) => {\n Object.defineProperty(this.scaled, el, {\n get: () => this.fx(this.attrs[el]),\n })\n })\n\n y.forEach((el) => {\n Object.defineProperty(this.scaled, el, {\n get: () => this.fy(this.attrs[el]),\n })\n })\n }\n\n render(_: RenderingContext2DType) {}\n\n renderThumbs(context: CanvasRenderingContext2D) {\n const isHoveredThumbStyle = this.isHovered && !this.isSelected\n if (isHoveredThumbStyle) {\n context.globalAlpha = 0.5\n }\n this.getThumbs().map((thumb) => thumb.render(context))\n context.globalAlpha = 1\n }\n\n onMouseDown(area: PaneArea) {\n this.isMouseDown = true\n this.isEditInProgress = true\n for (const thumb of this.getThumbs()) {\n if (thumb.isInArea(area)) {\n this.activeThumb = thumb\n this.activeThumb.startEditing(area)\n return\n }\n }\n }\n\n onMouseMove(area: PaneArea) {\n if (!area.mouseDown) {\n return\n }\n if (this.activeThumb != null) {\n this.activeThumb.moveTo(area)\n this.trigger('change')\n }\n }\n\n onMouseUp(_?: PaneArea) {\n this.isMouseDown = false\n this.isEditInProgress = false\n this.activeThumb = null\n if (!this.getIsCreator() && !this.getIsChartEvent()) {\n this.cachePointPositionTimestamp()\n }\n this.trigger('change', this)\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart().quote()\n if (quote) {\n const { x: xPointKeys } = this.getBoundingPointKeys()!\n const positionTimestamps = xPointKeys.reduce((acc, key) => {\n const positionX = this.attrs[key]\n const timeStamp = positionX && quote.getTimestampFomPositionX(positionX)\n return {\n ...acc,\n [key]: timeStamp,\n }\n }, {}) as TodoPositionTimestamps\n this.set({ positionTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionTimestamps } = this.attrs\n if (!quote || !positionTimestamps) {\n // positionTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const pointPoitionsFromTimestamp = Object.entries(positionTimestamps).reduce(\n (acc, [key, timestamp]) => ({\n ...acc,\n [key]: timestamp && quote.getPositionXFromTimestamp(timestamp),\n }),\n {}\n )\n this.set(pointPoitionsFromTimestamp)\n }\n\n thumbsAreInArea(area: PaneArea) {\n for (const thumb of this.getThumbs()) {\n if (thumb.isInArea(area)) {\n return true\n }\n }\n return false\n }\n\n isInArea(area: PaneArea) {\n return this.thumbsAreInArea(area)\n }\n\n isDrawingElementLockedOrInvisible() {\n return this.model.chart().chart_layout().isLockDrawingsActive || !this.getIsVisible()\n }\n\n getModalConfig() {\n let config\n if (this.getModalConfigBase) {\n config = merge({}, this.getModalConfigBase())\n } else {\n config = merge({}, this.modalConfig)\n }\n if (this.getIsDrawing()) {\n config.inputs.push({ type: 'visibility', name: 'visibility', label: 'Visibility' })\n }\n if (config.title == null) {\n config.title = this.name\n }\n for (const input of config.inputs) {\n if (input.default != null) {\n input.value = input.default\n }\n if (this.attrs[input.name] != null) {\n input.value = this.attrs[input.name]\n }\n }\n return config\n }\n\n toObject() {\n return merge({}, this.attrs, { type: this.type })\n }\n\n toConfig(): T['attrs'] & { type: T['type'] } {\n return this.toObject()\n }\n\n getAutosaveOmittedProperties() {\n return this.attrs.positionTimestamps ? Object.keys(this.attrs.positionTimestamps) : []\n }\n\n toAutosaveConfig() {\n // We don't want to save attrs which are stored in \"position timestamps\" because they are relative to timeframe for example\n // so in order to keep drawings in sync across different timeframes we can't rely on its position but we have to rely on \"position timestamps\" and then call updateScales to calculate correct positions for given timeframe\n return omit(this.toConfig(), this.getAutosaveOmittedProperties()) as Partial\n }\n\n replaceMyself(element: Element) {\n setTimeout(() => {\n element.cachePointPositionTimestamp()\n const el = this.model.elements().findByAttribute('instance', this)\n if (!el) {\n // Temporary code below\n // additional info gaining for https://finvizcom.sentry.io/issues/3990343438/events/e87ce8b4108341cf81f15ec78707c65e/?project=33153&query=is%3Aunresolved+Cannot+read+properties+of+undefined&referrer=previous-event&statsPeriod=14d&stream_index=0\n window.Sentry?.captureMessage('element.ts replaceMyself', {\n extra: {\n oldElement: {\n type: this?.type,\n isCreator: this?.isCreator,\n isMouseDown: this?.isMouseDown,\n isSelected: this?.isSelected,\n isHovered: this?.isHovered,\n isEditInProgress: this?.isEditInProgress,\n },\n newElement: {\n type: element?.type,\n isCreator: element?.isCreator,\n isMouseDown: element?.isMouseDown,\n isSelected: element?.isSelected,\n isHovered: element?.isHovered,\n isEditInProgress: element?.isEditInProgress,\n },\n },\n })\n } else {\n el.replace(element)\n }\n })\n }\n\n toString() {\n return this.name\n }\n\n getIsCreator() {\n return this.isCreator\n }\n\n getIsCreatorDialogOpen() {\n return this.isCreatorDialogOpen\n }\n\n release() {\n this.cachePointPositionTimestamp()\n this.unbind()\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.model.chart().chart_layout())\n }\n\n getIsDrawing() {\n return !!this.type.startsWith('canvas/')\n }\n\n getIsChartEvent() {\n return !!this?.type.startsWith('chartEvent/')\n }\n\n getIsVisible() {\n const { micro, macro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\n const visibility = this.attrs.visibility?.[macro]\n\n // this.attrs.visibility.minutes === undefined: drawing visible on any minutes timeframe\n if (visibility === undefined) return true\n // this.attrs.visibility.minutes === {}: drawing invisible on any minutes timeframe\n if (Object.keys(visibility).length === 0) return false\n // this.attrs.visibility.minutes === {from: 5, to: 15}: drawing visible on minutes TF between 5 & 15 interval\n return isInRange({ value: micro, min: visibility.from, max: visibility.to })\n }\n\n setVisibilityTo(setTo: SetVisibilityTo) {\n const { macro, micro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\n const currentIndex = Object.keys(MacroTimeframe).indexOf(macro)\n\n let timeframesToSet: string[] = []\n let attrsToSet: { from?: number; to?: number } = {}\n\n switch (setTo) {\n case SetVisibilityTo.currentAndAbove: {\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index < currentIndex)\n attrsToSet = { from: micro }\n break\n }\n case SetVisibilityTo.currentAndBelow: {\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index > currentIndex)\n attrsToSet = { to: micro }\n break\n }\n case SetVisibilityTo.currentOnly: {\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index !== currentIndex)\n attrsToSet = { from: micro, to: micro }\n break\n }\n case SetVisibilityTo.all:\n default: {\n this.set({ visibility: {} } as Partial)\n return\n }\n }\n\n this.set({\n visibility: Object.assign({}, ...timeframesToSet.map((item) => ({ [item]: {} })), { [macro]: attrsToSet }),\n } as Partial)\n }\n\n getIsInChartView(_: Chart) {\n return true\n }\n}\n\nexport default Element\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType, TextAlign, TextBaseline } from '../../constants/common'\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Text from '../text'\nimport Thumb from '../thumb'\n\nexport interface IElliottWavesAttrs {\n waves: Array<{ x: number; y: number }>\n positionWavesTimestamps?: Array<{ x: number; y: number }>\n border: DrawingBorder\n}\n\nclass ElliottWaves extends Element {\n static type = CanvasElementType.elliottWaves\n\n name = 'Elliott Wave'\n waves = ['', 'I', 'II', 'III', 'IV', 'V']\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n }\n\n getDefaults() {\n return {\n border: {\n width: 2,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n context.translate(offset, offset)\n context.beginPath()\n context.moveTo(Math.round(this.fx(this.attrs.waves[0].x)), Math.round(this.fy(this.attrs.waves[0].y)))\n for (const p of this.attrs.waves.slice(1)) {\n context.lineTo(Math.round(this.fx(p.x)), Math.round(this.fy(p.y)))\n }\n context.stroke()\n context.translate(offset * -1, offset * -1)\n\n const text = new Text(\n {\n font: { size: 8, style: 'bold' },\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.center,\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n },\n this.model\n )\n for (let i = 0; i < this.attrs.waves.length; i++) {\n let y\n const p = this.attrs.waves[i]\n if (i > 0 && this.attrs.waves[i - 1].y > p.y) {\n y = this.fy(p.y) + 8\n } else {\n y = this.fy(p.y) - 8\n }\n text.set({ text: this.waves[i], x: this.fx(p.x), y })\n text.render(context)\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n return this.attrs.waves.map(\n (wave, index) =>\n new Thumb(\n `${index}`,\n () => wave.x,\n () => wave.y,\n this.resize,\n this.model\n )\n )\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart().quote()\n if (quote) {\n const positionWavesTimestamps = this.attrs.waves.map((wave) => ({\n ...wave,\n x: quote.getTimestampFomPositionX(wave.x),\n }))\n\n this.set({ positionWavesTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionWavesTimestamps } = this.attrs\n if (!quote || !positionWavesTimestamps) {\n // positionWavesTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const waves = positionWavesTimestamps.map((wave) => ({\n ...wave,\n x: quote.getPositionXFromTimestamp(wave.x),\n }))\n this.set({ waves } as Partial)\n }\n\n moveBy(x: number, y: number) {\n for (const point of this.attrs.waves) {\n point.x += x\n point.y += y\n }\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n this.attrs.waves[+type].x += difX\n this.attrs.waves[+type].y += difY\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const waves = this.attrs.waves\n for (let i = 0; i < waves.length - 1; i++) {\n if (\n math.distanceToSegment(area.scaled, {\n x1: this.fx(waves[i].x),\n y1: this.fy(waves[i].y),\n x2: this.fx(waves[i + 1].x),\n y2: this.fy(waves[i + 1].y),\n }) <= 10\n ) {\n return true\n }\n }\n return super.isInArea(area)\n }\n\n getAutosaveOmittedProperties() {\n return ['waves']\n }\n}\n\nElliottWaves.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default ElliottWaves\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport math from '../../helpers/math'\nimport { getContextWithCache } from '../../lib/shims'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Thumb from '../thumb'\n\nexport interface IEllipseAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n cursorTargetX: number\n cursorTargetY: number\n\n fill: string\n border: DrawingBorder\n}\n\ninterface Coordinates {\n P1: Point\n P2: Point\n P3: Point\n P4: Point\n CP1: Point\n CP2: Point\n CP3: Point\n CP4: Point\n}\n\nclass EllipseV1 extends Element {\n static type = CanvasElementType.ellipseV1\n\n name = 'Ellipse'\n\n untranslatedContext: CanvasRenderingContext2D | null = null\n declare ellipsePath: Path2D\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\n this._thumbs = [\n new Thumb(\n 'left',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'right',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'top',\n () => this.getEllipsePoints(true).P2.x || this.attrs.x1,\n () => this.getEllipsePoints(true).P2.y || this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'bottom',\n () => this.getEllipsePoints(true).P4.x || this.attrs.x2,\n () => this.getEllipsePoints(true).P4.y || this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const coordinates = this.getEllipsePoints() as Coordinates\n const ellipse = new Path2D()\n context.set('fillStyle', this.attrs.fill)\n context.beginPath()\n if (coordinates.P2.x === coordinates.P3.x || coordinates.P2.y === coordinates.P3.y) {\n ellipse.lineTo(coordinates.P1.x, coordinates.P1.y)\n ellipse.lineTo(coordinates.P2.x, coordinates.P2.y)\n } else {\n ellipse.moveTo(coordinates.P4.x, coordinates.P4.y)\n ellipse.bezierCurveTo(\n coordinates.CP4.x,\n coordinates.CP4.y,\n coordinates.CP1.x,\n coordinates.CP1.y,\n coordinates.P2.x,\n coordinates.P2.y\n )\n ellipse.bezierCurveTo(\n coordinates.CP2.x,\n coordinates.CP2.y,\n coordinates.CP3.x,\n coordinates.CP3.y,\n coordinates.P4.x,\n coordinates.P4.y\n )\n ellipse.closePath()\n this.ellipsePath = ellipse\n context.fill(ellipse)\n }\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n context.stroke(ellipse)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getEllipsePoints(inverted = false) {\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\n\n const P1 = { x: x2, y: y2 }\n const P3 = { x: x1, y: y1 }\n\n let perpendicularPoint\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\n const cursor = { x: cursorTargetX, y: cursorTargetY }\n const line = { x1, y1, x2, y2 }\n const distance = math.distanceToLine(cursor, line)\n perpendicularPoint = math.perpendicularPointToLine({\n distance,\n line,\n })\n } else {\n return {\n P1: P3,\n P2: P1,\n P3: P1,\n P4: P3,\n }\n }\n\n const lineCenterX = (P1.x + P3.x) / 2\n const lineCenterY = (P1.y + P3.y) / 2\n const pointOffsetX = perpendicularPoint.x - P1.x\n const pointOffsetY = perpendicularPoint.y - P1.y\n\n const P2 = { x: lineCenterX + pointOffsetX, y: lineCenterY + pointOffsetY }\n const P4 = { x: lineCenterX + -1 * pointOffsetX, y: lineCenterY + -1 * pointOffsetY }\n const invertX = this.model.scale.x.invert\n const invertY = this.model.scale.y.invert\n if (inverted) {\n return {\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\n }\n }\n\n const perpendicularPointEllipseOffsetX = (perpendicularPoint.x - P2.x) / 0.75 - (perpendicularPoint.x - P2.x)\n const perpendicularPointEllipseOffsetY = (perpendicularPoint.y - P2.y) / 0.75 - (perpendicularPoint.y - P2.y)\n\n const P1WithOffsetX = P1.x + perpendicularPointEllipseOffsetX\n const P1WithOffsetY = P1.y + perpendicularPointEllipseOffsetY\n\n const P3WithOffsetX = P3.x - perpendicularPointEllipseOffsetX\n const P3WithOffsetY = P3.y - perpendicularPointEllipseOffsetY\n\n const CP1 = {\n x: perpendicularPoint.x + perpendicularPointEllipseOffsetX,\n y: perpendicularPoint.y + perpendicularPointEllipseOffsetY,\n }\n const controlPointOffsetX = CP1.x - P1WithOffsetX\n const controlPointOffsetY = CP1.y - P1WithOffsetY\n\n const CP2 = { x: P3WithOffsetX + controlPointOffsetX, y: P3WithOffsetY + controlPointOffsetY }\n const CP3 = { x: P3WithOffsetX + -1 * controlPointOffsetX, y: P3WithOffsetY + -1 * controlPointOffsetY }\n const CP4 = { x: P1WithOffsetX + -1 * controlPointOffsetX, y: P1WithOffsetY + -1 * controlPointOffsetY }\n\n return {\n P1,\n P2,\n P3,\n P4,\n CP1,\n CP2,\n CP3,\n CP4,\n }\n }\n\n getRotatedPointCoordinates = ({\n rotationAxisPoint,\n pointToRotate,\n oldLinePoint,\n newLinePoint,\n }: {\n rotationAxisPoint: { x: number; y: number }\n pointToRotate: { x: number; y: number }\n oldLinePoint: { x: number; y: number }\n newLinePoint: { x: number; y: number }\n }) => {\n const angle = math.sharedPointLinesAngle({\n sharedPoint: rotationAxisPoint,\n oldLinePoint,\n newLinePoint,\n })\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\n rotationAxisPoint,\n angle,\n pointToRotate,\n })\n return {\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.cursorTargetX += x\n this.attrs.cursorTargetY += y\n }\n\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'left':\n const newLeftPoint = {\n x: this.attrs.x1 + difX,\n y: this.attrs.y1 + difY,\n }\n const leftRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\n newLinePoint: { x: this.model.scale.x(newLeftPoint.x), y: this.model.scale.y(newLeftPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x1: newLeftPoint.x,\n y1: newLeftPoint.y,\n cursorTargetX: leftRotatedCursorPoint.x,\n cursorTargetY: leftRotatedCursorPoint.y,\n }\n break\n case 'right':\n const newRightPoint = {\n x: this.attrs.x2 + difX,\n y: this.attrs.y2 + difY,\n }\n const rightRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\n newLinePoint: { x: this.model.scale.x(newRightPoint.x), y: this.model.scale.y(newRightPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x2: newRightPoint.x,\n y2: newRightPoint.y,\n cursorTargetX: rightRotatedCursorPoint.x,\n cursorTargetY: rightRotatedCursorPoint.y,\n }\n break\n case 'top':\n case 'bottom':\n this.attrs = {\n ...this.attrs,\n cursorTargetX: area.x,\n cursorTargetY: area.y,\n }\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (this.ellipsePath && this.untranslatedContext?.isPointInPath(this.ellipsePath, area.scaled.x, area.scaled.y)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nEllipseV1.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default EllipseV1\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\ntype Coefficients = string\n\nexport interface IFibonacciRetracementsAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n coefficients: Coefficients\n border: DrawingBorder\n}\n\nclass FibonacciRetracements<\n Attrs extends IFibonacciRetracementsAttrs = IFibonacciRetracementsAttrs,\n> extends Element {\n static type = CanvasElementType.fibonacciRetracements\n\n name = 'Fibonacci Retracements'\n declare coefficients: { default: string; parsed: number[]; max: number }\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'oneCoefficient_1',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'oneCoefficient_2',\n () => this.attrs.x2,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'zeroCoefficient_1',\n () => this.attrs.x1,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'zeroCoefficient_2',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.parseCoefficients(this.attrs.coefficients)\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 1,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n coefficients: [0, 0.236, 0.382, 0.5, 0.618, 1].toString(),\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n parseCoefficients(coefficients: Coefficients) {\n if (!this.coefficients || coefficients !== this.coefficients.default) {\n const parsed = coefficients.split(',').map((x) => parseFloat(x.trim()))\n this.coefficients = { default: coefficients, parsed, max: Math.max(...parsed) }\n }\n }\n\n getMaxCoefficientUnscaledY() {\n return this.model.scale.y.invert(this.scaled.y2 - this.coefficients.max * (this.scaled.y2 - this.scaled.y1))\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY, y2: roundedXY.y1 })\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n this.parseCoefficients(this.attrs.coefficients)\n\n const height = this.attrs.y2 - this.attrs.y1\n const heightScaled = roundedXY.y2 - roundedXY.y1\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n for (const p of this.coefficients.parsed) {\n context.moveTo(roundedXY.x1, Math.round(y2 - p * heightScaled))\n context.lineTo(roundedXY.x2, Math.round(y2 - p * heightScaled))\n }\n context.stroke()\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n const text = new Text(\n {\n x: roundedXY.x1,\n font: { size: 8, style: 'bold' },\n textBaseline: TextBaseline.bottom,\n fillStyle: this.attrs.border.color,\n textAlign: TextAlign.left,\n },\n this.model\n )\n if (roundedXY.x1 > roundedXY.x2) {\n text.set({ textAlign: TextAlign.right })\n }\n\n for (const p of this.coefficients.parsed) {\n const y = this.attrs.y2 - p * height\n text.set({\n text: (p * 100).toFixed(1) + '%: ' + y.toFixed(2),\n y: Math.round(this.fy(y) - this.attrs.border.width / 2),\n } as Partial)\n text.render(context)\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n if (this.coefficients.max > 1 && this._thumbs.length < 6) {\n this._thumbs = [\n ...this._thumbs,\n new Thumb(\n 'maxCoefficient_1',\n () => this.attrs.x1,\n () => this.getMaxCoefficientUnscaledY(),\n this.resize,\n this.model\n ),\n new Thumb(\n 'maxCoefficient_2',\n () => this.attrs.x2,\n () => this.getMaxCoefficientUnscaledY(),\n this.resize,\n this.model\n ),\n ]\n }\n if (this.coefficients.max <= 1 && this._thumbs.length > 4) {\n this._thumbs.splice(4)\n }\n\n return this._thumbs\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'oneCoefficient_1':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'oneCoefficient_2':\n this.attrs.x2 += difX\n this.attrs.y1 += difY\n break\n case 'zeroCoefficient_1':\n this.attrs.x1 += difX\n this.attrs.y2 += difY\n break\n case 'zeroCoefficient_2':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'maxCoefficient_1':\n this.attrs.x1 += difX\n this.attrs.y1 += difY / this.coefficients.max\n break\n case 'maxCoefficient_2':\n this.attrs.x2 += difX\n this.attrs.y1 += difY / this.coefficients.max\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const maxCoefficientY = this.coefficients.max > 1 && this.getMaxCoefficientUnscaledY()\n const left = Math.min(this.attrs.x1, this.attrs.x2)\n const right = Math.max(this.attrs.x1, this.attrs.x2)\n const top = maxCoefficientY\n ? Math.min(this.attrs.y1, this.attrs.y2, maxCoefficientY)\n : Math.min(this.attrs.y1, this.attrs.y2)\n const bottom = maxCoefficientY\n ? Math.max(this.attrs.y1, this.attrs.y2, maxCoefficientY)\n : Math.max(this.attrs.y1, this.attrs.y2)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nFibonacciRetracements.prototype.modalConfig = {\n inputs: [\n { type: 'line', name: 'border' },\n { type: 'string', name: 'coefficients', label: 'Coefficients' },\n ],\n}\n\nexport default FibonacciRetracements\n","import { Maybe, RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\nimport Text from './text'\n\nconst DEFAULT_DECIMAL_PLACES = 2\n\nclass HorizontalLine extends ScaledLine {\n static type = CanvasElementType.horizontalLine\n\n name = 'Horizontal line'\n decimalPlaces = DEFAULT_DECIMAL_PLACES\n declare scaled: Pick\n declare model: PaneModel\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.updateDecimalPlaces()\n\n if (this.attrs.y1) {\n this.attrs.y1 = Number(math.round({ value: this.attrs.y1, overridePlaces: this.decimalPlaces }))\n }\n if (this.modalConfig) {\n const step = `0.${'0'.repeat(this.decimalPlaces - 1)}1`\n this.modalConfig.inputs[1] = {\n ...this.modalConfig.inputs[1],\n step,\n min: Number(step),\n }\n }\n this.renderContent = this.renderContent.bind(this)\n this._thumbs = []\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n updateDecimalPlaces() {\n const quote = this.model.chart().quote()\n this.decimalPlaces = quote\n ? math.getInstrumentDecimalPlaces({\n instrument: quote.instrument,\n value: quote.lastClose,\n })\n : DEFAULT_DECIMAL_PLACES\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n this.attrs.y2 = this.attrs.y1\n // mixing scaled and unscaled values, do not copy paste as solution\n this.attrs.x1 = ChartSettings.left.width * -1\n this.attrs.x2 =\n this.model\n .chart()\n .quote()\n .getBarIndex(this.model.chart().quote().close.length - 1) + this.model.chart().width\n super.renderContent(context)\n }\n\n renderLabels(context: CanvasRenderingContext2D) {\n if (this.attrs.y1) {\n this.updateDecimalPlaces()\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const isIndicatorPane = this.model\n .elements()\n .all()\n .some((element) => element.isIndicator())\n const settings = isIndicatorPane ? IndicatorSettings : ChartSettings\n context.translate(this.model.chart().width - settings.right.width, settings.top.height)\n new Text(\n {\n x: 6,\n y: this.scaled.y1,\n font: { size: 8, style: 'bold' },\n lineHeight: 8,\n padding: {\n top: 2,\n right: 2,\n bottom: 2,\n left: 2,\n },\n fillStyle: '#fff',\n background: '#000',\n textBaseline: TextBaseline.middle,\n text: this.attrs.y1.toFixed(this.decimalPlaces).toString(),\n },\n this.model\n ).render(context)\n }\n }\n\n moveBy(x: Maybe, y: number) {\n this.attrs.y1 += y\n }\n\n resize({ difY }: RequireByKey) {\n this.moveBy(0, difY)\n }\n}\n\nHorizontalLine.prototype.modalConfig = {\n inputs: [\n { type: 'line', name: 'border' },\n { type: 'number', name: 'y1', label: 'Price', allowDecimal: true },\n ],\n}\n\nexport default HorizontalLine\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\ninterface ILineAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n dashLength: number\n lineWidth: number\n strokeStyle: string\n}\n\nclass Line extends Element {\n static type = CanvasElementType.line\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.render = this.render.bind(this)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'l',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'r',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n }\n\n getDefaults() {\n return {\n lineWidth: 1,\n strokeStyle: this.getChartLayoutSettings().ElementSettings.Colors.line,\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n render(context: CanvasRenderingContext2D) {\n const { x1, y1, x2, y2, lineWidth } = this.attrs\n const roundedXY = getRoundedObject({ x1, y1, x2, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth, ...roundedXY })\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n context.set('lineWidth', this.attrs.lineWidth)\n context.set('strokeStyle', this.attrs.strokeStyle)\n\n context.moveTo(roundedXY.x1, roundedXY.y1)\n if (this.attrs.dashLength) {\n context.setLineDash([this.attrs.dashLength])\n }\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n if (this.attrs.dashLength) {\n context.setLineDash([])\n }\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'l') {\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n } else {\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (math.distanceToSegment(area, this.attrs) <= 10) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nexport default Line\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport { getRoundedObject } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport { numberToStringWithUnitsSuffix } from '../utils'\nimport { getRoundedString } from '../utils/helpers'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\ninterface Coordinates {\n x1: number\n x2: number\n y1: number\n y2: number\n}\n\nexport interface IMeasureAttrs extends Coordinates {\n fill: string\n}\n\nclass Measure extends Element {\n static type = CanvasElementType.measure\n\n name = 'Measure'\n declare scaled: Pick\n\n x1Dif: number\n x2Dif: number\n startingX1: number\n startingX2: number\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'tl',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'br',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n this.x1Dif = this.x2Dif = 0\n\n this.startingX1 = this.attrs.x1\n this.startingX2 = this.attrs.x2\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n getVolumeSumString = () => {\n const { volume, barIndex }: { volume: number[]; barIndex: number[] } = this.model.chart().quote()\n const roundedX1 = Math.round(this.attrs.x1)\n const roundedX2 = Math.round(this.attrs.x2)\n // min/max values are offset by 1 so there's no value on such index\n // and at the same time it won't iterate over unlimited number of nonexisting indexes\n const minIndexLimit = barIndex[0] - 1\n const maxIndexLimit = barIndex[barIndex.length - 1] + 1\n const volMinIndex = Math.min(Math.max(Math.min(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\n const volMaxIndex = Math.min(Math.max(Math.max(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\n\n let volumeSum = 0\n for (let i = volMinIndex; i <= volMaxIndex; i++) {\n const volumeIndex = barIndex.indexOf(i)\n if (volumeIndex >= 0) {\n volumeSum += volume[volumeIndex]\n }\n }\n\n return `Vol ${numberToStringWithUnitsSuffix(volumeSum)}`\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('fillStyle', this.attrs.fill)\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n\n const width = roundedXY.x2 - roundedXY.x1\n const height = roundedXY.y2 - roundedXY.y1\n context.fillRect(x1, roundedXY.y1, width, height)\n\n const priceDif = this.attrs.y2 - this.attrs.y1\n const percentage = (100 / this.attrs.y1) * priceDif\n const heightStr = `${priceDif.toFixed(2)} (${percentage.toFixed(2)}%)`\n\n const text = new Text(\n {\n text: `${getRoundedString({ number: Math.abs(this.attrs.x2 - this.attrs.x1), numOfDecimalPlaces: 2 })} bars`,\n fillStyle: '#333',\n font: { size: 10, family: 'Arial', weight: 'bold' },\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n const baseX = x1 + width / 2\n const baseY = roundedXY.y1 + height / 2\n let textWidth = text.measure(context)\n text.set({\n x: baseX - textWidth / 2,\n y: baseY - text.getHeight(),\n } as Partial)\n text.render(context)\n\n text.set({ text: heightStr })\n textWidth = text.measure(context)\n text.set({\n x: baseX - textWidth / 2,\n y: baseY,\n } as Partial)\n text.render(context)\n\n text.set({ text: this.getVolumeSumString() })\n textWidth = text.measure(context)\n text.set({\n x: baseX - textWidth / 2,\n y: baseY + text.getHeight(),\n } as Partial)\n text.render(context)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n addToCoordinates(difs: Partial) {\n this.attrs.y1 += difs.y1 || 0\n this.attrs.y2 += difs.y2 || 0\n\n this.x1Dif += difs.x1 || 0\n this.x2Dif += difs.x2 || 0\n\n // The reason for adding +1 is to \"ceil\" the number when moving to the left (decreasing bar index)\n const newX1 = ~~(this.startingX1 + this.x1Dif) + (this.x1Dif < 0 ? 1 : 0)\n if (~~this.attrs.x1 - newX1 !== 0) {\n this.attrs.x1 = newX1\n }\n const newX2 = ~~(this.startingX2 + this.x2Dif) + (this.x2Dif < 0 ? 1 : 0)\n if (~~this.attrs.x2 - newX2 !== 0) {\n this.attrs.x2 = newX2\n }\n }\n\n moveBy(x: number, y: number) {\n return this.addToCoordinates({\n x1: x,\n y1: y,\n x2: x,\n y2: y,\n })\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'tl') {\n this.addToCoordinates({ x1: difX, y1: difY })\n } else {\n this.addToCoordinates({ x2: difX, y2: difY })\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const x1 = Math.round(this.attrs.x1)\n const x2 = Math.round(this.attrs.x2)\n\n const left = Math.min(x1, x2)\n const right = Math.max(x1, x2)\n const top = Math.min(this.attrs.y1, this.attrs.y2)\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n\n onMouseDown(paneArea: PaneArea) {\n super.onMouseDown(paneArea)\n this.startingX1 = this.attrs.x1\n this.startingX2 = this.attrs.x2\n }\n\n onMouseUp(paneArea?: PaneArea) {\n super.onMouseUp(paneArea)\n this.x1Dif = this.x2Dif = 0\n }\n}\n\nMeasure.prototype.defaults = { fill: 'rgba(180,220,255,0.8)' }\n\nMeasure.prototype.modalConfig = {\n inputs: [{ type: 'background', name: 'fill' }],\n}\n\nexport default Measure\n","import { Point } from '../../../types/shared'\nimport { getRoundedObject } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport { isInRange } from '../../utils/helpers'\nimport { ITrendAttrs } from './pitchfork_v1'\n\ninterface IGetEdgeIntersectionPointArguments {\n sides: { x: number; y: number }[][]\n rayOrigin: Point\n rayDirection: Point\n}\n\nexport const getEdgeIntersectionPoint = ({ sides, rayOrigin, rayDirection }: IGetEdgeIntersectionPointArguments) => {\n if (rayOrigin.x === rayDirection.x && rayOrigin.y === rayDirection.y) return rayDirection\n\n let intersection = rayDirection\n let intersectionDistance = 0\n for (let index = 0; index < sides.length; index++) {\n const rayToLineIntersection = math.getRayToLineSegmentIntersection(\n rayOrigin,\n rayDirection,\n sides[index][0],\n sides[index][1]\n )\n if (rayToLineIntersection) {\n const distance = math.distance(rayToLineIntersection, rayOrigin)\n if (distance > intersectionDistance && isInRange({ value: distance })) {\n intersectionDistance = distance\n intersection = { x: rayToLineIntersection.x, y: rayToLineIntersection.y }\n }\n }\n }\n\n return intersection\n}\n\nexport const getChartVisibleAreaBoundaries = (paneModel: PaneModel) => {\n const { left, right, top, bottom } = paneModel.getChartLayoutSettings().ChartSettings\n const { leftOffset, width } = paneModel.chart()\n\n const chartVisibleAreaLeftX = Math.abs(leftOffset)\n const chartVisibleAreaRightX = chartVisibleAreaLeftX + width - left.width - right.width\n const chartVisibleAreaTopY = 0\n const chartVisibleAreaBottomY = paneModel.height - top.height - bottom.height\n\n const chartVisibleAreaTopLeftPoint = {\n x: chartVisibleAreaLeftX,\n y: chartVisibleAreaTopY,\n }\n const chartVisibleAreaTopRightPoint = {\n x: chartVisibleAreaRightX,\n y: chartVisibleAreaTopY,\n }\n const chartVisibleAreaBottomLeftPoint = {\n x: chartVisibleAreaLeftX,\n y: chartVisibleAreaBottomY,\n }\n const chartVisibleAreaBottomRightPoint = {\n x: chartVisibleAreaRightX,\n y: chartVisibleAreaBottomY,\n }\n const topSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaTopRightPoint]\n const rightSide = [chartVisibleAreaTopRightPoint, chartVisibleAreaBottomRightPoint]\n const bottomSide = [chartVisibleAreaBottomLeftPoint, chartVisibleAreaBottomRightPoint]\n const leftSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaBottomLeftPoint]\n\n const sides = [topSide, rightSide, bottomSide, leftSide]\n\n return sides\n}\n\ninterface IGetPitchforkCoordinates {\n paneModel: PaneModel\n rayOrigin: Point\n rayDirectionControlPoint1: Point\n rayDirectionControlPoint2?: Point\n trend1: ITrendAttrs\n trend2: ITrendAttrs\n}\n\ninterface ILineSegment {\n P1: Point\n P2: Point\n}\n\ninterface ICoordinates {\n medianRay: ILineSegment\n trend1Ray1: ILineSegment | undefined\n trend1Ray2: ILineSegment | undefined\n trend2Ray1: ILineSegment | undefined\n trend2Ray2: ILineSegment | undefined\n}\n\nexport const getPitchforkCoordinates = ({\n paneModel,\n rayOrigin,\n rayDirectionControlPoint1,\n rayDirectionControlPoint2,\n trend1,\n trend2,\n}: IGetPitchforkCoordinates) => {\n const sides = getChartVisibleAreaBoundaries(paneModel)\n\n const coordinates: ICoordinates = {\n medianRay: { P1: rayOrigin, P2: rayDirectionControlPoint1 },\n trend1Ray1: undefined,\n trend2Ray1: undefined,\n trend1Ray2: undefined,\n trend2Ray2: undefined,\n }\n\n // If rayDirectionControlPoint2 doesn't exist return only medianRay with rayDirectionControlPoint1 as rayDirection\n if (!rayDirectionControlPoint2) {\n coordinates.medianRay = {\n P1: getRoundedObject(rayOrigin),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin,\n rayDirection: rayDirectionControlPoint1,\n })\n ),\n }\n return coordinates\n }\n\n const medianRayDirectionPoint = math.getMiddlePointOnLineSegment(rayDirectionControlPoint1, rayDirectionControlPoint2)\n const rayOriginToRayDirectionVector = {\n x: medianRayDirectionPoint.x - rayOrigin.x,\n y: medianRayDirectionPoint.y - rayOrigin.y,\n }\n\n const rayDirectionControlPoint1ToPoint2Vector = {\n x: rayDirectionControlPoint1.x - rayDirectionControlPoint2.x,\n y: rayDirectionControlPoint1.y - rayDirectionControlPoint2.y,\n }\n\n const normalizedRayDirectionControlPoint1ToPoint2Vector = math.normalizeVector(\n rayDirectionControlPoint1ToPoint2Vector\n )\n\n const medianRayDirectionPointToRayDirectionControlPoint1Distance = math.distance(\n medianRayDirectionPoint,\n rayDirectionControlPoint1\n )\n\n coordinates.medianRay = {\n P1: getRoundedObject(rayOrigin),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin,\n rayDirection: medianRayDirectionPoint,\n })\n ),\n }\n if (trend1.active) {\n const trend1Ray = getTrendRayCoordinates({\n trend: trend1.trend,\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\n rayOriginToRayDirectionVector,\n medianRayDirectionPoint,\n sides,\n })\n\n coordinates.trend1Ray1 = trend1Ray.trendRay1\n coordinates.trend1Ray2 = trend1Ray.trendRay2\n }\n if (trend2.active) {\n const trend2Ray = getTrendRayCoordinates({\n trend: trend2.trend,\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\n rayOriginToRayDirectionVector,\n medianRayDirectionPoint,\n sides,\n })\n\n coordinates.trend2Ray1 = trend2Ray.trendRay1\n coordinates.trend2Ray2 = trend2Ray.trendRay2\n }\n\n return coordinates\n}\n\ninterface IGetTrendRayCoordinates {\n trend: number\n medianToControlPointDistance: number\n normalizedControlToControlPointVector: Point\n rayOriginToRayDirectionVector: Point\n medianRayDirectionPoint: Point\n sides: Point[][]\n}\n\nconst getTrendRayCoordinates = ({\n trend,\n medianToControlPointDistance,\n normalizedControlToControlPointVector,\n rayOriginToRayDirectionVector,\n medianRayDirectionPoint,\n sides,\n}: IGetTrendRayCoordinates) => {\n const medianToTrendLineDistance = medianToControlPointDistance * trend\n\n const trendRayPoint1Origin = math.addPoints(\n medianRayDirectionPoint,\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\n )\n const trendPoint2RayOriginPoint2 = math.subtractPoints(\n medianRayDirectionPoint,\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\n )\n\n const trendRayPoint1DirectionPoint = {\n x: trendRayPoint1Origin.x + rayOriginToRayDirectionVector.x,\n y: trendRayPoint1Origin.y + rayOriginToRayDirectionVector.y,\n }\n const trendPoint2RayDirectionPoint = {\n x: trendPoint2RayOriginPoint2.x + rayOriginToRayDirectionVector.x,\n y: trendPoint2RayOriginPoint2.y + rayOriginToRayDirectionVector.y,\n }\n\n return {\n trendRay1: {\n P1: getRoundedObject(trendRayPoint1Origin),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin: trendRayPoint1Origin,\n rayDirection: trendRayPoint1DirectionPoint,\n })\n ),\n },\n trendRay2: {\n P1: getRoundedObject(trendPoint2RayOriginPoint2),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin: trendPoint2RayOriginPoint2,\n rayDirection: trendPoint2RayDirectionPoint,\n })\n ),\n },\n }\n}\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport { getHEXWithSpecificAplha } from '../../utils/colors'\nimport Element from '../element'\nimport Thumb from '../thumb'\nimport { getPitchforkCoordinates } from './pitchfork_utils'\n\nexport interface ITrendAttrs {\n active: boolean\n trend: number\n color: string\n}\n\nexport interface IPitchforkAttrs {\n x1: number\n y1: number\n x2: number\n y2: number\n x3: number\n y3: number\n median: { color: string; width: number }\n trend1: ITrendAttrs\n trend2: ITrendAttrs\n}\n\nclass Pitchfork extends Element {\n static type = CanvasElementType.pitchforkV1\n\n declare scaled: Pick\n name = 'Pitchfork'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n this._thumbs = [\n new Thumb(\n 'medianRayOrigin',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'rayDirectionControlPoint1',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'rayDirectionControlPoint2',\n () => this.attrs.x3,\n () => this.attrs.y3,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n median: { color: '#e72f2f', width: 1 },\n trend1: {\n color: '#004ad31c',\n active: true,\n trend: 1,\n },\n trend2: {\n color: '#00ca4e1f',\n active: true,\n trend: 0.5,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n\n const offset = getOffsetFromLineWidth(this.attrs.median.width)\n context.translate(offset, offset)\n\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\n paneModel: this.model,\n rayOrigin: { x: x1, y: y1 },\n rayDirectionControlPoint1: { x: x2, y: y2 },\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\n trend1: this.attrs.trend1,\n trend2: this.attrs.trend2,\n })\n\n context.set('lineWidth', this.attrs.median.width)\n\n const trendLines = [\n { trend: this.attrs.trend1, line1: trend1Ray1, line2: trend1Ray2 },\n { trend: this.attrs.trend2, line1: trend2Ray1, line2: trend2Ray2 },\n ].sort((a, b) => {\n if (Math.abs(a.trend.trend) > Math.abs(b.trend.trend)) {\n return -1\n }\n if (Math.abs(a.trend.trend) < Math.abs(b.trend.trend)) {\n return 1\n }\n return 0\n })\n\n // Draw trend lines and fill\n trendLines.forEach((trendLine, trendLineIndex) => {\n if (trendLine.line1 && trendLine.line2) {\n const { line1, line2 } = trendLine\n const solidTrendColor = getHEXWithSpecificAplha(trendLine.trend.color)\n const nextTrendLine = trendLines[trendLineIndex + 1]\n\n context.beginPath()\n context.moveTo(line1.P1.x, line1.P1.y)\n context.lineTo(line1.P2.x, line1.P2.y)\n if (trendLineIndex !== trendLines.length - 1 && nextTrendLine.line1 && nextTrendLine.line2) {\n context.lineTo(nextTrendLine.line1.P2.x, nextTrendLine.line1.P2.y)\n context.lineTo(nextTrendLine.line1.P1.x, nextTrendLine.line1.P1.y)\n context.moveTo(nextTrendLine.line2.P1.x, nextTrendLine.line2.P1.y)\n context.lineTo(nextTrendLine.line2.P2.x, nextTrendLine.line2.P2.y)\n }\n context.lineTo(line2.P2.x, line2.P2.y)\n context.lineTo(line2.P1.x, line2.P1.y)\n context.closePath()\n context.set('fillStyle', trendLine.trend.color)\n context.fill()\n\n context.beginPath()\n context.moveTo(line1.P1.x, line1.P1.y)\n context.lineTo(line1.P2.x, line1.P2.y)\n context.moveTo(line2.P1.x, line2.P1.y)\n context.lineTo(line2.P2.x, line2.P2.y)\n context.set('strokeStyle', solidTrendColor)\n context.stroke()\n }\n })\n\n // Draw median ray line\n context.beginPath()\n context.moveTo(medianRay.P1.x, medianRay.P1.y)\n context.lineTo(medianRay.P2.x, medianRay.P2.y)\n\n // Draw line between outer trend lines origin points or if smaller than 1 between direction control points\n const outerTrendLines =\n trendLines.filter(\n (item) => item.line1 && item.line2 && item.trend.active && Math.abs(item.trend.trend) >= 1\n )[0] ?? {}\n\n if (outerTrendLines.line1 && outerTrendLines.line2) {\n context.moveTo(outerTrendLines.line1.P1.x, outerTrendLines.line1.P1.y)\n context.lineTo(outerTrendLines.line2.P1.x, outerTrendLines.line2.P1.y)\n } else if (!Number.isNaN(x3) && !Number.isNaN(y3)) {\n context.moveTo(x2, y2)\n context.lineTo(x3, y3)\n }\n\n context.set('strokeStyle', this.attrs.median.color)\n context.stroke()\n\n context.translate(offset * -1, offset * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.x3 += x\n this.attrs.y3 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'medianRayOrigin':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'rayDirectionControlPoint1':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'rayDirectionControlPoint2':\n this.attrs.x3 += difX\n this.attrs.y3 += difY\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\n paneModel: this.model,\n rayOrigin: { x: x1, y: y1 },\n rayDirectionControlPoint1: { x: x2, y: y2 },\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\n trend1: this.attrs.trend1,\n trend2: this.attrs.trend2,\n })\n const outerTrendLines =\n Math.abs(this.attrs.trend1.trend) > Math.abs(this.attrs.trend2.trend)\n ? { line1: trend1Ray1, line2: trend1Ray2 }\n : { line1: trend2Ray1, line2: trend2Ray2 }\n\n if (\n math.distanceToSegment(area.scaled, {\n x1: medianRay.P1.x,\n y1: medianRay.P1.y,\n x2: medianRay.P2.x,\n y2: medianRay.P2.y,\n }) <= 10\n ) {\n // cursor is near median ray\n return true\n } else if (\n !Number.isNaN(x3) &&\n !Number.isNaN(y3) &&\n math.distanceToSegment(area.scaled, {\n x1: x2,\n y1: y2,\n x2: x3,\n y2: y3,\n }) <= 10\n ) {\n // cursor is near line connecting direction control points\n return true\n } else if (\n outerTrendLines.line1 &&\n outerTrendLines.line2 &&\n math.pointInPolygon(area.scaled, [\n outerTrendLines.line1.P1,\n outerTrendLines.line1.P2,\n outerTrendLines.line2.P2,\n outerTrendLines.line2.P1,\n ])\n ) {\n // cursor is on polygon created by outer trend lines\n return true\n }\n return super.isInArea(area)\n }\n}\n\nPitchfork.prototype.modalConfig = {\n inputs: [\n { type: 'line', name: 'median' },\n { type: 'trend', name: 'trend1' },\n { type: 'trend', name: 'trend2' },\n ],\n}\n\nexport default Pitchfork\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\ntype Points = Array<{ x: number; y: number }>\n\nexport interface IPolygonAttrs {\n points: Points\n fill: string\n border: DrawingBorder\n positionPointsTimestamps?: Points\n}\n\nclass Polygon extends Element {\n static type = CanvasElementType.polygon\n\n name = 'Polygon'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this.attrs.fill = this.attrs.fill || 'rgba(50, 60, 70, 0.8)'\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('fillStyle', this.attrs.fill)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.translate(offset, offset)\n\n const { points } = this.attrs\n context.beginPath()\n context.moveTo(this.fx(points[0].x), this.fy(points[0].y))\n for (const p of points.slice(1)) {\n context.lineTo(this.fx(p.x), this.fy(p.y))\n }\n\n if (this.isPolygon()) {\n context.closePath()\n context.fill()\n }\n context.translate(offset * -1, offset * -1)\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n return this.attrs.points.map(\n (point, index) =>\n new Thumb(\n `${index}`,\n () => point.x,\n () => point.y,\n this.resize,\n this.model\n )\n )\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart()?.quote()\n if (quote) {\n const positionPointsTimestamps = this.attrs.points.map((point) => ({\n ...point,\n x: quote.getTimestampFomPositionX(point.x),\n }))\n\n this.set({ positionPointsTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionPointsTimestamps } = this.attrs\n if (!quote || !positionPointsTimestamps) {\n // positionWavesTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const points = positionPointsTimestamps.map((point) => ({\n ...point,\n x: quote.getPositionXFromTimestamp(point.x),\n }))\n this.set({ points } as Partial)\n }\n\n moveBy(x: number, y: number) {\n for (const point of this.attrs.points) {\n point.x += x\n point.y += y\n }\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n const last = this.attrs.points.length - 1\n if (this.isPolygon() && (+type === 0 || +type === last)) {\n this.attrs.points[0].x += difX\n this.attrs.points[0].y += difY\n this.attrs.points[last].x += difX\n this.attrs.points[last].y += difY\n } else {\n this.attrs.points[+type].x += difX\n this.attrs.points[+type].y += difY\n }\n }\n\n isPolygon() {\n return (\n this.attrs.points[0].x === this.attrs.points.last()?.x && this.attrs.points[0].y === this.attrs.points.last()?.y\n )\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const scaledPoints = this.attrs.points.map((p) => ({\n x: this.fx(p.x),\n y: this.fy(p.y),\n }))\n if (this.isPolygon()) {\n if (math.pointInPolygon(area.scaled, scaledPoints)) {\n return true\n }\n } else {\n for (let i = 0; i < scaledPoints.length - 1; i++) {\n if (\n math.distanceToSegment(area.scaled, {\n x1: scaledPoints[i].x,\n y1: scaledPoints[i].y,\n x2: scaledPoints[i + 1].x,\n y2: scaledPoints[i + 1].y,\n }) <= 10\n ) {\n return true\n }\n }\n }\n\n return super.isInArea(area)\n }\n\n getAutosaveOmittedProperties() {\n return ['points']\n }\n}\n\nPolygon.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default Polygon\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport { getRoundedObject } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\ninterface Coordinates {\n x1: number\n x2: number\n y1: number\n y2: number\n}\n\nexport interface IPositionAttrs extends Coordinates {\n targetColor: string\n stopColor: string\n targetY: number\n centerY: number\n stopY: number\n}\n\nclass Position extends Element {\n static type = CanvasElementType.position\n\n name = 'Position'\n\n declare scaled: Pick\n\n x1Dif: number\n x2Dif: number\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 't1',\n () => this.attrs.x1,\n () => this.attrs.targetY,\n this.resize,\n this.model\n ),\n new Thumb(\n 't2',\n () => this.attrs.x2,\n () => this.attrs.targetY,\n this.resize,\n this.model\n ),\n new Thumb(\n 's1',\n () => this.attrs.x1,\n () => this.attrs.stopY,\n this.resize,\n this.model\n ),\n new Thumb(\n 's2',\n () => this.attrs.x2,\n () => this.attrs.stopY,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c1',\n () => this.attrs.x1,\n () => this.attrs.centerY,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c2',\n () => this.attrs.x2,\n () => this.attrs.centerY,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n this.x1Dif = this.x2Dif = 0\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['targetY', 'centerY', 'stopY'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, targetY, centerY, stopY } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, targetY, centerY, stopY })\n let sign, stopBaseline, targetBaseline\n const width = roundedXY.x2 - roundedXY.x1\n\n context.set('fillStyle', this.attrs.targetColor)\n context.fillRect(roundedXY.x1, roundedXY.targetY, width, roundedXY.centerY - roundedXY.targetY)\n\n context.set('fillStyle', this.attrs.stopColor)\n context.fillRect(roundedXY.x1, roundedXY.centerY, width, roundedXY.stopY - roundedXY.centerY)\n\n const targetDif = Math.abs(this.attrs.targetY - this.attrs.centerY)\n const targetPerc = (100 / this.attrs.centerY) * targetDif\n const targetStr = `Target: ${targetDif.toFixed(2)} (${targetPerc.toFixed(2)}%)`\n\n const stopDif = Math.abs(this.attrs.stopY - this.attrs.centerY)\n const stopPerc = (100 / this.attrs.centerY) * stopDif\n const stopStr = `Stop: ${stopDif.toFixed(2)} (${stopPerc.toFixed(2)}%)`\n\n if (this.attrs.targetY > this.attrs.centerY) {\n sign = 1\n targetBaseline = TextBaseline.bottom\n stopBaseline = TextBaseline.top\n } else {\n sign = -1\n targetBaseline = TextBaseline.top\n stopBaseline = TextBaseline.bottom\n }\n\n const text = new Text(\n {\n text: targetStr,\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n font: { size: 10, family: 'Arial', weight: 'bold' },\n y: roundedXY.targetY - sign * 4,\n textBaseline: targetBaseline,\n },\n this.model\n )\n let textWidth = text.measure(context)\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\n text.render(context)\n\n text.set({\n text: stopStr,\n y: roundedXY.stopY + sign * 4,\n textBaseline: stopBaseline,\n })\n textWidth = text.measure(context)\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\n text.render(context)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n addToCoordinates(difs: Partial) {\n let middle, middle1, result\n if (difs.targetY) {\n result = this.attrs.targetY + difs.targetY\n if (\n (this.attrs.targetY > this.attrs.centerY && result < this.attrs.centerY) ||\n (this.attrs.targetY < this.attrs.centerY && result > this.attrs.centerY)\n ) {\n this.attrs.stopY = this.attrs.centerY - (this.attrs.stopY - this.attrs.centerY) // swap target&stop\n }\n this.attrs.targetY = result\n }\n\n if (difs.stopY) {\n result = this.attrs.stopY + difs.stopY\n if (\n (this.attrs.stopY > this.attrs.centerY && result < this.attrs.centerY) ||\n (this.attrs.stopY < this.attrs.centerY && result > this.attrs.centerY)\n ) {\n this.attrs.targetY = this.attrs.centerY - (this.attrs.targetY - this.attrs.centerY) // swap target&stop\n }\n this.attrs.stopY = result\n }\n\n if (\n difs.centerY &&\n ((this.attrs.stopY < (middle = this.attrs.centerY + difs.centerY) && middle < this.attrs.targetY) ||\n (this.attrs.stopY > (middle1 = this.attrs.centerY + difs.centerY) && middle1 > this.attrs.targetY))\n ) {\n this.attrs.centerY += difs.centerY\n }\n\n this.x1Dif += difs.x1 || 0\n this.x2Dif += difs.x2 || 0\n const roundDif = ~~this.x1Dif || ~~this.x2Dif\n if (roundDif !== 0) {\n if (difs.x1 != null) {\n this.attrs.x1 += roundDif\n }\n if (difs.x2 != null) {\n this.attrs.x2 += roundDif\n }\n this.x1Dif = this.x2Dif = 0\n }\n }\n\n moveBy(x: number, y: number) {\n return this.addToCoordinates({\n x1: x,\n x2: x,\n targetY: y,\n centerY: y,\n stopY: y,\n })\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n const [coordType, coordIndex] = (type as string).split('')\n const yPoints: Record = { t: 'targetY', c: 'centerY', s: 'stopY' }\n const obj: Partial = {\n [`x${coordIndex}`]: difX,\n [yPoints[coordType]]: difY,\n }\n return this.addToCoordinates(obj)\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const x1 = Math.round(this.attrs.x1)\n const x2 = Math.round(this.attrs.x2)\n const left = Math.min(x1, x2)\n const right = Math.max(x1, x2)\n const top = Math.min(this.attrs.targetY, this.attrs.stopY)\n const bottom = Math.max(this.attrs.targetY, this.attrs.stopY)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nPosition.prototype.defaults = {\n targetColor: 'rgba(0,200,0,0.3)',\n stopColor: 'rgba(200,0,0,0.3)',\n}\n\nPosition.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'targetColor' },\n { type: 'background', name: 'stopColor' },\n ],\n}\n\nexport default Position\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface IRectangleAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n fill: string\n border: DrawingBorder\n}\n\nclass Rectangle extends Element {\n static type = CanvasElementType.rectangle\n\n name = 'Rectangle'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'br',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'tl',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const width = roundedXY.x2 - roundedXY.x1\n const height = roundedXY.y2 - roundedXY.y1\n\n context.set('fillStyle', this.attrs.fill)\n\n context.fillRect(roundedXY.x1, roundedXY.y1, width, height)\n\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.strokeRect(roundedXY.x1 + offset, roundedXY.y1 + offset, width, height)\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n\n // @todo - Live sync of elements while they are being moved around\n // In order to have live sync across charts we need to trigger change so listeners can update other charts with new values\n // this.set(this.attrs)\n // this.trigger('change', this)\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'tl') {\n this.attrs.x1 += difX\n return (this.attrs.y1 += difY)\n } else {\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const left = Math.min(this.attrs.x1, this.attrs.x2)\n const right = Math.max(this.attrs.x1, this.attrs.x2)\n const top = Math.min(this.attrs.y1, this.attrs.y2)\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nRectangle.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default Rectangle\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Thumb from '../thumb'\n\nexport interface IRotatedRectangleV1Attrs {\n x1: number\n x2: number\n y1: number\n y2: number\n cursorTargetX: number\n cursorTargetY: number\n fill: string\n border: DrawingBorder\n}\n\nclass RotatedRectangleV1 extends Element {\n static type = CanvasElementType.rotatedRectangleV1\n\n name = 'New Rotated Rectangle'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'middleLeft',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'middleRight',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'topRight',\n () => this.getRectCoordinates(true).P1.x || this.attrs.x2,\n () => this.getRectCoordinates(true).P1.y || this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'topLeft',\n () => this.getRectCoordinates(true).P2.x || this.attrs.x2,\n () => this.getRectCoordinates(true).P2.y || this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'bottomLeft',\n () => this.getRectCoordinates(true).P3.x || this.attrs.x1,\n () => this.getRectCoordinates(true).P3.y || this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'bottomRight',\n () => this.getRectCoordinates(true).P4.x || this.attrs.x1,\n () => this.getRectCoordinates(true).P4.y || this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { P1, P2, P3, P4 } = this.getRectCoordinates()\n const roundedXY = {\n P1: getRoundedObject(P1),\n P2: getRoundedObject(P2),\n P3: getRoundedObject(P3),\n P4: getRoundedObject(P4),\n }\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.set('fillStyle', this.attrs.fill)\n\n context.translate(offset, offset)\n context.beginPath()\n if (roundedXY.P1.x === roundedXY.P4.x && roundedXY.P1.y === roundedXY.P4.y) {\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\n } else {\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\n context.lineTo(roundedXY.P3.x, roundedXY.P3.y)\n context.lineTo(roundedXY.P4.x, roundedXY.P4.y)\n context.closePath()\n context.fill()\n }\n context.translate(offset * -1, offset * -1)\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n context.stroke()\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getRectCoordinates(inverted = false) {\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\n let perpendicularPoint\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\n const cursor = { x: cursorTargetX, y: cursorTargetY }\n const line = { x1, y1, x2, y2 }\n const distance = math.distanceToLine(cursor, line)\n perpendicularPoint = math.perpendicularPointToLine({\n distance,\n line,\n })\n } else {\n return {\n P1: { x: x2, y: y2 },\n P2: { x: x1, y: y1 },\n P3: { x: x1, y: y1 },\n P4: { x: x2, y: y2 },\n }\n }\n\n const pointOffsetX = perpendicularPoint.x - x2\n const pointOffsetY = perpendicularPoint.y - y2\n\n const P1 = { x: x2 + pointOffsetX, y: y2 + pointOffsetY }\n const P2 = { x: x1 + pointOffsetX, y: y1 + pointOffsetY }\n const P3 = { x: x1 + -1 * pointOffsetX, y: y1 + -1 * pointOffsetY }\n const P4 = { x: x2 + -1 * pointOffsetX, y: y2 + -1 * pointOffsetY }\n\n const invertX = this.model.scale.x.invert\n const invertY = this.model.scale.y.invert\n if (inverted) {\n return {\n P1: { x: invertX(P1.x), y: invertY(P1.y) },\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\n P3: { x: invertX(P3.x), y: invertY(P3.y) },\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\n }\n }\n return { P1, P2, P3, P4 }\n }\n\n getRotatedPointCoordinates = ({\n rotationAxisPoint,\n pointToRotate,\n oldLinePoint,\n newLinePoint,\n }: {\n rotationAxisPoint: Point\n pointToRotate: Point\n oldLinePoint: Point\n newLinePoint: Point\n }) => {\n const angle = math.sharedPointLinesAngle({\n sharedPoint: rotationAxisPoint,\n oldLinePoint,\n newLinePoint,\n })\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\n rotationAxisPoint,\n angle,\n pointToRotate,\n })\n return {\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.cursorTargetX += x\n this.attrs.cursorTargetY += y\n }\n\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'middleLeft':\n const newMiddleLeftPoint = {\n x: this.attrs.x1 + difX,\n y: this.attrs.y1 + difY,\n }\n const middleLeftRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\n newLinePoint: { x: this.model.scale.x(newMiddleLeftPoint.x), y: this.model.scale.y(newMiddleLeftPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x1: newMiddleLeftPoint.x,\n y1: newMiddleLeftPoint.y,\n cursorTargetX: middleLeftRotatedCursorPoint.x,\n cursorTargetY: middleLeftRotatedCursorPoint.y,\n }\n break\n case 'middleRight':\n const newMiddleRightPoint = {\n x: this.attrs.x2 + difX,\n y: this.attrs.y2 + difY,\n }\n const middleRightRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\n newLinePoint: { x: this.model.scale.x(newMiddleRightPoint.x), y: this.model.scale.y(newMiddleRightPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x2: newMiddleRightPoint.x,\n y2: newMiddleRightPoint.y,\n cursorTargetX: middleRightRotatedCursorPoint.x,\n cursorTargetY: middleRightRotatedCursorPoint.y,\n }\n break\n case 'topRight':\n case 'topLeft':\n case 'bottomLeft':\n case 'bottomRight':\n this.attrs = {\n ...this.attrs,\n cursorTargetX: area.x,\n cursorTargetY: area.y,\n }\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const coordinates = this.getRectCoordinates()\n const polygon = Object.keys(coordinates).map((point) => ({\n x: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].x,\n y: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].y,\n }))\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nRotatedRectangleV1.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default RotatedRectangleV1\n","import { DrawingBorder, PaneArea } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Line from './line'\n\nexport interface IScaledLineAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n dashLength: number\n lineWidth: number\n strokeStyle: string\n border: DrawingBorder\n}\n\nclass ScaledLine extends Line {\n static type = CanvasElementType.scaledLine\n\n name = 'Line'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.renderContent = this.renderContent.bind(this)\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 1,\n color: this.getChartLayoutSettings().ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n context.moveTo(roundedXY.x1, roundedXY.y1)\n if (this.attrs.dashLength) {\n context.setLineDash([this.attrs.dashLength])\n }\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\n return true\n }\n return this.thumbsAreInArea(area)\n }\n}\n\nScaledLine.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default ScaledLine\n","import merge from 'lodash.merge'\n\nimport { PaneArea } from '../../types/shared'\nimport { PADDING } from '../constants/common'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport Text, { ITextAttrs } from './text'\n\ninterface FontFamilyHeightCoefficient {\n Arial: {\n firstLine: number\n otherLines: number\n }\n Verdana: {\n firstLine: number\n otherLines: number\n }\n}\n\nclass ScaledText extends Text {\n static type = CanvasElementType.scaledText\n\n name = 'Text'\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\n declare lastAttrs: Attrs\n declare scaled: Partial\n declare measuredHeight: number\n\n declare font: string\n declare context: CanvasRenderingContext2D\n declare lines: {\n text: string\n metrics: TextMetrics\n }[]\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.scale({ x: ['x'], y: ['y'] })\n }\n\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n this.render(context)\n }\n\n setupTextMetricsCache() {\n if (\n this.attrs.text !== this.lastAttrs?.text ||\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)\n ) {\n this.lastAttrs = merge({}, this.attrs)\n this.lines = this.getLines().map((line) => ({\n text: line,\n metrics: this.context.measureText(line),\n }))\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\n const lineHeight =\n current.metrics.actualBoundingBoxAscent +\n current.metrics.actualBoundingBoxDescent +\n (currentIndex !== this.lines.length - 1 ? PADDING.XXXS : 0)\n return acc + lineHeight\n }, 0)\n }\n }\n\n // private\n setupContext(context: CanvasRenderingContext2D) {\n this.context = context\n context.set('font', this.font)\n context.set('fillStyle', this.attrs.fillStyle!)\n context.set('textAlign', this.attrs.textAlign!)\n context.set('textBaseline', this.attrs.textBaseline)\n this.setupTextMetricsCache()\n }\n\n // private\n renderText() {\n let y = this.scaled.y! + this.attrs.padding.top\n let previousDescent = 0\n for (let i = 0; i < this.lines.length; i++) {\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.XXXS\n this.context.fillText(this.lines[i].text, this.scaled.x! + this.attrs.padding.left, y)\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\n }\n }\n\n // private\n renderBackground() {\n if (!this.attrs.background) {\n return\n }\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\n\n this.context.beginPath()\n this.context.rect(\n this.scaled.x! - padding,\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding,\n this.width + padding * 2,\n this.measuredHeight + padding * 2\n )\n this.context.set('fillStyle', this.attrs.background)\n this.context.fill()\n this.context.set('fillStyle', this.attrs.fillStyle!)\n this.renderBorder()\n this.context.closePath()\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n // TODO\n // if @attrs.textBaseline == 'middle'\n // rect.y = @attrs.y - rect.height/2\n if (\n this.lines &&\n this.scaled.x! < area.scaled.x &&\n area.scaled.x < this.scaled.x! + this.width &&\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent < area.scaled.y &&\n area.scaled.y < this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent + this.measuredHeight\n ) {\n return true\n }\n return this.thumbsAreInArea(area)\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x! += x\n this.attrs.y! += y\n }\n}\n\nexport default ScaledText\n","import { PaneArea, RequireByKey, TextAttrs } from '../../types/shared'\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\nimport Element, { TodoModalConfig } from './element'\n\nexport interface Area {\n x: number\n y: number\n}\n\nexport type ITextAttrs = RequireByKey & Partial\n\nconst DEFAULTS: Partial = {\n text: '',\n font: {\n size: 20,\n family: 'Arial',\n style: 'normal',\n weight: 'normal',\n },\n lineHeight: 20,\n // left | right | center | start | end\n textAlign: TextAlign.left,\n // top | hanging | middle | alphabetic | ideographic | bottom\n textBaseline: TextBaseline.alphabetic,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n },\n}\n\nclass Text extends Element {\n static type = CanvasElementType.text\n\n static getMergedPropsWithDefaults>(\n propKey: T,\n props: Partial = {}\n ) {\n return {\n ...DEFAULTS[propKey],\n ...Object.entries(props).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}),\n }\n }\n\n name = 'Anchored text'\n declare context: CanvasRenderingContext2D\n declare width: number\n declare height: number\n declare font: string\n\n static initClass() {\n Object.defineProperty(this.prototype, 'width', {\n get() {\n // TODO: revisit this getter, when you call `this.width` you don't expect/want context change\n if (this.context) {\n this.setupContext(this.context)\n }\n return this.measure() + this.attrs.padding.left + this.attrs.padding.right\n },\n })\n\n Object.defineProperty(this.prototype, 'height', {\n get() {\n const count = this.getLines().length\n return this.attrs.lineHeight * count + this.attrs.padding.top + this.attrs.padding.bottom\n },\n })\n\n Object.defineProperty(this.prototype, 'font', {\n get() {\n const f = this.attrs.font\n return `${f.style} ${f.weight} ${f.size}pt ${f.family}`\n },\n })\n }\n\n getModalConfigBase() {\n return {\n inputs: [\n { type: 'multiline_string', name: 'text', required: true },\n { type: 'font', name: 'font' },\n {\n type: 'background',\n name: 'fillStyle',\n label: 'Color',\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n },\n {\n type: 'background',\n name: 'background',\n label: 'Background',\n default: 'rgba(0,0,0,0)',\n },\n {\n type: 'border',\n name: 'border',\n min: 0,\n default: { color: 'rgba(0,0,0)', width: 0 },\n },\n ],\n } as unknown as TodoModalConfig\n }\n\n getDefaults() {\n return {\n ...DEFAULTS,\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\n\n set(obj: Partial) {\n super.set(obj)\n if (obj.font?.size && !obj.lineHeight) {\n this.attrs.lineHeight = Math.max(obj.font.size, this.attrs.lineHeight)\n }\n return this\n }\n\n render(context: CanvasRenderingContext2D) {\n this.setupContext(context)\n if (this.attrs.angle) {\n // TODO background & multiline text\n this.context.save()\n this.context.translate(this.attrs.x!, this.attrs.y!)\n this.context.rotate((this.attrs.angle * Math.PI) / 180)\n this.context.fillText(this.attrs.text, 0, 0)\n this.context.restore()\n } else {\n this.renderBackground()\n this.renderText()\n }\n }\n\n measure(context?: CanvasRenderingContext2D) {\n if (context) {\n this.setupContext(context)\n }\n const lines = this.getLines()\n let max = 0\n for (const line of lines) {\n max = Math.max(this.context.measureText(line).width, max)\n }\n return ~~max\n }\n\n isInArea(testArea: PaneArea) {\n const area = this.convertArea(testArea)\n // TODO iny align\n if (\n this.attrs.x! < area.x &&\n area.x < this.attrs.x! + this.width &&\n this.attrs.y! - this.attrs.font.size < area.y &&\n area.y < this.attrs.y! - this.attrs.font.size + this.height\n ) {\n return true\n }\n return super.isInArea(testArea)\n }\n\n setupContext(context: CanvasRenderingContext2D) {\n this.context = context\n context.set('font', this.font)\n context.set('fillStyle', this.attrs.fillStyle)\n context.set('textAlign', this.attrs.textAlign)\n context.set('textBaseline', this.attrs.textBaseline)\n }\n\n getLines() {\n return this.attrs.text.toString().split('\\n')\n }\n\n renderText() {\n let { y } = this.attrs // + @attrs.padding.top\n for (const line of this.getLines()) {\n this.context.fillText(line, this.attrs.x! + this.attrs.padding.left, y!)\n y! += this.attrs.lineHeight\n }\n }\n\n renderBackground() {\n if (!this.attrs.background) {\n return\n }\n\n const { width } = this\n const { height } = this\n const rawHight = height - this.attrs.padding.top - this.attrs.padding.bottom\n const { x } = this.attrs\n let y = this.attrs.y! - height\n\n if (this.attrs.textBaseline === 'middle') {\n y = this.attrs.y! - rawHight / 2 - this.attrs.padding.top - 1\n } else if (this.attrs.textBaseline === 'alphabetic') {\n y = this.attrs.y! - this.attrs.lineHeight\n }\n\n this.context.beginPath()\n this.context.set('fillStyle', this.attrs.background)\n this.context.rect(x!, y, width, height)\n this.context.fill()\n this.context.set('fillStyle', this.attrs.fillStyle)\n this.renderBorder()\n this.context.closePath()\n }\n\n renderBorder() {\n const { lineWidth = 0, strokeStyle, border } = this.attrs\n const borderWidth = border?.width ?? 0\n\n if (lineWidth || this.attrs.strokeStyle || borderWidth > 0) {\n this.context.set('strokeStyle', strokeStyle ?? border?.color ?? '')\n this.context.set('lineWidth', Math.max(lineWidth, borderWidth))\n this.context.stroke()\n }\n }\n\n private convertArea(area: PaneArea) {\n const { ChartSettings } = this.getChartLayoutSettings()\n return {\n x: this.model.scale.x(area.x) + this.model.chart().leftOffset + ChartSettings.left.width,\n y: this.model.scale.y(area.y) + ChartSettings.top.height,\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x! += this.model.scale.x(x) + 1\n this.attrs.y! += this.model.scale.y(y) - this.model.scale.y(0)\n }\n\n getHeight() {\n return this.height\n }\n}\n\nText.initClass()\n\nexport default Text\n","import { PaneArea, ResizeByThumbFuncProps, ThumbType } from '../../types/shared'\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\n\ntype Area = PaneArea\ntype ResizeFunc = (props: ResizeByThumbFuncProps) => void\ntype ScaleFunc = () => number\n\nclass Thumb {\n type: ThumbType\n lastX = 0\n lastY = 0\n fx: ScaleFunc\n fy: ScaleFunc\n resize: ResizeFunc\n model: PaneModel\n\n constructor(type: ThumbType, fx: ScaleFunc, fy: ScaleFunc, resize: ResizeFunc, model: PaneModel) {\n this.type = type\n this.fx = fx\n this.fy = fy\n this.resize = resize\n this.model = model\n }\n\n render(context: CanvasRenderingContext2D) {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n context.set('fillStyle', ThumbSettings.color)\n context.set('strokeStyle', ThumbSettings.borderColor)\n context.set('lineWidth', ThumbSettings.borderWidth)\n const x = ~~this.x()\n const y = ~~this.y()\n const thumbWidth = this.getThumbWidth()\n const offset = getOffsetFromLineWidth(ThumbSettings.borderWidth)\n context.beginPath()\n context.rect(x + offset, y + offset, thumbWidth, thumbWidth)\n context.fill()\n context.stroke()\n }\n\n startEditing(area: Area) {\n this.lastX = area.x\n return (this.lastY = area.y)\n }\n\n moveTo(area: Area) {\n const difX = area.x - this.lastX\n const difY = area.y - this.lastY\n this.resize({ type: this.type, difX, difY, area })\n this.lastX = area.x\n this.lastY = area.y\n }\n\n isInArea(area: Area) {\n const width = this.model.scale.x.invert(this.getThumbWidth())\n const height = this.model.scale.y.invert(0) - this.model.scale.y.invert(this.getThumbWidth())\n // +- width/2 because we have coordinates of a center\n if (\n this.fx() + width / 2 >= area.x &&\n this.fx() - width / 2 <= area.x &&\n this.fy() + height / 2 > area.y &&\n this.fy() - height / 2 < area.y\n ) {\n return true\n }\n return false\n }\n\n getThumbWidth() {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n return ThumbSettings.size + ThumbSettings.borderWidth * 2\n }\n\n x() {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n return this.model.scale.x(this.fx()) - ThumbSettings.size / 2\n }\n\n y() {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n return this.model.scale.y(this.fy()) - ThumbSettings.size / 2\n }\n}\n\nexport default Thumb\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface ITriangleAttrs {\n x1: number\n x2: number\n x3: number\n y1: number\n y2: number\n y3: number\n fill: string\n border: string\n}\n\nclass Triangle extends Element {\n static type = CanvasElementType.triangle\n\n declare scaled: Pick\n name = 'Triangle'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n this._thumbs = [\n new Thumb(\n 'a',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'b',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.x3,\n () => this.attrs.y3,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return { fill: ElementSettings.defaultFill, border: ElementSettings.Colors.border } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, x3, y1, y2, y3 })\n\n context.set('fillStyle', this.attrs.fill)\n\n const offset = this.getShouldRenderThumbs() ? getOffsetFromLineWidth(1) : 0\n\n context.translate(offset, offset)\n context.beginPath()\n context.moveTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.lineTo(roundedXY.x3, roundedXY.y3)\n context.lineTo(roundedXY.x1, roundedXY.y1)\n context.fill()\n context.translate(offset * -1, offset * -1)\n\n if (this.getShouldRenderThumbs()) {\n context.set('strokeStyle', this.attrs.border)\n context.stroke()\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.x3 += x\n this.attrs.y3 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'a':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'b':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'c':\n this.attrs.x3 += difX\n this.attrs.y3 += difY\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const polygon = [1, 2, 3].map((i) => ({\n x: this.scaled[`x${i}` as 'x1' | 'x2' | 'x3'],\n y: this.scaled[`y${i}` as 'y1' | 'y2' | 'y3'],\n }))\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nTriangle.prototype.modalConfig = {\n inputs: [{ type: 'background', name: 'fill' }],\n}\n\nexport default Triangle\n","import { RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\n\nclass VerticalLine extends ScaledLine {\n static type = CanvasElementType.verticalLine\n\n name = 'Vertical line'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.renderContent = this.renderContent.bind(this)\n\n this.attrs.x2 = this.attrs.x1\n this._thumbs = [this._thumbs[0]]\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const domain = this.model.scale.y.domain()\n this.attrs.y1 = domain[0]\n this.attrs.y2 = domain[1]\n this._thumbs[0].fy = () => (this.attrs.y1 + this.attrs.y2) / 2\n super.renderContent(context)\n }\n\n moveBy(x: number) {\n return (this.attrs.x1 = this.attrs.x2 += x)\n }\n\n resize({ difX }: RequireByKey) {\n return this.moveBy(difX)\n }\n}\n\nexport default VerticalLine\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\nexport interface IXABCDPositionAttrs {\n xx: number\n xy: number\n ax: number\n ay: number\n bx: number\n by: number\n cx: number\n cy: number\n dx: number\n dy: number\n}\n\ntype xPoints = 'xx' | 'ax' | 'bx' | 'cx' | 'dx'\ntype yPoints = 'xy' | 'ay' | 'by' | 'cy' | 'dy'\n\nexport interface IXABCDAttrs extends IXABCDPositionAttrs {\n fill: string\n border: DrawingBorder\n lineWidth: number\n}\n\nclass XABCD extends Element {\n static type = CanvasElementType.xabcd\n\n name = 'XABCD pattern'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n this._thumbs = [\n new Thumb(\n 'x',\n () => this.attrs.xx,\n () => this.attrs.xy,\n this.resize,\n this.model\n ),\n new Thumb(\n 'a',\n () => this.attrs.ax,\n () => this.attrs.ay,\n this.resize,\n this.model\n ),\n new Thumb(\n 'b',\n () => this.attrs.bx,\n () => this.attrs.by,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.cx,\n () => this.attrs.cy,\n this.resize,\n this.model\n ),\n new Thumb(\n 'd',\n () => this.attrs.dx,\n () => this.attrs.dy,\n this.resize,\n this.model\n ),\n ]\n if (this.attrs.lineWidth == null) {\n this.attrs.lineWidth = 1\n }\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({\n x: ['xx', 'ax', 'bx', 'cx', 'dx'],\n y: ['xy', 'ay', 'by', 'cy', 'dy'],\n })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { xx, xy, ax, ay, bx, by, cx, cy, dx, dy } = this.scaled\n const roundedXY = getRoundedObject({ xx, xy, ax, ay, bx, by, cx, cy, dx, dy })\n\n context.set('fillStyle', this.attrs.fill)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.translate(offset, offset)\n\n context.beginPath()\n context.moveTo(roundedXY.xx, roundedXY.xy)\n context.lineTo(roundedXY.ax, roundedXY.ay)\n context.lineTo(roundedXY.bx, roundedXY.by)\n context.lineTo(roundedXY.xx, roundedXY.xy)\n context.fill()\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n context.beginPath()\n context.moveTo(roundedXY.bx, roundedXY.by)\n context.lineTo(roundedXY.cx, roundedXY.cy)\n context.lineTo(roundedXY.dx, roundedXY.dy)\n context.lineTo(roundedXY.bx, roundedXY.by)\n context.fill()\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n context.beginPath()\n context.moveTo(roundedXY.ax, roundedXY.ay)\n context.lineTo(roundedXY.cx, roundedXY.cy)\n context.moveTo(roundedXY.xx, roundedXY.xy)\n context.lineTo(roundedXY.dx, roundedXY.dy)\n context.stroke()\n\n const text = new Text(\n {\n font: { size: 8, style: 'bold' },\n lineHeight: 8,\n padding: {\n top: 2,\n right: 2,\n bottom: 2,\n left: 2,\n },\n textBaseline: TextBaseline.middle,\n // @ts-expect-error - TODO - textAlign doesnt have `middle` value\n textAlign: 'middle',\n fillStyle: '#ffffff',\n background: this.attrs.fill || '#000000',\n },\n this.model\n )\n\n for (const t of Array.from('xabcd')) {\n text\n .set({\n text: t.toUpperCase(),\n x: roundedXY[(t + 'x') as xPoints] - 6,\n y: roundedXY[(t + 'y') as yPoints] + 12,\n } as Partial)\n .render(context)\n }\n\n const retLabel = (y1: string, y2: string, y3: string) => {\n const len = Math.abs(this.attrs[(y1 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints])\n const ret = Math.abs(this.attrs[(y3 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints]) / len\n const x = (roundedXY[(y1 + 'x') as xPoints] + roundedXY[(y3 + 'x') as xPoints]) / 2\n const y = (roundedXY[(y1 + 'y') as yPoints] + roundedXY[(y3 + 'y') as yPoints]) / 2\n return text\n .set({\n text: ret.toFixed(3),\n x,\n y,\n })\n .render(context)\n }\n\n retLabel('x', 'a', 'b')\n retLabel('a', 'b', 'c')\n retLabel('b', 'c', 'd')\n retLabel('x', 'a', 'd')\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n context.translate(offset * -1, offset * -1)\n }\n\n moveBy(x: number, y: number) {\n for (const t of Array.from('xabcd')) {\n this.attrs[(t + 'x') as xPoints] += x\n this.attrs[(t + 'y') as yPoints] += y\n }\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n this.attrs[(type + 'x') as xPoints] += difX\n return (this.attrs[(type + 'y') as yPoints] += difY)\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n let t\n const xab = (() => {\n const result = []\n for (t of Array.from('xab')) {\n result.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\n }\n return result\n })()\n const bcd = (() => {\n const result1 = []\n for (t of Array.from('bcd')) {\n result1.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\n }\n return result1\n })()\n if (math.pointInPolygon(area.scaled, xab) || math.pointInPolygon(area.scaled, bcd)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nXABCD.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1 },\n ],\n}\n\nexport default XABCD\n","import { getContextWithCache } from '../lib/shims'\nimport Utils from '../utils'\nimport { captureException, getIsSSr } from '../utils/helpers'\n\nclass Cache {\n constructor() {\n this.canvas = getIsSSr() ? null : document.createElement('canvas')\n }\n\n set(callback, width, height) {\n this.callback = callback\n this.width = width\n this.height = height\n this.rendered = false\n }\n\n render(context, x, y) {\n if (x == null) {\n x = 0\n }\n if (y == null) {\n y = 0\n }\n if (!this.rendered) {\n this.refresh()\n }\n if (this.width < 1 || this.height < 1) {\n return\n }\n\n try {\n if (this.ratio >= 1 && this.canvas) {\n context.drawImage(\n this.canvas,\n 0,\n 0,\n ~~(this.width * this.ratio),\n ~~(this.height * this.ratio),\n x,\n y,\n this.width,\n this.height\n )\n } else {\n context.save()\n context.translate(x, y)\n this.callback(context)\n context.restore()\n }\n } catch (e) {\n captureException(\n e,\n this.canvas\n ? {\n extra: {\n width: this.width,\n height: this.height,\n ratio: this.ratio,\n cWidth: this.canvas.width,\n cHeight: this.canvas.height,\n sWidth: window.screen.width,\n sHeight: window.screen.height,\n },\n }\n : {}\n )\n }\n }\n\n refresh() {\n if (getIsSSr()) {\n return\n }\n this.canvas.width = this.width\n this.canvas.height = this.height\n this.context = getContextWithCache(this.canvas)\n this.ratio = Utils.getScaleRatio()\n Utils.setSizeOnCanvasElement({ canvasElement: this.canvas, width: this.width, height: this.height })\n this.context.scale(this.ratio, this.ratio)\n\n this.callback(this.context)\n this.rendered = true\n }\n}\n\nexport default Cache\n","export enum ChartMinWidthBreakpoints {\n xs = 0,\n s = 480,\n m = 768,\n l = 1024,\n}\n\nexport function getChartBreakpoints(chartWidthInPx: number) {\n return {\n isXs: chartWidthInPx >= ChartMinWidthBreakpoints.xs,\n isS: chartWidthInPx >= ChartMinWidthBreakpoints.s,\n isM: chartWidthInPx >= ChartMinWidthBreakpoints.m,\n isL: chartWidthInPx >= ChartMinWidthBreakpoints.l,\n }\n}\n","import * as d3 from 'd3'\nimport merge from 'lodash.merge'\n\nimport {\n ChartConfigChartPaneElement,\n CustomSpineEvents,\n Instrument,\n Maybe,\n RequireByKey,\n Theme,\n} from '../../types/shared'\nimport Cache from '../canvas/cache'\nimport Element from '../canvas/element'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport tailwindColors from '../constants/colors'\nimport {\n CHART_MARGIN,\n ChartElementType,\n FONT_SIZE,\n IndicatorType,\n IntradayTimeframeInterval,\n LINE_HEIGHT,\n MONTHS,\n OFFSET,\n PADDING,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n TIMEFRAMES_WITH_PRE_MARKET,\n TextAlign,\n TextBaseline,\n getTimeframeLabel,\n} from '../constants/common'\nimport {\n getIsSmallIndexChart,\n getPercentageFromValue,\n getTranslate,\n getValueFromPercentage,\n} from '../controllers/renderUtils'\nimport Chart from '../models/chart'\nimport { getColorOverwrites } from '../models/chart_settings'\nimport { ISettings, OHLCType } from '../models/chart_settings/interfaces'\nimport { darkerWickColors, thinBarColorsOverride } from '../models/constants'\nimport mouseModel from '../models/mouse'\nimport PaneModel, { ScaleAxis } from '../models/pane'\nimport Quote from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Overlay from '../overlays/overlay'\nimport { overlaysByType } from '../overlays/overlays'\nimport utils, { dateFromDateString, isRedesignedPage, numberToStringWithUnitsSuffix } from '../utils'\nimport {\n ITickerChange,\n getBarWidthWithMargin,\n getBarWidthWithMarginByParts,\n getChangeColor,\n getShouldUseDarkerWickColors,\n getTickerChange,\n getTickerChangeFromCloseValues,\n getVirtualTimeframeTradedDates,\n renderCross,\n round,\n unmountCanvas,\n} from '../utils/chart'\nimport { convertColorToHEX, getHEXWithSpecificAplha, getHSVAFromColor, stringifyHSVAColor } from '../utils/colors'\nimport { setElementCursor } from '../utils/cursor'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getChartBreakpoints } from './utils'\n\nexport interface BaseChartAttrs {\n overlays: Required['overlays']\n}\n\ntype OhlcLineElements = Array<{ text: string; color: string } | 'space'>\n\ninterface LastOHLCAttrs {\n text: string\n x: number\n y: number\n width: number\n textBaseline: TextBaseline\n textAlign: TextAlign\n}\n\ninterface IRenderOHLCParameters {\n context: CanvasRenderingContext2D\n date: Maybe\n open?: Maybe\n high?: Maybe\n low?: Maybe\n close?: Maybe\n volume?: Maybe\n afterHour?: string\n isSmallIndexChart?: boolean\n isNewestOHLC?: boolean\n directRender?: boolean\n time?: string\n changePercentage?: Maybe\n}\n\ninterface XAxisLabel {\n x: number\n text: string\n textWidth: number\n hasPriority?: boolean\n allowedOverflow?: number\n}\n\nconst getDateString = ({ date, timeframe }: { date: Date; timeframe: TIMEFRAME }) => {\n let dateString = ''\n const month = date.getMonth() // 20141126\n const year = date.getFullYear()\n const day = date.getDate()\n switch (timeframe) {\n case TIMEFRAME.i1:\n case TIMEFRAME.i2:\n case TIMEFRAME.i3:\n case TIMEFRAME.i5:\n case TIMEFRAME.i10:\n case TIMEFRAME.i15:\n case TIMEFRAME.i30:\n case TIMEFRAME.h:\n case TIMEFRAME.h2:\n case TIMEFRAME.h4:\n const t =\n (((date.getHours() + 11) % 12) + 1).toString().padLeft('00') +\n ':' +\n date.getMinutes().toString().padLeft('00') +\n (date.getHours() < 12 ? 'AM' : 'PM')\n dateString = `${MONTHS[month]} ${day} ${t}`\n break\n case TIMEFRAME.d:\n case TIMEFRAME.w:\n dateString = `${MONTHS[month]} ${day}`\n break\n case TIMEFRAME.m:\n dateString = `${MONTHS[month]} ${year}`\n break\n default:\n break\n }\n\n return dateString\n}\n\nconst getIsOverlapping = ({\n x,\n textWidth,\n renderedLabelRanges,\n}: {\n x: number\n textWidth: number\n renderedLabelRanges: Array<{ from: number; to: number }>\n}) =>\n renderedLabelRanges.some(({ from, to }) => {\n const minX = x - textWidth / 2\n const maxX = x + textWidth / 2\n return (from < maxX && maxX < to) || (from < minX && minX < to)\n })\n\nconst SMALL_INDEX_CHART_LABEL_BUFFER = 15\n\nconst gray300 = tailwindColors.gray[300]\n\nclass BaseChart extends Element {\n static initClass() {\n Object.defineProperty(this.prototype, 'width', {\n get() {\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\n return this.model.width - ChartSettings.left.width - ChartSettings.right.width\n },\n })\n\n Object.defineProperty(this.prototype, 'height', {\n get() {\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\n return this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\n },\n })\n }\n\n static getNumOfBarsBuffer({ overlays }: RequireByKey) {\n return Math.max(0, ...overlays.map((overlay) => overlaysByType[overlay.type].getNumOfBarsBuffer(overlay)))\n }\n\n static label = 'Chart'\n static iconName = ''\n\n paneModel: PaneModel\n model: Chart\n data: Quote\n specificChartFunctionality: SpecificChartFunctionality\n tickerWidth = 0\n changeWidth = 0\n lastOhlc: Array> = []\n overlays: Overlay[] = []\n isLargeChart?: boolean\n shouldRenderVolume = true\n afterChange: {\n x: number\n y: number\n width: number\n } | null = null\n\n declare setupAxisTimeFrame: string\n declare volumeFY: d3.ScaleLinear\n declare tickerText: Text\n declare baseCache: Cache\n declare leftOffset: number\n declare context: CanvasRenderingContext2D\n declare width: number\n declare height: number\n declare isMobile: boolean\n\n constructor(values: Partial, paneModel: PaneModel) {\n super(values, paneModel)\n\n this.paneModel = paneModel\n this.model = this.paneModel.chart()\n this.data = this.model.quote()\n const chartLayoutModel = this.model.chart_layout()\n this.specificChartFunctionality = chartLayoutModel.specificChartFunctionality\n this.isLargeChart = chartLayoutModel.isLargeChart\n this.isMobile = utils.isMobile(true)\n\n this.overlays = []\n if (values.overlays) {\n for (const overlayDefinition of values.overlays) {\n // overlayDefinition.color coming from DB is always string however overlays\n // internaly didn't use format as in db (type, color, period) but rather\n // more overlay specific parameters eg. (BB: topColor, bottomColor, etc.)\n // thus overlayDefinition.color might be undefined\n // approach could be reworked in https://github.com/finvizhq/charts/issues/770\n // but for now (!overlayDefinition.color) check solve issue as well\n const overlay = overlaysByType[overlayDefinition.type].fromObject(\n {\n ...overlayDefinition,\n color:\n !overlayDefinition.color || overlayDefinition.color.includes('|')\n ? ''\n : convertColorToHEX(overlayDefinition.color),\n },\n this.paneModel\n )\n this.addOverlay(overlay)\n }\n delete values.overlays\n }\n\n this.renderYAxis = this.renderYAxis.bind(this)\n this.renderText = this.renderText.bind(this)\n this.renderCrossText = this.renderCrossText.bind(this)\n this.setupCache = this.setupCache.bind(this)\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\n\n // this.paneModel.bind('update', this.setupAxis.bind(this))\n this.paneModel.bind('update', this.setupCache)\n this.paneModel.bind('change', this.trigger.bind(this, 'change'))\n this.model = this.paneModel.chart()\n // this.model.bind('change', this.setupAxis.bind(this))\n this.model.bind('change', this.setupCache)\n this.model.bind('change', this.trigger.bind(this, 'change'))\n this.model.bind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\n this.model.bind('destroy', () => {\n this.model.unbind('change', this.setupCache)\n this.model.unbind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\n mouseModel.unbind('change', mouseModelChangeHandler)\n unmountCanvas(this.baseCache.canvas)\n })\n mouseModel.bind('change', mouseModelChangeHandler)\n\n this.model.chart_layout().bind('theme', this.setupCache)\n this.model.chart_layout().bind('update', this.updateShouldRenderVolume.bind(this))\n\n this.setupCache()\n }\n\n renderChart() {\n throw Error('Implement renderChart')\n }\n\n render(context: CanvasRenderingContext2D) {\n this.data = this.model.quote()\n this.leftOffset = this.model.leftOffset\n this.context = context\n\n if (this.data.close.length === 0) {\n this.renderChartNotAvailable()\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\n return\n }\n\n this.context.save()\n this.clip()\n this.renderVolume()\n this.renderChart()\n this.renderOverlays()\n this.renderPrevClose()\n this.renderFadeExtendedHours()\n this.context.restore()\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\n }\n\n renderGrid(context: CanvasRenderingContext2D) {\n this.data = this.model.quote()\n this.leftOffset = this.model.leftOffset\n this.context = context\n // text, xAxis, volumeAxis\n this.renderXAxis()\n this.baseCache.render(context)\n }\n\n renderTicker(context: CanvasRenderingContext2D) {\n if (this.tickerText) {\n const { ChartSettings } = this.getChartLayoutSettings()\n context.translate(ChartSettings.left.width, 0)\n this.tickerText.render(context)\n\n if (getIsSmallIndexChart(this.specificChartFunctionality) && this.data.ticker === 'RUSSELL 2000') {\n const { Colors } = ChartSettings.general\n new Text(\n {\n text: 'ETF',\n x: ChartSettings.top.ticker.margin.left,\n y: ChartSettings.top.ticker.margin.top! + FONT_SIZE.XXS + OFFSET.XXS,\n font: { size: FONT_SIZE.XXS },\n fillStyle: Colors.text,\n textBaseline: ChartSettings.top.baseline,\n },\n this.paneModel\n ).render(context)\n }\n\n context.translate(-ChartSettings.left.width, 0)\n }\n }\n\n renderTimeframe(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const quote = this.model.quote()\n const y = (this.height - this.volumeFY.range()[1] - 4) / 2\n\n return new Text(\n {\n text: quote.instrument === Instrument.Group ? 'YEAR PERFORMANCE %' : getTimeframeLabel(quote.timeframe),\n x: ChartSettings.left.timeframe.margin.left,\n y: ChartSettings.top.height + y + (ChartSettings.left.timeframe.margin.top ?? 0),\n angle: -90,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.timeframe.font),\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.paneModel\n ).render(context)\n }\n\n renderText(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n context.save()\n context.translate(ChartSettings.left.width, 0)\n\n if (!getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.tickerText = new Text(\n {\n text: this.data.name || this.data.ticker,\n x: ChartSettings.top.ticker.margin.left,\n y: ChartSettings.top.ticker.margin.top,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.ticker.font),\n textBaseline: ChartSettings.top.baseline,\n fillStyle: Colors.text,\n },\n this.paneModel\n )\n } else {\n this.tickerText = new Text(\n {\n text: this.data.name || this.data.ticker,\n x: ChartSettings.top.ticker.margin.left,\n y: ChartSettings.top.ticker.margin.top,\n font: { size: FONT_SIZE.L, style: 'bold' },\n fillStyle: Colors.text,\n },\n this.paneModel\n )\n }\n this.tickerWidth = this.tickerText.measure(context)\n\n // render watermark on backend chart\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n new Text(\n {\n text: '© finviz.com',\n x: this.width + ChartSettings.right.width - 2,\n y: 1,\n font: { size: FONT_SIZE.XS },\n textAlign: TextAlign.right,\n textBaseline: TextBaseline.top,\n fillStyle: 'rgb(136, 193, 233)',\n },\n this.paneModel\n ).render(context)\n }\n\n if (!this.getIsRedesignedChart()) {\n this.renderChange({ context })\n if (!this.lastOhlc[0]) {\n this.getOHLC({ context, directRender: false })\n }\n this.getOHLC({ context })\n }\n\n context.restore()\n if (!this.getIsRedesignedChart() && !getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.renderTimeframe(context)\n }\n }\n\n getOHLC({\n context,\n directRender = true,\n data,\n date,\n dateString = null,\n changePercentage = null,\n }: {\n context: CanvasRenderingContext2D\n directRender?: boolean\n data?: {\n open?: string\n high?: string\n low?: string\n close?: string\n volume?: string\n }\n date?: Date\n dateString?: string | null\n changePercentage?: ITickerChange | null\n }) {\n if (!this.data.lastDate) return\n\n // modulo \"parsing\" is 100% faster than with str.slice()\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${this.data.lastDate % 100}` // YYYYMMDD / 20211118 => Nov 18\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.renderOHLC({\n context,\n date: lastDate,\n isSmallIndexChart: true,\n isNewestOHLC: true,\n directRender,\n })\n } else if (data && date) {\n this.renderOHLC({\n context,\n date: getDateString({ date, timeframe: this.data.timeframe }),\n open: data.open,\n high: data.high,\n low: data.low,\n close: data.close,\n volume: numberToStringWithUnitsSuffix(Number(data.volume)),\n directRender,\n changePercentage,\n })\n } else if (dateString !== null) {\n this.renderOHLC({\n context,\n date: dateString,\n open: null,\n high: null,\n low: null,\n close: null,\n volume: null,\n directRender,\n })\n } else {\n this.renderOHLC({\n context,\n date: lastDate,\n afterHour:\n Number.isFinite(this.data.afterClose) && this.data.afterClose !== this.data.lastClose\n ? this.roundOhlc(this.data.afterClose)\n : undefined,\n volume: numberToStringWithUnitsSuffix(this.data.lastVolume),\n isNewestOHLC: true,\n time: utils.dateFromUnixTimestamp(this.data.date.last()!).toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n }),\n directRender,\n ...this.getRoundedLastData(),\n })\n }\n }\n\n getRoundedLastData() {\n return {\n open: this.roundOhlc(this.data.lastOpen),\n high: this.roundOhlc(this.data.lastHigh),\n low: this.roundOhlc(this.data.lastLow),\n close: this.roundOhlc(this.data.lastClose),\n }\n }\n\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\n if (!this.getIsRedesignedChart()) {\n this.renderOverlaysLabelsQuotePage(context)\n } else if (this.data.close.length !== 0) {\n this.renderOverlaysLabelsChartsPage(context)\n }\n }\n\n renderOverlaysLabelsQuotePage(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const text = new Text(\n {\n x: ChartSettings.left.overlayLabel.margin.left,\n y: ChartSettings.top.height + ChartSettings.left.overlayLabel.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.overlayLabel.font),\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n )\n for (const overlay of this.overlays) {\n if (!overlay.isRenderedOverlaysLabel()) {\n continue\n }\n text\n .set({\n text: overlay.toString(),\n y: text.get('y')! + ChartSettings.left.overlayLabel.labelSpacing,\n fillStyle: overlay.getLabelColor(),\n })\n .render(context)\n }\n }\n\n getYAxisLeftMargin() {\n if (this.data.instrument === Instrument.Crypto && this.data.lastClose <= 0.001) {\n return 3\n }\n return 8\n }\n\n getYAxisLastCloseLabel({ lastClose, firstVisibleClose }: { lastClose: number; firstVisibleClose?: number | null }) {\n if (typeof firstVisibleClose === 'number' && this.model.scale === ScaleType.Percentage) {\n return `${this.round(getPercentageFromValue({ number: lastClose, base: firstVisibleClose }), 2)}%`\n }\n return this.round(lastClose)\n }\n\n renderYAxis(\n context: CanvasRenderingContext2D,\n { lastClose }: RequireByKey, 'lastClose'> = this.data,\n renderLabels = true\n ) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const contentHeight = this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\n let y, lineTicks, textTicks, lastCloseLabel\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\n translate.do()\n const tickCount = Math.floor(this.paneModel.height / 35)\n const minMax = this.getMinMax()\n const { firstVisibleClose } = minMax\n let stepPrice = 0\n let placesAxis\n\n switch (this.model.scale) {\n case ScaleType.Percentage: {\n if (!firstVisibleClose) return\n\n const scaleRange = this.paneModel.scaleRange\n const { min, max } = scaleRange || minMax\n\n this.model.updateAttribute('firstBarClose', firstVisibleClose)\n\n const minPerc = getPercentageFromValue({ number: min, base: firstVisibleClose })\n const maxPerc = getPercentageFromValue({ number: max, base: firstVisibleClose })\n\n const percScale = d3.scaleLinear().range([0, contentHeight]).domain([maxPerc, minPerc]).nice(10)\n textTicks = percScale.ticks(Math.min(tickCount, 9))\n lineTicks = textTicks.map((tick) => getValueFromPercentage({ number: tick, base: firstVisibleClose }))\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\n break\n }\n case ScaleType.Logarithmic: {\n if (!firstVisibleClose) return\n\n const scaleRange = this.paneModel.scaleRange\n const { min, max } = scaleRange || minMax\n lineTicks = [Math.floor(min)]\n const pixelGap = 30\n\n const negativeScale = []\n if (min < 0) {\n let previousNegativeTick = Math.min(0, max)\n while (this.paneModel.scale.y(previousNegativeTick) + pixelGap < this.paneModel.scale.y(min)) {\n const tick = this.paneModel.scale.y.invert(this.paneModel.scale.y(previousNegativeTick) + pixelGap)\n const range = d3.nice(-previousNegativeTick, -tick, 2)\n previousNegativeTick = -range[range.length - 1]\n negativeScale.unshift(previousNegativeTick)\n }\n }\n\n const positiveScale = []\n if (max > 0) {\n positiveScale.push(Math.max(this.paneModel.scale.y.invert(this.paneModel.scale.y(min) + pixelGap), 0))\n }\n while (this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap > 0) {\n const tick = this.paneModel.scale.y.invert(\n this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap\n )\n const range = d3.nice(positiveScale[positiveScale.length - 1], tick, 2)\n positiveScale.push(range[range.length - 1])\n }\n lineTicks = [...negativeScale, ...positiveScale]\n textTicks = lineTicks\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\n break\n }\n default:\n // default to linear scale type\n lineTicks = this.paneModel.scale.y.ticks(Math.min(tickCount, 9))\n textTicks = lineTicks\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\n }\n\n if (textTicks.length >= 2) {\n stepPrice = Math.abs(textTicks[1] - textTicks[0])\n }\n if (stepPrice > 10 || getIsSmallIndexChart(this.specificChartFunctionality)) {\n placesAxis = 0\n }\n\n const getYLineText = (val: number, places?: number) => {\n switch (this.model.scale) {\n case ScaleType.Percentage:\n return `${val}%`\n default:\n return this.round(val, places)\n }\n }\n\n const yTickText = new Text(\n {\n x: this.width + this.getYAxisLeftMargin() + ChartSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n },\n this.paneModel\n )\n\n let yTickLine = this.getYLine()\n const resetYTicksStyles = () => {\n yTickText.set({\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n })\n yTickLine = this.getYLine()\n }\n for (let i = 0; i < lineTicks.length; i++) {\n y = Math.round(this.fy(lineTicks[i]))\n if (y < 0 || y > contentHeight) continue\n if (y === contentHeight) y -= 1 // due pixel perfect rendering of lines, last line is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\n yTickLine.set({ y1: y, y2: y })\n yTickText.set({\n text: getYLineText(textTicks[i], placesAxis),\n y,\n })\n if (this.model.scale === ScaleType.Percentage && textTicks[i] === 0) {\n yTickLine.set({ strokeStyle: Colors.text })\n yTickText.set({\n font: { weight: 'bold', size: yTickText.attrs.font.size },\n fillStyle: Colors.percentageZeroLineText,\n })\n yTickLine.render(context)\n yTickText.render(context)\n resetYTicksStyles()\n } else {\n yTickLine.render(context)\n yTickText.render(context)\n }\n }\n translate.undo()\n\n if (renderLabels) {\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: lastCloseLabel })\n // if (typeof this.data.afterClose === 'number') {\n // this.renderYAxisLabel({\n // context,\n // yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\n // mainLabelValue: lastClose,\n // secondaryLabelValue: this.data.afterClose,\n // }),\n // label: this.getYAxisLastCloseLabel({ lastClose: this.data.afterClose, firstVisibleClose }),\n // background: this.getSecondaryLabelBackgroundColor(),\n // })\n // }\n }\n }\n\n getSecondaryLabelBackgroundColor() {\n return stringifyHSVAColor(\n {\n ...getHSVAFromColor(this.getChartLayoutSettings().ChartSettings.general.Colors.currentBackground),\n s: 0.3,\n },\n 'hex'\n )\n }\n\n getYAxisSecondaryLabelYCoordinate({\n mainLabelValue,\n secondaryLabelValue,\n }: {\n mainLabelValue: number\n secondaryLabelValue: number\n }) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { lineHeight } = ChartSettings.right.axis.font\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\n\n const direction = Math.sign(mainLabelValue - secondaryLabelValue) || 1\n const offset = (lineHeight ?? LINE_HEIGHT.S) + (padding.top ?? PADDING.XXS) + (padding.bottom ?? PADDING.XXS)\n const mainLabelValuePosition = Math.round(this.fy(mainLabelValue))\n const secondaryLabelValuePosition = Math.round(this.fy(secondaryLabelValue))\n const offsetedY = mainLabelValuePosition + offset * direction\n\n return Math.abs(secondaryLabelValuePosition - mainLabelValuePosition) > offset\n ? secondaryLabelValuePosition\n : offsetedY\n }\n\n renderYAxisLabel({\n context,\n yCoordinate,\n label,\n background,\n }: {\n context: CanvasRenderingContext2D\n yCoordinate: number\n label: string\n background?: string\n }) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\n const { Colors } = ChartSettings.general\n const { size, lineHeight } = ChartSettings.right.axis.font\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\n\n translate.do()\n new Text(\n {\n text: label,\n x: this.width + this.getYAxisLeftMargin() - padding.left + ChartSettings.right.axis.margin.left!,\n y: yCoordinate,\n font: Text.getMergedPropsWithDefaults('font', { size, style: 'bold' }),\n lineHeight,\n padding,\n textBaseline: TextBaseline.middle,\n fillStyle:\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen ? 'black' : Colors.currentText,\n background: background || Colors.currentBackground,\n },\n this.paneModel\n ).render(context)\n translate.undo()\n }\n\n renderXAxis() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n this.context.save()\n if (\n this.data.getDrawDays() !== 1 &&\n !getIsSmallIndexChart(this.specificChartFunctionality) &&\n this.data.instrument !== Instrument.MarketSentiment\n ) {\n this.clip(true)\n }\n this.context.translate(ChartSettings.left.width, ChartSettings.top.height)\n const text = new Text(\n {\n y: this.height + ChartSettings.bottom.axis.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.bottom.axis.font.size }),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.top,\n textAlign: TextAlign.center,\n },\n this.paneModel\n )\n switch (this.data.timeframe) {\n case TIMEFRAME.i1:\n case TIMEFRAME.i2:\n case TIMEFRAME.i3:\n case TIMEFRAME.i5:\n if (this.data.instrument === Instrument.Stock) {\n if (\n this.type === ChartElementType.LineChart &&\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen &&\n this.data.timeframe === 'i5'\n ) {\n this.render15MinXAxis(text)\n } else {\n this.renderIntradayXAxis(text)\n }\n } else {\n this.renderIntradayXAxisFutures(text)\n }\n break\n case TIMEFRAME.i10:\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.renderIntradayXAxis(text)\n } else {\n this.render15MinXAxis(text)\n }\n break\n case TIMEFRAME.i15:\n case TIMEFRAME.i30:\n case TIMEFRAME.h:\n case TIMEFRAME.h2:\n case TIMEFRAME.h4:\n this.render15MinXAxis(text)\n break\n case TIMEFRAME.d:\n this.renderDailyXAxis(text)\n break\n case TIMEFRAME.w:\n this.renderWeeklyXAxis(text)\n break\n case TIMEFRAME.m:\n this.renderMonthlyXAxis(text)\n break\n default:\n break\n }\n this.context.restore()\n }\n\n isXPointVisible(x: number, buffer = 0) {\n return x >= 0 - buffer && x <= this.width + buffer\n }\n\n renderXAxisLabels({\n labels,\n textRenderer,\n allowedOverflow = 0,\n }: {\n labels: Omit[]\n textRenderer: Text\n allowedOverflow?: number\n }) {\n const sortedLabels: XAxisLabel[] = []\n const renderedLabelRanges: Array<{ from: number; to: number }> = []\n labels.reverse().forEach((label) => {\n textRenderer.set({ text: label.text })\n const textWidth = Math.floor(textRenderer.measure(this.context))\n const newLabel = { ...label, textWidth }\n if (label.hasPriority) {\n sortedLabels.unshift(newLabel)\n } else {\n sortedLabels.push(newLabel)\n }\n })\n\n sortedLabels.forEach(({ x, text, textWidth }) => {\n if (!this.isXPointVisible(x, allowedOverflow)) {\n return\n }\n const halfOfTextWidth = textWidth / 2\n const overflowLeft = x - halfOfTextWidth + allowedOverflow\n const overflowRight = this.width - (x + halfOfTextWidth) + allowedOverflow\n let labelX = x\n if (overflowLeft < 0) {\n labelX = Math.round(x - overflowLeft)\n } else if (overflowRight < 0) {\n labelX = Math.round(x + overflowRight)\n }\n if (getIsOverlapping({ x: labelX, textWidth, renderedLabelRanges })) {\n return\n }\n renderedLabelRanges.push({\n from: labelX - halfOfTextWidth - OFFSET.M,\n to: labelX + halfOfTextWidth + OFFSET.M,\n })\n textRenderer.set({ text, x: labelX })\n textRenderer.render(this.context)\n })\n }\n\n renderIntradayXAxis(text: Text) {\n const interval = IntradayTimeframeInterval[this.data.timeframe as keyof typeof IntradayTimeframeInterval]\n const marketStartHour = ~~(this.data.marketStartMinutes / 60)\n let marketEndHour = 15 + Math.ceil(this.data.aftermarketLengthMinutes / 60)\n const labels = []\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n marketEndHour = 16\n }\n\n const xLine = this.getXLine()\n const barWidth = getBarWidthWithMargin({\n zoomFactor: this.model.zoomFactor,\n chartLayout: this.model.chart_layout(),\n })\n\n const dayToOffset = this.data.getDayToOffset()\n const isSmallIndexChart = getIsSmallIndexChart(this.specificChartFunctionality)\n const allowedOverflow = isSmallIndexChart ? SMALL_INDEX_CHART_LABEL_BUFFER : 0\n for (const day in dayToOffset) {\n const dayIndex = dayToOffset[day]\n const date = dateFromDateString(day)\n\n for (let i = marketStartHour; i <= marketEndHour; i++) {\n let x =\n ((i * 60 - this.data.marketStartMinutes) / interval) * barWidth +\n dayIndex * (this.data.drawMinutesPerDay / interval) * barWidth +\n this.leftOffset\n if (!this.isXPointVisible(x, allowedOverflow)) {\n continue\n }\n let roundedX = Math.round(x)\n\n if (i === marketStartHour) {\n if (isSmallIndexChart) {\n roundedX = Math.round(x - 3 + (30 / interval) * barWidth)\n // ~9:30AM\n xLine\n .set({\n x1: roundedX,\n x2: roundedX,\n })\n .render(this.context)\n continue\n }\n if (this.data.premarketLengthMinutes === 0) {\n // If there is no premarket, day starts at 9:30 AM\n x += (30 / interval) * barWidth\n }\n roundedX = Math.round(x)\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\n labels.push({\n hasPriority: true,\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\n x: roundedX,\n })\n } else {\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\n labels.push({\n text: ((i + 11) % 12) + 1 + (i < 12 ? 'AM' : 'PM'),\n x: roundedX,\n })\n }\n }\n }\n this.renderXAxisLabels({ labels, textRenderer: text, allowedOverflow })\n }\n\n renderIntradayXAxisFutures(textRenderer: Text) {\n let lastDay = ''\n let lastHours = NaN\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\n const day = date.getDate() + '-' + date.getMonth()\n const hours = date.getHours()\n const x = Math.round(this.fx(i) + this.leftOffset)\n\n if (day !== lastDay) {\n lastDay = day\n lastHours = hours\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n x,\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\n })\n } else if (hours % 2 === 0 && hours !== lastHours) {\n lastHours = hours\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({ x, text: ((hours + 11) % 12) + 1 + (hours < 12 ? 'AM' : 'PM') })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n render15MinXAxis(textRenderer: Text) {\n let lastDay = ''\n let x = 0\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\n const day = date.getDate() + '-' + date.getMonth()\n if (day !== lastDay) {\n lastDay = day\n if (this.data.instrument === Instrument.Stock) {\n const barAtMinute = date.getMinutes() + date.getHours() * 60\n const indexOffset = (barAtMinute - this.data.marketStartMinutes) / this.data.interval\n x = Math.round(this.paneModel.scale.x(this.data.barIndex[i] - indexOffset) + this.leftOffset)\n } else {\n x = Math.round(this.fx(i) + this.leftOffset)\n }\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\n x,\n })\n }\n }\n\n // Offscreen only - if lastDate !== lastBarDate add tick\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${(this.data.lastDate % 100)\n .toString()\n .padLeft('00')}` // YYYYMMDD / 20211118 => Nov 18\n\n if (labels.length > 0 && labels[labels.length - 1].text !== lastDate) {\n const barsInDay = this.data.getBarsInDay()!\n const barWidth = getBarWidthWithMargin({\n zoomFactor: this.model.zoomFactor,\n chartLayout: this.model.chart_layout(),\n })\n const dayWidth = barsInDay * barWidth\n x += dayWidth\n labels.push({\n text: lastDate,\n x,\n })\n xLine.set({ x1: x, x2: x }).render(this.context)\n }\n }\n\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n renderDailyXAxis(textRenderer: Text) {\n let lastMonth = ''\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = new Date(this.data.date[i] * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n lastMonth = month\n const x = Math.round(this.fx(i) + this.leftOffset)\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n hasPriority: date.getMonth() === 0,\n text: date.getMonth() === 0 ? date.getFullYear().toString() : MONTHS[date.getMonth()],\n x,\n })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n renderWeeklyXAxis(textRenderer: Text) {\n let lastMonth = ''\n\n const labels = []\n const xLine = this.getXLine()\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\n for (let i = 0; i < this.data.date.length; i++) {\n const date = new Date(this.data.date[i] * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n lastMonth = month\n const x = Math.round(this.fx(i) + this.leftOffset)\n if (!this.isXPointVisible(x)) {\n continue\n }\n if (date.getMonth() % 3 === 0) {\n xLine.set({ x1: x, x2: x }).render(this.context)\n } else {\n new Line(\n {\n x1: x,\n x2: x,\n y1: 0,\n y2: this.height,\n strokeStyle: Colors.gridSecondary,\n dashLength: 3,\n },\n this.paneModel\n ).render(this.context)\n }\n const isYearLabel = date.getMonth() === 0\n labels.push({\n text: isYearLabel ? date.getFullYear().toString().substring(2) : MONTHS[date.getMonth()][0],\n hasPriority: isYearLabel,\n x,\n })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n renderMonthlyXAxis(textRenderer: Text) {\n let lastYear = null\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = new Date(this.data.date[i] * 1000)\n const year = date.getFullYear()\n const isJanuary = date.getMonth() === 0\n if (year !== lastYear && (labels.length !== 0 || isJanuary)) {\n lastYear = year\n const x = Math.round(this.fx(i) + this.leftOffset)\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n text: date.getFullYear().toString(),\n x,\n })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n handleIndicatorsChange() {\n this.updateShouldRenderVolume()\n this.setupCache()\n this.trigger('change')\n }\n\n updateShouldRenderVolume() {\n this.shouldRenderVolume = !this.model.chart_layout().getIsIndicatorPresent(IndicatorType.Vol)\n }\n\n getVolumeTicks(count: number, maxHeight: number, fontHeight: number): number[] {\n const maxCount = 5\n const minCount = 1\n if (count > maxCount) {\n count = maxCount\n }\n const ticks = this.volumeFY.ticks(count).filter((tick) => tick !== 0)\n if (count <= minCount) {\n return [ticks[ticks.length - 1]]\n }\n // ticks are rendered on middle line so we have +- 1/2 of font size above and below range[min,max]\n // so we already have +-1 fontsize space, but in some cases that wouldn't be enough so we need to scale\n // dynamically, we add 3px of space per tick gap\n if (ticks.length * fontHeight + (ticks.length - 1) * 3 > maxHeight) {\n return this.getVolumeTicks(count - 1, maxHeight, fontHeight)\n }\n return ticks\n }\n\n renderVolumeAxis(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n context.save()\n const relativeVolume = Math.max(0, Math.min(2, this.data.relativeVolume))\n\n const x = 20\n const fy = (y: number) => ChartSettings.top.height + this.height - this.height * (0.5 * y)\n const height = this.height * (0.5 * relativeVolume)\n\n const label = new Text(\n {\n x: 15,\n font: { size: 8 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.right,\n },\n this.paneModel\n )\n for (let i = 0.5; i <= 2; i += 0.5) {\n const y = Math.round(fy(i))\n label\n .set({\n text: i.toFixed(1),\n y: y,\n })\n .render(context)\n\n context.set('strokeStyle', 'rgb(130, 130, 130)')\n context.beginPath()\n context.setLineDash([2, 3])\n context.translate(0, 0.5)\n context.moveTo(x, y)\n context.lineTo(x + 7, y)\n context.translate(0, -0.5)\n context.stroke()\n }\n\n context.set('fillStyle', 'rgba(0, 135, 255, 0.58)')\n context.set('lineWidth', 1)\n context.set('strokeStyle', Colors.grid)\n context.setLineDash([])\n\n context.fillRect(x, Math.round(ChartSettings.top.height + this.height - height), 7, Math.round(height))\n context.translate(0.5, 0.5)\n context.strokeRect(x, ChartSettings.top.height, 7, this.height)\n context.translate(-0.5, -0.5)\n\n new Text(\n {\n text: 'RELATIVE\\nVOLUME',\n x: 33,\n y: ChartSettings.top.height + this.height + 6,\n font: { size: FONT_SIZE.XXS },\n lineHeight: LINE_HEIGHT.XS,\n fillStyle: Colors.text,\n textBaseline: TextBaseline.top,\n textAlign: TextAlign.right,\n },\n this.paneModel\n ).render(context)\n context.restore()\n return\n }\n const rangeMax = this.volumeFY.range()[1]\n const volumeAxisFontSize = ChartSettings.left.volumeAxis.font.size!\n const tickCount = Math.floor(rangeMax / volumeAxisFontSize)\n const ticks = this.getVolumeTicks(tickCount, rangeMax, volumeAxisFontSize)\n const format = this.volumeFY.tickFormat(4, 's')\n const text = new Text(\n {\n x: ChartSettings.left.volumeAxis.margin.left,\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.left.volumeAxis.font.size }),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.right,\n },\n this.paneModel\n )\n ticks.forEach((tick) =>\n text\n .set({\n text: format(tick).replace(/G/, 'B'), // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\n y: ChartSettings.top.height + this.height - this.volumeFY(tick),\n })\n .render(context)\n )\n }\n\n renderVolume() {\n if (!this.shouldRenderVolume) return\n\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n // Return if the domain bounds are equal, this would put any value in the middle\n const [domainFrom, domainTo] = this.volumeFY.domain()\n if (this.setupAxisTimeFrame !== this.data.timeframe || domainFrom === domainTo) {\n return\n }\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height + this.height - 59,\n })\n translate.do()\n const halfBarWidth = this.getHalfBarWidth()\n const barWidthWithoutMargin = this.getBarWithoutMarginWidth()\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i, x) => {\n // Skip render if the value is <= 0\n if (this.data.volume[i] <= 0) {\n return\n }\n\n this.context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\n const y = Math.round(this.volumeFY(this.data.volume[i]))\n this.context.fillRect(x - halfBarWidth, 60, barWidthWithoutMargin, -y)\n },\n })\n translate.undo()\n }\n\n renderOverlays() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n for (const overlay of this.overlays) {\n overlay.renderContent(this.context)\n }\n translate.undo()\n }\n\n renderCross(context: CanvasRenderingContext2D) {\n const isRendered = renderCross({\n context,\n mouseModel,\n paneModel: this.paneModel,\n contentWidth: this.width,\n contentHeight: this.height,\n quote: this.data,\n getRoundDecimalPlaces: (price) => this.getPlacesLastClose(price),\n onRenderCrossText: !this.getIsRedesignedChart() ? this.renderCrossText : undefined,\n })\n if (this.getIsRedesignedChart()) {\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.paneModel))\n }\n\n if (isRendered !== undefined) {\n setElementCursor({\n elementId: this.model.chart_layout().getHTMLElementId(),\n cursor: isRendered ? 'crosshair' : 'default',\n conditionalCursor: 'grabbing',\n })\n }\n }\n\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\n const n = this.data.getDataByBarIndex(key, crossIndex)\n if (n !== null) {\n return shouldReturnRoundedString ? this.roundOhlc(n) : `${n}`\n }\n }\n\n getCrossIndexChange(crossIndex: number) {\n const crossDataIndex = this.data.getDataIndexByBarIndex(crossIndex)\n const crossClose = this.data.close[crossDataIndex] ?? null\n const previousClose = this.data.close[crossDataIndex - 1] ?? null\n if (crossClose !== null && previousClose !== null) {\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\n }\n\n return null\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n const { ChartSettings } = this.getChartLayoutSettings()\n context.save()\n context.translate(ChartSettings.left.width, 0)\n\n if (this.getIsRedesignedChart()) {\n this.renderOverlaysLabels(context)\n if (Number.isNaN(crossIndex)) {\n this.getOHLC({ context })\n context.restore()\n return\n }\n }\n\n const dateByBarIndex = this.data.getDataByBarIndex('date', crossIndex)\n const date = dateByBarIndex ? utils.dateFromUnixTimestamp(dateByBarIndex) : null\n\n if (date === null) {\n const virtualTradedDates =\n this.data.date.length > 0\n ? getVirtualTimeframeTradedDates({\n dateStart: this.data.date[0],\n dateEnd: this.data.date[this.data.date.length - 1],\n quote: this.data,\n })\n : []\n this.getOHLC({\n context,\n dateString: virtualTradedDates[crossIndex]\n ? getDateString({\n date: utils.dateFromUnixTimestamp(virtualTradedDates[crossIndex]),\n timeframe: this.data.timeframe,\n })\n : null,\n })\n context.restore()\n return\n }\n\n this.getOHLC({\n context,\n date,\n data: {\n open: this.getDataByCrossIndex(crossIndex, 'open'),\n high: this.getDataByCrossIndex(crossIndex, 'high'),\n low: this.getDataByCrossIndex(crossIndex, 'low'),\n close: this.getDataByCrossIndex(crossIndex, 'close'),\n volume: this.getDataByCrossIndex(crossIndex, 'volume', false),\n },\n changePercentage: this.getCrossIndexChange(crossIndex),\n })\n\n context.restore()\n }\n\n renderChange({ context }: { context: CanvasRenderingContext2D }) {\n const CHANGE_SPACER = 10\n const { ChartSettings } = this.getChartLayoutSettings()\n const { ticker, change, ohlc } = ChartSettings.top\n const { tickerChange, tickerAfterChange } = getTickerChange({ data: this.data })\n\n if (!tickerChange) {\n return\n }\n\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\n const isGroupInstrument = this.data.instrument === Instrument.Group\n const changeText = new Text(\n {\n text: isOffscreen && isGroupInstrument ? tickerChange.percentString : tickerChange.string,\n x: !getIsSmallIndexChart(this.specificChartFunctionality)\n ? this.width - ChartSettings.top.change.margin.right!\n : this.width,\n y: ChartSettings.top.change.margin.top,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\n textAlign: TextAlign.right,\n textBaseline: ChartSettings.top.baseline,\n fillStyle: getChangeColor({ change: tickerChange.points, ChartSettings }),\n },\n this.paneModel\n )\n this.changeWidth = changeText.measure(context)\n changeText.render(context)\n\n if (isOffscreen && (!this.isLargeChart || isGroupInstrument)) {\n return\n }\n if (tickerAfterChange) {\n const afterChangeText = new Text(\n {\n text: tickerAfterChange?.string,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\n textAlign: TextAlign.right,\n textBaseline: ChartSettings.top.baseline,\n fillStyle: getChangeColor({ change: tickerAfterChange.points, ChartSettings }),\n },\n this.paneModel\n )\n const afterChangeTextWidth = afterChangeText.measure(context)\n const oneLineAHChangeWidth = this.changeWidth + CHANGE_SPACER + afterChangeTextWidth\n\n if (\n ChartSettings.left.width + this.tickerWidth + ticker.margin.left! + OFFSET.S <\n ChartSettings.left.width + this.width - oneLineAHChangeWidth - change.margin.right!\n ) {\n afterChangeText\n .set({\n x: this.width - ChartSettings.top.change.margin.right! - this.changeWidth - CHANGE_SPACER,\n y: ChartSettings.top.change.margin.top,\n })\n .render(context)\n this.afterChange = null\n this.changeWidth = oneLineAHChangeWidth\n } else if (\n this.lastOhlc[0] &&\n ChartSettings.left.width +\n this.tickerWidth +\n ticker.margin.left! +\n this.lastOhlc[0].width! +\n ohlc.margin.left! +\n ohlc.margin.right! <\n ChartSettings.left.width + this.width - afterChangeTextWidth - change.margin.right!\n ) {\n afterChangeText\n .set({\n x: this.width - ChartSettings.top.change.margin.right!,\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\n })\n .render(context)\n this.changeWidth = Math.max(this.changeWidth, afterChangeTextWidth)\n this.afterChange = {\n x: this.width - ChartSettings.top.change.margin.right!,\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\n width: afterChangeTextWidth,\n }\n }\n }\n }\n\n renderOHLC(parameters: IRenderOHLCParameters) {\n if (!this.getIsRedesignedChart()) {\n this.renderOHLCQuotePage(parameters)\n } else {\n this.renderOHLCChartsPage(parameters)\n }\n }\n\n renderOHLCChartsPage({ context, date, open, high, low, close, volume, changePercentage }: IRenderOHLCParameters) {\n const chartBreakpoints = getChartBreakpoints(this.width)\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n\n const OhlcText = new Text(\n {\n font: { size: FONT_SIZE.S },\n lineHeight: 18,\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\n },\n this.paneModel\n )\n\n const dateElements = date ? [{ text: date, color: gray300 }] : []\n const trendColor = (open ?? 0) > (close ?? 0) ? tailwindColors.red[400] : tailwindColors.green[400]\n const oElements = open\n ? [\n { text: 'O', color: gray300 },\n { text: open, color: trendColor },\n ]\n : []\n const hElements = high\n ? [\n { text: 'H', color: gray300 },\n { text: high, color: trendColor },\n ]\n : []\n const lElements = low\n ? [\n { text: 'L', color: gray300 },\n { text: low, color: trendColor },\n ]\n : []\n const cElements = close\n ? [\n { text: 'C', color: gray300 },\n { text: close, color: trendColor },\n ]\n : []\n const volElements = volume\n ? [\n { text: 'Vol', color: gray300 },\n { text: volume, color: trendColor },\n ]\n : []\n const changeElements = changePercentage != null ? [{ text: changePercentage.string, color: trendColor }] : []\n\n const lines: OhlcLineElements[] = []\n\n const getFlatLineArrayWithSpaces = (lineElements: OhlcLineElements[]) =>\n lineElements.flatMap((elements, index) =>\n index > 0 ? ([...(elements.length > 0 ? ['space'] : []), ...elements] as OhlcLineElements) : elements\n )\n if (chartBreakpoints.isM) {\n lines.push(\n getFlatLineArrayWithSpaces([\n dateElements,\n oElements,\n hElements,\n lElements,\n cElements,\n volElements,\n changeElements,\n ])\n )\n } else if (chartBreakpoints.isS) {\n lines.push(getFlatLineArrayWithSpaces([dateElements, changeElements]))\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements, volElements]))\n } else {\n lines.push(getFlatLineArrayWithSpaces([dateElements, volElements, changeElements]))\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements]))\n }\n\n const startX = OFFSET.M - ChartSettings.left.width\n let x = startX\n let y = OFFSET.M + OhlcText.attrs.lineHeight / 2\n\n lines.forEach((line) => {\n x = startX\n line.forEach((lineElement, index, lineElements) => {\n const padding = { left: 1, right: 1, top: 0, bottom: 0 }\n const { text = '', color = undefined } = lineElement === 'space' ? {} : lineElement\n if (index === 0) {\n padding.left = 5\n } else if (index === lineElements.length - 1) {\n padding.right = 5\n } else if (lineElement === 'space') {\n padding.left = 7\n padding.right = 7\n if (!chartBreakpoints.isS) {\n padding.left = 5\n padding.right = 5\n }\n }\n OhlcText.set({ text, fillStyle: color, x, y, padding })\n OhlcText.render(context)\n x += OhlcText.width\n })\n y += OhlcText.attrs.lineHeight\n })\n }\n\n renderOverlaysLabelsChartsPage(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const chartBreakpoints = getChartBreakpoints(this.width)\n const LabelsText = new Text(\n {\n font: { size: FONT_SIZE.S },\n lineHeight: 18,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n background: getHEXWithSpecificAplha(ChartSettings.general.Colors.canvasFill, 0.8),\n // this function gets (indirectly) called from renderCrossText which is already \"translateX\" by ChartSettings.left.width\n x: OFFSET.M - ChartSettings.left.width,\n padding: { left: PADDING.S, right: PADDING.S, top: 0, bottom: 0 },\n },\n this.paneModel\n )\n\n let numberOfNewOhlcLines = 2\n if (chartBreakpoints.isM) {\n numberOfNewOhlcLines = 1\n } else if (chartBreakpoints.isS) {\n numberOfNewOhlcLines = 2\n }\n\n // We assume lineheight is the same as OHLC text\n const { lineHeight } = LabelsText.attrs\n let y = lineHeight * numberOfNewOhlcLines + lineHeight / 2 + OFFSET.M\n\n for (const overlay of this.overlays) {\n if (!overlay.isRenderedOverlaysLabel()) {\n continue\n }\n LabelsText.set({\n text: overlay.toString(),\n y,\n fillStyle: overlay.getLabelColor(),\n }).render(context)\n y += lineHeight\n }\n }\n\n renderOHLCQuotePage({\n context,\n date,\n open,\n high,\n low,\n close,\n volume,\n afterHour,\n isSmallIndexChart = false,\n isNewestOHLC = false,\n time,\n directRender = false,\n changePercentage,\n }: IRenderOHLCParameters) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const { ohlc } = ChartSettings.top\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\n const isGroupInstrument = this.data.instrument === Instrument.Group\n if (isOffscreen && isGroupInstrument) {\n ohlc.type = OHLCType.dateOnly\n } else if (isOffscreen && this.data.instrument !== Instrument.Stock && time) {\n ohlc.type = OHLCType.timeOnly\n }\n\n const lineTopY = ohlc.type ? ohlc.margin.top : ohlc.margin.top! - ChartSettings.top.ticker.font.size!\n const OHLCFontSize = ohlc.font.size!\n const centerXOffset =\n this.tickerWidth +\n ChartSettings.top.ticker.margin.left! +\n (this.width -\n (this.tickerWidth +\n ChartSettings.top.ticker.margin.left! +\n this.changeWidth +\n (isSmallIndexChart ? 0 : ChartSettings.top.change.margin.right!))) / // smallIndexChart don't have change.margin.right\n 2\n const leftXOffset = this.tickerWidth + ChartSettings.top.ticker.margin.left! + ohlc.margin.left!\n const hasOhlc = ![open, high, low, close, volume].some((ohlcString) => !ohlcString)\n const OHLC = hasOhlc\n ? {\n date: [date ?? ''],\n singleLine: [\n `${date} O:${open} H:${high} L:${low} C:${close}${\n afterHour ? ` AH:${afterHour}` : ''\n } Vol:${volume} `,\n /*\n * this is needed because of the way we render ohlc text down below in renderOHLCToCanvas\n * undefined is used instead of null because TS had some issues with `null` even if it is filtered out\n * */\n changePercentage ? changePercentage.string : undefined,\n ].filter((value) => value !== undefined),\n }\n : {\n date: [date ?? ''],\n singleLine: [`${date ?? ''}`],\n }\n\n const OHLC_TEXT = new Text(\n {\n font: { size: OHLCFontSize },\n },\n this.paneModel\n )\n\n const getOHLCType = () => {\n if (!isSmallIndexChart) {\n return OHLCType.singleLine\n }\n return OHLCType.dateOnly\n }\n\n const getOHLCSettings = () => {\n switch (ohlc.type || getOHLCType()) {\n case OHLCType.singleLine:\n return {\n text: OHLC.singleLine,\n x: [leftXOffset, leftXOffset],\n y: [ohlc.margin.top],\n textAlign: TextAlign.left,\n textBaseline: [TextBaseline.alphabetic],\n }\n case OHLCType.dateOnly:\n if (isOffscreen && isGroupInstrument) {\n const text = `${OHLC.date} Volume: ${volume}`\n const textWidth = OHLC_TEXT.set({ text }).measure(context)\n return {\n text: [text],\n x: [\n this.width - ChartSettings.top.change.margin.right! - this.changeWidth - textWidth - CHART_MARGIN.XXL,\n ],\n y: [ohlc.margin.top],\n textAlign: TextAlign.center,\n textBaseline: [TextBaseline.alphabetic],\n }\n } else if (isSmallIndexChart) {\n return {\n text: OHLC.date,\n x: [centerXOffset],\n y: [ohlc.margin.top],\n textAlign: TextAlign.center,\n textBaseline: [TextBaseline.alphabetic],\n }\n } else {\n const isEnoughSpace =\n this.width -\n (this.tickerWidth +\n ChartSettings.top.ticker.margin.left! +\n ohlc.margin.left! +\n ohlc.margin.right! +\n this.changeWidth +\n ChartSettings.top.change.margin.right!) >\n OHLC_TEXT.set({ text: OHLC.date[0] }).measure(context)\n const alignTop = !isEnoughSpace || ohlc.font.baseline === TextBaseline.top\n return {\n text: OHLC.date,\n x: [leftXOffset],\n y: alignTop ? [lineTopY] : [ohlc.margin.top],\n textAlign: TextAlign.left,\n textBaseline: alignTop ? [TextBaseline.top] : [TextBaseline.alphabetic],\n }\n }\n case OHLCType.timeOnly:\n return {\n text: [time],\n x: [centerXOffset - OHLC_TEXT.set({ text: time }).measure(context) / 2],\n y: [lineTopY],\n textAlign: TextAlign.center,\n textBaseline: [ohlc.font.baseline],\n }\n default:\n return\n }\n }\n\n if (!isNewestOHLC) {\n context.fillStyle = Colors.canvasFill\n this.lastOhlc.forEach((line) => {\n const x = (line.textAlign === TextAlign.left ? line.x : line.x! - line.width! / 2)!\n const y = (line.textBaseline === TextBaseline.top ? line.y : line.y! - OHLCFontSize)!\n context.fillRect(\n x - PADDING.XXS,\n y - PADDING.XXS,\n PADDING.XXS + line.width! + PADDING.XXS,\n PADDING.XXS + OHLCFontSize + PADDING.XXS\n )\n })\n\n if (this.afterChange) {\n context.fillRect(\n this.afterChange.x - this.afterChange.width - PADDING.XXS,\n this.afterChange.y - ChartSettings.top.change.font.size! - PADDING.XXS,\n PADDING.XXS + this.afterChange.width + PADDING.XXS,\n PADDING.XXS + ChartSettings.top.change.font.size! + PADDING.XS\n )\n }\n } else {\n this.lastOhlc = []\n }\n\n const ohlcSettings = getOHLCSettings()\n\n const renderOHLCToCanvas = ({\n ohlcSet,\n render = true,\n }: {\n ohlcSet?: {\n text: (string | undefined)[]\n x: number[]\n y: (number | undefined)[]\n textAlign: TextAlign\n textBaseline: (TextBaseline | undefined)[]\n }\n render?: boolean\n }) => {\n const isSingleLineWithChange = (ohlc.type || getOHLCType()) === OHLCType.singleLine && changePercentage\n ohlcSet?.text.forEach((line: string | undefined, index: number) => {\n let i = index\n let leftOffset = 0\n let fillStyle = Colors.text\n let text = line\n if (index > 0 && isSingleLineWithChange) {\n i -= 1\n leftOffset = OHLC_TEXT.measure(context)\n text = line\n\n fillStyle = getChangeColor({ change: changePercentage.points, ChartSettings })\n }\n const options = {\n text,\n x: ohlcSet.x[i] + leftOffset,\n y: ohlcSet.y[i],\n textBaseline: ohlc.font.baseline ? ohlc.font.baseline : ohlcSet.textBaseline[i],\n textAlign: ohlc.font.textAlign ? ohlc.font.textAlign : ohlcSet.textAlign,\n fillStyle,\n }\n OHLC_TEXT.set(options)\n if (isNewestOHLC) {\n this.lastOhlc[i] = { width: OHLC_TEXT.measure(context), ...options }\n }\n if (render) {\n OHLC_TEXT.render(context)\n }\n })\n }\n renderOHLCToCanvas({ ohlcSet: ohlcSettings, render: directRender })\n\n return {\n ohlcSettings,\n renderOHLCToCanvas,\n }\n }\n\n // only for stocks on i1/i3/i5 and one day view\n renderFadeExtendedHours() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const period = this.model.quote().timeframe\n if (this.data.instrument !== Instrument.Stock) {\n return\n }\n if (![TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5].includes(period)) {\n return\n }\n\n const interval = parseInt(period.substring(1), 10)\n const dayToOffset = this.data.getDayToOffset()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n const halfBarWidth = this.getHalfBarWidth()\n for (const day in dayToOffset) {\n // todo aftermarket\n const dayIndex = dayToOffset[day]\n let n0 = (this.data.drawMinutesPerDay / interval) * dayIndex\n let n1 = this.data.premarketLengthMinutes / interval + n0 // bars in 90mins from 8am to 9:30am\n let x0 = this.paneModel.scale.x(n0) - halfBarWidth\n let width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\n this.context.set('fillStyle', Colors.premarketFade)\n this.context.fillRect(x0, 0, width, this.height + 1)\n\n if (this.data.aftermarketLengthMinutes > 0) {\n n0 =\n (this.data.drawMinutesPerDay / interval) * dayIndex +\n (this.data.drawMinutesPerDay - this.data.aftermarketLengthMinutes) / interval\n n1 = this.data.aftermarketLengthMinutes / interval + n0 // bars in 90mins from 4pm to 5:30pm\n x0 = this.paneModel.scale.x(n0) - halfBarWidth\n width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\n\n this.context.set('fillStyle', Colors.aftermarketFade)\n this.context.fillRect(x0, 0, width, this.height + 1)\n }\n }\n translate.undo()\n }\n\n shouldShowPrevClose() {\n const quote = this.model.quote()\n const isStock = quote.instrument === Instrument.Stock\n const isIntradayWithPreMarket = TIMEFRAMES_WITH_PRE_MARKET.includes(quote.timeframe)\n const isIndexChart = this.specificChartFunctionality === SpecificChartFunctionality.smallIndex\n\n return isStock && (isIntradayWithPreMarket || isIndexChart)\n }\n\n renderPrevClose() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (!this.shouldShowPrevClose()) {\n return\n }\n const translate = getTranslate({\n context: this.context,\n xOffset: ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n\n const y = Math.round(this.fy(this.model.quote().prevClose))\n new Line(\n {\n x1: 0,\n x2: this.width,\n y1: y,\n y2: y,\n strokeStyle: Colors.prevClose,\n dashLength: 3,\n },\n this.paneModel\n ).render(this.context)\n translate.undo()\n }\n\n renderChartNotAvailable() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const x = ~~((ChartSettings.left.width + ChartSettings.right.width + this.width) / 2)\n const y = ~~((ChartSettings.top.height + ChartSettings.bottom.height + this.height) / 2)\n new Text(\n {\n text: 'Chart not available',\n x,\n y,\n font: { size: FONT_SIZE.M, style: 'bold' },\n fillStyle: Colors.text,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.middle,\n },\n this.paneModel\n ).render(this.context)\n }\n\n // private\n setupCache() {\n const { ChartSettings } = this.getChartLayoutSettings()\n /*\n * Don't create new Cache instances, because Safari takes too long to free up memory\n * leading to canvas.getContext returning null. https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\n *\n * To further improve performance, cache.set shouldn't be called when unnecessary,\n * because setupCache is called for many model updates. The same applies for indicators/indicator.js.\n */\n this.baseCache = this.baseCache || new Cache()\n\n this.baseCache.set(\n (context: CanvasRenderingContext2D) => {\n if (this.data.close.length === 0) {\n this.renderText(context)\n return\n }\n this.renderYAxis(context)\n this.renderText(context)\n if (!this.getIsMobileChartPage() && this.shouldRenderVolume) {\n this.renderVolumeAxis(context)\n }\n if (!this.getIsRedesignedChart()) {\n this.renderOverlaysLabels(context)\n }\n },\n this.width + ChartSettings.left.width + ChartSettings.right.width,\n this.height + ChartSettings.top.height + ChartSettings.bottom.height\n )\n }\n\n // called by controllers/pane on recountScale\n setupAxis(fx: ScaleAxis) {\n this.data = this.model.quote()\n const { volumeHeight } = this.getChartLayoutSettings().ChartSettings.center\n\n if (typeof fx !== 'function') {\n return\n }\n\n const halfBarWidth = this.getHalfBarWidth()\n\n const volumes = []\n for (let i = 0; i < this.data.volume.length; i++) {\n const x = fx(this.data.barIndex[i]) - halfBarWidth\n if (x + this.model.leftOffset < 0 || x + this.model.leftOffset > this.width) {\n // margin?\n continue\n }\n volumes.push(this.data.volume[i])\n }\n\n const max = utils.max(volumes) ?? 0\n const rangeMax = volumeHeight || 60\n this.volumeFY = d3.scaleLinear().range([0, rangeMax]).domain([0, max]).nice(4)\n this.setupAxisTimeFrame = this.data.timeframe\n }\n\n // private\n clip(addMarginBottom?: boolean) {\n const { ChartSettings } = this.getChartLayoutSettings()\n if (addMarginBottom == null) {\n addMarginBottom = false\n }\n this.context.beginPath()\n let marginBottom = 0\n if (addMarginBottom) {\n marginBottom = ChartSettings.bottom.height\n }\n this.context.rect(ChartSettings.left.width, ChartSettings.top.height, this.width, this.height + marginBottom)\n this.context.clip()\n }\n\n addOverlay(overlay: Overlay) {\n overlay.chart = this\n this.overlays.push(overlay)\n return this.trigger('change')\n }\n\n setOverlays(overlays: Overlay[]) {\n this.overlays = overlays\n return this.trigger('change')\n }\n\n removeOverlay(overlay: Overlay) {\n for (let index = 0; index < this.overlays.length; index++) {\n const el = this.overlays[index]\n if (el === overlay) {\n this.attrs.overlays.splice(index, 1)\n this.overlays.splice(index, 1)\n this.trigger('change')\n break\n }\n }\n }\n\n getMinMax(): { min: number; max: number; firstVisibleClose?: number | null } {\n let min = Number.MAX_VALUE\n let max = Number.MIN_VALUE\n let firstVisibleClose = null\n const data = (this.data = this.model.quote())\n\n for (let i = 0; i < data.open.length; i++) {\n const center = this.fx(i)\n if (center + this.model.leftOffset < 0 || center + this.model.leftOffset > this.width) {\n // margin?\n continue\n }\n if (firstVisibleClose === null) {\n firstVisibleClose = data.close[i]\n }\n min = Math.min(min, data.low[i])\n max = Math.max(max, data.high[i])\n }\n\n if (min === Number.MAX_VALUE && max === Number.MIN_VALUE) {\n for (\n let start = Math.max(data.open.length - 10, 0), i = start, end1 = data.open.length, asc1 = start <= end1;\n asc1 ? i < end1 : i > end1;\n asc1 ? i++ : i--\n ) {\n min = Math.min(min, data.low[i])\n max = Math.max(max, data.high[i])\n }\n }\n\n if (this.shouldShowPrevClose() && data.prevClose !== null) {\n min = Math.min(min, data.prevClose)\n max = Math.max(max, data.prevClose)\n }\n\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen && !this.model.dateRange) {\n min = Math.min(min, data.lastClose)\n max = Math.max(max, data.lastClose)\n }\n return { min, max, firstVisibleClose }\n }\n\n moveBy() {}\n\n isInArea() {\n return false\n }\n\n fx = (x: number) => this.paneModel.scale.x(this.data.barIndex[x])\n\n fy = (y: number) => this.paneModel.scale.y(y)\n\n round(n: number, overridePlaces?: number) {\n return round({ data: this.data, num: n, overridePlaces: overridePlaces ?? this.getPlacesLastClose() })\n }\n\n roundOhlc(n: number) {\n const placesLastClose = this.getPlacesLastClose()\n return round({\n data: this.data,\n num: n,\n overridePlaces: placesLastClose ? Math.max(placesLastClose, 2) : undefined,\n })\n }\n\n toObject() {\n const overlays = this.overlays.map((overlay) => overlay.toObject())\n return merge({}, this.attrs, { type: this.type, overlays })\n }\n\n toConfig() {\n const overlays = this.overlays.map((overlay) => overlay.toConfig())\n return merge({}, this.attrs, { type: this.type, overlays })\n }\n\n getBarWithoutMarginWidth() {\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n chartLayout: this.model.chart_layout(),\n zoomFactor: this.model.zoomFactor,\n })\n return barFillWidth + barBorderWidth * 2\n }\n\n getHalfBarWidth() {\n return ~~Math.max(1, this.getBarWithoutMarginWidth() / 2)\n }\n\n getPlacesLastClose(price?: number) {\n const { lastClose, instrument } = this.data\n const priceAbs = price && Math.abs(price)\n if (lastClose >= 100000) {\n return 0\n } else if (lastClose >= 10000) {\n return 1\n } else if (instrument === Instrument.Stock && (priceAbs ?? lastClose) < 1) {\n return 4\n } else if (lastClose === undefined) {\n // if lastClose is not defined we'll always display 2 decimpal places, e.g. backtests, screener stats\n return 2\n }\n\n return undefined\n }\n\n hasOverlay(type: string) {\n return this.overlays.some((x) => x.type === 'overlays/' + type)\n }\n\n getXLine() {\n return new Line(\n {\n y1: 0,\n y2: this.height,\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\n dashLength: 3,\n },\n this.paneModel\n )\n }\n\n getYLine() {\n return new Line(\n {\n x1: 0,\n x2: this.width,\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\n dashLength: 3,\n },\n this.paneModel\n )\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.model.chart_layout())\n }\n\n getIsMobileChartPage() {\n return (\n this.isMobile && this.model.chart_layout().specificChartFunctionality === SpecificChartFunctionality.chartPage\n )\n }\n\n getCandleLikeChartsRenderingColors() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const { theme, specificChartFunctionality } = this.model.chart_layout()\n let colors = Colors\n const overwrittenColors = getColorOverwrites({\n colors,\n theme,\n })\n const overwrittenColorKeys = Object.keys(overwrittenColors)\n const hasOverwrittenCandleColor = ['borderUp', 'wickUp', 'borderDown', 'wickDown', 'trendUp', 'trendDown'].some(\n (colorKey) => overwrittenColorKeys.includes(colorKey)\n )\n\n const shouldUseDarkerColors =\n theme === Theme.light &&\n getShouldUseDarkerWickColors({\n specificChartFunctionality: specificChartFunctionality,\n totalBarWidth: ChartSettings.center.barWidth + ChartSettings.center.border * 2,\n })\n\n if (shouldUseDarkerColors && !hasOverwrittenCandleColor) {\n colors = { ...colors, ...darkerWickColors }\n }\n const isNodeChartWithThinBars =\n specificChartFunctionality === SpecificChartFunctionality.offScreen && ChartSettings.center.border === 0\n if (isNodeChartWithThinBars && !hasOverwrittenCandleColor) {\n colors = { ...colors, ...thinBarColorsOverride, ...overwrittenColors }\n }\n\n return colors\n }\n\n getIsRedesignedChart() {\n return this.specificChartFunctionality === SpecificChartFunctionality.chartPage || isRedesignedPage(this)\n }\n}\n\nBaseChart.initClass()\n\nexport default BaseChart\n","import { RendererChartBarProps } from '../../types/shared'\nimport { ChartElementType } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport utils from '../utils'\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getIsSSr } from '../utils/helpers'\nimport Chart from './base_chart'\n\nconst WICK_WIDTH = 1\n\nclass CandleStick extends Chart {\n static type = ChartElementType.CandleStick\n static label = 'Candle'\n static iconName = 'candleBarBasic'\n\n getRenderChartBarProps({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) {\n const { trendDown, trendUp, borderDown, borderUp, wickDown, wickUp } = chartSettingsColors\n const open = this.data.open[index]\n const close = this.data.close[index]\n const trendColor = close < open ? trendDown : trendUp\n const wickColor = close < open ? wickDown : wickUp\n return {\n open,\n close,\n high: this.data.high[index],\n low: this.data.low[index],\n barFillColor: trendColor,\n borderColor: close < open ? borderDown : borderUp,\n wickColor: hasFillAndBorder ? wickColor : trendColor,\n }\n }\n\n renderChart() {\n if (this.setupAxisTimeFrame !== this.data.timeframe) {\n return\n }\n const { ChartSettings } = this.getChartLayoutSettings()\n const Colors = this.getCandleLikeChartsRenderingColors()\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n chartLayout: this.model.chart_layout(),\n zoomFactor: this.model.zoomFactor,\n })\n const shouldRenderFillAndBorder =\n barFillWidth + barBorderWidth * 2 >= 2 &&\n !(this.type === ChartElementType.HollowCandleStick && barBorderWidth === 0)\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n const translateForWick = getTranslate({\n context: this.context,\n xOffset: WICK_WIDTH / 2,\n yOffset: 0,\n })\n\n translate.do()\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, center: number) => {\n const { open, close, high, low, wickColor, borderColor, barFillColor } = this.getRenderChartBarProps({\n index: i,\n chartSettingsColors: Colors,\n hasFillAndBorder: shouldRenderFillAndBorder,\n })\n\n const candleBodyHigh = Math.round(this.fy(utils.max(open, close)))\n const candleBodyLow = Math.round(this.fy(utils.min(open, close)))\n const candleWickHigh = Math.round(this.fy(high))\n const candleWickLow = Math.round(this.fy(low))\n\n const candleBodyHeight = candleBodyLow - candleBodyHigh\n const candleBodyLeftX = center - Math.floor(barBorderWidth + barFillWidth / 2)\n const halfBorderWidth = barBorderWidth / 2\n\n // TODO: revisit for better approach, this solve issue with candlesticks\n // with even width are shifted 1px to the left and thus first candle is vertically sliced\n if (getIsSSr() && candleBodyLeftX + this.leftOffset < 0) {\n return\n }\n\n const isBodyHeightGreaterOrEqualBorders = candleBodyHeight >= barBorderWidth * 2\n const isWickLineCandleLessThanOnePixel = !shouldRenderFillAndBorder && candleWickLow - candleWickHigh < 1\n\n translateForWick.do()\n this.context.set('strokeStyle', wickColor)\n this.context.beginPath()\n this.context.moveTo(center, candleWickHigh)\n if (shouldRenderFillAndBorder) {\n this.context.lineTo(center, candleBodyHigh)\n this.context.moveTo(\n center,\n candleBodyHigh + (isBodyHeightGreaterOrEqualBorders ? candleBodyHeight : WICK_WIDTH)\n )\n }\n this.context.lineTo(center, isWickLineCandleLessThanOnePixel ? candleWickHigh + 1 : candleWickLow)\n this.context.stroke()\n translateForWick.undo()\n\n if (shouldRenderFillAndBorder) {\n const hasBorder = barBorderWidth > 0\n if (hasBorder) {\n this.context.set('strokeStyle', borderColor)\n if (isBodyHeightGreaterOrEqualBorders) {\n this.context.set('lineWidth', barBorderWidth)\n this.context.strokeRect(\n candleBodyLeftX + halfBorderWidth,\n candleBodyHigh + halfBorderWidth,\n barFillWidth + 2 * halfBorderWidth,\n candleBodyHeight - 2 * halfBorderWidth\n )\n this.context.set('lineWidth', WICK_WIDTH)\n } else {\n this.context.beginPath()\n this.context.moveTo(candleBodyLeftX, candleBodyHigh + WICK_WIDTH / 2)\n this.context.lineTo(candleBodyLeftX + barFillWidth + 2 * barBorderWidth, candleBodyHigh + WICK_WIDTH / 2)\n this.context.stroke()\n }\n }\n\n const fillHeight = candleBodyHeight - 2 * barBorderWidth\n const hasFill = fillHeight > 0\n if (hasFill || !hasBorder) {\n this.context.set('fillStyle', hasFill ? barFillColor : borderColor)\n this.context.fillRect(\n candleBodyLeftX + barBorderWidth,\n candleBodyHigh + barBorderWidth,\n barFillWidth,\n hasFill ? fillHeight : WICK_WIDTH\n )\n }\n }\n },\n })\n translate.undo()\n }\n\n toString() {\n return `Candle stick ${this.data.ticker}`\n }\n}\n\nexport default CandleStick\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\nimport { ChartElementType } from '../constants/common'\nimport CandleStick from './candle_stick'\n\nclass HollowCandleStick extends CandleStick {\n static type = ChartElementType.HollowCandleStick\n static label = 'Hollow Candle'\n static iconName = 'candleBarHollow'\n\n static getNumOfBarsBuffer(element: RequireByKey) {\n return Math.max(1, super.getNumOfBarsBuffer(element))\n }\n\n getRenderChartBarProps({ index, chartSettingsColors }: RendererChartBarProps) {\n const open = this.data.open[index]\n const close = this.data.close[index]\n const isHollow = close > open\n const generalTrendColor =\n close > this.data.close[index - 1] ? chartSettingsColors.ohlcTrendUp : chartSettingsColors.ohlcTrendDown\n const trendColor = index === 0 ? chartSettingsColors.zeroChange : generalTrendColor\n return {\n open,\n close,\n high: this.data.high[index],\n low: this.data.low[index],\n // hollow candles have transparend bodies that's why rgba is here\n barFillColor: isHollow ? 'rgba(0, 0, 0, 0)' : trendColor,\n borderColor: trendColor,\n wickColor: trendColor,\n }\n }\n\n toString() {\n return `Hollow Candle stick ${this.data.ticker}`\n }\n}\n\nexport default HollowCandleStick\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\nimport { ChartElementType, ScaleType } from '../constants/common'\nimport Quote from '../models/quote'\nimport { getTickerChangeFromCloseValues } from '../utils/chart'\nimport CandleStick from './candle_stick'\n\ntype OhlcKeys = 'high' | 'low' | 'open' | 'close'\n\nclass HeikinAshi extends CandleStick {\n static type = ChartElementType.HeikinAshi\n static label = 'Heikin Ashi'\n static iconName = 'candleBarHeikinAshi'\n\n static getNumOfBarsBuffer(element: RequireByKey) {\n return Math.max(1, super.getNumOfBarsBuffer(element))\n }\n\n getRenderChartBarProps = ({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) => {\n const haData = this.data.getHeikinAshiData()\n\n const open = haData.open[index]\n const close = haData.close[index]\n const trendColor = close < open ? chartSettingsColors.trendDown : chartSettingsColors.trendUp\n const wickColor = close < open ? chartSettingsColors.wickDown : chartSettingsColors.wickUp\n return {\n open,\n close,\n high: Math.max(this.data.high[index], open, close),\n low: Math.min(open, close, this.data.low[index]),\n barFillColor: trendColor,\n borderColor: close < open ? chartSettingsColors.borderDown : chartSettingsColors.borderUp,\n wickColor: hasFillAndBorder ? wickColor : trendColor,\n }\n }\n\n getLastValues = () => {\n const Colors = this.getCandleLikeChartsRenderingColors()\n const {\n open: lastOpen,\n close: lastClose,\n high: lastHigh,\n low: lastLow,\n } = this.getRenderChartBarProps({\n index: this.data.date.length - 1,\n chartSettingsColors: Colors,\n })\n\n return { lastOpen, lastClose, lastHigh, lastLow }\n }\n\n getRoundedLastData() {\n const lastOhlc = this.getLastValues()\n return {\n open: this.roundOhlc(lastOhlc.lastOpen),\n high: this.roundOhlc(lastOhlc.lastHigh),\n low: this.roundOhlc(lastOhlc.lastLow),\n close: this.roundOhlc(lastOhlc.lastClose),\n }\n }\n\n renderYAxis = (context: CanvasRenderingContext2D) => {\n const { lastClose } = this.getLastValues()\n super.renderYAxis(context, { lastClose }, false)\n\n const { firstVisibleClose } = this.getMinMax()\n if (this.model.scale === ScaleType.Percentage && !firstVisibleClose) return\n\n const originalLatestClose = this.data.close[this.data.close.length - 1]\n const heikinLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\n const originalLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose: originalLatestClose, firstVisibleClose })\n\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: heikinLatestCloseLabel })\n\n if (heikinLatestCloseLabel === originalLatestCloseLabel) return\n\n this.renderYAxisLabel({\n context,\n yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\n mainLabelValue: lastClose,\n secondaryLabelValue: originalLatestClose,\n }),\n label: originalLatestCloseLabel,\n background: this.getSecondaryLabelBackgroundColor(),\n })\n }\n\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\n const Colors = this.getCandleLikeChartsRenderingColors()\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\n if (barIndex > -1) {\n let value = null\n if (['high', 'low', 'open', 'close'].includes(key)) {\n const data = this.getRenderChartBarProps({ index: barIndex, chartSettingsColors: Colors })\n value = data[key as OhlcKeys]\n }\n value = value === null ? this.data.getDataByBarIndex(key, crossIndex) : value\n if (value !== null) {\n return shouldReturnRoundedString ? this.roundOhlc(value) : `${value}`\n }\n }\n }\n\n getCrossIndexChange(crossIndex: number) {\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\n const haData = this.data.getHeikinAshiData()\n const crossClose = haData.close[barIndex] ?? null\n const previousClose = haData.close[barIndex - 1] ?? null\n if (crossClose !== null && previousClose !== null) {\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\n }\n\n return null\n }\n\n toString() {\n return `HA Candle stick ${this.data.ticker}`\n }\n}\n\nexport default HeikinAshi\n","import { ChartElementType } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Chart from './base_chart'\n\nclass LineChart extends Chart {\n static type = ChartElementType.LineChart\n static label = 'Line'\n static iconName = 'lineChartType'\n\n renderChart() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n let first: number | undefined, last: number | undefined\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\n yOffset: ChartSettings.top.height + 0.5,\n })\n translate.do()\n this.context.beginPath()\n this.context.set('lineWidth', 1)\n this.context.set('strokeStyle', Colors.line)\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n const y = Math.round(this.fy(this.data.close[i]))\n this.context.lineTo(x, y)\n last = x\n if (first === undefined) {\n first = x\n }\n },\n })\n if (first !== undefined && last !== undefined) {\n this.context.stroke()\n this.context.set('fillStyle', Colors.background)\n this.context.lineTo(last!, this.height)\n this.context.lineTo(first!, this.height)\n this.context.fill()\n }\n\n translate.undo()\n }\n\n toString() {\n return `Line chart ${this.data.ticker}`\n }\n}\n\nexport default LineChart\n","import Text from '../canvas/text'\nimport { ChartElementType, TextAlign, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport { isRedesignEnabled } from '../utils'\nimport Chart, { BaseChartAttrs } from './base_chart'\n\nconst interval = 3\nconst domainMin = -1\nconst domainMax = 1\nconst red = 'rgba(200, 0, 0, 0.392)'\nconst redLine = 'rgb(120, 0, 0)'\nconst green = 'rgba(0, 180, 0, 0.392)'\nconst greenLine = 'rgb(0, 100, 0)'\n\nclass MarketSentiment extends Chart {\n static type = ChartElementType.MarketSentiment\n\n static initClass() {\n Object.defineProperty(this.prototype, 'width', {\n get() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n return this.model.width - MarketSentimentSettings.left.width - MarketSentimentSettings.right.width\n },\n })\n\n Object.defineProperty(this.prototype, 'height', {\n get() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n return this.paneModel.height - MarketSentimentSettings.top.height - MarketSentimentSettings.bottom.height\n },\n })\n }\n\n declare _data: number[]\n declare _dataLastIndex: number | null\n\n constructor(values: Partial, model: Pane) {\n super(values, model)\n this.renderText = this.renderText.bind(this)\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\n this.renderYAxis = this.renderYAxis.bind(this)\n this.setupCache = this.setupCache.bind(this)\n }\n\n setupCache() {\n super.setupCache()\n if (!this.data) {\n return\n }\n const arr: number[] = []\n this.data.close.forEach((sum, i) => {\n arr[i] = sum / this.data.volume[i]\n })\n this._data = arr\n\n let lastIndex = null\n for (let i = this.data.volume.length - 1; i >= 0; i--) {\n if (this.data.volume[i] !== 0) {\n lastIndex = i\n break\n }\n }\n this._dataLastIndex =\n lastIndex === null\n ? null\n : Math.min(lastIndex, Math.round((this.data.drawMinutesPerDay - this.data.marketStartMinutes) / interval))\n }\n\n renderChart() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + MarketSentimentSettings.left.width + 0.5,\n yOffset: MarketSentimentSettings.top.height + 0.5,\n })\n translate.do()\n this.renderLineBullBear(this.context, this._data, 0, 0, 0)\n translate.undo()\n }\n\n renderLineBullBear(\n context: CanvasRenderingContext2D,\n array: number[],\n from: number,\n oversold: number,\n overbought: number\n ) {\n if (this._dataLastIndex === null) {\n return\n }\n const isRedesign = isRedesignEnabled()\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n\n const domain = [domainMax, domainMin]\n\n context.save()\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(domain[1]),\n this.fx(this._dataLastIndex),\n Math.round(this.fy(oversold) - this.fy(domain[1])) - 0.5\n )\n context.clip()\n context.set('fillStyle', red)\n context.set('strokeStyle', isRedesign ? Colors.marketDown : redLine)\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(domain[0])))\n for (let i = from; i < this.data.close.length; i++) {\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\n }\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[0])))\n context.fill()\n context.stroke()\n context.restore()\n\n context.save()\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(domain[0]),\n this.fx(this._dataLastIndex),\n Math.round(this.fy(overbought)) - 0.5\n )\n context.clip()\n context.set('fillStyle', green)\n context.set('strokeStyle', isRedesign ? Colors.marketUp : greenLine)\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(domain[1])))\n for (let i = from; i < this.data.close.length; i++) {\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\n }\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[1])))\n context.fill()\n context.stroke()\n context.restore()\n }\n\n renderXAxis() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n const { Colors } = MarketSentimentSettings.general\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + MarketSentimentSettings.left.width,\n yOffset: MarketSentimentSettings.top.height,\n })\n translate.do()\n\n const xLine = this.getXLine()\n const text = new Text(\n {\n y: this.height + 12,\n font: { size: 7 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.bottom,\n textAlign: TextAlign.center,\n },\n this.paneModel\n )\n let x\n\n x = this.fx(0)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10) + 2 /* remove overflow */\n text.set({ text: '10AM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 20)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 40)\n text.set({ text: '12PM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 60)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 80)\n text.set({ text: '2PM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 100)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 120 - 1)\n text.set({ text: '4PM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n translate.undo()\n }\n\n renderText() {}\n\n renderCrossText() {}\n\n renderOverlaysLabels() {}\n\n _compute() {\n return { min: domainMin, max: domainMax }\n }\n\n computeVisibleMinMax() {\n return this._compute()\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n const { MarketSentimentSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const isRedesign = isRedesignEnabled()\n const translate = getTranslate({\n context: this.context,\n xOffset: MarketSentimentSettings.left.width,\n yOffset: MarketSentimentSettings.top.height,\n })\n translate.do()\n\n const yLine = this.getYLine()\n for (const tick of [domainMin, 0, domainMax]) {\n const y = Math.round(this.fy(tick))\n yLine.set({ y1: y, y2: y }).render(context)\n }\n\n const text = new Text(\n {\n x: this.width + 27,\n font: { size: 8 },\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.right,\n },\n this.paneModel\n )\n\n const fillUp = isRedesign ? Colors.marketUp : greenLine\n const fillDown = isRedesign ? Colors.marketDown : redLine\n const last = this._data[this._dataLastIndex!]\n const percent = this._dataLastIndex !== null ? Math.floor(last * 50 + 50) : 50\n text.set({ y: this.fy(0) - 5, fillStyle: fillUp, text: `${percent}%` }).render(context)\n text.set({ y: this.fy(0) + 7, fillStyle: fillDown, text: `${100 - percent}%` }).render(context)\n\n translate.undo()\n }\n\n clip() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n this.context.beginPath()\n this.context.rect(MarketSentimentSettings.left.width, MarketSentimentSettings.top.height, this.width, this.height)\n this.context.clip()\n }\n\n getMinMax() {\n return this._compute()\n }\n\n renderVolumeAxis() {}\n\n renderVolume() {}\n\n toString() {\n return `Market sentiment chart`\n }\n}\nMarketSentiment.initClass()\n\nexport default MarketSentiment\n","import { ObjectHash } from '../../types/shared'\nimport Text from '../canvas/text'\nimport { ChartElementType, FONT_SIZE, LINE_HEIGHT, PADDING, TextAlign, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport utils from '../utils'\nimport Chart, { BaseChartAttrs } from './base_chart'\n\ninterface MultiLineChartAttrs extends BaseChartAttrs {\n tickers: string[]\n label?: string\n min?: number\n max?: number\n}\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\nclass MultiLineChart extends Chart {\n static type = ChartElementType.MultiLineChart\n tickersDimensions: number[] = []\n\n constructor(values: Partial, model: Pane) {\n super(values, model)\n this.renderText = this.renderText.bind(this)\n }\n\n renderChart() {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\n yOffset: ChartSettings.top.height + 0.5,\n })\n translate.do()\n\n this.context.set('lineWidth', 1)\n\n const quotes: ObjectHash = {}\n for (const quote of this.getQuotes()) {\n quotes[quote.ticker] = quote\n }\n\n for (let index = this.attrs.tickers.length - 1; index >= 0; index--) {\n const ticker = this.attrs.tickers[index]\n const quote = quotes[ticker]\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\n this.context.beginPath()\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const x = this.fx(i)\n if (x + this.leftOffset < -10 || x + this.leftOffset > this.model.width + 10) {\n // margin?\n continue\n }\n const y = Math.round(this.fy(quote.close[i]))\n this.context.lineTo(x, y)\n }\n this.context.stroke()\n }\n\n translate.undo()\n }\n\n renderText(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const text = this.attrs.label || ''\n const y = (this.height - 4) / 2\n new Text(\n {\n text,\n x: 28,\n y: ChartSettings.top.height + y,\n angle: -90,\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.paneModel\n ).render(context)\n return this.renderCrossText(context, this.data.close.length - 1)\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const maxTickerLength = utils.max(this.attrs.tickers.map((t) => t.length))\n\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\n const month = date.getMonth() // 20141126\n const year = date.getFullYear()\n const day = date.getDate()\n const isLastDate = crossIndex === this.data.close.length - 1\n\n new Text(\n {\n text: `${months[month]} ${day} ${year} `,\n x: ChartSettings.left.width + (maxTickerLength > 15 ? 200 : 132),\n y: 30,\n font: { size: 8 },\n fillStyle: Colors.text,\n background: Colors.canvasFill,\n },\n this.paneModel\n ).render(context)\n\n const quotes: ObjectHash = {}\n for (const quote of this.getQuotes()) {\n quotes[quote.ticker] = quote\n }\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const y = PADDING.S + (PADDING.S + LINE_HEIGHT.M) * index\n if (this.tickersDimensions[index]) {\n context.fillStyle = Colors.canvasFill\n context.fillRect(\n ChartSettings.left.width - PADDING.XXXS,\n y - PADDING.XXXS,\n PADDING.XXXS + this.tickersDimensions[index] + PADDING.XXXS,\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\n )\n }\n const ticker = this.attrs.tickers[index]\n const closeValue = quotes[ticker].close[crossIndex]\n const text = new Text(\n {\n text: `${ticker} ${typeof closeValue === 'number' ? closeValue.toFixed(2) : NaN} `,\n x: ChartSettings.left.width,\n y,\n font: { size: FONT_SIZE.M, style: 'bold' },\n lineHeight: LINE_HEIGHT.M,\n fillStyle: ColorsSettings[index % ColorsSettings.length],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n )\n if (isLastDate) {\n this.tickersDimensions[index] = text.measure(context)\n }\n text.render(context)\n }\n }\n\n computeVisibleMinMax(...arrays: Array) {\n let min = Number.MAX_VALUE\n let max = Number.MIN_VALUE\n\n const { leftOffset } = this.model\n for (const arr of arrays) {\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\n // margin?\n continue\n }\n\n if (min > arr[i]) {\n min = arr[i]\n }\n if (max < arr[i]) {\n max = arr[i]\n }\n }\n }\n\n return { min, max }\n }\n\n getMinMax() {\n const quotes = this.getQuotes()\n let { min, max } = this.computeVisibleMinMax(...quotes.map((q) => q.close))\n if (typeof this.attrs.min !== 'undefined') {\n min = this.attrs.min\n }\n if (typeof this.attrs.max !== 'undefined') {\n max = this.attrs.max\n }\n return { min, max }\n }\n\n renderVolumeAxis() {}\n\n renderVolume() {}\n\n getQuotes() {\n return Quote.select(\n (q: Quote) =>\n this.attrs.tickers.includes(q.ticker) &&\n q.timeframe === this.data?.timeframe &&\n this.model.chart_layout().isIdeaId(q.ideaID)\n )\n }\n\n toString() {\n return `Line chart ${this.data.ticker}`\n }\n}\n\nexport default MultiLineChart\n","import { ChartElementType } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Chart from './base_chart'\n\nclass OHLCChart extends Chart {\n static type = ChartElementType.OhlcChart\n static label = 'OHLC'\n static iconName = 'ohlcChartType'\n\n renderChart() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n\n const barWithoutMarginWidth = this.getBarWithoutMarginWidth()\n\n let lineWidth = 1\n if (barWithoutMarginWidth >= 40) {\n lineWidth = 4\n } else if (barWithoutMarginWidth >= 30) {\n lineWidth = 3\n } else if (barWithoutMarginWidth >= 15) {\n lineWidth = 2\n }\n const lineThickness = lineWidth / 2\n const handleLengthFromWick = Math.round(barWithoutMarginWidth / 2 - lineThickness)\n const lineOffset = lineWidth % 2 === 0 ? 0 : 0.5\n this.context.set('lineWidth', lineWidth)\n\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n const barX = ~~(x + 1) + lineOffset // move 1px to right so cursor don't cover bar of ohlc-chart & round for pixel perfect render on zoom\n\n this.context.beginPath()\n this.context.set(\n 'strokeStyle',\n this.data.close[i] < this.data.open[i] ? Colors.ohlcTrendDown : Colors.ohlcTrendUp\n )\n\n this.context.moveTo(barX, Math.round(this.fy(this.data.high[i])))\n this.context.lineTo(barX, Math.round(this.fy(this.data.low[i])))\n\n if (handleLengthFromWick >= 1) {\n const open = Math.round(this.fy(this.data.open[i]))\n this.context.moveTo(barX + lineThickness, open + lineOffset) // move to right edge of wick\n this.context.lineTo(barX - lineThickness - handleLengthFromWick, open + lineOffset) // draw line to the left\n\n const close = Math.round(this.fy(this.data.close[i]))\n this.context.moveTo(barX - lineThickness, close + lineOffset) // move to left edge of wick\n this.context.lineTo(barX + lineThickness + handleLengthFromWick, close + lineOffset) // draw line to the right\n }\n\n this.context.stroke()\n },\n })\n\n translate.undo()\n }\n\n toString() {\n return `OHLC ${this.data.ticker}`\n }\n}\n\nexport default OHLCChart\n","import * as d3 from 'd3'\n\nimport { ObjectHash } from '../../types/shared'\nimport Text from '../canvas/text'\nimport { ChartElementType, FONT_SIZE, MARGIN, OFFSET, PADDING, TextAlign, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport utils from '../utils'\nimport Chart, { BaseChartAttrs } from './base_chart'\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\ninterface PerfChartAttrs extends BaseChartAttrs {\n tickers: string[]\n label?: string\n fromDate: string\n toDate: string\n min?: number\n max?: number\n}\n\nclass PerfChart extends Chart {\n static type = ChartElementType.PerfChart\n\n overlayLabelWidth: ObjectHash\n perf: ObjectHash = {}\n\n constructor(values: Partial, model: Pane) {\n super(values, model)\n this.renderText = this.renderText.bind(this)\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\n this.renderYAxis = this.renderYAxis.bind(this)\n this.overlayLabelWidth = {}\n }\n\n renderChart() {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\n yOffset: ChartSettings.top.height + 0.5,\n })\n translate.do()\n\n this.context.beginPath()\n this.context.set('lineWidth', 1)\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const ticker = this.attrs.tickers[index]\n if ((this.perf[ticker] != null ? this.perf[ticker].length : 0) > 0) {\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\n this.context.beginPath()\n for (let i = 0, end = this.data.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n this.context.lineTo(this.fx(i), Math.round(this.fy(this.perf[ticker][i])))\n }\n this.context.stroke()\n }\n }\n\n translate.undo()\n }\n\n renderText(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const period = (() => {\n switch (this.model.quote().timeframe) {\n case 'd':\n return 'DAILY'\n case 'w':\n return 'WEEKLY'\n case 'm':\n return 'MONTHLY'\n default:\n return\n }\n })()\n const y = (this.height - 4) / 2\n new Text(\n {\n text: period,\n x: 28,\n y: ChartSettings.top.height + y,\n angle: -90,\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.paneModel\n ).render(context)\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\n let dateString = ''\n const month = date.getMonth() // 20141126\n const year = date.getFullYear()\n const day = date.getDate()\n switch (this.data.timeframe) {\n case 'd':\n case 'w':\n dateString = `${months[month]} ${day}`\n break\n case 'm':\n dateString = `${months[month]} ${year}`\n break\n default:\n return\n }\n\n let shouldRenderDate = false\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const ticker = this.attrs.tickers[index]\n const tickerData = this.perf[ticker]\n if (tickerData?.length) {\n context.fillStyle = Colors.canvasFill\n context.fillRect(\n ChartSettings.left.width - PADDING.XXXS,\n OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index - PADDING.XXXS,\n PADDING.XXXS + this.overlayLabelWidth[ticker] + PADDING.XXXS,\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\n )\n const hasData = Number.isFinite(tickerData[crossIndex])\n const percentageText = hasData ? `${tickerData[crossIndex].toFixed(2)}%` : ''\n shouldRenderDate = shouldRenderDate || hasData\n new Text(\n {\n text: `${ticker} ${percentageText}`,\n x: ChartSettings.left.width,\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\n font: { size: FONT_SIZE.M, style: 'bold' },\n fillStyle: ColorsSettings[index % ColorsSettings.length],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n ).render(context)\n }\n }\n\n if (shouldRenderDate) {\n new Text(\n {\n text: `${dateString} `,\n x: ChartSettings.left.width + 132,\n y: 30,\n font: { size: 8 },\n fillStyle: Colors.text,\n background: Colors.canvasFill,\n },\n this.paneModel\n ).render(context)\n }\n }\n\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\n super.renderOverlaysLabels(context)\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const ticker = this.attrs.tickers[index]\n const tickerData = this.perf[ticker]\n if (tickerData?.length) {\n const lastCrossIndex = this.perf[ticker].length - 1\n const hasData = Number.isFinite(tickerData[lastCrossIndex])\n const percentageText = hasData ? `${tickerData[lastCrossIndex].toFixed(2)}%` : ''\n const text = new Text(\n {\n text: `${ticker} ${percentageText}`,\n x: ChartSettings.left.width,\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\n font: { size: FONT_SIZE.M, style: 'bold' },\n fillStyle: ColorsSettings[index % ColorsSettings.length],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n )\n this.overlayLabelWidth = { ...this.overlayLabelWidth, [ticker]: text.measure(context) }\n text.render(context)\n }\n }\n }\n\n _compute() {\n this.perf = {}\n const quotes = this.getQuotes()\n\n const fromDate = new Date(this.attrs.fromDate + ' 00:00')\n const toDate = new Date(this.attrs.toDate + ' 23:59')\n const filteredQuotes = []\n for (const quote of quotes) {\n const closes = []\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const date = utils.dateFromUnixTimestamp(quote.date[i])\n if (fromDate <= date && date <= toDate) {\n closes.push(quote.close[i])\n }\n }\n filteredQuotes.push({ ticker: quote.ticker, close: closes })\n }\n\n const daysCount = d3.max(filteredQuotes, (q) => q.close.length) ?? 0\n for (const quote of filteredQuotes) {\n this.perf[quote.ticker] = []\n const first = quote.close[0]\n let offset = 0\n if (daysCount > quote.close.length) {\n offset = daysCount - quote.close.length\n for (let i = 0, end1 = offset, asc1 = end1 >= 0; asc1 ? i < end1 : i > end1; asc1 ? i++ : i--) {\n this.perf[quote.ticker][i] = NaN\n }\n }\n for (let i = 0, end2 = quote.close.length, asc2 = end2 >= 0; asc2 ? i < end2 : i > end2; asc2 ? i++ : i--) {\n this.perf[quote.ticker][offset + i] = (quote.close[i] * 100) / first - 100\n }\n }\n const { min, max } = this.computeVisibleMinMax(...Object.keys(this.perf).map((x) => this.perf[x]))\n return { min, max }\n }\n\n // TODO refactor into ?utils\n computeVisibleMinMax(...arrays: Array) {\n let min = Number.MAX_VALUE\n let max = Number.MIN_VALUE\n\n const { leftOffset } = this.model\n for (const arr of arrays) {\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\n // margin?\n continue\n }\n\n if (min > arr[i]) {\n min = arr[i]\n }\n if (max < arr[i]) {\n max = arr[i]\n }\n }\n }\n\n return { min, max }\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context,\n xOffset: ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n const ticks = this.paneModel.scale.y.ticks(10)\n const yLine = this.getYLine()\n const text = new Text(\n {\n x: this.width + 8,\n font: { size: 8 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n },\n this.paneModel\n )\n for (const tick of ticks) {\n const y = Math.round(this.fy(tick))\n yLine.set({ y1: y, y2: y }).render(context)\n text.set({ text: tick.toFixed(2), y }).render(context)\n }\n translate.undo()\n }\n\n renderXAxis() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n const text = new Text(\n {\n y: this.height + 18,\n font: { size: 8 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.bottom,\n textAlign: TextAlign.center,\n },\n this.paneModel\n )\n const textWidth = text.set({ text: '2020' }).measure(this.context)\n\n let date = new Date(this.data.date[0] * 1000)\n let lastMonth = date.getMonth() + '-' + date.getFullYear()\n\n let monthsInData = 0\n this.data.date.forEach((d, index) => {\n if (index < 1) {\n return\n }\n\n const date = new Date(d * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n monthsInData++\n }\n lastMonth = month\n })\n\n const availableTickSpots = ~~(this.width / textWidth)\n const monthsToAvail = monthsInData / availableTickSpots\n let renderMonth\n if (monthsToAvail <= 1) {\n renderMonth = () => true\n } else if (monthsToAvail <= 2) {\n renderMonth = (x: number) => x % 2 === 0\n } else if (monthsToAvail <= 3) {\n renderMonth = (x: number) => x % 3 === 0\n } else if (monthsToAvail <= 4) {\n renderMonth = (x: number) => x % 4 === 0\n } else if (monthsToAvail <= 6) {\n renderMonth = (x: number) => x % 6 === 0\n } else {\n renderMonth = (x: number) => x === 0\n }\n\n date = new Date(this.data.date[0] * 1000)\n lastMonth = date.getMonth() + '-' + date.getFullYear()\n\n const xLine = this.getXLine()\n\n for (let i = 0; i < this.data.date.length; i++) {\n date = new Date(this.data.date[i] * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n lastMonth = month\n const x = this.fx(i)\n if (x + this.leftOffset < -15 || x + this.leftOffset > this.width + 15) {\n // margin?\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n if (!renderMonth(date.getMonth())) {\n continue\n }\n\n text\n .set({\n text: date.getMonth() === 0 ? date.getFullYear().toString() : months[date.getMonth()],\n x: x,\n })\n .render(this.context)\n }\n }\n\n translate.undo()\n }\n\n getMinMax() {\n return this._compute()\n }\n\n renderVolumeAxis() {}\n\n renderVolume() {}\n\n getQuotes() {\n return Quote.select(\n (q: Quote) =>\n this.attrs.tickers.includes(q.ticker) &&\n q.timeframe === this.data?.timeframe &&\n this.model.chart_layout().isIdeaId(q.ideaID)\n )\n }\n\n toString() {\n return `Perf chart ${this.data.ticker}`\n }\n}\n\nexport default PerfChart\n","import { ChartElementType } from '../constants/common'\nimport candleStick from './candle_stick'\nimport hollowCandleStick from './candle_stick_hollow'\nimport heikinAshi from './heikin_ashi'\nimport lineChart from './line_chart'\nimport marketSentiment from './market_sentiment'\nimport multiLineCharts from './multi_line_chart'\nimport ohlcChart from './ohlc_chart'\nimport perfChart from './perf_chart'\n\nexport const chartsByType = Object.freeze({\n [ChartElementType.CandleStick]: candleStick,\n [ChartElementType.HeikinAshi]: heikinAshi,\n [ChartElementType.HollowCandleStick]: hollowCandleStick,\n [ChartElementType.LineChart]: lineChart,\n [ChartElementType.MarketSentiment]: marketSentiment,\n [ChartElementType.MultiLineChart]: multiLineCharts,\n [ChartElementType.OhlcChart]: ohlcChart,\n [ChartElementType.PerfChart]: perfChart,\n})\n","export const FONT_SIZE = {\n XXS: 5,\n XS: 7,\n S: 8,\n M: 10,\n L: 11,\n XXL: 18,\n XXXL: 23,\n}\nexport const LINE_HEIGHT = {\n XS: 7,\n S: 8,\n M: 10,\n}\nexport const PADDING = {\n XXXS: 1,\n XXS: 2,\n XS: 3,\n S: 5,\n}\nexport const MARGIN = {\n XS: 4,\n}\nexport const CHART_MARGIN = {\n S: 15,\n M: 30,\n L: 35,\n XL: 38,\n XXL: 48,\n}\nexport const SETTINGS_HEIGHT = 44\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\nexport const OFFSET = {\n XXS: 2,\n XS: 4,\n S: 6,\n M: 8,\n XXL: 20,\n}\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\nexport enum ChartEditorEnum {\n publish = 'publish',\n tools = 'tools',\n ideas = 'ideas',\n settings = 'settings',\n timeframe = 'timeframe',\n}\n\nexport enum LayoutType {\n '1h1v' = '1h1v',\n '1h2v' = '1h2v',\n '1h3v' = '1h3v',\n '2h1v' = '2h1v',\n '2h2v' = '2h2v',\n '3h1v' = '3h1v',\n '3h2v' = '3h2v',\n '1l2r' = '1l2r',\n '1t2b' = '1t2b',\n}\n\nexport enum CanvasElementType {\n element = 'canvas/element',\n arrow = 'canvas/arrow',\n brushV1 = 'canvas/brush/brush_v1',\n curve = 'canvas/curve',\n ellipse = 'canvas/ellipse',\n fibonacciRetracements = 'canvas/fibonacci_retracements',\n horizontalLine = 'canvas/horizontal_line',\n line = 'canvas/line',\n measure = 'canvas/measure',\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\n polygon = 'canvas/polygon',\n position = 'canvas/position',\n rectangle = 'canvas/rectangle',\n rotatedRectangle = 'canvas/rotated_rectangle',\n scaledLine = 'canvas/scaled_line',\n scaledText = 'canvas/scaled_text',\n symbol = 'canvas/symbol',\n text = 'canvas/text',\n triangle = 'canvas/triangle',\n verticalLine = 'canvas/vertical_line',\n xabcd = 'canvas/xabcd',\n calloutV1 = 'canvas/callout/callout_v1',\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\n}\n\nexport enum ChartElementType {\n CandleStick = 'charts/candle_stick',\n HeikinAshi = 'charts/heikin_ashi',\n HollowCandleStick = 'charts/candle_stick_hollow',\n LineChart = 'charts/line_chart',\n OhlcChart = 'charts/ohlc_chart',\n MarketSentiment = 'charts/market_sentiment',\n MultiLineChart = 'charts/multi_line_chart',\n PerfChart = 'charts/perf_chart',\n}\n\nexport enum IndicatorType {\n Indicator = 'indicators/indicator',\n None = 'indicators/none',\n Adx = 'indicators/adx',\n Aro = 'indicators/aro',\n Aroosc = 'indicators/aroosc',\n Atr = 'indicators/atr',\n Cci = 'indicators/cci',\n Cot = 'indicators/cot',\n Fi = 'indicators/fi',\n Macd = 'indicators/macd',\n Mfi = 'indicators/mfi',\n Obv = 'indicators/obv',\n Perf = 'indicators/perf',\n Rmi = 'indicators/rmi',\n Roc = 'indicators/roc',\n Rsi = 'indicators/rsi',\n Rvol = 'indicators/rvol',\n Rwi = 'indicators/rwi',\n Stofa = 'indicators/stofa',\n Stofu = 'indicators/stofu',\n Stosl = 'indicators/stosl',\n Trix = 'indicators/trix',\n Ult = 'indicators/ult',\n Vol = 'indicators/vol',\n Wr = 'indicators/wr',\n}\n\nexport enum OverlayType {\n Overlay = 'overlays/overlay',\n None = 'overlays/none',\n Bb = 'overlays/bb',\n Dch = 'overlays/dch',\n Ema = 'overlays/ema',\n Ema2 = 'overlays/ema2',\n Hilo = 'overlays/hilo',\n Hline = 'overlays/hline',\n Ic = 'overlays/ic',\n Icf = 'overlays/icf',\n Kch = 'overlays/kch',\n Patterns = 'overlays/patterns',\n Sar = 'overlays/sar',\n Sma = 'overlays/sma',\n Sma2 = 'overlays/sma2',\n Str = 'overlays/str',\n Vp = 'overlays/vp',\n Vwap = 'overlays/vwap',\n}\n\nexport enum ChartEventDbType {\n Dividends = 'chartEvent/dividends',\n Split = 'chartEvent/split',\n Earnings = 'chartEvent/earnings',\n}\n\nexport enum ChartEventType {\n ChartEvent = 'chartEvent/chartEvent',\n Dividends = 'chartEvent/dividends',\n Split = 'chartEvent/split',\n Earnings = 'chartEvent/earnings',\n}\n\nexport enum ChartEventBadgeType {\n Dividends = 'chartEvent/dividends',\n Split = 'chartEvent/split',\n EarningsPositive = 'chartEvent/earnings',\n EarningsNegative = 'chartEvent/earningsNegative',\n EarningsNeutral = 'chartEvent/earningsNeutral',\n EarningsFuture = 'chartEvent/earningsFuture',\n}\n\nexport const ChartEventLabels: Record = {\n [ChartEventBadgeType.Dividends]: 'Dividends',\n [ChartEventBadgeType.Split]: 'Split',\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\n}\n\ninterface LayoutRule {\n columns: number\n rows: number\n count: number\n gridAreas?: string[]\n}\n\nexport const LAYOUTS: Record = {\n '1h1v': { columns: 1, rows: 1, count: 1 },\n '1h2v': { columns: 1, rows: 2, count: 2 },\n '1h3v': { columns: 1, rows: 3, count: 3 },\n '2h1v': { columns: 2, rows: 1, count: 2 },\n '2h2v': { columns: 2, rows: 2, count: 4 },\n '3h1v': { columns: 3, rows: 1, count: 3 },\n '3h2v': { columns: 3, rows: 2, count: 6 },\n '1l2r': {\n columns: 2,\n rows: 2,\n count: 3,\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\n },\n '1t2b': {\n columns: 2,\n rows: 2,\n count: 3,\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\n },\n}\n\nexport const SORT_DIRECTION = {\n ASC: 'ASC',\n DESC: 'DESC',\n}\n\nexport const ICON_SIZE = {\n L: 32,\n}\n\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\nexport enum TIMEFRAME {\n i1 = 'i1',\n i2 = 'i2',\n i3 = 'i3',\n i5 = 'i5',\n i10 = 'i10',\n i15 = 'i15',\n i30 = 'i30',\n h = 'h',\n h2 = 'h2',\n h4 = 'h4',\n d = 'd',\n w = 'w',\n m = 'm',\n}\n\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\n\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\n\nexport const IntradayTimeframeInterval = {\n [TIMEFRAME.i1]: 1,\n [TIMEFRAME.i2]: 2,\n [TIMEFRAME.i3]: 3,\n [TIMEFRAME.i5]: 5,\n [TIMEFRAME.i10]: 10,\n [TIMEFRAME.i15]: 15,\n [TIMEFRAME.i30]: 30,\n [TIMEFRAME.h]: 60,\n [TIMEFRAME.h2]: 120,\n [TIMEFRAME.h4]: 240,\n}\n\nexport enum DateRangeType {\n d1 = 'd1',\n d5 = 'd5',\n m1 = 'm1',\n m3 = 'm3',\n m6 = 'm6',\n ytd = 'ytd',\n y1 = 'y1',\n y2 = 'y2',\n y5 = 'y5',\n max = 'max',\n}\n\nexport const TIMEFRAME_SECONDS = {\n [TIMEFRAME.i1]: 60,\n [TIMEFRAME.i2]: 120,\n [TIMEFRAME.i3]: 180,\n [TIMEFRAME.i5]: 300,\n [TIMEFRAME.i10]: 600,\n [TIMEFRAME.i15]: 900,\n [TIMEFRAME.i30]: 1800,\n [TIMEFRAME.h]: 3600,\n [TIMEFRAME.h2]: 7200,\n [TIMEFRAME.h4]: 14400,\n [TIMEFRAME.d]: 86400,\n [TIMEFRAME.w]: 604800,\n [TIMEFRAME.m]: 2592000,\n}\n\nexport const CRYPTOS = {\n BTCUSD: 'BTCUSD',\n LTCUSD: 'LTCUSD',\n ETHUSD: 'ETHUSD',\n XRPUSD: 'XRPUSD',\n BCHUSD: 'BCHUSD',\n BTCEUR: 'BTCEUR',\n LTCEUR: 'LTCEUR',\n ETHEUR: 'ETHEUR',\n XRPEUR: 'XRPEUR',\n BCHEUR: 'BCHEUR',\n LTCBTC: 'LTCBTC',\n ETHBTC: 'ETHBTC',\n XRPBTC: 'XRPBTC',\n BCHBTC: 'BCHBTC',\n}\n\nexport enum SpecificChartFunctionality {\n default = 'default',\n quotePage = 'quotePage',\n quotePerf = 'quotePerf',\n chartPage = 'chartPage',\n smallIndex = 'smallIndex',\n offScreen = 'offScreen',\n forexPage = 'forexPage',\n futuresPage = 'futuresPage',\n cryptoPage = 'cryptoPage',\n}\n\nexport enum TextAlign {\n left = 'left',\n right = 'right',\n center = 'center',\n start = 'start',\n end = 'end',\n}\n\nexport enum TextBaseline {\n top = 'top',\n hanging_dont_use = 'hanging', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\n middle = 'middle',\n alphabetic = 'alphabetic',\n ideographic_dont_use = 'ideographic', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\n bottom = 'bottom',\n}\n\nexport enum ScaleType {\n Linear = 'linear',\n Percentage = 'percentage',\n Logarithmic = 'logarithmic',\n}\n\nexport enum QuotePollingIntervalInMs {\n Default = 3000,\n Free = 180000,\n Elite = 3000,\n EliteStocksReduced = 60000,\n}\n\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\n\nexport const ScaleLabel = {\n [ScaleType.Linear]: 'Linear',\n [ScaleType.Percentage]: 'Percentage',\n [ScaleType.Logarithmic]: 'Logarithmic',\n}\n\nexport const PANE_HEIGHT_DEFAULT = {\n chart: 400,\n indicator: 120,\n}\n\nexport const INDICATOR_LABEL_HEIGHT = 24\n\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\n\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\n\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\n\nexport const getTimeframeLabel = (timeframe: string) => {\n switch (timeframe) {\n case TIMEFRAME.i1:\n return '1 MIN'\n case TIMEFRAME.i2:\n return '2 MIN'\n case TIMEFRAME.i3:\n return '3 MIN'\n case TIMEFRAME.i5:\n return '5 MIN'\n case TIMEFRAME.i10:\n return '10 MIN'\n case TIMEFRAME.i15:\n return '15 MIN'\n case TIMEFRAME.i30:\n return '30 MIN'\n case TIMEFRAME.h:\n return '1 HR'\n case TIMEFRAME.h2:\n return '2 HR'\n case TIMEFRAME.h4:\n return '4 HR'\n case TIMEFRAME.d:\n return 'DAILY'\n case TIMEFRAME.w:\n return 'WEEKLY'\n case TIMEFRAME.m:\n return 'MONTHLY'\n default:\n return ''\n }\n}\n\nexport type ChartsPageQueryParams = {\n p: string\n t: string\n l: string\n r?: string\n i?: string\n sidebar?: string\n}\n\nexport type QuotePageQueryParams = {\n p?: string\n t: string\n r?: string\n i?: string\n ty?: QuotePageQueryChartTypes\n}\n\nexport enum QuotePageQueryChartTypes {\n l = 'l',\n c = 'c',\n cs = 'cs',\n hc = 'hc',\n ha = 'ha',\n o = 'o',\n p = 'p',\n}\n\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\n\nexport enum MacroTimeframe {\n // seconds = 'seconds',\n minutes = 'minutes',\n hours = 'hours',\n days = 'days',\n weeks = 'weeks',\n months = 'months',\n}\n\nexport const MicroMacroTimeframe = {\n [TIMEFRAME.i1]: {\n micro: 1,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i2]: {\n micro: 2,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i3]: {\n micro: 3,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i5]: {\n micro: 5,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i10]: {\n micro: 10,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i15]: {\n micro: 15,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i30]: {\n micro: 30,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.h]: {\n micro: 1,\n macro: MacroTimeframe.hours,\n },\n [TIMEFRAME.h2]: {\n micro: 2,\n macro: MacroTimeframe.hours,\n },\n [TIMEFRAME.h4]: {\n micro: 4,\n macro: MacroTimeframe.hours,\n },\n [TIMEFRAME.d]: {\n micro: 1,\n macro: MacroTimeframe.days,\n },\n [TIMEFRAME.w]: {\n micro: 1,\n macro: MacroTimeframe.weeks,\n },\n [TIMEFRAME.m]: {\n micro: 1,\n macro: MacroTimeframe.months,\n },\n}\n\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\n (prev, curr) => ({\n ...prev,\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\n : [MicroMacroTimeframe[curr].micro],\n }),\n {} as { [key in MacroTimeframe]: number[] }\n)\n\ntype IRange = {\n from?: number\n to?: number\n}\n\nexport type IVisibility = {\n [key in MacroTimeframe]?: IRange\n}\n\nexport enum SetVisibilityTo {\n currentAndAbove,\n currentAndBelow,\n currentOnly,\n all,\n}\n\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\n","import React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { Instrument } from '../../../types/shared'\nimport {\n Notification,\n Paragraph,\n generatePathForTimeframeDateRange,\n getDateRangeGroupsWithHref,\n timeframeUtm,\n useNotification,\n} from '../../components'\nimport { SpecificChartFunctionality, TIMEFRAME, TimeframeAndIntradayType } from '../../constants/common'\nimport Chart from '../../models/chart'\nimport Quote from '../../models/quote'\nimport { dateFromUnixTimestamp } from '../../utils'\nimport { getChartStartEndDates, getVisibleBarsNumber } from '../renderUtils'\nimport { useChartsPathLocation } from './use-charts-path-location'\nimport { getTimeframeGroupsWithHref } from './utils'\n\ninterface IPathForTimeframeDateRangeProps {\n timeframe: TimeframeAndIntradayType\n dateRange?: string | null\n ticker?: string\n}\n\nexport interface IDateRange {\n value: string\n timeframe: TIMEFRAME\n}\n\nexport function useChartModelCustomDateRangeValues({\n chartModel,\n isPremium,\n}: {\n chartModel: Chart | null\n isPremium: boolean\n}) {\n const notificationContext = useNotification()\n const location = useLocation()\n const [isFetching, setIsFetching] = React.useState(false)\n const chartLayoutModel = chartModel?.chart_layout() || null\n const chartIndex = chartLayoutModel?.getAllCharts().findIndex((chart) => chartModel!.eql(chart)) ?? -1\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel, chartIndex })\n const specificChartFunctionality = chartLayoutModel?.specificChartFunctionality ?? SpecificChartFunctionality.default\n\n const anchorDate = React.useMemo(() => {\n if (!chartModel) return new Date()\n const quote = chartModel.quote()\n return dateFromUnixTimestamp(quote.date[quote.date.length - 1])\n }, [chartModel])\n\n const generateChartLayoutRouterPath = React.useCallback(\n ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\n if (specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n return getChartsToPath({\n ticker: ticker,\n timeframe: timeframe as TIMEFRAME,\n dateRange: dateRange,\n })\n }\n\n return generatePathForTimeframeDateRange({\n isPremium,\n pathname: location.pathname,\n timeframe: timeframe,\n dateRange: dateRange,\n utmCampaign: timeframeUtm[specificChartFunctionality],\n })\n },\n [getChartsToPath, isPremium, specificChartFunctionality, location.pathname]\n )\n\n const timeframeGroupsWithHref = (isPremium: boolean) =>\n getTimeframeGroupsWithHref({\n isPremium,\n generatePath: (timeFrame) => generateChartLayoutRouterPath({ timeframe: timeFrame.value, dateRange: null }),\n })\n\n const dateRangeGroupsWithHref = ({\n isPremium,\n customRange,\n instrument,\n }: {\n isPremium: boolean\n customRange?: string\n instrument: Instrument\n }) =>\n getDateRangeGroupsWithHref({\n isPremium,\n customRange,\n instrument,\n generatePath: (dateRange: { timeframe?: TIMEFRAME; value: string }) =>\n generateChartLayoutRouterPath({ timeframe: dateRange.timeframe!, dateRange: dateRange.value }),\n })\n\n const handleCustomDateRangeValidation = async (dateRangeState: { value: string | null; timeframe: TIMEFRAME }) => {\n if (dateRangeState.value !== null) {\n const { timeframe, ticker, instrument, premarket, aftermarket } = chartModel?.quote() || {}\n const patterns = chartModel?.getHasPatterns() || false\n if (!anchorDate || !instrument || !ticker || !timeframe || !dateRangeState.value) return false\n setIsFetching(true)\n const quote = await Quote.get({\n ticker,\n instrument,\n timeframe: dateRangeState.timeframe,\n options: {\n premarket,\n aftermarket,\n patterns,\n cachePredicate: (quote) => quote.ideaID === undefined,\n fetchNewDataOnCachedQuote: true,\n },\n })\n setIsFetching(false)\n\n const { numOfVisibleBars } = getVisibleBarsNumber({\n ...getChartStartEndDates({ dateRange: dateRangeState.value, quote }),\n quote,\n dateRange: dateRangeState.value,\n })\n if (numOfVisibleBars === 0) {\n notificationContext.show(\n \n \n There are no data for the selected date range. Try selecting different dates.\n \n \n )\n\n return false\n }\n }\n return true\n }\n\n return {\n anchorDate,\n generateChartLayoutRouterPath,\n timeframeGroupsWithHref,\n dateRangeGroupsWithHref,\n isFetching,\n handleCustomDateRangeValidation,\n }\n}\n","import * as React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { ChartsPageQueryParams, LAYOUTS, LayoutType, TIMEFRAME } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { ChartSyncablePart } from '../../models/chart/contstants'\nimport ChartLayout from '../../models/chart_layout'\nimport { getIsMobilePortrait } from '../../utils'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\n\nexport function useChartsPathLocation({\n chartLayoutModel: unwatchedChartLayoutModel,\n chartIndex = -1,\n}: {\n chartLayoutModel: ChartLayout | null\n chartIndex?: number\n}) {\n const location = useLocation()\n const chartLayoutModel = useModelState(unwatchedChartLayoutModel, {\n watchProperties: ['syncChartParts'],\n })\n const hasSyncedTimeframe = React.useMemo(\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Timeframe),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [chartLayoutModel?.syncChartParts]\n )\n const hasSyncedTicker = React.useMemo(\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Ticker),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [chartLayoutModel?.syncChartParts]\n )\n\n const getChartsToPath = React.useCallback(\n ({\n ticker,\n timeframe,\n dateRange,\n layout,\n }: {\n timeframe?: TIMEFRAME\n dateRange?: string | null\n ticker?: string\n layout?: LayoutType\n }) => {\n if (!chartLayoutModel) {\n return {\n pathname: location.pathname,\n search: '',\n }\n }\n\n const decodedSearch = decodeQueryString(location.search)\n const { count } = LAYOUTS[(layout ?? chartLayoutModel.layout) as LayoutType]\n const urlTickers = decodedSearch.t?.split(',') ?? []\n const urlTimeframes = decodedSearch.p?.split(',') ?? []\n const urlDateRanges = decodedSearch.r?.split(',')\n\n const chartsArrayPlaceholder = Array.from({ length: count })\n const tickers = chartsArrayPlaceholder\n .map((_, index) => {\n const currentTicker = urlTickers[index] ?? urlTickers[urlTickers.length - 1]\n return (chartIndex === index || hasSyncedTicker) && ticker ? ticker : currentTicker\n })\n .join(',')\n const timeframes = chartsArrayPlaceholder\n .map((_, index) => {\n const currentTimeframe = urlTimeframes[index] ?? urlTimeframes[urlTimeframes.length - 1]\n return (chartIndex === index || hasSyncedTimeframe) && timeframe ? timeframe : currentTimeframe\n })\n .join(',')\n const ranges = chartsArrayPlaceholder\n .map((_, index) => {\n const currentDaterange = urlDateRanges\n ? urlDateRanges[index] ?? urlDateRanges[urlDateRanges.length - 1]\n : undefined\n return (chartIndex === index || hasSyncedTimeframe) && dateRange !== undefined ? dateRange : currentDaterange\n })\n .join(',')\n\n return {\n pathname: location.pathname,\n search: `?${encodeQueryString({\n t: tickers,\n p: timeframes,\n r: ranges.split(',').some(Boolean) ? ranges : undefined,\n l: layout ?? chartLayoutModel.layout,\n sidebar: getIsMobilePortrait() ? undefined : decodedSearch.sidebar,\n })}`,\n }\n },\n [chartLayoutModel, chartIndex, location, hasSyncedTicker, hasSyncedTimeframe]\n )\n\n return { getChartsToPath }\n}\n","import { type To } from 'react-router-dom'\n\nimport { getTimeframeGroups } from '../../components'\nimport { TimeframeAndIntradayType } from '../../constants/common'\n\ninterface ITimeFrame {\n value: TimeframeAndIntradayType\n label: string\n labelShort: string\n labelPageTitle?: string\n}\n\ninterface ITimeframeGroup {\n label: string\n timeframes: ITimeFrame[]\n}\n\nexport function getTimeframeGroupsWithHref({\n isPremium,\n generatePath,\n}: {\n isPremium: boolean\n generatePath: (timeframe: ITimeFrame) => To\n}) {\n return getTimeframeGroups(isPremium).map((timeFrameGroup: ITimeframeGroup) => ({\n label: timeFrameGroup.label,\n timeframes: timeFrameGroup.timeframes.map((timeFrame) => ({\n ...timeFrame,\n href: generatePath(timeFrame),\n })),\n }))\n}\n\nexport enum QuoteNodeChartTypes {\n candlesticksimple = 'candlesticksimple',\n candlestick = 'candlestick',\n line = 'line',\n ohlc = 'ohlc',\n heikinashi = 'heikinashi',\n hollowcandlestick = 'hollowcandlestick',\n}\n\nexport enum QuoteUrlChartTypes {\n cs = 'cs',\n c = 'c',\n l = 'l',\n o = 'o',\n ha = 'ha',\n hc = 'hc',\n}\n\nexport const QuoteShortToLongType = {\n [QuoteUrlChartTypes.cs]: QuoteNodeChartTypes.candlesticksimple,\n [QuoteUrlChartTypes.c]: QuoteNodeChartTypes.candlestick,\n [QuoteUrlChartTypes.l]: QuoteNodeChartTypes.line,\n [QuoteUrlChartTypes.o]: QuoteNodeChartTypes.ohlc,\n [QuoteUrlChartTypes.ha]: QuoteNodeChartTypes.heikinashi,\n [QuoteUrlChartTypes.hc]: QuoteNodeChartTypes.hollowcandlestick,\n} as const\n\nexport const QuoteLongToShortType = {\n [QuoteNodeChartTypes.candlesticksimple]: QuoteUrlChartTypes.cs,\n [QuoteNodeChartTypes.candlestick]: QuoteUrlChartTypes.c,\n [QuoteNodeChartTypes.line]: QuoteUrlChartTypes.l,\n [QuoteNodeChartTypes.ohlc]: QuoteUrlChartTypes.o,\n [QuoteNodeChartTypes.heikinashi]: QuoteUrlChartTypes.ha,\n [QuoteNodeChartTypes.hollowcandlestick]: QuoteUrlChartTypes.hc,\n} as const\n\nexport const DEFAULT_TYPES = [\n { iconName: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle' },\n { iconName: 'lineChartType', value: QuoteNodeChartTypes.line, label: 'Line' },\n { iconName: 'ohlcChartType', value: QuoteNodeChartTypes.ohlc, label: 'OHLC' },\n { iconName: 'candleBarHollow', value: QuoteNodeChartTypes.hollowcandlestick, label: 'Hollow Candle' },\n { iconName: 'candleBarHeikinAshi', value: QuoteNodeChartTypes.heikinashi, label: 'Heikin Ashi' },\n]\n\nexport const FREE_TYPES_QUOTE = [\n { iconName: 'candleBarBasic', value: 'candlesticksimple', label: 'Candle - simple' },\n { iconName: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle - advanced' },\n // Filter out the candle from DEFAULT_TYPES, we’re naming it differently\n ...DEFAULT_TYPES.filter((type) => type.value !== QuoteNodeChartTypes.candlestick),\n]\n\nexport const FREE_TYPES_QUOTE_VALUES = ['candlesticksimple', 'candlestick', 'line']\n\nexport type TypeBaseOption = {\n label: string\n value: QuoteNodeChartTypes\n iconName: string\n href?: string\n}\n","import { ObjectHash, Theme } from '../../../../types/shared'\nimport { ChartEventBadgeType } from '../../../constants/common'\nimport { ChartEventBadgeState, IChartEventBadgeProps } from '../utils'\nimport { chartBadgeSvgByType } from './chart-badges-svg-by-type'\n\nconst badgeImages = {} as ObjectHash\nexport const CHART_EVENT_BADGE_SIZE = 24\n\ntype ChartEventBadgeCommonType = Omit & { badgeType: ChartEventBadgeType }\n\nfunction getSvgImageCacheKey(props: Pick) {\n return `${props.badgeType}-${props.theme}-${props.state}`\n}\n\nasync function cacheEventBadgeSvg(props: ChartEventBadgeCommonType) {\n const cacheKey = getSvgImageCacheKey(props)\n const svgHTML = chartBadgeSvgByType[props.badgeType]({ ...props, width: CHART_EVENT_BADGE_SIZE })\n const img = new Image()\n img.src = `data:image/svg+xml,${encodeURIComponent(svgHTML)}`\n badgeImages[cacheKey] = img\n}\n\nfunction prefetchEventBadgeSvgs() {\n Object.values(ChartEventBadgeState).forEach((badgeState) => {\n Object.values(ChartEventBadgeType).forEach((badgeType) => {\n Object.values(Theme).forEach((theme) => {\n void cacheEventBadgeSvg({\n badgeType,\n state: badgeState,\n theme,\n })\n })\n })\n })\n}\n\nif (typeof window !== 'undefined') {\n prefetchEventBadgeSvgs()\n}\n\nexport function getChartEventBadgeImage(props: ChartEventBadgeCommonType) {\n const cacheKey = getSvgImageCacheKey(props)\n return badgeImages[cacheKey]\n}\n","import { Theme } from '../../../../types/shared'\nimport {\n ChartEventBadgeState,\n IChartEventBadgeProps,\n getChartEventBadgeColors,\n getChartEventBageColors,\n} from '../utils'\n\nexport function getChartEventEarningSvgString({\n theme = Theme.light,\n state = ChartEventBadgeState.default,\n width,\n isFuture = false,\n}: IChartEventBadgeProps & { isFuture: boolean }) {\n const { outerStroke, innerStroke, innerFill, textFill } = getChartEventBadgeColors({\n theme,\n state,\n colors: getChartEventBageColors(isFuture ? 'purple' : 'gray'),\n })\n\n // browsers have issue rendering non-straight paths when one have same edge as other,\n // outer stroke line edge is same as inner fill edge and when browser rasterize diagonal line it breaks it down to pixels with variable opacity/color\n // but if there aren't opacity pixels on same place render is correct, due that adding fill solve incorrect color of colliding opacity pixels\n return `\n \n \n \n \n \n \n `\n}\n","import { ChartEventBadgeType } from '../../../constants/common'\nimport { getChartEventDividendsSvgString } from './dividends'\nimport { getChartEventEarningsFutureSvgString } from './earnings-future'\nimport { getChartEventEarningsNegativeSvgString } from './earnings-negative'\nimport { getChartEventEarningsNeutralSvgString } from './earnings-neutral'\nimport { getChartEventEarningsPositiveSvgString } from './earnings-positive'\nimport { getChartEventSplitSvgString } from './split'\n\nexport const chartBadgeSvgByType = Object.freeze({\n [ChartEventBadgeType.Split]: getChartEventSplitSvgString,\n [ChartEventBadgeType.Dividends]: getChartEventDividendsSvgString,\n [ChartEventBadgeType.EarningsPositive]: getChartEventEarningsPositiveSvgString,\n [ChartEventBadgeType.EarningsNegative]: getChartEventEarningsNegativeSvgString,\n [ChartEventBadgeType.EarningsNeutral]: getChartEventEarningsNeutralSvgString,\n [ChartEventBadgeType.EarningsFuture]: getChartEventEarningsFutureSvgString,\n})\n","import { Theme } from '../../../../types/shared'\nimport {\n ChartEventBadgeState,\n IChartEventBadgeProps,\n getChartEventBadgeColors,\n getChartEventBageColors,\n} from '../utils'\n\nexport function getChartEventSplitSvgString({\n theme = Theme.light,\n state = ChartEventBadgeState.default,\n width,\n}: IChartEventBadgeProps) {\n const { outerStroke, innerStroke, innerFill, textFill } = getChartEventBadgeColors({\n theme,\n state,\n colors: getChartEventBageColors('violet'),\n })\n\n // browsers have issue rendering non-straight paths when one have same edge as other,\n // outer stroke line edge is same as inner fill edge and when browser rasterize diagonal line it breaks it down to pixels with variable opacity/color\n // but if there aren't opacity pixels on same place render is correct, due that adding fill solve incorrect color of colliding opacity pixels\n return `\n \n \n \n \n\n \n \n `\n}\n","import { Theme } from '../../../../types/shared'\nimport {\n ChartEventBadgeState,\n IChartEventBadgeProps,\n getChartEventBadgeColors,\n getChartEventBageColors,\n} from '../utils'\n\nexport function getChartEventDividendsSvgString({\n theme = Theme.light,\n state = ChartEventBadgeState.default,\n width,\n}: IChartEventBadgeProps) {\n const { outerStroke, innerStroke, innerFill, textFill } = getChartEventBadgeColors({\n theme,\n state,\n colors: getChartEventBageColors('blue'),\n })\n\n // browsers have issue rendering non-straight paths when one have same edge as other,\n // outer stroke line edge is same as inner fill edge and when browser rasterize diagonal line it breaks it down to pixels with variable opacity/color\n // but if there aren't opacity pixels on same place render is correct, due that adding fill solve incorrect color of colliding opacity pixels\n return `\n \n \n \n \n\n \n \n `\n}\n","import { Theme } from '../../../../types/shared'\nimport {\n ChartEventBadgeState,\n IChartEventBadgeProps,\n getChartEventBadgeColors,\n getChartEventBageColors,\n} from '../utils'\n\nexport function getChartEventEarningsPositiveSvgString({\n theme = Theme.light,\n state = ChartEventBadgeState.default,\n width,\n}: IChartEventBadgeProps) {\n const { outerStroke, innerStroke, innerFill, textFill } = getChartEventBadgeColors({\n theme,\n state,\n colors: getChartEventBageColors('green'),\n })\n\n // browsers have issue rendering non-straight paths when one have same edge as other,\n // outer stroke line edge is same as inner fill edge and when browser rasterize diagonal line it breaks it down to pixels with variable opacity/color\n // but if there aren't opacity pixels on same place render is correct, due that adding fill solve incorrect color of colliding opacity pixels\n return `\n \n \n \n \n \n `\n}\n","import { Theme } from '../../../../types/shared'\nimport {\n ChartEventBadgeState,\n IChartEventBadgeProps,\n getChartEventBadgeColors,\n getChartEventBageColors,\n} from '../utils'\n\nexport function getChartEventEarningsNegativeSvgString({\n theme = Theme.light,\n state = ChartEventBadgeState.default,\n width,\n}: IChartEventBadgeProps) {\n const { outerStroke, innerStroke, innerFill, textFill } = getChartEventBadgeColors({\n theme,\n state,\n colors: getChartEventBageColors('red'),\n })\n\n // browsers have issue rendering non-straight paths when one have same edge as other,\n // outer stroke line edge is same as inner fill edge and when browser rasterize diagonal line it breaks it down to pixels with variable opacity/color\n // but if there aren't opacity pixels on same place render is correct, due that adding fill solve incorrect color of colliding opacity pixels\n return `\n \n \n \n \n \n `\n}\n","import { IChartEventBadgeProps } from '../utils'\nimport { getChartEventEarningSvgString } from './earnings'\n\nexport function getChartEventEarningsNeutralSvgString(args: IChartEventBadgeProps) {\n return getChartEventEarningSvgString({ ...args, isFuture: false })\n}\n","import { IChartEventBadgeProps } from '../utils'\nimport { getChartEventEarningSvgString } from './earnings'\n\nexport function getChartEventEarningsFutureSvgString(args: IChartEventBadgeProps) {\n return getChartEventEarningSvgString({ ...args, isFuture: true })\n}\n","import { Theme } from '../../../types/shared'\nimport twColors from '../../constants/colors'\nimport { ChartEventType } from '../../constants/common'\nimport math, { BIG_NUMBER_VALUES, BigNumber } from '../../helpers/math'\nimport utils from '../../utils'\nimport { formatDateToStringUS } from '../../utils/helpers'\n\ninterface IChartEventBase {\n elementId: string\n eventType: ChartEventType\n dateTimestamp: number // represent 'earningsDate' column of earnings and 'exdate' column for dividends & split\n}\n\nexport interface IEarnings extends IChartEventBase {\n epsActual?: number\n epsEstimate?: number\n epsReportedActual?: number\n epsReportedEstimate?: number\n fiscalEndDate: number\n fiscalPeriod: string\n salesActual?: number\n salesEstimate?: number\n}\n\nexport interface IDividends extends IChartEventBase {\n ordinary: number\n special: number\n}\n\nexport interface ISplit extends IChartEventBase {\n factorFrom: number\n factorTo: number\n}\n\nexport enum ChartEventBadgeState {\n default = 'default',\n hover = 'hover',\n selected = 'selected',\n}\n\nexport interface IChartEventBadgeProps {\n theme: Theme\n state: ChartEventBadgeState\n width: number\n}\n\ninterface IGetChartEventBadgeColors {\n theme: Theme\n state: ChartEventBadgeState\n colors: IBadgeColors\n}\n\ninterface IBadgeStateColors {\n default: string\n hover: string\n selected: string\n}\n\ninterface IBadgeThemeColors {\n outerStroke: string\n innerStroke: string\n innerFill: IBadgeStateColors\n textFill: IBadgeStateColors\n}\n\ninterface IBadgeColors {\n light: IBadgeThemeColors\n dark: IBadgeThemeColors\n}\n\nexport function getChartEventBadgeColors({ theme, state, colors }: IGetChartEventBadgeColors) {\n return {\n outerStroke: colors[theme].outerStroke,\n innerStroke: colors[theme].innerStroke,\n innerFill: colors[theme].innerFill[state],\n textFill: colors[theme].textFill[state],\n }\n}\n\nexport function getFormattedEventDate(\n exdate: number,\n hasEarningsDateSuffix = false,\n options: ObjectHash = {\n month: 'short',\n }\n) {\n const parsedDate = utils.dateFromUnixTimestamp(exdate)\n\n const hours = parsedDate.getHours()\n const formattedDate = formatDateToStringUS(parsedDate, options)\n\n if (hasEarningsDateSuffix) {\n let suffix = ''\n\n if (hours <= 9) {\n suffix = 'BMO'\n } else if (hours >= 16) {\n suffix = 'AMC'\n }\n\n return `${formattedDate} ${suffix}`\n }\n\n return formattedDate\n}\n\nexport function getFormattedValue({\n value,\n bigNumberUnit,\n maxDecimalPlaces = 3,\n}: {\n value: number\n bigNumberUnit?: BigNumber\n maxDecimalPlaces?: number\n}) {\n let numberString = ''\n let suffix = ''\n\n if (bigNumberUnit === undefined) {\n numberString = math.round({ value, overridePlaces: 3 })\n } else {\n const bigNumber = math.formatBigNumber(value * BIG_NUMBER_VALUES[bigNumberUnit], 3, BigNumber.Million)\n numberString = parseFloat(bigNumber.substring(0, bigNumber.length - 1)).toString() // parseFloat with toString are removing trailing zeroes\n suffix = bigNumber.substring(bigNumber.length - 1)\n }\n\n const [wholeNumber, decimalNumber] = numberString.split('.')\n\n if (decimalNumber === undefined) return `${wholeNumber}${suffix}`\n\n let formattedDecimalNumber = decimalNumber\n if (maxDecimalPlaces === 2 || decimalNumber[decimalNumber.length - 1] === '0') {\n formattedDecimalNumber = decimalNumber.slice(0, -1)\n }\n\n return `${[wholeNumber, formattedDecimalNumber].join('.')}${suffix}`\n}\n\nexport function getChartEventBageColors(colorKey: 'violet' | 'blue' | 'red' | 'gray' | 'purple' | 'green') {\n return {\n light: {\n outerStroke: twColors.white,\n innerStroke: twColors[colorKey][400],\n innerFill: {\n default: twColors[colorKey][50],\n hover: twColors[colorKey][100],\n selected: twColors[colorKey][400],\n },\n textFill: {\n default: twColors[colorKey][500],\n hover: twColors[colorKey][600],\n selected: twColors.white,\n },\n },\n dark: {\n outerStroke: twColors.gray[900],\n innerStroke: twColors[colorKey][400],\n innerFill: {\n default: twColors[colorKey][800],\n hover: twColors[colorKey][600],\n selected: twColors[colorKey][400],\n },\n textFill: {\n default: twColors.white,\n hover: twColors.white,\n selected: twColors.white,\n },\n },\n } as IBadgeColors\n}\n","export const chartSettingsAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"chart-settings\" */ './module-entry'),\n cacheKey: 'chart-settings',\n}\n","import * as dateFns from 'date-fns'\n\nimport { getChartStartEndDates } from '../controllers/renderUtils'\nimport Quote from '../models/quote'\n\n// **************START**************\n// Functions from here until END have to be in sync with\n// Finviz-Website: components/timeframe-bar/custom-date-range-utils.ts\n// *********************************\n\nexport enum CustomDateRangePrefixEnum {\n Range = 'range',\n Prev = 'prev',\n}\n\nexport const CUSTOM_DATE_RANGE = 'custom'\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\n\nexport function getParsedDateRange(dateRange: string) {\n return dateRange.split(DATE_RANGE_PREFIX_DELMITER)\n}\n\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\n\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\n const dateFrom = dateFromString ? new Date(dateFromString) : null\n const dateTo = dateToString ? new Date(dateToString) : null\n return {\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\n }\n }\n\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\n\n if ([years, months, days].some(Number.isNaN)) {\n return { start: null, end: null }\n }\n\n return {\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\n end: anchorDate,\n }\n }\n\n return { start: null, end: anchorDate }\n}\n\n// **************END**************\n// Functions below don't need to be\n// in sync with Website repository\n// *******************************\n\nexport function getParsedDateRangeMetaData({ dateRange, quote }: { dateRange: string; quote: Quote }) {\n const parsedRange = getChartStartEndDates({ dateRange, quote })\n const [dateRangePrefix] = getParsedDateRange(dateRange)\n\n let startQuoteDate: Date | null = null\n let endQuoteDate: Date | null = null\n let numOfDaysToRender: number | null = null\n\n if (parsedRange.start && dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\n const daysInQuote = quote.getDaysInQuote()\n const reversedDaysInQuote = [...daysInQuote].reverse()\n const startQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.start!.getTime())\n const endQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.end!.getTime())\n startQuoteDate = reversedDaysInQuote[startQuoteDayIndex] ?? null\n endQuoteDate = reversedDaysInQuote[endQuoteDayIndex] ?? null\n numOfDaysToRender = quote.interval <= 5 ? startQuoteDayIndex - endQuoteDayIndex + 1 : null\n }\n\n return {\n start: parsedRange.start,\n end: parsedRange.end,\n startQuoteDate,\n endQuoteDate,\n numOfDaysToRender,\n numOfBarsToRender: (numOfDaysToRender ?? 0) * (quote.getBarsInDay() ?? 0) || undefined,\n renderDateStart: parsedRange.start && dateFns.startOfDay(parsedRange.start),\n renderDateEnd: parsedRange.end && dateFns.endOfDay(parsedRange.end),\n }\n}\n","import * as d3 from 'd3'\nimport * as dateFns from 'date-fns'\n\nimport { Instrument, ObjectHash } from '../../types/shared'\nimport { CHART_MARGIN, DateRangeType, ScaleType, SpecificChartFunctionality, TIMEFRAME } from '../constants/common'\nimport Chart from '../models/chart'\nimport ChartEventElement from '../models/chart-event-element'\nimport ChartLayout from '../models/chart_layout'\nimport { ISettings } from '../models/chart_settings/interfaces'\nimport Element from '../models/element'\nimport Pane, { ScaleAxis } from '../models/pane'\nimport Quote from '../models/quote'\nimport Utils from '../utils'\nimport utils, { convertLocalToNyTime, dateFromUnixTimestamp, isRedesignedPage } from '../utils'\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../utils/chart'\nimport {\n DATE_RANGE_PREFIX_DELMITER,\n getParsedDateRangeMetaData,\n parseCustomDateRangeUrlParam,\n} from '../utils/chart-date-range-utils'\nimport { CHART_EVENT_BADGE_SIZE } from './chart-events/badges/chart-badge-svg-by-type'\n\ninterface VisibleBarNumberProps {\n start: Date | null\n end: Date\n quote: Quote\n dateRange: string\n}\n\ninterface ChartZoomAndLeftOffsetProps extends Omit {\n chartVisibleWidth: number\n numOfBarsToRender?: number\n chartModel: Chart\n}\n\ninterface ChartStartEndDatesProps {\n dateRange: string\n quote: Quote\n}\n\nexport const getVisibleBarsNumber = ({ start, end, quote, dateRange }: VisibleBarNumberProps) => {\n const startInSec = start ? start.getTime() / 1000 : 0\n const endInSec = end.getTime() / 1000\n const isQuoteDateInRange = (quoteDate: number) => quoteDate >= startInSec && quoteDate <= endInSec\n const lastQuoteDateIndex = quote.date.length - 1\n let lastVisibleBarIndex = lastQuoteDateIndex\n let numOfVisibleBars = 0\n if (\n [DateRangeType.d1, DateRangeType.d5].includes(dateRange as DateRangeType) &&\n quote.instrument === Instrument.Stock\n ) {\n numOfVisibleBars = quote.drawMinutesPerDay\n } else {\n let firstVisibleBarIndex = -1\n lastVisibleBarIndex = -1\n quote.date.forEach((quoteDate, index) => {\n if (isQuoteDateInRange(quoteDate)) {\n if (firstVisibleBarIndex === -1) {\n firstVisibleBarIndex = index\n }\n lastVisibleBarIndex = index\n }\n })\n numOfVisibleBars = lastVisibleBarIndex - firstVisibleBarIndex + 1\n\n if (firstVisibleBarIndex === -1 && lastVisibleBarIndex === -1) {\n return { numOfVisibleBars: 0, numOfBarsOffset: 0 }\n }\n }\n\n return { numOfVisibleBars, numOfBarsOffset: lastQuoteDateIndex - lastVisibleBarIndex }\n}\n\nexport const getChartZoomAndLeftOffset = ({\n chartVisibleWidth,\n start,\n end,\n quote,\n chartModel,\n numOfBarsToRender,\n}: ChartZoomAndLeftOffsetProps) => {\n const { numOfVisibleBars, numOfBarsOffset } = getVisibleBarsNumber({\n start,\n end,\n quote,\n dateRange: chartModel.dateRange,\n })\n if (numOfVisibleBars === 0) {\n return { zoomFactor: chartModel.zoomFactor, leftOffset: chartModel.leftOffset }\n }\n\n const chartLayout = chartModel.chart_layout()\n const zoomFactor = getZoomFactorForBarsToDisplay({\n chartLayout,\n chartVisibleWidth,\n numOfVisibleBars: numOfBarsToRender ?? numOfVisibleBars,\n })\n const barWidth = getBarWidthWithMargin({ chartLayout, zoomFactor })\n const leftOffset =\n getLeftOffset({\n quote,\n chartModel,\n config: {},\n barWidth,\n numberOfBarsToDraw: numOfBarsToRender,\n }) +\n numOfBarsOffset * barWidth\n return { zoomFactor, leftOffset }\n}\n\nexport const getChartStartEndDates = ({ dateRange, quote }: ChartStartEndDatesProps) => {\n const daysInQuote = quote.getDaysInQuote()\n const lastDate = dateFromUnixTimestamp(quote.date[quote.date.length - 1])\n\n if (dateRange.includes(DATE_RANGE_PREFIX_DELMITER)) {\n const range = parseCustomDateRangeUrlParam({ dateRange, anchorDate: lastDate })\n const end = convertLocalToNyTime(\n range.end && range.end.getTime() <= lastDate.getTime() ? range.end : lastDate,\n false\n )\n return {\n start: range.start && convertLocalToNyTime(range.start, false),\n end,\n }\n }\n\n let start\n // No condition is needed here, but this would be dateRangePrefix === DateRangePrefixEnum.Enum\n switch (dateRange) {\n case DateRangeType.d1:\n lastDate.setHours(23, 59, 59, 999)\n start = daysInQuote.length === 0 ? lastDate : daysInQuote[daysInQuote.length - 1]\n break\n case DateRangeType.d5:\n lastDate.setHours(23, 59, 59, 999)\n const startDateIndex = daysInQuote.length === 0 ? -1 : Math.max(daysInQuote.length - 5, 0)\n start = startDateIndex === -1 ? lastDate : daysInQuote[startDateIndex]\n break\n case DateRangeType.m1:\n start = dateFns.subMonths(lastDate, 1)\n break\n case DateRangeType.m3:\n start = dateFns.subMonths(lastDate, 3)\n break\n case DateRangeType.m6:\n start = dateFns.subMonths(lastDate, 6)\n break\n case DateRangeType.ytd:\n start = dateFns.startOfYear(lastDate)\n break\n case DateRangeType.y1:\n start = dateFns.subYears(lastDate, 1)\n break\n case DateRangeType.y2:\n start = dateFns.subYears(lastDate, 2)\n break\n case DateRangeType.y5:\n start = dateFns.subYears(lastDate, 5)\n break\n case DateRangeType.max:\n default:\n start = null\n break\n }\n\n return { start: start && convertLocalToNyTime(start, false), end: convertLocalToNyTime(lastDate, false) }\n}\n\ninterface GetLeftOffsetProps {\n quote: Quote\n chartModel: Chart\n config?: { stretch?: boolean }\n barWidth?: number\n barIndex?: number\n numberOfBarsToDraw?: number\n shouldAlignDaysToLeftApplied?: boolean\n}\n\nexport const getMinMaxLeftOffset = ({\n newLeftOffset,\n chartModel,\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\n barIndex,\n}: {\n newLeftOffset: number\n chartModel: Chart\n barWidth?: number\n barIndex: number\n}) => {\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\n const numOfBarsInView = Math.floor(width / barWidth)\n const fx = (index: number) => index * barWidth\n return ~~Utils.min(barWidth / 2, Utils.max(newLeftOffset, width - fx(barIndex + numOfBarsInView)))\n}\n\nconst PREMARKET_AFTERMARKET_HOURS = 2.5\nexport function getFullChartWidth({\n hasAftermarket,\n hasPremarket,\n timeframeMinutes,\n barWidthWithMargin,\n}: {\n hasPremarket: boolean\n hasAftermarket: boolean\n timeframeMinutes: number\n barWidthWithMargin: number\n}) {\n const premarketHoursLength = hasPremarket ? PREMARKET_AFTERMARKET_HOURS : 0\n const aftermarketHoursLength = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS : 0\n const marketMinutesLength = (6.5 + premarketHoursLength + aftermarketHoursLength) * 60\n // CHART_MARGIN.L as left offset + CHART_MARGIN.XXL as right offset\n return CHART_MARGIN.L + CHART_MARGIN.XXL + (marketMinutesLength / timeframeMinutes) * barWidthWithMargin\n}\n\nexport function getIntradayChartConfig({\n timeframeMinutes,\n barWidthWithMargin,\n hasPremarket,\n hasAftermarket,\n maxWidth,\n}: {\n hasPremarket: boolean\n hasAftermarket: boolean\n timeframeMinutes: number\n barWidthWithMargin: number\n maxWidth: number\n}) {\n const fullChartWidth = getFullChartWidth({ hasPremarket, hasAftermarket, barWidthWithMargin, timeframeMinutes })\n const offsetChartAfter = 16 // Int from 0-23 , if last quote date is >= this constant `offsetInPx` is applied (chart is moved to the left)\n const cropChartMinutesLength = PREMARKET_AFTERMARKET_HOURS * 60\n const offsetInPx = (cropChartMinutesLength / timeframeMinutes) * barWidthWithMargin\n const chartWidthWithOffset = fullChartWidth - offsetInPx\n const shouldCropChart =\n hasAftermarket && hasPremarket && maxWidth >= chartWidthWithOffset && maxWidth < fullChartWidth\n\n return {\n fullChartWidth,\n offsetInPx: shouldCropChart ? offsetInPx : 0,\n chartWidthWithOffset: shouldCropChart ? fullChartWidth - offsetInPx : fullChartWidth,\n offsetChartAfter,\n }\n}\n\nexport const getLeftOffset = ({\n quote,\n chartModel,\n config,\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\n barIndex = getBarIndex(quote),\n numberOfBarsToDraw,\n shouldAlignDaysToLeftApplied = true,\n}: GetLeftOffsetProps) => {\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\n const specificChartFunctionality = chartModel.chart_layout().specificChartFunctionality\n if (config?.stretch) {\n return 0\n }\n if (getIsSmallIndexChart(specificChartFunctionality)) {\n return barWidth\n }\n const fx = (index: number) => index * barWidth\n let leftOffset = width - fx(barIndex) - Math.round(barWidth / 2)\n leftOffset = Math.round(Utils.min(barWidth / 2, Utils.max(leftOffset, width - fx(barIndex + 45))))\n if (\n shouldAlignDaysToLeftApplied &&\n shouldAlignDaysToLeft({\n quote,\n numberOfBarsToDraw,\n specificChartFunctionality,\n dateRange: chartModel.dateRange,\n })\n ) {\n let drawDaysInOneChart = 1\n if (numberOfBarsToDraw) {\n drawDaysInOneChart = Math.ceil(numberOfBarsToDraw / quote.getBarsInDay()!)\n } else if (quote.interval === 10 || chartModel.dateRange === DateRangeType.d5) {\n drawDaysInOneChart = 5\n } else if (quote.interval === 15) {\n drawDaysInOneChart = 6\n } else if (quote.interval === 30) {\n drawDaysInOneChart = 12\n } else if (quote.interval === 60) {\n drawDaysInOneChart = 22\n } else if (quote.interval === 120) {\n drawDaysInOneChart = 39\n } else if (quote.interval === 240) {\n drawDaysInOneChart = 78\n } else if (quote.interval > 240) {\n drawDaysInOneChart = (quote.interval / 30) * 10\n }\n const { offsetInPx, offsetChartAfter } = getIntradayChartConfig({\n hasAftermarket: !!quote.aftermarket,\n barWidthWithMargin: barWidth,\n timeframeMinutes: quote.interval,\n hasPremarket: !!quote.premarket,\n maxWidth: chartModel.width,\n })\n const drawDaysWidth = drawDaysInOneChart * quote.getBarsInDay()! * barWidth - offsetInPx\n\n // +1 is a buffer as it often happens drawDaysWidth is wider than width by tiny amount (< 1/10000 of px)\n if (drawDaysWidth <= width + 1) {\n const lastQuoteDate = quote.date.last() ? utils.dateFromUnixTimestamp(quote.date.last()!) : null\n // Align start of day to left if we have enough space to show all bars in day\n const barsToOffset = (Object.keys(quote.getDayToOffset()).length - drawDaysInOneChart) * quote.getBarsInDay()!\n const offsetChartInPx = (lastQuoteDate?.getHours() ?? 0) >= offsetChartAfter ? offsetInPx : 0\n leftOffset = Math.round(-fx(barsToOffset) + barWidth / 2) - offsetChartInPx\n }\n }\n // getMinMaxLeftOffset move left offset to keep at least one bar in view what isn't desired for offscreen charts\n if (specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n return leftOffset\n }\n return getMinMaxLeftOffset({\n newLeftOffset: leftOffset,\n chartModel,\n barWidth,\n barIndex,\n })\n}\n\nexport const getBarIndex = (quote: Quote) => quote?.getBarIndex(quote.open?.length ? quote.open.length - 1 : 0) || 0\n\nexport const getIsSmallIndexChart = (specificChartFunctionality: SpecificChartFunctionality) =>\n specificChartFunctionality === SpecificChartFunctionality.smallIndex\n\ninterface ShouldAlignDaysToLeftProps {\n quote: Quote\n numberOfBarsToDraw?: number\n specificChartFunctionality: SpecificChartFunctionality\n dateRange: DateRangeType | null\n}\n\n/**\n * Evaluate if days should be aligned to the left\n * @param {object} object.quote - Quote model\n * @param {string} object.specificChartFunctionality - SpecificChartFunctionality enum\n * @returns {boolean} boolean\n * */\nexport const shouldAlignDaysToLeft = ({\n quote,\n dateRange,\n numberOfBarsToDraw,\n specificChartFunctionality,\n}: ShouldAlignDaysToLeftProps) => {\n const isStockIntraday = quote.isIntraday && quote.instrument === Instrument.Stock\n // We don't want this to affect /charts page, only if intraday daterange is applied\n const isQuoteOrOffscreen = [SpecificChartFunctionality.quotePage, SpecificChartFunctionality.offScreen].includes(\n specificChartFunctionality\n )\n const isChartPage = specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isChartsInradayDateRange =\n isChartPage && !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\n const isChartPageWithFixedBars = isChartPage && numberOfBarsToDraw\n return isStockIntraday && (isQuoteOrOffscreen || isChartsInradayDateRange || isChartPageWithFixedBars)\n}\n\ninterface ClipProps {\n canvasCtx: RenderingContext2DType\n width: number\n height: number\n Settings: ISettings['ChartSettings'] | ISettings['IndicatorSettings']\n}\n// pane canvasCtx clip\nexport const clip = ({ canvasCtx, width, height, Settings }: ClipProps) => {\n const contentWidth = width - Settings.left.width - Settings.right.width\n const contentHeight = height - Settings.top.height - Settings.bottom.height\n canvasCtx.beginPath()\n canvasCtx.rect(Settings.left.width, Settings.top.height, contentWidth, contentHeight)\n canvasCtx.clip()\n}\n\nexport const getSettings = (paneModel: Pane) => {\n const { ChartSettings, IndicatorSettings } = paneModel.chart().getChartLayoutSettings()\n for (const element of paneModel.elements().all()) {\n if (element.isIndicator()) {\n return IndicatorSettings\n }\n }\n return ChartSettings\n}\n\ninterface RecountScaleProps {\n chartModel: Chart\n paneModel: Pane\n}\n\ntype ScaledFn = Partial & (d3.ScaleLinear | d3.ScaleSymLog)\n\nconst getShouldOffsetChartDomain = (elementModel: Element | ChartEventElement) => {\n const quote = elementModel.pane().chart().quote()\n\n return quote.chartEvents.length > 0 && ![TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)\n}\n\nexport const recountScale = ({ chartModel, paneModel }: RecountScaleProps) => {\n const { ChartSettings, IndicatorSettings, MarketSentimentSettings } = chartModel.getChartLayoutSettings()\n const chartLayout = chartModel.chart_layout()\n const barWidthWithMargin = getBarWidthWithMargin({ chartLayout, zoomFactor: chartModel.zoomFactor })\n for (const elementModel of [...paneModel.getAllElements(), ...paneModel.getAllChartEvents(false)]) {\n const el = elementModel.instance\n const isChart = elementModel.isChart()\n if (isChart || elementModel.isIndicator()) {\n let fx: ScaledFn, Settings: ISettings['MarketSentimentSettings' | 'ChartSettings' | 'IndicatorSettings'], width\n const scaleType = isChart ? chartModel.scale : ScaleType.Linear\n if (isChart) {\n Settings = chartModel.instrument === Instrument.MarketSentiment ? MarketSentimentSettings : ChartSettings\n } else {\n Settings = IndicatorSettings as ISettings['IndicatorSettings']\n }\n const contentHeight = paneModel.height - Settings.top.height - Settings.bottom.height\n\n if (chartModel.stretch) {\n width = chartModel.width - Settings.left.width - Settings.right.width\n fx = d3\n .scaleLinear()\n .range([0, width])\n .domain([0, Math.max(0, chartModel.quote().close.length - 1)]) as ScaledFn\n } else {\n fx = ((index: number) => index * barWidthWithMargin) as ScaledFn\n fx.invert = (x: number) => x / barWidthWithMargin\n fx.width = function (w) {\n return this.invert(w) - this.invert(0)\n }\n }\n paneModel.updateAttribute('scale', { x: fx }) // some elements need fx to count getMinMax\n\n const { min, max } = paneModel.scaleRange || el.getMinMax!()\n let fy\n\n const handleDomainOffset = (currentScale: ScaledFn, scaleCreator: any) => {\n if (isChart && getShouldOffsetChartDomain(elementModel)) {\n const protectedHeightPx = contentHeight - CHART_EVENT_BADGE_SIZE\n const minPx = currentScale(min)\n const domain = currentScale.domain()\n if (minPx > protectedHeightPx) {\n const tempScale = scaleCreator().range([0, protectedHeightPx]).domain([max, min])\n const extendedMin = tempScale.invert(contentHeight)\n currentScale.domain([domain[0], extendedMin])\n }\n }\n }\n\n switch (scaleType) {\n case ScaleType.Logarithmic:\n fy = d3.scaleSymlog().range([0, contentHeight]).domain([max, min]) as ScaledFn\n handleDomainOffset(fy, d3.scaleSymlog)\n break\n default:\n fy = d3.scaleLinear().range([0, contentHeight]).domain([max, min]) as ScaledFn\n if (!paneModel.scaleRange) {\n fy = fy.nice(10)\n handleDomainOffset(fy, d3.scaleLinear)\n }\n break\n }\n fy.height = function (h: number) {\n return this.invert(h) - this.invert(0)\n }\n paneModel.updateAttribute('scale', {\n x: fx,\n y: fy,\n })\n\n if (isChart) {\n el.setupAxis!(fx as ScaleAxis)\n }\n break\n }\n }\n}\n\n// general, only when blurry ends won't be visible or didn't matter\nexport const getOffsetFromLineWidth = (lineWidth: number) => (lineWidth % 2 === 0 ? 0 : 0.5)\n\ninterface IXYOffsetFromLine {\n lineWidth: number\n x1: number\n y1: number\n x2: number\n y2: number\n}\n\n// return x,y offsets for pixel perfect line rendering\nexport const getXYOffsetFromLine = ({ lineWidth, x1, y1, x2, y2 }: IXYOffsetFromLine) => {\n // don't add offset is lineWidth is even\n if (lineWidth % 2 === 0) {\n return { x: 0, y: 0 }\n }\n if (y1 === y2) {\n return { x: 0, y: 0.5 } // horizontal line\n } else if (x1 === x2) {\n return { x: 0.5, y: 0 } // vertical line\n } else {\n return { x: 0.5, y: 0.5 } // diagonal line\n }\n}\n\nexport const getRoundedObject = (obj: T): T => {\n const rounded = Object.entries(obj)\n for (let i = 0; i < rounded.length; i++) {\n rounded[i][1] = Math.round(rounded[i][1])\n }\n return Object.fromEntries(rounded) as T\n}\n\ninterface ITranslate {\n context: CanvasRenderingContext2D\n xOffset: number\n yOffset: number\n}\n\ninterface ITranslateObj {\n do: () => void\n undo: () => void\n}\n\nexport const getTranslate = ({ context, xOffset, yOffset }: ITranslate): ITranslateObj => ({\n do: () => context.translate(xOffset, yOffset),\n undo: () => context.translate(xOffset * -1, yOffset * -1),\n})\n\ninterface IPercentageScaleValue {\n number: number\n base: number\n}\n\nexport const getPercentageFromValue = ({ number, base }: IPercentageScaleValue) => ((number - base) / base) * 100\n\nexport const getValueFromPercentage = ({ number, base }: IPercentageScaleValue) => (number / 100) * base + base\n\ninterface UpdateZoomAndLeftOffsetByDateRangeProps {\n chartModel: Chart\n quote: Quote\n}\n\nexport function updateZoomAndLeftOffsetByDateRange({ chartModel, quote }: UpdateZoomAndLeftOffsetByDateRangeProps) {\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const chartVisibleWidth = chartModel.width - (ChartSettings.left.width + ChartSettings.right.width)\n\n const { start, end, numOfBarsToRender } = getParsedDateRangeMetaData({\n dateRange: chartModel.dateRange,\n quote,\n })\n\n const { zoomFactor, leftOffset } = getChartZoomAndLeftOffset({\n chartVisibleWidth,\n start,\n end,\n quote,\n numOfBarsToRender,\n chartModel: chartModel,\n })\n\n if (chartModel.zoomFactor !== zoomFactor || chartModel.leftOffset !== leftOffset) {\n chartModel.updateAttributes({ zoomFactor, leftOffset })\n }\n}\n\nexport function renderPane({\n chartLayoutModel,\n chartModel,\n paneModel,\n canvasCtx,\n shouldRenderCross = false,\n}: {\n chartLayoutModel: ChartLayout\n chartModel: Chart\n paneModel: Pane\n canvasCtx: CanvasRenderingContext2D\n shouldRenderCross?: boolean\n}) {\n if (paneModel.chart().instrument === Instrument.MarketSentiment) {\n canvasCtx.clearRect(0, 0, chartModel.width, paneModel.height)\n } else {\n canvasCtx.set('fillStyle', chartModel.getChartLayoutSettings().ChartSettings.general.Colors.canvasFill)\n canvasCtx.fillRect(0, 0, chartModel.width, paneModel.height)\n }\n const elements = paneModel.getAllElements()\n for (const { instance: elementInstance } of elements) {\n if (typeof elementInstance.renderGrid === 'function') {\n canvasCtx.save()\n elementInstance.renderGrid(canvasCtx)\n canvasCtx.restore()\n }\n }\n\n const chartEvents = paneModel.getAllChartEvents()\n const Settings = getSettings(paneModel)\n for (const { instance: elementInstance } of [...elements, ...chartEvents]) {\n const isDrawing = elementInstance.getIsDrawing()\n const isChartEvent = elementInstance.getIsChartEvent()\n\n if (isDrawing && (chartLayoutModel.isHideDrawingsActive || !elementInstance.getIsVisible())) {\n continue\n } else if ((isDrawing || isChartEvent) && !elementInstance.getIsInChartView(chartModel)) {\n continue\n }\n\n canvasCtx.save()\n if (elementInstance.renderContent != null) {\n canvasCtx.save()\n clip({\n canvasCtx,\n width: chartModel.width,\n height: paneModel.height,\n Settings,\n })\n canvasCtx.translate(paneModel.chart().leftOffset + Settings.left.width, Settings.top.height)\n elementInstance.renderContent(canvasCtx)\n canvasCtx.restore()\n if (typeof elementInstance.renderLabels === 'function') {\n elementInstance.renderLabels(canvasCtx)\n }\n } else {\n elementInstance.render(canvasCtx)\n }\n if (\n shouldRenderCross &&\n (chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage ||\n isRedesignedPage(chartLayoutModel)) &&\n elementInstance.renderCross != null\n ) {\n elementInstance.renderCross(canvasCtx)\n }\n canvasCtx.restore()\n }\n}\n","export const DEFAULT_WIDTHS = {\n min: 200,\n max: 400,\n}\n\nexport enum SidebarDirection {\n vertical,\n horizontal,\n}\n","import React from 'react'\n\nimport { DEFAULT_WIDTHS, SidebarDirection } from '../constants'\nimport { SidebarModule, SidebarModuleType } from '../modules/modules'\n\nexport type SidebarContextType = {\n isOpen: boolean\n isCloseVisible: boolean\n direction: SidebarDirection\n width?: {\n min?: number | string\n max?: number | string\n default?: { desktop?: number; mobile?: number }\n }\n activeModule: SidebarModuleType | null\n close: () => void\n onResize: () => void\n selectModule: (module?: SidebarModule) => void\n}\n\nconst DEFAULT_CONTEXT: SidebarContextType = {\n activeModule: null,\n isOpen: false,\n isCloseVisible: false,\n direction: SidebarDirection.horizontal,\n width: DEFAULT_WIDTHS,\n close: () => {},\n onResize: () => {},\n selectModule: () => {},\n}\n\nexport const SidebarContext = React.createContext(DEFAULT_CONTEXT)\nexport const useSidebarContext = () => React.useContext(SidebarContext)\n","import ChartLayout from '../../models/chart_layout'\n\nexport enum DrawingTool {\n Arrow = 'arrow',\n Brush = 'brush',\n Callout = 'callout',\n Curve = 'curve',\n ElliottWaves = 'elliott-wave',\n Ellipse = 'ellipse',\n FibonacciRetracements = 'fibonacci-retracements',\n HorizontalLine = 'horizontal-line',\n Measure = 'measure',\n Mouse = 'mouse',\n Pitchfork = 'pitchfork',\n Polygon = 'polygon',\n Position = 'position',\n Rectangle = 'rectangle',\n RotatedRectangle = 'rotated-rectangle',\n ScaledLine = 'scaled-line',\n ScaledText = 'scaled-text',\n Triangle = 'triangle',\n VerticalLine = 'vertical-line',\n Xabcd = 'xabcd',\n}\n\nexport enum DrawingActions {\n AddNote = 'add-note',\n DeleteDrawings = 'delete-drawings',\n DeleteAutoSavedDrawings = 'delete-autosaved-drawings',\n}\n\nexport enum DrawingSetting {\n PreserveDrawings = 'preserve-drawings',\n DrawingModeContinuous = 'drawing-mode-continuous',\n HideDrawings = 'hide-drawings',\n LockDrawings = 'lock-drawings',\n}\n\nexport interface IToolBarProps {\n chartLayoutModel: ChartLayout\n isSidebar?: boolean\n isHorizontal?: boolean\n isMobileOverlay?: boolean\n /**\n * Current selected tool id\n */\n activeTool: DrawingTool\n /**\n * On tool item select callback\n */\n onActiveToolChange: (activeTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => void\n /**\n * On drawing actions item select callback\n */\n onDrawingActionClick?: (actionId: DrawingActions) => void\n /**\n * On drawing settings item select callback\n */\n onDrawingSettingClick?: (settingId: DrawingSetting) => void\n /**\n * On drawing end callback\n */\n onDrawingEnd?: () => void\n /**\n * Current state of drawing settings\n */\n drawingSettings: Record\n isAlternativeTheme?: boolean\n /**\n * Are tools disabled\n */\n areToolsDisabled?: boolean\n}\n\nexport interface IToolbarItemProperties {\n icon: string\n iconActive?: string\n iconAction?: string\n title: string\n titleActive?: string\n titleAction?: string\n}\n\nexport interface IToolbarDrawingTool extends IToolbarItemProperties {\n id: DrawingTool\n}\n\nexport interface IToolbarDrawingAction extends IToolbarItemProperties {\n id: DrawingActions\n}\n\nexport interface IToolbarDrawingSetting extends IToolbarItemProperties {\n id: DrawingSetting\n}\n\nexport interface IToolbarDrawingToolItem {\n defaultItem: IToolbarDrawingTool\n toolGroup?: Array\n toolGroupTitle?: string\n}\n\nexport interface IToolbarDrawingActionItem {\n defaultItem: IToolbarDrawingAction\n isDisabled?: boolean\n disabledTooltip?: string\n}\n\nexport interface IToolbarDrawingsSettingItem {\n defaultItem: IToolbarDrawingSetting\n isDisabled?: boolean\n isInAction?: boolean\n disabledTooltip?: string\n}\n","import { Instrument } from '../../types/shared'\nimport { ChartElementType } from '../constants/common'\nimport QuoteModel from '../models/quote'\n\nexport function getInstrumentLabel(instrument: Instrument) {\n switch (instrument) {\n case Instrument.Stock:\n return 'Stock'\n case Instrument.Futures:\n return 'Futures'\n case Instrument.Forex:\n return 'Forex'\n case Instrument.Crypto:\n return 'Crypto'\n case Instrument.MarketSentiment:\n return 'Market Sentiment'\n }\n}\n\nexport function getChartAlt(quoteModel: QuoteModel) {\n return `${quoteModel.name || quoteModel.ticker} - ${getInstrumentLabel(quoteModel.instrument)} Price Chart`\n}\n\nexport const getResponseChartType = (chartType: ChartElementType) => {\n switch (chartType) {\n case ChartElementType.HeikinAshi:\n return 'heikinashi'\n case ChartElementType.HollowCandleStick:\n return 'hollowcandlestick'\n case ChartElementType.LineChart:\n return 'line'\n case ChartElementType.OhlcChart:\n return 'ohlc'\n case ChartElementType.CandleStick:\n default:\n return 'candlestick'\n }\n}\n\nexport const getChartElementTypeFromResponseType = (chartResponseType: string | null) =>\n chartResponseType === null\n ? null\n : Object.values(ChartElementType).find(\n (chartType: ChartElementType) => chartResponseType === getResponseChartType(chartType)\n )\n","import utils from '../utils'\n\nclass AverageTrueRange {\n period: number\n sum: number\n count: number\n value: number\n\n constructor(period: number) {\n this.period = period\n this.sum = 0\n this.count = 0\n this.value = 0\n }\n\n add(high: number, low: number, prevClose: number) {\n const tr = utils.max([high - low, Math.abs(high - prevClose), Math.abs(low - prevClose)])\n\n if (this.count < this.period) {\n this.sum += tr\n this.value = this.sum / (this.count + 1)\n if (this.count === this.period - 1) {\n this.sum /= this.period\n }\n } else {\n this.value = (this.value * (this.period - 1) + tr) / this.period\n }\n this.count++\n }\n}\n\nexport default AverageTrueRange\n","class ExponentialMovingAverage {\n period: number\n multiplier: number\n sum: number\n count: number\n value: number\n\n constructor(period: number) {\n this.period = period\n this.multiplier = 2 / (this.period + 1)\n this.sum = 0\n this.count = 0\n this.value = 0\n }\n\n add(d: number) {\n if (this.count < this.period) {\n this.sum += d\n this.count++\n this.value = this.sum / this.count\n } else {\n this.value = d * this.multiplier + this.value * (1 - this.multiplier)\n }\n }\n}\n\nexport default ExponentialMovingAverage\n","import { PaneArea } from '../../types/shared'\nimport Element, { DefaultAttrs } from '../canvas/element'\nimport BaseChart from '../charts/base_chart'\nimport { ChartEventBadgeType, ChartEventType, TIMEFRAME } from '../constants/common'\nimport {\n CHART_EVENT_BADGE_SIZE,\n getChartEventBadgeImage,\n} from '../controllers/chart-events/badges/chart-badge-svg-by-type'\nimport { ChartEventBadgeState } from '../controllers/chart-events/utils'\nimport { getRoundedObject } from '../controllers/renderUtils'\nimport Chart from '../models/chart'\nimport ChartEventElement from '../models/chart-event-element'\nimport type PaneModel from '../models/pane'\n\ninterface ChartEventAttrs extends DefaultAttrs {\n x: number\n}\n\nfunction getChartEventState(chartEvent: ChartEvent): ChartEventBadgeState {\n if (chartEvent.isOpen) {\n return ChartEventBadgeState.selected\n }\n if (chartEvent.isHovered) {\n return ChartEventBadgeState.hover\n }\n return ChartEventBadgeState.default\n}\n\nclass ChartEvent extends Element {\n static type = ChartEventType.ChartEvent\n static label = 'ChartEvent'\n\n declare scaled: Pick\n\n declare chart: BaseChart\n\n declare model: PaneModel\n\n isOpen = false\n\n left = 0\n top = 0\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.scale(this.getBoundingPointKeys())\n }\n\n getBoundingPointKeys = () => ({ x: ['x'], y: [] })\n\n get type() {\n return (this.constructor as typeof ChartEvent).type\n }\n\n get label() {\n return (this.constructor as typeof ChartEvent).label\n }\n\n getChartEvenBadgeType(): ChartEventBadgeType {\n switch (this.type) {\n case ChartEventType.Dividends:\n return ChartEventBadgeType.Dividends\n case ChartEventType.Split:\n return ChartEventBadgeType.Split\n }\n\n return ChartEventBadgeType.EarningsNeutral\n }\n\n getChartEventModel(): ChartEventElement | undefined {\n return this.model.chartEvents()?.findByAttribute('instance', this)\n }\n\n getXYPosition() {\n const { top, bottom } = this.getChartLayoutSettings().ChartSettings\n const chartEventModel = this.getChartEventModel()\n const { x } = this.scaled\n const roundedXY = getRoundedObject({ x })\n const y =\n (this.model as PaneModel).height -\n top.height -\n bottom.height -\n CHART_EVENT_BADGE_SIZE -\n (chartEventModel?.yIndex ?? 0) * CHART_EVENT_BADGE_SIZE\n\n return { x: roundedXY.x - CHART_EVENT_BADGE_SIZE / 2, y }\n }\n\n getIsVisible() {\n return ![TIMEFRAME.w, TIMEFRAME.m].includes(this.model.chart().quote()?.timeframe)\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (!this.getIsVisible()) return\n\n this.attrs.x = Math.round(this.attrs.x)\n const chart = this.model.chart()\n const chartLayout = chart.chart_layout()\n const { x, y } = this.getXYPosition()\n const buffer = 10 + CHART_EVENT_BADGE_SIZE\n if (x + chart.leftOffset < -buffer || x + chart.leftOffset > chart.width + buffer) {\n return\n }\n const item = getChartEventBadgeImage({\n theme: chartLayout.theme,\n state: getChartEventState(this),\n badgeType: this.getChartEvenBadgeType(),\n })\n const { left, top } = this.getChartLayoutSettings().ChartSettings\n this.left = x + chart.leftOffset + left.width + CHART_EVENT_BADGE_SIZE / 2\n this.top = y + top.height\n context.drawImage(item, x, y, CHART_EVENT_BADGE_SIZE, CHART_EVENT_BADGE_SIZE)\n }\n\n setIsHovered(isHovered: boolean) {\n if (!this.getIsVisible()) return\n\n this.isHovered = isHovered\n this.model.updateChartEventsZIndexes()\n this.trigger('change')\n }\n\n // If isOpenOverride is undefined, the function works as toggle\n toggleIsOpen(isOpenOverride?: boolean) {\n const chartLayout = this.model.chart().chart_layout()\n const chartEventModel = this.getChartEventModel()\n\n const isCurrentEventActive = chartLayout.activeChartEvent?.elementId === chartEventModel?.elementId\n const isOpen = isOpenOverride ?? (isCurrentEventActive ? !chartEventModel?.instance.isOpen : true)\n this.isOpen = isOpen\n if (chartLayout.activeChartEvent?.instance.isOpen && !isCurrentEventActive) {\n chartLayout.activeChartEvent?.instance.toggleIsOpen(false)\n }\n if (isOpen || isCurrentEventActive) {\n chartLayout.updateAttribute('activeChartEvent', !isOpen && isCurrentEventActive ? undefined : chartEventModel)\n }\n\n this.model.updateChartEventsZIndexes()\n this.trigger('change')\n }\n\n isInArea(area: PaneArea) {\n if (!this.getIsVisible()) return false\n\n const scaledArea = area.scaled\n const { x, y } = this.getXYPosition()\n const isInArea =\n x <= scaledArea.x &&\n x + CHART_EVENT_BADGE_SIZE >= scaledArea.x &&\n y <= scaledArea.y &&\n y + CHART_EVENT_BADGE_SIZE >= scaledArea.y\n return isInArea\n }\n\n getIsInChartView(chart: Chart) {\n if (!this.getIsVisible()) return false\n\n const { x } = this.getXYPosition()\n const isInView = x + CHART_EVENT_BADGE_SIZE >= -chart.leftOffset && x <= -chart.leftOffset + chart.width\n return isInView\n }\n}\n\nexport default ChartEvent\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\nimport ChartEvent from './chart-event'\n\nclass Dividends extends ChartEvent {\n static type = ChartEventType.Dividends\n static label = ChartEventLabels[ChartEventType.Dividends]\n}\n\nexport default Dividends\n","import { ChartEventBadgeType, ChartEventLabels, ChartEventType } from '../constants/common'\nimport { IEarnings } from '../controllers/chart-events/utils'\nimport ChartEvent from './chart-event'\n\nclass Earnings extends ChartEvent {\n static type = ChartEventType.Earnings\n static label = ChartEventLabels[ChartEventType.Earnings]\n\n getChartEvenBadgeType(): ChartEventBadgeType {\n const eventItem = this.getChartEventModel()?.getChartEventData() as IEarnings | undefined\n\n if (!eventItem) {\n return ChartEventBadgeType.EarningsNeutral\n }\n\n if (eventItem.epsActual === undefined || eventItem.epsEstimate === undefined) {\n const now = Date.now() / 1000\n return eventItem.dateTimestamp > now ? ChartEventBadgeType.EarningsFuture : ChartEventBadgeType.EarningsNeutral\n }\n return eventItem.epsActual - eventItem.epsEstimate < 0\n ? ChartEventBadgeType.EarningsNegative\n : ChartEventBadgeType.EarningsPositive\n }\n}\n\nexport default Earnings\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\nimport ChartEvent from './chart-event'\n\nclass Split extends ChartEvent {\n static type = ChartEventType.Split\n static label = ChartEventLabels[ChartEventType.Split]\n}\n\nexport default Split\n","import { ChartEventType } from '../constants/common'\nimport chartEvent from './chart-event'\nimport dividends from './dividends'\nimport earnings from './earnings'\nimport split from './split'\n\nexport const chartEventsByType = Object.freeze({\n [ChartEventType.ChartEvent]: chartEvent,\n [ChartEventType.Dividends]: dividends,\n [ChartEventType.Split]: split,\n [ChartEventType.Earnings]: earnings,\n})\n","import { ChartConfigChartPaneElement } from '../../types/shared'\nimport { drawingToolsByType } from '../canvas/drawingTools'\nimport { chartEventsByType } from '../chart-events'\nimport { chartsByType } from '../charts/charts'\nimport { indicatorsByType } from '../indicators/indicators'\nimport { overlaysByType } from '../overlays/overlays'\n\nconst canvasElements = {\n ...overlaysByType,\n ...indicatorsByType,\n ...drawingToolsByType,\n ...chartsByType,\n ...chartEventsByType,\n}\n\nexport function getCanvasElementByType(elementType: ChartConfigChartPaneElement['type']) {\n return canvasElements[elementType]\n}\n","import { Instrument, Point } from '../../types/shared'\n\ninterface LinePoints {\n x1: number\n x2: number\n y1: number\n y2: number\n}\n\nexport enum BigNumber {\n Thousand,\n Million,\n Billion,\n Trillion,\n}\n\nexport const BIG_NUMBER_VALUES = {\n [BigNumber.Thousand]: 1e3,\n [BigNumber.Million]: 1e6,\n [BigNumber.Billion]: 1e9,\n [BigNumber.Trillion]: 1e12,\n}\n\nconst BIG_NUMBER_ZEROES = {\n [BigNumber.Thousand]: 3,\n [BigNumber.Million]: 6,\n [BigNumber.Billion]: 9,\n [BigNumber.Trillion]: 12,\n}\n\nconst BIG_NUMBER_SUFFIX = {\n [BigNumber.Thousand]: 'K',\n [BigNumber.Million]: 'M',\n [BigNumber.Billion]: 'B',\n [BigNumber.Trillion]: 'T',\n}\n\nconst math = {\n dotProduct(p1: Point, p2: Point) {\n return p1.x * p2.x + p1.y * p2.y\n },\n\n crossProduct(p1: Point, p2: Point) {\n return p1.x * p2.y - p1.y * p2.x\n },\n\n distance(p1: Point, p2: Point) {\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))\n },\n\n lineEquation(line: LinePoints) {\n // ax + by + c = 0\n if (line.x1 === line.x2) {\n return {\n a: 1,\n b: 0,\n c: -line.x1,\n }\n }\n const k = (line.y2 - line.y1) / (line.x2 - line.x1)\n return {\n a: -k,\n b: 1,\n c: k * line.x1 - line.y1,\n k,\n }\n },\n\n pointInPolygon(point: Point, polygon: Point[]) {\n // http://alienryderflex.com/polygon/\n let j = polygon.length - 1\n let oddNodes = false\n for (let i = 0; i < polygon.length; i++) {\n const p = polygon[i]\n if (\n ((p.y < point.y && polygon[j].y >= point.y) || (polygon[j].y < point.y && p.y >= point.y)) &&\n (p.x <= point.x || polygon[j].x <= point.x)\n ) {\n if (p.x + ((point.y - p.y) / (polygon[j].y - p.y)) * (polygon[j].x - p.x) < point.x) {\n oddNodes = !oddNodes\n }\n }\n j = i\n }\n return oddNodes\n },\n\n distanceToLine(point: Point, line: LinePoints) {\n const { a, b, c } = this.lineEquation(line)\n const dist = Math.abs(a * point.x + b * point.y + c) / Math.sqrt(a * a + b * b)\n return dist\n },\n\n distanceToSegment(point: Point, line: LinePoints) {\n const l2 = Math.pow(line.x1 - line.x2, 2) + Math.pow(line.y1 - line.y2, 2)\n if (l2 === 0) {\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\n }\n const t = ((point.x - line.x1) * (line.x2 - line.x1) + (point.y - line.y1) * (line.y2 - line.y1)) / l2\n if (t < 0) {\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\n }\n if (t > 1) {\n return Math.sqrt(Math.pow(point.x - line.x2, 2) + Math.pow(point.y - line.y2, 2))\n }\n const x = line.x1 + t * (line.x2 - line.x1)\n const y = line.y1 + t * (line.y2 - line.y1)\n return Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2))\n },\n\n getInstrumentDecimalPlaces({ value, instrument }: { value: number; instrument?: Instrument }) {\n if (instrument === Instrument.Crypto && value <= 0.001) {\n return 8\n }\n\n if ((instrument !== Instrument.Stock && value <= 6) || (instrument === Instrument.Stock && value < 1)) {\n return 4\n }\n\n return 2\n },\n\n formatBigNumber(number: number, toFixed?: number, minNumber?: BigNumber) {\n const absNum = Math.abs(number)\n const getString = ({ num, suffix, zeroes }: { num: number; suffix: string; zeroes: number }) => {\n const str = num.toString()\n if (str.includes('e')) {\n const splitString = str.split('e')\n const addZeroes = Number(splitString[1]) - zeroes\n return Math.round(Number(splitString[0])).toString().padEnd(Math.max(0, addZeroes), '0') + suffix\n }\n const sign = Math.sign(num)\n const numberByZeroesCount = Math.pow(10, zeroes)\n const result = (absNum / numberByZeroesCount) * sign\n return (Number.isInteger(result) ? result : result.toFixed(toFixed !== undefined ? toFixed : 1)) + suffix\n }\n\n if (absNum >= BIG_NUMBER_VALUES[BigNumber.Trillion] || minNumber === BigNumber.Trillion) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Trillion],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Trillion],\n })\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Billion] || minNumber === BigNumber.Billion) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Billion],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Billion],\n })\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Million] || minNumber === BigNumber.Million) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Million],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Million],\n })\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Thousand] || minNumber === BigNumber.Thousand) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Thousand],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Thousand],\n })\n } else {\n return toFixed !== undefined ? number.toFixed(toFixed) : number.toString()\n }\n },\n\n round({\n value,\n lastClose = 0,\n instrument,\n overridePlaces,\n }: {\n value: number\n lastClose?: number\n instrument?: Instrument\n overridePlaces?: number\n }) {\n if (Math.abs(value) >= BIG_NUMBER_VALUES[BigNumber.Million]) {\n return this.formatBigNumber(value, overridePlaces)\n }\n\n const places =\n typeof overridePlaces === 'number'\n ? overridePlaces\n : this.getInstrumentDecimalPlaces({ value: lastClose, instrument })\n\n if (places >= 8 && value < 0.000001) {\n // There was an issue with getting NaN when rounding small numbers with latter method\n return value.toFixed(places)\n }\n return Number(`${Math.round(Number(`${value}e+${places}`))}e-${places}`).toFixed(places)\n },\n\n perpendicularPointToLine({ line, distance }: { line: LinePoints; distance: number }) {\n if (distance === 0) {\n return { x: line.x2, y: line.y2 }\n }\n\n let yAxisCoeficient\n let xAxisCoeficient\n\n if (line.x1 <= line.x2 && line.y1 >= line.y2) {\n xAxisCoeficient = -1\n yAxisCoeficient = -1\n } else if (line.x1 <= line.x2 && line.y1 <= line.y2) {\n xAxisCoeficient = 1\n yAxisCoeficient = -1\n } else if (line.x1 >= line.x2 && line.y1 >= line.y2) {\n xAxisCoeficient = -1\n yAxisCoeficient = 1\n } else {\n // conditions falling to else: (line.x1 >= line.x2 && line.y1 <= line.y2)\n xAxisCoeficient = 1\n yAxisCoeficient = 1\n }\n\n const radAngle = Math.atan2(Math.abs(line.x2 - line.x1), Math.abs(line.y2 - line.y1))\n const x = line.x2 + xAxisCoeficient * (distance * Math.cos(radAngle))\n const y = line.y2 + yAxisCoeficient * (distance * Math.sin(radAngle))\n return { x, y }\n },\n\n rotatedPointCoordinates({\n rotationAxisPoint,\n angle,\n pointToRotate,\n }: {\n rotationAxisPoint: Point\n angle: number\n pointToRotate: Point\n }) {\n // return newCoordinates for pointToRotate after rotation defined by\n // angle around rotationAxisPoint\n const sin = Math.sin(angle)\n const cos = Math.cos(angle)\n const rotatedX =\n cos * (pointToRotate.x - rotationAxisPoint.x) +\n sin * (pointToRotate.y - rotationAxisPoint.y) +\n rotationAxisPoint.x\n const rotatedY =\n cos * (pointToRotate.y - rotationAxisPoint.y) -\n sin * (pointToRotate.x - rotationAxisPoint.x) +\n rotationAxisPoint.y\n return { x: rotatedX, y: rotatedY }\n },\n sharedPointLinesAngle({\n sharedPoint,\n oldLinePoint,\n newLinePoint,\n }: {\n sharedPoint: Point\n oldLinePoint: Point\n newLinePoint: Point\n }) {\n // return angle between line from sharedPoint to oldLinePoint and\n // line from sharedPoint to newLinePoint\n const numerator =\n oldLinePoint.y * (sharedPoint.x - newLinePoint.x) +\n sharedPoint.y * (newLinePoint.x - oldLinePoint.x) +\n newLinePoint.y * (oldLinePoint.x - sharedPoint.x)\n const denominator =\n (oldLinePoint.x - sharedPoint.x) * (sharedPoint.x - newLinePoint.x) +\n (oldLinePoint.y - sharedPoint.y) * (sharedPoint.y - newLinePoint.y)\n const ratio = numerator / denominator\n\n return Math.atan(ratio)\n },\n\n twoSegmentLinesIntersection(p1: Point, p2: Point, p3: Point, p4: Point) {\n // line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/\n // Determine the intersection point of two line segments\n // Return FALSE if the lines don't intersect\n\n // Check if none of the lines are of length 0\n if ((p1.x === p2.x && p1.y === p2.y) || (p3.x === p4.x && p3.y === p4.y)) {\n return false\n }\n\n const denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y)\n\n // Lines are parallel\n if (denominator === 0) {\n return false\n }\n\n const ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator\n const ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator\n\n // is the intersection along the segments\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\n return false\n }\n\n // Return a object with the x and y coordinates of the intersection\n const x = p1.x + ua * (p2.x - p1.x)\n const y = p1.y + ua * (p2.y - p1.y)\n\n return { x, y }\n },\n\n // https://stackoverflow.com/a/60368757\n checkLineIntersection(line1_p1: Point, line1_p2: Point, line2_p1: Point, line2_p2: Point) {\n // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\n let a, b\n const result: { x: number; y: number; onLine1: boolean; onLine2: boolean } = {\n x: 0,\n y: 0,\n onLine1: false,\n onLine2: false,\n }\n const denominator =\n (line2_p2.y - line2_p1.y) * (line1_p2.x - line1_p1.x) - (line2_p2.x - line2_p1.x) * (line1_p2.y - line1_p1.y)\n if (denominator === 0) {\n return false\n }\n\n a = line1_p1.y - line2_p1.y\n b = line1_p1.x - line2_p1.x\n const numerator1 = (line2_p2.x - line2_p1.x) * a - (line2_p2.y - line2_p1.y) * b\n const numerator2 = (line1_p2.x - line1_p1.x) * a - (line1_p2.y - line1_p1.y) * b\n a = numerator1 / denominator\n b = numerator2 / denominator\n\n // if we cast these lines infinitely in both directions, they intersect here:\n result.x = line1_p1.x + a * (line1_p2.x - line1_p1.x)\n result.y = line1_p1.y + a * (line1_p2.y - line1_p1.y)\n\n // if line1 is a segment and line2 is infinite, they intersect if:\n if (a > 0 && a < 1) {\n result.onLine1 = true\n }\n // if line2 is a segment and line1 is infinite, they intersect if:\n if (b > 0 && b < 1) {\n result.onLine2 = true\n }\n // if line1 and line2 are segments, they intersect if both of the above are true\n return result\n },\n\n // ray is considered line1, segment is considered line2\n getRayToLineSegmentIntersection(rayOrigin: Point, rayEnd: Point, segmentStart: Point, segmentEnd: Point) {\n const lineIntersection = this.checkLineIntersection(rayOrigin, rayEnd, segmentStart, segmentEnd)\n\n if (\n !lineIntersection ||\n lineIntersection.onLine1 ||\n this.dotProduct(\n this.subtractPoints(rayOrigin, lineIntersection as Point),\n this.subtractPoints(rayOrigin, rayEnd)\n ) <= 0\n )\n return false\n return { ...lineIntersection, x: Math.round(lineIntersection.x), y: Math.round(lineIntersection.y) } // sometimes edge value can have crazy precision instead of `0` something like `5.684341886080802e-14` which is basically 0.00000000000005684341886080802 we should round it\n },\n\n getMiddlePointOnLineSegment(P1: Point, P2: Point) {\n const x = (P1.x - P2.x) / 2 + P2.x\n const y = (P1.y - P2.y) / 2 + P2.y\n return { x, y }\n },\n\n normalizeVector(v: Point) {\n const length = Math.sqrt(v.x * v.x + v.y * v.y)\n return { x: v.x / length, y: v.y / length }\n },\n\n multiplyVectorByScalar(v: Point, scalar: number) {\n return { x: v.x * scalar, y: v.y * scalar }\n },\n\n addPoints(P1: Point, P2: Point) {\n return { x: P1.x + P2.x, y: P1.y + P2.y }\n },\n\n subtractPoints(P1: Point, P2: Point): Point {\n return { x: P1.x - P2.x, y: P1.y - P2.y }\n },\n}\n\nexport default math\n","import Spine from '@finviz/spine'\n\nexport const defaults = {\n enabled: false,\n collapsed: true,\n duration: false,\n timestamp: true,\n logErrors: true,\n withStackTrace: false,\n level: 'log',\n logger: console,\n filterChanges: (model, attrs) => {\n const props = Object.keys(attrs)\n return (\n model.constructor.name === 'Mouse' ||\n model.constructor.name === 'Quote' ||\n (props.length === 1 && (props[0] === 'scale' || props[0] === 'leftOffset'))\n )\n },\n errorTransformer: (error) => error,\n titleFormatter: ({ timestamp, duration }, title, time, took) => {\n const parts = ['model']\n parts.push(`%c${String(title)}`)\n if (timestamp) {\n parts.push(`%c@ ${time}`)\n }\n if (duration) {\n parts.push(`%c(in ${took.toFixed(2)} ms)`)\n }\n return parts.join(' ')\n },\n colors: {\n title: () => 'inherit',\n prevState: () => '#9E9E9E',\n action: () => '#03A9F4',\n nextState: () => '#4CAF50',\n error: () => '#F20404',\n },\n}\n\nconst repeat = (str, times) => new Array(times + 1).join(str)\nconst pad = (num, maxLength = 2) => repeat('0', maxLength - num.toString().length) + num\nconst formatTime = (time) =>\n `${pad(time.getHours())}:${pad(time.getMinutes())}:${pad(time.getSeconds())}.${pad(time.getMilliseconds(), 3)}`\n\nexport const printLogEntry = (logEntry, options = {}) => {\n const { logger, logErrors, titleFormatter, collapsed, timestamp, duration, withStackTrace, colors, level } = {\n ...defaults,\n ...options,\n }\n const { startedTime, title, prevState, data, error, nextState, took } = logEntry\n\n const formattedTime = formatTime(startedTime)\n const titleCSS = colors.title ? `color: ${colors.title(title)};` : ''\n const headerCSS = ['color: gray; font-weight: lighter;']\n headerCSS.push(titleCSS)\n if (timestamp) {\n headerCSS.push('color: gray; font-weight: lighter;')\n }\n if (duration) {\n headerCSS.push('color: gray; font-weight: lighter;')\n }\n const formattedTitle = titleFormatter(defaults, title, formattedTime, took)\n\n try {\n if (collapsed) {\n if (colors.title) {\n logger.groupCollapsed(`%c ${formattedTitle}`, ...headerCSS)\n } else {\n logger.groupCollapsed(formattedTitle)\n }\n } else if (colors.title) {\n logger.group(`%c ${formattedTitle}`, ...headerCSS)\n } else {\n logger.group(formattedTitle)\n }\n } catch (e) {\n logger.log(formattedTitle)\n }\n\n if (colors.prevState) {\n const styles = `color: ${colors.prevState(prevState)}; font-weight: bold`\n logger[level]('%c prev state', styles, prevState)\n } else {\n logger[level]('prev state', prevState)\n }\n\n if (colors.action) {\n const styles = `color: ${colors.action(data)}; font-weight: bold`\n logger[level]('%c arguments ', styles, data)\n } else {\n logger[level]('arguments ', data)\n }\n\n if (error && logErrors) {\n if (colors.error) {\n const styles = `color: ${colors.error(error, prevState)}; font-weight: bold;`\n logger['error']('%c error ', styles, error)\n } else {\n logger['error']('error ', error)\n }\n }\n\n if (colors.nextState) {\n const styles = `color: ${colors.nextState(nextState)}; font-weight: bold`\n logger[level]('%c next state', styles, nextState)\n } else {\n logger[level]('next state', nextState)\n }\n\n if (withStackTrace) {\n logger.groupCollapsed('TRACE')\n logger.trace()\n logger.groupEnd()\n }\n\n try {\n logger.groupEnd()\n } catch (e) {\n logger.log('—— log end ——')\n }\n}\n\nexport const initialize = () => {\n window['logger'] = defaults\n\n const protoModelLoad = Spine.Model.prototype.load\n Spine.Model.prototype.load = function (attrs) {\n if (defaults.enabled && !defaults.filterChanges(this, attrs)) {\n const started = Date.now()\n const logEntry = {\n title: `${this.constructor.name}[#${this.id || this.cid}]`,\n started: started,\n startedTime: new Date(started),\n prevState: this.attributes(),\n data: attrs,\n }\n\n let returnedValue\n try {\n returnedValue = protoModelLoad.apply(this, arguments)\n } catch (e) {\n logEntry.error = e\n }\n\n logEntry.nextState = this.attributes()\n logEntry.took = Date.now() - logEntry.started\n\n printLogEntry(logEntry)\n return returnedValue\n } else {\n return protoModelLoad.apply(this, arguments)\n }\n }\n}\n","import ChartEvent from '../chart-events/chart-event'\nimport ElementModel from '../models/element'\nimport Pane from './pane'\n\nclass ChartEventElement extends ElementModel {\n static initClass(paneModel: typeof Pane) {\n this.configure('ChartEventElement', 'instance', 'lastChange', 'zIndex', 'yIndex', 'elementId')\n this.belongsTo('pane', paneModel)\n }\n\n declare instance: ChartEvent\n yIndex = 0\n\n getChartEventData() {\n return this.instance.model\n .chart()\n .quote()\n ?.chartEvents?.find((stockEvent) => stockEvent.elementId === this?.elementId)\n }\n\n toObject() {\n return {\n ...super.toObject(),\n yIndex: this.yIndex,\n }\n }\n\n toConfig() {\n return {\n ...super.toConfig(),\n yIndex: this.yIndex,\n }\n }\n}\n\nexport default ChartEventElement\n","import Spine from '@finviz/spine'\n\nimport Chart from './chart'\n\nclass Indicator extends Spine.Model {\n static initClass(chartModel: typeof Chart) {\n this.configure('Indicator', 'instance')\n this.belongsTo('chart', chartModel)\n }\n\n declare chart: () => Chart\n\n // instance - todo - not sure what instance type to put here\n}\n\nexport default Indicator\n","import Spine from '@finviz/spine'\n\nimport Chart from './chart'\n\nclass Overlay extends Spine.Model {\n static initClass(chartModel: typeof Chart) {\n this.configure('Overlay', 'overlay')\n this.belongsTo('chart', chartModel)\n }\n\n declare overlay: any\n declare chart: () => Chart\n}\n\nexport default Overlay\n","/**\n * This file sets up the relationships between models and solves circular dependencies\n * This file needs to be imported in the index file so that the relationships are\n * called in time for instantiation.\n */\nimport Chart from './chart'\nimport ChartEventElement from './chart-event-element'\nimport ChartLayout from './chart_layout'\nimport DrawingsInternalStore from './drawings-internal-store'\nimport Element from './element'\nimport Indicator from './indicator'\nimport Overlay from './overlay'\nimport Pane from './pane'\nimport Quote from './quote'\n\nChart.initClass(Pane, Quote, ChartLayout)\nChartLayout.initClass(Chart, DrawingsInternalStore)\nDrawingsInternalStore.initClass()\nElement.initClass(Pane)\nChartEventElement.initClass(Pane)\nIndicator.initClass(Chart)\nOverlay.initClass(Chart)\nPane.initClass(Element, ChartEventElement, Chart)\n","import 'lib/shims'\n\nimport { initialize } from './logger'\nimport './models/relationships'\n\nif (document.location.hostname === 'localhost') {\n initialize()\n}\n","import Spine from '@finviz/spine'\nimport merge from 'lodash.merge'\n\nimport {\n ChartConfigChartPaneElement,\n CustomSpineEvents,\n IModalConfig,\n IModalConfigInput,\n ObjectHash,\n PaneArea,\n RequireByKey,\n Theme,\n} from '../../types/shared'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport tailwindColors from '../constants/colors'\nimport {\n FONT_SIZE,\n INDICATOR_LABEL_HEIGHT,\n IndicatorType,\n OFFSET,\n PADDING,\n SpecificChartFunctionality,\n TextAlign,\n TextBaseline,\n} from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport mouseModel from '../models/mouse'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport { isRedesignEnabled } from '../utils'\nimport { roundedRect } from '../utils/canvas-render'\nimport { renderCross } from '../utils/chart'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getIsSSr, getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\n\nconst INDICATOR_DEFAULT_DOMAIN = (indicator: IndicatorType) => {\n switch (indicator) {\n case IndicatorType.Rvol:\n return { min: 0, max: 2 }\n case IndicatorType.Atr:\n return { min: 0, max: 10 }\n case IndicatorType.Adx:\n case IndicatorType.Aro:\n case IndicatorType.Mfi:\n case IndicatorType.Perf:\n case IndicatorType.Rmi:\n case IndicatorType.Rsi:\n case IndicatorType.Stofu:\n case IndicatorType.Ult:\n return { min: 0, max: 100 }\n case IndicatorType.Macd:\n case IndicatorType.Rwi:\n case IndicatorType.Trix:\n return { min: -1, max: 1 }\n case IndicatorType.Wr:\n return { min: -100, max: 0 }\n case IndicatorType.Aroosc:\n case IndicatorType.Roc:\n return { min: -100, max: 100 }\n case IndicatorType.Cci:\n case IndicatorType.Fi:\n return { min: -200, max: 200 }\n default:\n return { min: 0, max: 100 }\n }\n}\n\nexport interface IIndicatorIsValid {\n getIsValid(key: string): boolean | void\n}\n\nclass Indicator extends Spine.Module implements IIndicatorIsValid {\n static type = IndicatorType.Indicator\n static label = 'Indicator'\n\n static initClass() {\n Object.defineProperty(this.prototype, 'height', {\n get() {\n return this.model.height\n },\n })\n Object.defineProperty(this.prototype, 'contentHeight', {\n get() {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n return this.height - IndicatorSettings.top.height - IndicatorSettings.bottom.height\n },\n })\n }\n\n static fromObject(values: ObjectHash, model: Pane) {\n const indicator = new this(values, model)\n indicator.set(values)\n return indicator\n }\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\n return periodInt\n }\n\n declare data: Quote\n declare min: number\n declare max: number\n declare contentHeight: number\n declare height: number\n\n attrs: Attrs\n model: Pane\n labelWidth = 0\n fetchedAt = -1\n leftOffset = 0\n width = 0\n contentWidth = 0\n lastValue: number | null = null\n shouldUpdate = true\n tickers: string | null = null\n period?: string | number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.attrs = attrs\n this.model = model\n this.data = this.model.chart().quote()\n\n this.renderYAxis = this.renderYAxis.bind(this)\n this.renderCrossText = this.renderCrossText.bind(this)\n\n this.model.chart().bind('update', this.trigger.bind(this, 'change'))\n this.model.bind('update change', this.trigger.bind(this, 'change'))\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\n this.model.bind('destroy', () => {\n mouseModel.unbind('change', mouseModelChangeHandler)\n })\n mouseModel.bind('change', mouseModelChangeHandler)\n\n this.model.chart().chart_layout().bind('theme', this.setupCache.bind(this))\n }\n\n get type() {\n return (this.constructor as typeof Indicator).type\n }\n\n get label() {\n return (this.constructor as typeof Indicator).label\n }\n\n render(context: CanvasRenderingContext2D) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n this.data = this.model.chart().quote()\n this.leftOffset = this.model.chart().leftOffset\n this.width = this.model.chart().width\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\n\n this.compute()\n\n this.setupCache()\n\n this.renderYAxis(context)\n\n context.save()\n this.clip(context)\n this.renderXAxis(context)\n const translate = getTranslate({\n context,\n xOffset: this.leftOffset + IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n this.renderIndicator(context)\n translate.undo()\n context.restore()\n\n if (!this.getIsChartPageSpecificFunctionality()) {\n this.renderLabel(context)\n }\n }\n\n isComputeNecessary() {\n // if quote was updated (this.fetchedAt !== this.data.fetchedAt)\n // or indicator setting was changed via modal (this.shouldUpdate)\n // allow compute and update variables to prevent another unless\n // those variables change again\n if (this.fetchedAt !== this.data.fetchedAt || this.shouldUpdate) {\n this.fetchedAt = this.data.fetchedAt\n this.shouldUpdate = false\n return true\n }\n return false\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n let y\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const ticks = this.model.scale.y.ticks(10)\n const tickTextStep = Math.abs(ticks[2] - ticks[0])\n const yLine = new Line(\n {\n x1: 0,\n x2: this.contentWidth,\n strokeStyle: Colors.grid,\n dashLength: 3,\n },\n this.model\n )\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n for (let index = 0; index < ticks.length; index++) {\n const tick = ticks[index]\n y = Math.round(this.fy(tick))\n yLine.set({ y1: y, y2: y }).render(context)\n if (index % 2 === 0) {\n text.set({ text: this.formatAxis(tick, tickTextStep), y }).render(context)\n }\n }\n\n const minY = 0\n const maxY = this.contentHeight\n const valueY = this.lastValue === null ? 0 : Math.round(this.fy(this.lastValue))\n if (this.lastValue != null && valueY >= minY && valueY <= maxY) {\n new Text(\n {\n text: math.formatBigNumber(this.lastValue, 2),\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\n y: valueY,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\n padding: {\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.indicatorCurrentText,\n background: Colors.indicatorCurrentBackground,\n },\n this.model\n ).render(context)\n }\n\n translate.undo()\n }\n\n renderXAxis(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const xLine = new Line(\n {\n x1: 0,\n x2: 0,\n y1: 0,\n y2: this.contentHeight,\n strokeStyle: Colors.grid,\n dashLength: 3,\n },\n this.model\n )\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n for (let tick = 0, end = this.data.date.length; tick < end; tick += 10) {\n const x = Math.round(this.fx(tick) + this.leftOffset)\n if (x < -15 || x > this.width + 15) {\n // margin?\n continue\n }\n xLine.set({ x1: x, x2: x }).render(context)\n }\n translate.undo()\n }\n\n renderLabel(context: CanvasRenderingContext2D) {\n if (this.getIsChartPageSpecificFunctionality()) {\n this.renderLabelChartsPage(context)\n } else {\n this.renderLabelQuotePage(context)\n }\n }\n\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const label = new Text(\n {\n text: this.toString(),\n x: IndicatorSettings.left.indicatorLabel.margin.left,\n y: IndicatorSettings.left.indicatorLabel.margin.top,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.model\n )\n this.labelWidth = label.measure(context)\n return label.render(context)\n }\n\n renderLabelChartsPage(context: CanvasRenderingContext2D): { x: number; y: number; labelWidth: number } | void {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n const { theme, specificChartFunctionality } = this.model.chart().chart_layout()\n const isDarkMode = theme === Theme.dark\n const x =\n specificChartFunctionality === SpecificChartFunctionality.quotePage\n ? OFFSET.S\n : IndicatorSettings.left.indicatorLabel.margin.left!\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\n const label = new Text(\n {\n text: this.toString(),\n x: x * 2,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n this.labelWidth = label.measure(context) + IndicatorSettings.left.indicatorLabel.margin.left! * 2\n label.set({ y: y + (INDICATOR_LABEL_HEIGHT - label.attrs.lineHeight / 2) })\n roundedRect({\n ctx: context,\n x,\n y,\n height: INDICATOR_LABEL_HEIGHT,\n width: this.labelWidth,\n radius: 6,\n color: `${tailwindColors.gray[isDarkMode ? 700 : 50]}cc`,\n })\n label.render(context)\n\n return { x, y, labelWidth: this.labelWidth }\n }\n\n renderCross(context: CanvasRenderingContext2D) {\n renderCross({\n context,\n mouseModel,\n paneModel: this.model,\n quote: this.data,\n contentWidth: this.contentWidth,\n contentHeight: this.contentHeight,\n isIndicator: true,\n isPerfIndicator: this.type === IndicatorType.Perf,\n onRenderCrossText: !this.getIsChartPageSpecificFunctionality() ? this.renderCrossText : undefined,\n })\n\n if (this.getIsChartPageSpecificFunctionality()) {\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.model))\n }\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n this.data = this.model.chart().quote()\n const index = Number.isNaN(crossIndex) ? this.data.close.length - 1 : crossIndex\n if (this.getIsChartPageSpecificFunctionality()) {\n this.renderLabelChartsPage(context)\n\n this.renderCrossTextChartsPage(context, index)\n } else {\n this.renderCrossTextQuotePage(context, index)\n }\n }\n\n renderCrossTextChartsPage(_: CanvasRenderingContext2D, __: number) {}\n\n renderCrossTextQuotePage(_: CanvasRenderingContext2D, __: number) {}\n\n renderOversoldOverbought(\n context: CanvasRenderingContext2D,\n array: number[],\n from: number,\n oversold: number,\n zero: number,\n overbought: number,\n drawLines?: boolean\n ) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n if (this.data.close.length === 0) return\n\n if (drawLines == null) {\n drawLines = true\n }\n\n context.save()\n\n let clipHeight = Math.round(this.fy(oversold) - this.fy(this.model.scale.y.domain()[1]))\n if (clipHeight <= 0 || getIsSSr()) {\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(this.model.scale.y.domain()[1]) + 1, // compensation to addition of 1 in clip function\n this.contentWidth,\n clipHeight < 0 ? clipHeight - 1 : -1 // clipHeight - 1 is a compensation to addition of 1 in clip function ; fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\n )\n }\n context.clip()\n context.set('fillStyle', '#87ceef')\n\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(this.model.scale.y.domain()[0])))\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: from,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(array[i])))\n },\n })\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[0])))\n context.fill()\n context.restore()\n if (drawLines) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(oversold)),\n y2: Math.round(this.fy(oversold)),\n strokeStyle: '#69c1ea',\n },\n this.model\n ).render(context)\n }\n\n if (drawLines) {\n this.renderZeroLine(context, zero)\n }\n\n context.save()\n clipHeight = Math.round(this.fy(overbought))\n if (clipHeight >= 0 || getIsSSr()) {\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(this.model.scale.y.domain()[0]),\n this.contentWidth,\n clipHeight > 0 ? clipHeight : 1 // // fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\n )\n }\n\n context.clip()\n context.set('fillStyle', '#dc9fe5')\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(this.model.scale.y.domain()[1])))\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(array[i])))\n },\n })\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[1]) + 1))\n context.fill()\n context.restore()\n if (drawLines) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(overbought)),\n y2: Math.round(this.fy(overbought)),\n strokeStyle: '#d386df',\n },\n this.model\n ).render(context)\n }\n\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\n context.set('fillStyle', '#dc9fe5')\n\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(Math.round(x), Math.round(this.fy(array[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderZeroLine(context: CanvasRenderingContext2D, zero: number) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(zero)),\n y2: Math.round(this.fy(zero)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n }\n\n setupCache() {}\n\n clip(context: CanvasRenderingContext2D) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n context.beginPath()\n context.rect(IndicatorSettings.left.width, IndicatorSettings.top.height, this.contentWidth, this.contentHeight + 1) // +1 shows one more pixel which is needed to be able to see a line at very bottom of an indicaor\n return context.clip()\n }\n\n formatAxis(value: number, tickStep?: number) {\n if (tickStep !== undefined && 10 > tickStep) {\n return value.toFixed(2)\n }\n return value.toString()\n }\n\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\n\n fy = (y: number) => this.model.scale.y(y)\n\n set(values: Partial) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n this.shouldUpdate = true\n for (const key in values) {\n if (key !== 'type') {\n // @ts-expect-error - values keys don't have to always match variables on the instance\n this[key] = values[key]\n }\n }\n this.width = this.model.chart().width\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\n\n const newAttrs = this.getModalConfig()\n .inputs.map(({ value }) => value.toString())\n .join(',')\n if (newAttrs) this.attrs = { ...this.attrs, period: newAttrs }\n\n this.model.trigger(CustomSpineEvents.ManualChange)\n }\n\n parsePeriodInt(values: Partial) {\n if (typeof values.period === 'string') {\n this.period = Number.parseInt(values.period, 10)\n this.model.trigger(CustomSpineEvents.ManualChange)\n }\n }\n\n setModel(model: Pane) {\n return (this.model = model)\n }\n\n isInArea(area: PaneArea) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n const x = IndicatorSettings.left.indicatorLabel.margin.left!\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\n let width = OFFSET.M * 2 + this.labelWidth\n let height = OFFSET.S * 2 + FONT_SIZE.M\n\n if (this.getIsChartPageSpecificFunctionality()) {\n width = this.labelWidth\n height = INDICATOR_LABEL_HEIGHT\n }\n\n if (x < area.cursorX && area.cursorX < width + x && y < area.cursorY && area.cursorY < height + y) {\n return true\n }\n return false\n }\n\n moveBy() {}\n\n thumbsAreInArea() {\n return false\n }\n\n computeVisibleMinMax(...arrays: number[][]) {\n let min = Number.MAX_VALUE\n let max = -Number.MAX_VALUE\n\n const { leftOffset } = this.model.chart()\n for (const arr of arrays) {\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\n // margin?\n continue\n }\n\n if (min > arr[i]) {\n min = arr[i]\n }\n if (max < arr[i]) {\n max = arr[i]\n }\n }\n }\n\n return min !== max ? { min, max } : this.getDomainDefaults(this.type)\n }\n\n getModalConfig(): IModalConfig {\n return {\n title: '',\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n getDomainDefaults = (indicatorType: IndicatorType) => INDICATOR_DEFAULT_DOMAIN(indicatorType)\n\n getMinMax() {\n this.data = this.model.chart().quote()\n this.compute()\n return { min: this.min, max: this.max }\n }\n\n toObject() {\n return merge({}, this.attrs, { type: this.type, tickers: this.tickers })\n }\n\n toConfig(): T['attrs'] & { type: T['type'] } {\n return {\n type: this.type,\n period: this.getModalConfig()\n .inputs.map((input: IModalConfigInput) => input.value.toString())\n .join(','),\n }\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.model.chart().chart_layout())\n }\n\n renderIndicator(_: CanvasRenderingContext2D) {\n throw Error('Implement renderIndicator method')\n }\n\n getIsValid(_: string): boolean | undefined {\n throw Error('Implement')\n }\n\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\n }\n\n getIsChartPageSpecificFunctionality() {\n const { specificChartFunctionality } = this.model.chart().chart_layout()\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isRedesignedFuturesForexCrypto =\n isRedesignEnabled() &&\n [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n SpecificChartFunctionality.quotePage,\n ].includes(specificChartFunctionality)\n\n return isCharts || isRedesignedFuturesForexCrypto\n }\n\n getIsDrawing() {\n return false\n }\n\n getIsChartEvent() {\n return false\n }\n\n compute() {\n throw Error('Implement compute method')\n }\n}\n\nIndicator.initClass()\n\nexport default Indicator\n","export function roundedRect({\n ctx,\n x,\n y,\n width,\n height,\n radius,\n color,\n}: {\n ctx: CanvasRenderingContext2D\n x: number\n y: number\n width: number\n height: number\n radius: number\n color: string\n}) {\n ctx.translate(0.5, 0.5)\n ctx.set('strokeStyle', color)\n ctx.set('fillStyle', color)\n ctx.beginPath()\n ctx.moveTo(x, y + radius)\n ctx.lineTo(x, y + height - radius)\n ctx.arcTo(x, y + height, x + radius, y + height, radius)\n ctx.lineTo(x + width - radius, y + height)\n ctx.arcTo(x + width, y + height, x + width, y + height - radius, radius)\n ctx.lineTo(x + width, y + radius)\n ctx.arcTo(x + width, y, x + width - radius, y, radius)\n ctx.lineTo(x + radius, y)\n ctx.arcTo(x, y, x, y + radius, radius)\n ctx.stroke()\n ctx.fill()\n ctx.translate(-0.5, -0.5)\n}\n","import { IndicatorType } from '../constants/common'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ADX extends Indicator {\n static type = IndicatorType.Adx\n static label = 'ADX'\n\n declare period: number\n pdi: number[] = []\n mdi: number[] = []\n adx: number[] = []\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n let adx, amdm, apdm, mdi, pdi\n this.pdi = []\n this.mdi = []\n this.adx = []\n let atr = (apdm = amdm = adx = 0)\n for (let i = this.period; i < this.data.close.length; i++) {\n const deltaHigh = this.data.high[i] - this.data.high[i - 1]\n const deltaLow = this.data.low[i - 1] - this.data.low[i]\n\n let pdm = 0\n if (deltaHigh > 0 && deltaHigh > deltaLow) {\n pdm = deltaHigh\n }\n\n let mdm = 0\n if (deltaLow > 0 && deltaLow > deltaHigh) {\n mdm = deltaLow\n }\n\n const tr = utils.max([\n this.data.high[i] - this.data.low[i],\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\n ])\n\n atr = (atr * (this.period - 1) + tr) / this.period\n apdm = (apdm * (this.period - 1) + pdm) / this.period\n amdm = (amdm * (this.period - 1) + mdm) / this.period\n\n pdi = atr > 0 ? (apdm * 100) / atr : 0\n mdi = atr > 0 ? (amdm * 100) / atr : 0\n const di = Math.abs(pdi - mdi)\n const dx = pdi + mdi > 0 ? (di * 100) / (pdi + mdi) : 0\n adx = (adx * (this.period - 1) + dx) / this.period\n\n this.pdi[i] = pdi\n this.mdi[i] = mdi\n this.adx[i] = adx\n }\n this.lastValue = this.adx.last() ?? null\n }\n const { min, max } =\n this.pdi.length > 0 || this.mdi.length > 0 || this.adx.length > 0\n ? this.computeVisibleMinMax(this.pdi, this.mdi, this.adx)\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', '#2eb12e')\n context.beginPath()\n\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.pdi[i])))\n },\n })\n\n context.stroke()\n\n context.set('strokeStyle', '#d43737')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.mdi[i])))\n },\n })\n context.stroke()\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.beginPath()\n\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.adx[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ADX ${this.period}`\n }\n}\n\nexport default ADX\n","import Text from '../canvas/text'\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nconst COLORS = {\n aroonUp: '#00a000',\n aroonDown: '#c80000',\n}\n\nclass Aroon extends Indicator {\n static type = IndicatorType.Aro\n static label = 'Aroon'\n\n aroonUp: number[] = []\n aroonDown: number[] = []\n declare period: number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.renderYAxis = this.renderYAxis.bind(this)\n }\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.aroonUp = []\n this.aroonDown = []\n\n const startAt = this.period - 1\n for (let i = startAt; i < this.data.close.length; i++) {\n const highPeriod = this.data.high.slice(i - startAt, i + 1)\n const highestInPeriod = Math.max(...highPeriod)\n const periodSinceHigh = this.period - (highPeriod.indexOf(highestInPeriod) + 1)\n this.aroonUp[i] = 100 * ((this.period - periodSinceHigh) / this.period)\n\n const lowPeriod = this.data.low.slice(i - startAt, i + 1)\n const lowestInPeriod = Math.min(...lowPeriod)\n const periodSinceLow = this.period - (lowPeriod.indexOf(lowestInPeriod) + 1)\n this.aroonDown[i] = 100 * ((this.period - periodSinceLow) / this.period)\n }\n\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', COLORS.aroonDown)\n context.beginPath()\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.aroonDown[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', COLORS.aroonUp)\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.aroonUp[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n super.renderYAxis(context)\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\n padding: {\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.indicatorCurrentText,\n },\n this.model\n )\n const textLabels = []\n if (this.aroonDown.length > 0) {\n textLabels.push({\n text: this.aroonDown.last()!.toFixed(2),\n y: Math.round(this.fy(this.aroonDown.last()!)),\n background: COLORS.aroonDown,\n })\n }\n if (this.aroonUp.length > 0) {\n textLabels.push({\n text: this.aroonUp.last()!.toFixed(2),\n y: Math.round(this.fy(this.aroonUp.last()!)),\n background: COLORS.aroonUp,\n })\n }\n\n const minY = 0\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\n textLabels.forEach((labelSetting) => {\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\n text.set(labelSetting).render(context)\n }\n })\n\n translate.undo()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 25,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Aroon ${this.period}`\n }\n}\n\nexport default Aroon\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass AroonOscillator extends Indicator {\n static type = IndicatorType.Aroosc\n static label = 'Aroon Oscillator'\n\n oscillator: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.oscillator = []\n\n const startAt = this.period - 1\n for (let i = startAt; i < this.data.close.length; i++) {\n const highPeriod = this.data.high.slice(i - startAt, i + 1)\n const highestInPeriod = Math.max(...highPeriod)\n const periodSinceHigh = this.period - highPeriod.indexOf(highestInPeriod)\n const aroonUp = 100 * ((this.period - periodSinceHigh) / this.period)\n\n const lowPeriod = this.data.low.slice(i - startAt, i + 1)\n const lowestInPeriod = Math.min(...lowPeriod)\n const periodSinceLow = this.period - lowPeriod.indexOf(lowestInPeriod)\n const aroonDown = 100 * ((this.period - periodSinceLow) / this.period)\n\n this.oscillator[i] = aroonUp - aroonDown\n }\n\n this.lastValue = this.oscillator.last() ?? null\n }\n\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.oscillator, this.period, 0, 0, 0, false)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 25,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Aroon Oscillator ${this.period}`\n }\n}\n\nexport default AroonOscillator\n","import { IndicatorType } from '../constants/common'\nimport AverageTrueRange from '../helpers/atr'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ATR extends Indicator {\n static type = IndicatorType.Atr\n static label = 'Average True Range'\n\n atr: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.atr = []\n const atr = new AverageTrueRange(this.period)\n for (let i = 0; i < this.data.close.length; i++) {\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\n this.atr[i] = atr.value\n }\n\n this.lastValue = this.atr.last() ?? null\n }\n const { min, max } = this.atr.length > 0 ? this.computeVisibleMinMax(this.atr) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.atr[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ATR ${this.period}`\n }\n}\n\nexport default ATR\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nconst constant = 0.015\nclass CommodityChannelIndex extends Indicator {\n static type = IndicatorType.Cci\n static label = 'Commodity Channel Index'\n\n cci: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n let smaCount\n const tp = []\n this.cci = []\n let smaSum = (smaCount = 0)\n for (let i = 0; i < this.data.close.length; i++) {\n let devCount\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\n tp[i] = typicalPrice\n\n smaSum += typicalPrice\n smaCount++\n if (smaCount > this.period) {\n smaSum -= tp[i - this.period]\n smaCount--\n }\n const sma = smaSum / smaCount\n\n if (i < this.period - 1) {\n continue\n }\n\n let devSum = (devCount = 0)\n for (let j = i - this.period + 1; j <= i; j++) {\n devSum += Math.abs(tp[j] - sma)\n devCount++\n }\n\n const dev = devSum / devCount\n this.cci[i] = 0\n if (dev > 0) {\n this.cci[i] = (typicalPrice - sma) / (constant * dev)\n }\n }\n\n this.lastValue = this.cci.last() ?? null\n }\n\n const { min, max } = this.cci.length > 0 ? this.computeVisibleMinMax(this.cci) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.cci, this.period, -100, 0, 100)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 20,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `CCI ${this.period}`\n }\n}\n\nexport default CommodityChannelIndex\n","import * as d3 from 'd3'\n\nimport { ObjectHash, Theme } from '../../types/shared'\nimport Text from '../canvas/text'\nimport tailwindColors from '../constants/colors'\nimport { INDICATOR_LABEL_HEIGHT, IndicatorType, TextAlign, TextBaseline } from '../constants/common'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\nexport interface ICOT {\n code: string\n name: string\n units: string\n commercialHedgers: number[]\n largeTraders: number[]\n smallTraders: number[]\n}\n\ninterface Attrs {\n period: string\n code: string\n}\n\ntype ColorsKeys = keyof Pick\n\nclass COT extends Indicator {\n static type = IndicatorType.Cot\n static label = 'COT'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n declare colors: ObjectHash\n\n compute() {\n if (!this.isComputeNecessary() || !this.data.COTs) return\n const cotQuoteCode = Object.keys(this.data.COTs)[0]\n if (!this.attrs.code && cotQuoteCode) {\n this.attrs.code = cotQuoteCode\n }\n const cot = this.data.COTs[this.attrs.code]\n const [min, max] = utils.minMax(cot.commercialHedgers, cot.largeTraders, cot.smallTraders)\n this.max = Math.max(Math.abs(max), Math.abs(min))\n this.min = -this.max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (!this.data.COTs) return\n context.translate(0.5, 0.5)\n for (const key in this.colors) {\n context.set('strokeStyle', this.colors[key as ColorsKeys])\n context.beginPath()\n const data = this.data.COTs[this.attrs.code][key as ColorsKeys]\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(data[i])))\n },\n })\n context.stroke()\n }\n context.translate(-0.5, -0.5)\n }\n\n renderLabel(context: CanvasRenderingContext2D) {\n if (!this.data.COTs) return\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const name = new Text(\n {\n text: this.toString(),\n x: 8,\n y: 16,\n font: { size: 10, style: 'bold' },\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.bottom,\n },\n this.model\n )\n name.render(context)\n\n new Text(\n {\n text: this.data.COTs[this.attrs.code].units as string,\n x: 38 + name.measure(),\n y: 16,\n font: { size: 8 },\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.bottom,\n },\n this.model\n ).render(context)\n\n this.renderAdditionalLabels(context)\n }\n\n renderLabelChartsPage(context: CanvasRenderingContext2D) {\n const { x, y, labelWidth } = super.renderLabelChartsPage(context) as { x: number; y: number; labelWidth: number }\n\n const { IndicatorSettings } = this.getChartLayoutSettings()\n const isDarkMode = this.model.chart().chart_layout().theme === Theme.dark\n const secondarylabelX = labelWidth + x * 2\n const fontSettings = IndicatorSettings.left.indicatorLabel.font\n const scaleCoefficient = 0.7\n\n const secondarylabel = new Text(\n {\n text: this.data.COTs[this.attrs.code].units as string,\n x: secondarylabelX + x,\n font: Text.getMergedPropsWithDefaults('font', {\n ...fontSettings,\n size: fontSettings.size ? fontSettings.size * scaleCoefficient : undefined,\n style: 'normal',\n }),\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n secondarylabel.set({\n y: y + (INDICATOR_LABEL_HEIGHT * scaleCoefficient - (secondarylabel.attrs.lineHeight * scaleCoefficient) / 2),\n })\n secondarylabel.render(context)\n\n this.renderAdditionalLabels(context)\n }\n\n renderAdditionalLabels(context: CanvasRenderingContext2D) {\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n\n new Text(\n {\n text: 'COT',\n x: 23,\n y: IndicatorSettings.top.height + (IndicatorSettings.bottom.height + this.contentHeight) / 2,\n angle: -90,\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.model\n ).render(context)\n\n const text = new Text(\n {\n text: 'Commercial Hedgers',\n x: IndicatorSettings.left.width,\n y: IndicatorSettings.top.height + this.contentHeight + IndicatorSettings.bottom.height - 1, // allign to very bottom of indicator with 1 pixel bottom padding\n font: { size: 8, style: 'bold' },\n fillStyle: this.colors.commercialHedgers,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.bottom,\n },\n this.model\n )\n text.render(context)\n\n let x = text.get('x')! + 8 + text.measure()\n text.set({ text: 'Large Traders', x, fillStyle: this.colors.largeTraders })\n text.render(context)\n\n x += 8 + text.measure()\n text.set({ text: 'Small Traders', x, fillStyle: this.colors.smallTraders })\n text.render(context)\n }\n\n formatAxis(value: number) {\n // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\n const scaleY = this.model.scale.y as unknown as d3.ScaleLinear\n return scaleY.tickFormat(4, 's')(value).replace(/G/, 'B')\n }\n\n getModalConfig() {\n return {\n title: 'COT',\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toString() {\n return this.data?.COTs ? (this.data.COTs[this.attrs.code].name as string) : undefined\n }\n\n toConfig(): T['attrs'] & { type: T['type'] } {\n return {\n type: this.type,\n code: this.attrs.code,\n }\n }\n}\n\nCOT.prototype.colors = {\n commercialHedgers: '#10cc10',\n largeTraders: '#cc1010',\n smallTraders: '#1010cc',\n}\n\nexport default COT\n","import { IndicatorType } from '../constants/common'\nimport EMA from '../helpers/ema'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ForceIndex extends Indicator {\n static type = IndicatorType.Fi\n static label = 'Force Index'\n\n fi: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.fi = []\n const ema = new EMA(this.period)\n for (let i = 1; i < this.data.close.length; i++) {\n ema.add(((this.data.close[i] - this.data.close[i - 1]) * this.data.volume[i]) / 1000000)\n this.fi[i] = ema.value\n }\n this.lastValue = this.fi.last() ?? null\n }\n const { min, max } = this.fi.length > 0 ? this.computeVisibleMinMax(this.fi) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.fi, 1, 0, 0, 0, false)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 13,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `FORCE ${this.period}`\n }\n}\n\nexport default ForceIndex\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { IndicatorType } from '../constants/common'\nimport EMA from '../helpers/ema'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n fastPeriod: number\n slowPeriod: number\n signalPeriod: number\n}\n\nclass MACD extends Indicator {\n static type = IndicatorType.Macd\n static label = 'MACD'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(period)\n return Math.max(fastPeriod, slowPeriod, signalPeriod)\n }\n\n macd: number[] = []\n signal: number[] = []\n histogram: number[] = []\n declare fastPeriod: number\n declare slowPeriod: number\n declare signalPeriod: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(this.attrs.period)\n super.set({ ...values, fastPeriod, slowPeriod, signalPeriod })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.macd = []\n this.signal = []\n this.histogram = []\n const ema1 = new EMA(this.fastPeriod)\n const ema2 = new EMA(this.slowPeriod)\n const ema3 = new EMA(this.signalPeriod)\n\n for (let i = 0; i < this.data.close.length; i++) {\n ema1.add(this.data.close[i])\n ema2.add(this.data.close[i])\n const macd = ema1.value - ema2.value\n ema3.add(macd)\n const signal = ema3.value\n\n this.macd[i] = macd\n this.signal[i] = signal\n this.histogram[i] = macd - signal\n }\n\n this.lastValue = this.macd.last() ?? null\n }\n const { min, max } =\n this.macd.length > 0 || this.signal.length > 0 || this.histogram.length > 0\n ? this.computeVisibleMinMax(this.macd, this.signal, this.histogram)\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n if (this.data.close.length === 0) return\n const y = Math.round(this.fy(0))\n const w = ChartSettings.center.barWidth + ChartSettings.center.border * 2\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n }\n\n context.set('fillStyle', '#79c3e8')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.rect(x - ~~(ChartSettings.center.barWidth / 2), y, w, Math.round(this.fy(this.histogram[i]) - y))\n },\n })\n context.fill()\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\n context.beginPath()\n\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.macd[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', IndicatorSettings.general.Colors.signalLine)\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.signal[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const fastPeriod = {\n type: 'number',\n label: 'Period',\n name: 'fastPeriod',\n value: this.fastPeriod ?? 12,\n required: true,\n min: 1,\n max: 999999,\n }\n const slowPeriod = {\n type: 'number',\n label: 'Slow',\n name: 'slowPeriod',\n value: this.slowPeriod ?? 26,\n required: true,\n min: 1,\n max: 999999,\n }\n const signalPeriod = {\n type: 'number',\n label: 'Signal',\n name: 'signalPeriod',\n value: this.signalPeriod ?? 9,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [fastPeriod, slowPeriod, signalPeriod],\n inputsErrorMessages: {\n fastPeriod: `${fastPeriod.label} must be a whole number between ${fastPeriod.min} and ${fastPeriod.max}`,\n slowPeriod: `${slowPeriod.label} must be a whole number between ${slowPeriod.min} and ${slowPeriod.max}`,\n signalPeriod: `${signalPeriod.label} must be a whole number between ${signalPeriod.min} and ${signalPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'fastPeriod':\n case 'slowPeriod':\n case 'signalPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `MACD ${this.fastPeriod},${this.slowPeriod},${this.signalPeriod}`\n }\n}\n\nexport default MACD\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass MFI extends Indicator {\n static type = IndicatorType.Mfi\n static label = 'Money Flow Index'\n\n mfi: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n let negativeMoneyFlow\n const mf = []\n this.mfi = []\n let prevTypicalPrice = (this.data.close[0] + this.data.low[0] + this.data.high[0]) / 3\n let positiveMoneyFlow = (negativeMoneyFlow = 0)\n for (let i = 1; i < this.data.close.length; i++) {\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\n const moneyFlow = typicalPrice * this.data.volume[i]\n\n if (typicalPrice > prevTypicalPrice) {\n positiveMoneyFlow += moneyFlow\n mf[i] = moneyFlow\n } else if (typicalPrice < prevTypicalPrice) {\n negativeMoneyFlow += moneyFlow\n mf[i] = -moneyFlow\n }\n\n if (i > this.period) {\n const oldMF = mf[i - this.period]\n if (oldMF > 0) {\n positiveMoneyFlow -= oldMF\n } else if (oldMF < 0) {\n negativeMoneyFlow += oldMF\n }\n\n if (positiveMoneyFlow + negativeMoneyFlow > 0) {\n this.mfi[i] = (positiveMoneyFlow * 100) / (positiveMoneyFlow + negativeMoneyFlow)\n } else {\n this.mfi[i] = 50\n }\n }\n\n prevTypicalPrice = typicalPrice\n }\n\n this.lastValue = this.mfi.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.mfi, this.period, 20, 50, 80)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `MFI ${this.period}`\n }\n}\n\nexport default MFI\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\nclass None extends Indicator {\n static type = IndicatorType.None\n static label = 'None'\n\n compute() {}\n\n renderIndicator() {}\n\n toString() {\n return ''\n }\n}\n\nexport default None\n","import { IndicatorType } from '../constants/common'\nimport math from '../helpers/math'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\nclass OBV extends Indicator {\n static type = IndicatorType.Obv\n static label = 'On-Balance Volume'\n\n obv: number[] = []\n\n compute() {\n if (this.isComputeNecessary()) {\n this.obv = [0]\n\n for (let i = 1; i < this.data.volume.length; i++) {\n let currentObv = this.obv[i - 1]\n if (this.data.close[i] > this.data.close[i - 1]) {\n currentObv += this.data.volume[i]\n } else if (this.data.close[i] < this.data.close[i - 1]) {\n currentObv -= this.data.volume[i]\n }\n\n this.obv[i] = currentObv\n }\n\n this.lastValue = this.obv.last() ?? null\n }\n const { min, max } = this.obv.length > 0 ? this.computeVisibleMinMax(this.obv) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.obv[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n formatAxis(value: number) {\n return math.formatBigNumber(value, 2)\n }\n\n getModalConfig() {\n return {\n title: this.label,\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toString() {\n return 'OBV'\n }\n}\n\nexport default OBV\n","import * as d3 from 'd3'\n\nimport { ObjectHash } from '../../types/shared'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport {\n INDICATOR_LABEL_HEIGHT,\n IndicatorType,\n MOBILE_VIEW_BREAKPOINT_WIDTH,\n OFFSET,\n PADDING,\n TextAlign,\n TextBaseline,\n} from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport { getSanitizedTicker } from '../utils'\nimport { getInstrument } from '../utils/chart'\nimport { getHEXWithSpecificAplha } from '../utils/colors'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n tickers?: string\n}\n\nconst DEFAULT_TICKERS = 'SPY,QQQ'\n\nclass PricePerformance extends Indicator {\n static type = IndicatorType.Perf\n static label = 'Price Performance %'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n timeframe: string\n tickers = ''\n ready = false\n firstFetchCalled = false\n first: ObjectHash = {}\n perf: ObjectHash = {}\n quotes: ObjectHash = {}\n indicatorLabelWidth: ObjectHash = {}\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.renderYAxis = this.renderYAxis.bind(this)\n\n this.timeframe = this.model.chart().timeframe\n this.fy = d3.scaleLinear().range([0, this.contentHeight])\n if (this.attrs.period && !this.tickers) {\n this.tickers = this.attrs.period\n }\n }\n\n async compute() {\n const tickers = this.getTickers()\n const chartLayoutModel = this.model.chart().chart_layout()\n const chartUuid = chartLayoutModel.uuid\n const hasCachedData = this.getTickersAndTimeframe().every(\n ({ ticker, instrument, timeframe }) =>\n Quote.select(\n (q: Quote) =>\n q.ticker === ticker &&\n q.instrument === instrument &&\n q.timeframe === timeframe &&\n chartLayoutModel.isIdeaId(q.ideaID) &&\n chartUuid === q.chartUuid &&\n !q.isFetching\n ).length > 0\n )\n\n if (this.timeframe !== this.model.chart().quote().timeframe || (!this.ready && !this.firstFetchCalled)) {\n this.timeframe = this.model.chart().quote().timeframe\n this.firstFetchCalled = true\n\n if (!hasCachedData) {\n const data = await Quote.getAll(this.getTickersAndTimeframe())\n if (data) {\n this._compute(tickers, data)\n this.trigger('change')\n }\n } else {\n this.ready = true\n this.compute()\n }\n } else if (this.ready) {\n const data: ObjectHash = {}\n for (const ticker of tickers) {\n data[ticker] = Quote.select(\n (q: Quote) =>\n q.ticker === ticker &&\n q.timeframe === this.timeframe &&\n chartUuid === q.chartUuid &&\n chartLayoutModel.isIdeaId(q.ideaID)\n )[0]\n }\n this._compute(tickers, data)\n }\n }\n\n _compute(tickers: string[], data: ObjectHash) {\n const { leftOffset } = this.model.chart()\n let firstBarTime = null\n let lastBarTime = null\n for (let i = 0; i < this.data.close.length; i++) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.contentWidth) {\n // margin?\n continue\n }\n\n // Rendering one extra bar out of viewport ensures continuity of line, if there are missing data on intraday the indicator may have gaps\n if (firstBarTime === null) {\n firstBarTime = this.data.date[i]\n }\n\n lastBarTime = this.data.date[i]\n }\n\n data[this.data.ticker] = this.data\n this.quotes = data\n this.perf = {}\n const dateToIndex = this.data.getDateToIndex()\n for (const ticker of [this.data.ticker, ...tickers]) {\n this.perf[ticker] = []\n const d = data[ticker]\n if (!d) {\n continue\n }\n let first = null\n let index = -1\n for (let i = 0; i < d.close.length; i++) {\n const date = d.date[i]\n if (date < firstBarTime! || date > lastBarTime!) {\n continue\n }\n\n index = dateToIndex[date]\n if (index === undefined || index === null) {\n continue\n }\n\n if (first === null) {\n first = d.close[i]\n this.first[ticker] = first\n if (index > 0) {\n this.perf[ticker][index - 1] = (d.close[i] * 100) / first - 100\n }\n }\n\n this.perf[ticker][index] = (d.close[i] * 100) / first - 100\n }\n\n if (index < this.data.date.length - 1 && first !== null) {\n this.perf[ticker][index + 1] = this.perf[ticker][index]\n }\n }\n\n const perfArrays = Object.keys(this.perf).map((x) => this.perf[x])\n const { min, max } = perfArrays.some((array) => array.length > 0)\n ? this.computeVisibleMinMax(...perfArrays)\n : this.getDomainDefaults(this.type)\n\n this.min = min\n this.max = max\n\n const fy = d3\n .scaleLinear()\n .range([0, this.contentHeight])\n .domain([this.model.scaleRange?.max ?? this.max, this.model.scaleRange?.min ?? this.min])\n if (!this.model.scaleRange) {\n fy.nice(10)\n }\n // @ts-expect-error - TODO scale.y types dont match\n this.model.scale.y = this.fy = fy\n this.ready = true\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (!this.ready) {\n return\n }\n const { ColorsSettings, IndicatorSettings } = this.getChartLayoutSettings()\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(0)),\n y2: Math.round(this.fy(0)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n\n context.translate(0.5, 0.5)\n const iterable = this.getTickers()\n for (let index = 0; index < iterable.length; index++) {\n const ticker = iterable[index]\n if (this.perf[ticker].length > 0) {\n context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\n context.beginPath()\n for (let i = 0; i < this.perf[ticker].length; i++) {\n const y = Math.round(this.fy(this.perf[ticker][i]))\n context.lineTo(this.fx(i), y)\n }\n context.stroke()\n }\n }\n\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\n context.beginPath()\n for (let i = 0; i < this.perf[this.data.ticker].length; i++) {\n const y = Math.round(this.fy(this.perf[this.data.ticker][i]))\n if (!isNaN(y)) {\n context.lineTo(this.fx(i), y)\n }\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderCrossTextQuotePage(context: CanvasRenderingContext2D, crossIndex: number) {\n if (!context || !crossIndex) {\n return\n }\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const tickers = [this.data.ticker, ...this.getTickers()]\n tickers.forEach((key, index) => {\n const crossIndexTickerTimeStamp = this.quotes?.[this.data.ticker]?.getDataByBarIndex('date', crossIndex)\n const tickerDateToIndex = crossIndexTickerTimeStamp\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\n : null\n const tickerPerformance = tickerDateToIndex\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\n : null\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\n context.fillStyle = Colors.canvasFill\n context.fillRect(\n IndicatorSettings.left.indicatorLabel.margin.left! - PADDING.XXXS,\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\n (index + 1) +\n IndicatorSettings.left.indicatorLabel.margin.top! -\n PADDING.XXXS,\n PADDING.XXXS + this.indicatorLabelWidth[key] + PADDING.XXXS,\n PADDING.XXXS + IndicatorSettings.left.indicatorLabel.font.size! + PADDING.XXXS\n )\n new Text(\n {\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\n x: IndicatorSettings.left.indicatorLabel.margin.left,\n y:\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\n (index + 1) +\n IndicatorSettings.left.indicatorLabel.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle:\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.model\n ).render(context)\n }\n })\n }\n\n renderCrossTextChartsPage(context: CanvasRenderingContext2D, crossIndex: number) {\n if (!context || !crossIndex) {\n return\n }\n\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n let isVertical = true\n const labelBottom = IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\n const tickers = [this.data.ticker, ...this.getTickers()]\n const tickerText = new Text(\n {\n font: Text.getMergedPropsWithDefaults('font', {\n ...IndicatorSettings.left.indicatorLabel.font,\n style: 'normal',\n }),\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\n padding: { top: 0, bottom: 0, left: 5, right: 5 },\n },\n this.model\n )\n let x = IndicatorSettings.left.indicatorLabel.margin.left!\n let y =\n IndicatorSettings.left.indicatorLabel.margin.top! + (2 * INDICATOR_LABEL_HEIGHT - tickerText.attrs.lineHeight) / 2\n\n const maxHeight = tickerText.attrs.lineHeight * tickers.length\n\n const canFitItemsVertically = maxHeight + labelBottom <= this.height\n if (this.width <= MOBILE_VIEW_BREAKPOINT_WIDTH || !canFitItemsVertically) {\n isVertical = false\n x += x + this.labelWidth\n } else {\n y += IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\n }\n\n const tickerQuote = this.quotes?.[this.data.ticker]\n const maxCrossIndex = Math.min(crossIndex, (tickerQuote?.close.length ?? Infinity) - 1)\n tickers.forEach((key, index) => {\n const crossIndexTickerTimeStamp = tickerQuote?.getDataByBarIndex('date', maxCrossIndex)\n const tickerDateToIndex = crossIndexTickerTimeStamp\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\n : null\n const tickerPerformance = tickerDateToIndex\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\n : null\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\n tickerText.set({\n x,\n y,\n fillStyle:\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\n })\n const tickerTextWidth =\n tickerText.measure(context) + tickerText.attrs.padding.left + tickerText.attrs.padding.right\n if (\n !isVertical &&\n this.width - IndicatorSettings.left.indicatorLabel.margin.left! - IndicatorSettings.right.width! <=\n x + tickerTextWidth\n ) {\n x = 2 * IndicatorSettings.left.indicatorLabel.margin.left! + this.labelWidth\n y += tickerText.attrs.lineHeight\n tickerText.set({ x, y })\n }\n tickerText.render(context)\n\n if (isVertical) {\n y += tickerText.attrs.lineHeight\n } else {\n x += tickerTextWidth\n }\n }\n })\n }\n\n renderXAxis(context: CanvasRenderingContext2D) {\n if (!this.ready) {\n return\n }\n return super.renderXAxis(context)\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n let ticker\n super.renderYAxis(context)\n const { IndicatorSettings, ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (!this.ready) {\n return\n }\n if (this.perf[this.data.ticker].length === 0) {\n return\n }\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const { lineHeight, padding, size } = IndicatorSettings.right.axis.font\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M - padding!.left! + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', { size }),\n lineHeight,\n padding: {\n left: padding!.left!,\n right: padding!.right!,\n top: padding!.top!,\n bottom: padding!.bottom!,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.crossText,\n },\n this.model\n )\n const iterable = this.getTickers()\n const textLabels = []\n for (let index = 0; index < iterable.length; index++) {\n ticker = iterable[index]\n if (this.perf[ticker].length > 0) {\n textLabels.push({\n text: this.perf[ticker].last().toFixed(2) + '%',\n y: Math.round(this.fy(this.perf[ticker].last())),\n background: ColorsSettings[index % ColorsSettings.length],\n })\n }\n }\n textLabels.push({\n text: this.perf[this.data.ticker].last().toFixed(2) + '%',\n y: Math.round(this.fy(this.perf[this.data.ticker].last())),\n background: Colors.performanceIndicatorLabel,\n })\n\n const minY = 0\n const maxY = this.contentHeight\n textLabels.forEach((labelSetting) => {\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\n text.set(labelSetting).render(context)\n }\n })\n\n translate.undo()\n }\n\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\n super.renderLabelQuotePage(context)\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (this.ready) {\n const tickers = this.getTickers()\n const tickerPerformance = [\n { [this.data.ticker]: this.perf[this.data.ticker][this.perf[this.data.ticker].length - 1] },\n ...tickers.map((ticker) => ({ [ticker]: this.perf[ticker][this.perf[ticker].length - 1] })),\n ].reduce((prev, current) => ({ ...prev, ...current }), {})\n Object.keys(tickerPerformance).forEach((key, index) => {\n if (tickerPerformance[key]) {\n const text = new Text(\n {\n text: `${key} ${tickerPerformance[key].toFixed(2)}%`,\n x: IndicatorSettings.left.indicatorLabel.margin.left,\n y:\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\n (index + 1) +\n IndicatorSettings.left.indicatorLabel.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle:\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.model\n )\n this.indicatorLabelWidth = { ...this.indicatorLabelWidth, [key]: text.measure(context) }\n text.render(context)\n }\n })\n }\n }\n\n getTickers() {\n return this.tickers\n .split(',')\n .map((ticker) => ticker)\n .filter((x) => x)\n }\n\n getTickersAndTimeframe() {\n const { timeframe } = this.model.chart().quote()\n return this.getTickers().map((ticker) => ({\n ticker,\n instrument: getInstrument(ticker),\n timeframe,\n }))\n }\n\n set(values: Partial) {\n this.ready = false\n this.firstFetchCalled = false\n super.set({ ...values, tickers: values.period || (values.tickers ? getSanitizedTicker(values.tickers, true) : '') })\n this.tickers = (this.tickers || '').toUpperCase()\n }\n\n getModalConfig() {\n return {\n title: this.label,\n inputs: [\n {\n type: 'text',\n label: 'Tickers',\n name: 'tickers',\n value: !!this.tickers ? this.tickers : DEFAULT_TICKERS,\n required: true,\n },\n ],\n inputsErrorMessages: {\n tickers: 'At least one ticker has to be provided',\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'tickers':\n return this[key].length > 0\n default:\n return false\n }\n }\n\n toString() {\n return this.getIsChartPageSpecificFunctionality() ? 'PERF %' : `PERF% ${this.tickers}`\n }\n}\n\nexport default PricePerformance\n","import { IndicatorType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: number | string\n momentum: number\n}\n\nclass RMI extends Indicator {\n static type = IndicatorType.Rmi\n static label = 'Relative Momentum Index'\n\n rmi: number[] = []\n declare momentum: number\n declare period: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, momentum = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, momentum })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.rmi = []\n let count = 0\n let sumu = 0\n let sumd = 0\n let u: number, d: number, ad: number, au: number\n for (let i = this.momentum; i < this.data.close.length; i++) {\n u = d = 0\n if (this.data.close[i] > this.data.close[i - this.momentum]) {\n u = this.data.close[i] - this.data.close[i - this.momentum]\n }\n if (this.data.close[i] < this.data.close[i - this.momentum]) {\n d = this.data.close[i - this.momentum] - this.data.close[i]\n }\n\n if (count < this.period) {\n sumu += u\n sumd += d\n count++\n au = sumu / count\n ad = sumd / count\n } else {\n au = (au! * (this.period - 1) + u) / this.period\n ad = (ad! * (this.period - 1) + d) / this.period\n }\n\n const rs = ad > 0 ? au / ad : 1\n this.rmi[i] = 100 - 100 * (1 / (1 + rs))\n }\n\n this.lastValue = this.rmi.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.rmi, this.momentum, 30, 50, 70)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 20,\n required: true,\n min: 1,\n max: 999999,\n }\n const momentum = {\n type: 'number',\n label: 'Momentum',\n name: 'momentum',\n value: this.momentum ?? 5,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, momentum],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n momentum: `${momentum.label} must be a whole number between ${momentum.min} and ${momentum.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'momentum':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `RMI ${this.period},${this.momentum}`\n }\n}\n\nexport default RMI\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ROC extends Indicator {\n static type = IndicatorType.Roc\n static label = 'Rate of Change %'\n\n roc: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.roc = []\n for (let i = this.period; i < this.data.close.length; i++) {\n this.roc[i] = ((this.data.close[i] - this.data.close[i - this.period]) / this.data.close[i - this.period]) * 100\n }\n\n this.lastValue = this.roc.last() ?? null\n }\n const { min, max } = this.roc.length > 0 ? this.computeVisibleMinMax(this.roc) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(0)),\n y2: Math.round(this.fy(0)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.roc[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 12,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ROC ${this.period}`\n }\n}\n\nexport default ROC\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass RSI extends Indicator {\n static type = IndicatorType.Rsi\n static label = 'Relative Strength Index'\n\n rsi: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.rsi = []\n let count = 0\n let sumu = 0\n let sumd = 0\n let u: number, d: number, ad: number, au: number\n for (let i = 1; i < this.data.close.length; i++) {\n u = d = 0\n if (this.data.close[i] > this.data.close[i - 1]) {\n u = this.data.close[i] - this.data.close[i - 1]\n }\n if (this.data.close[i] < this.data.close[i - 1]) {\n d = this.data.close[i - 1] - this.data.close[i]\n }\n\n if (count < this.period) {\n sumu += u\n sumd += d\n count++\n au = sumu / count\n ad = sumd / count\n } else {\n au = (au! * (this.period - 1) + u) / this.period\n ad = (ad! * (this.period - 1) + d) / this.period\n }\n\n const rs = ad > 0 ? au / ad : 1\n this.rsi[i] = 100 - 100 * (1 / (1 + rs))\n }\n\n this.lastValue = this.rsi.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.rsi, 1, 30, 50, 70)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `RSI ${this.period}`\n }\n}\n\nexport default RSI\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\nimport { getHEXWithSpecificAplha } from '../utils/colors'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: number | string\n baseLine: number\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 50,\n BaseLine: 1.0,\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const baseLine = parseFloat(values[1]) || DEFAULT_PARAMETERS.BaseLine\n\n return [period, baseLine]\n}\n\nclass RelativeVolume extends Indicator {\n static type = IndicatorType.Rvol\n static label = 'Relative Volume'\n\n rvol: number[] = []\n declare period: number\n declare baseLine: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, baseLine = 0] = parsePeriod(values.period)\n super.set({ ...values, period, baseLine })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.rvol = []\n\n let sum = 0\n for (let i = 0; i < this.period; i++) {\n sum += this.data.volume[i]\n }\n for (let i = this.period; i < this.data.volume.length; i++) {\n sum = sum - this.data.volume[i - this.period] + this.data.volume[i]\n this.rvol[i] = this.data.volume[i] / (sum / this.period)\n }\n\n this.lastValue = this.rvol.last() ?? null\n }\n\n const { min, max } =\n this.rvol.length > 0\n ? this.computeVisibleMinMax([...this.rvol, this.baseLine])\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const chartModel = this.model.chart()\n const { zoomFactor } = chartModel\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n zoomFactor,\n chartLayout: chartModel.chart_layout(),\n })\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\n\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period + 1,\n drawBarCallback: (i, x) => {\n if (this.rvol[i] === undefined) return\n\n const baseLine = Math.round(this.fy(this.baseLine))\n const y = Math.round(this.fy(this.rvol[i]))\n\n context.fillStyle = this.rvol[i] < this.baseLine ? Colors.volumeTrendDown : Colors.volumeTrendUp\n context.fillRect(x - halfBarWidth, baseLine, barWidthWithoutMargin, y - baseLine)\n },\n })\n\n const baseLineY = this.fy(this.baseLine)\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(baseLineY),\n y2: Math.round(baseLineY),\n strokeStyle: getHEXWithSpecificAplha(Colors.zeroChange, 0.5),\n },\n this.model\n ).render(context)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const baseLine = {\n type: 'number',\n label: 'Baseline',\n name: 'baseLine',\n value: this.baseLine ?? DEFAULT_PARAMETERS.BaseLine,\n required: true,\n step: 0.1,\n allowDecimal: true,\n min: 0,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, baseLine],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n baseLine: `${baseLine.label} must be a number between ${baseLine.min} and ${baseLine.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'baseLine':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n default:\n return false\n }\n }\n\n toString() {\n return `RVOL ${this.period}, ${this.baseLine}, SMA`\n }\n}\n\nexport default RelativeVolume\n","import Text from '../canvas/text'\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass RWI extends Indicator {\n static type = IndicatorType.Rwi\n static label = 'Random Walk Index'\n\n tr: number[] = []\n atr: number[] = []\n rwiHi: number[] = []\n rwiLo: number[] = []\n declare period: number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.renderYAxis = this.renderYAxis.bind(this)\n }\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.tr = []\n this.atr = []\n this.rwiHi = []\n this.rwiLo = []\n let atr = 0\n\n for (let i = 0; i < this.data.close.length; i++) {\n const tr = utils.max([\n this.data.high[i] - this.data.low[i],\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\n ])\n this.tr[i] = tr\n\n if (i < this.period) {\n atr += tr\n this.atr[i] = atr / (i + 1)\n if (i === this.period - 1) {\n atr /= this.period\n }\n } else {\n this.atr[i] = (this.atr[i - 1] * (this.period - 1) + tr) / this.period\n }\n }\n\n for (let i = this.period + 2; i < this.data.close.length; i++) {\n const h = this.data.high[i]\n const l = this.data.low[i]\n let trSum = this.tr[i - 1] + this.tr[i - 2]\n let count = 2\n let atrWeight = (trSum / count) * Math.sqrt(count)\n let maxHi = atrWeight > 0 ? (h - this.data.low[i - 1]) / atrWeight : -1\n let maxLo = atrWeight > 0 ? (this.data.high[i - 1] - l) / atrWeight : -1\n for (let j = i - 1; j > i - this.period + 1; j--) {\n trSum += this.tr[j - 2]\n count++\n atrWeight = (trSum / count) * Math.sqrt(count)\n if (atrWeight === 0) {\n continue\n }\n\n const hi = (h - this.data.low[j - 1]) / atrWeight\n if (hi > maxHi) {\n maxHi = hi\n }\n\n const lo = (this.data.high[j - 1] - l) / atrWeight\n if (lo > maxLo) {\n maxLo = lo\n }\n }\n this.rwiHi[i] = maxHi\n this.rwiLo[i] = maxLo\n }\n }\n const { min, max } =\n this.rwiHi.length > 0 || this.rwiLo.length > 0\n ? this.computeVisibleMinMax(this.rwiHi, this.rwiLo)\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', '#c80000')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.rwiLo[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', '#00a000')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.rwiHi[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n super.renderYAxis(context)\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\n padding: {\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.indicatorCurrentText,\n },\n this.model\n )\n const textLabels = []\n if (this.rwiLo.length > 0) {\n textLabels.push({\n text: this.rwiLo.last()!.toFixed(2),\n y: Math.round(this.fy(this.rwiLo.last()!)),\n background: '#c80000',\n })\n }\n if (this.rwiHi.length > 0) {\n textLabels.push({\n text: this.rwiHi.last()!.toFixed(2),\n y: Math.round(this.fy(this.rwiHi.last()!)),\n background: '#00a000',\n })\n }\n\n const minY = 0\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\n textLabels.forEach((labelSetting) => {\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\n text.set(labelSetting).render(context)\n }\n })\n\n translate.undo()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 9,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `RWI ${this.period}`\n }\n}\n\nexport default RWI\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string | number\n dPeriod: number\n kPeriod: number\n}\n\nclass Stochastics extends Indicator {\n static type = IndicatorType.Stofu\n static label = 'Stochastics FULL'\n\n k: number[] = []\n k1: number[] = []\n d: number[] = []\n declare kPeriod: number\n declare period: number\n declare dPeriod: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, kPeriod = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, dPeriod, kPeriod })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n const period = Math.min(this.period, this.data.close.length - 1)\n let dCount, dSum, k\n this.k1 = []\n this.k = []\n this.d = []\n let kSum = (dSum = 0)\n let kCount = (dCount = 0)\n for (let i = 0; i < this.data.close.length; i++) {\n let highestHigh = this.data.high[i]\n let lowestLow = this.data.low[i]\n\n for (let j = i - period + 1; j <= i; j++) {\n if (this.data.high[j] > highestHigh) {\n highestHigh = this.data.high[j]\n }\n if (this.data.low[j] < lowestLow) {\n lowestLow = this.data.low[j]\n }\n }\n\n k = ((this.data.close[i] - lowestLow) / (highestHigh - lowestLow)) * 100\n if (highestHigh === lowestLow) {\n k = 100\n }\n this.k1[i] = k\n if (this.kPeriod > 1) {\n kSum += k\n kCount++\n if (kCount > this.kPeriod) {\n kSum -= this.k1[i - this.kPeriod]\n kCount--\n }\n k = kSum / kCount\n }\n\n dSum += k\n dCount++\n if (dCount > this.dPeriod) {\n dSum -= this.k[i - this.dPeriod]\n dCount--\n }\n\n const d = dSum / dCount\n this.k[i] = k\n this.d[i] = d\n }\n\n this.lastValue = this.k.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(50)),\n y2: Math.round(this.fy(50)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(20)),\n y2: Math.round(this.fy(20)),\n strokeStyle: '#69c1ea',\n },\n this.model\n ).render(context)\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(80)),\n y2: Math.round(this.fy(80)),\n strokeStyle: '#d386df',\n },\n this.model\n ).render(context)\n\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.k[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', '#c80000')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.d[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const kPeriod = {\n type: 'number',\n label: 'K Period',\n name: 'kPeriod',\n value: this.kPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n const dPeriod = {\n type: 'number',\n label: 'D Period',\n name: 'dPeriod',\n value: this.dPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, kPeriod, dPeriod],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\n kPeriod: `${kPeriod.label} must be a whole number between ${kPeriod.min} and ${kPeriod.max}`,\n } as {\n period: string\n dPeriod: string\n kPeriod?: string\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'dPeriod':\n case 'kPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Stochastics FULL ${this.period},${this.kPeriod},${this.dPeriod}`\n }\n}\n\nexport default Stochastics\n","import { IndicatorType } from '../constants/common'\nimport Pane from '../models/pane'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Stochastics from './stofu'\n\ninterface Attrs {\n period: string | number\n dPeriod: number\n kPeriod: number\n}\n\nclass StochasticsFast extends Stochastics {\n static type = IndicatorType.Stofa\n static label = 'Stochastics FAST'\n\n declare kPeriod: number\n declare period: number\n declare dPeriod: number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.kPeriod = 1\n }\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, dPeriod, kPeriod: 1 })\n } else {\n super.set(values)\n }\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const dPeriod = {\n type: 'number',\n label: 'D Period',\n name: 'dPeriod',\n value: this.dPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, dPeriod],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'dPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Stochastics FAST ${this.period},${this.dPeriod}`\n }\n}\n\nexport default StochasticsFast\n","import { IndicatorType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Stochastics from './stofu'\n\ninterface Attrs {\n period: string | number\n dPeriod: number\n kPeriod: number\n}\n\nclass StochasticsSlow extends Stochastics {\n static type = IndicatorType.Stosl\n static label = 'Stochastics SLOW'\n\n kPeriod = 3\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, dPeriod, kPeriod: 3 })\n } else {\n super.set(values)\n }\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const dPeriod = {\n type: 'number',\n label: 'D Period',\n name: 'dPeriod',\n value: this.dPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, dPeriod],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'dPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Stochastics SLOW ${this.period},${this.dPeriod}`\n }\n}\n\nexport default StochasticsSlow\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport EMA from '../helpers/ema'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass Trix extends Indicator {\n static type = IndicatorType.Trix\n static label = 'TRIX'\n\n trix: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.trix = []\n const ema1 = new EMA(this.period)\n const ema2 = new EMA(this.period)\n const ema3 = new EMA(this.period)\n let prev = 0\n\n for (let i = 0; i < this.data.close.length; i++) {\n ema1.add(this.data.close[i])\n ema2.add(ema1.value)\n ema3.add(ema2.value)\n if (prev > 0) {\n this.trix[i] = (ema3.value * 100) / prev - 100\n }\n prev = ema3.value\n }\n this.lastValue = this.trix.last() ?? null\n }\n const { min, max } = this.trix.length > 0 ? this.computeVisibleMinMax(this.trix) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(0)),\n y2: Math.round(this.fy(0)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n if (this.trix[i]) context.lineTo(x, ~~this.fy(this.trix[i]))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 9,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `TRIX ${this.period}`\n }\n}\n\nexport default Trix\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { IndicatorType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n period1: number\n period2: number\n period3: number\n}\n\nclass UltimateOscillator extends Indicator {\n static type = IndicatorType.Ult\n static label = 'Ultimate Oscillator'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(period)\n return Math.max(period1, period2, period3)\n }\n\n declare period1: number\n declare period2: number\n declare period3: number\n ult: number[] = []\n tr: number[] = []\n bp: number[] = []\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period1, period2, period3 })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.ult = []\n let bpSum2, bpSum3, count2, count3, trSum2, trSum3\n const tr = []\n const bp = []\n let bpSum1 = (bpSum2 = bpSum3 = 0)\n let trSum1 = (trSum2 = trSum3 = 0)\n let count1 = (count2 = count3 = 0)\n let avg2, avg3\n for (let i = 1; i < this.data.close.length; i++) {\n bp[i] = this.data.close[i] - Math.min(this.data.low[i], this.data.close[i - 1])\n tr[i] = Math.max(this.data.high[i], this.data.close[i - 1]) - Math.min(this.data.low[i], this.data.close[i - 1])\n\n bpSum1 += bp[i]\n trSum1 += tr[i]\n count1++\n if (count1 > this.period1) {\n bpSum1 -= bp[i - this.period1]\n trSum1 -= tr[i - this.period1]\n }\n\n bpSum2 += bp[i]\n trSum2 += tr[i]\n count2++\n if (count2 > this.period2) {\n bpSum2 -= bp[i - this.period2]\n trSum2 -= tr[i - this.period2]\n }\n\n bpSum3 += bp[i]\n trSum3 += tr[i]\n count3++\n if (count3 > this.period3) {\n bpSum3 -= bp[i - this.period3]\n trSum3 -= tr[i - this.period3]\n }\n\n let avg1 = (avg2 = avg3 = 0)\n if (trSum1 > 0) {\n avg1 = bpSum1 / trSum1\n }\n if (trSum2 > 0) {\n avg2 = bpSum2 / trSum2\n }\n if (trSum3 > 0) {\n avg3 = bpSum3 / trSum3\n }\n\n this.ult[i] = (100 * (4 * avg1 + 2 * avg2 + avg3)) / 7\n }\n\n this.lastValue = this.ult.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.ult, 1, 30, 50, 70)\n }\n\n getModalConfig() {\n const period1 = {\n type: 'number',\n label: 'Period 1',\n name: 'period1',\n value: this.period1 ?? 7,\n required: true,\n min: 1,\n max: 999999,\n }\n const period2 = {\n type: 'number',\n label: 'Period 2',\n name: 'period2',\n value: this.period2 ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const period3 = {\n type: 'number',\n label: 'Period 3',\n name: 'period3',\n value: this.period3 ?? 28,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period1, period2, period3],\n inputsErrorMessages: {\n period1: `${period1.label} must be a whole number between ${period1.min} and ${period1.max}`,\n period2: `${period2.label} must be a whole number between ${period2.min} and ${period2.max}`,\n period3: `${period3.label} must be a whole number between ${period3.min} and ${period3.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period1':\n case 'period2':\n case 'period3':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ULT ${this.period1},${this.period2},${this.period3}`\n }\n}\n\nexport default UltimateOscillator\n","import { IndicatorType } from '../constants/common'\nimport math from '../helpers/math'\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\nclass Volume extends Indicator {\n static type = IndicatorType.Vol\n static label = 'Volume'\n\n compute() {\n const { min, max } =\n this.data.volume.length > 0 ? this.computeVisibleMinMax(this.data.volume) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n this.lastValue = this.data.volume.last() ?? null\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const chartModel = this.model.chart()\n const { zoomFactor } = chartModel\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n zoomFactor,\n chartLayout: chartModel.chart_layout(),\n })\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\n\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i, x) => {\n context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\n const y = Math.round(this.fy(this.data.volume[i]))\n context.fillRect(x - halfBarWidth, y, barWidthWithoutMargin, context.canvas.height - y)\n },\n })\n }\n\n formatAxis(value: number) {\n return math.formatBigNumber(value, 2)\n }\n\n getModalConfig() {\n return {\n title: this.label,\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toString() {\n return `Volume`\n }\n}\n\nexport default Volume\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass WilliamsR extends Indicator {\n static type = IndicatorType.Wr\n static label = 'Williams %R'\n\n declare period: number\n r: number[] = []\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.r = []\n for (let i = this.period; i < this.data.close.length; i++) {\n let highestHigh = this.data.high[i]\n let lowestLow = this.data.low[i]\n for (let j = i - this.period + 1; j <= i; j++) {\n if (this.data.high[j] > highestHigh) {\n highestHigh = this.data.high[j]\n }\n if (this.data.low[j] < lowestLow) {\n lowestLow = this.data.low[j]\n }\n }\n\n this.r[i] = 0\n if (highestHigh - lowestLow > 0) {\n this.r[i] = ((highestHigh - this.data.close[i]) / (highestHigh - lowestLow)) * -100\n }\n }\n\n this.lastValue = this.r.last() ?? null\n }\n const { min, max } = this.r.length > 0 ? this.computeVisibleMinMax(this.r) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.r, this.period, -80, -50, -20)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `W%R ${this.period}`\n }\n}\n\nexport default WilliamsR\n","import { IndicatorType } from '../constants/common'\nimport adx from './adx'\nimport aro from './aro'\nimport aroosc from './aroosc'\nimport atr from './atr'\nimport cci from './cci'\nimport cot from './cot'\nimport fi from './fi'\nimport indicator from './indicator'\nimport macd from './macd'\nimport mfi from './mfi'\nimport none from './none'\nimport obv from './obv'\nimport perf from './perf'\nimport rmi from './rmi'\nimport roc from './roc'\nimport rsi from './rsi'\nimport rvol from './rvol'\nimport rwi from './rwi'\nimport stofa from './stofa'\nimport stofu from './stofu'\nimport stosl from './stosl'\nimport trix from './trix'\nimport ult from './ult'\nimport vol from './vol'\nimport wr from './wr'\n\n// TODO check if this doesn't break saved charts\nexport const indicatorsByType = Object.freeze({\n [IndicatorType.Indicator]: indicator,\n [IndicatorType.None]: none,\n [IndicatorType.Adx]: adx,\n [IndicatorType.Aro]: aro,\n [IndicatorType.Aroosc]: aroosc,\n [IndicatorType.Atr]: atr,\n [IndicatorType.Cci]: cci,\n [IndicatorType.Cot]: cot,\n [IndicatorType.Fi]: fi,\n [IndicatorType.Macd]: macd,\n [IndicatorType.Mfi]: mfi,\n [IndicatorType.Obv]: obv,\n [IndicatorType.Perf]: perf,\n [IndicatorType.Rmi]: rmi,\n [IndicatorType.Roc]: roc,\n [IndicatorType.Rsi]: rsi,\n [IndicatorType.Rvol]: rvol,\n [IndicatorType.Rwi]: rwi,\n [IndicatorType.Stofa]: stofa,\n [IndicatorType.Stofu]: stofu,\n [IndicatorType.Stosl]: stosl,\n [IndicatorType.Trix]: trix,\n [IndicatorType.Ult]: ult,\n [IndicatorType.Vol]: vol,\n [IndicatorType.Wr]: wr,\n})\n\nexport const indicatorsWithoutPeriod = Object.freeze([IndicatorType.Obv, IndicatorType.Vol])\n","import Spine from '@finviz/spine'\n\n// eslint-disable-next-line no-extend-native\nArray.prototype.last = function () {\n return this[this.length - 1]\n}\n\n// eslint-disable-next-line no-extend-native\nString.prototype.padLeft = function (paddingValue) {\n return String(paddingValue + this).slice(-paddingValue.length)\n}\n\n// eslint-disable-next-line no-extend-native\nString.prototype.startsWith = function (str) {\n return this.indexOf(str) === 0\n}\n\ninterface CallbackCacheItem {\n newCb: (...args: any[]) => any\n origCb: (...args: any[]) => any\n}\n\nconst _callbackCache: CallbackCacheItem[] = []\nSpine.Collection.prototype.bind = function (ev, callback) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this\n const cb = (record: Spine.Model, ...rest: any[]) => {\n if (record[that.fkey as keyof Spine.Model] === that.record.id) {\n return callback(record, ...rest)\n }\n }\n _callbackCache.push({ newCb: cb, origCb: callback })\n this.model.bind(ev, cb)\n return this\n}\n\nSpine.Collection.prototype.unbind = function (ev, callback) {\n let cb\n for (const item of _callbackCache) {\n if (item.origCb === callback) {\n cb = item.newCb\n break\n }\n }\n return this.model.unbind(ev, cb)\n}\n\nSpine.Model.findIndex = function (element) {\n const iterable = this.all()\n for (let index = 0; index < iterable.length; index++) {\n const el = iterable[index]\n if (element.eql(el)) {\n return index\n }\n }\n}\n\nexport function getContextWithCache(canvas: HTMLCanvasElement | null): CanvasRenderingContext2D | null {\n if (!canvas) {\n return null\n }\n\n const context = canvas.getContext('2d')\n if (!context) {\n window.Sentry?.captureMessage('Context unavailable')\n return null\n }\n\n context._cache = {}\n\n const _restore = CanvasRenderingContext2D.prototype.restore\n context.restore = function () {\n this._cache = {}\n return _restore.apply(this)\n }\n\n context.set = function (key, value) {\n if (this._cache[key] !== value) {\n this[key] = value\n this._cache[key] = value\n }\n }\n\n return context\n}\n","import Spine from '@finviz/spine'\nimport * as React from 'react'\n\nimport { DefaultSpineEvents } from '../../types/shared'\nimport ElementModule from '../canvas/element'\nimport IndicatorModule from '../indicators/indicator'\nimport { useForceUpdate } from '../utils/force-update'\nimport { getJSONReplacerFunc } from '../utils/helpers'\n\ninterface UseModelStateOptions {\n watchProperties?: T extends null ? never[] : Array\n listenOnEvents?: string[]\n}\n\nconst getIsSpineObject = (value: any) =>\n [Spine.Model, Spine.Module, Spine.Collection].some((spineObject) => value instanceof spineObject)\n\nconst getWatchedPropValue = (\n watchedProp: Model[keyof Model] | ElementModule | IndicatorModule | undefined,\n model: Model | null\n) => {\n if (typeof watchedProp === 'function') {\n const value = watchedProp.call(model)\n\n if (value && !getIsSpineObject(value)) {\n throw Error('Watched prop should have a primitive value or a spine object')\n }\n\n if (typeof value?.all === 'function') {\n return value.all()\n }\n\n return value\n }\n\n if (typeof watchedProp === 'object') {\n const hasToObject = !!watchedProp && 'toObject' in watchedProp\n return JSON.stringify(hasToObject ? watchedProp.toObject() : watchedProp, getJSONReplacerFunc())\n }\n\n return watchedProp\n}\n\nconst getWatchedProps = (model: Model | null, props?: Array) =>\n props?.reduce(\n (acc, propKey) => ({\n ...acc,\n [propKey]: getWatchedPropValue(model?.[propKey], model),\n }),\n {} as Partial\n )\n\nconst getAreWatchedPropsEqual = (\n currentValue: Value,\n previousValue: Value\n) => {\n if (currentValue instanceof Spine.Model) {\n return currentValue.eql(previousValue)\n }\n\n return currentValue === previousValue\n}\n\nconst DEFAULT_SPINE_EVENTS = Object.values(DefaultSpineEvents)\n\nexport function useModelState(\n model: Model,\n options: UseModelStateOptions = {}\n) {\n const { watchProperties = [], listenOnEvents = DEFAULT_SPINE_EVENTS } = options\n const stringifiedOptions = JSON.stringify(options)\n const { forceUpdate } = useForceUpdate()\n const watchedPropertiesRef = React.useRef(getWatchedProps(model, watchProperties))\n\n React.useEffect(() => {\n const handleModelChange = () => {\n const hasChange = watchProperties.some((propKey) => {\n const currentValue = getWatchedPropValue(model?.[propKey], model)\n const previousValue = watchedPropertiesRef.current?.[propKey]\n\n if (Array.isArray(currentValue)) {\n return (\n !Array.isArray(previousValue) ||\n currentValue.length !== previousValue.length ||\n currentValue.some((record, index) => !getAreWatchedPropsEqual(record, previousValue[index]))\n )\n }\n\n return !getAreWatchedPropsEqual(currentValue, previousValue)\n })\n\n if (hasChange) {\n watchedPropertiesRef.current = getWatchedProps(model, watchProperties)\n forceUpdate()\n }\n }\n\n const spineEvents = listenOnEvents.join(' ')\n\n model?.bind(spineEvents, handleModelChange)\n\n forceUpdate()\n\n return () => {\n model?.unbind(spineEvents, handleModelChange)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model?.cid, stringifiedOptions, forceUpdate])\n\n return model\n}\n","import Spine, { Collection } from '@finviz/spine'\nimport omit from 'lodash.omit'\n\nimport {\n ChartConfigChartPane,\n CustomSpineEvents,\n Instrument,\n ObjectHash,\n TodoObjectHashAnyType,\n} from '../../types/shared'\nimport BaseChart from '../charts/base_chart'\nimport PerfChart from '../charts/perf_chart'\nimport {\n DateRangeType,\n IndicatorType,\n QuotePollingIntervalInMs,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n} from '../constants/common'\nimport { IDividends, IEarnings, ISplit } from '../controllers/chart-events/utils'\nimport { getCanvasElementByType } from '../helpers/get-canvas-element-by-type'\nimport COT from '../indicators/cot'\nimport PricePerformance from '../indicators/perf'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Utils from '../utils'\nimport ChartEventElement from './chart-event-element'\nimport { ChartPartToAttrsSyncMap, ChartSyncablePart } from './chart/contstants'\nimport ChartLayout from './chart_layout'\nimport Pane from './pane'\nimport Quote from './quote'\n\nclass Chart extends Spine.Model {\n static initClass(paneModel: typeof Pane, quoteModel: typeof Quote, chartLayoutModel: typeof ChartLayout) {\n this.configure(\n 'Chart',\n 'width',\n 'height',\n 'timeframe',\n 'dateRange',\n 'scale',\n 'leftOffset',\n 'ticker',\n 'instrument',\n 'fx',\n 'fy',\n 'zoomFactor',\n 'refreshData',\n 'stretch',\n 'isHideDrawingsActive',\n 'isScrolled',\n 'firstBarClose',\n 'premarket',\n 'aftermarket',\n 'hasChartEvents'\n )\n this.hasMany('panes', paneModel)\n this.belongsTo('quote', quoteModel)\n this.belongsTo('chart_layout', chartLayoutModel)\n }\n\n declare stretch: boolean\n declare chart_layout_id: string\n declare chart_layout: () => ChartLayout\n declare quote_id: string\n declare quote: () => Quote\n declare panes: () => Collection\n declare refreshData: boolean | number\n declare dateRange: DateRangeType\n declare width: number\n declare height: number\n declare timeframe: TIMEFRAME\n declare leftOffset: number\n declare ticker: string\n declare instrument: Instrument\n declare fx: (x: number) => number\n declare fy: (x: number) => number\n declare zoomFactor: number\n declare isHideDrawingsActive: boolean\n declare isScrolled: boolean\n declare scale: ScaleType\n declare firstBarClose: number\n declare premarket: boolean\n declare aftermarket: boolean\n declare hasChartEvents: boolean\n\n getChartPane() {\n return this.panes()\n .all()\n .find((pane: Pane) =>\n pane\n .elements()\n .all()\n .some((el) => el.isChart())\n )\n }\n\n getChartElement() {\n for (const pane of this.panes().all()) {\n for (const el of pane.elements().all()) {\n if (el.isChart()) {\n return el\n }\n }\n }\n }\n\n getChartType() {\n return this.getChartElement()?.instance.type\n }\n\n getRefreshInterval() {\n let defaultRefreshInterval: number | null = null\n if (typeof this.refreshData === 'number') {\n defaultRefreshInterval = this.refreshData\n } else if (this.refreshData === true) {\n defaultRefreshInterval = QuotePollingIntervalInMs.Default\n }\n\n const isStock = this.instrument === Instrument.Stock\n const isPremium = window.FinvizSettings.hasUserPremium\n let customRefreshInterval = QuotePollingIntervalInMs.Elite\n if (!isPremium) {\n customRefreshInterval = QuotePollingIntervalInMs.Free\n } else if (isStock && !Utils.isStockFastRefreshAvailable()) {\n customRefreshInterval = QuotePollingIntervalInMs.EliteStocksReduced\n }\n\n return defaultRefreshInterval && Math.max(defaultRefreshInterval, customRefreshInterval)\n }\n\n toObject() {\n const panes = this.panes()\n .all()\n .map((pane) => pane.toObject())\n return {\n width: this.width,\n dateRange: this.dateRange,\n height: this.height,\n timeframe: this.timeframe,\n scale: this.scale,\n leftOffset: this.leftOffset,\n ticker: this.ticker,\n instrument: this.instrument,\n zoomFactor: this.zoomFactor,\n refreshData: this.refreshData,\n stretch: this.stretch,\n chartId: this.cid,\n panes,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isScrolled: this.isScrolled,\n premarket: this.premarket,\n aftermarket: this.aftermarket,\n hasChartEvents: this.hasChartEvents,\n }\n }\n\n toConfig(omitKeys = [] as string[]) {\n const panes = this.panes()\n .all()\n .map((pane) => pane.toConfig(omitKeys))\n return omit(\n {\n width: this.width,\n height: this.height,\n timeframe: this.timeframe,\n scale: this.scale,\n leftOffset: this.leftOffset,\n ticker: this.ticker,\n instrument: this.instrument,\n zoomFactor: this.zoomFactor,\n refreshData: this.refreshData,\n stretch: this.stretch,\n chartId: this.cid,\n panes,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isScrolled: this.isScrolled,\n premarket: this.premarket,\n aftermarket: this.aftermarket,\n hasChartEvents: this.hasChartEvents,\n },\n omitKeys\n )\n }\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n this.panes()\n .all()\n .forEach((pane) => {\n pane.destroyCascade()\n })\n return this.destroy(options)\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.chart_layout())\n }\n\n getIsDisabled() {\n return this.quote()?.close.length === 0\n }\n\n getIsScrollable() {\n return this.chart_layout().scrollable\n }\n\n getAllPanes() {\n return this.panes().all()\n }\n\n getAllValidPanes() {\n const cotKeys = Object.keys(this.quote().COTs ?? {})\n return this.getAllPanes().filter((pane) => {\n const mainElement = pane.mainElement()\n if (mainElement?.instance.type === IndicatorType.Cot) {\n // Type of mainElement is `Element` but it can be an indicator too\n return cotKeys.includes((mainElement.instance as unknown as COT).attrs.code)\n }\n return true\n })\n }\n\n getAllElements() {\n return this.getAllPanes().flatMap((pane) => pane.getAllElements())\n }\n\n getAllQuotes(): Quote[] {\n const perfQuotes = this.getAllElements()\n .filter(({ instance }) => instance.type === IndicatorType.Perf)\n .flatMap(({ instance }) => Object.values((instance as unknown as PricePerformance).quotes))\n\n let quotePerfTickers: Quote[] = []\n if (this.chart_layout().specificChartFunctionality === SpecificChartFunctionality.quotePerf) {\n const perfChart = this.getChartElement()?.instance as PerfChart | undefined\n if (perfChart) {\n quotePerfTickers = Quote.select(\n (q: Quote) => perfChart.attrs.tickers.includes(q.ticker) && [TIMEFRAME.d, TIMEFRAME.m].includes(q.timeframe)\n )\n }\n }\n\n return [...perfQuotes, ...quotePerfTickers, this.quote()].filter(\n (quote, index, quotes) => quote && quotes.findIndex((q) => q?.id === quote.id) === index\n )\n }\n\n createPaneCascade(paneProperties: ChartConfigChartPane) {\n const paneModel = this.panes().create(paneProperties)\n\n paneProperties.elements?.forEach(({ zIndex, elementId, ...element }) => {\n const instance = getCanvasElementByType(element.type).fromObject(element, paneModel)\n paneModel.elements().create({ instance, zIndex, elementId })\n paneModel.chart().trigger(CustomSpineEvents.IndicatorsChange)\n })\n\n const chartOrIndicator = paneModel.getChartOrIndicatorElement()\n if (paneModel.mainElement()?.elementId !== chartOrIndicator?.elementId) {\n paneModel.updateAttributes({ mainElement: chartOrIndicator })\n }\n\n return paneModel\n }\n\n updateAttributesAndSync(value: T) {\n const attrsInSync = Object.entries(ChartPartToAttrsSyncMap)\n .filter(([key]) => this.getIsChartPartInSync(key as unknown as ChartSyncablePart))\n .flatMap(([_, modelAttr]) => modelAttr)\n this.updateAttributes(value)\n\n if (attrsInSync.length > 0) {\n this.chart_layout()\n .getAllCharts()\n .forEach((chartModel) => {\n if (this.eql(chartModel)) {\n return\n }\n const newAttrs: ObjectHash = {}\n attrsInSync.forEach((modelAttr) => {\n if (value.hasOwnProperty(modelAttr)) {\n newAttrs[modelAttr] = value[modelAttr]\n }\n })\n chartModel.updateAttributes(newAttrs)\n })\n }\n }\n\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\n this.chart_layout().setSyncChartParts(chartParts, isInSync)\n }\n\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\n return this.chart_layout().getIsChartPartInSync(chartPart)\n }\n\n getHasPatterns() {\n return this.getAllElements().some((element) => {\n if ('hasOverlay' in element.instance) {\n return (element.instance as BaseChart).hasOverlay?.('patterns')\n }\n\n return false\n })\n }\n\n getQuoteRawTicker(): string | null {\n return this.quote()?.getRawTicker() ?? null\n }\n\n setChartEvents(chartEvents?: Array, shouldClear = false) {\n const chartPane = this.getChartPane()\n if (!chartPane) {\n return\n }\n const allChartEvents = chartPane.chartEvents().all()\n if (shouldClear) {\n allChartEvents.forEach((chartEvent) => chartEvent.destroyCascade())\n }\n\n const events = shouldClear\n ? chartEvents\n : chartEvents?.filter((chartEvent) => !allChartEvents.some(({ elementId }) => chartEvent.elementId === elementId))\n\n events?.forEach(({ elementId, eventType, dateTimestamp }) => {\n const newChartEvent = chartPane.chartEvents().create({\n instance: getCanvasElementByType(eventType).fromObject({ positionTimestamps: { x: dateTimestamp } }, chartPane),\n elementId,\n })\n newChartEvent.instance.updateScales()\n })\n\n chartPane.updateChartEventsZIndexes()\n }\n}\n\nexport default Chart\n","/*\n * it converts it to numbered index and it causes problems later on\n * the reason it's not just numbered enum is that it when used in const below\n * */\nexport enum ChartSyncablePart {\n Crosshair = 'crosshair',\n Ticker = 'ticker',\n Timeframe = 'timeframe',\n}\n\nexport const ChartPartToAttrsSyncMap = {\n [ChartSyncablePart.Ticker]: ['ticker'],\n [ChartSyncablePart.Timeframe]: ['timeframe', 'dateRange'],\n}\n\nexport const ChartSyncableParts = [\n { value: ChartSyncablePart.Ticker, label: 'Ticker' },\n { value: ChartSyncablePart.Timeframe, label: 'Timeframe' },\n { value: ChartSyncablePart.Crosshair, label: 'Crosshair' },\n]\n","import Spine, { Collection } from '@finviz/spine'\nimport omit from 'lodash.omit'\n\nimport { IIdea, RootChartConfigObject, Theme, TodoObjectHashAnyType } from '../../types/shared'\nimport { ChartEditorEnum, IndicatorType, LayoutType, SpecificChartFunctionality } from '../constants/common'\nimport Indicator from '../indicators/indicator'\nimport Chart from './chart'\nimport ChartEventElement from './chart-event-element'\nimport { ChartSyncablePart } from './chart/contstants'\nimport { ISettings } from './chart_settings/interfaces'\nimport DrawingsInternalStore from './drawings-internal-store'\nimport Pane from './pane'\nimport { QuoteFetchType } from './quote/constants'\n\nclass ChartLayout extends Spine.Model {\n static initClass(chartModel: typeof Chart, drawingsInternalStoreModel: typeof DrawingsInternalStore) {\n this.configure(\n 'ChartLayout',\n 'layout',\n 'activeChart',\n 'activePane',\n 'activeChartEvent',\n 'width',\n 'height',\n 'editable',\n 'canChangeTicker',\n 'scrollable',\n 'initialScrollable',\n 'cross',\n 'editors',\n 'theme',\n 'settings',\n 'isWheelZoomEnabled',\n 'specificChartFunctionality',\n 'isLargeChart',\n 'isHideDrawingsActive',\n 'isPreserveDrawingsActive',\n 'isLockDrawingsActive',\n 'isDrawingModeContinuousActive',\n 'uuid',\n 'isTouchCrossActive',\n 'defaultZoomFactor',\n 'syncChartParts',\n 'isInit',\n 'idea'\n )\n this.hasMany('charts', chartModel)\n this.belongsTo('drawingsInternalStore', drawingsInternalStoreModel)\n }\n\n declare layout: LayoutType\n declare activeChart: Chart\n declare activePane?: Pane\n declare activeChartEvent?: ChartEventElement\n declare width: number\n declare height: number\n declare editable: boolean\n declare canChangeTicker: boolean\n declare scrollable: boolean\n declare readonly initialScrollable: boolean\n declare cross: boolean\n declare editors: ChartEditorEnum[]\n declare theme: Theme\n declare settings: ISettings\n declare isWheelZoomEnabled: boolean\n declare specificChartFunctionality: SpecificChartFunctionality\n declare isLargeChart?: boolean\n declare charts: () => Collection\n declare isHideDrawingsActive: boolean\n declare isPreserveDrawingsActive: boolean\n declare isLockDrawingsActive: boolean\n declare isDrawingModeContinuousActive: boolean\n declare uuid: string\n declare isTouchCrossActive?: boolean\n declare defaultZoomFactor: number\n declare syncChartParts: ChartSyncablePart[]\n declare idea?: IIdea\n declare isInit?: boolean\n declare drawingsInternalStore: () => DrawingsInternalStore\n\n getPaneWithSelection() {\n for (const pane of this.getAllPanes()) {\n if (pane.selection) {\n return pane\n }\n }\n }\n\n toObject() {\n const charts = this.getAllCharts().map((chart) => chart.toObject())\n return {\n layout: this.layout,\n width: this.width,\n height: this.height,\n charts,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\n }\n }\n\n toConfig = RootChartConfigObject>(omitKeys = [] as string[]): T {\n const charts = this.getAllCharts().map((chart) => chart.toConfig(omitKeys))\n return JSON.parse(\n JSON.stringify(\n omit(\n {\n ...this.settings.ChartSettings.center,\n layout: this.layout,\n width: this.width,\n height: this.height,\n charts,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\n colors: this.settings.ChartSettings.general.Colors,\n specificChartFunctionality: this.specificChartFunctionality,\n editors: this.editors,\n editable: this.editable,\n scrollable: this.scrollable,\n theme: this.theme,\n newCharts: /\\bcharts\\b/.test(window.location.pathname),\n },\n omitKeys\n )\n )\n )\n }\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n this.getAllCharts().forEach((chart) => {\n chart.destroyCascade()\n })\n return this.destroy(options)\n }\n\n getAllCharts() {\n return this.charts().all()\n }\n\n getAllPanes() {\n return this.getAllCharts().flatMap((chart) => chart.getAllPanes())\n }\n\n getAllElements() {\n return this.getAllCharts().flatMap((chart) => chart.getAllElements())\n }\n\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\n const chartPartsToSync = Array.isArray(chartParts) ? chartParts : [chartParts]\n\n const newSyncedChartParts = this.syncChartParts?.filter((chartPart) => !chartPartsToSync.includes(chartPart)) ?? []\n\n if (isInSync) {\n newSyncedChartParts.push(...chartPartsToSync)\n }\n\n this.updateAttributes({ syncChartParts: newSyncedChartParts })\n }\n\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\n return !!this.syncChartParts?.includes(chartPart)\n }\n\n getIsIndicatorPresent(type: IndicatorType) {\n return !!this.charts()\n .first()\n ?.getAllElements()\n .some((element) => element.isIndicator() && (element.instance as unknown as Indicator).type === type)\n }\n\n getHTMLElementId() {\n return `chart-layout-${this.id}`\n }\n\n exitIdea() {\n this.updateAttribute('idea', undefined)\n this.getAllCharts().forEach((chart) => {\n // Change all idea quotes to non idea quotes and refetch because we don't need them anymore, but they may cause inconsistencies if they are in cache\n chart.getAllQuotes().forEach((quote) => {\n if (quote.ideaID) {\n quote.updateAttributes({ ideaID: undefined })\n quote.fetchData({ fetchType: QuoteFetchType.Refetch })\n }\n })\n\n chart.updateAttributes({ refreshData: true })\n })\n }\n\n isIdeaId(id: number | null = null) {\n return (this.idea?.id ?? null) === id\n }\n}\n\nexport default ChartLayout\n","export const largeChartFontSize = {\n S: 8,\n M: 10,\n XXL: 16,\n XXXL: 24,\n}\n","import { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { largeChartFontSize } from './constants'\nimport { ISettings, OHLCType } from './interfaces'\n\n// large & ta\n\nconst center = {\n barWidth: 2,\n barMargin: 0,\n border: 1,\n}\n\nexport const BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 20,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -46, top: -4 },\n font: {\n size: largeChartFontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: largeChartFontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.singleLine,\n },\n change: {\n margin: {\n top: 1,\n right: 40,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 3,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n left: {\n width: 50,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: 6,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 35,\n },\n font: {\n size: largeChartFontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 40,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 20,\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: -2,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n },\n left: {\n width: 50,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.S,\n left: OFFSET.M,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n lineHeight: largeChartFontSize.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { largeChartFontSize } from './constants'\nimport { ISettings, OHLCType } from './interfaces'\n\n// large & !ta\n\nconst center = {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n}\n\nexport const BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 20,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -46, top: -4 },\n font: {\n size: largeChartFontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: largeChartFontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.singleLine,\n },\n change: {\n margin: {\n top: 1,\n right: 40,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 3,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n left: {\n width: 50,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: 6,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 35,\n },\n font: {\n size: largeChartFontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 40,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 20,\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: -2,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n },\n left: {\n width: 50,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.S,\n left: OFFSET.M,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n lineHeight: largeChartFontSize.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { ISettings, OHLCType } from './interfaces'\n\n// !large & ta => http://localhost:3000/?cs=m&ct=candle_stick&t=AAPL&tf=d&o[0][ot]=sma&o[0][op]=20&o[0][oc]=dc32b363&o[1][ot]=sma&o[1][op]=50&o[1][oc]=ff8f33c7&o[2][ot]=sma&o[2][op]=200&o[2][oc]=dcb3326e&o[3][ot]=patterns&o[3][op]=&o[3][oc]=87ceef|dc9fe5\n\nconst center = {\n barWidth: 2,\n barMargin: 0,\n border: 0,\n}\n\nconst fontSize = {\n S: 7,\n M: 8,\n XXXL: 16,\n}\n\nexport const BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 15,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -26, top: 0 },\n font: {\n size: fontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: fontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.dateOnly,\n },\n change: {\n margin: {\n top: 1,\n right: 30,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 15,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 2,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n left: {\n width: 30,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: -4,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 20,\n },\n font: {\n size: fontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 25,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 8,\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 8,\n },\n left: {\n width: 30,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.XXS,\n left: OFFSET.M,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n lineHeight: fontSize.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { ISettings, OHLCType } from './interfaces'\n\n// !large & !ta => http://localhost:3000/?cs=m&ct=candle_stick&t=AAPL&tf=d\n\nconst center = {\n barWidth: 2,\n barMargin: 0,\n border: 1,\n}\n\nconst fontSize = {\n S: 7,\n M: 8,\n XXXL: 16,\n}\n\nexport const BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 15,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -26, top: 0 },\n font: {\n size: fontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: fontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.dateOnly,\n },\n change: {\n margin: {\n top: 1,\n right: 30,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 15,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 2,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n left: {\n width: 30,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: -4,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 20,\n },\n font: {\n size: fontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 25,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 8,\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 8,\n },\n left: {\n width: 30,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.XXS,\n left: OFFSET.M,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n lineHeight: fontSize.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import { ObjectHash, Theme } from '../../../types/shared'\nimport { IChartThemeColors, chartDarkTheme, chartLightTheme } from '../constants'\nimport { BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS } from './be_large_chart_with_overlays'\nimport { BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS } from './be_large_chart_without_overlays'\nimport { BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS } from './be_small_chart_with_overlays'\nimport { BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS } from './be_small_chart_without_overlays'\nimport { INTERACTIVE_CHART_SETTINGS } from './interactive_chart_settings'\nimport { ISettings } from './interfaces'\n\nexport enum CHART_FORMAT {\n INTERACTIVE = 'INTERACTIVE',\n BE_SMALL_CHART_WITHOUT_OVERLAYS = 'BE_SMALL_CHART_WITHOUT_OVERLAYS',\n BE_SMALL_CHART_WITH_OVERLAYS = 'BE_SMALL_CHART_WITH_OVERLAYS',\n BE_LARGE_CHART_WITHOUT_OVERLAYS = 'BE_LARGE_CHART_WITHOUT_OVERLAYS',\n BE_LARGE_CHART_WITH_OVERLAYS = 'BE_LARGE_CHART_WITH_OVERLAYS',\n}\n\nexport const getChartSettings = ({ chartFormat, theme }: { theme: Theme; chartFormat?: CHART_FORMAT }): ISettings => {\n switch (chartFormat) {\n case CHART_FORMAT.BE_SMALL_CHART_WITHOUT_OVERLAYS:\n return BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.BE_SMALL_CHART_WITH_OVERLAYS:\n return BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.BE_LARGE_CHART_WITHOUT_OVERLAYS:\n return BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.BE_LARGE_CHART_WITH_OVERLAYS:\n return BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.INTERACTIVE:\n default:\n return INTERACTIVE_CHART_SETTINGS(theme)\n }\n}\n\nfunction normalizeHexAlpha(hexString = '') {\n const hexValue = hexString.replace('#', '')\n if (hexValue.length === 6) {\n return `${hexString}FF`\n }\n return hexString\n}\n\nexport const getColorOverwrites = ({\n theme,\n colors,\n}: {\n theme: Theme\n colors: ObjectHash, Theme>\n}) => {\n const customColors = colors[theme]\n const customColorKeys = Object.keys(customColors) as Array>\n const defaultColors = theme === Theme.light ? chartLightTheme : chartDarkTheme\n\n return customColorKeys.reduce((acc, colorKey) => {\n const isDefaultOverWritten =\n normalizeHexAlpha(customColors[colorKey]).toLowerCase() !==\n normalizeHexAlpha(defaultColors[colorKey]).toLowerCase()\n\n return isDefaultOverWritten\n ? {\n ...acc,\n [colorKey]: customColors[colorKey],\n }\n : acc\n }, {})\n}\n","import { Theme } from '../../../types/shared'\nimport {\n CHART_MARGIN,\n FONT_SIZE,\n LINE_HEIGHT,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { ISettings } from './interfaces'\n\nexport const INTERACTIVE_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...(theme === Theme.light ? chartLightTheme : chartDarkTheme),\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: CHART_MARGIN.XL,\n baseline: TextBaseline.alphabetic,\n ticker: {\n margin: {\n top: 30,\n left: 0,\n },\n font: {\n size: FONT_SIZE.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 30,\n left: 30,\n right: 30,\n },\n font: {\n size: FONT_SIZE.S,\n },\n },\n change: {\n margin: {\n top: 30,\n right: 0,\n },\n font: {\n size: FONT_SIZE.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: CHART_MARGIN.XXL,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: FONT_SIZE.S,\n lineHeight: LINE_HEIGHT.S,\n padding: {\n top: PADDING.XXS,\n bottom: PADDING.XXS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: CHART_MARGIN.M,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 8,\n },\n font: {\n size: FONT_SIZE.S,\n },\n },\n },\n left: {\n width: CHART_MARGIN.L,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: -8,\n left: 6,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 28,\n },\n font: {\n size: FONT_SIZE.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 33,\n },\n font: {\n size: FONT_SIZE.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 2,\n border: 1,\n },\n top: {\n height: CHART_MARGIN.S,\n },\n right: {\n width: CHART_MARGIN.XXL,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: FONT_SIZE.S,\n lineHeight: LINE_HEIGHT.S,\n padding: {\n top: PADDING.XXS,\n bottom: PADDING.XXS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: CHART_MARGIN.S,\n },\n left: {\n width: CHART_MARGIN.L,\n indicatorLabel: {\n labelSpacing: 4,\n margin: {\n top: OFFSET.S,\n left: OFFSET.M,\n },\n font: {\n size: FONT_SIZE.M,\n style: 'bold',\n lineHeight: LINE_HEIGHT.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import { ObjectHash, Theme } from '../../../types/shared'\nimport { TextAlign, TextBaseline } from '../../constants/common'\nimport { IChartThemeColors, IElementThemeColors, IIndicatorThemeColors } from '../constants'\n\nexport enum OHLCType {\n singleLine = 'singleLine',\n dateOnly = 'dateOnly',\n timeOnly = 'timeOnly',\n}\n\nexport interface IMargin {\n top?: number\n right?: number\n bottom?: number\n left?: number\n}\n\ninterface IPadding {\n top?: number\n right?: number\n bottom?: number\n left?: number\n}\n\ninterface IGenericText {\n margin: IMargin\n font: IFont\n}\n\ninterface IFont {\n size?: number\n style?: string\n weight?: string\n family?: string\n lineHeight?: number\n padding?: IPadding\n baseline?: TextBaseline\n textAlign?: TextAlign\n}\n\ninterface ISettingsGeneralBase {\n Colors: IChartThemeColors\n}\n\nexport interface ISettingsCenterBase {\n barWidth: number\n barMargin: number\n border: number\n volumeHeight?: number\n}\n\ninterface ISettingsTopBase {\n height: number\n}\n\ninterface ISettingsBottomBase {\n height: number\n}\n\ninterface ISettingsLeftBase {\n width: number\n}\n\ninterface ISettingsRightBase {\n width: number\n}\n\nexport interface ISettings {\n ChartSettings: IChartSettings\n IndicatorSettings: IIndicatorSettings\n MarketSentimentSettings: IMarketSentimentChartSettings\n ColorsSettings: Array\n ThumbSettings: IThumbSettings\n ElementSettings: IElementSettings\n}\n\nexport interface IChartSettings {\n general: IChartGeneral\n center: ISettingsCenterBase\n top: IChartTop\n bottom: IChartBottom\n left: IChartLeft\n right: IChartRight\n}\n\ninterface IChartGeneral {\n settingsHeight: number\n tickerTimeframeChangeHeight: number\n Colors: IChartThemeColors & ObjectHash\n}\n\ninterface IChartTop extends ISettingsTopBase {\n baseline: TextBaseline\n ticker: IGenericText\n ohlc: IOHLC\n change: IGenericText\n}\n\ninterface IOHLC extends IGenericText {\n type?: OHLCType\n}\n\ninterface IChartBottom extends ISettingsBottomBase {\n baseline: TextBaseline\n axis: IGenericText\n}\n\ninterface IChartLeft extends ISettingsLeftBase {\n overlayLabel: IOverlayLabel\n timeframe: IGenericText\n volumeAxis: IGenericText\n}\n\ninterface IOverlayLabel extends IGenericText {\n labelSpacing: number\n}\n\ninterface IChartRight extends ISettingsRightBase {\n axis: IGenericText\n}\n\ninterface IIndicatorSettings {\n general: IIndicatorGeneral\n center: ISettingsCenterBase\n top: ISettingsTopBase\n bottom: ISettingsBottomBase\n left: IIndicatorLeft\n right: IIndicatorRight\n}\n\ninterface IIndicatorRight extends ISettingsRightBase {\n axis: IGenericText\n}\n\ninterface IIndicatorLeft extends ISettingsLeftBase {\n indicatorLabel: IIndicatorLabel\n}\n\ninterface IIndicatorLabel extends IGenericText {\n labelSpacing: number\n}\n\ninterface IIndicatorGeneral {\n Colors: IIndicatorThemeColors\n height: number\n}\n\ninterface IMarketSentimentChartSettings {\n general: ISettingsGeneralBase\n center: ISettingsCenterBase\n top: ISettingsTopBase\n bottom: ISettingsBottomBase\n left: ISettingsLeftBase\n right: ISettingsRightBase\n}\n\ninterface IThumbSettings {\n size: number\n touchSize: number\n color: string\n borderWidth: number\n borderColor: string\n}\n\ninterface IElementSettings {\n Colors: IElementThemeColors\n defaultFill: string\n defaultTransparentFill: string\n}\n","import tailwindColors from '../constants/colors'\nimport { getHEXWithSpecificAplha } from '../utils/colors'\n\nexport interface IChartThemeColors {\n aftermarketFade: string\n background: string\n borderDown: string\n borderUp: string\n canvasFill: string\n cross: string\n crossText: string\n crossTextBackground: string\n currentBackground: string\n currentText: string\n grid: string\n gridSecondary: string\n indicatorCurrentBackground: string\n indicatorCurrentText: string\n line: string\n marketDown: string\n marketUp: string\n negativeChange: string\n ohlcTrendDown: string\n ohlcTrendUp: string\n overlayTransparentBackground: string\n percentageZeroLineText: string\n performanceIndicatorLabel: string\n positiveChange: string\n premarketFade: string\n prevClose: string\n text: string\n textSecondary: string\n trendDown: string\n trendUp: string\n volumeTrendDown: string\n volumeTrendUp: string\n wickDown: string\n wickUp: string\n zeroChange: string\n}\n\nexport interface IIndicatorThemeColors {\n line: string\n signalLine: string\n}\n\nexport interface IElementThemeColors {\n line: string\n border: string\n textWithoutBackground: string\n}\n\ninterface IDarkerWickColors {\n borderUp: string\n wickUp: string\n borderDown: string\n wickDown: string\n}\n\nexport const chartLightTheme: IChartThemeColors = {\n aftermarketFade: '#FFFFFF99',\n background: '#008CFF0E',\n borderDown: '#000000FF',\n borderUp: '#000000FF',\n canvasFill: '#FFFFFFFF',\n cross: '#0000004C',\n crossText: '#fff',\n crossTextBackground: '#111',\n currentBackground: tailwindColors.brightYellow[100],\n currentText: tailwindColors.gray[800],\n grid: '#D2D2D2FF',\n gridSecondary: '#ECECEC',\n indicatorCurrentBackground: tailwindColors.gray[600],\n indicatorCurrentText: '#fff',\n line: '#1E6DC0FF',\n marketDown: tailwindColors.red[500],\n marketUp: tailwindColors.green[500],\n negativeChange: '#C80000FF',\n ohlcTrendDown: '#E54040FF',\n ohlcTrendUp: '#40A140FF',\n overlayTransparentBackground: getHEXWithSpecificAplha('#C9CCD6', 0.25),\n percentageZeroLineText: '#111',\n performanceIndicatorLabel: '#646464',\n positiveChange: '#009600FF',\n premarketFade: '#FFFFFF99',\n prevClose: '#C80000FF',\n text: '#828282',\n textSecondary: '#dedede',\n trendDown: '#FF0000FF',\n trendUp: '#00FF00FF',\n volumeTrendDown: '#ffc0c0',\n volumeTrendUp: '#a8e0a8',\n wickDown: '#000000FF',\n wickUp: '#000000FF',\n zeroChange: '#000',\n}\n\nexport const chartDarkTheme: IChartThemeColors = {\n aftermarketFade: '#4C526133',\n background: '#1E6DC019',\n borderDown: '#F63538FF',\n borderUp: '#30CC5AFF',\n canvasFill: tailwindColors.gray[800],\n cross: '#404553',\n crossText: '#fff',\n crossTextBackground: '#111',\n currentBackground: tailwindColors.yellow[200],\n currentText: tailwindColors.gray[700],\n grid: '#363A46FF',\n gridSecondary: '#2C303A',\n indicatorCurrentBackground: tailwindColors.gray[500],\n indicatorCurrentText: '#fff',\n line: '#1E6DC0FF',\n marketDown: tailwindColors.red[300],\n marketUp: tailwindColors.green[300],\n negativeChange: tailwindColors.red[400],\n ohlcTrendDown: '#E54040FF',\n ohlcTrendUp: '#40A140FF',\n overlayTransparentBackground: getHEXWithSpecificAplha('#0C0E13', 0.35),\n percentageZeroLineText: '#fff',\n performanceIndicatorLabel: '#646464',\n positiveChange: tailwindColors.green[400],\n premarketFade: '#4C526133',\n prevClose: '#C80000FF',\n text: '#929cb3',\n textSecondary: '#929CB399',\n trendDown: '#F63538FF',\n trendUp: '#30CC5AFF',\n volumeTrendDown: '#F635387F',\n volumeTrendUp: '#30CC5A7F',\n wickDown: '#F63538FF',\n wickUp: '#30CC5AFF',\n zeroChange: '#929cb3',\n}\n\nexport const darkerWickColors: IDarkerWickColors = {\n borderUp: '#006400FF',\n wickUp: '#006400',\n borderDown: '#6E0000FF',\n wickDown: '#6E0000FF',\n}\n\nexport const indicatorLightTheme: IIndicatorThemeColors = {\n line: '#000000',\n signalLine: tailwindColors.red[400],\n}\n\nexport const indicatorDarkTheme: IIndicatorThemeColors = {\n line: '#D07933',\n signalLine: tailwindColors.red[400],\n}\n\nexport const elementLightTheme: IElementThemeColors = {\n line: '#000000',\n border: '#000000',\n textWithoutBackground: '#000000',\n}\n\nexport const elementDarkTheme: IElementThemeColors = {\n line: '#5faaf4',\n border: '#5192D1',\n textWithoutBackground: '#929cb3',\n}\nexport const generalColors: Array = [\n '#1f77b4',\n '#ff7f0e',\n '#2ca02c',\n '#d62728',\n '#9467bd',\n '#8c564b',\n '#e377c2',\n '#7f7f7f',\n '#bcbd22',\n '#17becf',\n]\n\n// node chart with thin bars color override\nexport const thinBarColorsOverride = {\n trendUp: '#00b400',\n trendDown: '#b40000',\n}\n\nexport enum AutoSaveState {\n Off,\n Saved,\n Unsaved,\n Saving,\n}\n","import Spine from '@finviz/spine'\n\nimport { AutoSaveElement } from '../controllers/autosave/constants'\nimport { getUuid } from '../utils/helpers'\nimport { HLC, initHlc } from '../utils/hlc'\nimport { AutoSaveState } from './constants'\n\ninterface DrawingsInternalStateAttrs {\n elements: AutoSaveElement[]\n latestRemoteUpdateTimestamp: HLC\n latestLocalUpdateTimestamp: HLC\n instanceUUID: string\n autoSaveState: AutoSaveState\n}\n\nclass DrawingsInternalStore extends Spine.Model {\n static initClass() {\n this.configure(\n 'DrawingsInternalState',\n 'elements',\n 'latestRemoteUpdateTimestamp',\n 'latestLocalUpdateTimestamp',\n 'autoSaveState',\n 'instanceUUID'\n )\n }\n\n elements: AutoSaveElement[]\n latestRemoteUpdateTimestamp: HLC\n latestLocalUpdateTimestamp: HLC\n instanceUUID: string\n autoSaveState: AutoSaveState\n\n constructor(attrs: Partial = {}) {\n super(attrs)\n\n this.elements = attrs.elements ?? []\n this.instanceUUID = attrs.instanceUUID ?? getUuid()\n this.latestLocalUpdateTimestamp = attrs.latestLocalUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\n this.latestRemoteUpdateTimestamp = attrs.latestRemoteUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\n this.autoSaveState = attrs.autoSaveState ?? AutoSaveState.Off\n }\n\n setAutoSaveState = (newAutoSaveState: AutoSaveState) => {\n if (this.autoSaveState !== newAutoSaveState) {\n this.updateAttributes({ autoSaveState: newAutoSaveState })\n }\n }\n}\n\nexport default DrawingsInternalStore\n","import Spine from '@finviz/spine'\nimport merge from 'lodash.merge'\n\nimport { TodoObjectHashAnyType } from '../../types/shared'\nimport { drawingToolsByType } from '../canvas/drawingTools'\nimport CanvasElement from '../canvas/element'\nimport { CanvasElementType } from '../constants/common'\nimport { getIsSSr, getUuid } from '../utils/helpers'\nimport Pane from './pane'\nimport { changeElementZIndexes } from './utils'\n\nclass Element extends Spine.Model {\n static initClass(paneModel: typeof Pane) {\n this.configure('Element', 'instance', 'lastChange', 'zIndex', 'elementId')\n this.belongsTo('pane', paneModel)\n }\n\n declare instance: CanvasElement\n declare pane_id: string\n declare destroyed: true | undefined\n declare pane: () => Pane\n lastChange: number | null = null\n elementId: string | null = null\n zIndex = -1\n\n generateUuid = getIsSSr() ? undefined : getUuid\n\n constructor(...args: any[]) {\n super(...args)\n const elementAttrs = args[0]\n this.elementId = elementAttrs?.elementId ?? this.generateUuid?.()\n this.one('create', () => {\n this.updateAttributes({\n zIndex: elementAttrs?.zIndex ?? this.pane().getElementZIndexRange().max + 1,\n })\n })\n }\n\n replace(instance: CanvasElement) {\n const oldInstance = this.instance\n this.updateAttribute('instance', instance)\n this.trigger('replace', this, oldInstance)\n }\n\n makeClone() {\n const { instance, pane_id } = this\n const { attrs } = instance\n const { scale } = instance.model\n const clonedObj = merge({ pane_id }, attrs)\n const cloned = drawingToolsByType[instance.type as CanvasElementType].fromObject(clonedObj, instance.model)\n const { ThumbSettings } = this.pane().getChartLayoutSettings()\n const offset = ThumbSettings.size + ThumbSettings.borderWidth * 2\n cloned.moveBy(scale.x.invert(offset), scale.y.invert(offset) - scale.y.invert(0))\n cloned.cachePointPositionTimestamp()\n Element.create({ instance: cloned, pane_id })\n this.trigger('makeClone', this, cloned)\n }\n\n moveToZIndex(zIndex: number) {\n const currentZIndex = this.zIndex\n const directionCoef = zIndex > currentZIndex ? 1 : -1\n\n if (this.isChart() || this.isIndicator()) {\n if (this.zIndex !== 0) {\n this.updateAttributes({ zIndex: 0 })\n }\n this.pane()\n .getAllElements()\n .filter((element) => {\n const shouldMove = directionCoef === 1 ? element.zIndex <= zIndex : element.zIndex >= zIndex\n return shouldMove && element.isDrawing()\n })\n .forEach((element) => element.moveToZIndex(directionCoef * -1))\n\n return\n }\n\n const newZIndex = zIndex === 0 ? directionCoef : zIndex // 0 is protected value for chart/indicator element\n const { min, max } = this.pane().getElementZIndexRange()\n if (\n currentZIndex === newZIndex ||\n (currentZIndex === min && directionCoef === -1) ||\n (currentZIndex === max && directionCoef === 1)\n ) {\n return\n }\n const { elementsBelowZero, elementsAboveZero } = this.pane().getBelowAboveZeroElements()\n\n changeElementZIndexes({\n elementsArray: elementsBelowZero,\n addElement: newZIndex < 0 ? this : undefined,\n oldZIndex: currentZIndex,\n newZIndex,\n isBelowZero: true,\n })\n\n changeElementZIndexes({\n elementsArray: elementsAboveZero,\n addElement: newZIndex > 0 ? this : undefined,\n oldZIndex: currentZIndex,\n newZIndex,\n })\n }\n\n bringToFront() {\n this.moveToZIndex(this.pane().getElementZIndexRange().max + 1)\n }\n\n sendToBack() {\n this.moveToZIndex(this.pane().getElementZIndexRange().min - 1)\n }\n\n bringForward() {\n this.moveToZIndex(this.zIndex + 1)\n }\n\n sendBackward() {\n this.moveToZIndex(this.zIndex - 1)\n }\n\n isChart() {\n return !!this.instance?.type.startsWith('charts/')\n }\n\n isIndicator() {\n return !!this.instance?.type.startsWith('indicators/')\n }\n\n isOverlay() {\n return !!this.instance?.type.startsWith('overlays/')\n }\n\n isDrawing() {\n return !!this.instance?.type.startsWith('canvas/')\n }\n\n isChartEvent() {\n return !!this.instance?.type.startsWith('chartEvent/')\n }\n\n isMouseDown() {\n return !!this.instance?.isMouseDown\n }\n\n hasOngoingInteraction() {\n return this.isMouseDown() || this.instance.isEditInProgress\n }\n\n toObject() {\n return {\n ...this.instance.toObject(),\n elementId: this.elementId,\n zIndex: this.zIndex,\n }\n }\n\n toConfig() {\n return {\n ...this.instance.toConfig(),\n elementId: this.elementId,\n zIndex: this.zIndex,\n }\n }\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n return this.destroy(options)\n }\n\n refreshElementId() {\n this.updateAttribute('elementId', this.generateUuid?.())\n }\n}\n\nexport default Element\n","import endOfDay from 'date-fns/endOfDay'\nimport lastDayOfMonth from 'date-fns/lastDayOfMonth'\nimport lastDayOfWeek from 'date-fns/lastDayOfWeek'\nimport setDate from 'date-fns/set'\n\nimport { TIMEFRAME, TIMEFRAMES_WITH_PRE_MARKET } from '../../constants/common'\nimport { convertLocalToNyTime, dateFromUnixTimestamp } from '../../utils'\nimport Chart from '../chart'\n\nconst MARKET_START = { hours: 9, minutes: 30 }\nconst END_OF_DAY = { hours: 23, minutes: 59 }\n\nfunction getIsDateBeforeMarketStart(date: Date) {\n const hours = date.getHours()\n const minutes = date.getMinutes()\n return hours < MARKET_START.hours || (hours === MARKET_START.hours && minutes < MARKET_START.minutes)\n}\n\nexport function roundTimeForSyncedPane({\n sourceChart,\n targetChart,\n timestamp,\n}: {\n sourceChart: Chart\n targetChart: Chart\n timestamp: number\n}) {\n let dateToReturn = dateFromUnixTimestamp(timestamp)\n const sourceChartHasPremarket =\n sourceChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(sourceChart.timeframe)\n const targetChartHasPremarket =\n targetChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(targetChart.timeframe)\n\n if ([TIMEFRAME.d, TIMEFRAME.w, TIMEFRAME.m].includes(sourceChart.timeframe)) {\n dateToReturn = setDate(dateToReturn, MARKET_START)\n }\n\n if (targetChart.timeframe === TIMEFRAME.m) {\n dateToReturn = setDate(lastDayOfMonth(dateToReturn), END_OF_DAY)\n } else if (targetChart.timeframe === TIMEFRAME.w) {\n dateToReturn = setDate(lastDayOfWeek(dateToReturn, { weekStartsOn: 1 }), END_OF_DAY)\n } else if (targetChart.timeframe === TIMEFRAME.d && targetChart.quote().instrument !== 'stock') {\n dateToReturn = endOfDay(dateToReturn)\n }\n\n if (sourceChartHasPremarket && !targetChartHasPremarket && targetChart.quote().instrument === 'stock') {\n dateToReturn = getIsDateBeforeMarketStart(dateToReturn) ? setDate(dateToReturn, MARKET_START) : dateToReturn\n }\n\n return ~~(convertLocalToNyTime(dateToReturn, false).getTime() / 1000)\n}\n","import Spine from '@finviz/spine'\n\nimport { ChartSyncablePart } from '../chart/contstants'\nimport Pane from '../pane'\nimport { roundTimeForSyncedPane } from './mouse-utils'\n\nexport class Mouse extends Spine.Model {\n static initClass() {\n this.configure('Mouse', 'position')\n this.belongsTo('pane', Pane)\n }\n\n declare position: { x: number; y: number } | undefined\n declare pane: () => Pane | null\n\n getIsCrossSyncOn = () => !!this.pane()?.chart().getIsChartPartInSync(ChartSyncablePart.Crosshair)\n\n getIsMouseInChartOfPane = (pane: Pane) => !!this.pane()?.chart().eql(pane.chart())\n\n getShouldRenderCrossInPane = (pane: Pane) => this.getIsCrossSyncOn() || this.getIsMouseInChartOfPane(pane)\n\n getCrossIndexForPane = (pane: Pane) => {\n if (this.position) {\n if (this.getIsMouseInChartOfPane(pane)) {\n return Math.round(this.position.x)\n }\n const paneOfMouse = this.pane()\n if (this.getIsCrossSyncOn() && paneOfMouse) {\n const mouseInChart = paneOfMouse.chart()\n const currentPaneChart = pane.chart()\n const mousePositionTimestamp = mouseInChart.quote().getTimestampFomPositionX(Math.round(this.position.x))\n const currentPanePositionX = currentPaneChart.quote().getPositionXFromTimestamp(\n roundTimeForSyncedPane({\n sourceChart: mouseInChart,\n targetChart: currentPaneChart,\n timestamp: mousePositionTimestamp,\n })\n )\n return Math.floor(currentPanePositionX)\n }\n }\n\n return Number.NaN\n }\n\n getPriceForPane = (pane: Pane) => {\n const positionY = this.position?.y ?? null\n\n if (this.pane()?.eql(pane)) {\n return positionY\n }\n\n if (this.getIsCrossSyncOn() && this.pane()) {\n const mousePaneIndex = this.pane()?.getIndexInChart()\n const currentPaneIndex = pane.getIndexInChart()\n return mousePaneIndex === currentPaneIndex ? positionY : null\n }\n\n return null\n }\n}\n\n/**\n * Mouse is a singleton, so `initClass` must be called before we create the instance\n * otherwise it wouldn’t work\n */\nMouse.initClass()\n\nconst mouse = Mouse.create()\nmouse.save()\n\nexport default mouse as Mouse\n","import Spine, { Collection } from '@finviz/spine'\nimport omit from 'lodash.omit'\n\nimport { Position, TodoObjectHashAnyType } from '../../types/shared'\nimport CanvasElement from '../canvas/element'\nimport { ChartEventBadgeType, PANE_HEIGHT_DEFAULT } from '../constants/common'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Chart from './chart'\nimport ChartEventElement from './chart-event-element'\nimport Element from './element'\nimport { rebuildElementZIndexes } from './utils'\n\nexport interface ScaleAxis {\n (index: number): number\n invert: (x: number) => number\n domain: () => [currentDomainMax: number, currentDomainMin: number]\n width: (x: number) => number\n height: (y: number) => number\n ticks: (y: number) => number[]\n}\n\nconst CHART_EVENT_BADGE_TYPE_ORDER = [\n ChartEventBadgeType.Split,\n ChartEventBadgeType.Dividends,\n ChartEventBadgeType.EarningsPositive,\n ChartEventBadgeType.EarningsNegative,\n ChartEventBadgeType.EarningsNeutral,\n ChartEventBadgeType.EarningsFuture,\n]\n\nclass Pane extends Spine.Model {\n static initClass(\n elementModel: typeof Element,\n chartEventElementModel: typeof ChartEventElement,\n chartModel: typeof Chart\n ) {\n this.configure('Pane', 'height', 'scale', 'scaleRange', 'instance', 'selection')\n this.hasMany('elements', elementModel)\n this.hasMany('chartEvents', chartEventElementModel)\n this.belongsTo('mainElement', elementModel)\n this.belongsTo('chart', chartModel)\n }\n\n declare id: string\n declare chart_id: string\n declare height: number\n declare scale: {\n x: ScaleAxis\n y: ScaleAxis\n }\n\n declare instance: any\n declare chart: () => Chart\n declare mainElement: () => T | null\n declare elements: () => Collection\n declare chartEvents: () => Collection\n selection: CanvasElement | null = null\n scaleRange: { min: number; max: number } | null = null\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n this.elements()\n .all()\n .forEach((element) => {\n element.destroyCascade()\n })\n return this.destroy(options)\n }\n\n toObject() {\n const elements = this.elements()\n .all()\n .map((el) => el.toObject())\n return {\n height: this.height,\n scale: this.scale,\n scaleRange: this.scaleRange,\n elements,\n }\n }\n\n toConfig(omitKeys = [] as string[]) {\n const elements = this.elements()\n .all()\n .map((el) => el.toConfig())\n return omit(\n {\n height: this.height,\n scaleRange: this.scaleRange,\n elements,\n },\n omitKeys\n )\n }\n\n move(direction: Position) {\n const chartPanes = this.chart().getAllPanes()\n const chartPane = chartPanes.find((pane) => !pane.getIsIndicatorPane())\n const targetPane = chartPanes.find((pane) => this.eql(pane))\n\n if (!chartPane || !targetPane) return\n\n const currentChartPaneRecords = Pane.records.filter((pane) => pane.chart_id === targetPane.chart_id)\n const ohterChartPaneRecords = Pane.records.filter((pane) => pane.chart_id !== targetPane.chart_id)\n\n const targetRecordIndex = currentChartPaneRecords.findIndex((record) => record.id === targetPane.id)\n const arrayWithoutTargetRecord = currentChartPaneRecords.filter((_, index) => index !== targetRecordIndex)\n const chartRecordIndex = arrayWithoutTargetRecord.findIndex((record) => record.id === chartPane.id)\n\n const panesAbove = arrayWithoutTargetRecord.slice(0, chartRecordIndex)\n const panesBelow = arrayWithoutTargetRecord.slice(chartRecordIndex + 1)\n if (direction === Position.Above) {\n panesAbove.push(currentChartPaneRecords[targetRecordIndex])\n panesAbove.sort((a, b) => a.getNumericId() - b.getNumericId())\n }\n if (direction === Position.Below) {\n panesBelow.push(currentChartPaneRecords[targetRecordIndex])\n panesBelow.sort((a, b) => a.getNumericId() - b.getNumericId())\n }\n\n Pane.records = ohterChartPaneRecords.concat([\n ...panesAbove,\n arrayWithoutTargetRecord[chartRecordIndex],\n ...panesBelow,\n ])\n this.chart().trigger('change', this.chart())\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.chart().chart_layout())\n }\n\n getAllElements() {\n return this.elements()\n .all()\n .sort((a, b) => a.zIndex - b.zIndex)\n }\n\n getAllChartEvents(isSorted = true) {\n const chartEvents = [...this.chartEvents().all()]\n return isSorted ? chartEvents.sort((a, b) => a.zIndex - b.zIndex) : chartEvents\n }\n\n getChartOrIndicatorElement() {\n return this.getAllElements().find((el) => el.isChart() || el.isIndicator()) ?? null\n }\n\n getIsIndicatorPane() {\n return !!this.mainElement()?.isIndicator()\n }\n\n getIsChartPane() {\n return !!this.mainElement()?.isChart()\n }\n\n resetHeight() {\n if (this.getIsIndicatorPane()) {\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.indicator)\n }\n if (this.getIsChartPane()) {\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.chart)\n }\n }\n\n getIndexInChart() {\n return this.chart()\n .getAllPanes()\n .findIndex((chartPane) => chartPane.eql(this))\n }\n\n getElementZIndexRange() {\n let max = -1\n let min = 1\n this.getAllElements().forEach((el) => {\n if (el.zIndex > max) {\n max = el.zIndex\n }\n if (el.zIndex < min) {\n min = el.zIndex\n }\n })\n return { min, max }\n }\n\n getBelowAboveZeroElements() {\n const allPaneElements = this.getAllElements()\n const elementsBelowZero: Element[] = []\n const elementsAboveZero: Element[] = []\n allPaneElements.forEach((el) => {\n if (el.zIndex < 0) {\n elementsBelowZero.push(el)\n }\n if (el.zIndex > 0) {\n elementsAboveZero.push(el)\n }\n })\n\n return { elementsBelowZero, elementsAboveZero }\n }\n\n normalizeZIndexes() {\n const { elementsBelowZero, elementsAboveZero } = this.getBelowAboveZeroElements()\n rebuildElementZIndexes({ elementsArray: elementsBelowZero, isBelowZero: true })\n rebuildElementZIndexes({ elementsArray: elementsAboveZero, isBelowZero: false })\n }\n\n getQuoteRawTicker() {\n return this.chart().getQuoteRawTicker()\n }\n\n getNumericId() {\n return Number(this.id.replace('c-', ''))\n }\n\n updateChartEventsZIndexes() {\n if (!this.scale || !this.scale.hasOwnProperty('x')) {\n return\n }\n\n const chartEvents = this.getAllChartEvents(false).sort(\n (a, b) => a.instance.attrs.positionTimestamps!.x - b.instance.attrs.positionTimestamps!.x\n )\n const hoveredChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isHovered)\n const openedChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isOpen)\n\n const hoveredTypeChartEventElements: ChartEventElement[] = []\n const openedTypeChartEventElements: ChartEventElement[] = []\n const nonActiveChartEventElements: ChartEventElement[] = []\n\n chartEvents.forEach((chartEvent, index) => {\n const chartEventsOnSameXPoint = chartEvents.filter(\n (chartEvent_B, i) =>\n i < index && Math.round(chartEvent.instance.attrs.x) === Math.round(chartEvent_B!.instance.attrs.x)\n )\n chartEvent.updateAttributes({ yIndex: chartEventsOnSameXPoint.length })\n const isHovered = chartEvent.instance === hoveredChartEvent?.instance\n const isOpened = chartEvent.instance === openedChartEvent?.instance\n const isHoveredType = chartEvent.instance.type === hoveredChartEvent?.instance.type\n const isOpenType = chartEvent.instance.type === openedChartEvent?.instance.type\n if (!isHovered || !isOpened) {\n if (isHoveredType) {\n hoveredTypeChartEventElements.push(chartEvent)\n } else if (isOpenType) {\n openedTypeChartEventElements.push(chartEvent)\n } else {\n nonActiveChartEventElements.push(chartEvent)\n }\n }\n })\n\n nonActiveChartEventElements.sort(\n (a, b) =>\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(a.instance.getChartEvenBadgeType()) -\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(b.instance.getChartEvenBadgeType())\n )\n\n const chartEventElements = [\n ...nonActiveChartEventElements,\n ...openedTypeChartEventElements,\n openedChartEvent,\n ...hoveredTypeChartEventElements,\n hoveredChartEvent,\n ].filter(Boolean)\n chartEventElements.forEach((chartEvent, index) => {\n chartEvent!.updateAttributes({ zIndex: index })\n })\n }\n}\n\nexport default Pane\n","import { ObjectHash, RequireByKey } from '../../types/shared'\n\ninterface HeikinAshiData {\n HAOpen: number[]\n HAClose: number[]\n}\n\ninterface QuoteValues {\n cachedAt: null | number\n dayToOffset: ObjectHash[]\n dateToIndex: ObjectHash[]\n heikinAshiData?: HeikinAshiData\n daysInQuote: Date[]\n}\n\ninterface QuoteCacheFunctionProps {\n cid: string\n key: keyof QuoteValues\n fetchedAt: number\n value: any\n}\n\nconst quoteCache = {} as ObjectHash\n\nexport function getCachedQuote({\n cid,\n key,\n fetchedAt,\n}: RequireByKey>, 'cid'>) {\n const quote = quoteCache[cid]\n if (quote?.cachedAt === fetchedAt && key) {\n return quote[key]\n } else if (!key) {\n return quote\n }\n return null\n}\n\nexport function setCachedQuote({\n cid,\n key,\n value,\n fetchedAt,\n}: Pick) {\n quoteCache[cid] = {\n ...(quoteCache[cid]?.cachedAt === fetchedAt ? quoteCache[cid] : {}),\n [key]: value,\n cachedAt: fetchedAt,\n } as QuoteValues\n}\n\nexport function deleteCachedQuote({ cid }: Pick) {\n delete quoteCache[cid]\n}\n","import Spine from '@finviz/spine'\nimport { isSameMonth, isSameWeek } from 'date-fns'\nimport queryString from 'query-string'\n\nimport { Instrument, ObjectHash, TodoObjectHashAnyType } from '../../types/shared'\nimport { ChartEventDbType, ChartEventType, IntradayTimeframeInterval, TIMEFRAME } from '../constants/common'\nimport { IDividends, IEarnings, ISplit } from '../controllers/chart-events/utils'\nimport type { ICOT } from '../indicators/cot'\nimport { dateFromUnixTimestamp, dateStringFromDate } from '../utils'\nimport { getIsAbortError } from '../utils/abort_controller'\nimport { getPositionXFromTimestamp, getTimestampFromPositionX } from '../utils/chart'\nimport fetchApi, { NotFoundError } from '../utils/fetch_api'\nimport { getIsSSr } from '../utils/helpers'\nimport { QuoteFetchType, QuoteFetchTypeUrlOption, QuoteUrlOptions } from './quote/constants'\nimport { deleteCachedQuote, getCachedQuote, setCachedQuote } from './quoteCache'\nimport { getRawTickerForInstrument } from './utils'\n\nconst quoteRefreshChecksBeforeFullRefresh = 15\n\ntype TodoPattern = TodoObjectHashAnyType\n\nexport interface TickerTimeframesProps {\n ticker: string\n instrument: string\n timeframe: string\n}\n\ninterface QuoteFetchOptions {\n aftermarket?: boolean\n premarket?: boolean\n patterns?: boolean\n events?: boolean\n maxBars?: number\n}\n\ninterface QuoteInternalOptions {\n cachePredicate?: (quote: Quote) => boolean\n fetchNewDataOnCachedQuote?: boolean\n}\n\ninterface UrlOptions extends QuoteFetchOptions {\n ticker: string\n instrument: string\n timeframe: string\n}\n\ntype ChartEventDataRaw = Omit & { eventType: ChartEventDbType }\n\ninterface DataResponse {\n COTs: COTData\n name: string\n ticker: string\n instrument: string\n interval: number\n timeframe: string\n open: number[]\n high: number[]\n low: number[]\n close: number[]\n date: number[]\n volume: number[]\n lastOpen: number\n lastHigh: number\n lastLow: number\n lastClose: number\n lastDate: number\n lastTime: string | null\n lastVolume: number\n dataId: string\n prevClose: number\n afterClose: number\n afterChange: number\n afterTime: string | null\n drawMinutesPerDay: number\n marketStartMinutes: number\n premarketLengthMinutes: number\n aftermarketLengthMinutes: number\n aftermarket: boolean\n premarket: boolean\n hasPatterns: boolean\n patterns: Array\n patternsMinRange: number\n patternsMaxRange: number\n relativeVolume: number\n isIntraday: boolean\n noNewData?: boolean\n chartEvents?: ChartEventDataRaw[]\n}\n\ninterface COTData {\n [code: string]: ICOT\n}\n\nconst emptyQuote = {\n open: [],\n high: [],\n low: [],\n close: [],\n volume: [],\n date: [],\n fetchedAt: -1,\n numberOfRefreshChecks: 0,\n isFetching: false,\n is404: false,\n COTs: undefined,\n name: undefined,\n drawMinutesPerDay: undefined,\n marketStartMinutes: undefined,\n premarketLengthMinutes: undefined,\n aftermarketLengthMinutes: undefined,\n patternsMinRange: undefined,\n patternsMaxRange: undefined,\n relativeVolume: undefined,\n lastOpen: undefined,\n lastHigh: undefined,\n lastLow: undefined,\n lastClose: undefined,\n lastVolume: undefined,\n dataId: undefined,\n lastDate: undefined,\n prevClose: undefined,\n afterClose: undefined,\n afterChange: undefined,\n chartEvents: [],\n}\n\ninterface ICacheAvailabilityCheckFunctionsArguments {\n quote: Quote\n options?: QuoteFetchOptions & QuoteInternalOptions\n}\n\nconst doesQuoteAndOptionsMatch = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\n !quote.premarket === !options?.premarket &&\n !quote.aftermarket === !options?.aftermarket &&\n !quote.hasPatterns === !options?.patterns &&\n // if options.events is false we can reuse quote with events\n (!options?.events || !!quote.events)\n\nconst doesQuoteAndFetchParamsMatch = ({\n quote,\n ticker,\n instrument,\n timeframe,\n}: {\n quote: Quote\n ticker: string\n instrument: Instrument\n timeframe: TIMEFRAME\n}) => quote.ticker === ticker && quote.instrument === instrument && quote.timeframe === timeframe\n\n// either we don't care about matching uuid at all, or they have to match\nconst isSameOrNoChartUuid = ({ quote, uuid }: { quote: Quote; uuid?: string }) => !uuid || quote.chartUuid === uuid\n\nconst isCacheAllowed = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\n !options?.cachePredicate || options.cachePredicate(quote)\n\nconst isNotEmptyQuote = (quote: Quote) => quote.fetchedAt !== -1 || quote.isFetching\n\nexport type QuoteGetParams = {\n ticker: string\n instrument: Instrument\n timeframe: TIMEFRAME\n options?: QuoteFetchOptions & QuoteInternalOptions\n abortController?: null | AbortController\n fetchFunc?: any\n shouldUseCache?: boolean\n chartUuid?: string\n}\n\nfunction getChartEventsWithId({ ticker, chartEvents }: { ticker: string; chartEvents?: ChartEventDataRaw[] }) {\n return (\n chartEvents?.map((item) => {\n let eventType: ChartEventType\n switch (item.eventType) {\n case ChartEventDbType.Dividends:\n eventType = ChartEventType.Dividends\n break\n case ChartEventDbType.Split:\n eventType = ChartEventType.Split\n break\n case ChartEventDbType.Earnings:\n eventType = ChartEventType.Earnings\n break\n }\n return {\n ...item,\n elementId: `${ticker.toLowerCase()}-${item.eventType}-${item.dateTimestamp}`,\n eventType,\n }\n }) ?? []\n )\n}\n\nclass Quote extends Spine.Model {\n static initClass() {\n this.configure(\n 'Quote',\n 'ticker',\n 'name',\n 'instrument',\n 'timeframe',\n 'open',\n 'high',\n 'low',\n 'close',\n 'date',\n 'volume',\n 'lastOpen',\n 'lastHigh',\n 'lastLow',\n 'lastClose',\n 'lastDate',\n 'lastVolume',\n 'lastTime',\n 'dataId',\n 'prevClose',\n 'COTs',\n 'chartEvents',\n 'afterClose',\n 'afterChange',\n 'afterTime',\n 'drawMinutesPerDay',\n 'marketStartMinutes',\n 'premarketLengthMinutes',\n 'aftermarketLengthMinutes',\n 'aftermarket',\n 'premarket',\n 'events',\n 'hasPatterns',\n 'patterns',\n 'patternsMinRange',\n 'patternsMaxRange',\n 'relativeVolume',\n 'fetchedAt',\n 'isIntraday',\n 'interval',\n 'drawDays',\n 'barIndex',\n 'barToDataIndex',\n 'fetchingPromise',\n 'isFetching',\n 'wasFetchAborted',\n 'chartUuid',\n 'numberOfRefreshChecks',\n 'maxBars',\n 'ideaID',\n 'is404'\n )\n }\n\n static async get({\n ticker: tickerRaw,\n instrument,\n timeframe,\n options,\n abortController,\n fetchFunc,\n shouldUseCache = true,\n chartUuid,\n }: QuoteGetParams): Promise {\n const ticker = tickerRaw.replace('@', '')\n const [quote] = shouldUseCache\n ? Quote.select(\n (q) =>\n doesQuoteAndFetchParamsMatch({ quote: q, ticker, instrument, timeframe }) &&\n isSameOrNoChartUuid({ quote: q, uuid: chartUuid }) &&\n isNotEmptyQuote(q) &&\n isCacheAllowed({ quote: q, options }) &&\n (q.instrument !== Instrument.Stock ||\n Number.isInteger(q.ideaID) ||\n doesQuoteAndOptionsMatch({ quote: q, options }))\n )\n : []\n\n if (quote) {\n if (quote.isFetching) {\n await quote.getResolvedFetchingPromise()\n } else if (options?.fetchNewDataOnCachedQuote) {\n await quote.fetchData({ fetchType: QuoteFetchType.NewerData, abortController, fetchFunc })\n }\n return quote\n }\n\n const newQuote = Quote.create({\n ...emptyQuote,\n ticker,\n timeframe,\n instrument,\n chartUuid,\n maxBars: options?.maxBars,\n premarket: options?.premarket,\n aftermarket: options?.aftermarket,\n hasPatterns: options?.patterns,\n patterns: options?.patterns,\n events: !!options?.events,\n })\n\n await newQuote.fetchData({ fetchType: QuoteFetchType.Refetch, abortController, fetchFunc })\n\n return newQuote\n }\n\n static async getAll(tickersAndTimeframes: Array<{ ticker: string; instrument: Instrument; timeframe: TIMEFRAME }>) {\n // TODO: fetch in 1 request\n if (tickersAndTimeframes.length === 0) {\n return {}\n }\n\n try {\n await Promise.all(\n tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\n this.get({ ticker: ticker, instrument, timeframe })\n )\n )\n const data = tickersAndTimeframes.reduce(\n (accumulator, currentValue) => ({\n ...accumulator,\n [currentValue.ticker]: Quote.select(\n (q: Quote) =>\n q.ticker === currentValue.ticker &&\n q.instrument === currentValue.instrument &&\n q.timeframe === currentValue.timeframe\n )[0],\n }),\n {}\n )\n return data\n } catch (err) {\n // TODO: handle somehow\n }\n }\n\n declare ticker: string\n declare name: string\n declare instrument: Instrument\n declare interval: number\n declare timeframe: TIMEFRAME\n declare open: number[]\n declare high: number[]\n declare low: number[]\n declare close: number[]\n declare date: number[]\n declare volume: number[]\n declare lastOpen: number\n declare lastHigh: number\n declare lastLow: number\n declare lastClose: number\n declare lastDate: number\n declare lastVolume: number\n declare dataId: string\n declare prevClose: number\n declare COTs: COTData\n declare afterClose: number\n declare afterChange: number\n declare drawMinutesPerDay: number\n declare marketStartMinutes: number\n declare premarketLengthMinutes: number\n declare aftermarketLengthMinutes: number\n declare hasPatterns: boolean\n declare patterns: Array | undefined\n declare patternsMinRange: number\n declare patternsMaxRange: number\n declare relativeVolume: number\n declare isIntraday: boolean\n declare drawDays?: number\n declare barIndex: number[]\n /**\n * Array of length the same as number of bars\n *\n * If there's a gap and a bar index has no corresponding data index,\n * the last data index is used (or 0 if there's no last data index)\n *\n * @type {number[]}\n */\n declare barToDataIndex: number[]\n declare chartUuid?: string\n declare aftermarket?: boolean\n declare premarket?: boolean\n declare fetchedAt: number\n declare numberOfRefreshChecks: number\n declare isFetching: boolean\n declare fetchingPromise?: Promise\n declare wasFetchAborted: boolean\n declare maxBars?: number\n declare ideaID?: number\n declare is404?: boolean\n declare chartEvents: Array\n declare events?: boolean\n\n async fetchRequest({\n abortController,\n fetchFunc,\n options = { type: QuoteFetchTypeUrlOption.New },\n }: {\n abortController?: null | AbortController\n fetchFunc?: any\n options?: QuoteUrlOptions\n }) {\n let data: DataResponse | null = null\n let is404 = false\n let wasFetchAborted = false\n\n const fetchingPromise = fetchApi({\n location: this.getUrl(options),\n throwOnStatusCodes: [404],\n abortController,\n fetchFunc,\n })\n\n this.updateAttributes({\n isFetching: true,\n fetchingPromise,\n })\n\n try {\n data = await fetchingPromise\n } catch (err) {\n if (getIsAbortError(err as Error)) {\n wasFetchAborted = true\n } else if (process.env.IS_E2E_TESTING) {\n throw new Error('Quote fetch error', { cause: err })\n }\n is404 = err instanceof NotFoundError\n // Ignore network/notfound errors\n }\n\n const shouldUseEmptyQuote = !data && !wasFetchAborted && options.type === QuoteFetchTypeUrlOption.New\n\n if (process.env.IS_E2E_TESTING && shouldUseEmptyQuote) {\n throw new Error('Quote fetch new fail', { cause: { options, is404, wasFetchAborted, data } })\n }\n\n this.updateAttributes({\n ...(shouldUseEmptyQuote ? emptyQuote : {}),\n is404,\n wasFetchAborted,\n isFetching: false,\n })\n\n return data\n }\n\n async isPossibleToFetchSequentialData({\n abortController,\n fetchFunc,\n }: {\n abortController?: null | AbortController\n fetchFunc?: any\n } = {}) {\n const data = await this.fetchRequest({ abortController, fetchFunc })\n if (data && data.date.length > 0 && this.date.length > 0) {\n return this.date[this.date.length - 1] >= data.date[0]\n }\n return false\n }\n\n async fetchData({\n fetchType,\n abortController,\n fetchFunc,\n }: {\n fetchType: QuoteFetchType\n abortController?: null | AbortController\n fetchFunc?: any\n }) {\n let options: QuoteUrlOptions\n if (fetchType === QuoteFetchType.Refetch) {\n options = { type: QuoteFetchTypeUrlOption.New }\n } else if (fetchType === QuoteFetchType.NewerData) {\n options = { type: QuoteFetchTypeUrlOption.Newer }\n if ((this.numberOfRefreshChecks ?? 0) < quoteRefreshChecksBeforeFullRefresh) {\n options.dataId = this.dataId\n }\n } else {\n return\n }\n if (this.instrument === Instrument.Stock) {\n options.events = this.events == null ? true : this.events\n }\n\n const data = await this.fetchRequest({ abortController, fetchFunc, options })\n\n if (!data || data.noNewData === true) {\n this.updateAttributes({\n numberOfRefreshChecks: (this.numberOfRefreshChecks ?? 0) + 1,\n })\n return\n }\n if (this.timeframe !== data.timeframe || this.ticker.toLowerCase() !== data.ticker?.toLowerCase()) {\n return\n }\n\n const newQuoteData = {\n COTs: data.COTs,\n name: data.name,\n open: data.open,\n high: data.high,\n low: data.low,\n close: data.close,\n volume: data.volume,\n date: data.date,\n drawMinutesPerDay: data.drawMinutesPerDay,\n marketStartMinutes: data.marketStartMinutes,\n premarketLengthMinutes: data.premarketLengthMinutes,\n aftermarketLengthMinutes: data.aftermarketLengthMinutes,\n patterns: data.patterns,\n patternsMinRange: data.patternsMinRange,\n patternsMaxRange: data.patternsMaxRange,\n relativeVolume: data.relativeVolume,\n lastOpen: data.lastOpen,\n lastHigh: data.lastHigh,\n lastLow: data.lastLow,\n lastClose: data.lastClose,\n lastVolume: data.lastVolume,\n dataId: data.dataId,\n lastDate: data.lastDate,\n lastTime: data.lastTime,\n prevClose: data.prevClose,\n afterClose: data.afterClose,\n afterChange: data.afterChange,\n afterTime: data.afterTime,\n numberOfRefreshChecks: 0,\n chartEvents: data.chartEvents ?? [],\n fetchedAt: Date.now(),\n }\n\n if (\n !(\n fetchType === QuoteFetchType.Refetch ||\n [Instrument.Futures, Instrument.Forex, Instrument.Crypto].includes(this.instrument)\n )\n ) {\n /*\n * Merges current and new data taking date as index\n */\n let AIndex = 0\n let BIndex = 0\n let mergeIndex = -1\n while (AIndex < this.date.length || BIndex < data.date.length) {\n const ADate = this.date[AIndex]\n const BDate = data.date[BIndex]\n if (BDate === undefined) {\n break\n } else if (ADate === BDate) {\n // Same date, update OHLCV\n this.open[AIndex] = data.open[BIndex]\n this.high[AIndex] = data.high[BIndex]\n this.low[AIndex] = data.low[BIndex]\n this.close[AIndex] = data.close[BIndex]\n this.volume[AIndex] = data.volume[BIndex]\n AIndex++\n BIndex++\n } else if (ADate > BDate || ADate === undefined) {\n // New bar for a date not yet in our dataset\n // If weekly or monthly timeframe & wasn't merged on AIndex\n if (mergeIndex === -1 && [TIMEFRAME.w, TIMEFRAME.m].includes(this.timeframe)) {\n const prevAIndex = AIndex - 1\n const prevDate = dateFromUnixTimestamp(this.date[prevAIndex])\n const newDate = dateFromUnixTimestamp(data.date[BIndex])\n // If merge bar for weekly is sameWeek or for monthly is sameMonth perform merge on AIndex\n if (\n (TIMEFRAME.w === this.timeframe && isSameWeek(prevDate, newDate, { weekStartsOn: 1 })) ||\n (TIMEFRAME.m === this.timeframe && isSameMonth(prevDate, newDate))\n ) {\n this.date[prevAIndex] = data.date[BIndex]\n this.open[prevAIndex] = data.open[BIndex]\n this.high[prevAIndex] = data.high[BIndex]\n this.low[prevAIndex] = data.low[BIndex]\n this.close[prevAIndex] = data.close[BIndex]\n this.volume[prevAIndex] = data.volume[BIndex]\n mergeIndex = prevAIndex\n // Incrementing BIndex only because we're mergin arrays on AIndex\n BIndex++\n continue\n }\n }\n this.date.splice(AIndex, 0, data.date[BIndex])\n this.open.splice(AIndex, 0, data.open[BIndex])\n this.high.splice(AIndex, 0, data.high[BIndex])\n this.low.splice(AIndex, 0, data.low[BIndex])\n this.close.splice(AIndex, 0, data.close[BIndex])\n this.volume.splice(AIndex, 0, data.volume[BIndex])\n // Incrementing AIndex because we're changing the array in-place\n AIndex++\n BIndex++\n } else if (ADate < BDate) {\n AIndex++\n } else {\n console.warn('fetchNewerData merge warning')\n window.Sentry?.captureMessage('quote.ts fetchNewerData merge warning', {\n extra: {\n thisDateLength: this.date.length,\n dataDateLength: data.date.length,\n AIndex,\n BIndex,\n ADate,\n BDate,\n },\n })\n }\n }\n\n newQuoteData.date = this.date\n newQuoteData.open = this.open\n newQuoteData.high = this.high\n newQuoteData.low = this.low\n newQuoteData.close = this.close\n newQuoteData.volume = this.volume\n }\n\n const hasUpdatedSuccessfully = this.updateAttributes(newQuoteData)\n // https://github.com/finvizhq/charts/issues/510\n if (!hasUpdatedSuccessfully) {\n // attempt to find if this.model.quote() => null is comming from this.save() validation fail\n window.Sentry?.captureMessage('quote.ts fetchNewerData save() validation failed', { extra: this })\n }\n if (!this) {\n // or this somehow became null / falsy\n window.Sentry?.captureMessage('quote.ts fetchNewerData this is falsy', { extra: this })\n }\n this.trigger(fetchType, this, fetchType)\n }\n\n async getResolvedFetchingPromise() {\n try {\n return await this.fetchingPromise\n } catch {\n // do nothing\n }\n }\n\n fetchOlderData() {\n return // not yet implemented\n // TODO cancel previous request\n }\n\n load(atts: ObjectHash) {\n super.load(atts)\n const { fetchedAt = 0 } = atts\n const { cachedAt } = (getCachedQuote({ cid: this.cid }) as { cachedAt: number } | null) || {}\n if (this.timeframe && cachedAt !== fetchedAt) {\n setCachedQuote({ cid: this.cid, key: 'cachedAt', value: fetchedAt, fetchedAt })\n this.isIntraday = [\n TIMEFRAME.i1,\n TIMEFRAME.i2,\n TIMEFRAME.i3,\n TIMEFRAME.i5,\n TIMEFRAME.i10,\n TIMEFRAME.i15,\n TIMEFRAME.i30,\n TIMEFRAME.h,\n TIMEFRAME.h2,\n TIMEFRAME.h4,\n ].includes(this.timeframe)\n this.interval = this.isIntraday\n ? IntradayTimeframeInterval[this.timeframe as keyof typeof IntradayTimeframeInterval]\n : 0\n this.drawDays = this.getDrawDays()\n this.barIndex = this.getBarIndexes()\n this.barToDataIndex = this.barIndex.flatMap((barIndex, index) => {\n const lastIndex = this.barIndex[index - 1] ?? -1\n return [...Array.from({ length: barIndex - lastIndex - 1 }).fill(Math.max(0, index - 1)), index] as number[]\n })\n }\n if (this.timeframe && this.ticker) {\n this.chartEvents = getChartEventsWithId({\n ticker: this.ticker,\n chartEvents: this.chartEvents as unknown as ChartEventDataRaw[],\n })\n }\n return this\n }\n\n destroy(options?: ObjectHash) {\n super.destroy(options)\n deleteCachedQuote({ cid: this.cid })\n return this\n }\n\n getDrawDays() {\n if (this.instrument !== Instrument.Stock) {\n return Infinity\n }\n switch (this.timeframe) {\n case TIMEFRAME.i1:\n case TIMEFRAME.i2:\n case TIMEFRAME.i3:\n case TIMEFRAME.i5:\n case TIMEFRAME.i10:\n return 10\n case TIMEFRAME.i15:\n case TIMEFRAME.i30:\n case TIMEFRAME.h:\n case TIMEFRAME.h2:\n case TIMEFRAME.h4:\n return 15\n default:\n break\n }\n }\n\n getHeikinAshiData() {\n const cachedHeikinAshiData = getCachedQuote({ cid: this.cid, key: 'heikinAshiData', fetchedAt: this.fetchedAt })\n if (cachedHeikinAshiData) {\n return cachedHeikinAshiData as unknown as { open: number[]; close: number[] }\n }\n\n const HAClose = this.open.map((_, i) => (this.open[i] + this.high[i] + this.close[i] + this.low[i]) / 4)\n const HAOpen = this.open.reduce(\n (acc, open, i) => [...acc, (i === 0 ? open + HAClose[0] : acc[i - 1] + HAClose[i - 1]) / 2],\n [] as number[]\n )\n\n const heikAshiData = { open: HAOpen, close: HAClose }\n\n setCachedQuote({ cid: this.cid, key: 'heikinAshiData', value: heikAshiData, fetchedAt: this.fetchedAt })\n\n return heikAshiData\n }\n\n getDayToOffset(): ObjectHash {\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'dayToOffset', fetchedAt: this.fetchedAt })\n if (cachedDayToOffset) {\n return cachedDayToOffset as unknown as ObjectHash\n }\n const dayToOffset: ObjectHash = {}\n let day = 0\n let lastDay\n for (let i = 0, end = this.date.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const date = dateFromUnixTimestamp(this.date[i])\n const dateString = dateStringFromDate(date)\n if (dateString !== lastDay) {\n dayToOffset[dateString] = day\n day++\n lastDay = dateString\n }\n }\n // for ofscreen renderer we need to add lastDate to have correct dayToOffset because if\n // premarket=false in fetch query there isn't other way to distinguish that\n if (getIsSSr() && this.lastDate) {\n // YYYYMMDD / 20211118 => YYYY-MM-DD\n const [yyyy, mm, dd] = [~~(this.lastDate / 10000), ~~(this.lastDate / 100) % 100, this.lastDate % 100]\n const lastDate = `${yyyy}-${String(mm).padStart(2, '0')}-${String(dd).padStart(2, '0')}`\n\n if (lastDay !== lastDate) {\n dayToOffset[lastDate] = day\n }\n }\n\n setCachedQuote({ cid: this.cid, key: 'dayToOffset', value: dayToOffset, fetchedAt: this.fetchedAt })\n return dayToOffset\n }\n\n getDaysInQuote() {\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'daysInQuote', fetchedAt: this.fetchedAt })\n if (cachedDayToOffset) {\n return cachedDayToOffset as unknown as Date[]\n }\n const dayToOffset = this.getDayToOffset()\n const daysInQuote = Object.keys(dayToOffset)\n .map((dateString) => {\n const [year, month, day] = dateString.split('-')\n return new Date(Number.parseInt(year), Number.parseInt(month) - 1, Number.parseInt(day))\n })\n .sort((a, b) => a.getTime() - b.getTime())\n\n setCachedQuote({ cid: this.cid, key: 'daysInQuote', value: daysInQuote, fetchedAt: this.fetchedAt })\n return daysInQuote\n }\n\n getBarIndexes() {\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\n return Array.from({ length: this.date.length }).map((_, index) => index)\n }\n\n const barIndex = []\n const dayToOffset = this.getDayToOffset()\n\n for (let i = 0; i < this.date.length; i += 1) {\n const date = dateFromUnixTimestamp(this.date[i])\n let x = Math.ceil((date.getHours() * 60 + date.getMinutes() - this.marketStartMinutes) / this.interval)\n x += dayToOffset[dateStringFromDate(date)] * this.getBarsInDay()! // add days\n barIndex[i] = x\n }\n\n return barIndex\n }\n\n getBarIndex(i: number) {\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\n return i\n }\n return this.barIndex[i]\n }\n\n getBarsInDay() {\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\n return\n }\n return Math.ceil(this.drawMinutesPerDay / this.interval)\n }\n\n getDataIndexByBarIndex(index: number) {\n if (this.barIndex) {\n for (let i = 0; i < this.barIndex.length; i++) {\n if (this.barIndex[i] === index) {\n return i\n }\n }\n }\n return -1\n }\n\n getDataByBarIndex(key: keyof Quote, index: number) {\n const dataIndex = this.getDataIndexByBarIndex(index)\n if (dataIndex > -1) {\n const quoteData = this[key as keyof Quote]! as number[]\n return quoteData[dataIndex] ?? null\n }\n return null\n }\n\n getDateToIndex() {\n const cachedDateToIndex = getCachedQuote({ cid: this.cid, key: 'dateToIndex', fetchedAt: this.fetchedAt })\n if (cachedDateToIndex) {\n return cachedDateToIndex as unknown as ObjectHash\n }\n const dateToIndex: ObjectHash = {}\n for (let i = 0; i < this.date.length; i++) {\n dateToIndex[this.date[i]] = i\n }\n setCachedQuote({ cid: this.cid, key: 'dateToIndex', value: dateToIndex, fetchedAt: this.fetchedAt })\n return dateToIndex\n }\n\n getTimestampFomPositionX(positionX: number) {\n if (this.date.length === 0) {\n return 0\n }\n return getTimestampFromPositionX({\n positionX,\n quote: this,\n })\n }\n\n getPositionXFromTimestamp(timestamp: number) {\n if (this.date.length === 0) {\n return 0\n }\n return getPositionXFromTimestamp({\n timestamp,\n quote: this,\n })\n }\n\n getUrl(options: QuoteUrlOptions) {\n const config: UrlOptions = {\n ticker: this.ticker,\n instrument: this.instrument,\n timeframe: this.timeframe || 'd1',\n aftermarket: this.aftermarket,\n premarket: this.premarket,\n patterns: this.hasPatterns || undefined,\n maxBars: this.maxBars,\n ...options,\n }\n\n const isStock = config.instrument === Instrument.Stock\n const isBrowserElite = !getIsSSr() && document.location.host === 'elite.finviz.com'\n let domain = isBrowserElite && isStock ? 'https://api.finviz.com' : ''\n\n if (getIsSSr()) {\n domain = process.env.BE_API_URL!\n }\n\n return `${domain}/api/quote.ashx?${queryString.stringify({ rev: Date.now(), ...config })}`\n }\n\n getRawTicker() {\n return getRawTickerForInstrument(this.instrument, this.ticker)\n }\n\n clearData() {\n this.updateAttributes(emptyQuote)\n }\n}\n\nQuote.initClass()\n\nexport default Quote\n","export enum QuoteFetchType {\n Refetch = 'refetch',\n NewerData = 'newerData',\n}\n\nexport enum QuoteFetchTypeUrlOption {\n New = 'new',\n Newer = 'newer',\n}\n\nexport interface QuoteUrlOptions {\n type: QuoteFetchTypeUrlOption\n dataId?: string\n events?: boolean\n}\n","import merge from 'lodash.merge'\n\nimport { ChartConfigChart } from '../../server/chartConfig'\nimport { Instrument, ObjectHash, Theme } from '../../types/shared'\nimport { SpecificChartFunctionality } from '../constants/common'\nimport Utils, { isRedesignedPage } from '../utils'\nimport LayoutModel from './chart_layout'\nimport { CHART_FORMAT, getChartSettings, getColorOverwrites } from './chart_settings'\nimport { largeChartFontSize } from './chart_settings/constants'\nimport { ISettings } from './chart_settings/interfaces'\nimport {\n IChartThemeColors,\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from './constants'\n\ninterface Config {\n theme: Theme\n barMargin?: number\n barWidth?: number\n border?: number\n charts?: ChartConfigChart[]\n colorsOverride?: Array\n chartFormat?: CHART_FORMAT\n volumeHeight?: number\n colors?: ObjectHash, Theme>\n specificChartFunctionality?: SpecificChartFunctionality\n}\n\nexport function getSettings(config: Config): ISettings {\n const settings = merge({}, getChartSettings({ chartFormat: config.chartFormat, theme: config.theme }))\n\n if (config.barWidth != null) {\n settings.ChartSettings.center.barWidth = config.barWidth\n settings.IndicatorSettings.center.barWidth = config.barWidth\n }\n if (config.barMargin != null) {\n settings.ChartSettings.center.barMargin = config.barMargin\n settings.IndicatorSettings.center.barMargin = config.barMargin\n }\n if (config.border != null) {\n settings.ChartSettings.center.border = config.border\n settings.IndicatorSettings.center.border = config.border\n }\n if (config.colorsOverride) {\n settings.ColorsSettings = config.colorsOverride\n }\n if (config.volumeHeight) {\n settings.ChartSettings.center.volumeHeight = config.volumeHeight\n }\n if (config.colors) {\n const settingColors = settings.ChartSettings.general.Colors\n settings.ChartSettings.general.Colors = {\n ...settingColors,\n [Theme.light]: {\n ...settingColors[Theme.light],\n ...getColorOverwrites({ theme: Theme.light, colors: config.colors }),\n },\n [Theme.dark]: {\n ...settingColors[Theme.dark],\n ...getColorOverwrites({ theme: Theme.dark, colors: config.colors }),\n },\n }\n }\n if (config.specificChartFunctionality === SpecificChartFunctionality.chartPage && Utils.isMobile()) {\n settings.ChartSettings.left.width = 0\n settings.ChartSettings.top.ticker.margin.left = settings.ChartSettings.left.overlayLabel.margin.left\n settings.IndicatorSettings.left.width = 0\n }\n if (SpecificChartFunctionality.chartPage === config.specificChartFunctionality || isRedesignedPage(config)) {\n settings.ChartSettings.top.height = 10\n }\n\n if (config.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n const isGroupInstrument = config.charts?.some(({ instrument }) => instrument === Instrument.Group)\n if (isGroupInstrument) {\n settings.ChartSettings.top.ohlc.margin.top = 4\n settings.ChartSettings.top.ticker.margin.top = 0\n settings.ChartSettings.top.ticker.font = {\n size: largeChartFontSize.XXL,\n style: 'bold',\n }\n settings.ChartSettings.left.timeframe.margin.top = 12\n settings.ChartSettings.left.timeframe.font = {\n size: largeChartFontSize.S,\n style: 'bold',\n }\n }\n }\n\n return settings\n}\n\nexport function updateSettings(chart_layout: LayoutModel, theme: string): ISettings {\n const settings = merge({}, chart_layout.settings)\n const isLight = theme === Theme.light\n settings.MarketSentimentSettings.general.Colors = isLight ? { ...chartLightTheme } : { ...chartDarkTheme }\n settings.IndicatorSettings.general.Colors = isLight ? { ...indicatorLightTheme } : { ...indicatorDarkTheme }\n settings.ElementSettings.Colors = isLight ? { ...elementLightTheme } : { ...elementDarkTheme }\n\n return settings\n}\n\nexport function getChartLayoutSettings(chart_layout: LayoutModel): ISettings {\n const settings = chart_layout.settings\n\n return {\n ...settings,\n ChartSettings: {\n ...settings.ChartSettings,\n general: {\n ...settings.ChartSettings.general,\n Colors: {\n ...settings.ChartSettings.general.Colors,\n ...settings.ChartSettings.general.Colors[chart_layout.theme],\n },\n },\n },\n }\n}\n","import { Instrument } from '../../types/shared'\nimport ChartLayoutModel from './chart_layout'\nimport Element from './element'\n\nexport const handleRemoveIndicatorPane = ({\n paneIndex,\n chartLayoutModel,\n}: {\n paneIndex: number\n chartLayoutModel: ChartLayoutModel\n}) => {\n const charts = chartLayoutModel.getAllCharts()\n charts.forEach((chart) => chart.getAllPanes()[paneIndex].destroyCascade())\n}\n\nexport function getNormalizedZIndex({ index, isBelowZero }: { index: number; isBelowZero: boolean }) {\n return (index + 1) * (isBelowZero ? -1 : 1)\n}\n\nexport function rebuildElementZIndexes({\n elementsArray,\n isBelowZero,\n}: {\n elementsArray: Element[]\n isBelowZero: boolean\n}) {\n const elements = isBelowZero ? [...elementsArray].reverse() : elementsArray\n elements.forEach((element, index) => {\n const newZIndex = getNormalizedZIndex({ index, isBelowZero })\n if (newZIndex !== element.zIndex) {\n element.updateAttributes({ zIndex: newZIndex })\n }\n })\n}\n\nexport function changeElementZIndexes({\n elementsArray,\n addElement,\n oldZIndex,\n newZIndex,\n isBelowZero = false,\n}: {\n elementsArray: Element[]\n addElement: Element | undefined\n oldZIndex: number\n newZIndex: number\n isBelowZero?: boolean\n}) {\n const array = isBelowZero ? [...elementsArray].reverse() : elementsArray\n const elements =\n elementsArray.length === 0 && addElement\n ? [...array, addElement]\n : array\n .filter((_, index) => getNormalizedZIndex({ index, isBelowZero }) !== oldZIndex)\n .flatMap((el, index) =>\n getNormalizedZIndex({ index, isBelowZero }) === newZIndex && addElement ? [addElement, el] : el\n )\n\n // If there are only 2 drawings and we move a drawing from index 1 to index 2 to have to push it to the array because it's the last element and it didn't get into the array in the flatMap above\n if (elements.length < Math.abs(newZIndex) && addElement) {\n elements.push(addElement)\n }\n\n rebuildElementZIndexes({ elementsArray: isBelowZero ? [...elements].reverse() : elements, isBelowZero })\n}\n\nexport function getRawTickerForInstrument(instrument: Instrument, ticker: string) {\n return `${\n [Instrument.Crypto, Instrument.Forex, Instrument.Futures].includes(instrument) && !ticker.includes('@') ? '@' : ''\n }${ticker}`\n}\n","import {\n ChartConfigChartPaneElement,\n IModalConfig,\n IModalConfigInput,\n ObjectHash,\n RequireByKey,\n} from '../../types/shared'\nimport Element from '../canvas/element'\nimport BaseChart from '../charts/base_chart'\nimport { OverlayType } from '../constants/common'\nimport Quote from '../models/quote'\nimport { convertColorToHEX, getRGBAValueFromValidColorString } from '../utils/colors'\nimport { getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\n\nexport interface IOverlayIsValid {\n getIsValid(key: string): boolean | void\n}\n\nconst DEFAULT_LABEL_COLOR = '#0587cd'\n\nclass Overlay extends Element implements IOverlayIsValid {\n static type = OverlayType.Overlay\n static label = 'Overlay'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt] = getParsedIntegersFromPeriodString(period)\n return periodInt\n }\n\n declare data: Quote\n declare chart: BaseChart\n\n get type() {\n return (this.constructor as typeof Overlay).type\n }\n\n get label() {\n return (this.constructor as typeof Overlay).label\n }\n\n getLabelColor() {\n return this.attrs.color ? convertColorToHEX(this.attrs.color) : DEFAULT_LABEL_COLOR\n }\n\n getFreeColor() {\n return this.getChartLayoutSettings().ColorsSettings[0]\n // TODO proper implementation - example how this could be done:\n // let colorsUsed = []\n // for (let overlay of this.chart.overlays) {\n // let object = overlay.getModalConfig().inputs\n // for (let _ in object) {\n // let input = object[_]\n // if (input.type === 'color') {\n // colorsUsed.push(input.value)\n // }\n // }\n // }\n // for (let color of colors) {\n // if (!colorsUsed.includes(color)) {\n // return color\n // }\n // }\n // return colors[0]\n }\n\n renderContent(_?: RenderingContext2DType) {\n this.data = this.model.chart().quote()\n }\n\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\n\n getIsValid(_: string): boolean | undefined {\n throw Error('Implement')\n }\n\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\n }\n\n isRendered() {\n return true\n }\n\n isRenderedOverlaysLabel() {\n return this.isRendered()\n }\n\n getModalConfig(): IModalConfig {\n return {\n title: '',\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toConfig() {\n const colors: string[] = []\n const periods: string[] = []\n\n this.getModalConfig().inputs.forEach((input: IModalConfigInput) => {\n if (input.type === 'color') {\n colors.push(getRGBAValueFromValidColorString(input.value.toString()))\n } else {\n periods.push(input.value.toString())\n }\n })\n\n return { type: this.type, period: periods.join(','), color: colors.join('|') }\n }\n}\n\nexport default Overlay\n","import { ChartConfigChartPaneElement, RequireByKey, Theme } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Overlay from './overlay'\n\nconst BB_COLORS = {\n [Theme.light]: {\n TOP: '#D386DF',\n BOTTOM: '#69C1EA',\n MIDDLE: '#CFD2F2',\n },\n [Theme.dark]: {\n TOP: '#D38BFB',\n BOTTOM: '#57AEFB',\n MIDDLE: '#E1B6FC',\n },\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 20,\n Deviations: 2.0,\n}\n\ninterface Attrs {\n period: number | string\n deviations: number\n topColor?: string\n bottomColor?: string\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const deviations = parseFloat(values[1]) || DEFAULT_PARAMETERS.Deviations\n\n return [period, deviations]\n}\n\nclass BollingerBands extends Overlay {\n static type = OverlayType.Bb\n static label = 'Bollinger Bands'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n const [periodInt, deviations] = parsePeriod(period)\n this.attrs.period = periodInt\n this.attrs.deviations = deviations\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (typeof this.attrs.period !== 'number') {\n return\n }\n super.renderContent()\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\n const theme = this.model.chart().chart_layout().theme as Theme\n const { leftOffset, width } = this.model.chart()\n const [top, bottom] = this.model.scale.y.domain()\n const scaledTop = this.fy(top)\n const scaledBottom = this.fy(bottom)\n const { close } = this.data\n const period = Math.min(this.attrs.period, close.length - 1)\n\n let firstBarToRender\n let lastBarToRender = 0\n\n const sma: number[] = []\n const stdDev: number[] = []\n\n let sum = 0\n for (let i = 0; i < period; i++) {\n sum += close[i]\n }\n\n // middle line && find first & last bar to render\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', BB_COLORS[theme].MIDDLE)\n for (let i = period; i < close.length; i++) {\n sum = sum - close[i - period] + close[i]\n sma[i] = sum / period\n\n let stdDevSum = 0\n for (let j = i - period + 1; j <= i; j++) {\n stdDevSum += Math.pow(close[j] - sma[i], 2)\n }\n stdDev[i] = Math.sqrt(stdDevSum / period)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n\n context.lineTo(this.fx(i), Math.round(this.fy(sma[i])))\n\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n lastBarToRender = i\n }\n if (firstBarToRender === undefined) return\n context.stroke()\n context.set('fillStyle', Colors.overlayTransparentBackground)\n\n // top line\n context.beginPath()\n context.moveTo(this.fx(firstBarToRender), scaledTop)\n context.set('strokeStyle', BB_COLORS[theme].TOP)\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const upperBand = sma[i] + stdDev[i] * this.attrs.deviations\n context.lineTo(this.fx(i), Math.round(this.fy(upperBand)))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), scaledTop)\n context.fill()\n\n // bottom line\n context.beginPath()\n context.moveTo(this.fx(firstBarToRender), scaledBottom)\n context.set('strokeStyle', BB_COLORS[theme].BOTTOM)\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const lowerBand = sma[i] - stdDev[i] * this.attrs.deviations\n context.lineTo(this.fx(i), Math.round(this.fy(lowerBand)))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), scaledBottom)\n context.fill()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n const deviations = {\n type: 'number',\n label: 'Deviations',\n name: 'deviations',\n value: this.attrs.deviations ?? DEFAULT_PARAMETERS.Deviations,\n required: true,\n min: 0.1,\n max: 999,\n step: 0.1,\n }\n const topColor = {\n type: 'color',\n label: 'Top Color',\n name: 'topColor',\n value: this.attrs.topColor ?? this.getFreeColor(),\n }\n const bottomColor = {\n type: 'color',\n label: 'Bottom Color',\n name: 'bottomColor',\n value: this.attrs.bottomColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, deviations, topColor, bottomColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n deviations: `${deviations.label} must be a number between ${deviations.min} and ${deviations.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'deviations':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'topColor':\n case 'bottomColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n const theme = this.model.chart().chart_layout().theme as Theme\n return this.attrs.topColor || BB_COLORS[theme].TOP\n }\n\n toString() {\n return `BB ${this.attrs.period},${this.attrs.deviations}`\n }\n}\n\nBollingerBands.prototype.defaults = { topColor: '#69c1ea', bottomColor: '#d386df' }\n\nexport default BollingerBands\n","import { OverlayType } from '../constants/common'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n channelStrokeColor: string\n channelFillColor: string\n medianBandColor: string\n}\n\nconst DEFAULT_PERIOD = 20\n\nconst COLORS = {\n ChannelStroke: '#69c1ea',\n ChannelFill: '#69C1EA12',\n MedianBandStroke: '#ffa75f',\n}\n\nclass DonchianChannels extends Overlay {\n static type = OverlayType.Dch\n static label = 'Donchian Channels'\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { period } = this.attrs\n const upperBand: number[] = []\n const lowerBand: number[] = []\n const medianBand: number[] = []\n let firstBarToRender = -1\n let lastBarToRender = 0\n if (this.data.close.length === undefined) {\n return\n }\n\n context.save()\n context.translate(0.5, 0.5)\n context.set('lineWidth', 1)\n context.set('strokeStyle', COLORS.ChannelStroke)\n context.set('fillStyle', COLORS.ChannelFill)\n\n //upper band + clip\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n firstBarToRender = firstBarToRender === -1 ? i : firstBarToRender\n upperBand[i] = utils.max(this.data.high.slice(Math.max(0, i - period), i + 1))\n lowerBand[i] = utils.min(this.data.low.slice(Math.max(0, i - period), i + 1))\n medianBand[i] = (upperBand[i] + lowerBand[i]) / 2\n\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\n lastBarToRender = i\n },\n })\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\n context.clip()\n\n // lower band + fill\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), 0)\n context.lineTo(0, 0)\n context.fill()\n\n // median band\n context.set('strokeStyle', COLORS.MedianBandStroke)\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(medianBand[i])))\n }\n context.stroke()\n context.restore()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PERIOD,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const strokeColor = {\n type: 'color',\n label: 'Channels Stroke Color',\n name: 'strokeColor',\n value: this.attrs.channelStrokeColor ?? this.getFreeColor(),\n }\n const fillColor = {\n type: 'color',\n label: 'Channels Fill Color',\n name: 'fillColor',\n value: this.attrs.channelFillColor ?? this.getFreeColor(),\n }\n const medianBandColor = {\n type: 'color',\n label: 'Median Band Color',\n name: 'medianBandColor',\n value: this.attrs.medianBandColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, medianBandColor, strokeColor, fillColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'medianBandColor':\n case 'strokeColor':\n case 'fillColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.medianBandColor\n }\n\n toString() {\n return `Donchian ${this.attrs.period}`\n }\n}\n\nDonchianChannels.prototype.defaults = {\n medianBandColor: COLORS.MedianBandStroke,\n channelStrokeColor: COLORS.ChannelStroke,\n channelFillColor: COLORS.ChannelFill,\n}\n\nexport default DonchianChannels\n","import { OverlayType } from '../constants/common'\nimport ExponentialMovingAverage from '../helpers/ema'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n deviations: number\n color: string\n}\n\nclass EMA extends Overlay {\n static type = OverlayType.Ema\n static label = 'Exponential Moving Average'\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const ema = new ExponentialMovingAverage(this.attrs.period)\n\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.color)\n for (let i = 0; i < this.data.close.length; i++) {\n ema.add(this.data.close[i])\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n context.lineTo(x, Math.round(this.fy(ema.value)))\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? 5,\n required: true,\n min: 1,\n max: 999999,\n }\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, color],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'color':\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\n default:\n return false\n }\n }\n\n toString() {\n return `EMA ${this.attrs.period}`\n }\n}\n\nEMA.prototype.defaults = { color: '#ffa75f' }\n\nexport default EMA\n","import { OverlayType } from '../constants/common'\nimport EMA from './ema'\n\nclass EMA2 extends EMA {\n static type = OverlayType.Ema2\n}\n\nEMA2.prototype.defaults = { color: '#ff6400' }\n\nexport default EMA2\n","import { OverlayType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport { getBarWidthWithMargin } from '../utils/chart'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n lowColor: string\n highColor: string\n}\n\nclass HighLow extends Overlay {\n static type = OverlayType.Hilo\n static label = 'High/Low'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.renderContent = this.renderContent.bind(this)\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const chartModel = this.model.chart()\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const { leftOffset, width, zoomFactor } = chartModel\n const barWidth = getBarWidthWithMargin({\n zoomFactor,\n chartLayout: chartModel.chart_layout(),\n })\n const halfWidth = barWidth / 2\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\n let firstBarToRender\n let lastBarToRender = 0\n context.translate(0.5, 0.5)\n context.set('fillStyle', Colors.overlayTransparentBackground)\n context.beginPath()\n context.set('strokeStyle', this.attrs.highColor)\n let prevHigh = -1\n for (let i = 0; i < this.data.close.length; i++) {\n let highestHigh = this.data.high[i]\n for (let j = i - period + 1; j <= i; j++) {\n if (this.data.high[j] > highestHigh) {\n highestHigh = this.data.high[j]\n }\n }\n\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < -10) {\n prevHigh = highestHigh\n continue\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n\n const diff = this.data.barIndex[i] - this.data.barIndex[lastBarToRender]\n if (diff > 1 && prevHigh !== highestHigh && prevHigh > 0) {\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevHigh)))\n }\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(highestHigh)))\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(highestHigh)))\n\n prevHigh = highestHigh\n lastBarToRender = i\n }\n context.stroke()\n if (firstBarToRender === undefined) return\n\n // return to start and fill with background color\n context.lineTo(this.fx(lastBarToRender) + halfWidth, 0)\n context.lineTo(this.fx(firstBarToRender) - halfWidth, 0)\n context.fill()\n\n context.beginPath()\n context.set('strokeStyle', this.attrs.lowColor)\n let prevLow = -1\n let prevBar = firstBarToRender\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n let lowestLow = this.data.low[i]\n for (let j = i - period + 1; j <= i; j++) {\n if (this.data.low[j] < lowestLow) {\n lowestLow = this.data.low[j]\n }\n }\n\n const x = this.fx(i)\n const diff = this.data.barIndex[i] - this.data.barIndex[prevBar]\n if (diff > 1 && prevLow !== lowestLow && prevLow > 0) {\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevLow)))\n }\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(lowestLow)))\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(lowestLow)))\n\n prevLow = lowestLow\n prevBar = i\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n\n // return to start and fill with background color\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\n context.lineTo(this.fx(firstBarToRender) - halfWidth, context.canvas.height)\n context.fill()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? 50,\n required: true,\n min: 1,\n max: 999999,\n }\n const highColor = {\n type: 'color',\n label: 'High Color',\n name: 'highColor',\n value: this.attrs.highColor ?? this.getFreeColor(),\n }\n const lowColor = {\n type: 'color',\n label: 'Low Color',\n name: 'lowColor',\n value: this.attrs.lowColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, highColor, lowColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'highColor':\n case 'lowColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.highColor\n }\n\n toString() {\n return `HILO ${this.attrs.period}`\n }\n}\n\nHighLow.prototype.defaults = {\n lowColor: '#69c1ea',\n highColor: '#d386df',\n}\n\nexport default HighLow\n","import { OverlayType } from '../constants/common'\nimport { isPositiveFloat } from '../utils/helpers'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n price: number\n color: string\n}\n\nclass HorizontalLine extends Overlay {\n static type = OverlayType.Hline\n static label = 'Horizontal Line'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (typeof this.attrs.period === 'string' && this.attrs.price === undefined) {\n this.attrs.price = parseFloat(this.attrs.period)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const y = Math.round(this.fy(this.attrs.price))\n context.set('strokeStyle', this.attrs.color)\n context.translate(0, 0.5)\n context.beginPath()\n context.moveTo(-this.model.chart().leftOffset, y)\n context.lineTo(-this.model.chart().leftOffset + this.model.chart().width, y)\n context.stroke()\n context.translate(0, -0.5)\n }\n\n getModalConfig() {\n const price = {\n type: 'number',\n label: 'Price',\n name: 'price',\n value: this.attrs.price || this.model?.scale?.y?.domain().reduce((a: number, b: number) => a + b, 0) / 2,\n required: true,\n step: 0.1,\n }\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [price, color],\n inputsErrorMessages: {\n price: `${price.label} must be number`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'price':\n return isPositiveFloat(this.attrs[key])\n case 'color':\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\n default:\n return false\n }\n }\n\n toString() {\n return `HL ${this.attrs.price}`\n }\n}\n\nHorizontalLine.prototype.defaults = { color: '#0587cd' }\n\nexport default HorizontalLine\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period?: string\n conversion: number\n base: number\n spanB: number\n spanAStrokeColor: string\n spanAFillColor: string\n spanBStrokeColor: string\n spanBFillColor: string\n conversionLineColor: string\n baseLineColor: string\n laggingSpanColor: string\n}\n\nconst COLORS = {\n SpanA: {\n Stroke: '#009600',\n Fill: '#00960022',\n },\n SpanB: {\n Stroke: '#C80000',\n Fill: '#C8000022',\n },\n ConversionLine: '#69C1EA',\n BaseLine: '#E54040',\n LaggingSpan: '#FFA75F',\n}\n\nconst DEFAULT_PARAMETERS = {\n Conversion: 9,\n Base: 26,\n SpanB: 52,\n}\n\nfunction parsePeriod(period: string) {\n const [conversion = DEFAULT_PARAMETERS.Conversion, base = DEFAULT_PARAMETERS.Base, spanB = DEFAULT_PARAMETERS.SpanB] =\n getParsedIntegersFromPeriodString(period)\n return [conversion, base, spanB]\n}\n\nclass IchimokuCloud extends Overlay {\n static type = OverlayType.Ic\n static label = 'Ichimoku Cloud'\n static renderFull = false\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n return Math.max(...parsePeriod(period))\n }\n\n get renderFull() {\n return (this.constructor as typeof IchimokuCloud).renderFull\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (\n typeof this.attrs.period === 'string' &&\n (this.attrs.conversion === undefined || this.attrs.base === undefined || this.attrs.spanB === undefined)\n ) {\n const [conversion, base, spanB] = parsePeriod(this.attrs.period)\n this.attrs.conversion = conversion\n this.attrs.base = base\n this.attrs.spanB = spanB\n }\n this.trigger('change')\n return this\n }\n\n fx = (x: number) => {\n const lastIndex = this.data.close.length - 1\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\n\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { high, low, close } = this.data\n\n const {\n conversion,\n base,\n spanB,\n spanAFillColor,\n spanAStrokeColor,\n spanBFillColor,\n spanBStrokeColor,\n baseLineColor,\n conversionLineColor,\n laggingSpanColor,\n } = this.attrs\n\n const conversionLine: number[] = []\n const baseLine: number[] = []\n const senkouSpanA: number[] = []\n const senkouSpanB: number[] = []\n const conversionStartIndex = conversion - 1\n const baseStartIndex = base - 1\n const spanBIndex = spanB - 1\n const start = Math.min(baseStartIndex, conversionStartIndex)\n const end = close.length + baseStartIndex\n\n if (this.data.close.length === 0) return\n\n // Calculation\n for (let i = start; i < end; i++) {\n if (i >= conversionStartIndex && i < close.length) {\n const highestHi = Math.max(...high.slice(i - conversionStartIndex, i + 1))\n const lowestLo = Math.min(...low.slice(i - conversionStartIndex, i + 1))\n conversionLine[i] = (highestHi + lowestLo) / 2\n }\n\n if (i >= baseStartIndex && i < close.length) {\n const highestHi = Math.max(...high.slice(i - baseStartIndex, i + 1))\n const lowestLo = Math.min(...low.slice(i - baseStartIndex, i + 1))\n baseLine[i] = (highestHi + lowestLo) / 2\n\n senkouSpanA[i + baseStartIndex] = (baseLine[i] + conversionLine[i]) / 2 // + baseStart because it needs to be shifted to the future\n }\n\n if (i >= spanBIndex) {\n const highestHi = Math.max(...high.slice(i - spanBIndex, i + 1))\n const lowestLo = Math.min(...low.slice(i - spanBIndex, i + 1))\n senkouSpanB[i + baseStartIndex] = (highestHi + lowestLo) / 2 // + baseStart because it needs to be shifted to the future\n }\n }\n\n let lastSpanAX = 0\n let lastSpanBX = 0\n const cloudStartingX = this.fx(spanBIndex + baseStartIndex)\n\n context.set('lineWidth', 1)\n context.translate(0.5, 0.5)\n context.save()\n // 1. Senkou Span A\n // 1.1 Stroke\n context.set('strokeStyle', spanAStrokeColor)\n context.set('fillStyle', spanAFillColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\n lastSpanAX = x\n },\n })\n context.stroke()\n // 1.2 Clipping area\n context.lineTo(lastSpanAX, context.canvas.height)\n context.lineTo(cloudStartingX, context.canvas.height)\n context.clip()\n // 1.3 Fill\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n if (i >= senkouSpanA.length) return\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\n lastSpanBX = x\n },\n })\n context.lineTo(lastSpanBX, 0)\n context.lineTo(cloudStartingX, 0)\n context.fill()\n context.restore()\n\n // 2. Senkou Span B\n // 2.1 Stroke\n context.save()\n context.set('strokeStyle', spanBStrokeColor)\n context.set('fillStyle', spanBFillColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n if (i >= senkouSpanA.length) return\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\n },\n })\n context.stroke()\n // 2.2 Clipping area\n context.lineTo(lastSpanBX, context.canvas.height)\n context.lineTo(cloudStartingX, context.canvas.height)\n context.clip()\n // 2.3 Fill\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\n },\n })\n context.lineTo(lastSpanBX, 0)\n context.lineTo(cloudStartingX, 0)\n context.fill()\n context.restore()\n context.translate(-0.5, -0.5)\n\n if (this.renderFull) {\n // conversion line\n context.set('strokeStyle', conversionLineColor)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(conversionLine[i])))\n },\n })\n context.stroke()\n\n // base line\n context.set('strokeStyle', baseLineColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(baseLine[i])))\n },\n })\n context.stroke()\n\n // lagging span\n context.set('strokeStyle', laggingSpanColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: (x: number) => this.fx(x - base),\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.data.close[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n }\n\n getModalConfig() {\n const conversion = {\n type: 'number',\n label: 'Conversion Line',\n name: 'conversion',\n value: this.attrs.conversion ?? DEFAULT_PARAMETERS.Conversion,\n required: true,\n min: 1,\n max: 999999,\n }\n const base = {\n type: 'number',\n label: 'Base Line Length',\n name: 'base',\n value: this.attrs.base ?? DEFAULT_PARAMETERS.Base,\n required: true,\n min: 1,\n max: 999999,\n }\n const spanB = {\n type: 'number',\n label: 'Leading Span B Length',\n name: 'spanB',\n value: this.attrs.spanB ?? DEFAULT_PARAMETERS.SpanB,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const spanAStrokeColor = {\n type: 'color',\n label: 'Span A Stroke Color',\n name: 'spanAStrokeColor',\n value: this.attrs.spanAStrokeColor ?? this.getFreeColor(),\n }\n const spanAFillColor = {\n type: 'color',\n label: 'Span A Fill Color',\n name: 'spanAFillColor',\n value: this.attrs.spanAFillColor ?? this.getFreeColor(),\n }\n const spanBStrokeColor = {\n type: 'color',\n label: 'Span B Stroke Color',\n name: 'spanBStrokeColor',\n value: this.attrs.spanBStrokeColor ?? this.getFreeColor(),\n }\n const spanBFillColor = {\n type: 'color',\n label: 'Span B Fill Color',\n name: 'spanBFillColor',\n value: this.attrs.spanBFillColor ?? this.getFreeColor(),\n }\n const conversionLineColor = {\n type: 'color',\n label: 'Conversion Line Color',\n name: 'conversionLineColor',\n value: this.attrs.conversionLineColor ?? this.getFreeColor(),\n }\n const baseLineColor = {\n type: 'color',\n label: 'Base Line Color',\n name: 'baseLineColor',\n value: this.attrs.baseLineColor ?? this.getFreeColor(),\n }\n const laggingSpanColor = {\n type: 'color',\n label: 'Lagging Span Color',\n name: 'laggingSpanColor',\n value: this.attrs.laggingSpanColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [\n conversion,\n base,\n spanB,\n spanAStrokeColor,\n spanAFillColor,\n spanBStrokeColor,\n spanBFillColor,\n conversionLineColor,\n baseLineColor,\n laggingSpanColor,\n ],\n inputsErrorMessages: {\n conversion: `${conversion.label} must be a whole number between ${conversion.min} and ${conversion.max}`,\n base: `${base.label} must be a whole number between ${base.min} and ${base.max}`,\n spanB: `${spanB.label} must be a whole number between ${spanB.min} and ${spanB.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'conversion':\n case 'base':\n case 'spanB':\n case 'lagging':\n return this.getIsNumberInputValid({ key })\n case 'spanAStrokeColor':\n case 'spanAFillColor':\n case 'spanBStrokeColor':\n case 'spanBFillColor':\n case 'conversionLineColor':\n case 'baseLineColor':\n case 'laggingSpanColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.spanAStrokeColor\n }\n\n toString() {\n return `Ichimoku ${this.attrs.conversion},${this.attrs.base},${this.attrs.spanB}`\n }\n}\n\nIchimokuCloud.prototype.defaults = {\n spanAStrokeColor: COLORS.SpanA.Stroke,\n spanAFillColor: COLORS.SpanA.Fill,\n spanBStrokeColor: COLORS.SpanB.Stroke,\n spanBFillColor: COLORS.SpanB.Fill,\n conversionLineColor: COLORS.ConversionLine,\n baseLineColor: COLORS.BaseLine,\n laggingSpanColor: COLORS.LaggingSpan,\n}\n\nexport default IchimokuCloud\n","import { OverlayType } from '../constants/common'\nimport IchimokuCloud from './ic'\n\nclass IchimokuCloudFull extends IchimokuCloud {\n static type = OverlayType.Icf\n static label = 'Ichimoku Cloud (Full)'\n static renderFull = true\n}\n\nexport default IchimokuCloudFull\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport AverageTrueRange from '../helpers/atr'\nimport ExponentialMovingAverage from '../helpers/ema'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period?: string\n emaPeriod: number\n multiplier: number\n atrPeriod: number\n strokeColor: string\n fillColor: string\n}\n\nconst DEFAULT_PARAMETERS = {\n emaPeriod: 20,\n multiplier: 2.0,\n atrPeriod: 10,\n}\n\nconst COLORS = {\n Stroke: '#69C1EA',\n Fill: '#69C1EA33',\n}\n\nfunction parsePeriod(period: string) {\n const values = period.split(',')\n const emaPeriod = parseInt(values[0])\n const multiplier = parseFloat(values[1])\n const atrPeriod = parseInt(values[2])\n\n return [emaPeriod, multiplier, atrPeriod]\n}\n\nclass KeltnerChannel extends Overlay {\n static type = OverlayType.Kch\n static label = 'Keltner Channel'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n return Math.max(...parsePeriod(period)) * 2\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (\n typeof this.attrs.period === 'string' &&\n (this.attrs.emaPeriod === undefined || this.attrs.multiplier === undefined || this.attrs.atrPeriod === undefined)\n ) {\n const [emaPeriod, multiplier, atrPeriod] = parsePeriod(this.attrs.period)\n this.attrs.emaPeriod = emaPeriod\n this.attrs.multiplier = multiplier\n this.attrs.atrPeriod = atrPeriod\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { emaPeriod, multiplier, atrPeriod, strokeColor, fillColor } = this.attrs\n const ema = new ExponentialMovingAverage(emaPeriod)\n const atr = new AverageTrueRange(atrPeriod)\n const middleLine: number[] = []\n const upperBand: number[] = []\n const lowerBand: number[] = []\n const start = Math.max(emaPeriod, atrPeriod)\n let firstBarToRender\n let lastBarToRender = 0\n\n context.save()\n context.translate(0.5, 0.5)\n context.set('lineWidth', 1)\n context.set('strokeStyle', strokeColor)\n context.set('fillStyle', fillColor)\n\n //top line + clip\n context.beginPath()\n for (let i = 1; i < this.data.close.length; i++) {\n ema.add(this.data.close[i])\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\n if (i < start) {\n continue\n }\n\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n\n middleLine[i] = ema.value\n upperBand[i] = ema.value + multiplier * atr.value\n lowerBand[i] = ema.value - multiplier * atr.value\n\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\n lastBarToRender = i\n }\n if (firstBarToRender === undefined) {\n context.restore()\n return\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\n context.clip()\n\n // bottom line + fill\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), 0)\n context.lineTo(0, 0)\n context.fill()\n\n // middle line\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(middleLine[i])))\n }\n context.stroke()\n context.restore()\n }\n\n getModalConfig() {\n const emaPeriod = {\n type: 'number',\n label: 'EMA Period',\n name: 'emaPeriod',\n value: this.attrs.emaPeriod ?? DEFAULT_PARAMETERS.emaPeriod,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const multiplier = {\n type: 'number',\n label: 'Multiplier',\n name: 'multiplier',\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.multiplier,\n required: true,\n step: 0.1,\n min: 0.0,\n max: 999,\n }\n\n const atrPeriod = {\n type: 'number',\n label: 'ATR Period',\n name: 'atrPeriod',\n value: this.attrs.atrPeriod ?? DEFAULT_PARAMETERS.atrPeriod,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const strokeColor = {\n type: 'color',\n label: 'Stroke Color',\n name: 'strokeColor',\n value: this.attrs.strokeColor ?? this.getFreeColor(),\n }\n const fillColor = {\n type: 'color',\n label: 'Fill Color',\n name: 'fillColor',\n value: this.attrs.fillColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [emaPeriod, multiplier, atrPeriod, strokeColor, fillColor],\n inputsErrorMessages: {\n emaPeriod: `${emaPeriod.label} must be a whole number between ${emaPeriod.min} and ${emaPeriod.max}`,\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\n atrPeriod: `${atrPeriod.label} must be a whole number between ${atrPeriod.min} and ${atrPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'emaPeriod':\n return this.getIsNumberInputValid({ key })\n case 'multiplier':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'atrPeriod':\n return this.getIsNumberInputValid({ key })\n case 'strokeColor':\n case 'fillColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.strokeColor\n }\n\n toString() {\n return `Keltner Channel ${this.attrs.emaPeriod},${this.attrs.multiplier},${this.attrs.atrPeriod}`\n }\n}\n\nKeltnerChannel.prototype.defaults = { strokeColor: COLORS.Stroke, fillColor: COLORS.Fill }\n\nexport default KeltnerChannel\n","import { OverlayType } from '../constants/common'\nimport Overlay from './overlay'\n\n// This indicator is used as a placeholder when we need to render TA like chart but don't need any overlay or indicator in the chart\nclass None extends Overlay {\n static type = OverlayType.None\n static label = 'None'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n isRendered() {\n return false\n }\n\n getIsValid() {\n return true\n }\n}\n\nexport default None\n","import Text from '../canvas/text'\nimport { OverlayType, TextAlign, TextBaseline } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport Overlay from './overlay'\n\ntype aboveBelowType = 'above' | 'below'\n\nclass Patterns extends Overlay {\n static type = OverlayType.Patterns\n static label = 'Patterns (daily charts)'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { ChartSettings } = this.getChartLayoutSettings()\n const data = this.data\n if (!Array.isArray(data.patterns) || data.patterns.length === 0) {\n return\n }\n\n const originalScale = {\n width: 600,\n height: 300,\n barsInDay: Math.min(data.close.length, 200),\n high: data.patternsMaxRange,\n low: data.patternsMinRange,\n barWidth: 0,\n }\n originalScale.barWidth = originalScale.width / 200\n\n const scaleY = (originalScale.high - originalScale.low) / originalScale.height\n const fx = (x: number) => {\n if (x === 0) {\n return this.fx(0)\n }\n return this.fx(data.close.length - 1 - ~~(originalScale.barsInDay - x / originalScale.barWidth))\n }\n const fy = (y: number) => this.fy(originalScale.high - y * scaleY)\n const line = (color: string, x1: number, y1: number, x2: number, y2: number) => {\n const roundedXY = getRoundedObject({\n x1: fx(x1),\n y1: fy(y1),\n x2: fx(x2),\n y2: fy(y2),\n })\n const translateXY = getXYOffsetFromLine({ lineWidth: 1, ...roundedXY })\n context.translate(translateXY.x, translateXY.y)\n\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', color)\n context.lineTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n\n context.translate(translateXY.x * -1, translateXY.y * -1)\n }\n const text = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, x2: number, y1: number) => {\n new Text(\n {\n x: fx((x1 + x2) / 2),\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\n font: { size: 8, style: 'bold' },\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\n fillStyle: color,\n textAlign: TextAlign.center,\n text,\n },\n this.model\n ).render(context)\n }\n const textHS = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, y1: number) => {\n new Text(\n {\n x: fx(x1) + 5,\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\n font: { size: 9, style: 'bold' },\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\n fillStyle: color,\n textAlign: TextAlign.center,\n text,\n },\n this.model\n ).render(context)\n }\n const above = (y: number) =>\n fy(y) + 10 >= this.model.height - ChartSettings.top.height - ChartSettings.bottom.height ? 'above' : 'below'\n const below = (y: number) => (fy(y) <= 15 ? 'below' : 'above')\n\n const supportColor = 'rgb(0, 150, 220)'\n const resistColor = 'rgb(180, 50, 200)'\n\n for (const pattern of data.patterns) {\n const { x1, x2, x3, y3 } = pattern\n let { y1, y2 } = pattern\n switch (pattern.kind) {\n case 1: // Horiz S/R\n line('rgba(50, 50, 180, 0.588)', x1, y1, x2, y2)\n break\n\n case 2: // tl resist\n line(resistColor, x1, y1, x2, y2)\n break\n\n case 3: // tl support\n if (y1 === originalScale.height && y2 === originalScale.height) {\n y1 = y2 = originalScale.height - 1\n // Maybe just need to check on the new scale?\n } // support \"pod grafom\"\n line(supportColor, x1, y1, x2, y2)\n break\n\n case 12: // double top\n text('Double Top', below(y1), resistColor, x1, x2, y1)\n break\n\n case 13: // double bottom\n text('Double Bottom', above(y1), supportColor, x1, x2, y1)\n break\n\n case 14: // multi top\n text('Multiple Top', below(y1), resistColor, x1, x2, y1)\n break\n\n case 15: // multi bottom\n text('Multiple Bottom', above(y1), supportColor, x1, x2, y1)\n break\n\n case 16: // h&s top\n textHS('L', below(y1), resistColor, x1, y1)\n textHS('H', below(y2), resistColor, x2, y2)\n textHS('R', below(y3), resistColor, x3, y3)\n break\n\n case 17: // h&s bot\n textHS('L', above(y1), supportColor, x1, y1)\n textHS('H', above(y2), supportColor, x2, y2)\n textHS('R', above(y3), supportColor, x3, y3)\n break\n default:\n break\n }\n }\n }\n\n getModalConfig() {\n const supportColor = {\n type: 'color',\n label: 'Support Color',\n name: 'supportColor',\n value: this.attrs.supportColor ?? this.getFreeColor(),\n }\n const resistColor = {\n type: 'color',\n label: 'Resist Color',\n name: 'resistColor',\n value: this.attrs.resistColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [supportColor, resistColor],\n inputsErrorMessages: {},\n }\n }\n\n getIsValid() {\n return true\n }\n\n isRenderedOverlaysLabel() {\n return false\n }\n\n toString() {\n return ''\n }\n}\n\nPatterns.prototype.defaults = { supportColor: '#69c1ea', resistColor: '#d386df' }\n\nexport default Patterns\n","import { OverlayType } from '../constants/common'\nimport Overlay from './overlay'\n\ninterface Attrs {\n step: number\n period: string\n maxStep: number\n risingColor: string\n fallingColor: string\n}\n\nclass SAR extends Overlay {\n static type = OverlayType.Sar\n static label = 'Parabolic SAR'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (typeof this.attrs.period === 'string' && (this.attrs.step === undefined || this.attrs.maxStep === undefined)) {\n const [step = 0, maxStep = 0] = this.attrs.period.split(',').map((x) => parseFloat(x))\n this.attrs.step = step\n this.attrs.maxStep = maxStep\n }\n this.trigger('change')\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const data = this.data\n const deltaHigh = data.high[1] - data.high[0]\n const deltaLow = data.low[0] - data.low[1]\n const pdm = deltaHigh > 0 && deltaHigh > deltaLow ? deltaHigh : 0\n const mdm = deltaLow > 0 && deltaLow > deltaHigh ? deltaLow : 0\n let isLong = pdm >= mdm\n\n let sar = isLong ? data.low[0] : data.high[0]\n let ep = isLong ? data.high[1] : data.low[1]\n let newHigh = data.high[0]\n let newLow = data.low[0]\n let af = this.attrs.step\n\n for (let i = 1, end = data.close.length, asc = end >= 1; asc ? i < end : i > end; asc ? i++ : i--) {\n let sarToDraw\n const prevHigh = newHigh\n const prevLow = newLow\n newHigh = data.high[i]\n newLow = data.low[i]\n\n if (isLong) {\n if (newLow <= sar) {\n isLong = false\n sar = ep\n\n if (sar < prevHigh) {\n sar = prevHigh\n }\n if (sar < newHigh) {\n sar = newHigh\n }\n\n sarToDraw = sar\n\n af = this.attrs.step\n ep = newLow\n\n sar = sar + af * (ep - sar)\n\n if (sar < prevHigh) {\n sar = prevHigh\n }\n if (sar < newHigh) {\n sar = newHigh\n }\n } else {\n sarToDraw = sar\n\n if (newHigh > ep) {\n ep = newHigh\n af += this.attrs.step\n if (af > this.attrs.maxStep) {\n af = this.attrs.maxStep\n }\n }\n\n sar = sar + af * (ep - sar)\n\n if (sar > prevLow) {\n sar = prevLow\n }\n if (sar > newLow) {\n sar = newLow\n }\n }\n } else {\n if (newHigh >= sar) {\n isLong = true\n sar = ep\n\n if (sar > prevLow) {\n sar = prevLow\n }\n if (sar > newLow) {\n sar = newLow\n }\n\n sarToDraw = sar\n\n af = this.attrs.step\n ep = newHigh\n\n sar = sar + af * (ep - sar)\n\n if (sar > prevLow) {\n sar = prevLow\n }\n if (sar > newLow) {\n sar = newLow\n }\n } else {\n sarToDraw = sar\n\n if (newLow < ep) {\n ep = newLow\n af += this.attrs.step\n if (af > this.attrs.maxStep) {\n af = this.attrs.maxStep\n }\n }\n\n sar = sar + af * (ep - sar)\n\n if (sar < prevHigh) {\n sar = prevHigh\n }\n if (sar < newHigh) {\n sar = newHigh\n }\n }\n }\n\n const x = Math.round(this.fx(i) - 1.5)\n const y = Math.round(this.fy(sarToDraw) - 1.5)\n context.set('fillStyle', isLong ? this.attrs.risingColor : this.attrs.fallingColor)\n context.fillRect(x, y, 3, 3)\n }\n }\n\n getModalConfig() {\n const step = {\n type: 'number',\n step: 0.01,\n min: 0.01,\n max: 999,\n label: 'Step',\n name: 'step',\n value: this.attrs.step ?? 0.02,\n required: true,\n }\n const maxStep = {\n type: 'number',\n step: 0.01,\n min: 0.01,\n max: 999,\n label: 'Maximum Step',\n name: 'maxStep',\n value: this.attrs.maxStep ?? 0.2,\n required: true,\n }\n const risingColor = {\n type: 'color',\n label: 'Rising Color',\n name: 'risingColor',\n value: this.attrs.risingColor ?? this.getFreeColor(),\n customizable: false,\n }\n const fallingColor = {\n type: 'color',\n label: 'Falling Color',\n name: 'fallingColor',\n value: this.attrs.fallingColor ?? this.getFreeColor(),\n customizable: false,\n }\n\n return {\n title: this.label,\n inputs: [step, maxStep, risingColor, fallingColor],\n inputsErrorMessages: {\n step: `${step.label} must be a number between ${step.min} and ${step.max}`,\n maxStep: `${maxStep.label} must be a number between ${maxStep.min} and ${maxStep.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'step':\n case 'maxStep': {\n return this.getIsNumberInputValid({ key, integerOnly: false })\n }\n case 'risingColor':\n case 'fallingColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.risingColor\n }\n\n toString() {\n return `SAR ${this.attrs.step},${this.attrs.maxStep}`\n }\n}\n\nSAR.prototype.defaults = {\n risingColor: '#69c1ea',\n fallingColor: '#d386df',\n}\n\nexport default SAR\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport Overlay from './overlay'\n\ninterface Attrs {\n step: number\n period: string\n maxStep: number\n risingColor: string\n color: string\n}\n\nclass SMA extends Overlay {\n static type = OverlayType.Sma\n static label = 'Simple Moving Average'\n\n static getNumOfBarsBuffer(chartConfig: RequireByKey) {\n const numOfBarsBuffer = Overlay.getNumOfBarsBuffer(chartConfig)\n return numOfBarsBuffer + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\n context.beginPath()\n context.translate(0.5, 0.5)\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.color)\n let sum = 0\n for (let i = 0; i < period; i++) {\n sum += this.data.close[i]\n }\n for (let i = period; i < this.data.close.length; i++) {\n const x = this.fx(i)\n sum = sum - this.data.close[i - period] + this.data.close[i]\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n context.lineTo(x, Math.round(this.fy(sum / period)))\n }\n context.translate(-0.5, -0.5)\n context.stroke()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? 5,\n required: true,\n min: 1,\n max: 999999,\n }\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, color],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'color':\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\n default:\n return false\n }\n }\n\n toString() {\n return `SMA ${this.attrs.period}`\n }\n}\n\nSMA.prototype.defaults = { color: '#ffa75f' }\n\nexport default SMA\n","import { OverlayType } from '../constants/common'\nimport SMA from './sma'\n\nclass SMA2 extends SMA {\n static type = OverlayType.Sma2\n}\n\nSMA2.prototype.defaults = { color: '#ff6400' }\n\nexport default SMA2\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport AverageTrueRange from '../helpers/atr'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n multiplier: number\n uptrendColor: string\n downtrendColor: string\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 7,\n Multiplier: 3.0,\n}\n\nconst COLORS = {\n Uptrend: '#00a000',\n Downtrend: '#c80000',\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const multiplier = parseFloat(values[1]) || DEFAULT_PARAMETERS.Multiplier\n\n return [period, multiplier]\n}\n\nclass Supertrend extends Overlay {\n static type = OverlayType.Str\n static label = 'Supertrend'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt] = parsePeriod(period)\n return periodInt + 1\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n const [periodInt, multiplier] = parsePeriod(period)\n this.attrs.period = periodInt\n this.attrs.multiplier = multiplier\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { period, multiplier } = this.attrs\n const { high, low, close } = this.data\n const atr = new AverageTrueRange(period)\n const finalUpperBand: number[] = []\n const finalLowerBand: number[] = []\n const supertrend: boolean[] = []\n let firstBarToRender\n let lastBarToRender = 0\n\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.uptrendColor)\n for (let i = 1; i < close.length; i++) {\n atr.add(high[i], low[i], close[i - 1])\n\n // compute bands\n const avg = (high[i] + low[i]) / 2\n const upperBand = avg + multiplier * atr.value\n const lowerBand = avg - multiplier * atr.value\n\n finalUpperBand[i] = upperBand\n finalLowerBand[i] = lowerBand\n\n // identify supertrend\n if (close[i] > finalUpperBand[i - 1]) {\n supertrend[i] = true\n } else if (close[i] < finalLowerBand[i - 1]) {\n supertrend[i] = false\n } else {\n supertrend[i] = supertrend[i - 1]\n }\n\n // adjust bands\n if (supertrend[i] && finalLowerBand[i] < finalLowerBand[i - 1]) {\n finalLowerBand[i] = finalLowerBand[i - 1]\n }\n if (!supertrend[i] && finalUpperBand[i] > finalUpperBand[i - 1]) {\n finalUpperBand[i] = finalUpperBand[i - 1]\n }\n\n const x = this.fx(i)\n if (i < period || x + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n\n if (supertrend[i] && !supertrend[i - 1]) {\n // buy\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalUpperBand[i - 1])))\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\n } else if (supertrend[i]) {\n // keep buying\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\n } else {\n // keep selling\n context.moveTo(x, Math.round(this.fy(finalLowerBand[i])))\n }\n lastBarToRender = i\n }\n context.stroke()\n\n if (firstBarToRender === undefined) {\n context.translate(-0.5, -0.5)\n return\n }\n\n context.beginPath()\n context.set('strokeStyle', this.attrs.downtrendColor)\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n if (!supertrend[i] && supertrend[i - 1]) {\n // sell\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalLowerBand[i - 1])))\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\n } else if (!supertrend[i]) {\n // keep selling\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\n } else {\n // keep buying\n context.moveTo(x, Math.round(this.fy(finalUpperBand[i])))\n }\n }\n context.stroke()\n\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n const multiplier = {\n type: 'number',\n label: 'Period',\n name: 'multiplier',\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.Multiplier,\n required: true,\n step: 0.1,\n min: 0.0,\n max: 999,\n }\n\n const uptrendColor = {\n type: 'color',\n label: 'Uptrend Color',\n name: 'uptrendColor',\n value: this.attrs.uptrendColor ?? this.getFreeColor(),\n }\n const downtrendColor = {\n type: 'color',\n label: 'Downtrend Color',\n name: 'downtrendColor',\n value: this.attrs.downtrendColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, multiplier, uptrendColor, downtrendColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'multiplier':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'uptrendColor':\n case 'downtrendColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor(): string {\n return this.attrs.uptrendColor\n }\n\n toString() {\n return `Supertrend ${this.attrs.period},${this.attrs.multiplier}`\n }\n}\n\nSupertrend.prototype.defaults = {\n uptrendColor: COLORS.Uptrend,\n downtrendColor: COLORS.Downtrend,\n}\n\nexport default Supertrend\n","import * as d3 from 'd3'\n\nimport { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport Chart from '../models/chart'\nimport utils from '../utils'\nimport { convertColorToHEX, getHEXWithSpecificAplha } from '../utils/colors'\nimport { getFirstBarToRenderIndex, getLastBarToRenderIndex } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Overlay from './overlay'\n\nconst VP_COLORS = {\n UP: '#00FF00',\n DOWN: '#FF0000',\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 20,\n Opacity: 0.3,\n}\n\ninterface Attrs {\n period: number | string\n opacity: number\n upColor?: string\n downColor?: string\n}\n\nfunction applyOpacityToColor(color: string, opacity: number) {\n return getHEXWithSpecificAplha(convertColorToHEX(color), opacity)\n}\n\nfunction getColorsWithAppliedOpacity(attrs: Attrs) {\n return [\n applyOpacityToColor(attrs.upColor ?? VP_COLORS.UP, attrs.opacity),\n applyOpacityToColor(attrs.downColor ?? VP_COLORS.DOWN, attrs.opacity),\n ]\n}\n\n// Only time when we want value to be able to equal start of segment is first segment,\n// because start of next segment is equal to end of previous and value would match two segments\nfunction isInSegment(val: number, start: number, end: number, notEqualStart: boolean) {\n return (notEqualStart ? val > start : val >= start) && val <= end\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const opacity = parseFloat(values[1]) || DEFAULT_PARAMETERS.Opacity\n\n return [period, opacity]\n}\n\nclass VolumeProfile extends Overlay {\n static type = OverlayType.Vp\n static label = 'Volume Profile'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n const [periodInt, opacity] = parsePeriod(period)\n this.attrs.period = periodInt\n this.attrs.opacity = opacity\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (typeof this.attrs.period !== 'number') {\n return\n }\n super.renderContent()\n\n const chartModel = this.model.chart() as Chart\n const { leftOffset, width } = chartModel\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\n const chartWidth = width - left.width - right.width\n\n if (this.data.close.length === 0) return\n\n const firstBarToRender = getFirstBarToRenderIndex({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n })\n\n const lastBarToRender = getLastBarToRenderIndex({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n chartWidth,\n })\n\n const [upColor, downColor] = getColorsWithAppliedOpacity(this.attrs)\n const [minClose, maxClose] = utils.minMax(this.data.close.slice(firstBarToRender, lastBarToRender + 1))\n\n const segment = Math.abs(maxClose - minClose) / this.attrs.period\n const segments = [] // create an empty array to hold the segments\n\n for (let i = 0; i < this.attrs.period; i++) {\n const segmentStart = minClose + segment * i // calculate start of current segment\n const segmentEnd = segmentStart + segment // calculate end of current segment\n segments.push({ start: segmentStart, end: segmentEnd, up: 0, down: 0 }) // add segment to array\n }\n\n // loop through visible bars and assign volumes to segments\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const segmentIndex: number = segments.findIndex((item, segmentIndex) =>\n isInSegment(this.data.close[i], item.start, item.end, !!segmentIndex)\n )\n if (segmentIndex === -1) continue\n const volumeTrend = this.data.close[i] < this.data.open[i] ? 'down' : 'up'\n segments[segmentIndex][volumeTrend] += this.data.volume[i]\n }\n\n const max = utils.max(segments.map((item) => item.up + item.down))\n const rangeMax = chartWidth * 0.4 // maximum range in pixels where longest bar would reach (now it's 40% of chart width)\n const volumeFX = d3.scaleLinear().range([0, rangeMax]).domain([0, max])\n\n segments.forEach((item) => {\n const y = Math.round(this.fy(item.start))\n const segmentHeightRaw = Math.round(this.fy(item.end)) - y // raw segment height without gap between segments\n const segmentHeight = segmentHeightRaw + (Math.abs(segmentHeightRaw) > 5 ? 2 : 1) // apply gap to segment based on how high segment is\n const x = Math.abs(leftOffset) // segments are alligned to left side of chart which equal to absoulute value of leftOffset\n const upSegmentWidth = Math.round(volumeFX(item.up))\n const downSegmentWidth = Math.round(volumeFX(item.down))\n\n context.fillStyle = upColor\n context.fillRect(x, y, upSegmentWidth, segmentHeight)\n context.fillStyle = downColor\n context.fillRect(x + upSegmentWidth, y, downSegmentWidth, segmentHeight)\n })\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Zones',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n const opacity = {\n type: 'number',\n label: 'Opacity',\n name: 'opacity',\n value: this.attrs.opacity ?? DEFAULT_PARAMETERS.Opacity,\n required: true,\n min: 0,\n max: 1,\n step: 0.1,\n }\n const upColor = {\n type: 'color',\n label: 'Up Color',\n name: 'upColor',\n value: this.attrs.upColor ?? VP_COLORS.UP,\n }\n const downColor = {\n type: 'color',\n label: 'Down Color',\n name: 'downColor',\n value: this.attrs.downColor ?? VP_COLORS.DOWN,\n }\n\n return {\n title: this.label,\n inputs: [period, opacity, upColor, downColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n opacity: `${opacity.label} must be a number between ${opacity.min} and ${opacity.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'opacity':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'upColor':\n case 'downColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.upColor || VP_COLORS.UP\n }\n\n toString() {\n return `VP ${this.attrs.period}`\n }\n}\n\nVolumeProfile.prototype.defaults = { upColor: VP_COLORS.UP, downColor: VP_COLORS.DOWN }\n\nexport default VolumeProfile\n","import { OverlayType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport { dateFromUnixTimestamp } from '../utils'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n color: string\n}\n\nconst datesAreOnSameDay = (first: Date, second: Date) =>\n first.getFullYear() === second.getFullYear() &&\n first.getMonth() === second.getMonth() &&\n first.getDate() === second.getDate()\n\nclass VWAP extends Overlay {\n static type = OverlayType.Vwap\n static label = 'VWAP (intraday charts)'\n\n static getNumOfBarsBuffer() {\n return 1\n }\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.attrs.period = 5\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n if (!this.isRendered()) {\n return\n }\n\n const { leftOffset, width } = this.model.chart()\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.color)\n\n let cumulativePV = 0\n let cumulativeVolume = 0\n for (let i = 0; i < this.data.close.length; i++) {\n if (i > 0) {\n const prevDate = dateFromUnixTimestamp(this.data.date[i - 1])\n const date = dateFromUnixTimestamp(this.data.date[i])\n if (!datesAreOnSameDay(prevDate, date)) {\n cumulativePV = 0\n cumulativeVolume = 0\n }\n }\n\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\n const pv = typicalPrice * this.data.volume[i]\n\n cumulativePV += pv\n cumulativeVolume += this.data.volume[i]\n\n const vwap = cumulativePV / cumulativeVolume\n\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n const y = Math.round(this.fy(vwap))\n context.lineTo(x, y)\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [color],\n inputsErrorMessages: {},\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'color':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n isRendered() {\n return this.model.chart().quote().isIntraday\n }\n\n isRenderedOverlaysLabel() {\n return this.isRendered()\n }\n\n toString() {\n return `VWAP`\n }\n}\n\nVWAP.prototype.defaults = { color: '#9467bd' }\n\nexport default VWAP\n","import { OverlayType } from '../constants/common'\nimport bb from './bb'\nimport dch from './dch'\nimport ema from './ema'\nimport ema2 from './ema2'\nimport hilo from './hilo'\nimport hline from './hline'\nimport ic from './ic'\nimport icf from './icf'\nimport kch from './kch'\nimport none from './none'\nimport overlay from './overlay'\nimport patterns from './patterns'\nimport sar from './sar'\nimport sma from './sma'\nimport sma2 from './sma2'\nimport str from './str'\nimport vp from './vp'\nimport vwap from './vwap'\n\nexport const overlaysByType = Object.freeze({\n [OverlayType.Overlay]: overlay,\n [OverlayType.None]: none,\n [OverlayType.Bb]: bb,\n [OverlayType.Dch]: dch,\n [OverlayType.Ema]: ema,\n [OverlayType.Ema2]: ema2,\n [OverlayType.Hilo]: hilo,\n [OverlayType.Hline]: hline,\n [OverlayType.Ic]: ic,\n [OverlayType.Icf]: icf,\n [OverlayType.Kch]: kch,\n [OverlayType.Patterns]: patterns,\n [OverlayType.Sar]: sar,\n [OverlayType.Sma]: sma,\n [OverlayType.Sma2]: sma2,\n [OverlayType.Str]: str,\n [OverlayType.Vp]: vp,\n [OverlayType.Vwap]: vwap,\n})\n","import { MOBILE_VIEW_BREAKPOINT_WIDTH, SpecificChartFunctionality } from './constants/common'\nimport { captureException, getIsSSr } from './utils/helpers'\n\nfunction getIsDstInNy(date: Date) {\n const dayNumber = date.getDate()\n const monthIndex = date.getMonth()\n const dayOfWeek = date.getDay()\n const previousSunday = dayNumber - dayOfWeek\n if (monthIndex < 2 || monthIndex > 10) {\n return false\n }\n if (monthIndex > 2 && monthIndex < 10) {\n return true\n }\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\n}\n\nclass Utils {\n static min(...args: T[]): number {\n if (typeof args[0] === 'number') {\n return args[0] < +args[1] ? args[0] : (args[1] as number)\n }\n let min = args[0][0]\n for (const arg of args) {\n for (const el of arg as number[]) {\n if (el < min) {\n min = el\n }\n }\n }\n return min\n }\n\n static max(...args: T[]): number {\n if (typeof args[0] === 'number') {\n return args[0] > +args[1] ? args[0] : (args[1] as number)\n }\n let max = args[0][0]\n for (const arg of args) {\n for (const el of arg as number[]) {\n if (el > max) {\n max = el\n }\n }\n }\n return max\n }\n\n static minMax(...args: number[][]) {\n let max\n let min = (max = args[0][0] as number)\n for (const arg of args) {\n for (const el of arg) {\n if (el < min) {\n min = el\n }\n if (el > max) {\n max = el\n }\n }\n }\n return [min, max]\n }\n\n static getScaleRatio() {\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\n }\n\n static setSizeOnCanvasElement({\n canvasElement,\n width,\n height,\n ratio = Utils.getScaleRatio(),\n }: {\n canvasElement: HTMLCanvasElement | null\n width: number\n height: number\n ratio?: number\n }) {\n if (canvasElement) {\n canvasElement.width = width * ratio\n canvasElement.height = height * ratio\n canvasElement.style.width = width + 'px'\n canvasElement.style.height = height + 'px'\n }\n }\n\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\n const date = referenceDate || new Date()\n const dateAsNY = new Date(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours() - 5,\n date.getUTCMinutes(),\n date.getUTCSeconds()\n )\n const isDst = getIsDstInNy(dateAsNY)\n return (isDst ? 4 : 5) * 60 * 60\n }\n\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\n const date = new Date(referenceDate)\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\n const offsetDirectionCoefficient = addOffset ? 1 : -1\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\n return date\n }\n\n static isStockFastRefreshAvailable() {\n const date = convertLocalToNyTime(new Date(), true)\n const dayOfWeek = date.getDay()\n const hour = date.getHours()\n const minute = date.getMinutes()\n\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\n const isOpen = hour === 6 ? minute >= 30 : hour >= 7\n const isClosed = hour >= 19\n return !isWeekend && isOpen && !isClosed\n }\n\n static dateFromUnixTimestamp(timestamp: number) {\n /*\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\n * The function adds seconds to the date instance if it exceeds 60.\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\n * */\n const date = new Date(0)\n date.setUTCSeconds(timestamp)\n return Utils.convertLocalToNyTime(date, true)\n }\n\n static dateStringFromDate(date: Date) {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\n 2,\n '0'\n )}`\n }\n\n static dateFromDateString(dateString: string) {\n const [yyyy, mm, dd] = dateString.split('-')\n\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\n if (Number.isNaN(date.getTime())) {\n captureException(new Error('Invalid Date'), { extra: { date } })\n }\n\n return date\n }\n\n static isMobile(testTouchPoints?: boolean) {\n if (getIsSSr()) return false\n let isMobileOs = false\n\n // New iOS versions no longer report iPad in user agent\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\n try {\n document.createEvent('TouchEvent')\n isMobileOs = true\n } catch (e) {}\n } else {\n isMobileOs = !!navigator.userAgent.match(\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\n )\n }\n\n if (testTouchPoints) {\n try {\n return (\n isMobileOs &&\n (window.navigator.msMaxTouchPoints ||\n window.navigator.maxTouchPoints ||\n 'ontouchstart' in document.createElement('div'))\n )\n } catch (e) {}\n }\n\n return isMobileOs\n }\n\n static isIPad() {\n const matchesIPad = navigator.userAgent.match(/iPad/i)\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\n const matchesIPod = navigator.userAgent.match(/iPod/i)\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\n\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\n }\n\n static getCookie(name: string) {\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\n return document.cookie.replace(re, '$1')\n }\n\n static setCookie(name: string, value: string, expires: Date) {\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\n if (document.location.hostname !== 'localhost') {\n cookie += '; domain=.finviz.com'\n }\n document.cookie = cookie\n }\n}\n\nexport default Utils\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\nexport const dateStringFromDate = Utils.dateStringFromDate\nexport const dateFromDateString = Utils.dateFromDateString\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const getSanitizedTicker = (...args) => window.FLibs.getSanitizedTicker(...args)\n\nexport function getFullscreenStatus(): boolean {\n return (\n document.fullscreenElement ??\n document.webkitFullscreenElement ??\n document.mozFullScreenElement ??\n document.msFullscreenElement ??\n false\n )\n}\n\nexport function getRequestFullscreen(element: HTMLElement) {\n return (\n element.requestFullscreen ??\n element.webkitRequestFullScreen ??\n element.mozRequestFullScreen ??\n element.msRequestFullscreen\n )\n}\n\nexport function getExitFullscreen() {\n return (\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\n )\n}\n\nexport function ready(fn: () => void) {\n if (document.readyState !== 'loading') {\n fn()\n return\n }\n\n document.addEventListener('DOMContentLoaded', fn)\n}\n\nexport function getChartsDimensions(chartElementId: string) {\n const PADDING = 2 // Border widths\n const containerElement = document.getElementById(chartElementId)\n\n const box = containerElement?.getBoundingClientRect()\n\n return {\n width: Math.max((box?.width ?? 0) - PADDING, 0),\n height: Math.max((box?.height ?? 0) - PADDING, 0),\n }\n}\n\nexport function getIsMobileScreenSize() {\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\n}\n\nexport function getIsMobilePortrait(isMobile?: boolean) {\n if (isMobile ?? Utils.isMobile()) {\n return window.orientation % 180 === 0\n }\n return false\n}\n\nexport function numberToStringWithUnitsSuffix(value: number) {\n let suffix = ''\n if (value >= 1000000000) {\n value /= 1000000000\n suffix = 'B'\n } else if (value >= 1000000) {\n value /= 1000000\n suffix = 'M'\n } else if (value >= 1000) {\n value /= 1000\n suffix = 'K'\n }\n\n return value.toFixed(2) + suffix\n}\n\nexport function isRedesignEnabled() {\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\n}\n\nexport function isRedesignedPage(\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\n matchingPages = [\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.cryptoPage,\n ]\n) {\n return (\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\n // Legacy design on quote uses redesigned elements (page header + chart controls)\n obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\n )\n}\n","import { ObjectHash } from '../../types/shared'\n\nconst requestsAbortControllersCache: ObjectHash = {}\n\nexport function removeFromAbortCache(key: string) {\n delete requestsAbortControllersCache[key]\n}\n\nexport function abortRequest(key: string) {\n requestsAbortControllersCache[key]?.abort()\n removeFromAbortCache(key)\n}\n\nexport function getIsAbortError(error: Error) {\n return error.name === 'AbortError'\n}\n\nexport function createRequestAbortController({\n key,\n shouldAbortRunningRequest = false,\n}: {\n key: string\n shouldAbortRunningRequest?: boolean\n}) {\n if (shouldAbortRunningRequest) {\n abortRequest(key)\n }\n const controller = 'AbortController' in window ? new AbortController() : undefined\n if (controller) {\n requestsAbortControllersCache[key] = controller\n }\n return controller\n}\n","import * as React from 'react'\n\nimport { Notification, Paragraph, useNotification } from '../components'\nimport { captureException } from './helpers'\nimport { useIsMounted } from './use-is-mounted'\n\nconst cache: any = {}\nconst errorsCache: any = {}\n\nconst NUM_OF_RETRIES = 3\n\nenum ErrorSeverity {\n medium,\n high,\n}\n\nfunction importWithRetry(importFn: () => Promise, retries = 0) {\n const result = importFn().catch(async (err) => {\n if (retries > NUM_OF_RETRIES) {\n throw err\n }\n\n await new Promise((r) => setTimeout(r, 1000 * retries))\n\n return importWithRetry(importFn, retries + 1)\n }) as Promise\n\n return result\n}\n\n/**\n * Hook used to asynchronously load a module\n *\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#useasyncmodule)\n */\nexport function useAsyncModule({\n importFn,\n onError,\n errorSeverity,\n cacheKey,\n shouldLoadModule = false,\n isSuspenseMode = false as SuspenseMode,\n}: {\n importFn: () => Promise\n onError?: () => void\n cacheKey: string\n errorSeverity?: keyof typeof ErrorSeverity\n shouldLoadModule?: boolean\n isSuspenseMode?: SuspenseMode\n}) {\n const notificationContext = useNotification()\n const [isLoading, setIsLoading] = React.useState(false)\n const [isError, setIsError] = React.useState(false)\n const getIsMounted = useIsMounted()\n\n const handleError = () => {\n onError?.()\n setIsError(true)\n\n if (errorSeverity === undefined) {\n return\n }\n\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.high) {\n window.handleScriptNotLoaded()\n window.renderScriptNotLoaded()\n }\n\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.medium) {\n notificationContext.show(\n \n \n One or more of the required application components couldn’t be loaded.
Please try to repeat the\n action or{' '}\n window.location.reload()}>\n refresh the page\n {' '}\n if the problem persists.\n
\n
\n )\n }\n }\n\n const loadModule = async () => {\n if (cache[cacheKey]) {\n return cache[cacheKey]\n }\n\n setIsLoading(true)\n\n try {\n cache[cacheKey] = await importWithRetry(importFn)\n } catch (error) {\n captureException(error as Error)\n handleError()\n } finally {\n if (getIsMounted()) {\n setIsLoading(false)\n }\n }\n\n return cache[cacheKey]\n }\n\n React.useEffect(() => {\n if (shouldLoadModule) {\n loadModule()\n }\n // We want to run it only on shouldLoadModule change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shouldLoadModule])\n\n const cachedModule = cache[cacheKey]\n if (isSuspenseMode) {\n if (errorsCache[cacheKey]) throw errorsCache[cacheKey]\n if (!cachedModule) {\n throw importFn()\n .then((mod) => (cache[cacheKey] = mod))\n .catch((err) => {\n handleError()\n errorsCache[cacheKey] = err\n })\n }\n }\n\n return [cachedModule ?? null, { isLoading, loadModule, isError }] as [\n SuspenseMode extends true ? T : T | null,\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\n ]\n}\n\n/**\n * HOC which wraps component in React.Suspense\n *\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#withsuspense)\n */\nexport function withSuspense

>(\n Component: React.ComponentType

,\n fallback: React.ReactNode = null\n) {\n return function WrappedComponent(props: P) {\n return (\n \n \n \n )\n }\n}\n","import * as dateFns from 'date-fns'\n\nimport { ChartConfigChartPane, Instrument, ObjectHash } from '../../types/shared'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport { chartsByType } from '../charts/charts'\nimport {\n CRYPTOS,\n ChartEditorEnum,\n ChartElementType,\n OFFSET,\n PADDING,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n TIMEFRAME_SECONDS,\n TextBaseline,\n} from '../constants/common'\nimport { getPercentageFromValue } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport ChartLayoutModel from '../models/chart_layout'\nimport { IChartSettings } from '../models/chart_settings/interfaces'\nimport { Mouse } from '../models/mouse'\nimport Pane from '../models/pane'\nimport Quote, { QuoteGetParams } from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Utils, { dateFromUnixTimestamp } from '../utils'\nimport { FetchFunc } from './fetch_api'\nimport { captureException } from './helpers'\n\nconst DAY_IN_SECONDS = 86400\nconst TWO_MIN_IN_MS = 2 * 60 * 1000\nconst virtualDatesCache: ObjectHash<{\n fromSeconds: number\n toSeconds: number\n lastUsed: number\n virtualDates: number[]\n}> = {}\n\n// The reason to use this func instead of dateFns.isSameDay is performance as this is way faster\nfunction areTimestampsFromSameDay({ ts1, ts2 }: { ts1: number; ts2: number }) {\n const ts1Utc = ts1\n const ts2Utc = ts2\n return Math.floor(ts1Utc / DAY_IN_SECONDS) === Math.floor(ts2Utc / DAY_IN_SECONDS)\n}\n\nfunction getVirtualDatesCacheId({\n idRevision,\n ticker,\n timeframe,\n}: {\n idRevision: number\n ticker: string\n timeframe: string\n}) {\n return `${ticker}-${timeframe}-${idRevision}`\n}\n\nfunction getCachedVirtualDates({\n idRevision,\n ticker,\n timeframe,\n fromSeconds,\n toSeconds,\n}: {\n idRevision: number\n ticker: string\n timeframe: string\n fromSeconds: number\n toSeconds: number\n}) {\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\n const cache = virtualDatesCache[id]\n if (cache?.fromSeconds <= fromSeconds && cache?.toSeconds >= toSeconds) {\n cache.lastUsed = Date.now()\n if (cache.fromSeconds === fromSeconds && cache.toSeconds === toSeconds) {\n return cache.virtualDates\n }\n return cache.virtualDates.filter(\n (virtualDateSeconds) => virtualDateSeconds >= fromSeconds && virtualDateSeconds <= toSeconds\n )\n }\n return null\n}\n\nfunction checkVirtualCacheSize() {\n const now = Date.now()\n Object.keys(virtualDatesCache).forEach((virtualDatesCacheId) => {\n if (virtualDatesCache[virtualDatesCacheId].lastUsed < now - TWO_MIN_IN_MS) {\n delete virtualDatesCache[virtualDatesCacheId]\n }\n })\n}\n\nfunction setCachedVirtualDates({\n idRevision,\n ticker,\n timeframe,\n fromSeconds,\n toSeconds,\n virtualDates,\n}: {\n idRevision: number\n ticker: string\n timeframe: string\n fromSeconds: number\n toSeconds: number\n virtualDates: number[]\n}) {\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\n checkVirtualCacheSize()\n virtualDatesCache[id] = {\n fromSeconds,\n toSeconds,\n virtualDates,\n lastUsed: Date.now(),\n }\n}\n\nconst MAX_BAR_BORDER_WIDTH = 1\nconst MIN_BAR_MARGIN_WIDTH = 0\nconst MAX_BAR_MARGIN_WIDTH = 16\n\nexport function getBarWidthWithMarginByParts({\n zoomFactor = 1,\n chartLayout,\n}: {\n zoomFactor?: number\n chartLayout: ChartLayoutModel\n}) {\n const { ChartSettings } = chartLayout.settings\n const settingsCenter = ChartSettings.center\n const barMargin =\n zoomFactor > 1 && settingsCenter.barMargin === 0\n ? Math.min(settingsCenter.barWidth, 1 - 1 / zoomFactor)\n : settingsCenter.barMargin\n\n const barFillWidth = settingsCenter.barWidth * zoomFactor\n const barBorderWidth = Math.min(settingsCenter.border * zoomFactor, MAX_BAR_BORDER_WIDTH)\n const barMarginWidth = Math.max(MIN_BAR_MARGIN_WIDTH, Math.min(barMargin * zoomFactor, MAX_BAR_MARGIN_WIDTH))\n\n return {\n barFillWidth,\n barBorderWidth,\n barMarginWidth,\n }\n}\n\nexport function getBarWidthWithMargin({\n zoomFactor = 1,\n chartLayout,\n shouldRound = true,\n}: {\n zoomFactor?: number\n chartLayout: ChartLayoutModel\n shouldRound?: boolean\n}) {\n const { barFillWidth, barBorderWidth, barMarginWidth } = getBarWidthWithMarginByParts({ zoomFactor, chartLayout })\n\n const barWidth = barFillWidth + barBorderWidth * 2 + barMarginWidth\n if (!shouldRound) {\n return barWidth\n }\n const roundDecimalPlaces = barWidth > 100 ? 10 : 10000\n return Math.round(barWidth * roundDecimalPlaces) / roundDecimalPlaces\n}\n\nconst DEFAULT_ZOOM_GUESS_INCREMENT = 0.001\n\nconst zoomFactorForBarsToDisplayCache: ObjectHash = {}\nconst zoomFactorForBarsToDisplayCacheKeys: string[] = []\nconst NUMBER_OF_CACHED_ZOOM_FACTORS = 10\nconst getZoomFactorFromCache = (key: string) => zoomFactorForBarsToDisplayCache[key] ?? null\nconst setZoomFactorToCache = (key: string, value: number) => {\n if (!zoomFactorForBarsToDisplayCacheKeys.includes(key)) {\n zoomFactorForBarsToDisplayCacheKeys.unshift(key)\n if (zoomFactorForBarsToDisplayCacheKeys.length > NUMBER_OF_CACHED_ZOOM_FACTORS) {\n const poppedKey = zoomFactorForBarsToDisplayCacheKeys.pop()\n if (poppedKey) {\n delete zoomFactorForBarsToDisplayCache[poppedKey]\n }\n }\n }\n\n zoomFactorForBarsToDisplayCache[key] = value\n}\n\nexport function getZoomFactorForBarsToDisplay({\n chartVisibleWidth,\n numOfVisibleBars,\n chartLayout,\n}: {\n chartVisibleWidth: number\n numOfVisibleBars: number\n chartLayout: ChartLayoutModel\n}) {\n const defaultBarWidthWithMargin = getBarWidthWithMargin({ chartLayout })\n const barWidthWithMargin = chartVisibleWidth / numOfVisibleBars\n const cacheKey = `${defaultBarWidthWithMargin}-${barWidthWithMargin}`\n let zoomIncrement = 0\n let currentZoomFactor = 1\n let finalZoomFactor = getZoomFactorFromCache(cacheKey)\n let iteration = 0\n if (barWidthWithMargin <= defaultBarWidthWithMargin) {\n finalZoomFactor = barWidthWithMargin / defaultBarWidthWithMargin\n }\n while (finalZoomFactor === null) {\n iteration += 1\n const threshold = 0.01\n currentZoomFactor += zoomIncrement\n const barWidth = getBarWidthWithMargin({ zoomFactor: currentZoomFactor, chartLayout, shouldRound: false })\n const barWidthDiff = barWidthWithMargin - barWidth\n if (barWidthDiff > threshold) {\n zoomIncrement = zoomIncrement > 0 ? zoomIncrement * 2 : DEFAULT_ZOOM_GUESS_INCREMENT\n } else if (barWidthDiff < -threshold) {\n zoomIncrement = zoomIncrement < 0 ? zoomIncrement * 2 : -DEFAULT_ZOOM_GUESS_INCREMENT\n } else {\n finalZoomFactor = currentZoomFactor\n }\n\n if (iteration === 1000) {\n captureException(new Error('Invalid zoom factor from getZoomFactorForBarsToDisplay'), {\n extra: {\n iteration,\n zoomIncrement,\n barWidthWithMargin,\n barWidth,\n barWidthDiff,\n currentZoomFactor,\n chartLayout: chartLayout.toConfig(['colors', 'panes']),\n },\n })\n return currentZoomFactor\n }\n }\n\n setZoomFactorToCache(cacheKey, finalZoomFactor)\n\n return finalZoomFactor\n}\n\nexport function getTimeframeSeconds({\n lowerIndex,\n dates,\n timeframe,\n}: {\n lowerIndex: number\n dates: number[]\n timeframe: TIMEFRAME\n}) {\n const upperIndex = lowerIndex + 1\n const areBoundsDefined = ![dates[upperIndex], dates[lowerIndex]].some((index) => index === undefined)\n return areBoundsDefined ? dates[upperIndex] - dates[lowerIndex] : TIMEFRAME_SECONDS[timeframe]\n}\n\nfunction getVirtualTradedDays({\n dateStartSeconds,\n dateEndSeconds,\n datesSeconds,\n marketStartMinutes,\n}: {\n dateStartSeconds: number\n dateEndSeconds: number\n datesSeconds: number[]\n marketStartMinutes: number\n}) {\n const dateStart = dateFromUnixTimestamp(dateStartSeconds)\n const dateEnd = dateFromUnixTimestamp(dateEndSeconds)\n const isStartBeforeDates = dateStartSeconds < datesSeconds[0]\n const isEndAfterDates = datesSeconds.length > 0 && datesSeconds[datesSeconds.length - 1] < dateEndSeconds\n const firstDate = dateFromUnixTimestamp(datesSeconds[0])\n const lastDate = dateFromUnixTimestamp(datesSeconds[datesSeconds.length - 1])\n return dateFns\n .eachDayOfInterval({\n start:\n isStartBeforeDates && (dateFns.isWeekend(dateStart) || dateStart.getMinutes() < marketStartMinutes)\n ? dateFns.addBusinessDays(dateStart, -1)\n : dateStart,\n end: isEndAfterDates ? dateFns.addBusinessDays(dateEnd, 1) : dateEnd,\n })\n .filter((date) => {\n const ts2 = date.getTime() / 1000 - date.getTimezoneOffset() * 60\n return (\n !dateFns.isWithinInterval(date, { start: dateFns.startOfDay(firstDate), end: dateFns.endOfDay(lastDate) }) ||\n datesSeconds.some((dateTime) =>\n areTimestampsFromSameDay({\n ts1: dateTime - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateTime * 1000)),\n ts2,\n })\n )\n )\n })\n}\n\nexport function getVirtualTimeframeTradedDates({\n dateStart,\n dateEnd,\n quote,\n}: {\n dateStart: number\n dateEnd: number\n quote: Quote\n}) {\n const { date: dates, ticker, timeframe, instrument, isIntraday, marketStartMinutes } = quote\n const barsInDay = quote.getBarsInDay() ?? 0\n\n // Currently we're passing first and last quote dates to dateStart / dateEnd so this is always true\n // but this function can be used on other places in the future where it will work with dates out of quote dates range\n const isWithinRangeOfQuoteDate = dateStart === dates[0] && dateEnd === dates[dates.length - 1]\n\n const commonVirtualCacheProps = {\n idRevision: dates.length,\n ticker,\n timeframe,\n fromSeconds: dateStart,\n toSeconds: dateEnd,\n }\n const cachedDates = getCachedVirtualDates(commonVirtualCacheProps)\n if (cachedDates) {\n return cachedDates\n }\n if (!isIntraday || instrument !== Instrument.Stock) {\n if (isWithinRangeOfQuoteDate) {\n return dates\n }\n const timeframeSeconds = TIMEFRAME_SECONDS[timeframe]\n const firstDate = dates[0]\n const lastDate = dates[dates.length - 1]\n const numOfDatesBefore = Math.ceil((firstDate - dateStart) / timeframeSeconds)\n const numOfDatesAfter = Math.ceil((dateEnd - lastDate) / timeframeSeconds)\n return [\n ...Array.from({ length: numOfDatesBefore })\n .map((_, index) => firstDate - (index + 1) * timeframeSeconds)\n .reverse(),\n ...dates,\n ...Array.from({ length: numOfDatesAfter }).map((_, index) => lastDate + (index + 1) * timeframeSeconds),\n ]\n }\n\n const virtualTradedDays = isWithinRangeOfQuoteDate\n ? quote.getDaysInQuote()\n : getVirtualTradedDays({\n dateStartSeconds: dateStart,\n dateEndSeconds: dateEnd,\n datesSeconds: dates,\n marketStartMinutes,\n })\n\n const marketStartSeconds = marketStartMinutes * 60\n const barTimeframeSeconds = Array.from({ length: barsInDay }).map((_, i) => i * TIMEFRAME_SECONDS[timeframe])\n const quoteDatesTimestampOffset = Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateStart * 1000))\n const virtualDates = virtualTradedDays.flatMap((date) => {\n const daySeconds =\n date.getTime() / 1000 + Utils.getQuoteDateTimestampOffsetInSeconds(date) - date.getTimezoneOffset() * 60\n const dayStartSeconds = daySeconds + marketStartSeconds\n return barTimeframeSeconds.map(\n // Hourly market starts at 9:30 but all other time ticks should be rounded down to :00 of the current hour\n (barSeconds, index) =>\n ([TIMEFRAME.h, TIMEFRAME.h2, TIMEFRAME.h4].includes(timeframe) && index > 0 ? -1800 : 0) +\n dayStartSeconds +\n barSeconds\n )\n })\n\n if (!isWithinRangeOfQuoteDate) {\n virtualDates.filter((date, index, virtualTimeframeTradedDates) => {\n const isLowerBounded =\n date >= dateStart ||\n areTimestampsFromSameDay({\n ts1: date - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(date * 1000)),\n ts2: dateStart - quoteDatesTimestampOffset,\n })\n const isOneBeforeLowerBoundStarts = dateStart > date && dateStart < virtualTimeframeTradedDates[index + 1]\n return isLowerBounded || isOneBeforeLowerBoundStarts\n })\n }\n\n setCachedVirtualDates({\n ...commonVirtualCacheProps,\n virtualDates,\n })\n\n return virtualDates\n}\n\ninterface TimestampPositionGettersProps {\n quote: Quote\n}\n\nexport function getTimestampFromPositionX({ positionX, quote }: TimestampPositionGettersProps & { positionX: number }) {\n const { date, timeframe } = quote\n const dates = getVirtualTimeframeTradedDates({\n dateStart: date[0],\n dateEnd: date[date.length - 1],\n quote,\n })\n const dateStart = dates[0]\n const dateEnd = dates[dates.length - 1]\n const lastDateIndex = dates.length - 1\n if (positionX >= 0 && positionX <= lastDateIndex) {\n const lowerIndex = Math.floor(positionX)\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex, dates, timeframe })\n return dates[lowerIndex] + (positionX - lowerIndex) * timeframeSeconds\n }\n const isLookingBack = positionX < 0\n const averageBarDate = (dateEnd - dateStart) / dates.length\n const numOfSecondsOutOfBounds = isLookingBack\n ? Math.abs(positionX) * averageBarDate\n : (positionX - lastDateIndex) * averageBarDate\n return ~~(isLookingBack ? dateStart - numOfSecondsOutOfBounds : dateEnd + numOfSecondsOutOfBounds)\n}\n\nexport function getPositionXFromTimestamp({ timestamp, quote }: TimestampPositionGettersProps & { timestamp: number }) {\n const { date, timeframe } = quote\n const dates = getVirtualTimeframeTradedDates({\n dateStart: date[0],\n dateEnd: date[date.length - 1],\n quote,\n })\n const dateStart = dates[0]\n const dateEnd = dates[dates.length - 1]\n const lastDateIndex = dates.length - 1\n if (timestamp >= dates[0] && timestamp <= dates[dates.length - 1]) {\n const upperIndex = timestamp === dateEnd ? lastDateIndex : dates.findIndex((date) => date > timestamp)\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex: upperIndex - 1, dates, timeframe })\n const positionDiffUpperTimestamp = (dates[upperIndex] - timestamp) / timeframeSeconds\n return upperIndex - positionDiffUpperTimestamp\n }\n const isLookingBack = timestamp < dateStart\n const averageBarDate = (dateEnd - dateStart) / dates.length\n return isLookingBack\n ? -((dateStart - timestamp) / averageBarDate)\n : lastDateIndex + (timestamp - dateEnd) / averageBarDate\n}\n\n// counterpart in Finviz-Website 'Finviz-Website/js/main/util.ts'\nexport function getInstrument(tickerRaw: string) {\n if (tickerRaw.indexOf('@') === 0) {\n const ticker = tickerRaw.substring(1) as keyof typeof CRYPTOS\n\n if (CRYPTOS[ticker]) {\n return Instrument.Crypto\n } else if (ticker.length === 6) {\n return Instrument.Forex\n } else {\n return Instrument.Futures\n }\n }\n return Instrument.Stock\n}\n\nexport function getPerfIndicatorTickerAndTimeframes({\n paneWithPerfIndicator,\n timeframe,\n}: {\n paneWithPerfIndicator: ChartConfigChartPane\n timeframe: TIMEFRAME\n}) {\n const { elements } = paneWithPerfIndicator\n const perfIndicatorElement = elements.find(({ type }) => type === 'indicators/perf')\n const tickers = perfIndicatorElement?.period?.split(',') ?? []\n return tickers.map((ticker) => ({\n ticker,\n instrument: getInstrument(ticker),\n timeframe,\n }))\n}\n\ninterface PrefetchPerfIndicatorAllQuotesProps extends Pick {\n paneWithPerfIndicator: ChartConfigChartPane\n fetchFunc?: FetchFunc\n chartUuid?: string\n}\n\nexport async function prefetchPerfIndicatorAllQuotes({\n paneWithPerfIndicator,\n timeframe,\n fetchFunc,\n options,\n chartUuid,\n}: PrefetchPerfIndicatorAllQuotesProps) {\n const tickersAndTimeframes = getPerfIndicatorTickerAndTimeframes({ paneWithPerfIndicator, timeframe })\n\n if (tickersAndTimeframes.length > 0) {\n const promises = tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\n Quote.get({\n ticker,\n instrument,\n timeframe,\n options,\n fetchFunc,\n chartUuid,\n })\n )\n return Promise.all(promises)\n }\n return Promise.resolve([])\n}\n\ninterface RenderCrossProps {\n context: CanvasRenderingContext2D\n mouseModel: Mouse\n paneModel: Pane\n quote: Quote\n contentWidth: number\n contentHeight: number\n onRenderCrossText?: (context: CanvasRenderingContext2D, crossIndex: number) => void\n getRoundDecimalPlaces?: (price?: number) => number | undefined\n isIndicator?: boolean\n isPerfIndicator?: boolean\n}\n\nexport function renderCross({\n context,\n mouseModel,\n paneModel,\n quote,\n contentWidth,\n contentHeight,\n onRenderCrossText,\n getRoundDecimalPlaces,\n isIndicator = false,\n isPerfIndicator = false,\n}: RenderCrossProps) {\n const crossIndex = mouseModel.getCrossIndexForPane(paneModel)\n const chartModel = paneModel.chart()\n const { ChartSettings, IndicatorSettings } = getChartLayoutSettings(chartModel.chart_layout())\n const settings = isIndicator ? IndicatorSettings : ChartSettings\n const { Colors } = ChartSettings.general\n\n if (!mouseModel.getShouldRenderCrossInPane(paneModel)) {\n return false\n }\n\n const price = mouseModel.getPriceForPane(paneModel)\n const middle = paneModel.scale.x(crossIndex) + chartModel.leftOffset\n const isXAxisInView = middle > 0 && middle <= contentWidth\n if (isXAxisInView) {\n const x = middle + settings.left.width\n new Line(\n {\n x1: x,\n x2: x,\n y1: settings.top.height,\n y2: settings.top.height + contentHeight,\n strokeStyle: Colors.cross,\n },\n paneModel\n ).render(context)\n\n onRenderCrossText?.(context, crossIndex)\n }\n\n const domainRange = paneModel.scale.y\n .domain()\n .slice()\n .sort((a, b) => a - b)\n\n if (price === null || !(domainRange[0] <= price && price <= domainRange[1])) {\n return isXAxisInView\n }\n\n const priceFy = paneModel.scale.y(price)\n const y = Math.round(priceFy + settings.top.height)\n new Line(\n {\n x1: settings.left.width,\n x2: settings.left.width + contentWidth,\n y1: y,\n y2: y,\n strokeStyle: Colors.cross,\n },\n paneModel\n ).render(context)\n const YAxisLeftMargin = quote.instrument === Instrument.Crypto && quote.lastClose <= 0.001 ? 3 : 8\n\n const getCrossText = () => {\n if (chartModel.scale === ScaleType.Percentage && !isIndicator) {\n return `${math.round({\n value: getPercentageFromValue({ number: price, base: chartModel.firstBarClose }),\n lastClose: quote.lastClose,\n instrument: quote.instrument,\n overridePlaces: 2,\n })}%`\n }\n return `${math.round({\n value: price,\n lastClose: quote.lastClose,\n instrument: quote.instrument,\n overridePlaces: getRoundDecimalPlaces?.(price) ?? (paneModel.getIsChartPane() ? undefined : 2),\n })}${isPerfIndicator ? '%' : ''}`\n }\n\n new Text(\n {\n text: getCrossText(),\n x:\n settings.left.width +\n settings.right.axis.margin.left! +\n contentWidth +\n (isIndicator ? OFFSET.S : YAxisLeftMargin - PADDING.XXS),\n padding: isIndicator\n ? Text.getMergedPropsWithDefaults('padding', IndicatorSettings.right.axis.font.padding)\n : {\n top: PADDING.XXS,\n right: PADDING.XXS,\n bottom: PADDING.XXS,\n left: PADDING.XXS,\n },\n ...{\n y,\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.crossText,\n background: Colors.crossTextBackground,\n font: Text.getMergedPropsWithDefaults('font', { ...settings.right.axis.font, style: 'bold' }),\n lineHeight: settings.right.axis.font.lineHeight,\n },\n },\n paneModel\n ).render(context)\n\n return true\n}\n\n/**\n * Set canvas width and height to 0 which fixes Safari memory problems\n *\n * @see https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\n */\nexport function unmountCanvas(canvas?: HTMLCanvasElement | null) {\n if (!canvas) return\n\n canvas.width = 0\n canvas.height = 0\n canvas.style.width = '0px'\n canvas.style.height = '0px'\n}\n\nexport function getChangeColor({ change, ChartSettings }: { change: number; ChartSettings: IChartSettings }) {\n const { Colors } = ChartSettings.general\n if (change === 0) {\n return Colors.zeroChange\n }\n return change > 0 ? Colors.positiveChange : Colors.negativeChange\n}\n\nexport function round({ data, num, overridePlaces }: { data: Quote; num: number; overridePlaces?: number }) {\n return math.round({\n value: num,\n lastClose: data.lastClose,\n instrument: data.instrument,\n overridePlaces: overridePlaces,\n })\n}\n\nexport interface ITickerChange {\n points: number\n string: string\n percentString: string\n}\ninterface ITickerChangeResult {\n tickerChange: ITickerChange | null\n tickerAfterChange: ITickerChange | null\n}\n\nexport function getTickerChangeFromCloseValues({\n anchorClose,\n prevClose,\n data,\n}: {\n anchorClose: number\n prevClose: number\n data: Quote\n}): ITickerChange {\n const changePoints = anchorClose - prevClose\n const changePercent = (anchorClose / prevClose - 1) * 100\n const changePercentString = `${round({\n data,\n num: Math.abs(changePercent),\n overridePlaces: 2,\n })}%`\n const changePointsString = `${changePoints > 0 ? '+' : ''}${round({\n data,\n num: changePoints,\n })} (${changePercentString})`\n\n return {\n points: changePoints,\n string: changePointsString,\n percentString: `${changePoints > 0 ? '+' : ''}${changePoints < 0 ? '-' : ''}${changePercentString}`,\n }\n}\nexport function getTickerChange({ data }: { data: Quote }) {\n const result: ITickerChangeResult = { tickerChange: null, tickerAfterChange: null }\n const isChange = Number.isFinite(data.prevClose) // if not new stock always present\n if (isChange) {\n result.tickerChange = getTickerChangeFromCloseValues({\n data,\n anchorClose: data.lastClose,\n prevClose: data.prevClose,\n })\n }\n\n const isAfterChange = Number.isFinite(data.afterClose) && data.afterClose !== data.lastClose\n if (isAfterChange) {\n const tickerAfterChange = getTickerChangeFromCloseValues({\n data,\n anchorClose: data.afterClose,\n prevClose: data.lastClose,\n })\n result.tickerAfterChange = {\n ...tickerAfterChange,\n string: `AH: ${tickerAfterChange.string}`,\n }\n }\n\n return result\n}\n\nexport function isForexFuturesCryptoPage(specificChartFunctionality: SpecificChartFunctionality) {\n return [\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n SpecificChartFunctionality.futuresPage,\n ].includes(specificChartFunctionality)\n}\n\nexport function getShouldUseDarkerWickColors({\n specificChartFunctionality,\n totalBarWidth,\n}: {\n specificChartFunctionality: SpecificChartFunctionality\n timeFrame?: TIMEFRAME\n totalBarWidth: number\n}) {\n const isForexFuturesCrypto = isForexFuturesCryptoPage(specificChartFunctionality)\n const isOffscreenChartWithNarrowBars =\n specificChartFunctionality === SpecificChartFunctionality.offScreen && totalBarWidth < 5\n const isQuoteChartWithNarrowBars =\n specificChartFunctionality === SpecificChartFunctionality.quotePage && totalBarWidth < 5\n\n return isForexFuturesCrypto || isOffscreenChartWithNarrowBars || isQuoteChartWithNarrowBars\n}\n\nexport const DRAWING_COOKIE_NAME = 'charts-draw'\nexport function getIsDrawingEnabled() {\n return Utils.getCookie(DRAWING_COOKIE_NAME) === 'on'\n}\n\nexport function setIsDrawingEnabled(value: boolean) {\n const expires = new Date()\n expires.setMonth(expires.getMonth() + 1)\n Utils.setCookie(DRAWING_COOKIE_NAME, value ? 'on' : 'off', expires)\n}\n\nexport function getIsSidebarEnabled(specificChartFunctionality: SpecificChartFunctionality) {\n return (\n specificChartFunctionality === SpecificChartFunctionality.chartPage && !!window.FinvizSettings.hasSidebarEnabled\n )\n}\n\nexport const handleTypeChange = ({\n type,\n chartLayoutModel,\n}: {\n type: ChartElementType\n chartLayoutModel: ChartLayoutModel\n}) => {\n const elements = chartLayoutModel.getAllElements()\n elements.forEach((element) => {\n if (element.isChart() && element.instance.attrs.type !== type) {\n const pane = element.pane()\n const instance = chartsByType[type].fromObject(\n {\n ...element.instance.attrs,\n type,\n },\n pane\n )\n element.replace(instance)\n }\n })\n}\n\nexport const getIsPreserveDrawingsAndAutosaveAvailable = (args: {\n specificChartFunctionality: SpecificChartFunctionality\n editable: boolean\n editors: ChartEditorEnum[]\n}) => {\n const { specificChartFunctionality, editable, editors } = args\n\n return (\n editable &&\n editors?.includes(ChartEditorEnum.tools) &&\n specificChartFunctionality &&\n [\n SpecificChartFunctionality.chartPage,\n SpecificChartFunctionality.quotePage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(specificChartFunctionality)\n )\n}\n","/**\n * Keep this file in sync with `Website/js/main/components/color-picker/util.ts` in website repo\n * */\n\nexport interface RGBA {\n r: number\n g: number\n b: number\n a: number\n}\n\nexport interface HSVA {\n h: number\n s: number\n v: number\n a: number\n}\n\nexport interface HSLA {\n h: number\n s: number\n l: number\n a: number\n}\n\n/**\n * Convert Hex string to RGBA object.\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\n *\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hexStringToRGBA(hexString: string): RGBA {\n const hexColor = removeHashSymbol(hexString)\n let r: string | number = 0\n let g: string | number = 0\n let b: string | number = 0\n let a: string | number = 255\n\n // 3 digits\n if (hexColor.length === 3 || hexColor.length === 4) {\n r = '0x' + hexColor[0] + hexColor[0]\n g = '0x' + hexColor[1] + hexColor[1]\n b = '0x' + hexColor[2] + hexColor[2]\n // Get channel if defined\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\n\n // 6 digits\n } else if (hexColor.length === 6 || hexColor.length === 8) {\n r = '0x' + hexColor[0] + hexColor[1]\n g = '0x' + hexColor[2] + hexColor[3]\n b = '0x' + hexColor[4] + hexColor[5]\n // Get channel if defined\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\n }\n\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\n}\n\n/**\n * Convert HEX string to HSVA color representation.\n *\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\n *\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n */\nexport function hexStringToHSVA(hexString: string) {\n return rgbaToHSVA(hexStringToRGBA(hexString))\n}\n\n/**\n * Convert HEX string to HSLA color representation.\n *\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\n *\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n */\nexport function hexStringToHSLA(hexString: string) {\n return rgbaToHSLA(hexStringToRGBA(hexString))\n}\n\n/**\n * Convert alpha value to hex value\n *\n * Input: [0,1]\n *\n * Output: alpha in HEX format\n */\nexport function alphaToHex(alpha: number) {\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\n .toString(16)\n .padStart(2, '0')\n}\n\n/**\n * Convert RGBA color to HEX string.\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\n */\nexport function rgbaToHexString(color: RGBA, alpha = false) {\n const r = color.r.toString(16)\n const g = color.g.toString(16)\n const b = color.b.toString(16)\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\n\n if (!alpha || color.a === 1) {\n return hexString\n }\n\n return `${hexString}${alphaToHex(color.a)}`\n}\n\n/**\n * Convert HSVA object to HEX string\n *\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\n *\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\n const rgbaColor = hsvaToRGBA(color)\n\n return rgbaToHexString(rgbaColor, alpha)\n}\n\n/**\n * Convert HSLA object to HEX string\n *\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\n *\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hslaToHexString(color: HSLA, alpha = false) {\n const rgbaColor = hslaToRGBA(color)\n\n return rgbaToHexString(rgbaColor, alpha)\n}\n\n/**\n * Convert RGBA color to HSVA\n * @see https://stackoverflow.com/a/54070620/6662683\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n */\nexport function rgbaToHSVA(color: RGBA): HSVA {\n const r = color.r / 255\n const g = color.g / 255\n const b = color.b / 255\n\n const v = Math.max(r, g, b)\n const c = v - Math.min(r, g, b)\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\n\n return {\n h: 60 * (h < 0 ? h + 6 : h),\n s: v ? c / v : 0,\n v: v,\n a: color.a,\n }\n}\n\n/**\n * Convert RGBA to HSLA\n * @see https://stackoverflow.com/a/54071699/6662683\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n */\nexport function rgbaToHSLA(color: RGBA): HSLA {\n const r = color.r / 255\n const g = color.g / 255\n const b = color.b / 255\n\n const v = Math.max(r, g, b)\n const c = v - Math.min(r, g, b)\n const f = 1 - Math.abs(v + v - c - 1)\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\n\n return {\n h: 60 * (h < 0 ? h + 6 : h),\n s: f ? c / f : 0,\n l: (v + v - c) / 2,\n a: color.a,\n }\n}\n\n/**\n * Convert HSVA color to RGBA\n * @see https://stackoverflow.com/a/54024653/6662683\n *\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hsvaToRGBA(color: HSVA): RGBA {\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)\n\n return {\n r: Math.round(f(5) * 255),\n g: Math.round(f(3) * 255),\n b: Math.round(f(1) * 255),\n a: Math.round(color.a * 100) / 100,\n }\n}\n\n/**\n * Convert HSLA color to RGBA\n * @see https://stackoverflow.com/a/54014428/6662683\n *\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hslaToRGBA(color: HSLA): RGBA {\n const a = color.s * Math.min(color.l, 1 - color.l)\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n\n return {\n r: Math.round(f(0) * 255),\n g: Math.round(f(8) * 255),\n b: Math.round(f(4) * 255),\n a: color.a,\n }\n}\n\n/**\n * Convert RGBA color to rgba() string\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: rgba(r, g, b, a)\n */\nexport function rgbaToRGBAString(color: RGBA) {\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\n}\n\n/**\n * Convert rgba() string to RGBA color\n *\n * Input: rgba(r, g, b, a)\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function rgbaStringToObject(color: string) {\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\n return {\n r: Number.parseInt(red),\n g: Number.parseInt(green),\n b: Number.parseInt(blue),\n a: Number.parseFloat(alpha),\n }\n}\n\n/**\n * Convert HSLA color to hsla() string\n *\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n *\n * Output: hsla(h, s, l, a)\n */\nexport function hslaToHSLAString(color: HSLA) {\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\n color.a\n })`\n}\n\nexport function removeHashSymbol(strColor: string) {\n return strColor.replace(/#/g, '')\n}\n\n/**\n * Check if the param is a valid color by setting it as style\n */\nexport function isValidColor(strColor: string) {\n const isRgb = strColor.startsWith('rgba')\n const s = new Option().style\n\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\n\n return s.color !== ''\n}\n\n/**\n * Normalize color to be a hex value\n */\nexport function convertColorToHEX(strColor: string, allowAlpha = true) {\n const isRgb = getIsRgb(strColor)\n const hexColor = isRgb ? rgbaToHexString(rgbaStringToObject(strColor), allowAlpha) : strColor\n\n if (allowAlpha) {\n return hexColor\n }\n return hexColor.slice(0, 7)\n}\n\n/**\n * Returns true if color is rgb or rgba\n */\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\n const rgbKeys = ['rgb']\n if (isAlphaAllowed) {\n rgbKeys.push('rgba')\n }\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\n}\n\n/**\n * Convert any color format to HSVA (internal color picker representation)\n */\nexport function getHSVAFromColor(strColor: string) {\n if (getIsRgb(strColor)) {\n return rgbaToHSVA(rgbaStringToObject(strColor))\n }\n\n return hexStringToHSVA(strColor)\n}\n\n/**\n * Stringify HSVA color representation into a output format\n */\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\n switch (output) {\n case 'rgba':\n return rgbaToRGBAString(hsvaToRGBA(color))\n default:\n return hsvaToHEXString(color, canSelectAlpha)\n }\n}\n\n/**\n * Get luma value from RGBA color using the Rec. 709 coefficients\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\n *\n * If luma is >= 165 the foreground color should be dark\n */\nexport function getLumaFromRGBA(color: RGBA) {\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\n}\n\n/**\n * Checks if luma is >= 165 or alpha < 0.3\n */\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\n}\n\n/**\n * Set specific alpha for a hex color\n */\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\n const rgbaColor = hexStringToRGBA(color)\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\n}\n\n/**\n * Get rgba from valid color string\n */\nexport function getRGBAValueFromValidColorString(value: string) {\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\n return rgbaToRGBAString(hexStringToRGBA(value))\n}\n","// if conditionalCursor provided, cursor is set only if current cursor !== conditionalCursor\n// otherwise cursor is set if element exists\nexport const setElementCursor = ({\n elementId,\n cursor,\n conditionalCursor,\n}: {\n elementId: string\n cursor: string\n conditionalCursor?: string\n}) => {\n const element = document.getElementById(elementId)\n if (element && (conditionalCursor ? element.style.cursor !== conditionalCursor : true)) {\n element.style.cursor = cursor\n }\n}\n","/*\n * We want to be able to render only bars/parts of line that are visible to users,\n * but without introducing visual artifacts like bars missing in front of users while scrolling\n * or lines that start in middle of chart for sparse intraday stock data.\n *\n * In general we want to start rendering lines one bar sooner than what is visible to user and stop rendering\n * one bar outside of visible area to create a continuous line.\n */\nimport { ScaleAxis } from '../models/pane'\nimport type Quote from '../models/quote'\n\nexport const drawInVisibleArea = ({\n quote,\n scale,\n fxOverride,\n fromIndexOffset = 0,\n toIndexOffset = 0,\n leftOffset,\n drawBarCallback,\n width,\n}: {\n quote: Quote\n scale: { x: ScaleAxis }\n fromIndexOffset?: number\n toIndexOffset?: number\n fxOverride?: (index: number) => number\n leftOffset: number\n width: number\n drawBarCallback: (i: number, x: number) => void\n}) => {\n const fx = fxOverride ?? ((index: number) => scale.x(quote.barIndex[index]))\n // We want to render one bar before first visible bar to fix disconnected lines on charts with missing data\n const firstBarToRender = Math.max(0, getFirstBarToRenderIndex({ quote, scale, leftOffset }) - 1, fromIndexOffset - 1)\n\n let lastBarToRender = -1\n for (let i = firstBarToRender; i < quote.close.length + toIndexOffset; i++) {\n const x = fx(i)\n if (x + leftOffset > width) {\n lastBarToRender = i\n break\n }\n drawBarCallback(i, x)\n }\n\n if (lastBarToRender > -1) {\n const x = fx(lastBarToRender)\n drawBarCallback(lastBarToRender, x)\n }\n}\n\nexport const getFirstBarToRenderIndex = ({\n leftOffset,\n quote,\n scale,\n}: {\n quote: Quote\n scale: { x: ScaleAxis }\n leftOffset: number\n}) => {\n const barIndex = Math.ceil(scale.x.invert(-leftOffset))\n return quote.barToDataIndex[Math.max(barIndex, 0)]\n}\n\nexport const getLastBarToRenderIndex = ({\n leftOffset,\n quote,\n scale,\n chartWidth,\n}: {\n quote: Quote\n scale: { x: ScaleAxis }\n leftOffset: number\n chartWidth: number\n}) => {\n const { barToDataIndex } = quote\n const barIndex = Math.ceil(scale.x.invert(-leftOffset + chartWidth))\n return barToDataIndex[Math.max(barIndex, 0)] ?? barToDataIndex[barToDataIndex.length - 1]\n}\n","import queryString from 'query-string'\n\nimport { ObjectHash } from '../../types/shared'\n\nexport type FetchFunc = (input: Request | string, init?: ObjectHash) => Promise\n\ninterface FetchApiProps {\n location: string\n queryParameters?: ObjectHash\n method?: string\n body?: ObjectHash | string\n contentType?: string\n abortController?: null | AbortController\n throwOnStatusCodes?: number[]\n throwOnPredicate?: (response: Response) => boolean\n fetchFunc?: FetchFunc\n keepalive?: boolean\n}\n\nexport const getFormDataFromObject = (object: ObjectHash) =>\n Object.keys(object).reduce((formData, key) => {\n formData.append(key, object[key])\n return formData\n }, new FormData())\n\n// Keep in sync with ContentType in https://github.com/finvizhq/Finviz-Website/blob/master/Website/js/main/services/api.ts\n// START\nexport enum ContentType {\n ApplicationJson = 'application/json',\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\n FormUrlEncoded = 'application/x-www-form-urlencoded',\n Html = 'text/html; charset=utf-8',\n}\n\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\n switch (contentType) {\n case ContentType.ApplicationJson:\n case ContentType.ApplicationJsonUTF:\n case ContentType.FormUrlEncoded:\n return JSON.parse(response)\n default:\n return response\n }\n}\n// END\n\nconst fetchApi = async ({\n location,\n queryParameters,\n method,\n body,\n contentType,\n abortController,\n throwOnStatusCodes,\n throwOnPredicate,\n fetchFunc = fetch,\n keepalive = false,\n}: FetchApiProps) => {\n const url = `${location}${queryParameters ? `?${queryString.stringify(queryParameters)}` : ''}`\n const parameters = {\n method: method || 'GET',\n credentials: 'include',\n headers: contentType && {\n 'Content-Type': contentType,\n },\n signal: abortController?.signal,\n body: body,\n keepalive,\n }\n try {\n const response = await fetchFunc(url, parameters)\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\n const responseData = parseResponseForContentType(await response.text(), responseContentType)\n if (throwOnStatusCodes?.includes(response.status) || throwOnPredicate?.(response)) {\n const StatusCodeError = getStatusCodeError(response.status)\n throw new StatusCodeError(`${url} returned ${response.status}`, responseData as T, response.status)\n }\n return responseData as T\n } catch (err) {\n throw err\n }\n}\n\nfunction getStatusCodeError(statusCode: number): typeof GenericStatusCodeError {\n switch (statusCode) {\n case 403:\n return ForbiddenError\n case 404:\n return NotFoundError\n case 500:\n return InternalServerError\n default:\n return GenericStatusCodeError\n }\n}\n\nexport class GenericStatusCodeError extends Error {\n response: ObjectHash | string\n statusCode: number\n\n constructor(message: string, response: ObjectHash | string, statusCode: number) {\n super(message)\n this.response = response\n this.statusCode = statusCode\n }\n}\nexport class ForbiddenError extends GenericStatusCodeError {}\nexport class NotFoundError extends GenericStatusCodeError {}\nexport class InternalServerError extends GenericStatusCodeError {}\n\nexport default fetchApi\n","import React from 'react'\n\nexport function useForceUpdate() {\n const [forceUpdateKey, increment] = React.useState(0)\n const forceUpdate = React.useCallback(() => {\n increment((prev) => prev + 1)\n }, [])\n return { forceUpdate, forceUpdateKey }\n}\n","import { EmptyObject, ObjectHash } from '../../types/shared'\n\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\n const precision = Math.pow(10, numOfDecimalPlaces)\n return String(Math.round(number * precision) / precision)\n}\n\nexport function getIsSSr() {\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\n}\n\nexport function isValidHexColor(color: string) {\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\n return !!color && regex.test(color)\n}\n\nexport function getParsedIntegersFromPeriodString(periodString: string) {\n const periodParts = periodString.split(',')\n return periodParts.map((part) => Number.parseInt(part, 10))\n}\n\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\n console.error(exception)\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\n import('@sentry/node').then((client) => {\n client.captureException(exception, captureContext)\n })\n } else {\n window.Sentry.captureException(exception, captureContext)\n }\n}\n\nexport function isPositiveFloat(value: string | number) {\n const parsedNumber = Number.parseFloat(`${value}`)\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\n}\n\nexport function isPositiveInteger(value: string | number) {\n const string = `${value}`\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\n}\n\nexport function isInRange({\n value,\n min = Number.MIN_SAFE_INTEGER,\n max = Number.MAX_SAFE_INTEGER,\n}: {\n value: string | number\n min?: number\n max?: number\n}) {\n const parsedNumber = Number.parseFloat(`${value}`)\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\n}\n\nexport function tryJsonParse(json: string | null = '') {\n try {\n return JSON.parse(json ?? '') as Result\n } catch {\n return null\n }\n}\n\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\n return Math.min(Math.max(value, min), max)\n}\n\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\n // as cy.get('.target').trigger('mousedown', { button: 0 })\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\n return (e as unknown as MouseEvent).button === 0\n } else {\n return true\n }\n}\n\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\nexport function getJSONReplacerFunc() {\n const visited = new WeakSet()\n return (key: string, value: any) => {\n if (typeof value === 'object' && value !== null) {\n if (visited.has(value)) {\n return\n }\n visited.add(value)\n }\n return value\n }\n}\n\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\n date.toLocaleDateString('en-US', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n ...options,\n })\n\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\nexport function randomUUID() {\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\n const c = Number(substring)\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\n })\n}\n\nexport function getUuid() {\n return window.crypto?.randomUUID?.() ?? randomUUID()\n}\n","export type HLC = {\n ts: number\n count: number\n uuid: string\n}\n\nexport const serializeHlc = ({ ts, count, uuid }: HLC) =>\n ts.toString().padStart(15, '0') + ':' + count.toString(36).padStart(5, '0') + ':' + uuid\n\nexport const parseHlc = (serialized: string) => {\n const [ts, count, uuid] = serialized.split(':')\n return {\n ts: Number.parseInt(ts),\n count: Number.parseInt(count, 36),\n uuid,\n }\n}\n\nexport const initHlc = (uuid: string, now: number): HLC => ({\n ts: now,\n count: 0,\n uuid,\n})\n\nexport const compareHlc = (one: HLC, two: HLC) => {\n if (one.ts === two.ts) {\n if (one.count === two.count) {\n if (one.uuid === two.uuid) {\n return 0\n }\n return one.uuid < two.uuid ? -1 : 1\n }\n return one.count - two.count\n }\n return one.ts - two.ts\n}\n\nexport const incrementHlc = (local: HLC, now: number): HLC => {\n if (now > local.ts) {\n return { ts: now, count: 0, uuid: local.uuid }\n }\n\n return { ...local, count: local.count + 1 }\n}\n\nexport const receiveHlc = (local: HLC, remote: HLC): HLC => {\n if (compareHlc(local, remote) >= 0) {\n return local\n }\n return { ...local, ts: remote.ts, count: remote.count }\n}\n","import { ObjectHash } from '../../types/shared'\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const decodeQueryString = = ObjectHash>(...args): T =>\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.FLibs.decodeQueryString(...args)\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const encodeQueryString = (...args) => window.FLibs.encodeQueryString(...args)\n","// Copy if this file is in Website repo in Website/js/main/hooks/ folder\nimport * as React from 'react'\n\nexport function useIsMounted() {\n const isMountedRef = React.useRef(false)\n const getIsMounted = React.useCallback(() => isMountedRef.current, [])\n\n React.useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n return getIsMounted\n}\n","import { CanvasRenderingContext2D as NodeCanvasRenderingContext2D } from 'skia-canvas'\n\nimport {\n CanvasElementType,\n ChartEditorEnum,\n ChartElementType,\n ChartEventType,\n IndicatorType,\n LayoutType,\n OverlayType,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n TextAlign,\n TextBaseline,\n} from '../app/constants/common'\nimport ChartModel from '../app/models/chart'\nimport ChartLayout from '../app/models/chart_layout'\nimport { IChartThemeColors } from '../app/models/constants'\n\ninterface ISentry {\n captureException: (exception: any, captureContext?: { extra: ObjectHash }) => any\n captureMessage: (message: string, captureContext?: { extra: ObjectHash }) => any\n}\n\ndeclare global {\n interface Window {\n Sentry: ISentry\n FinvizSettings: ObjectHash\n FinvizChartsSettings: ObjectHash\n globalChartConfig: ObjectHash\n isRenderInProgress: boolean | number\n FinvizQuoteTypeCurrent: string\n handleScriptNotLoaded: () => void\n renderScriptNotLoaded: () => void\n }\n\n interface Document {\n fullscreenElement: any\n mozFullScreenElement: any\n webkitFullscreenElement: any\n msFullscreenElement: any\n webkitExitFullscreen: any\n mozExitFullScreen: any\n msExitFullscreen: any\n }\n\n interface HTMLElement {\n webkitRequestFullScreen: any\n mozRequestFullScreen: any\n msRequestFullscreen: any\n }\n\n interface Navigator {\n msMaxTouchPoints: any\n }\n\n interface Array {\n last(): T | undefined\n }\n\n interface String {\n padLeft(paddingValue: string): string\n startsWith(str: string): boolean\n }\n\n type CanvasCache = Partial>\n\n interface CanvasRenderingContext2D {\n _cache: CanvasCache\n // We need to omit `canvas` because it is read only\n set>(\n key: Key,\n value: CanvasRenderingContext2D[Key]\n ): void\n }\n\n interface HTMLCanvasElement {\n _cache: CanvasCache\n }\n\n interface ImageBitmapRenderingContext {\n _cache: CanvasCache\n }\n\n type RenderingContext2DType = CanvasRenderingContext2D | NodeCanvasRenderingContext2D\n}\n\ndeclare module 'skia-canvas' {\n interface CanvasRenderingContext2D {\n _cache: CanvasCache\n\n set>(\n key: Key,\n value: CanvasRenderingContext2D[Key]\n ): void\n }\n}\n\nexport type TodoObjectHashAnyType = Record\nexport type TodoAreaObject = Record\nexport type ObjectHash = Record\nexport type EmptyObject = Record\n\nexport type TodoAnyType = any\n\nexport type ThumbType = string\n\nexport type PaneArea = {\n mouseDown?: boolean\n x: number\n y: number\n scaled: {\n x: number\n y: number\n }\n width: number\n height: number\n cursorX: number\n cursorY: number\n isCursorInChartWidthBoundaries: boolean\n} & T\n\nexport type Maybe = T | null | undefined\n\nexport interface DrawingBorder {\n color: string\n width: number\n}\n\nexport interface TextAttrs {\n text?: string\n background: string\n border?: { width: number; color: string }\n lineWidth?: number\n font: {\n size: number\n family?: string\n style?: string\n weight?: string\n }\n fillStyle?: string\n strokeStyle?: string\n angle?: number\n lineHeight: number\n textAlign?: TextAlign\n textBaseline: TextBaseline\n padding: {\n top: number\n right: number\n bottom: number\n left: number\n }\n}\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport type RequireByKey = Omit & Required>\n\nexport interface ResizeByThumbFuncProps {\n type: ThumbType\n difX: number\n difY: number\n area: PaneArea\n}\n\nexport type ResizeByThumbWithTypeAndDifs = RequireByKey\n\nexport interface ChartConfigChartPaneElement {\n type: ChartElementType | CanvasElementType | IndicatorType | OverlayType | ChartEventType\n overlays?: OverlayConfigObject[]\n period?: string\n code?: string\n elementId?: string | null\n zIndex?: number\n}\n\nexport interface RendererChartBarProps {\n index: number\n chartSettingsColors: IChartThemeColors\n hasFillAndBorder?: boolean\n}\n\nexport interface ChartConfigChartPane {\n elements: ChartConfigChartPaneElement[]\n height: number\n chart?: ChartConfigObject | ChartModel\n}\n\nexport interface IIdea {\n id?: number\n date?: string\n note: string\n}\n\nexport interface ChartConfigObjectExtended {\n editable: boolean\n canChangeTicker: boolean\n scrollable: boolean\n cross: boolean\n ideas: boolean\n editors: ChartEditorEnum[]\n specificChartFunctionality: SpecificChartFunctionality\n theme: Theme\n layout: LayoutType\n uuid?: string\n idea?: IIdea\n}\n\nexport interface ChartConfigObject {\n width: number\n height: number\n panes: ChartConfigChartPane[]\n premarket?: boolean\n dateRange: string | null\n aftermarket?: boolean\n hasChartEvents?: boolean\n stretch: boolean\n ticker: string\n instrument: Instrument\n timeframe: TIMEFRAME\n chart_layout: ChartLayout\n zoomFactor: number\n leftOffset: number | null\n refreshData: boolean | number\n isHideDrawingsActive: boolean\n isScrolled?: boolean\n scale: ScaleType\n}\n\nexport interface RootChartConfigObject extends Partial {\n charts: ChartConfigObject[]\n width: number\n height: number\n newCharts?: boolean\n useGrid?: boolean\n}\n\nexport interface TaConfigObject {\n indicators: IndicatorConfigObject[]\n overlays: OverlayDatabaseRecordObject[]\n height: number\n style: string\n scale: string\n}\n\nexport interface IndicatorConfigObject {\n name: string\n parameters: string\n position: Position\n}\n\nexport interface OverlayConfigObject {\n color: string\n period: string\n type: OverlayType\n}\n\nexport interface OverlayDatabaseRecordObject {\n name: string\n parameters: string | null\n color: string | null\n}\n\nexport enum Instrument {\n Stock = 'stock',\n Crypto = 'crypto',\n MarketSentiment = 'market_sentiment',\n Futures = 'futures',\n Forex = 'forex',\n Group = 'group',\n}\n\nexport enum Theme {\n light = 'light',\n dark = 'dark',\n}\n\nexport interface IModalConfig {\n title: string\n inputs: IModalConfigInput[]\n inputsErrorMessages: ObjectHash\n}\nexport interface IModalConfigInput {\n type: React.HTMLInputTypeAttribute\n label: string\n name: string\n value: number | string\n required?: boolean\n min?: number\n color?: string\n step?: number\n}\n\nexport enum Position {\n Above = 'above',\n Below = 'below',\n}\n\nexport enum DefaultSpineEvents {\n Change = 'change',\n Destroy = 'destroy',\n Refresh = 'refresh',\n Update = 'update',\n}\n\nexport enum CustomSpineEvents {\n IndicatorsChange = 'indicatorsChange',\n ManualChange = 'manualChange',\n}\n\nexport enum DrawingSpineOptionsEvent {\n Remove = 'remove',\n}\n\nexport interface DrawingSpineOptions {\n eventType: DrawingSpineOptionsEvent\n}\n\nexport type TodoButtonProps = ObjectHash\nexport type TodoButtonTheme = string\n","module.exports = FLibs.DateFns;","module.exports = FLibs.React;","module.exports = FLibs.ReactDOM;","module.exports = FLibs.ReactRouterDOM;","module.exports = FLibs.classnames;","module.exports = FLibs.d3;"],"names":["BackgroundInput","_ref","label","value","onChange","React","InputColorPicker","inputDataTestId","concat","toLocaleLowerCase","color","convertColorToHEX","ColorRangeRowInput","colorValue","colorTestId","rangeValue","rangeTestId","rangeLabel","rangeProps","handleRangeChange","useCallback","ev","currentTarget","handleColorChange","className","RangeSlider","_extends","rightContent","Paragraph","as","size","BorderInput","min","max","width","step","CheckBox","Checkbox","checked","FONT_VALUES","FontInput","_FONT_VALUES$find","family","setFamily","useState","setSize","style","setStyle","weight","setWeight","setValue","key","valueSetter","Select","items","find","option","selected","map","SelectOption","Input","type","LineInput","MultilineStringInput","required","Textarea","placeholder","e","target","autoFocus","NumberInput","props","name","allowDecimal","pattern","parseFloat","parseInt","StringInput","Trend","active","trend","valueAsNumber","VisibilityInput","isCheckboxOnly","isOff","setIsOff","from","setFrom","to","setTo","macroKey","macroLabel","charAt","toUpperCase","slice","disabled","DEFAULTS","Math","Number","MacroTimeframe","INPUTS_AVAILABLE","getInitialState","visibilities","merge","visibility","macroTimeframe","valueMacroTimeframe","Object","keys","length","getIsVisibilityOutsideAvailableTimeframes","every","macrotimeframe","macroRange","MicroTimeframeRange","some","item","_macroRange$from","_macroRange$to","isInRange","Visibility","initialVisibilityRef","handleChange","result","handleDisableSubmit","current","includes","TAB_BUTTON_COMMON_PROPS","contentClass","getValuesFromFormState","formState","reduce","acc","cur","DialogTabs","ElementStyleDialog","_config$title","config","element","getModalConfig","initialFormStateRef","JSON","parse","stringify","inputs","setFormState","finalFocusRef","_document$querySelect","document","querySelector","body","selectedTab","setSelectedTab","Style","isSubmitDisabled","setIsSubmitDisabled","isDrawingElement","getIsDrawing","isEditInProgress","trigger","handleValuesChange","values","shouldSubmit","shouldDismiss","hasOnSubmit","onSubmit","hasOnDismiss","onDismiss","set","state","hide","handleValuesChangeDebounceRef","debounce","newFormState","maxWait","cancel","preventDefault","checkValidity","handleCloseDialog","Dialog","isDraggable","title","onOverlayClick","onHide","DialogHeader","onCloseClick","DialogBody","ButtonGroup","hasDivider","Button","onClick","input","InputComponent","getInputForType","inputType","prevState","stateInput","DialogFooter","animating","theme","ElementStyleDialogContext","ElementStyleDialogWrapper","setElement","setOnSubmit","setOnDismiss","dialog","useDialogState","modal","Provider","openDialog","show","children","getContainerType","model","_mainElement$instance","_mainElement$instance2","mainElement","indicatorType","instance","isIndicator","IndicatorType","isChart","getTickersAndContainerTypesInLayoutModel","chartLayout","tickers","containerTypes","getAllPanes","forEach","paneModel","ticker","getQuoteRawTicker","containerType","push","getInitialStoreDrawings","_ref4","_window$FinvizSetting","_window$FinvizSetting2","_window$FinvizChartsS","_initialDrawings$map","initialDrawings","window","FinvizSettings","initialDrawingsStore","FinvizChartsSettings","drawings","getAutosaveElementFromDBRecord","handleCallMethodOnAllDrawings","_ref5","chartLayoutModel","elementMethod","getAllElements","isDrawing","getNoteElementId","getElementNoteText","noteElement","_ref6","_JSON$parse","elementAttrs","text","getTickerNoteText","_ref7","elements","_ref8","elementId","zIndex","changeType","lastChange","ts","lastChangeTimestamp","count","lastChangeCounter","uuid","lastChangeNodeUUID","DRAWINGS_SAVE_INTERVAL_MS","RETRY_LIMIT","useDrawingAutoSaveApi","postRetryCountRef","deleteRetryCountRef","fetchDrawings","async","fetchApi","location","queryParameters","join","undefined","throwOnStatusCodes","drawing","saveDrawings","bodyJsonString","getDBRecordFromAutosaveElement","keepalive","s","n","i","l","hi","charCodeAt","lo","Error","getByteLengthOfString","error","_window$Sentry","Sentry","captureException","method","contentType","ContentType","latestChangeHlc","sort","a","b","compareHlc","_window$Sentry2","InternalServerError","Promise","r","setTimeout","ForbiddenError","extra","GenericStatusCodeError","response","invalidItems","index","deleteAllDrawings","lastLocalChange","_ref2","newHlc","incrementHlc","Date","now","getUuid","_window$Sentry3","useDrawingAutoSaveControls","isAutoSaveActive","useModelState","watchProperties","idea","isInit","isPreserveDrawingsActive","getIsPreserveDrawingsAndAutosaveAvailable","id","useIsAutoSaveActive","drawingsInternalStore","saveTimeoutRef","clearTimeout","saveLatestChanges","withDelayInMs","arguments","saveQueueExtraFilterCallback","saveQueue","filter","latestLocalUpdateTimestamp","instanceUUID","setAutoSaveState","AutoSaveState","save","updateAttributes","receiveHlc","syncChartLayoutDrawings","isRemove","paneContainerType","paneInternalStoreElements","autoSaveElement","paneElement","isCreator","paneDrawing","destroyCascade","parsedElementAttrs","toAutosaveConfig","pane","selection","hasOngoingInteraction","updateScales","getCanvasElementByType","fromObject","create","handleAutoSaveNoteChange","note","newNoteElement","handleIdeaNoteChange","_chartLayout$idea","_chartLayout$activeCh","_chartLayout$activeCh2","updateAttribute","activeChart","checkDrawingUpdate","isRefetchAll","latestRemoteUpdateTimestamp","initHlc","updatedDrawings","newLastUpdateTimestamp","updatedElementIds","newInternalStore","currentInternalStore","lastUpdateTimestamp","drawingIndex","findIndex","_ref3","currentDrawing","currentNote","autoSavedNote","mergeUpdatedDrawingsToInternalStore","allElements","normalizeZIndexes","specificChartFunctionality","SpecificChartFunctionality","_chartLayout$activeCh3","_chartLayout$activeCh4","activeTicker","updateInternalStoreWithElement","updateResult","destroyed","instanceJson","newDrawing","updateDrawingIndex","drawingElement","shouldSyncAndSave","updatedRecord","hasChangedZIndex","hasChangedType","hasChangedAttrs","hasChange","updateInternalStoreWithChangedElement","deleteAllAutoSavedElements","onElementChange","_","options","elementPane","elementContainerType","elementPaneTicker","eventType","DrawingSpineOptionsEvent","useDrawingAutoSave","drawingsInternalStoreUnwatched","prevIsAutoSaveActive","ref","usePrevious","runInitialSaveAndRefetchUpdate","onChartOrIndicatorChange","newTickers","newContainerTypes","ChartModel","CustomSpineEvents","Element","checkDrawingUpdateInterval","setInterval","clearInterval","getIdeaUrl","instrument","period","searchObject","t","p","isStock","Instrument","isQuotePage","test","pathname","isStockOnQute","path","queryString","ta","IdeasList","hasError","setHasError","hasFetched","setHasFetched","isDeleting","setIsDeleting","ideas","setIdeas","currentIdea","decodeQueryString","useEffect","_window$gtag","_window","gtag","call","event_category","getInstrument","fetchIdeas","onDeleteIdeaClick","useRef","_window$FinvizChartsS2","_window$globalChartCo","confirm","search","row","fetch","headers","String","href","url","ideaChart","globalChartConfig","stateIdea","reload","company","date","stopPropagation","IdeasDialog","IdeasDropdown","rounding","dropdownButtonClassName","tooltipState","useTooltipState","placement","isAnyQuoteLoading","setIsAnyQuoteLoading","dropdown","useDropdownState","hideTooltip","checkIfAnyQuoteIsLoading","fetchingQuotes","Quote","quote","isFetching","fetchedAt","visible","hasUserPremium","Dropdown","leftContent","appearance","DropdownItem","TooltipTrigger","closeOnClick","layoutModel","_layoutModel$idea","_window$gtag2","_window2","activeChartQuote","toJSON","cid","timeframe","ChartSettings","settings","layout","toObject","LayoutType","barWidth","center","barMargin","charts","c","chartId","dateRange","refreshData","layoutModelObjectPanes","tickersString","split","replace","getChartTickers","panes","quotes","isIdeaId","ideaID","array","quotesJsonString","q","omit","chart","quoteTickersTimeframes","toConfig","data","getFormDataFromObject","ideaUrl","open","saveIdea","DialogTrigger","Tooltip","Spinner","classnames","getIsMobileScreenSize","encodeQueryString","utm_source","utm_medium","utm_campaign","publishModalAsyncModule","importFn","cacheKey","Publish","publishModalModule","isLoading","useAsyncModule","shouldLoadModule","errorSeverity","onError","PublishDialog","default","buttonProps","Delayed","delayComponent","Icon","isPremium","TourButton","page","tour","useTour","pageTours","steps","getRequestFullscreen","documentElement","overlayPadding","isRedesignEnabled","Boolean","getTour","userTour","setCurrentTour","getStepsForUser","buttonTheme","hasNewTours","activeTour","startTour","once","isNativeMobileSelect","ChartTypesSelect","_chartTypes$find","_chartTypes$find2","chartTypes","getCurrentType","useLocation","ty","taInt","defaultType","QuoteShortToLongType","FinvizQuoteTypeCurrent","QuoteNodeChartTypes","generateRouterPath","FREE_TYPES_QUOTE_VALUES","QuoteLongToShortType","DEFAULT_TYPES","FREE_TYPES_QUOTE","reloadDocument","useChartTypes","currentType","selectedType","setSelectedType","icon","iconName","listProps","hasPopoverButtonWidthLimit","Link","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","QuoteFetchType","ChangeLabel","changePoints","isTiny","DailyChangeDisplay","withSuspense","_chartLayoutModel$get","_chartModel$quote","chartIndex","chartsModule","chartSettingsAsyncModule","isSuspenseMode","useChartLayoutGlobalModel","chartModel","getAllCharts","listenOnEvents","quoteModel","tickerChange","getTickerChange","math","lastClose","tickerAfterChange","points","string","prevProps","nextProps","utmCampaign","testId","DrawButton","newValue","getIsDrawingEnabled","DRAWING_COOKIE_NAME","catch","then","res","ok","expires","setMonth","getMonth","utils","rest","getLayoutType","tickersCount","FullscreenButton","urlTickers","all","getRawTicker","Array","_tickers$index","Search","onTickerSelected","dropdownState","detailLink","formattedTicker","WebsiteSearchComponent","inputClass","isSearchIcon","isSearchItemLink","isShowAllVisible","SaveToPortfolio","onClose","SETTINGS_WIDTH","BUTTON_POPOVER_GUTTER","SETTINGS_POPOVER_ID","ScrollableChartSettingsPopover","elementWidth","bodyWidth","useElementMeasure","PreventClosingUnsavedChanges","isFullyClosed","getExtendedDialogState","chartElement","getElementById","popoverContentElement","settingsButton","unstable_referenceRef","popoverStyles","newPopoverStyles","buttonRect","getBoundingClientRect","topOffset","top","height","maxHeight","innerHeight","position","scrollY","chartHeight","clientHeight","popoverContentHeight","offsetHeight","emptySpaceDiff","maxOffset","rightOffset","wrapper","marginRight","checkForUnsavedChangesAndClose","Popover","popoverWrapperStyle","focusOnHide","hideOnClickOutside","ChartSettingsButton","settingsPopoverState","usePopoverState","PopoverTrigger","focusRing","getQuoteRequestKey","useChartControls","_chartModel$chart_lay","_chartLayoutModel$ide","unwatchedChartModel","isInteractive","navigate","useNavigate","chart_layout","chartModelRef","modelRef","useModelRef","setIsLoading","abortControllerKeyRef","isIdeaChart","updateChartModelWithNewQuote","_chartLayoutModel$act","_chartPane$getAllChar","isSameTicker","getChartOrIndicatorElement","leftOffset","getLeftOffset","isScrolled","getAllQuotes","chartQuote","eql","fetchData","fetchType","chartPane","getChartPane","activeChartEvent","toggleIsOpen","getAllChartEvents","isChartEvent","setChartEvents","chartEvents","updateChartEventsZIndexes","fetchQuote","hasChartEvents","premarket","aftermarket","patterns","getHasPatterns","currentQuote","abortController","createRequestAbortController","shouldAbortRunningRequest","events","cachePredicate","fetchNewDataOnCachedQuote","wasFetchAborted","isQuoteUsedInOtherCharts","destroy","removeFromAbortCache","decodedQueryString","rangesArray","ranges","shouldRecalculateOnCharts","hasSameBarWidth","IndicatorSettings","hasSameBarMargin","hasRedesignEnabled","ChartControls","_chartModel$quote$nam","favoriteTimeframes","toggleFavoriteTimeframe","useFavoriteTimeframes","anchorDate","generateChartLayoutRouterPath","timeframeGroupsWithHref","dateRangeGroupsWithHref","handleCustomDateRangeValidation","useChartModelCustomDateRangeValues","onDialogSubmit","customDateRangeDialogState","handleDateRangeSelect","getDateRangeTimeframe","useCustomDateRangeDialog","pathGenerator","handleTickerSelect","upperCaseTicker","handleCustomRangeSubmit","dateRangeTimeframe","timeframeBarProps","timeFrameGroups","dateRangeGroups","customRange","selectedTimeframe","onTimeframeSelect","selectedDateRange","loadingTimeframe","onDateRangeSelect","isFavoritesEnabled","onFavoriteTimeframeToggle","canChangeTicker","TimeframeBar","CustomDateRange","dialogState","hasTimeframe","editors","ChartEditorEnum","Heading","level","editable","compactViewMaxBreakpointPx","grow","FLibs","Hammerjs","getChartEventBadgeElement","svgHtmlString","chartBadgeSvgByType","badgeType","dangerouslySetInnerHTML","__html","ChartEventPopoverTableRow","colSpan","ChartEventDividendsPopoverContent","rawData","dataArray","getFormattedEventDate","dateTimestamp","ordinary","getFormattedValue","special","ChartEventBadgeState","CHART_EVENT_BADGE_SIZE","ChartEventLabels","SURPRISE_POSITIVE_COLOR","SURPRISE_NEGATIVE_COLOR","getFormattedFiscalPeriod","fiscalPeriodRaw","fiscalPeriod","toLowerCase","year","quarter","semester","getPercentValueString","totalValue","percent","percentValue","isNaN","abs","maxDecimalPlaces","ChartEventEarningsPopoverContent","fiscalEndDate","month","day","epsActual","epsEstimate","epsSurprise","epsSurpriseColor","percentageValue","epsReportedActual","epsReportedEstimate","epsReportedSurprise","epsReportedSurpriseColor","salesActual","salesEstimate","bigNumberUnit","BigNumber","revenueSurprise","revenueSurpriseColor","ChartEventSplitPopoverContent","factorFrom","factorTo","ChartEventPopover","popoverState","ZIndexContext","tabIndex","hasBackdrop","classNames","ChartEventBadgeType","focusOnShow","hasViewportHeightLimit","getChartEventContentComponent","ChartEventPopoverWithState","unwatchedChartLayout","left","isChartEventOfThisChart","setData","clickAwayRef","callback","isListening","refCallback","isMobile","Utils","handler","contains","addEventListener","removeEventListener","useClickAway","_chartModel$getChartP","chartEvent","isHovered","unstable_popoverRef","popoverShow","popoverHide","isOpen","newData","getChartEventData","getChartEvenBadgeType","CHART_LAYOUT_CHILD_CHANGE_EVENT","ContextMenu","Spine","static","this","configure","initClass","contextMenu","selector","constructor","_defineProperty","forceUpdate","componentDidMount","update","componentWillUnmount","render","_document$querySelect2","classList","remove","onContextMenu","ContextMenuComponent","add","ready","el","ReactDOM","event","shown","clientY","pageYOffset","clientX","LoadLatestDataButton","chartModelUnwatched","getIsMounted","useIsMounted","hasNewDataAvailable","setHasNewDataAvailable","getRefreshInterval","isPossibleToFetchSequentialData","hasNewData","promises","ZOOM_CONTROLS_ACTIVE_CLASS","ZOOM_CONTROLS_IS_IN_AREA_CLASS","buttonCommonProps","getDefaultLeftOffset","ZoomControls","zoomControlsRef","isVisible","onZoomIn","onZoomOut","onZoomReset","isGoToRecentVisible","setIsGoToRecentVisible","defaultZoomFactor","isZoomResetVisible","setIsZoomResetVisible","zoomFactor","handleGoToMostRecent","handleChartModelChangeDebounced","bind","unbind","hidden","Pane","_this","super","hasSeenCrossNotification","localStorage","getItem","isTouchCrossActive","scrollable","renderAll","oldElementInstance","isDrawingModeContinuousActive","setSelection","startsWith","onPaneDestroy","setSelectedElement","clonedElementInstance","setCanvasSize","recountScale","area","getArea","MouseModel","x","y","_event$targetTouches","activeChartInteraction","TouchEvent","targetTouches","lastClientX","dif","addToLeftOffset","scaleRange","lastClientY","_this$props$model$get","_this$props$model$get2","_this$props$model$get3","difY","scale","ScaleType","invert","currentViewRange","getMinMax","touchEventsDisabled","onScalerMouseDown","onScalerMouseMove","onScalerMouseUp","setActiveChartInteraction","MouseEvent","button","scalerLastY","currentDomainMax","currentDomainMin","domain","onScalerTouchMove","onScalerTouchEnd","_model$getChartOrIndi","_model$getChartOrIndi2","originalMinMax","currentDiff","originalDiff","getBarWidthWithMargin","getMinMaxLeftOffset","newLeftOffset","barIndex","fetchOlderData","getElement","openElementStyleDialog","pointerType","onCanvasPress","elementInArea","thumbsAreInArea","elementModel","ElementModel","hasProperties","isElementDrawing","makeClone","setVisibilityTo","SetVisibilityTo","bringToFront","sendToBack","bringForward","sendBackward","handleRemoveIndicatorPane","paneIndex","element_type","updateType","canvasCtx","_this$props$model$sel","_this$props$model$sel2","getIsCreator","hoveredElement","setIsHovered","_element$instance$get","_element$instance","_element$instance$get2","_element$instance2","getIsCreatorDialogOpen","cross","crossRafId","requestAnimationFrame","renderCross","rafId","_renderAll","canvasRef","getIsUpdatedDesign","renderPane","isMouseInPane","crossCanvasCtx","clearRect","isCrossDisabled","PaneModel","getIsDisabled","elementInstance","renderCrossText","NaN","restore","additionalData","Settings","getSettings","areaRectangle","canvas","areaRectangleCursorX","areaRectangleCursorY","chartLeftX","chartRightX","right","scaled","cursorX","cursorY","isCursorInChartWidthBoundaries","ratio","canvasElement","crossCanvasRef","isDisableTouchCrossAvailable","initialScrollable","lastActiveTool","DrawingTool","isChartsPage","setState","notificationContext","Notification","actions","setItem","inline","activeTool","_this$zoomControlsRef","isMouseDownIgnored","zoomControls","paneHeight","mouseDown","isInArea","touchEvent","onCanvasInteractionStart","_MouseModel$pane","setMousePosition","getMousePositionInBoundaries","_element$getIsChartEv","isTouch","getIsChartEvent","onPaneMouseMove","getIsHammerAllowScrollActive","onCanvasInteractionMove","onCanvasInteractionEnd","onMouseMoveOnScrolling","Touch","isPrimaryClick","_element$getIsChartEv2","_model$getChartOrIndi3","_model$getChartOrIndi4","_model$getChartOrIndi5","setElementCursor","getHTMLElementId","cursor","lastX","lastY","_model$selection$getI","_model$selection","CanvasElement","activeThumb","moveBy","isElementHovered","isSelected","crossCanvas","canvasAreaRectangle","chartLeft","chartRight","chartTop","chartBottom","bottom","getValueInRange","_MouseModel$pane2","isSameMouseModel","setIsSelected","isSelectionCanvas","onModelUpdate","onElementCreate","onElementDestroy","onElementReplace","onElementSelect","onElementClone","immediateRecountScaleOnChartIndicatorChange","onChartUpdate","isIndicatorPane","getIsIndicatorPane","_getInitialStoreDrawi","_this$canvasWrapperRe","initialStoreDrawings","_element$instance3","cachePointPositionTimestamp","_element$instance4","getContextWithCache","paneHammer","Hammer","paneRef","touchAction","threshold","time","on","onPress","canvasWrapperHammer","canvasWrapperRef","onTouchMove","passive","scalerRef","scalerHammer","onScalerReset","zoomerRef","zoomerHammer","onZoomerReset","onDoubleClick","_this$canvasWrapperRe2","unmountCanvas","onPaneClick","_this$paneHammer","_this$scalerHammer","_this$zoomerHammer","_this$canvasWrapperHa","_this$scalerHammer2","_this$zoomerHammer2","_this$paneHammer2","_this$canvasWrapperHa2","isChartPane","getIsChartPane","onMouseMove","onMouseLeave","onPaneMouseLeave","onTouchStart","onMouseDown","onResizerMouseDown","onMouseEnter","onScalerMouseEnter","onScalerTouchStart","onZoomerMouseDown","onZoomerMouseMove","onZoomerTouchStart","onAddToZoomFactor","diff","shouldCalculateRightAlign","onTouchEnd","onBlur","getChartAlt","isCharts","isRedesignedFuturesForexCrypto","isRedesignedPage","withNotificationContext","Component","context","withElementStyleDialogState","ChartSpinnerOverlay","shouldDisplay","setIsVisible","timeout","DEFAULT_WRAPPER_COMPONENT","preventDefaultFunc","Chart","panesWrapperElement","isWheelZoomEnabled","zoomerRightAlign","calcZoomerRightAlign","mouseWheelTimeout","activePane","_this$props$layoutMod","onModelChange","calculateMinimalPaneHeight","paneId","chartModelParam","panesHeight","sum","_pane$height","newPaneHeight","round","newChartPaneHeight","newIsScrolled","lastWidth","lastHeight","handleQuoteChange","_pane$selection","resizerPaneIndex","onResizerMouseMove","onResizerMouseUp","resizePanesAccordingly","touches","onZoomerMouseUp","p1","p2","getRawDistance","onPinchMove","onPinchEnd","getChartLayoutSettings","fx","first","currentLeftOffset","isIntraday","getBarIndex","close","offsetDiff","shouldAlignDaysToLeftApplied","offsetBars","offset","_e$clientX","onZoomerTouchMove","onZoomerTouchEnd","deltaY","log","sign","isMouseWheel","difX","normalizeWheelDeltaY","addToZoomFactor","diffCoefficient","currentZoomFactor","minBarWidthInPx","maxBarWidthInPx","minZoomFactor","getZoomFactorForBarsToDisplay","chartVisibleWidth","numOfVisibleBars","maxZoomFactor","isNegativeDirection","newZoomFactor","newZoomFactorInRange","getZoomFactor","stretch","getIsSmallIndexChart","updateZoomAndLeftOffsetByDateRange","newQuote","shouldForceLeftOffsetUpdate","isMouseDown","onLayoutModelChange","onPaneCreate","onOlderDataLoaded","onDataLoaded","componentDidUpdate","_prevState$panesWrapp","_this$state$panesWrap","_this$state$panesWrap2","setStateWithPanesTimeout","renderChartToolbar","getAllValidPanes","showSettings","resetMouseModel","handleSetPanesWrapperRef","onPinchStart","onWheel","onMouseWheel","minHeight","total","optiMinHeight","floor","minimalPaneHeight","basePane","WrapperComp","gridArea","isModelDestroyedRef","initChartRef","panesConfig","_pane$elements","_element$overlays","overlays","overlay","panesWithPerfIndicator","allSettled","paneWithPerfIndicator","prefetchPerfIndicatorAllQuotes","paneProperties","createPaneCascade","shouldResize","chartsDimensions","getChartsDimensions","handleModelBeforeDestroy","isChartPage","isFuturesForexCryptoPage","isModelReady","loadingStyle","hasOutline","withWatchedPanesOnChartModel","portfolioWatchlistAsyncModule","ModuleLoadFailed","SidebarModule","sidebarModules","freeze","portfolio","description","content","asyncModule","withInitialLoading","isComponentReady","setIsComponentReady","sidebarModule","isError","withModuleAsyncLoad","mobile","SidebarContent","_width$min","_width$max","_width$default$mobile","_width$default","_width$default$deskto","_width$default2","direction","onResize","useSidebarContext","minWidth","DEFAULT_WIDTHS","maxWidth","defaultMobile","defaultDesktop","desktop","SidebarDirection","Resizable","enable","handleClasses","defaultSize","MOBILE_TOOLBAR_DIV_ID","SidebarTabs","activeModule","selectModule","unstable_timeout","entries","isActive","SIDEBAR_QUERY_PARAM","Sidebar","onShouldResize","tabsClassName","urlSearchParams","useSearchParams","sidebarModuleKey","get","setActiveModule","handleSelectModule","newUrlSearchParams","URLSearchParams","delete","toString","handleCloseSidebar","getIsMobilePortrait","contextValue","isCloseVisible","SidebarContext","drawingCreatorsAsyncModule","drawingActions","DrawingActions","getToolbarDrawingActions","isAddNoteAvailable","isIdea","defaultItem","isDisabled","disabledTooltip","drawingSettings","DrawingSetting","iconActive","titleActive","preserveDrawingsAutosaveOverride","iconAction","titleAction","getToolbarDrawingSettings","isPreserveDrawingsAndAutosaveAvailable","isAutoSaveInProgress","isInAction","drawingTools","toolbarDrawingTools","toolGroup","toolGroupTitle","DISABLED_ITEM_TOOLTIP_LABEL","Toolbar","_chartLayoutModel$ide2","isSidebar","isHorizontal","isMobileOverlay","onActiveToolChange","onDrawingActionClick","onDrawingSettingClick","onDrawingEnd","isAlternativeTheme","areToolsDisabled","drawingCreatorsModule","isDrawingCreatorsModuleLoading","autoSaveState","setIsDrawing","availableDrawingSettings","availableDrawingActions","isDrawingModeContinuous","hasData","hasHiddenDrawings","tool","drawingToolsTouchCreatorsByType","drawingToolsCreatorsByType","ToolClass","one","ToolbarComponent","_item$toolGroup","isToolLoading","ToolbarItem","groupItems","groupTitle","useNativeSelect","ToolbarDivider","ChartAutoSaveNote","onNoteChange","rows","ChartAutoSaveNotes","setTickers","unwatchedInternalStore","handleChartChange","tickerNoteMap","_tickerNoteMap$ticker","AutoSaveNotesDialog","isBackdropDisabled","ConfirmationDialog","onCancel","onAction","isAutosaveDialogContent","dialogContent","message","getDialogContent","ConfirmationDialogComponent","ToolButton","ToolbarMobile","isToolbarVisible","setIsToolbarVisible","setUrlSearchParams","toolbarMobileElement","setToolbarMobileElement","handleActiveToolChange","drawingTool","wrapperRef","handleClickOutside","_wrapperRef$current","openSelect","actionId","has","params","AutoSaveStateIndicator","setVisibilityTimeout","newIsVisible","checkIfNeededPreventLeaving","returnValue","hasRedesign","ChartLayoutAutoSaveNote","chartLayoutModelUnwatched","ideaNoteRef","getPublishChartHtmlElements","publishChartElements","getElementsByClassName","getChartImgUrl","_imgElement$src","imgElement","src","PublishOldButtonClickListener","dialogConfig","setDialogConfig","isCanvas","chartImgUrl","publishChartHtmlElements","clickHandler","dataset","indexInt","IdeaDrawingsConfirmationOptions","IdeaLeaveDialog","actionCallback","Cancel","Override","Merge","Nothing","getChartElementTypeFromQueryType","queryType","_getChartElementTypeF","QuotePageQueryChartTypes","ChartElementType","getChartElementTypeFromResponseType","TA","useChartRouteChange","useTrackPageView","trackInitial","dateFns","months","updateChartConfig","_ty","decodedSearch","urlType","handleTypeChange","_decodedSearch$t$spli","_decodedSearch$p$spli","_decodedSearch$p","_decodedSearch$r$spli","_decodedSearch$r","urlTicker","urlTimeframe","urlDateRange","newChartConfig","getRawTickerForInstrument","updateAttributesAndSync","_chartLayoutModel$ide3","_chartLayoutModel$ide4","exitIdea","_window$FinvizSetting3","defaultPeriod","TIMEFRAME","defaultDateRange","handleIdeaLeave","action","getDefaultZoomFactor","innerWidth","MOBILE_VIEW_BREAKPOINT_WIDTH","MOBILE_BARS_TO_VIEW","OnInitListener","onRegisterChartLayoutModel","parentElement","setIsInit","checkIfInitIsComplete","isReady","elementIndex","_config$charts$chartI","opacity","withCompleteLayoutModelInit","_props$config$editabl","_props$config$canChan","_props$config$scrolla","_props$config$cross","_props$config$editors","_props$config$ideas","_props$config$specifi","_getInitialStoreDrawi2","_newConfig$idea","newConfig","Theme","isQuotePageWithDrawingsOff","noteDrawing","ideaObject","indicatorElement","getContainerTypeFromPaneConfig","newElements","ChartLayoutModel","isHideDrawingsActive","toolsState","isLockDrawingsActive","DrawingsInternalStore","withQuotePolling","pollingIntervalToCharts","setPollingIntervalToCharts","checkForChartsWithPolling","newPollingIntervalToCharts","chartRefreshInterval","_newPollingIntervalTo","intervalIdsRef","checkForChartsWithPollingDebounced","chartsCheckerIntervalId","EXTRA_MARKET_BUFFER_MINUTES","timeoutDurations","allCharts","timeoutDurationsMin","duration","timeoutId","chartIds","flatMap","quotesToUpdate","quoteToUpdate","dispatchEvent","Event","QUOTE_FETCH_EVENT","ChartLayoutComponentBase","AbortController","preserveDrawings","handlePreserveDrawingsSettings","setPreserveDrawings","val","preserveDrawingAbortController","abort","tools_state","orientationChangeTimeout","setToolbarPosition","handleResize","throttledResize","modelAttrs","throttle","_this$state","_this$state2","getFullscreenStatus","getVisualViewportScale","visualViewport","noteDialogState","toggle","confirmationDialogState","handleConfirmationDialogCloseBtn","settingId","newObj","toggleHideDrawings","handleLockDrawings","event_label","_this$model$activeCha","updateLayout","last","chartConfig","modelProperties","isToolbarHorizontal","handleInitialPreserveDrawingsState","DELETE","getPaneWithSelection","keyCode","ThumbSettings","touchSize","onChartDestroy","onWindowResize","handleOrientationChange","checkTouchEventsDisabled","newIsToolbarHorizontal","renderToolbar","args","isOverlayToolbar","handleDrawingAction","handleDrawingsSetting","_this$props$idea2","newCharts","useGrid","publish","LAYOUTS","isMobilePortrait","_this$props$idea","isSidebarEnabled","getIsSidebarEnabled","handleConfirmationDialogDeleteBtn","ChartGrid","border","columns","_chartLayout$gridArea","ChartGridCell","gridAreas","hasChartTools","renderTools","ideaTitleContainer","ideaTitle","clear","removeCharts","addCharts","_layout$gridAreas","rowStart","columnStart","rowEnd","columnEnd","num","numOfRowsCovered","numOfColumnsCovered","percentageOfRowsCovered","percentageOfColumnsCovered","newWidth","newHeight","general","settingsHeight","wantedCount","pop","ChartLayoutComponent","flowRight","checkQuoteCacheDebounce","cleanupQuoteCache","allQuotes","allChartQuotes","usedQuote","updateChartsTitle","defaultDocumentTitleRef","afterClose","prevClose","percentageChange","overridePlaces","useChartPageTitle","handleChartsUpdate","getChartLayoutWithChartRouteChange","ChartLayout","isWithNotifications","Wrapper","NotificationWrapper","ChartLayoutWithGlobalState","setChartLayoutModel","getChartLayoutModelConfig","lastGlobalRerender","fallback","isIPad","IPAD_FULLSCREEN_CLASS","isFullscreen","setIsFullscreen","requestFullscreen","exitFullscreen","getExitFullscreen","checkFullscreen","SORTED_LAYOUT_KEYS","arr","sortBy","sortDirection","SORT_DIRECTION","directionMultiplier","sortObjects","ChartLayoutDropdown","parsedQuery","getChartsToPath","useChartsPathLocation","orientation","DropdownSeparator","ChartSyncableParts","isChartPartInSync","getIsChartPartInSync","setSyncChartParts","ThemeToggleButton","isDarkMode","updateSettings","BREAKPOINTS","Infinity","marketBadgeText","timeFormat","ChartLayoutHeaderComponent","onSettingsOpen","hasPublish","Time","breakpointMode","breakpoints","ChartLayoutHeader","StockDetailTimeframeBar","isDateRangeAvailable","isLoadingOverride","isScrollIntoViewEnabled","containerElement","pushIndicators","indicator","_options$COTs","cotKeys","COTs","code","hasPaneWithCOTCode","PANE_HEIGHT_DEFAULT","parameters","getChartTypeByTaConfigStyle","candlestick","heikinashi","hollowcandlestick","line","ohlc","mergeChartAndTAConfig","taConfig","_chartScaleMap","linear","percentage","logarithmic","indicators","Position","_overlay$parameters","_overlay$color","getPanes","_overlay$parameters2","_overlay$color2","webpackEmptyContext","req","resolve","module","exports","componentsLib","components","white","black","inherit","transparent","finviz","blue","gray","red","orange","amber","yellow","brightYellow","lime","green","emerald","teal","violet","purple","pink","FLibsExports","___EXPOSE_LOADER_IMPORT___","require","___EXPOSE_LOADER_GLOBAL_THIS___","Arrow","renderContent","resize","_thumbs","Thumb","attrs","x1","y1","x2","y2","getBoundingPointKeys","getDefaults","ElementSettings","Colors","roundedXY","getRoundedObject","translateXY","getXYOffsetFromLine","lineWidth","translate","beginPath","angle","PI","moveTo","lineTo","stroke","lineAngle","atan2","h","cos","angle1","topx","topy","sin","angle2","botx","boty","getShouldRenderThumbs","renderThumbs","isDrawingElementLockedOrInvisible","CanvasElementType","prototype","modalConfig","Brush","previousFill","shouldRenderFill","_this$model","positionPointsTimestamps","getTimestampFomPositionX","places","domainDiff","numberOfLeadingZeros","log10","roundToFixed","untranslatedContext","createElement","setFillCache","fill","defaultTransparentFill","isPolyLineClosed","cachedFill","getShouldRenderFill","_this$attrs","brushPath","Path2D","fy","xc","yc","quadraticCurveTo","point","closePath","getThumbs","firstX","firstY","moveByThumb","onMouseUp","roundY","_this$untranslatedCon","isPointInPath","getPositionXFromTimestamp","getAutosaveOmittedProperties","TailDirection","getTailHalfWidth","halfWidth","dist","Callout","Text","getModalConfigBase","textWithoutBackground","font","fillStyle","lineHeight","textAlign","textBaseline","padding","background","defaultFill","setupContext","setupTextMetricsCache","_this$lastAttrs","_this$lastAttrs2","lastAttrs","lines","getLines","metrics","measureText","measuredHeight","currentIndex","actualBoundingBoxAscent","actualBoundingBoxDescent","PADDING","renderText","previousDescent","fillText","renderBackground","textWidth","minRadius","radius","requiredTailHalfWidth","rectangleSides","topLeft","topRight","rightTop","rightBottom","bottomRight","bottomLeft","leftBottom","leftTop","getRectangleSidesCoordinates","tail","tailRoot","tailTip","getTailCoordinates","tailDirection","topLeftCorner","topRightCorner","bottomLeftCorner","bottomRightCorner","topSide","rightSide","bottomSide","leftSide","noTail","getTailToSideIntersection","lineJoin","arcTo","tailLineToTopLineIntersection","tailHalfWidth","tailLineToRightLineIntersection","tailLineToBottomLineIntersection","tailLineToLeftLineIntersection","renderCallout","renderBorder","tailP1","distance","pointOffsetX","pointOffsetY","tailP2","polygon","Curve","x3","y3","drawQuadraticCurve","curve","Bezier","cp1x","cp2x","cp1y","cp2y","project","d","Ellipse","getCoordinates","centerLeftX","centerLeftY","centerRightX","centerRightY","boundingPointKeys","bottomCenterX","bottomCenterY","bezierCurveTo","bottomRightX","bottomRightY","topRightX","topRightY","topCenterX","topCenterY","topLeftX","topLeftY","bottomLeftX","bottomLeftY","rotationAngle","atan","radiusX","radiusY","width_two_thirds","dx1","dy1","dx2","dy2","RotatedRectangle","getRectCoordinates","coords","mx1","mx2","my1","my2","nk","dx","sqrt","dy","x4","y4","SymbolElement","sx","getRotatedCoordinates","scaleX","sy","textHeight","scaleY","symbol","xScale","yScale","xOffset","yOffset","rotate","cx","cy","halfHeight","defaults","drawingToolsByType","arrow","brush_v1","callout_v1","elliottWaves","ellipse","ellipse_v1","fibonacci","horizontalLine","measure","pitchfork_v1","rectangle","rotatedRectangle","rotatedRectangle_v1","scaledLine","scaledText","symbolElement","triangle","verticalLine","xabcd","obj","xPointKeys","positionTimestamps","positionX","_this$model$chartEven","_this$model2","_this$model$elements","_this$model3","findByAttribute","__","getIsPaneSelection","_this$model$elements$","attrsSubset","customizer","objValue","srcValue","mergewith","defineProperty","globalAlpha","thumb","startEditing","pointPoitionsFromTimestamp","timestamp","getIsVisible","replaceMyself","captureMessage","oldElement","newElement","isCreatorDialogOpen","release","_this$attrs$visibilit","micro","macro","MicroMacroTimeframe","indexOf","timeframesToSet","attrsToSet","assign","getIsInChartView","ElliottWaves","positionWavesTimestamps","waves","wave","getOffsetFromLineWidth","TextBaseline","TextAlign","EllipseV1","rotationAxisPoint","pointToRotate","oldLinePoint","newLinePoint","sharedPoint","rotatedPoinCoordinates","getEllipsePoints","P2","P4","coordinates","P3","P1","CP4","CP1","CP2","CP3","ellipsePath","inverted","cursorTargetX","cursorTargetY","perpendicularPoint","lineCenterX","lineCenterY","invertX","invertY","perpendicularPointEllipseOffsetX","perpendicularPointEllipseOffsetY","P1WithOffsetX","P1WithOffsetY","P3WithOffsetX","P3WithOffsetY","controlPointOffsetX","controlPointOffsetY","newLeftPoint","leftRotatedCursorPoint","getRotatedPointCoordinates","newRightPoint","rightRotatedCursorPoint","FibonacciRetracements","parseCoefficients","coefficients","parsed","trim","getMaxCoefficientUnscaledY","heightScaled","toFixed","splice","maxCoefficientY","HorizontalLine","ScaledLine","updateDecimalPlaces","decimalPlaces","repeat","renderLabels","Line","strokeStyle","dashLength","setLineDash","Measure","volume","roundedX1","roundedX2","minIndexLimit","maxIndexLimit","volMinIndex","volMaxIndex","volumeSum","volumeIndex","numberToStringWithUnitsSuffix","x1Dif","x2Dif","startingX1","startingX2","fillRect","priceDif","heightStr","getRoundedString","number","numOfDecimalPlaces","baseX","baseY","getHeight","getVolumeSumString","addToCoordinates","difs","newX1","newX2","paneArea","getEdgeIntersectionPoint","sides","rayOrigin","rayDirection","intersection","intersectionDistance","rayToLineIntersection","getPitchforkCoordinates","rayDirectionControlPoint1","rayDirectionControlPoint2","trend1","trend2","chartVisibleAreaLeftX","chartVisibleAreaRightX","chartVisibleAreaBottomY","chartVisibleAreaTopLeftPoint","chartVisibleAreaTopRightPoint","chartVisibleAreaBottomLeftPoint","chartVisibleAreaBottomRightPoint","getChartVisibleAreaBoundaries","medianRay","trend1Ray1","trend2Ray1","trend1Ray2","trend2Ray2","medianRayDirectionPoint","rayOriginToRayDirectionVector","rayDirectionControlPoint1ToPoint2Vector","normalizedRayDirectionControlPoint1ToPoint2Vector","medianRayDirectionPointToRayDirectionControlPoint1Distance","trend1Ray","getTrendRayCoordinates","medianToControlPointDistance","normalizedControlToControlPointVector","trendRay1","trendRay2","trend2Ray","medianToTrendLineDistance","trendRayPoint1Origin","trendPoint2RayOriginPoint2","trendRayPoint1DirectionPoint","trendPoint2RayDirectionPoint","Pitchfork","median","_trendLines$filter$","trendLines","line1","line2","trendLine","trendLineIndex","solidTrendColor","getHEXWithSpecificAplha","nextTrendLine","outerTrendLines","Polygon","isPolygon","_this$attrs$points$la","_this$attrs$points$la2","scaledPoints","targetY","stopY","centerY","stopBaseline","targetBaseline","targetColor","stopColor","targetDif","targetPerc","targetStr","stopDif","stopPerc","stopStr","middle","middle1","roundDif","coordType","coordIndex","Rectangle","strokeRect","RotatedRectangleV1","newMiddleLeftPoint","middleLeftRotatedCursorPoint","newMiddleRightPoint","middleRightRotatedCursorPoint","ScaledText","rect","propKey","f","_obj$font","testArea","convertArea","rawHight","_border$width","borderWidth","borderColor","thumbWidth","getThumbWidth","Triangle","VerticalLine","XABCD","xx","xy","ax","ay","bx","by","retLabel","len","ret","xab","bcd","result1","getIsSSr","rendered","refresh","drawImage","cWidth","cHeight","sWidth","screen","sHeight","ChartMinWidthBreakpoints","getChartBreakpoints","chartWidthInPx","isXs","xs","isS","isM","m","isL","getDateString","dateString","getFullYear","getDate","getHours","padLeft","getMinutes","MONTHS","gray300","tailwindColors","BaseChart","overlaysByType","getNumOfBarsBuffer","isLargeChart","overlayDefinition","addOverlay","renderYAxis","setupCache","renderOverlaysLabels","handleIndicatorsChange","mouseModelChangeHandler","mouseModel","baseCache","updateShouldRenderVolume","renderChart","renderChartNotAvailable","getIsRedesignedChart","renderTicker","clip","renderVolume","renderOverlays","renderPrevClose","renderFadeExtendedHours","renderGrid","renderXAxis","tickerText","margin","FONT_SIZE","OFFSET","baseline","renderTimeframe","_ChartSettings$left$t","volumeFY","range","getTimeframeLabel","textSecondary","tickerWidth","renderChange","lastOhlc","getOHLC","directRender","changePercentage","lastDate","renderOHLC","isSmallIndexChart","isNewestOHLC","high","low","afterHour","isFinite","roundOhlc","lastVolume","toLocaleTimeString","hour","minute","getRoundedLastData","lastOpen","lastHigh","lastLow","renderOverlaysLabelsChartsPage","renderOverlaysLabelsQuotePage","overlayLabel","isRenderedOverlaysLabel","labelSpacing","getLabelColor","getYAxisLeftMargin","getYAxisLastCloseLabel","firstVisibleClose","getPercentageFromValue","base","contentHeight","lineTicks","textTicks","lastCloseLabel","getTranslate","do","tickCount","minMax","placesAxis","stepPrice","minPerc","maxPerc","d3","nice","ticks","tick","getValueFromPercentage","pixelGap","negativeScale","previousNegativeTick","unshift","positiveScale","getYLineText","yTickText","axis","yTickLine","getYLine","resetYTicksStyles","percentageZeroLineText","undo","renderYAxisLabel","yCoordinate","getSecondaryLabelBackgroundColor","stringifyHSVAColor","getHSVAFromColor","currentBackground","getYAxisSecondaryLabelYCoordinate","_padding$top","_padding$bottom","mainLabelValue","secondaryLabelValue","LINE_HEIGHT","mainLabelValuePosition","secondaryLabelValuePosition","offsetedY","currentText","getDrawDays","render15MinXAxis","renderIntradayXAxis","renderIntradayXAxisFutures","renderDailyXAxis","renderWeeklyXAxis","renderMonthlyXAxis","isXPointVisible","buffer","renderXAxisLabels","_ref9","labels","textRenderer","allowedOverflow","sortedLabels","renderedLabelRanges","reverse","newLabel","hasPriority","_ref10","halfOfTextWidth","overflowLeft","overflowRight","labelX","minX","maxX","getIsOverlapping","interval","IntradayTimeframeInterval","marketStartHour","marketStartMinutes","marketEndHour","ceil","aftermarketLengthMinutes","xLine","getXLine","dayToOffset","getDayToOffset","dayIndex","dateFromDateString","drawMinutesPerDay","roundedX","premarketLengthMinutes","lastDay","lastHours","hours","indexOffset","getBarsInDay","lastMonth","gridSecondary","isYearLabel","substring","lastYear","isJanuary","shouldRenderVolume","getIsIndicatorPresent","getVolumeTicks","fontHeight","renderVolumeAxis","relativeVolume","grid","rangeMax","volumeAxisFontSize","volumeAxis","format","tickFormat","domainFrom","domainTo","setupAxisTimeFrame","halfBarWidth","getHalfBarWidth","barWidthWithoutMargin","getBarWithoutMarginWidth","drawInVisibleArea","drawBarCallback","volumeTrendDown","volumeTrendUp","isRendered","contentWidth","getRoundDecimalPlaces","price","getPlacesLastClose","onRenderCrossText","conditionalCursor","getDataByCrossIndex","crossIndex","shouldReturnRoundedString","getDataByBarIndex","getCrossIndexChange","_this$data$close$cros","_this$data$close","crossDataIndex","getDataIndexByBarIndex","crossClose","previousClose","getTickerChangeFromCloseValues","anchorClose","dateByBarIndex","virtualTradedDates","getVirtualTimeframeTradedDates","dateStart","dateEnd","_ref11","change","isOffscreen","isGroupInstrument","changeText","percentString","getChangeColor","changeWidth","afterChangeText","afterChangeTextWidth","oneLineAHChangeWidth","afterChange","renderOHLCChartsPage","renderOHLCQuotePage","_ref12","chartBreakpoints","OhlcText","canvasFill","dateElements","trendColor","oElements","hElements","lElements","cElements","volElements","changeElements","getFlatLineArrayWithSpaces","lineElements","startX","lineElement","LabelsText","numberOfNewOhlcLines","_ref13","OHLCType","lineTopY","OHLCFontSize","centerXOffset","leftXOffset","OHLC","ohlcString","singleLine","OHLC_TEXT","getOHLCType","ohlcSettings","getOHLCSettings","CHART_MARGIN","alignTop","renderOHLCToCanvas","_ref14","ohlcSet","isSingleLineWithChange","n0","n1","x0","premarketFade","aftermarketFade","shouldShowPrevClose","isIntradayWithPreMarket","TIMEFRAMES_WITH_PRE_MARKET","isIndexChart","Cache","getIsMobileChartPage","setupAxis","_utils$max","volumeHeight","volumes","addMarginBottom","marginBottom","setOverlays","removeOverlay","MAX_VALUE","MIN_VALUE","start","end1","asc1","placesLastClose","barFillWidth","barBorderWidth","getBarWidthWithMarginByParts","priceAbs","hasOverlay","getCandleLikeChartsRenderingColors","colors","overwrittenColors","getColorOverwrites","overwrittenColorKeys","hasOverwrittenCandleColor","colorKey","getShouldUseDarkerWickColors","totalBarWidth","darkerWickColors","thinBarColorsOverride","CandleStick","getRenderChartBarProps","chartSettingsColors","hasFillAndBorder","trendDown","trendUp","borderDown","borderUp","wickDown","wickUp","wickColor","barFillColor","shouldRenderFillAndBorder","translateForWick","WICK_WIDTH","candleBodyHigh","candleBodyLow","candleWickHigh","candleWickLow","candleBodyHeight","candleBodyLeftX","halfBorderWidth","isBodyHeightGreaterOrEqualBorders","isWickLineCandleLessThanOnePixel","hasBorder","fillHeight","hasFill","HollowCandleStick","isHollow","generalTrendColor","ohlcTrendUp","ohlcTrendDown","zeroChange","HeikinAshi","haData","getHeikinAshiData","getLastValues","originalLatestClose","heikinLatestCloseLabel","originalLatestCloseLabel","_haData$close$barInde","_haData$close","LineChart","redLine","greenLine","MarketSentiment","MarketSentimentSettings","_data","lastIndex","_dataLastIndex","renderLineBullBear","oversold","overbought","isRedesign","marketDown","marketUp","_compute","computeVisibleMinMax","yLine","fillUp","fillDown","MultiLineChart","ColorsSettings","getQuotes","end","asc","_this$data$getDataByB","maxTickerLength","isLastDate","tickersDimensions","closeValue","_len","arrays","_key","_this$data","OHLCChart","barWithoutMarginWidth","lineThickness","handleLengthFromWick","lineOffset","barX","PerfChart","overlayLabelWidth","perf","shouldRenderDate","tickerData","MARGIN","percentageText","lastCrossIndex","_d3$max","fromDate","toDate","filteredQuotes","closes","daysCount","end2","asc2","monthsInData","availableTickSpots","monthsToAvail","renderMonth","chartsByType","candleStick","heikinAshi","hollowCandleStick","lineChart","marketSentiment","multiLineCharts","ohlcChart","perfChart","XXS","XS","S","M","L","XXL","XXXL","XXXS","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","OverlayType","ChartEventDbType","ChartEventType","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","ASC","DESC","i1","i2","i3","i5","i10","i15","i30","h2","h4","DateRangeType","TIMEFRAME_SECONDS","w","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","QuotePollingIntervalInMs","ScaleLabel","Linear","Percentage","Logarithmic","INDICATOR_LABEL_HEIGHT","FREE_DATE_RANGES","minutes","days","weeks","prev","curr","_chartLayoutModel$spe","useNotification","setIsFetching","dateFromUnixTimestamp","generatePathForTimeframeDateRange","timeframeUtm","getTimeframeGroupsWithHref","generatePath","timeFrame","getDateRangeGroupsWithHref","dateRangeState","getVisibleBarsNumber","getChartStartEndDates","timeoutInMs","unwatchedChartLayoutModel","hasSyncedTimeframe","ChartSyncablePart","syncChartParts","hasSyncedTicker","_decodedSearch$t","urlTimeframes","urlDateRanges","chartsArrayPlaceholder","_urlTickers$index","currentTicker","timeframes","_urlTimeframes$index","currentTimeframe","_urlDateRanges$index","currentDaterange","sidebar","getTimeframeGroups","timeFrameGroup","QuoteUrlChartTypes","cs","candlesticksimple","o","ha","hc","badgeImages","getSvgImageCacheKey","getChartEventBadgeImage","badgeState","svgHTML","img","Image","encodeURIComponent","cacheEventBadgeSvg","getChartEventEarningSvgString","isFuture","outerStroke","innerStroke","innerFill","textFill","getChartEventBadgeColors","getChartEventBageColors","exdate","hasEarningsDateSuffix","parsedDate","formattedDate","formatDateToStringUS","suffix","numberString","bigNumber","BIG_NUMBER_VALUES","wholeNumber","decimalNumber","formattedDecimalNumber","light","twColors","hover","dark","CustomDateRangePrefixEnum","DATE_RANGE_PREFIX_DELMITER","getParsedDateRange","startInSec","getTime","endInSec","lastQuoteDateIndex","lastVisibleBarIndex","firstVisibleBarIndex","quoteDate","isQuoteDateInRange","numOfBarsOffset","getChartZoomAndLeftOffset","numOfBarsToRender","numberOfBarsToDraw","daysInQuote","getDaysInQuote","dateRangePrefix","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","Prev","years","parseCustomDateRangeUrlParam","convertLocalToNyTime","setHours","startDateIndex","numOfBarsInView","PREMARKET_AFTERMARKET_HOURS","getFullChartWidth","hasAftermarket","hasPremarket","timeframeMinutes","barWidthWithMargin","marketMinutesLength","getIntradayChartConfig","fullChartWidth","offsetInPx","shouldCropChart","chartWidthWithOffset","offsetChartAfter","shouldAlignDaysToLeft","drawDaysInOneChart","_lastQuoteDate$getHou","lastQuoteDate","barsToOffset","offsetChartInPx","_quote$open","isStockIntraday","isQuoteOrOffscreen","isChartsInradayDateRange","getShouldOffsetChartDomain","scaleType","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","minPx","extendedMin","rounded","fromEntries","_ref15","_numOfDaysToRender","_quote$getBarsInDay","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","_reversedDaysInQuote$","_reversedDaysInQuote$2","reversedDaysInQuote","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","_ref16","shouldRenderCross","DEFAULT_CONTEXT","getInstrumentLabel","getResponseChartType","chartType","chartResponseType","tr","multiplier","ChartEvent","getChartEventModel","getXYPosition","_chartEventModel$yInd","chartEventModel","yIndex","_this$model$chart$quo","isOpenOverride","isCurrentEventActive","scaledArea","Earnings","_this$getChartEventMo","eventItem","chartEventsByType","dividends","earnings","canvasElements","indicatorsByType","elementType","Thousand","Million","Billion","Trillion","BIG_NUMBER_ZEROES","BIG_NUMBER_SUFFIX","dotProduct","crossProduct","pow","lineEquation","k","pointInPolygon","j","oddNodes","distanceToLine","distanceToSegment","l2","getInstrumentDecimalPlaces","formatBigNumber","minNumber","absNum","getString","zeroes","str","splitString","addZeroes","padEnd","numberByZeroesCount","isInteger","perpendicularPointToLine","yAxisCoeficient","xAxisCoeficient","radAngle","rotatedPointCoordinates","sharedPointLinesAngle","twoSegmentLinesIntersection","p3","p4","denominator","ua","ub","checkLineIntersection","line1_p1","line1_p2","line2_p1","line2_p2","onLine1","onLine2","numerator1","numerator2","getRayToLineSegmentIntersection","rayEnd","segmentStart","segmentEnd","lineIntersection","subtractPoints","getMiddlePointOnLineSegment","normalizeVector","v","multiplyVectorByScalar","scalar","addPoints","enabled","collapsed","logErrors","withStackTrace","logger","console","filterChanges","errorTransformer","titleFormatter","took","parts","nextState","pad","times","printLogEntry","logEntry","startedTime","formattedTime","getSeconds","getMilliseconds","titleCSS","headerCSS","formattedTitle","groupCollapsed","group","styles","trace","groupEnd","initialize","protoModelLoad","started","attributes","returnedValue","apply","ChartEventElement","belongsTo","_this$instance$model$","stockEvent","Indicator","Overlay","hostname","periodInt","getParsedIntegersFromPeriodString","INDICATOR_DEFAULT_DOMAIN","compute","renderIndicator","getIsChartPageSpecificFunctionality","renderLabel","isComputeNecessary","shouldUpdate","tickTextStep","formatAxis","maxY","valueY","lastValue","_IndicatorSettings$ri","_IndicatorSettings$ri2","_IndicatorSettings$ri3","_IndicatorSettings$ri4","_IndicatorSettings$ri5","_IndicatorSettings$ri6","_IndicatorSettings$ri7","_IndicatorSettings$ri8","indicatorCurrentText","indicatorCurrentBackground","renderLabelChartsPage","renderLabelQuotePage","indicatorLabel","labelWidth","ctx","roundedRect","isPerfIndicator","renderCrossTextChartsPage","renderCrossTextQuotePage","renderOversoldOverbought","zero","drawLines","clipHeight","drawInVisibleAreaProps","fromIndexOffset","renderZeroLine","tickStep","newAttrs","parsePeriodInt","setModel","getDomainDefaults","inputsErrorMessages","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","ADX","_this$adx$last","adx","amdm","apdm","mdi","pdi","atr","deltaHigh","deltaLow","pdm","mdm","di","_this$period","COLORS","Aroon","aroonUp","aroonDown","startAt","highPeriod","highestInPeriod","periodSinceHigh","lowPeriod","lowestInPeriod","periodSinceLow","textLabels","labelSetting","AroonOscillator","_this$oscillator$last","oscillator","ATR","_this$atr$last","AverageTrueRange","CommodityChannelIndex","_this$cci$last","smaCount","tp","cci","smaSum","devCount","typicalPrice","sma","devSum","dev","COT","cotQuoteCode","cot","commercialHedgers","largeTraders","smallTraders","units","renderAdditionalLabels","secondarylabelX","fontSettings","secondarylabel","ForceIndex","_this$fi$last","fi","ema","EMA","MACD","fastPeriod","slowPeriod","signalPeriod","_this$macd$last","macd","signal","histogram","ema1","ema2","ema3","signalLine","_this$fastPeriod","_this$slowPeriod","_this$signalPeriod","MFI","_this$mfi$last","negativeMoneyFlow","mf","mfi","prevTypicalPrice","positiveMoneyFlow","moneyFlow","oldMF","None","OBV","_this$obv$last","obv","currentObv","PricePerformance","getTickers","chartUuid","hasCachedData","getTickersAndTimeframe","firstFetchCalled","_this$model$scaleRang","_this$model$scaleRang2","_this$model$scaleRang3","_this$model$scaleRang4","firstBarTime","lastBarTime","dateToIndex","getDateToIndex","perfArrays","iterable","_this$quotes","_this$quotes2","_this$quotes3","crossIndexTickerTimeStamp","tickerDateToIndex","tickerPerformance","indicatorLabelWidth","performanceIndicatorLabel","_this$quotes4","_tickerQuote$close$le","isVertical","labelBottom","canFitItemsVertically","tickerQuote","maxCrossIndex","_this$quotes5","_this$quotes6","tickerTextWidth","crossText","getSanitizedTicker","RMI","momentum","_this$rmi$last","rmi","u","ad","au","sumu","sumd","rs","_this$momentum","ROC","_this$roc$last","roc","RSI","_this$rsi$last","rsi","DEFAULT_PARAMETERS","RelativeVolume","baseLine","periodStr","parsePeriod","_this$rvol$last","rvol","baseLineY","_this$baseLine","RWI","rwiHi","rwiLo","trSum","atrWeight","maxHi","maxLo","Stochastics","kPeriod","dPeriod","_this$k$last","dCount","dSum","k1","kSum","kCount","highestHigh","lowestLow","_this$kPeriod","_this$dPeriod","StochasticsFast","StochasticsSlow","Trix","_this$trix$last","trix","UltimateOscillator","period1","period2","period3","_this$ult$last","bpSum2","bpSum3","count2","count3","trSum2","trSum3","ult","bp","avg2","avg3","bpSum1","trSum1","count1","avg1","_this$period2","_this$period3","Volume","_this$data$volume$las","WilliamsR","_this$r$last","none","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","paddingValue","_callbackCache","getContext","_cache","_restore","CanvasRenderingContext2D","that","cb","record","fkey","newCb","origCb","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","getAreWatchedPropsEqual","currentValue","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","_watchedPropertiesRef","isArray","spineEvents","hasMany","getChartElement","getChartType","_this$getChartElement","defaultRefreshInterval","customRefreshInterval","omitKeys","_this$quote","getIsScrollable","_this$quote$COTs","perfQuotes","quotePerfTickers","_this$getChartElement2","_paneProperties$eleme","_paneModel$mainElemen","chartOrIndicator","attrsInSync","ChartPartToAttrsSyncMap","modelAttr","hasOwnProperty","chartParts","isInSync","chartPart","_hasOverlay","_this$quote$getRawTic","_this$quote2","shouldClear","allChartEvents","Ticker","Timeframe","Crosshair","drawingsInternalStoreModel","_this$syncChartParts$","_this$syncChartParts","chartPartsToSync","newSyncedChartParts","_this$syncChartParts2","_this$charts$first","_this$idea$id","_this$idea","largeChartFontSize","fontSize","CHART_FORMAT","getChartSettings","chartFormat","BE_SMALL_CHART_WITHOUT_OVERLAYS","chartLightTheme","chartDarkTheme","tickerTimeframeChangeHeight","indicatorLightTheme","indicatorDarkTheme","generalColors","elementLightTheme","elementDarkTheme","BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS","BE_SMALL_CHART_WITH_OVERLAYS","BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS","BE_LARGE_CHART_WITHOUT_OVERLAYS","BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS","BE_LARGE_CHART_WITH_OVERLAYS","BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS","INTERACTIVE","INTERACTIVE_CHART_SETTINGS","normalizeHexAlpha","hexString","customColors","customColorKeys","defaultColors","crossTextBackground","negativeChange","overlayTransparentBackground","positiveChange","_attrs$elements","_attrs$instanceUUID","_attrs$latestLocalUpd","_attrs$latestRemoteUp","_attrs$autoSaveState","newAutoSaveState","_elementAttrs$element","_this$generateUuid","generateUuid","_elementAttrs$zIndex","getElementZIndexRange","oldInstance","pane_id","clonedObj","cloned","moveToZIndex","currentZIndex","directionCoef","newZIndex","elementsBelowZero","elementsAboveZero","getBelowAboveZeroElements","changeElementZIndexes","elementsArray","addElement","oldZIndex","isBelowZero","_this$instance","_this$instance2","isOverlay","_this$instance3","_this$instance4","_this$instance5","_this$instance6","refreshElementId","_this$generateUuid2","MARKET_START","END_OF_DAY","roundTimeForSyncedPane","sourceChart","targetChart","dateToReturn","sourceChartHasPremarket","targetChartHasPremarket","setDate","lastDayOfMonth","lastDayOfWeek","weekStartsOn","endOfDay","getIsDateBeforeMarketStart","Mouse","_this$pane","_this$pane2","getIsCrossSyncOn","getIsMouseInChartOfPane","paneOfMouse","mouseInChart","currentPaneChart","mousePositionTimestamp","currentPanePositionX","_this$position$y","_this$position","_this$pane3","positionY","_this$pane4","getIndexInChart","mouse","CHART_EVENT_BADGE_TYPE_ORDER","chartEventElementModel","move","chartPanes","targetPane","currentChartPaneRecords","records","chart_id","ohterChartPaneRecords","targetRecordIndex","arrayWithoutTargetRecord","chartRecordIndex","panesAbove","panesBelow","getNumericId","isSorted","_this$getAllElements$","_this$mainElement","_this$mainElement2","resetHeight","allPaneElements","rebuildElementZIndexes","hoveredChartEvent","openedChartEvent","hoveredTypeChartEventElements","openedTypeChartEventElements","nonActiveChartEventElements","chartEventsOnSameXPoint","chartEvent_B","isOpened","isHoveredType","isOpenType","quoteCache","getCachedQuote","cachedAt","setCachedQuote","_quoteCache$cid","emptyQuote","numberOfRefreshChecks","is404","patternsMinRange","patternsMaxRange","dataId","tickerRaw","fetchFunc","shouldUseCache","select","doesQuoteAndFetchParamsMatch","isSameOrNoChartUuid","isNotEmptyQuote","isCacheAllowed","hasPatterns","doesQuoteAndOptionsMatch","getResolvedFetchingPromise","maxBars","tickersAndTimeframes","accumulator","err","QuoteFetchTypeUrlOption","fetchingPromise","getUrl","getIsAbortError","NotFoundError","shouldUseEmptyQuote","fetchRequest","_data$ticker","_data$chartEvents","_this$numberOfRefresh","_this$numberOfRefresh2","noNewData","newQuoteData","lastTime","afterTime","AIndex","BIndex","mergeIndex","ADate","BDate","prevAIndex","prevDate","newDate","isSameWeek","isSameMonth","warn","thisDateLength","dataDateLength","load","atts","drawDays","getBarIndexes","barToDataIndex","_this$barIndex","_chartEvents$map","getChartEventsWithId","deleteCachedQuote","cachedHeikinAshiData","HAClose","heikAshiData","cachedDayToOffset","dateStringFromDate","yyyy","mm","dd","padStart","dataIndex","_quoteData$dataIndex","cachedDateToIndex","getTimestampFromPositionX","host","process","env","BE_API_URL","rev","clearData","colorsOverride","settingColors","_config$charts","isLight","getNormalizedZIndex","getFreeColor","periods","getRGBAValueFromValidColorString","BB_COLORS","TOP","BOTTOM","MIDDLE","BollingerBands","deviations","scaledTop","scaledBottom","firstBarToRender","lastBarToRender","stdDev","stdDevSum","upperBand","lowerBand","_this$attrs$period","_this$attrs$deviation","_this$attrs$topColor","_this$attrs$bottomCol","topColor","bottomColor","DonchianChannels","medianBand","_this$attrs$channelSt","_this$attrs$channelFi","_this$attrs$medianBan","strokeColor","channelStrokeColor","fillColor","channelFillColor","medianBandColor","ExponentialMovingAverage","_this$attrs$color","EMA2","HighLow","highColor","prevHigh","lowColor","prevLow","prevBar","_this$attrs$highColor","_this$attrs$lowColor","isPositiveFloat","Stroke","Fill","Conversion","Base","SpanB","conversion","spanB","IchimokuCloud","_this$data$barIndex$x","outsideBar","renderFull","spanAFillColor","spanAStrokeColor","spanBFillColor","spanBStrokeColor","baseLineColor","conversionLineColor","laggingSpanColor","conversionLine","senkouSpanA","senkouSpanB","conversionStartIndex","baseStartIndex","spanBIndex","highestHi","lowestLo","lastSpanAX","lastSpanBX","cloudStartingX","fxOverride","toIndexOffset","_this$attrs$conversio","_this$attrs$base","_this$attrs$spanB","_this$attrs$spanAStro","_this$attrs$spanAFill","_this$attrs$spanBStro","_this$attrs$spanBFill","_this$attrs$conversio2","_this$attrs$baseLineC","_this$attrs$laggingSp","IchimokuCloudFull","KeltnerChannel","emaPeriod","atrPeriod","middleLine","_this$attrs$emaPeriod","_this$attrs$multiplie","_this$attrs$atrPeriod","_this$attrs$strokeCol","_this$attrs$fillColor","Patterns","originalScale","barsInDay","aboveBelow","textHS","above","below","supportColor","resistColor","kind","_this$attrs$supportCo","_this$attrs$resistCol","SAR","maxStep","isLong","sar","ep","newHigh","newLow","af","sarToDraw","risingColor","fallingColor","_this$attrs$step","_this$attrs$maxStep","_this$attrs$risingCol","_this$attrs$fallingCo","customizable","SMA","SMA2","Supertrend","finalUpperBand","finalLowerBand","supertrend","uptrendColor","avg","downtrendColor","_this$attrs$uptrendCo","_this$attrs$downtrend","VP_COLORS","applyOpacityToColor","VolumeProfile","chartWidth","getFirstBarToRenderIndex","getLastBarToRenderIndex","upColor","downColor","_attrs$upColor","_attrs$downColor","minClose","maxClose","segment","segments","up","down","segmentIndex","isInSegment","volumeTrend","volumeFX","segmentHeightRaw","segmentHeight","upSegmentWidth","downSegmentWidth","_this$attrs$opacity","_this$attrs$upColor","_this$attrs$downColor","VWAP","cumulativePV","cumulativeVolume","second","vwap","datesAreOnSameDay","bb","dch","hilo","hline","ic","icf","kch","sma2","vp","arg","_len2","_key2","_len3","_key3","devicePixelRatio","getScaleRatio","referenceDate","dayNumber","monthIndex","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","addOffset","quoteDateTimeOffsetInMs","getQuoteDateTimestampOffsetInSeconds","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","dayOfWeek","setUTCSeconds","testTouchPoints","isMobileOs","navigator","userAgent","createEvent","match","msMaxTouchPoints","maxTouchPoints","matchesIPad","matchesIPhone","matchesIPod","re","RegExp","cookie","toUTCString","_document$fullscreenE","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","_element$requestFulls","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","_document$exitFullscr","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","fn","readyState","chartElementId","_box$width","_box$height","box","matchingPages","requestsAbortControllersCache","_requestsAbortControl","abortRequest","controller","cache","errorsCache","NUM_OF_RETRIES","ErrorSeverity","importWithRetry","retries","setIsError","handleError","handleScriptNotLoaded","renderScriptNotLoaded","medium","loadModule","cachedModule","mod","DAY_IN_SECONDS","TWO_MIN_IN_MS","virtualDatesCache","areTimestampsFromSameDay","ts1","ts2","ts1Utc","ts2Utc","getVirtualDatesCacheId","idRevision","setCachedVirtualDates","fromSeconds","toSeconds","virtualDates","virtualDatesCacheId","lastUsed","checkVirtualCacheSize","MAX_BAR_BORDER_WIDTH","MIN_BAR_MARGIN_WIDTH","MAX_BAR_MARGIN_WIDTH","settingsCenter","barMarginWidth","shouldRound","roundDecimalPlaces","DEFAULT_ZOOM_GUESS_INCREMENT","zoomFactorForBarsToDisplayCache","zoomFactorForBarsToDisplayCacheKeys","getZoomFactorFromCache","_zoomFactorForBarsToD","setZoomFactorToCache","poppedKey","defaultBarWidthWithMargin","zoomIncrement","finalZoomFactor","iteration","barWidthDiff","getTimeframeSeconds","lowerIndex","dates","upperIndex","isWithinRangeOfQuoteDate","commonVirtualCacheProps","cachedDates","virtualDateSeconds","getCachedVirtualDates","timeframeSeconds","firstDate","numOfDatesBefore","numOfDatesAfter","virtualTradedDays","dateStartSeconds","dateEndSeconds","datesSeconds","isStartBeforeDates","isEndAfterDates","dateTime","getVirtualTradedDays","marketStartSeconds","barTimeframeSeconds","quoteDatesTimestampOffset","dayStartSeconds","barSeconds","virtualTimeframeTradedDates","isLowerBounded","isOneBeforeLowerBoundStarts","lastDateIndex","isLookingBack","averageBarDate","numOfSecondsOutOfBounds","_perfIndicatorElement","_perfIndicatorElement2","perfIndicatorElement","getPerfIndicatorTickerAndTimeframes","_ref17","getCrossIndexForPane","getShouldRenderCrossInPane","getPriceForPane","isXAxisInView","domainRange","priceFy","YAxisLeftMargin","getCrossText","_getRoundDecimalPlace","firstBarClose","_ref18","_ref19","_ref20","changePercent","changePercentString","_ref21","isForexFuturesCryptoPage","_ref22","isForexFuturesCrypto","isOffscreenChartWithNarrowBars","isQuoteChartWithNarrowBars","hasSidebarEnabled","_ref23","hexStringToRGBA","hexColor","removeHashSymbol","g","rgbaToHexString","alpha","alphaToHex","rgbaToHSVA","hsvaToRGBA","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","strColor","allowAlpha","getIsRgb","rgbKeys","output","canSelectAlpha","hsvaToHEXString","_barToDataIndex$Math$","object","formData","append","FormData","statusCode","throwOnPredicate","credentials","responseContentType","Html","responseData","ApplicationJson","ApplicationJsonUTF","FormUrlEncoded","parseResponseForContentType","status","getStatusCodeError","forceUpdateKey","increment","precision","periodString","part","exception","captureContext","parsedNumber","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","visited","WeakSet","toLocaleDateString","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","getRandomValues","Uint8Array","two","local","remote","isMountedRef","DateFns","ReactRouterDOM"],"sourceRoot":""}