{"version":3,"file":"main.10703843.js","mappings":"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AAWhjG,GAAO,CAAC,EACjE,CAACje,GAAMhD,EACPmkH,SAAUjkG,EAEd,C,cChCA,MA4EMokG,EAAa,CACjBnhG,KAAM,GACNg3D,KAAM,GACNC,IAAK,GACLnoC,MAAO,GACP26B,OAAQ,GACR7tD,KAAM,GACNmB,WAAY,EACZqkG,sBAAuB,EACvBtkG,YAAY,EACZukG,OAAO,EACPtxD,UAAMzhD,EACNpN,UAAMoN,EACNuvE,uBAAmBvvE,EACnB6uE,wBAAoB7uE,EACpByvE,4BAAwBzvE,EACxBgvE,8BAA0BhvE,EAC1BgzG,sBAAkBhzG,EAClBizG,sBAAkBjzG,EAClB0wE,oBAAgB1wE,EAChBopE,cAAUppE,EACVqpE,cAAUrpE,EACVspE,aAAStpE,EACT4X,eAAW5X,EACX+oE,gBAAY/oE,EACZkzG,YAAQlzG,EACRsoE,cAAUtoE,EACV09C,eAAW19C,EACXy9C,gBAAYz9C,EACZi0E,iBAAaj0E,EACb4e,YAAa,IAsEf,MAAMtQ,UAAc8a,IAAAA,MAClBC,mBACEC,KAAKC,UACH,QACA,SACA,OACA,aACA,YACA,OACA,OACA,MACA,QACA,OACA,SACA,WACA,WACA,UACA,YACA,WACA,aACA,WACA,SACA,YACA,OACA,cACA,aACA,cACA,YACA,oBACA,qBACA,yBACA,2BACA,cACA,YACA,SACA,cACA,WACA,mBACA,mBACA,iBACA,YACA,aACA,WACA,WACA,WACA,iBACA,kBACA,aACA,kBACA,YACA,wBACA,UACA,SACA,QAEJ,CAEAF,iBAAgBlrB,GASmB,IARjC1B,OAAQ02G,EAAS,WACjB/oG,EAAU,UACVqF,EAAS,QACT3G,EAAO,gBACPuW,EAAe,UACf+zF,EAAS,eACTC,GAAiB,EAAI,UACrB7U,GACergG,EACf,MAAM1B,EAAS02G,EAAUziG,QAAQ,IAAK,KAC/BnC,GAAS8kG,EACZ/kG,EAAMglG,QACHpiG,GA7H0BzO,KAAA,IAAC,MACpC8L,EAAK,OACL9R,EAAM,WACN2N,EAAU,UACVqF,GAMDhN,EAAA,OAAK8L,EAAM9R,SAAWA,GAAU8R,EAAMnE,aAAeA,GAA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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 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 Dropdown,\n DropdownItem,\n Icon,\n Search as WebsiteSearchComponent,\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\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","import React from 'react'\n\nimport { Button, Popover, PopoverTrigger, getExtendedDialogState, usePopoverState } 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 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 }: { state: any }) {\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 = state.unstable_referenceRef.current\n\n const popoverStyles = React.useMemo(() => {\n const newPopoverStyles: PopoverStylesType = {}\n if (!settingsButton || !chartElement) {\n return newPopoverStyles\n }\n const settingsButtonBoundingClientRect = settingsButton.getBoundingClientRect()\n const topOffset = settingsButtonBoundingClientRect.top + settingsButtonBoundingClientRect.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 newPopoverStyles.wrapper = {\n height: popoverContentHeight < chartHeight ? chartHeight : undefined,\n }\n\n return newPopoverStyles\n }, [settingsButton, chartElement, popoverContentElement])\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 [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { chartLayoutModel } = chartsModule.useChartLayoutGlobalModel()\n const settingsPopoverState = usePopoverState({ placement: placement ?? 'bottom-start' })\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} 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 {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 */\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, getFirstBarToRenderIndex, getLastBarToRenderIndex } 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 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, this.height]).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 (\n stepPrice > 10 ||\n (getIsSmallIndexChart(this.specificChartFunctionality) && Math.round(textTicks[0]).toString().length > 3) // if small index chart max tick is less than 999 (3 digits) allow for decimals in axis labels\n ) {\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 > this.height) continue\n if (y === this.height) y -= 1 // due pixel perfect rendering of lines, line on bottom edge 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: 5, right: 5, 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 let y = Math.round(this.fy(this.model.quote().prevClose))\n if (y === this.height) y -= 1 // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\n\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 this.data = this.model.quote()\n let min = Number.MAX_VALUE\n let max = Number.MIN_VALUE\n\n const firstBarToRenderIndex = getFirstBarToRenderIndex({\n leftOffset: this.model.leftOffset,\n scale: this.paneModel.scale,\n quote: this.data,\n })\n const lastBarToRenderIndex = getLastBarToRenderIndex({\n leftOffset: this.model.leftOffset,\n scale: this.paneModel.scale,\n quote: this.data,\n chartWidth: this.width,\n })\n const firstVisibleClose = this.data.close[firstBarToRenderIndex]\n\n for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\n min = Math.min(min, this.data.low[i])\n max = Math.max(max, this.data.high[i])\n }\n\n if (this.shouldShowPrevClose() && this.data.prevClose !== null) {\n min = Math.min(min, this.data.prevClose)\n max = Math.max(max, this.data.prevClose)\n }\n\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen && !this.model.dateRange) {\n min = Math.min(min, this.data.lastClose)\n max = Math.max(max, this.data.lastClose)\n }\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 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, getFirstBarToRenderIndex, getLastBarToRenderIndex } 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\n const firstBarToRenderIndex = getFirstBarToRenderIndex({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n })\n const lastBarToRenderIndex = getLastBarToRenderIndex({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n chartWidth: this.width,\n })\n\n for (const arr of arrays) {\n for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\n min = Math.min(min, arr[i])\n max = Math.max(max, arr[i])\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 { TextAlign, TextBaseline } from '../../constants/common'\nimport { FONT_SIZE, OFFSET, PADDING, SETTINGS_HEIGHT } 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 },\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 { TextAlign, TextBaseline } from '../../constants/common'\nimport { FONT_SIZE, OFFSET, PADDING, SETTINGS_HEIGHT } 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 },\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 { TextAlign, TextBaseline } from '../../constants/common'\nimport { FONT_SIZE, OFFSET, PADDING, SETTINGS_HEIGHT } 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 },\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 { TextAlign, TextBaseline } from '../../constants/common'\nimport { FONT_SIZE, OFFSET, PADDING, SETTINGS_HEIGHT } 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 },\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 { TextBaseline } from '../../constants/common'\nimport { CHART_MARGIN, FONT_SIZE, LINE_HEIGHT, OFFSET, PADDING, SETTINGS_HEIGHT } 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 },\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 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 === 7 ? minute >= 30 : hour >= 8\n const isClosed = hour >= 18\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 const calculatedIndex = quote.barToDataIndex[Math.max(barIndex, 0)]\n // not all the time there is bar present on barIndex calculated via inverted leftOffset\n // there might be a gap between bars, if there is, barToDataIndex on that gap spot will have value of\n // previous bar which isn't visible, because of that we need to check if that happend\n // and correct it if so by increasing calculated index by 1\n return scale.x(quote.barIndex[calculatedIndex]) + leftOffset >= 0 ? calculatedIndex : calculatedIndex + 1\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","BUTTON_POPOVER_GUTTER","SETTINGS_POPOVER_ID","ScrollableChartSettingsPopover","PreventClosingUnsavedChanges","isFullyClosed","getExtendedDialogState","chartElement","getElementById","popoverContentElement","settingsButton","unstable_referenceRef","popoverStyles","newPopoverStyles","settingsButtonBoundingClientRect","getBoundingClientRect","topOffset","top","height","maxHeight","innerHeight","position","scrollY","chartHeight","clientHeight","popoverContentHeight","offsetHeight","wrapper","checkForUnsavedChangesAndClose","Popover","popoverWrapperStyle","focusOnHide","hideOnClickOutside","onClose","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","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","contentHeight","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","firstBarToRenderIndex","getFirstBarToRenderIndex","lastBarToRenderIndex","getLastBarToRenderIndex","chartWidth","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","end1","asc1","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","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","start","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","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","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","calculatedIndex","_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":""}