diff --git a/README.md b/README.md
index 2c0b10cd67d..c573c650883 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+**Forked version of plotly.js with some hacks for use in Newcrom's products**
+
[](https://badge.fury.io/js/plotly.js)
diff --git a/lib/index-newcrom.d.ts b/lib/index-newcrom.d.ts
new file mode 100644
index 00000000000..4c0125eb92e
--- /dev/null
+++ b/lib/index-newcrom.d.ts
@@ -0,0 +1,2724 @@
+interface Navigator {
+ /***
+ * Exists only in Safari
+ */
+ standalone?: boolean;
+}
+
+interface Window {
+ ENV_APP_VERSION: string;
+}
+
+// Type definitions for plotly.js 2.12
+// Project: https://plot.ly/javascript/, https://github.com/plotly/plotly.js
+// Definitions by: Chris Gervang
+// Martin Duparc
+// Frederik Aalund
+// taoqf
+// Dadstart
+// Jared Szechy
+// Sooraj Pudiyadath
+// Jon Freedman
+// Megan Riel-Mehan
+// Josh Miles
+// Pramod Mathai
+// Michael Adams
+// Michael Arnett
+// Piotr Błażejewicz
+// Brandon Mitchell
+// Jessica Blizzard
+// Oleg Shilov
+// Pablo Gracia
+// Jeffrey van Gogh
+// John Abdou
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+import { BoxPlotData, BoxPlotMarker } from './lib/traces/box';
+import { CandlestickData } from './lib/traces/candlestick';
+import { OhlcData } from './lib/traces/ohlc';
+import { PieData } from './lib/traces/pie';
+import { SankeyData } from './lib/traces/sankey';
+import { ViolinData } from './lib/traces/violin';
+
+export as namespace Plotly;
+export { BoxPlotData, CandlestickData, OhlcData, PieData, SankeyData, ViolinData };
+
+export type DefaultIcons =
+ | 'undo'
+ | 'home'
+ | 'camera-retro'
+ | 'zoombox'
+ | 'pan'
+ | 'zoom_plus'
+ | 'zoom_minus'
+ | 'autoscale'
+ | 'tooltip_basic'
+ | 'tooltip_compare'
+ | 'plotlylogo'
+ | 'z-axis'
+ | '3d_rotate'
+ | 'camera'
+ | 'movie'
+ | 'question'
+ | 'disk'
+ | 'drawopenpath'
+ | 'drawclosedpath'
+ | 'lasso'
+ | 'selectbox'
+ | 'drawline'
+ | 'drawrect'
+ | 'drawcircle'
+ | 'eraseshape'
+ | 'spikeline'
+ | 'pencil'
+ | 'newplotlylogo';
+
+export const Icons: { [K in DefaultIcons]: Icon };
+
+export interface StaticPlots {
+ resize(root: Root): void;
+}
+
+export const Plots: StaticPlots;
+
+export interface Point {
+ x: number;
+ y: number;
+ z: number;
+}
+
+export interface PlotScatterDataPoint {
+ curveNumber: number;
+ data: PlotData;
+ pointIndex: number;
+ pointNumber: number;
+ x: number;
+ xaxis: LayoutAxis;
+ y: number;
+ yaxis: LayoutAxis;
+}
+
+export interface PlotDatum {
+ curveNumber: number;
+ data: PlotData;
+ customdata: Datum;
+ pointIndex: number;
+ pointNumber: number;
+ x: Datum;
+ xaxis: LayoutAxis;
+ y: Datum;
+ yaxis: LayoutAxis;
+ text: string;
+}
+
+export interface PlotMouseEvent {
+ points: PlotDatum[];
+ event: MouseEvent;
+}
+
+export interface PlotHoverEvent extends PlotMouseEvent {
+ xvals: Datum[];
+ yvals: Datum[];
+}
+
+export interface PlotCoordinate {
+ x: number;
+ y: number;
+ pointNumber: number;
+}
+
+export interface SelectionRange {
+ x: number[];
+ y: number[];
+}
+
+export type PlotSelectedData = Partial;
+
+export interface PlotSelectionEvent {
+ points: PlotDatum[];
+ range?: SelectionRange | undefined;
+ lassoPoints?: SelectionRange | undefined;
+}
+
+export interface PlotRestyleEventUpdate {
+ [key: string]: any;
+}
+
+export type PlotRestyleEvent = [PlotRestyleEventUpdate, number[]];
+
+export interface PlotScene {
+ center: Point;
+ eye: Point;
+ up: Point;
+}
+
+export interface PlotRelayoutEvent extends Partial {
+ 'xaxis.range[0]'?: number | undefined;
+ 'xaxis.range[1]'?: number | undefined;
+ 'yaxis.range[0]'?: number | undefined;
+ 'yaxis.range[1]'?: number | undefined;
+ 'xaxis.autorange'?: boolean | undefined;
+ 'yaxis.autorange'?: boolean | undefined;
+}
+
+export interface ClickAnnotationEvent {
+ index: number;
+ annotation: Annotations;
+ fullAnnotation: Annotations;
+ event: MouseEvent;
+}
+
+export interface FrameAnimationEvent {
+ name: string;
+ frame: Frame;
+ animation: {
+ frame: {
+ duration: number;
+ redraw: boolean;
+ };
+ transition: Transition;
+ };
+}
+
+export interface LegendClickEvent {
+ event: MouseEvent;
+ node: PlotlyHTMLElement;
+ curveNumber: number;
+ expandedIndex: number;
+ data: Data[];
+ layout: Partial;
+ frames: Frame[];
+ config: Partial;
+ fullData: Data[];
+ fullLayout: Partial;
+}
+
+export interface MapboxCenter {
+ lon: number;
+ lat: number;
+}
+
+export interface MapboxSymbol {
+ icon: string;
+ iconsize: number;
+ text: string;
+ placement: 'point' | 'line' | 'line-center';
+ textfont: Partial;
+ textposition:
+ | 'top left'
+ | 'top center'
+ | 'top right'
+ | 'middle center'
+ | 'bottom left'
+ | 'bottom center'
+ | 'bottom right';
+}
+export interface MapboxLayers {
+ visible: true;
+ sourcetype: 'geojson' | 'vecotr' | 'raster' | 'image';
+ source: number | string;
+ sourcelayer: string;
+ sourceattribution: string;
+ type: 'circle' | 'line' | 'fill' | 'symbol' | 'raster';
+ coordinates: number | string;
+ below: string;
+ color: Color;
+ opacity: number;
+ minzoom: number;
+ maxzoom: number;
+ circle: { radius: number };
+ line: Partial;
+ fill: { outlinecolor: Color };
+ symbol: Partial;
+ name: string;
+ templateitemname: string;
+}
+export interface Mapbox {
+ domain: Partial;
+ accesstoken: string;
+ style: number | string;
+ center: Partial;
+ zoom: number;
+ bearing: number;
+ pitch: number;
+ layers: Array>;
+ uirevision: number | string;
+ uid: string;
+}
+
+export interface SliderChangeEvent {
+ slider: Slider;
+ step: SliderStep;
+ interaction: boolean;
+ previousActive: number;
+}
+
+export interface SliderStartEvent {
+ slider: Slider;
+}
+
+export interface SliderEndEvent {
+ slider: Slider;
+ step: SliderStep;
+}
+
+export interface SunburstClickEvent {
+ event: MouseEvent;
+ nextLevel: string;
+ points: SunburstPlotDatum[];
+}
+
+export interface SunburstPlotDatum {
+ color: number;
+ curveNumber: number;
+ data: Data;
+ entry: string;
+ fullData: Data;
+ hovertext: string;
+ id: string;
+ label: string;
+ parent: string;
+ percentEntry: number;
+ percentParent: number;
+ percentRoot: number;
+ pointNumber: number;
+ root: string;
+ value: number;
+}
+
+export interface BeforePlotEvent {
+ data: Data[];
+ layout: Partial;
+ config: Partial;
+}
+
+export interface PlotlyHTMLElement extends HTMLElement {
+ on(event: 'plotly_click' | 'plotly_unhover', callback: (event: PlotMouseEvent) => void): void;
+ on(event: 'plotly_hover', callback: (event: PlotHoverEvent) => void): void;
+ on(
+ event: 'plotly_selecting' | 'plotly_selected',
+ callback: (event: PlotSelectionEvent) => void,
+ ): void;
+ on(event: 'plotly_restyle', callback: (data: PlotRestyleEvent) => void): void;
+ on(
+ event: 'plotly_relayout' | 'plotly_relayouting',
+ callback: (event: PlotRelayoutEvent) => void,
+ ): void;
+ on(event: 'plotly_clickannotation', callback: (event: ClickAnnotationEvent) => void): void;
+ on(event: 'plotly_animatingframe', callback: (event: FrameAnimationEvent) => void): void;
+ on(
+ event: 'plotly_legendclick' | 'plotly_legenddoubleclick',
+ callback: (event: LegendClickEvent) => boolean,
+ ): void;
+ on(event: 'plotly_sliderchange', callback: (event: SliderChangeEvent) => void): void;
+ on(event: 'plotly_sliderend', callback: (event: SliderEndEvent) => void): void;
+ on(event: 'plotly_sliderstart', callback: (event: SliderStartEvent) => void): void;
+ on(event: 'plotly_sunburstclick', callback: (event: SunburstClickEvent) => void): void;
+ on(event: 'plotly_event', callback: (data: any) => void): void;
+ on(event: 'plotly_beforeplot', callback: (event: BeforePlotEvent) => boolean): void;
+ on(
+ event:
+ | 'plotly_afterexport'
+ | 'plotly_afterplot'
+ | 'plotly_animated'
+ | 'plotly_animationinterrupted'
+ | 'plotly_autosize'
+ | 'plotly_beforeexport'
+ | 'plotly_deselect'
+ | 'plotly_doubleclick'
+ | 'plotly_framework'
+ | 'plotly_redraw'
+ | 'plotly_transitioning'
+ | 'plotly_transitioninterrupted',
+ callback: () => void,
+ ): void;
+ removeAllListeners: (handler: string) => void;
+ data: Data[];
+ layout: Layout;
+ /**
+ * !!! Modified: Fixed to use private field
+ */
+ _fullLayout: {
+ xaxis: {
+ p2d(point: number): number;
+ autorange: boolean;
+ },
+ yaxis: {
+ p2d(point: number): number;
+ autorange: boolean;
+ },
+ }
+}
+
+export interface ToImgopts {
+ format: 'jpeg' | 'png' | 'webp' | 'svg';
+ width: number;
+ height: number;
+ scale?: number | undefined;
+}
+
+export interface DownloadImgopts {
+ format: 'jpeg' | 'png' | 'webp' | 'svg';
+ width: number;
+ height: number;
+ filename: string;
+}
+
+export interface PolarLayout {
+ domain: Partial;
+ sector: number[];
+ hole: number;
+ bgcolor: Color;
+ radialaxis: Partial;
+ angularaxis: Partial;
+ gridshape: 'circular' | 'linear';
+ uirevision: string | number;
+ uid: string;
+}
+
+export interface PlotlyDataLayoutConfig {
+ data: Data[];
+ layout?: Partial;
+ config?: Partial;
+}
+
+export type Root = string | HTMLElement;
+
+export type RootOrData = Root | PlotlyDataLayoutConfig;
+
+export function newPlot(
+ root: Root,
+ data: Data[],
+ layout?: Partial,
+ config?: Partial,
+): Promise;
+export function relayout(root: Root, layout: Partial): Promise;
+export function redraw(root: Root): Promise;
+export function purge(root: Root): void;
+export function restyle(
+ root: Root,
+ aobj: Data,
+ traces?: number[] | number,
+): Promise;
+export function update(
+ root: Root,
+ traceUpdate: Data,
+ layoutUpdate: Partial,
+ traces?: number[] | number,
+): Promise;
+export function addTraces(
+ root: Root,
+ traces: Data | Data[],
+ newIndices?: number[] | number,
+): Promise;
+export function deleteTraces(root: Root, indices: number[] | number): Promise;
+export function moveTraces(
+ root: Root,
+ currentIndices: number[] | number,
+ newIndices?: number[] | number,
+): Promise;
+export function extendTraces(
+ root: Root,
+ update: Data | Data[],
+ indices: number | number[],
+ maxPoints?: number,
+): Promise;
+export function prependTraces(
+ root: Root,
+ update: Data | Data[],
+ indices: number | number[],
+): Promise;
+export function toImage(root: RootOrData, opts?: ToImgopts): Promise;
+export function downloadImage(root: RootOrData, opts: DownloadImgopts): Promise;
+export function react(
+ root: Root,
+ data: Data[],
+ layout?: Partial,
+ config?: Partial,
+ isForceUpdate?: boolean,
+ xAxisRange?: [x0: number, x1: number] | null
+): Promise;
+export function addFrames(root: Root, frames: Array>): Promise;
+export function deleteFrames(root: Root, frames: number[]): Promise;
+export function register(modules: PlotlyModule | PlotlyModule[]): void;
+export function zoom(
+ gd: PlotlyHTMLElement,
+ zoomBounds: ZoomBounds,
+): void;
+
+type ZoomBounds = {
+ x0: number;
+ x1: number;
+ y0: number;
+ y1: number;
+};
+
+
+// Layout
+export interface Layout {
+ colorway: string[];
+ title:
+ | string
+ | Partial<{
+ text: string;
+ font: Partial;
+ xref: 'container' | 'paper';
+ yref: 'container' | 'paper';
+ x: number;
+ y: number;
+ xanchor: 'auto' | 'left' | 'center' | 'right';
+ yanchor: 'auto' | 'top' | 'middle' | 'bottom';
+ pad: Partial;
+ }>;
+ titlefont: Partial;
+ autosize: boolean;
+ showlegend: boolean;
+ paper_bgcolor: Color;
+ plot_bgcolor: Color;
+ separators: string;
+ hidesources: boolean;
+ xaxis: Partial;
+ xaxis2: Partial;
+ xaxis3: Partial;
+ xaxis4: Partial;
+ xaxis5: Partial;
+ xaxis6: Partial;
+ xaxis7: Partial;
+ xaxis8: Partial;
+ xaxis9: Partial;
+ yaxis: Partial;
+ yaxis2: Partial;
+ yaxis3: Partial;
+ yaxis4: Partial;
+ yaxis5: Partial;
+ yaxis6: Partial;
+ yaxis7: Partial;
+ yaxis8: Partial;
+ yaxis9: Partial;
+ margin: Partial;
+ height: number;
+ width: number;
+ hovermode: 'closest' | 'x' | 'y' | 'x unified' | 'y unified' | false;
+ hoverdistance: number;
+ hoverlabel: Partial;
+ calendar: Calendar;
+ 'xaxis.range': [Datum, Datum];
+ 'xaxis.range[0]': Datum;
+ 'xaxis.range[1]': Datum;
+ 'yaxis.range': [Datum, Datum];
+ 'yaxis.range[0]': Datum;
+ 'yaxis.range[1]': Datum;
+ 'yaxis.type': AxisType;
+ 'xaxis.type': AxisType;
+ 'xaxis.autorange': boolean;
+ 'yaxis.autorange': boolean;
+ 'xaxis.title': string;
+ 'yaxis.title': string;
+ ternary: {}; // TODO
+ geo: {}; // TODO
+ mapbox: Partial;
+ subplot: string;
+ radialaxis: Partial;
+ angularaxis: {}; // TODO
+ dragmode: 'zoom' | 'pan' | 'select' | 'lasso' | 'orbit' | 'turntable' | false;
+ orientation: number;
+ annotations: Array>;
+ shapes: Array>;
+ images: Array>;
+ updatemenus: Array>;
+ sliders: Array>;
+ legend: Partial