{"version":3,"file":"static/js/5633.1a5856e3.js","mappings":"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","sources":["../node_modules/plotly.js/src/components/rangeselector/attributes.js","../node_modules/plotly.js/src/components/rangeselector/constants.js","../node_modules/plotly.js/src/components/rangeselector/defaults.js","../node_modules/plotly.js/src/components/rangeselector/draw.js","../node_modules/plotly.js/src/components/rangeselector/get_update_object.js","../node_modules/plotly.js/src/components/rangeselector/index.js","../node_modules/plotly.js/src/components/rangeslider/attributes.js","../node_modules/plotly.js/src/components/rangeslider/calc_autorange.js","../node_modules/plotly.js/src/components/rangeslider/constants.js","../node_modules/plotly.js/src/components/rangeslider/defaults.js","../node_modules/plotly.js/src/components/rangeslider/draw.js","../node_modules/plotly.js/src/components/rangeslider/helpers.js","../node_modules/plotly.js/src/components/rangeslider/index.js","../node_modules/plotly.js/src/components/rangeslider/oppaxis_attributes.js","../node_modules/plotly.js/src/components/selections/attributes.js","../node_modules/plotly.js/src/components/selections/constants.js","../node_modules/plotly.js/src/components/selections/defaults.js","../node_modules/plotly.js/src/components/selections/draw.js","../node_modules/plotly.js/src/components/selections/draw_newselection/attributes.js","../node_modules/plotly.js/src/components/selections/draw_newselection/defaults.js","../node_modules/plotly.js/src/components/selections/draw_newselection/newselections.js","../node_modules/plotly.js/src/components/selections/helpers.js","../node_modules/plotly.js/src/components/selections/index.js","../node_modules/plotly.js/src/components/selections/select.js","../node_modules/plotly.js/src/components/shapes/attributes.js","../node_modules/plotly.js/src/components/shapes/calc_autorange.js","../node_modules/plotly.js/src/components/shapes/constants.js","../node_modules/plotly.js/src/components/shapes/defaults.js","../node_modules/plotly.js/src/components/shapes/display_labels.js","../node_modules/plotly.js/src/components/shapes/display_outlines.js","../node_modules/plotly.js/src/components/shapes/draw.js","../node_modules/plotly.js/src/components/shapes/draw_newshape/attributes.js","../node_modules/plotly.js/src/components/shapes/draw_newshape/constants.js","../node_modules/plotly.js/src/components/shapes/draw_newshape/defaults.js","../node_modules/plotly.js/src/components/shapes/draw_newshape/helpers.js","../node_modules/plotly.js/src/components/shapes/draw_newshape/newshapes.js","../node_modules/plotly.js/src/components/shapes/handle_outline.js","../node_modules/plotly.js/src/components/shapes/helpers.js","../node_modules/plotly.js/src/components/shapes/index.js","../node_modules/plotly.js/src/components/shapes/label_texttemplate.js","../node_modules/plotly.js/src/components/sliders/attributes.js","../node_modules/plotly.js/src/components/sliders/constants.js","../node_modules/plotly.js/src/components/sliders/defaults.js","../node_modules/plotly.js/src/components/sliders/draw.js","../node_modules/plotly.js/src/components/sliders/index.js","../node_modules/plotly.js/src/components/titles/index.js","../node_modules/plotly.js/src/components/updatemenus/attributes.js","../node_modules/plotly.js/src/components/updatemenus/constants.js","../node_modules/plotly.js/src/components/updatemenus/defaults.js","../node_modules/plotly.js/src/components/updatemenus/draw.js","../node_modules/plotly.js/src/components/updatemenus/index.js","../node_modules/plotly.js/src/components/updatemenus/scrollbox.js","../node_modules/plotly.js/src/constants/alignment.js","../node_modules/plotly.js/src/constants/axis_placeable_objects.js","../node_modules/plotly.js/src/constants/docs.js","../node_modules/plotly.js/src/constants/interactions.js","../node_modules/plotly.js/src/constants/numerical.js","../node_modules/plotly.js/src/constants/pixelated_image.js","../node_modules/plotly.js/src/constants/xmlns_namespaces.js"],"sourcesContent":["'use strict';\n\nvar fontAttrs = require('../../plots/font_attributes');\nvar colorAttrs = require('../color/attributes');\nvar templatedArray = require('../../plot_api/plot_template').templatedArray;\n\nvar buttonAttrs = templatedArray('button', {\n visible: {\n valType: 'boolean',\n dflt: true,\n editType: 'plot',\n description: 'Determines whether or not this button is visible.'\n },\n step: {\n valType: 'enumerated',\n values: ['month', 'year', 'day', 'hour', 'minute', 'second', 'all'],\n dflt: 'month',\n editType: 'plot',\n description: [\n 'The unit of measurement that the `count` value will set the range by.'\n ].join(' ')\n },\n stepmode: {\n valType: 'enumerated',\n values: ['backward', 'todate'],\n dflt: 'backward',\n editType: 'plot',\n description: [\n 'Sets the range update mode.',\n 'If *backward*, the range update shifts the start of range',\n 'back *count* times *step* milliseconds.',\n 'If *todate*, the range update shifts the start of range',\n 'back to the first timestamp from *count* times',\n '*step* milliseconds back.',\n 'For example, with `step` set to *year* and `count` set to *1*',\n 'the range update shifts the start of the range back to',\n 'January 01 of the current year.',\n 'Month and year *todate* are currently available only',\n 'for the built-in (Gregorian) calendar.'\n ].join(' ')\n },\n count: {\n valType: 'number',\n min: 0,\n dflt: 1,\n editType: 'plot',\n description: [\n 'Sets the number of steps to take to update the range.',\n 'Use with `step` to specify the update interval.'\n ].join(' ')\n },\n label: {\n valType: 'string',\n editType: 'plot',\n description: 'Sets the text label to appear on the button.'\n },\n editType: 'plot',\n description: [\n 'Sets the specifications for each buttons.',\n 'By default, a range selector comes with no buttons.'\n ].join(' ')\n});\n\nmodule.exports = {\n visible: {\n valType: 'boolean',\n editType: 'plot',\n description: [\n 'Determines whether or not this range selector is visible.',\n 'Note that range selectors are only available for x axes of',\n '`type` set to or auto-typed to *date*.'\n ].join(' ')\n },\n\n buttons: buttonAttrs,\n\n x: {\n valType: 'number',\n min: -2,\n max: 3,\n editType: 'plot',\n description: 'Sets the x position (in normalized coordinates) of the range selector.'\n },\n xanchor: {\n valType: 'enumerated',\n values: ['auto', 'left', 'center', 'right'],\n dflt: 'left',\n editType: 'plot',\n description: [\n 'Sets the range selector\\'s horizontal position anchor.',\n 'This anchor binds the `x` position to the *left*, *center*',\n 'or *right* of the range selector.'\n ].join(' ')\n },\n y: {\n valType: 'number',\n min: -2,\n max: 3,\n editType: 'plot',\n description: 'Sets the y position (in normalized coordinates) of the range selector.'\n },\n yanchor: {\n valType: 'enumerated',\n values: ['auto', 'top', 'middle', 'bottom'],\n dflt: 'bottom',\n editType: 'plot',\n description: [\n 'Sets the range selector\\'s vertical position anchor',\n 'This anchor binds the `y` position to the *top*, *middle*',\n 'or *bottom* of the range selector.'\n ].join(' ')\n },\n\n font: fontAttrs({\n editType: 'plot',\n description: 'Sets the font of the range selector button text.'\n }),\n\n bgcolor: {\n valType: 'color',\n dflt: colorAttrs.lightLine,\n editType: 'plot',\n description: 'Sets the background color of the range selector buttons.'\n },\n activecolor: {\n valType: 'color',\n editType: 'plot',\n description: 'Sets the background color of the active range selector button.'\n },\n bordercolor: {\n valType: 'color',\n dflt: colorAttrs.defaultLine,\n editType: 'plot',\n description: 'Sets the color of the border enclosing the range selector.'\n },\n borderwidth: {\n valType: 'number',\n min: 0,\n dflt: 0,\n editType: 'plot',\n description: 'Sets the width (in px) of the border enclosing the range selector.'\n },\n editType: 'plot'\n};\n","'use strict';\n\n\nmodule.exports = {\n\n // 'y' position pad above counter axis domain\n yPad: 0.02,\n\n // minimum button width (regardless of text size)\n minButtonWidth: 30,\n\n // buttons rect radii\n rx: 3,\n ry: 3,\n\n // light fraction used to compute the 'activecolor' default\n lightAmount: 25,\n darkAmount: 10\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Color = require('../color');\nvar Template = require('../../plot_api/plot_template');\nvar handleArrayContainerDefaults = require('../../plots/array_container_defaults');\n\nvar attributes = require('./attributes');\nvar constants = require('./constants');\n\n\nmodule.exports = function handleDefaults(containerIn, containerOut, layout, counterAxes, calendar) {\n var selectorIn = containerIn.rangeselector || {};\n var selectorOut = Template.newContainer(containerOut, 'rangeselector');\n\n function coerce(attr, dflt) {\n return Lib.coerce(selectorIn, selectorOut, attributes, attr, dflt);\n }\n\n var buttons = handleArrayContainerDefaults(selectorIn, selectorOut, {\n name: 'buttons',\n handleItemDefaults: buttonDefaults,\n calendar: calendar\n });\n\n var visible = coerce('visible', buttons.length > 0);\n if(visible) {\n var posDflt = getPosDflt(containerOut, layout, counterAxes);\n coerce('x', posDflt[0]);\n coerce('y', posDflt[1]);\n Lib.noneOrAll(containerIn, containerOut, ['x', 'y']);\n\n coerce('xanchor');\n coerce('yanchor');\n\n Lib.coerceFont(coerce, 'font', layout.font);\n\n var bgColor = coerce('bgcolor');\n coerce('activecolor', Color.contrast(bgColor, constants.lightAmount, constants.darkAmount));\n coerce('bordercolor');\n coerce('borderwidth');\n }\n};\n\nfunction buttonDefaults(buttonIn, buttonOut, selectorOut, opts) {\n var calendar = opts.calendar;\n\n function coerce(attr, dflt) {\n return Lib.coerce(buttonIn, buttonOut, attributes.buttons, attr, dflt);\n }\n\n var visible = coerce('visible');\n\n if(visible) {\n var step = coerce('step');\n if(step !== 'all') {\n if(calendar && calendar !== 'gregorian' && (step === 'month' || step === 'year')) {\n buttonOut.stepmode = 'backward';\n } else {\n coerce('stepmode');\n }\n\n coerce('count');\n }\n\n coerce('label');\n }\n}\n\nfunction getPosDflt(containerOut, layout, counterAxes) {\n var anchoredList = counterAxes.filter(function(ax) {\n return layout[ax].anchor === containerOut._id;\n });\n\n var posY = 0;\n for(var i = 0; i < anchoredList.length; i++) {\n var domain = layout[anchoredList[i]].domain;\n if(domain) posY = Math.max(domain[1], posY);\n }\n\n return [containerOut.domain[0], posY + constants.yPad];\n}\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nvar Registry = require('../../registry');\nvar Plots = require('../../plots/plots');\nvar Color = require('../color');\nvar Drawing = require('../drawing');\nvar Lib = require('../../lib');\nvar strTranslate = Lib.strTranslate;\nvar svgTextUtils = require('../../lib/svg_text_utils');\nvar axisIds = require('../../plots/cartesian/axis_ids');\n\nvar alignmentConstants = require('../../constants/alignment');\nvar LINE_SPACING = alignmentConstants.LINE_SPACING;\nvar FROM_TL = alignmentConstants.FROM_TL;\nvar FROM_BR = alignmentConstants.FROM_BR;\n\nvar constants = require('./constants');\nvar getUpdateObject = require('./get_update_object');\n\nmodule.exports = function draw(gd) {\n var fullLayout = gd._fullLayout;\n\n var selectors = fullLayout._infolayer.selectAll('.rangeselector')\n .data(makeSelectorData(gd), selectorKeyFunc);\n\n selectors.enter().append('g')\n .classed('rangeselector', true);\n\n selectors.exit().remove();\n\n selectors.style({\n cursor: 'pointer',\n 'pointer-events': 'all'\n });\n\n selectors.each(function(d) {\n var selector = d3.select(this);\n var axisLayout = d;\n var selectorLayout = axisLayout.rangeselector;\n\n var buttons = selector.selectAll('g.button')\n .data(Lib.filterVisible(selectorLayout.buttons));\n\n buttons.enter().append('g')\n .classed('button', true);\n\n buttons.exit().remove();\n\n buttons.each(function(d) {\n var button = d3.select(this);\n var update = getUpdateObject(axisLayout, d);\n\n d._isActive = isActive(axisLayout, d, update);\n\n button.call(drawButtonRect, selectorLayout, d);\n button.call(drawButtonText, selectorLayout, d, gd);\n\n button.on('click', function() {\n if(gd._dragged) return;\n\n Registry.call('_guiRelayout', gd, update);\n });\n\n button.on('mouseover', function() {\n d._isHovered = true;\n button.call(drawButtonRect, selectorLayout, d);\n });\n\n button.on('mouseout', function() {\n d._isHovered = false;\n button.call(drawButtonRect, selectorLayout, d);\n });\n });\n\n reposition(gd, buttons, selectorLayout, axisLayout._name, selector);\n });\n};\n\nfunction makeSelectorData(gd) {\n var axes = axisIds.list(gd, 'x', true);\n var data = [];\n\n for(var i = 0; i < axes.length; i++) {\n var axis = axes[i];\n\n if(axis.rangeselector && axis.rangeselector.visible) {\n data.push(axis);\n }\n }\n\n return data;\n}\n\nfunction selectorKeyFunc(d) {\n return d._id;\n}\n\nfunction isActive(axisLayout, opts, update) {\n if(opts.step === 'all') {\n return axisLayout.autorange === true;\n } else {\n var keys = Object.keys(update);\n\n return (\n axisLayout.range[0] === update[keys[0]] &&\n axisLayout.range[1] === update[keys[1]]\n );\n }\n}\n\nfunction drawButtonRect(button, selectorLayout, d) {\n var rect = Lib.ensureSingle(button, 'rect', 'selector-rect', function(s) {\n s.attr('shape-rendering', 'crispEdges');\n });\n\n rect.attr({\n rx: constants.rx,\n ry: constants.ry\n });\n\n rect.call(Color.stroke, selectorLayout.bordercolor)\n .call(Color.fill, getFillColor(selectorLayout, d))\n .style('stroke-width', selectorLayout.borderwidth + 'px');\n}\n\nfunction getFillColor(selectorLayout, d) {\n return (d._isActive || d._isHovered) ?\n selectorLayout.activecolor :\n selectorLayout.bgcolor;\n}\n\nfunction drawButtonText(button, selectorLayout, d, gd) {\n function textLayout(s) {\n svgTextUtils.convertToTspans(s, gd);\n }\n\n var text = Lib.ensureSingle(button, 'text', 'selector-text', function(s) {\n s.attr('text-anchor', 'middle');\n });\n\n text.call(Drawing.font, selectorLayout.font)\n .text(getLabel(d, gd._fullLayout._meta))\n .call(textLayout);\n}\n\nfunction getLabel(opts, _meta) {\n if(opts.label) {\n return _meta ?\n Lib.templateString(opts.label, _meta) :\n opts.label;\n }\n\n if(opts.step === 'all') return 'all';\n\n return opts.count + opts.step.charAt(0);\n}\n\nfunction reposition(gd, buttons, opts, axName, selector) {\n var width = 0;\n var height = 0;\n\n var borderWidth = opts.borderwidth;\n\n buttons.each(function() {\n var button = d3.select(this);\n var text = button.select('.selector-text');\n\n var tHeight = opts.font.size * LINE_SPACING;\n var hEff = Math.max(tHeight * svgTextUtils.lineCount(text), 16) + 3;\n\n height = Math.max(height, hEff);\n });\n\n buttons.each(function() {\n var button = d3.select(this);\n var rect = button.select('.selector-rect');\n var text = button.select('.selector-text');\n\n var tWidth = text.node() && Drawing.bBox(text.node()).width;\n var tHeight = opts.font.size * LINE_SPACING;\n var tLines = svgTextUtils.lineCount(text);\n\n var wEff = Math.max(tWidth + 10, constants.minButtonWidth);\n\n // TODO add MathJax support\n\n // TODO add buttongap attribute\n\n button.attr('transform', strTranslate(borderWidth + width, borderWidth));\n\n rect.attr({\n x: 0,\n y: 0,\n width: wEff,\n height: height\n });\n\n svgTextUtils.positionText(text, wEff / 2,\n height / 2 - ((tLines - 1) * tHeight / 2) + 3);\n\n width += wEff + 5;\n });\n\n var graphSize = gd._fullLayout._size;\n var lx = graphSize.l + graphSize.w * opts.x;\n var ly = graphSize.t + graphSize.h * (1 - opts.y);\n\n var xanchor = 'left';\n if(Lib.isRightAnchor(opts)) {\n lx -= width;\n xanchor = 'right';\n }\n if(Lib.isCenterAnchor(opts)) {\n lx -= width / 2;\n xanchor = 'center';\n }\n\n var yanchor = 'top';\n if(Lib.isBottomAnchor(opts)) {\n ly -= height;\n yanchor = 'bottom';\n }\n if(Lib.isMiddleAnchor(opts)) {\n ly -= height / 2;\n yanchor = 'middle';\n }\n\n width = Math.ceil(width);\n height = Math.ceil(height);\n lx = Math.round(lx);\n ly = Math.round(ly);\n\n Plots.autoMargin(gd, axName + '-range-selector', {\n x: opts.x,\n y: opts.y,\n l: width * FROM_TL[xanchor],\n r: width * FROM_BR[xanchor],\n b: height * FROM_BR[yanchor],\n t: height * FROM_TL[yanchor]\n });\n\n selector.attr('transform', strTranslate(lx, ly));\n}\n","'use strict';\n\nvar d3Time = require('d3-time');\nvar titleCase = require('../../lib').titleCase;\n\nmodule.exports = function getUpdateObject(axisLayout, buttonLayout) {\n var axName = axisLayout._name;\n var update = {};\n\n if(buttonLayout.step === 'all') {\n update[axName + '.autorange'] = true;\n } else {\n var xrange = getXRange(axisLayout, buttonLayout);\n\n update[axName + '.range[0]'] = xrange[0];\n update[axName + '.range[1]'] = xrange[1];\n }\n\n return update;\n};\n\nfunction getXRange(axisLayout, buttonLayout) {\n var currentRange = axisLayout.range;\n var base = new Date(axisLayout.r2l(currentRange[1]));\n var step = buttonLayout.step;\n\n var utcStep = d3Time['utc' + titleCase(step)];\n\n var count = buttonLayout.count;\n var range0;\n\n switch(buttonLayout.stepmode) {\n case 'backward':\n range0 = axisLayout.l2r(+utcStep.offset(base, -count));\n break;\n\n case 'todate':\n var base2 = utcStep.offset(base, -count);\n\n range0 = axisLayout.l2r(+utcStep.ceil(base2));\n break;\n }\n\n var range1 = currentRange[1];\n\n return [range0, range1];\n}\n","'use strict';\n\nmodule.exports = {\n moduleType: 'component',\n name: 'rangeselector',\n\n schema: {\n subplots: {\n xaxis: {rangeselector: require('./attributes')}\n }\n },\n\n layoutAttributes: require('./attributes'),\n handleDefaults: require('./defaults'),\n\n draw: require('./draw')\n};\n","'use strict';\n\nvar colorAttributes = require('../color/attributes');\n\nmodule.exports = {\n bgcolor: {\n valType: 'color',\n dflt: colorAttributes.background,\n editType: 'plot',\n description: 'Sets the background color of the range slider.'\n },\n bordercolor: {\n valType: 'color',\n dflt: colorAttributes.defaultLine,\n editType: 'plot',\n description: 'Sets the border color of the range slider.'\n },\n borderwidth: {\n valType: 'integer',\n dflt: 0,\n min: 0,\n editType: 'plot',\n description: 'Sets the border width of the range slider.'\n },\n autorange: {\n valType: 'boolean',\n dflt: true,\n editType: 'calc',\n impliedEdits: {'range[0]': undefined, 'range[1]': undefined},\n description: [\n 'Determines whether or not the range slider range is',\n 'computed in relation to the input data.',\n 'If `range` is provided, then `autorange` is set to *false*.'\n ].join(' ')\n },\n range: {\n valType: 'info_array',\n items: [\n {valType: 'any', editType: 'calc', impliedEdits: {'^autorange': false}},\n {valType: 'any', editType: 'calc', impliedEdits: {'^autorange': false}}\n ],\n editType: 'calc',\n impliedEdits: {autorange: false},\n description: [\n 'Sets the range of the range slider.',\n 'If not set, defaults to the full xaxis range.',\n 'If the axis `type` is *log*, then you must take the',\n 'log of your desired range.',\n 'If the axis `type` is *date*, it should be date strings,',\n 'like date data, though Date objects and unix milliseconds',\n 'will be accepted and converted to strings.',\n 'If the axis `type` is *category*, it should be numbers,',\n 'using the scale where each category is assigned a serial',\n 'number from zero in the order it appears.'\n ].join(' ')\n },\n thickness: {\n valType: 'number',\n dflt: 0.15,\n min: 0,\n max: 1,\n editType: 'plot',\n description: [\n 'The height of the range slider as a fraction of the',\n 'total plot area height.'\n ].join(' ')\n },\n visible: {\n valType: 'boolean',\n dflt: true,\n editType: 'calc',\n description: [\n 'Determines whether or not the range slider will be visible.',\n 'If visible, perpendicular axes will be set to `fixedrange`'\n ].join(' ')\n },\n editType: 'calc'\n};\n","'use strict';\n\nvar listAxes = require('../../plots/cartesian/axis_ids').list;\nvar getAutoRange = require('../../plots/cartesian/autorange').getAutoRange;\nvar constants = require('./constants');\n\nmodule.exports = function calcAutorange(gd) {\n var axes = listAxes(gd, 'x', true);\n\n // Compute new slider range using axis autorange if necessary.\n //\n // Copy back range to input range slider container to skip\n // this step in subsequent draw calls.\n\n for(var i = 0; i < axes.length; i++) {\n var ax = axes[i];\n var opts = ax[constants.name];\n\n if(opts && opts.visible && opts.autorange) {\n opts._input.autorange = true;\n opts._input.range = opts.range = getAutoRange(gd, ax);\n }\n }\n};\n","'use strict';\n\nmodule.exports = {\n\n // attribute container name\n name: 'rangeslider',\n\n // class names\n\n containerClassName: 'rangeslider-container',\n bgClassName: 'rangeslider-bg',\n rangePlotClassName: 'rangeslider-rangeplot',\n\n maskMinClassName: 'rangeslider-mask-min',\n maskMaxClassName: 'rangeslider-mask-max',\n slideBoxClassName: 'rangeslider-slidebox',\n\n grabberMinClassName: 'rangeslider-grabber-min',\n grabAreaMinClassName: 'rangeslider-grabarea-min',\n handleMinClassName: 'rangeslider-handle-min',\n\n grabberMaxClassName: 'rangeslider-grabber-max',\n grabAreaMaxClassName: 'rangeslider-grabarea-max',\n handleMaxClassName: 'rangeslider-handle-max',\n\n maskMinOppAxisClassName: 'rangeslider-mask-min-opp-axis',\n maskMaxOppAxisClassName: 'rangeslider-mask-max-opp-axis',\n\n // style constants\n\n maskColor: 'rgba(0,0,0,0.4)',\n maskOppAxisColor: 'rgba(0,0,0,0.2)',\n\n slideBoxFill: 'transparent',\n slideBoxCursor: 'ew-resize',\n\n grabAreaFill: 'transparent',\n grabAreaCursor: 'col-resize',\n grabAreaWidth: 10,\n\n handleWidth: 4,\n handleRadius: 1,\n handleStrokeWidth: 1,\n\n extraPad: 15\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Template = require('../../plot_api/plot_template');\nvar axisIds = require('../../plots/cartesian/axis_ids');\n\nvar attributes = require('./attributes');\nvar oppAxisAttrs = require('./oppaxis_attributes');\n\nmodule.exports = function handleDefaults(layoutIn, layoutOut, axName) {\n var axIn = layoutIn[axName];\n var axOut = layoutOut[axName];\n\n if(!(axIn.rangeslider || layoutOut._requestRangeslider[axOut._id])) return;\n\n // not super proud of this (maybe store _ in axis object instead\n if(!Lib.isPlainObject(axIn.rangeslider)) {\n axIn.rangeslider = {};\n }\n\n var containerIn = axIn.rangeslider;\n var containerOut = Template.newContainer(axOut, 'rangeslider');\n\n function coerce(attr, dflt) {\n return Lib.coerce(containerIn, containerOut, attributes, attr, dflt);\n }\n\n var rangeContainerIn, rangeContainerOut;\n function coerceRange(attr, dflt) {\n return Lib.coerce(rangeContainerIn, rangeContainerOut, oppAxisAttrs, attr, dflt);\n }\n\n var visible = coerce('visible');\n if(!visible) return;\n\n coerce('bgcolor', layoutOut.plot_bgcolor);\n coerce('bordercolor');\n coerce('borderwidth');\n coerce('thickness');\n\n coerce('autorange', !axOut.isValidRange(containerIn.range));\n coerce('range');\n\n var subplots = layoutOut._subplots;\n if(subplots) {\n var yIds = subplots.cartesian\n .filter(function(subplotId) {\n return subplotId.substr(0, subplotId.indexOf('y')) === axisIds.name2id(axName);\n })\n .map(function(subplotId) {\n return subplotId.substr(subplotId.indexOf('y'), subplotId.length);\n });\n var yNames = Lib.simpleMap(yIds, axisIds.id2name);\n for(var i = 0; i < yNames.length; i++) {\n var yName = yNames[i];\n\n rangeContainerIn = containerIn[yName] || {};\n rangeContainerOut = Template.newContainer(containerOut, yName, 'yaxis');\n\n var yAxOut = layoutOut[yName];\n\n var rangemodeDflt;\n if(rangeContainerIn.range && yAxOut.isValidRange(rangeContainerIn.range)) {\n rangemodeDflt = 'fixed';\n }\n\n var rangeMode = coerceRange('rangemode', rangemodeDflt);\n if(rangeMode !== 'match') {\n coerceRange('range', yAxOut.range.slice());\n }\n }\n }\n\n // to map back range slider (auto) range\n containerOut._input = containerIn;\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nvar Registry = require('../../registry');\nvar Plots = require('../../plots/plots');\n\nvar Lib = require('../../lib');\nvar strTranslate = Lib.strTranslate;\nvar Drawing = require('../drawing');\nvar Color = require('../color');\nvar Titles = require('../titles');\n\nvar Cartesian = require('../../plots/cartesian');\nvar axisIDs = require('../../plots/cartesian/axis_ids');\n\nvar dragElement = require('../dragelement');\nvar setCursor = require('../../lib/setcursor');\n\nvar constants = require('./constants');\n\nmodule.exports = function(gd) {\n var fullLayout = gd._fullLayout;\n var rangeSliderData = fullLayout._rangeSliderData;\n for(var i = 0; i < rangeSliderData.length; i++) {\n var opts = rangeSliderData[i][constants.name];\n // fullLayout._uid may not exist when we call makeData\n opts._clipId = opts._id + '-' + fullLayout._uid;\n }\n\n /*\n * \n * \n * < .... range plot />\n * \n * \n * \n * \n * \n * \n * \n * \n * \n *\n * ...\n */\n\n function keyFunction(axisOpts) {\n return axisOpts._name;\n }\n\n var rangeSliders = fullLayout._infolayer\n .selectAll('g.' + constants.containerClassName)\n .data(rangeSliderData, keyFunction);\n\n // remove exiting sliders and their corresponding clip paths\n rangeSliders.exit().each(function(axisOpts) {\n var opts = axisOpts[constants.name];\n fullLayout._topdefs.select('#' + opts._clipId).remove();\n }).remove();\n\n // return early if no range slider is visible\n if(rangeSliderData.length === 0) return;\n\n rangeSliders.enter().append('g')\n .classed(constants.containerClassName, true)\n .attr('pointer-events', 'all');\n\n // for all present range sliders\n rangeSliders.each(function(axisOpts) {\n var rangeSlider = d3.select(this);\n var opts = axisOpts[constants.name];\n var oppAxisOpts = fullLayout[axisIDs.id2name(axisOpts.anchor)];\n var oppAxisRangeOpts = opts[axisIDs.id2name(axisOpts.anchor)];\n\n // update range\n // Expand slider range to the axis range\n if(opts.range) {\n var rng = Lib.simpleMap(opts.range, axisOpts.r2l);\n var axRng = Lib.simpleMap(axisOpts.range, axisOpts.r2l);\n var newRng;\n\n if(axRng[0] < axRng[1]) {\n newRng = [\n Math.min(rng[0], axRng[0]),\n Math.max(rng[1], axRng[1])\n ];\n } else {\n newRng = [\n Math.max(rng[0], axRng[0]),\n Math.min(rng[1], axRng[1])\n ];\n }\n\n opts.range = opts._input.range = Lib.simpleMap(newRng, axisOpts.l2r);\n }\n\n axisOpts.cleanRange('rangeslider.range');\n\n // update range slider dimensions\n\n var gs = fullLayout._size;\n var domain = axisOpts.domain;\n\n opts._width = gs.w * (domain[1] - domain[0]);\n\n var x = Math.round(gs.l + (gs.w * domain[0]));\n\n var y = Math.round(\n gs.t + gs.h * (1 - axisOpts._counterDomainMin) +\n (axisOpts.side === 'bottom' ? axisOpts._depth : 0) +\n opts._offsetShift + constants.extraPad\n );\n\n rangeSlider.attr('transform', strTranslate(x, y));\n\n // update data <--> pixel coordinate conversion methods\n\n opts._rl = Lib.simpleMap(opts.range, axisOpts.r2l);\n var rl0 = opts._rl[0];\n var rl1 = opts._rl[1];\n var drl = rl1 - rl0;\n\n opts.p2d = function(v) {\n return (v / opts._width) * drl + rl0;\n };\n\n opts.d2p = function(v) {\n return (v - rl0) / drl * opts._width;\n };\n\n if(axisOpts.rangebreaks) {\n var rsBreaks = axisOpts.locateBreaks(rl0, rl1);\n\n if(rsBreaks.length) {\n var j, brk;\n\n var lBreaks = 0;\n for(j = 0; j < rsBreaks.length; j++) {\n brk = rsBreaks[j];\n lBreaks += (brk.max - brk.min);\n }\n\n // TODO fix for reversed-range axes !!!\n\n // compute slope and piecewise offsets\n var m2 = opts._width / (rl1 - rl0 - lBreaks);\n var _B = [-m2 * rl0];\n for(j = 0; j < rsBreaks.length; j++) {\n brk = rsBreaks[j];\n _B.push(_B[_B.length - 1] - m2 * (brk.max - brk.min));\n }\n\n opts.d2p = function(v) {\n var b = _B[0];\n for(var j = 0; j < rsBreaks.length; j++) {\n var brk = rsBreaks[j];\n if(v >= brk.max) b = _B[j + 1];\n else if(v < brk.min) break;\n }\n return b + m2 * v;\n };\n\n // fill pixel (i.e. 'p') min/max here,\n // to not have to loop through the _rangebreaks twice during `p2d`\n for(j = 0; j < rsBreaks.length; j++) {\n brk = rsBreaks[j];\n brk.pmin = opts.d2p(brk.min);\n brk.pmax = opts.d2p(brk.max);\n }\n\n opts.p2d = function(v) {\n var b = _B[0];\n for(var j = 0; j < rsBreaks.length; j++) {\n var brk = rsBreaks[j];\n if(v >= brk.pmax) b = _B[j + 1];\n else if(v < brk.pmin) break;\n }\n return (v - b) / m2;\n };\n }\n }\n\n if(oppAxisRangeOpts.rangemode !== 'match') {\n var range0OppAxis = oppAxisOpts.r2l(oppAxisRangeOpts.range[0]);\n var range1OppAxis = oppAxisOpts.r2l(oppAxisRangeOpts.range[1]);\n var distOppAxis = range1OppAxis - range0OppAxis;\n\n opts.d2pOppAxis = function(v) {\n return (v - range0OppAxis) / distOppAxis * opts._height;\n };\n }\n\n // update inner nodes\n\n rangeSlider\n .call(drawBg, gd, axisOpts, opts)\n .call(addClipPath, gd, axisOpts, opts)\n .call(drawRangePlot, gd, axisOpts, opts)\n .call(drawMasks, gd, axisOpts, opts, oppAxisRangeOpts)\n .call(drawSlideBox, gd, axisOpts, opts)\n .call(drawGrabbers, gd, axisOpts, opts);\n\n // setup drag element\n setupDragElement(rangeSlider, gd, axisOpts, opts);\n\n // update current range\n setPixelRange(rangeSlider, gd, axisOpts, opts, oppAxisOpts, oppAxisRangeOpts);\n\n // title goes next to range slider instead of tick labels, so\n // just take it over and draw it from here\n if(axisOpts.side === 'bottom') {\n Titles.draw(gd, axisOpts._id + 'title', {\n propContainer: axisOpts,\n propName: axisOpts._name + '.title',\n placeholder: fullLayout._dfltTitle.x,\n attributes: {\n x: axisOpts._offset + axisOpts._length / 2,\n y: y + opts._height + opts._offsetShift + 10 + 1.5 * axisOpts.title.font.size,\n 'text-anchor': 'middle'\n }\n });\n }\n });\n};\n\nfunction eventX(event) {\n if(typeof event.clientX === 'number') {\n return event.clientX;\n }\n if(event.touches && event.touches.length > 0) {\n return event.touches[0].clientX;\n }\n return 0;\n}\n\nfunction setupDragElement(rangeSlider, gd, axisOpts, opts) {\n if(gd._context.staticPlot) return;\n\n var slideBox = rangeSlider.select('rect.' + constants.slideBoxClassName).node();\n var grabAreaMin = rangeSlider.select('rect.' + constants.grabAreaMinClassName).node();\n var grabAreaMax = rangeSlider.select('rect.' + constants.grabAreaMaxClassName).node();\n\n function mouseDownHandler() {\n var event = d3.event;\n var target = event.target;\n var startX = eventX(event);\n var offsetX = startX - rangeSlider.node().getBoundingClientRect().left;\n var minVal = opts.d2p(axisOpts._rl[0]);\n var maxVal = opts.d2p(axisOpts._rl[1]);\n\n var dragCover = dragElement.coverSlip();\n\n this.addEventListener('touchmove', mouseMove);\n this.addEventListener('touchend', mouseUp);\n dragCover.addEventListener('mousemove', mouseMove);\n dragCover.addEventListener('mouseup', mouseUp);\n\n function mouseMove(e) {\n var clientX = eventX(e);\n var delta = +clientX - startX;\n var pixelMin, pixelMax, cursor;\n\n switch(target) {\n case slideBox:\n cursor = 'ew-resize';\n if(minVal + delta > axisOpts._length || maxVal + delta < 0) {\n return;\n }\n pixelMin = minVal + delta;\n pixelMax = maxVal + delta;\n break;\n\n case grabAreaMin:\n cursor = 'col-resize';\n if(minVal + delta > axisOpts._length) {\n return;\n }\n pixelMin = minVal + delta;\n pixelMax = maxVal;\n break;\n\n case grabAreaMax:\n cursor = 'col-resize';\n if(maxVal + delta < 0) {\n return;\n }\n pixelMin = minVal;\n pixelMax = maxVal + delta;\n break;\n\n default:\n cursor = 'ew-resize';\n pixelMin = offsetX;\n pixelMax = offsetX + delta;\n break;\n }\n\n if(pixelMax < pixelMin) {\n var tmp = pixelMax;\n pixelMax = pixelMin;\n pixelMin = tmp;\n }\n\n opts._pixelMin = pixelMin;\n opts._pixelMax = pixelMax;\n\n setCursor(d3.select(dragCover), cursor);\n setDataRange(rangeSlider, gd, axisOpts, opts);\n }\n\n function mouseUp() {\n dragCover.removeEventListener('mousemove', mouseMove);\n dragCover.removeEventListener('mouseup', mouseUp);\n this.removeEventListener('touchmove', mouseMove);\n this.removeEventListener('touchend', mouseUp);\n Lib.removeElement(dragCover);\n }\n }\n\n rangeSlider.on('mousedown', mouseDownHandler);\n rangeSlider.on('touchstart', mouseDownHandler);\n}\n\nfunction setDataRange(rangeSlider, gd, axisOpts, opts) {\n function clamp(v) {\n return axisOpts.l2r(Lib.constrain(v, opts._rl[0], opts._rl[1]));\n }\n\n var dataMin = clamp(opts.p2d(opts._pixelMin));\n var dataMax = clamp(opts.p2d(opts._pixelMax));\n\n window.requestAnimationFrame(function() {\n Registry.call('_guiRelayout', gd, axisOpts._name + '.range', [dataMin, dataMax]);\n });\n}\n\nfunction setPixelRange(rangeSlider, gd, axisOpts, opts, oppAxisOpts, oppAxisRangeOpts) {\n var hw2 = constants.handleWidth / 2;\n\n function clamp(v) {\n return Lib.constrain(v, 0, opts._width);\n }\n\n function clampOppAxis(v) {\n return Lib.constrain(v, 0, opts._height);\n }\n\n function clampHandle(v) {\n return Lib.constrain(v, -hw2, opts._width + hw2);\n }\n\n var pixelMin = clamp(opts.d2p(axisOpts._rl[0]));\n var pixelMax = clamp(opts.d2p(axisOpts._rl[1]));\n\n rangeSlider.select('rect.' + constants.slideBoxClassName)\n .attr('x', pixelMin)\n .attr('width', pixelMax - pixelMin);\n\n rangeSlider.select('rect.' + constants.maskMinClassName)\n .attr('width', pixelMin);\n\n rangeSlider.select('rect.' + constants.maskMaxClassName)\n .attr('x', pixelMax)\n .attr('width', opts._width - pixelMax);\n\n if(oppAxisRangeOpts.rangemode !== 'match') {\n var pixelMinOppAxis = opts._height - clampOppAxis(opts.d2pOppAxis(oppAxisOpts._rl[1]));\n var pixelMaxOppAxis = opts._height - clampOppAxis(opts.d2pOppAxis(oppAxisOpts._rl[0]));\n\n rangeSlider.select('rect.' + constants.maskMinOppAxisClassName)\n .attr('x', pixelMin)\n .attr('height', pixelMinOppAxis)\n .attr('width', pixelMax - pixelMin);\n\n rangeSlider.select('rect.' + constants.maskMaxOppAxisClassName)\n .attr('x', pixelMin)\n .attr('y', pixelMaxOppAxis)\n .attr('height', opts._height - pixelMaxOppAxis)\n .attr('width', pixelMax - pixelMin);\n\n rangeSlider.select('rect.' + constants.slideBoxClassName)\n .attr('y', pixelMinOppAxis)\n .attr('height', pixelMaxOppAxis - pixelMinOppAxis);\n }\n\n // add offset for crispier corners\n // https://github.com/plotly/plotly.js/pull/1409\n var offset = 0.5;\n\n var xMin = Math.round(clampHandle(pixelMin - hw2)) - offset;\n var xMax = Math.round(clampHandle(pixelMax - hw2)) + offset;\n\n rangeSlider.select('g.' + constants.grabberMinClassName)\n .attr('transform', strTranslate(xMin, offset));\n\n rangeSlider.select('g.' + constants.grabberMaxClassName)\n .attr('transform', strTranslate(xMax, offset));\n}\n\nfunction drawBg(rangeSlider, gd, axisOpts, opts) {\n var bg = Lib.ensureSingle(rangeSlider, 'rect', constants.bgClassName, function(s) {\n s.attr({\n x: 0,\n y: 0,\n 'shape-rendering': 'crispEdges'\n });\n });\n\n var borderCorrect = (opts.borderwidth % 2) === 0 ?\n opts.borderwidth :\n opts.borderwidth - 1;\n\n var offsetShift = -opts._offsetShift;\n var lw = Drawing.crispRound(gd, opts.borderwidth);\n\n bg.attr({\n width: opts._width + borderCorrect,\n height: opts._height + borderCorrect,\n transform: strTranslate(offsetShift, offsetShift),\n 'stroke-width': lw\n })\n .call(Color.stroke, opts.bordercolor)\n .call(Color.fill, opts.bgcolor);\n}\n\nfunction addClipPath(rangeSlider, gd, axisOpts, opts) {\n var fullLayout = gd._fullLayout;\n\n var clipPath = Lib.ensureSingleById(fullLayout._topdefs, 'clipPath', opts._clipId, function(s) {\n s.append('rect').attr({ x: 0, y: 0 });\n });\n\n clipPath.select('rect').attr({\n width: opts._width,\n height: opts._height\n });\n}\n\nfunction drawRangePlot(rangeSlider, gd, axisOpts, opts) {\n var calcData = gd.calcdata;\n\n var rangePlots = rangeSlider.selectAll('g.' + constants.rangePlotClassName)\n .data(axisOpts._subplotsWith, Lib.identity);\n\n rangePlots.enter().append('g')\n .attr('class', function(id) { return constants.rangePlotClassName + ' ' + id; })\n .call(Drawing.setClipUrl, opts._clipId, gd);\n\n rangePlots.order();\n\n rangePlots.exit().remove();\n\n var mainplotinfo;\n\n rangePlots.each(function(id, i) {\n var plotgroup = d3.select(this);\n var isMainPlot = (i === 0);\n\n var oppAxisOpts = axisIDs.getFromId(gd, id, 'y');\n var oppAxisName = oppAxisOpts._name;\n var oppAxisRangeOpts = opts[oppAxisName];\n\n var mockFigure = {\n data: [],\n layout: {\n xaxis: {\n type: axisOpts.type,\n domain: [0, 1],\n range: opts.range.slice(),\n calendar: axisOpts.calendar\n },\n width: opts._width,\n height: opts._height,\n margin: { t: 0, b: 0, l: 0, r: 0 }\n },\n _context: gd._context\n };\n\n if(axisOpts.rangebreaks) {\n mockFigure.layout.xaxis.rangebreaks = axisOpts.rangebreaks;\n }\n\n mockFigure.layout[oppAxisName] = {\n type: oppAxisOpts.type,\n domain: [0, 1],\n range: oppAxisRangeOpts.rangemode !== 'match' ? oppAxisRangeOpts.range.slice() : oppAxisOpts.range.slice(),\n calendar: oppAxisOpts.calendar\n };\n\n if(oppAxisOpts.rangebreaks) {\n mockFigure.layout[oppAxisName].rangebreaks = oppAxisOpts.rangebreaks;\n }\n\n Plots.supplyDefaults(mockFigure);\n\n var xa = mockFigure._fullLayout.xaxis;\n var ya = mockFigure._fullLayout[oppAxisName];\n\n xa.clearCalc();\n xa.setScale();\n ya.clearCalc();\n ya.setScale();\n\n var plotinfo = {\n id: id,\n plotgroup: plotgroup,\n xaxis: xa,\n yaxis: ya,\n isRangePlot: true\n };\n\n if(isMainPlot) mainplotinfo = plotinfo;\n else {\n plotinfo.mainplot = 'xy';\n plotinfo.mainplotinfo = mainplotinfo;\n }\n\n Cartesian.rangePlot(gd, plotinfo, filterRangePlotCalcData(calcData, id));\n });\n}\n\nfunction filterRangePlotCalcData(calcData, subplotId) {\n var out = [];\n\n for(var i = 0; i < calcData.length; i++) {\n var calcTrace = calcData[i];\n var trace = calcTrace[0].trace;\n\n if(trace.xaxis + trace.yaxis === subplotId) {\n out.push(calcTrace);\n }\n }\n\n return out;\n}\n\nfunction drawMasks(rangeSlider, gd, axisOpts, opts, oppAxisRangeOpts) {\n var maskMin = Lib.ensureSingle(rangeSlider, 'rect', constants.maskMinClassName, function(s) {\n s.attr({\n x: 0,\n y: 0,\n 'shape-rendering': 'crispEdges'\n });\n });\n\n maskMin\n .attr('height', opts._height)\n .call(Color.fill, constants.maskColor);\n\n var maskMax = Lib.ensureSingle(rangeSlider, 'rect', constants.maskMaxClassName, function(s) {\n s.attr({\n y: 0,\n 'shape-rendering': 'crispEdges'\n });\n });\n\n maskMax\n .attr('height', opts._height)\n .call(Color.fill, constants.maskColor);\n\n // masks used for oppAxis zoom\n if(oppAxisRangeOpts.rangemode !== 'match') {\n var maskMinOppAxis = Lib.ensureSingle(rangeSlider, 'rect', constants.maskMinOppAxisClassName, function(s) {\n s.attr({\n y: 0,\n 'shape-rendering': 'crispEdges'\n });\n });\n\n maskMinOppAxis\n .attr('width', opts._width)\n .call(Color.fill, constants.maskOppAxisColor);\n\n var maskMaxOppAxis = Lib.ensureSingle(rangeSlider, 'rect', constants.maskMaxOppAxisClassName, function(s) {\n s.attr({\n y: 0,\n 'shape-rendering': 'crispEdges'\n });\n });\n\n maskMaxOppAxis\n .attr('width', opts._width)\n .style('border-top', constants.maskOppBorder)\n .call(Color.fill, constants.maskOppAxisColor);\n }\n}\n\nfunction drawSlideBox(rangeSlider, gd, axisOpts, opts) {\n if(gd._context.staticPlot) return;\n\n var slideBox = Lib.ensureSingle(rangeSlider, 'rect', constants.slideBoxClassName, function(s) {\n s.attr({\n y: 0,\n cursor: constants.slideBoxCursor,\n 'shape-rendering': 'crispEdges'\n });\n });\n\n slideBox.attr({\n height: opts._height,\n fill: constants.slideBoxFill\n });\n}\n\nfunction drawGrabbers(rangeSlider, gd, axisOpts, opts) {\n // \n var grabberMin = Lib.ensureSingle(rangeSlider, 'g', constants.grabberMinClassName);\n var grabberMax = Lib.ensureSingle(rangeSlider, 'g', constants.grabberMaxClassName);\n\n // \n var handleFixAttrs = {\n x: 0,\n width: constants.handleWidth,\n rx: constants.handleRadius,\n fill: Color.background,\n stroke: Color.defaultLine,\n 'stroke-width': constants.handleStrokeWidth,\n 'shape-rendering': 'crispEdges'\n };\n var handleDynamicAttrs = {\n y: Math.round(opts._height / 4),\n height: Math.round(opts._height / 2),\n };\n var handleMin = Lib.ensureSingle(grabberMin, 'rect', constants.handleMinClassName, function(s) {\n s.attr(handleFixAttrs);\n });\n handleMin.attr(handleDynamicAttrs);\n\n var handleMax = Lib.ensureSingle(grabberMax, 'rect', constants.handleMaxClassName, function(s) {\n s.attr(handleFixAttrs);\n });\n handleMax.attr(handleDynamicAttrs);\n\n // \n var grabAreaFixAttrs = {\n width: constants.grabAreaWidth,\n x: 0,\n y: 0,\n fill: constants.grabAreaFill,\n cursor: !gd._context.staticPlot ? constants.grabAreaCursor : undefined,\n };\n\n var grabAreaMin = Lib.ensureSingle(grabberMin, 'rect', constants.grabAreaMinClassName, function(s) {\n s.attr(grabAreaFixAttrs);\n });\n grabAreaMin.attr('height', opts._height);\n\n var grabAreaMax = Lib.ensureSingle(grabberMax, 'rect', constants.grabAreaMaxClassName, function(s) {\n s.attr(grabAreaFixAttrs);\n });\n grabAreaMax.attr('height', opts._height);\n}\n","'use strict';\n\nvar axisIDs = require('../../plots/cartesian/axis_ids');\nvar svgTextUtils = require('../../lib/svg_text_utils');\nvar constants = require('./constants');\nvar LINE_SPACING = require('../../constants/alignment').LINE_SPACING;\nvar name = constants.name;\n\nfunction isVisible(ax) {\n var rangeSlider = ax && ax[name];\n return rangeSlider && rangeSlider.visible;\n}\nexports.isVisible = isVisible;\n\nexports.makeData = function(fullLayout) {\n var axes = axisIDs.list({ _fullLayout: fullLayout }, 'x', true);\n var margin = fullLayout.margin;\n var rangeSliderData = [];\n\n if(!fullLayout._has('gl2d')) {\n for(var i = 0; i < axes.length; i++) {\n var ax = axes[i];\n\n if(isVisible(ax)) {\n rangeSliderData.push(ax);\n\n var opts = ax[name];\n opts._id = name + ax._id;\n opts._height = (fullLayout.height - margin.b - margin.t) * opts.thickness;\n opts._offsetShift = Math.floor(opts.borderwidth / 2);\n }\n }\n }\n\n fullLayout._rangeSliderData = rangeSliderData;\n};\n\nexports.autoMarginOpts = function(gd, ax) {\n var fullLayout = gd._fullLayout;\n var opts = ax[name];\n var axLetter = ax._id.charAt(0);\n\n var bottomDepth = 0;\n var titleHeight = 0;\n if(ax.side === 'bottom') {\n bottomDepth = ax._depth;\n if(ax.title.text !== fullLayout._dfltTitle[axLetter]) {\n // as in rangeslider/draw.js\n titleHeight = 1.5 * ax.title.font.size + 10 + opts._offsetShift;\n // multi-line extra bump\n var extraLines = (ax.title.text.match(svgTextUtils.BR_TAG_ALL) || []).length;\n titleHeight += extraLines * ax.title.font.size * LINE_SPACING;\n }\n }\n\n return {\n x: 0,\n y: ax._counterDomainMin,\n l: 0,\n r: 0,\n t: 0,\n b: opts._height + bottomDepth + Math.max(fullLayout.margin.b, titleHeight),\n pad: constants.extraPad + opts._offsetShift * 2\n };\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar attrs = require('./attributes');\nvar oppAxisAttrs = require('./oppaxis_attributes');\nvar helpers = require('./helpers');\n\nmodule.exports = {\n moduleType: 'component',\n name: 'rangeslider',\n\n schema: {\n subplots: {\n xaxis: {\n rangeslider: Lib.extendFlat({}, attrs, {\n yaxis: oppAxisAttrs\n })\n }\n }\n },\n\n layoutAttributes: require('./attributes'),\n handleDefaults: require('./defaults'),\n calcAutorange: require('./calc_autorange'),\n draw: require('./draw'),\n isVisible: helpers.isVisible,\n makeData: helpers.makeData,\n autoMarginOpts: helpers.autoMarginOpts\n};\n","'use strict';\n\nmodule.exports = {\n // not really a 'subplot' attribute container,\n // but this is the flag we use to denote attributes that\n // support yaxis, yaxis2, yaxis3, ... counters\n _isSubplotObj: true,\n\n rangemode: {\n valType: 'enumerated',\n values: ['auto', 'fixed', 'match'],\n dflt: 'match',\n editType: 'calc',\n description: [\n 'Determines whether or not the range of this axis in',\n 'the rangeslider use the same value than in the main plot',\n 'when zooming in/out.',\n 'If *auto*, the autorange will be used.',\n 'If *fixed*, the `range` is used.',\n 'If *match*, the current range of the corresponding y-axis on the main subplot is used.'\n ].join(' ')\n },\n range: {\n valType: 'info_array',\n items: [\n {valType: 'any', editType: 'plot'},\n {valType: 'any', editType: 'plot'}\n ],\n editType: 'plot',\n description: [\n 'Sets the range of this axis for the rangeslider.'\n ].join(' ')\n },\n editType: 'calc'\n};\n","'use strict';\n\nvar annAttrs = require('../annotations/attributes');\nvar scatterLineAttrs = require('../../traces/scatter/attributes').line;\nvar dash = require('../drawing/attributes').dash;\nvar extendFlat = require('../../lib/extend').extendFlat;\nvar overrideAll = require('../../plot_api/edit_types').overrideAll;\nvar templatedArray = require('../../plot_api/plot_template').templatedArray;\nvar axisPlaceableObjs = require('../../constants/axis_placeable_objects');\n\nmodule.exports = overrideAll(templatedArray('selection', {\n type: {\n valType: 'enumerated',\n values: ['rect', 'path'],\n description: [\n 'Specifies the selection type to be drawn.',\n\n 'If *rect*, a rectangle is drawn linking',\n '(`x0`,`y0`), (`x1`,`y0`), (`x1`,`y1`) and (`x0`,`y1`).',\n\n 'If *path*, draw a custom SVG path using `path`.'\n ].join(' ')\n },\n\n xref: extendFlat({}, annAttrs.xref, {\n description: [\n 'Sets the selection\\'s x coordinate axis.',\n axisPlaceableObjs.axisRefDescription('x', 'left', 'right')\n ].join(' ')\n }),\n\n yref: extendFlat({}, annAttrs.yref, {\n description: [\n 'Sets the selection\\'s x coordinate axis.',\n axisPlaceableObjs.axisRefDescription('y', 'bottom', 'top')\n ].join(' ')\n }),\n\n x0: {\n valType: 'any',\n description: 'Sets the selection\\'s starting x position.'\n },\n x1: {\n valType: 'any',\n description: 'Sets the selection\\'s end x position.'\n },\n\n y0: {\n valType: 'any',\n description: 'Sets the selection\\'s starting y position.'\n },\n y1: {\n valType: 'any',\n description: 'Sets the selection\\'s end y position.'\n },\n\n path: {\n valType: 'string',\n editType: 'arraydraw',\n description: [\n 'For `type` *path* - a valid SVG path similar to `shapes.path` in data coordinates.',\n 'Allowed segments are: M, L and Z.'\n ].join(' ')\n },\n\n opacity: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 0.7,\n editType: 'arraydraw',\n description: 'Sets the opacity of the selection.'\n },\n\n line: {\n color: scatterLineAttrs.color,\n width: extendFlat({}, scatterLineAttrs.width, {\n min: 1,\n dflt: 1\n }),\n dash: extendFlat({}, dash, {\n dflt: 'dot'\n })\n },\n}), 'arraydraw', 'from-root');\n","'use strict';\n\nmodule.exports = {\n // max pixels off straight before a lasso select line counts as bent\n BENDPX: 1.5,\n\n // smallest dimension allowed for a select box\n MINSELECT: 12,\n\n // throttling limit (ms) for selectPoints calls\n SELECTDELAY: 100,\n\n // cache ID suffix for throttle\n SELECTID: '-select',\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Axes = require('../../plots/cartesian/axes');\nvar handleArrayContainerDefaults = require('../../plots/array_container_defaults');\n\nvar attributes = require('./attributes');\nvar helpers = require('../shapes/helpers');\n\nmodule.exports = function supplyLayoutDefaults(layoutIn, layoutOut) {\n handleArrayContainerDefaults(layoutIn, layoutOut, {\n name: 'selections',\n handleItemDefaults: handleSelectionDefaults\n });\n\n // Drop rect selections with undefined x0, y0, x1, x1 values.\n // In future we may accept partially defined rects e.g.\n // a case with only x0 and x1 may be used to define\n // [-Infinity, +Infinity] range on the y axis, etc.\n var selections = layoutOut.selections;\n for(var i = 0; i < selections.length; i++) {\n var selection = selections[i];\n if(!selection) continue;\n if(selection.path === undefined) {\n if(\n selection.x0 === undefined ||\n selection.x1 === undefined ||\n selection.y0 === undefined ||\n selection.y1 === undefined\n ) {\n layoutOut.selections[i] = null;\n }\n }\n }\n};\n\nfunction handleSelectionDefaults(selectionIn, selectionOut, fullLayout) {\n function coerce(attr, dflt) {\n return Lib.coerce(selectionIn, selectionOut, attributes, attr, dflt);\n }\n\n var path = coerce('path');\n var dfltType = path ? 'path' : 'rect';\n var selectionType = coerce('type', dfltType);\n var noPath = selectionType !== 'path';\n if(noPath) delete selectionOut.path;\n\n coerce('opacity');\n coerce('line.color');\n coerce('line.width');\n coerce('line.dash');\n\n // positioning\n var axLetters = ['x', 'y'];\n for(var i = 0; i < 2; i++) {\n var axLetter = axLetters[i];\n var gdMock = {_fullLayout: fullLayout};\n var ax;\n var pos2r;\n var r2pos;\n\n // xref, yref\n var axRef = Axes.coerceRef(selectionIn, selectionOut, gdMock, axLetter);\n\n // axRefType is 'range' for selections\n ax = Axes.getFromId(gdMock, axRef);\n ax._selectionIndices.push(selectionOut._index);\n r2pos = helpers.rangeToShapePosition(ax);\n pos2r = helpers.shapePositionToRange(ax);\n\n // Coerce x0, x1, y0, y1\n if(noPath) {\n // hack until V3.0 when log has regular range behavior - make it look like other\n // ranges to send to coerce, then put it back after\n // this is all to give reasonable default position behavior on log axes, which is\n // a pretty unimportant edge case so we could just ignore this.\n var attr0 = axLetter + '0';\n var attr1 = axLetter + '1';\n var in0 = selectionIn[attr0];\n var in1 = selectionIn[attr1];\n selectionIn[attr0] = pos2r(selectionIn[attr0], true);\n selectionIn[attr1] = pos2r(selectionIn[attr1], true);\n\n Axes.coercePosition(selectionOut, gdMock, coerce, axRef, attr0);\n Axes.coercePosition(selectionOut, gdMock, coerce, axRef, attr1);\n\n var p0 = selectionOut[attr0];\n var p1 = selectionOut[attr1];\n\n if(p0 !== undefined && p1 !== undefined) {\n // hack part 2\n selectionOut[attr0] = r2pos(p0);\n selectionOut[attr1] = r2pos(p1);\n selectionIn[attr0] = in0;\n selectionIn[attr1] = in1;\n }\n }\n }\n\n if(noPath) {\n Lib.noneOrAll(selectionIn, selectionOut, ['x0', 'x1', 'y0', 'y1']);\n }\n}\n","'use strict';\n\nvar readPaths = require('../shapes/draw_newshape/helpers').readPaths;\nvar displayOutlines = require('../shapes/display_outlines');\n\nvar clearOutlineControllers = require('../shapes/handle_outline').clearOutlineControllers;\n\nvar Color = require('../color');\nvar Drawing = require('../drawing');\nvar arrayEditor = require('../../plot_api/plot_template').arrayEditor;\n\nvar helpers = require('../shapes/helpers');\nvar getPathString = helpers.getPathString;\n\n\n// Selections are stored in gd.layout.selections, an array of objects\n// index can point to one item in this array,\n// or non-numeric to simply add a new one\n// or -1 to modify all existing\n// opt can be the full options object, or one key (to be set to value)\n// or undefined to simply redraw\n// if opt is blank, val can be 'add' or a full options object to add a new\n// annotation at that point in the array, or 'remove' to delete this one\n\nmodule.exports = {\n draw: draw,\n drawOne: drawOne,\n activateLastSelection: activateLastSelection\n};\n\nfunction draw(gd) {\n var fullLayout = gd._fullLayout;\n\n clearOutlineControllers(gd);\n\n // Remove previous selections before drawing new selections in fullLayout.selections\n fullLayout._selectionLayer.selectAll('path').remove();\n\n for(var k in fullLayout._plots) {\n var selectionLayer = fullLayout._plots[k].selectionLayer;\n if(selectionLayer) selectionLayer.selectAll('path').remove();\n }\n\n for(var i = 0; i < fullLayout.selections.length; i++) {\n drawOne(gd, i);\n }\n}\n\nfunction couldHaveActiveSelection(gd) {\n return gd._context.editSelection;\n}\n\nfunction drawOne(gd, index) {\n // remove the existing selection if there is one.\n // because indices can change, we need to look in all selection layers\n gd._fullLayout._paperdiv\n .selectAll('.selectionlayer [data-index=\"' + index + '\"]')\n .remove();\n\n var o = helpers.makeSelectionsOptionsAndPlotinfo(gd, index);\n var options = o.options;\n var plotinfo = o.plotinfo;\n\n // this selection is gone - quit now after deleting it\n // TODO: use d3 idioms instead of deleting and redrawing every time\n if(!options._input) return;\n\n drawSelection(gd._fullLayout._selectionLayer);\n\n function drawSelection(selectionLayer) {\n var d = getPathString(gd, options);\n var attrs = {\n 'data-index': index,\n 'fill-rule': 'evenodd',\n d: d\n };\n\n var opacity = options.opacity;\n var fillColor = 'rgba(0,0,0,0)';\n var lineColor = options.line.color || Color.contrast(gd._fullLayout.plot_bgcolor);\n var lineWidth = options.line.width;\n var lineDash = options.line.dash;\n if(!lineWidth) {\n // ensure invisible border to activate the selection\n lineWidth = 5;\n lineDash = 'solid';\n }\n\n var isActiveSelection = couldHaveActiveSelection(gd) &&\n gd._fullLayout._activeSelectionIndex === index;\n\n if(isActiveSelection) {\n fillColor = gd._fullLayout.activeselection.fillcolor;\n opacity = gd._fullLayout.activeselection.opacity;\n }\n\n var allPaths = [];\n for(var sensory = 1; sensory >= 0; sensory--) {\n var path = selectionLayer.append('path')\n .attr(attrs)\n .style('opacity', sensory ? 0.1 : opacity)\n .call(Color.stroke, lineColor)\n .call(Color.fill, fillColor)\n // make it easier to select senory background path\n .call(Drawing.dashLine,\n sensory ? 'solid' : lineDash,\n sensory ? 4 + lineWidth : lineWidth\n );\n\n setClipPath(path, gd, options);\n\n if(isActiveSelection) {\n var editHelpers = arrayEditor(gd.layout, 'selections', options);\n\n path.style({\n cursor: 'move',\n });\n\n var dragOptions = {\n element: path.node(),\n plotinfo: plotinfo,\n gd: gd,\n editHelpers: editHelpers,\n isActiveSelection: true // i.e. to enable controllers\n };\n\n var polygons = readPaths(d, gd);\n // display polygons on the screen\n displayOutlines(polygons, path, dragOptions);\n } else {\n path.style('pointer-events', sensory ? 'all' : 'none');\n }\n\n allPaths[sensory] = path;\n }\n\n var forePath = allPaths[0];\n var backPath = allPaths[1];\n\n backPath.node().addEventListener('click', function() { return activateSelection(gd, forePath); });\n }\n}\n\nfunction setClipPath(selectionPath, gd, selectionOptions) {\n var clipAxes = selectionOptions.xref + selectionOptions.yref;\n\n Drawing.setClipUrl(\n selectionPath,\n 'clip' + gd._fullLayout._uid + clipAxes,\n gd\n );\n}\n\n\nfunction activateSelection(gd, path) {\n if(!couldHaveActiveSelection(gd)) return;\n\n var element = path.node();\n var id = +element.getAttribute('data-index');\n if(id >= 0) {\n // deactivate if already active\n if(id === gd._fullLayout._activeSelectionIndex) {\n deactivateSelection(gd);\n return;\n }\n\n gd._fullLayout._activeSelectionIndex = id;\n gd._fullLayout._deactivateSelection = deactivateSelection;\n draw(gd);\n }\n}\n\nfunction activateLastSelection(gd) {\n if(!couldHaveActiveSelection(gd)) return;\n\n var id = gd._fullLayout.selections.length - 1;\n gd._fullLayout._activeSelectionIndex = id;\n gd._fullLayout._deactivateSelection = deactivateSelection;\n draw(gd);\n}\n\nfunction deactivateSelection(gd) {\n if(!couldHaveActiveSelection(gd)) return;\n\n var id = gd._fullLayout._activeSelectionIndex;\n if(id >= 0) {\n clearOutlineControllers(gd);\n delete gd._fullLayout._activeSelectionIndex;\n draw(gd);\n }\n}\n","'use strict';\n\nvar dash = require('../../drawing/attributes').dash;\nvar extendFlat = require('../../../lib/extend').extendFlat;\n\nmodule.exports = {\n newselection: {\n mode: {\n valType: 'enumerated',\n values: ['immediate', 'gradual'],\n dflt: 'immediate',\n editType: 'none',\n description: [\n 'Describes how a new selection is created.',\n 'If `immediate`, a new selection is created after first mouse up.',\n 'If `gradual`, a new selection is not created after first mouse.',\n 'By adding to and subtracting from the initial selection,',\n 'this option allows declaring extra outlines of the selection.'\n ].join(' ')\n },\n\n line: {\n color: {\n valType: 'color',\n editType: 'none',\n description: [\n 'Sets the line color.',\n 'By default uses either dark grey or white',\n 'to increase contrast with background color.'\n ].join(' ')\n },\n width: {\n valType: 'number',\n min: 1,\n dflt: 1,\n editType: 'none',\n description: 'Sets the line width (in px).'\n },\n dash: extendFlat({}, dash, {\n dflt: 'dot',\n editType: 'none'\n }),\n editType: 'none'\n },\n\n // no drawdirection here noting that layout.selectdirection is used instead.\n\n editType: 'none'\n },\n\n activeselection: {\n fillcolor: {\n valType: 'color',\n dflt: 'rgba(0,0,0,0)',\n editType: 'none',\n description: 'Sets the color filling the active selection\\' interior.'\n },\n opacity: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 0.5,\n editType: 'none',\n description: 'Sets the opacity of the active selection.'\n },\n editType: 'none'\n }\n};\n","'use strict';\n\nmodule.exports = function supplyDrawNewSelectionDefaults(layoutIn, layoutOut, coerce) {\n coerce('newselection.mode');\n\n var newselectionLineWidth = coerce('newselection.line.width');\n if(newselectionLineWidth) {\n coerce('newselection.line.color');\n coerce('newselection.line.dash');\n }\n\n coerce('activeselection.fillcolor');\n coerce('activeselection.opacity');\n};\n","'use strict';\n\nvar dragHelpers = require('../../dragelement/helpers');\nvar selectMode = dragHelpers.selectMode;\n\nvar handleOutline = require('../../shapes/handle_outline');\nvar clearOutline = handleOutline.clearOutline;\n\nvar helpers = require('../../shapes/draw_newshape/helpers');\nvar readPaths = helpers.readPaths;\nvar writePaths = helpers.writePaths;\nvar fixDatesForPaths = helpers.fixDatesForPaths;\n\nmodule.exports = function newSelections(outlines, dragOptions) {\n if(!outlines.length) return;\n var e = outlines[0][0]; // pick first\n if(!e) return;\n var d = e.getAttribute('d');\n\n var gd = dragOptions.gd;\n var newStyle = gd._fullLayout.newselection;\n\n var plotinfo = dragOptions.plotinfo;\n var xaxis = plotinfo.xaxis;\n var yaxis = plotinfo.yaxis;\n\n var isActiveSelection = dragOptions.isActiveSelection;\n var dragmode = dragOptions.dragmode;\n\n var selections = (gd.layout || {}).selections || [];\n\n if(!selectMode(dragmode) && isActiveSelection !== undefined) {\n var id = gd._fullLayout._activeSelectionIndex;\n if(id < selections.length) {\n switch(gd._fullLayout.selections[id].type) {\n case 'rect':\n dragmode = 'select';\n break;\n case 'path':\n dragmode = 'lasso';\n break;\n }\n }\n }\n\n var polygons = readPaths(d, gd, plotinfo, isActiveSelection);\n\n var newSelection = {\n xref: xaxis._id,\n yref: yaxis._id,\n\n opacity: newStyle.opacity,\n line: {\n color: newStyle.line.color,\n width: newStyle.line.width,\n dash: newStyle.line.dash\n }\n };\n\n var cell;\n // rect can be in one cell\n // only define cell if there is single cell\n if(polygons.length === 1) cell = polygons[0];\n\n if(\n cell &&\n cell.length === 5 && // ensure we only have 4 corners for a rect\n dragmode === 'select'\n ) {\n newSelection.type = 'rect';\n newSelection.x0 = cell[0][1];\n newSelection.y0 = cell[0][2];\n newSelection.x1 = cell[2][1];\n newSelection.y1 = cell[2][2];\n } else {\n newSelection.type = 'path';\n if(xaxis && yaxis) fixDatesForPaths(polygons, xaxis, yaxis);\n newSelection.path = writePaths(polygons);\n cell = null;\n }\n\n clearOutline(gd);\n\n var editHelpers = dragOptions.editHelpers;\n var modifyItem = (editHelpers || {}).modifyItem;\n\n var allSelections = [];\n for(var q = 0; q < selections.length; q++) {\n var beforeEdit = gd._fullLayout.selections[q];\n if(!beforeEdit) {\n allSelections[q] = beforeEdit;\n continue;\n }\n\n allSelections[q] = beforeEdit._input;\n\n if(\n isActiveSelection !== undefined &&\n q === gd._fullLayout._activeSelectionIndex\n ) {\n var afterEdit = newSelection;\n\n switch(beforeEdit.type) {\n case 'rect':\n modifyItem('x0', afterEdit.x0);\n modifyItem('x1', afterEdit.x1);\n modifyItem('y0', afterEdit.y0);\n modifyItem('y1', afterEdit.y1);\n break;\n\n case 'path':\n modifyItem('path', afterEdit.path);\n break;\n }\n }\n }\n\n if(isActiveSelection === undefined) {\n allSelections.push(newSelection); // add new selection\n return allSelections;\n }\n\n return editHelpers ? editHelpers.getUpdateObj() : {};\n};\n","'use strict';\n\nvar strTranslate = require('../../lib').strTranslate;\n\n// in v3 (once log ranges are fixed),\n// we'll be able to p2r here for all axis types\nfunction p2r(ax, v) {\n switch(ax.type) {\n case 'log':\n return ax.p2d(v);\n case 'date':\n return ax.p2r(v, 0, ax.calendar);\n default:\n return ax.p2r(v);\n }\n}\n\nfunction r2p(ax, v) {\n switch(ax.type) {\n case 'log':\n return ax.d2p(v);\n case 'date':\n return ax.r2p(v, 0, ax.calendar);\n default:\n return ax.r2p(v);\n }\n}\n\nfunction axValue(ax) {\n var index = (ax._id.charAt(0) === 'y') ? 1 : 0;\n return function(v) { return p2r(ax, v[index]); };\n}\n\nfunction getTransform(plotinfo) {\n return strTranslate(\n plotinfo.xaxis._offset,\n plotinfo.yaxis._offset\n );\n}\n\nmodule.exports = {\n p2r: p2r,\n r2p: r2p,\n axValue: axValue,\n getTransform: getTransform\n};\n","'use strict';\n\nvar drawModule = require('./draw');\nvar select = require('./select');\n\nmodule.exports = {\n moduleType: 'component',\n name: 'selections',\n\n layoutAttributes: require('./attributes'),\n supplyLayoutDefaults: require('./defaults'),\n supplyDrawNewSelectionDefaults: require('./draw_newselection/defaults'),\n includeBasePlot: require('../../plots/cartesian/include_components')('selections'),\n\n draw: drawModule.draw,\n drawOne: drawModule.drawOne,\n\n reselect: select.reselect,\n prepSelect: select.prepSelect,\n clearOutline: select.clearOutline,\n clearSelectionsCache: select.clearSelectionsCache,\n selectOnClick: select.selectOnClick\n};\n","'use strict';\n\nvar polybool = require('polybooljs');\nvar pointInPolygon = require('point-in-polygon/nested'); // could we use contains lib/polygon instead?\n\nvar Registry = require('../../registry');\nvar dashStyle = require('../drawing').dashStyle;\nvar Color = require('../color');\nvar Fx = require('../fx');\nvar makeEventData = require('../fx/helpers').makeEventData;\nvar dragHelpers = require('../dragelement/helpers');\nvar freeMode = dragHelpers.freeMode;\nvar rectMode = dragHelpers.rectMode;\nvar drawMode = dragHelpers.drawMode;\nvar openMode = dragHelpers.openMode;\nvar selectMode = dragHelpers.selectMode;\n\nvar shapeHelpers = require('../shapes/helpers');\nvar shapeConstants = require('../shapes/constants');\n\nvar displayOutlines = require('../shapes/display_outlines');\nvar clearOutline = require('../shapes/handle_outline').clearOutline;\n\nvar newShapeHelpers = require('../shapes/draw_newshape/helpers');\nvar handleEllipse = newShapeHelpers.handleEllipse;\nvar readPaths = newShapeHelpers.readPaths;\n\nvar newShapes = require('../shapes/draw_newshape/newshapes').newShapes;\n\nvar newSelections = require('./draw_newselection/newselections');\nvar activateLastSelection = require('./draw').activateLastSelection;\n\nvar Lib = require('../../lib');\nvar ascending = Lib.sorterAsc;\nvar libPolygon = require('../../lib/polygon');\nvar throttle = require('../../lib/throttle');\nvar getFromId = require('../../plots/cartesian/axis_ids').getFromId;\nvar clearGlCanvases = require('../../lib/clear_gl_canvases');\n\nvar redrawReglTraces = require('../../plot_api/subroutines').redrawReglTraces;\n\nvar constants = require('./constants');\nvar MINSELECT = constants.MINSELECT;\n\nvar filteredPolygon = libPolygon.filter;\nvar polygonTester = libPolygon.tester;\n\nvar helpers = require('./helpers');\nvar p2r = helpers.p2r;\nvar axValue = helpers.axValue;\nvar getTransform = helpers.getTransform;\n\nfunction hasSubplot(dragOptions) {\n // N.B. subplot may be falsy e.g zero sankey index!\n return dragOptions.subplot !== undefined;\n}\n\nfunction prepSelect(evt, startX, startY, dragOptions, mode) {\n var isCartesian = !hasSubplot(dragOptions);\n\n var isFreeMode = freeMode(mode);\n var isRectMode = rectMode(mode);\n var isOpenMode = openMode(mode);\n var isDrawMode = drawMode(mode);\n var isSelectMode = selectMode(mode);\n\n var isLine = mode === 'drawline';\n var isEllipse = mode === 'drawcircle';\n var isLineOrEllipse = isLine || isEllipse; // cases with two start & end positions\n\n var gd = dragOptions.gd;\n var fullLayout = gd._fullLayout;\n var immediateSelect = isSelectMode && fullLayout.newselection.mode === 'immediate' &&\n isCartesian; // N.B. only cartesian subplots have persistent selection\n\n var zoomLayer = fullLayout._zoomlayer;\n var dragBBox = dragOptions.element.getBoundingClientRect();\n var plotinfo = dragOptions.plotinfo;\n var transform = getTransform(plotinfo);\n var x0 = startX - dragBBox.left;\n var y0 = startY - dragBBox.top;\n\n fullLayout._calcInverseTransform(gd);\n var transformedCoords = Lib.apply3DTransform(fullLayout._invTransform)(x0, y0);\n x0 = transformedCoords[0];\n y0 = transformedCoords[1];\n var scaleX = fullLayout._invScaleX;\n var scaleY = fullLayout._invScaleY;\n\n var x1 = x0;\n var y1 = y0;\n var path0 = 'M' + x0 + ',' + y0;\n var xAxis = dragOptions.xaxes[0];\n var yAxis = dragOptions.yaxes[0];\n var pw = xAxis._length;\n var ph = yAxis._length;\n\n var subtract = evt.altKey &&\n !(drawMode(mode) && isOpenMode);\n\n var filterPoly, selectionTesters, mergedPolygons, currentPolygon;\n var i, searchInfo, eventData;\n\n coerceSelectionsCache(evt, gd, dragOptions);\n\n if(isFreeMode) {\n filterPoly = filteredPolygon([[x0, y0]], constants.BENDPX);\n }\n\n var outlines = zoomLayer.selectAll('path.select-outline-' + plotinfo.id).data([1]);\n var newStyle = isDrawMode ?\n fullLayout.newshape :\n fullLayout.newselection;\n\n if(isDrawMode) {\n dragOptions.hasText = newStyle.label.text || newStyle.label.texttemplate;\n }\n\n var fillC = (isDrawMode && !isOpenMode) ? newStyle.fillcolor : 'rgba(0,0,0,0)';\n\n var strokeC = newStyle.line.color || (\n isCartesian ?\n Color.contrast(gd._fullLayout.plot_bgcolor) :\n '#7f7f7f' // non-cartesian subplot\n );\n\n outlines.enter()\n .append('path')\n .attr('class', 'select-outline select-outline-' + plotinfo.id)\n .style({\n opacity: isDrawMode ? newStyle.opacity / 2 : 1,\n 'stroke-dasharray': dashStyle(newStyle.line.dash, newStyle.line.width),\n 'stroke-width': newStyle.line.width + 'px',\n 'shape-rendering': 'crispEdges'\n })\n .call(Color.stroke, strokeC)\n .call(Color.fill, fillC)\n .attr('fill-rule', 'evenodd')\n .classed('cursor-move', isDrawMode ? true : false)\n .attr('transform', transform)\n .attr('d', path0 + 'Z');\n\n var corners = zoomLayer.append('path')\n .attr('class', 'zoombox-corners')\n .style({\n fill: Color.background,\n stroke: Color.defaultLine,\n 'stroke-width': 1\n })\n .attr('transform', transform)\n .attr('d', 'M0,0Z');\n\n // create & style group for text label\n if(isDrawMode && dragOptions.hasText) {\n var shapeGroup = zoomLayer.select('.label-temp');\n if(shapeGroup.empty()) {\n shapeGroup = zoomLayer.append('g')\n .classed('label-temp', true)\n .classed('select-outline', true)\n .style({ opacity: 0.8 });\n }\n }\n\n var throttleID = fullLayout._uid + constants.SELECTID;\n var selection = [];\n\n // find the traces to search for selection points\n var searchTraces = determineSearchTraces(gd, dragOptions.xaxes,\n dragOptions.yaxes, dragOptions.subplot);\n\n if(immediateSelect && !evt.shiftKey) {\n dragOptions._clearSubplotSelections = function() {\n if(!isCartesian) return;\n\n var xRef = xAxis._id;\n var yRef = yAxis._id;\n deselectSubplot(gd, xRef, yRef, searchTraces);\n\n var selections = (gd.layout || {}).selections || [];\n var list = [];\n var selectionErased = false;\n for(var q = 0; q < selections.length; q++) {\n var s = fullLayout.selections[q];\n if(\n s.xref !== xRef ||\n s.yref !== yRef\n ) {\n list.push(selections[q]);\n } else {\n selectionErased = true;\n }\n }\n\n if(selectionErased) {\n gd._fullLayout._noEmitSelectedAtStart = true;\n\n Registry.call('_guiRelayout', gd, {\n selections: list\n });\n }\n };\n }\n\n var fillRangeItems = getFillRangeItems(dragOptions);\n\n dragOptions.moveFn = function(dx0, dy0) {\n if(dragOptions._clearSubplotSelections) {\n dragOptions._clearSubplotSelections();\n dragOptions._clearSubplotSelections = undefined;\n }\n\n x1 = Math.max(0, Math.min(pw, scaleX * dx0 + x0));\n y1 = Math.max(0, Math.min(ph, scaleY * dy0 + y0));\n\n var dx = Math.abs(x1 - x0);\n var dy = Math.abs(y1 - y0);\n\n if(isRectMode) {\n var direction;\n var start, end;\n\n if(isSelectMode) {\n var q = fullLayout.selectdirection;\n\n if(q === 'any') {\n if(dy < Math.min(dx * 0.6, MINSELECT)) {\n direction = 'h';\n } else if(dx < Math.min(dy * 0.6, MINSELECT)) {\n direction = 'v';\n } else {\n direction = 'd';\n }\n } else {\n direction = q;\n }\n\n switch(direction) {\n case 'h':\n start = isEllipse ? ph / 2 : 0;\n end = ph;\n break;\n case 'v':\n start = isEllipse ? pw / 2 : 0;\n end = pw;\n break;\n }\n }\n\n if(isDrawMode) {\n switch(fullLayout.newshape.drawdirection) {\n case 'vertical':\n direction = 'h';\n start = isEllipse ? ph / 2 : 0;\n end = ph;\n break;\n case 'horizontal':\n direction = 'v';\n start = isEllipse ? pw / 2 : 0;\n end = pw;\n break;\n case 'ortho':\n if(dx < dy) {\n direction = 'h';\n start = y0;\n end = y1;\n } else {\n direction = 'v';\n start = x0;\n end = x1;\n }\n break;\n default: // i.e. case of 'diagonal'\n direction = 'd';\n }\n }\n\n if(direction === 'h') {\n // horizontal motion\n currentPolygon = isLineOrEllipse ?\n handleEllipse(isEllipse, [x1, start], [x1, end]) : // using x1 instead of x0 allows adjusting the line while drawing\n [[x0, start], [x0, end], [x1, end], [x1, start]]; // make a vertical box\n\n currentPolygon.xmin = isLineOrEllipse ? x1 : Math.min(x0, x1);\n currentPolygon.xmax = isLineOrEllipse ? x1 : Math.max(x0, x1);\n currentPolygon.ymin = Math.min(start, end);\n currentPolygon.ymax = Math.max(start, end);\n // extras to guide users in keeping a straight selection\n corners.attr('d', 'M' + currentPolygon.xmin + ',' + (y0 - MINSELECT) +\n 'h-4v' + (2 * MINSELECT) + 'h4Z' +\n 'M' + (currentPolygon.xmax - 1) + ',' + (y0 - MINSELECT) +\n 'h4v' + (2 * MINSELECT) + 'h-4Z');\n } else if(direction === 'v') {\n // vertical motion\n currentPolygon = isLineOrEllipse ?\n handleEllipse(isEllipse, [start, y1], [end, y1]) : // using y1 instead of y0 allows adjusting the line while drawing\n [[start, y0], [start, y1], [end, y1], [end, y0]]; // make a horizontal box\n\n currentPolygon.xmin = Math.min(start, end);\n currentPolygon.xmax = Math.max(start, end);\n currentPolygon.ymin = isLineOrEllipse ? y1 : Math.min(y0, y1);\n currentPolygon.ymax = isLineOrEllipse ? y1 : Math.max(y0, y1);\n corners.attr('d', 'M' + (x0 - MINSELECT) + ',' + currentPolygon.ymin +\n 'v-4h' + (2 * MINSELECT) + 'v4Z' +\n 'M' + (x0 - MINSELECT) + ',' + (currentPolygon.ymax - 1) +\n 'v4h' + (2 * MINSELECT) + 'v-4Z');\n } else if(direction === 'd') {\n // diagonal motion\n currentPolygon = isLineOrEllipse ?\n handleEllipse(isEllipse, [x0, y0], [x1, y1]) :\n [[x0, y0], [x0, y1], [x1, y1], [x1, y0]];\n\n currentPolygon.xmin = Math.min(x0, x1);\n currentPolygon.xmax = Math.max(x0, x1);\n currentPolygon.ymin = Math.min(y0, y1);\n currentPolygon.ymax = Math.max(y0, y1);\n corners.attr('d', 'M0,0Z');\n }\n } else if(isFreeMode) {\n filterPoly.addPt([x1, y1]);\n currentPolygon = filterPoly.filtered;\n }\n\n // create outline & tester\n if(dragOptions.selectionDefs && dragOptions.selectionDefs.length) {\n mergedPolygons = mergePolygons(dragOptions.mergedPolygons, currentPolygon, subtract);\n\n currentPolygon.subtract = subtract;\n selectionTesters = multiTester(dragOptions.selectionDefs.concat([currentPolygon]));\n } else {\n mergedPolygons = [currentPolygon];\n selectionTesters = polygonTester(currentPolygon);\n }\n\n // display polygons on the screen\n displayOutlines(convertPoly(mergedPolygons, isOpenMode), outlines, dragOptions);\n\n if(isSelectMode) {\n var _res = reselect(gd, false);\n var extraPoints = _res.eventData ? _res.eventData.points.slice() : [];\n\n _res = reselect(gd, false, selectionTesters, searchTraces, dragOptions);\n selectionTesters = _res.selectionTesters;\n eventData = _res.eventData;\n\n var poly;\n if(filterPoly) {\n poly = filterPoly.filtered;\n } else {\n poly = castMultiPolygon(mergedPolygons);\n }\n\n throttle.throttle(\n throttleID,\n constants.SELECTDELAY,\n function() {\n selection = _doSelect(selectionTesters, searchTraces);\n\n var newPoints = selection.slice();\n\n for(var w = 0; w < extraPoints.length; w++) {\n var p = extraPoints[w];\n var found = false;\n for(var u = 0; u < newPoints.length; u++) {\n if(\n newPoints[u].curveNumber === p.curveNumber &&\n newPoints[u].pointNumber === p.pointNumber\n ) {\n found = true;\n break;\n }\n }\n if(!found) newPoints.push(p);\n }\n\n if(newPoints.length) {\n if(!eventData) eventData = {};\n eventData.points = newPoints;\n }\n\n fillRangeItems(eventData, poly);\n\n emitSelecting(gd, eventData);\n }\n );\n }\n };\n\n dragOptions.clickFn = function(numClicks, evt) {\n corners.remove();\n\n if(gd._fullLayout._activeShapeIndex >= 0) {\n gd._fullLayout._deactivateShape(gd);\n return;\n }\n if(isDrawMode) return;\n\n var clickmode = fullLayout.clickmode;\n\n throttle.done(throttleID).then(function() {\n throttle.clear(throttleID);\n if(numClicks === 2) {\n // clear selection on doubleclick\n outlines.remove();\n for(i = 0; i < searchTraces.length; i++) {\n searchInfo = searchTraces[i];\n searchInfo._module.selectPoints(searchInfo, false);\n }\n\n updateSelectedState(gd, searchTraces);\n\n clearSelectionsCache(dragOptions);\n\n emitDeselect(gd);\n\n if(searchTraces.length) {\n var clickedXaxis = searchTraces[0].xaxis;\n var clickedYaxis = searchTraces[0].yaxis;\n\n if(clickedXaxis && clickedYaxis) {\n // drop selections in the clicked subplot\n var subSelections = [];\n var allSelections = gd._fullLayout.selections;\n for(var k = 0; k < allSelections.length; k++) {\n var s = allSelections[k];\n if(!s) continue; // also drop null selections if any\n\n if(\n s.xref !== clickedXaxis._id ||\n s.yref !== clickedYaxis._id\n ) {\n subSelections.push(s);\n }\n }\n\n if(subSelections.length < allSelections.length) {\n gd._fullLayout._noEmitSelectedAtStart = true;\n\n Registry.call('_guiRelayout', gd, {\n selections: subSelections\n });\n }\n }\n }\n } else {\n if(clickmode.indexOf('select') > -1) {\n selectOnClick(evt, gd, dragOptions.xaxes, dragOptions.yaxes,\n dragOptions.subplot, dragOptions, outlines);\n }\n\n if(clickmode === 'event') {\n // TODO: remove in v3 - this was probably never intended to work as it does,\n // but in case anyone depends on it we don't want to break it now.\n // Note that click-to-select introduced pre v3 also emitts proper\n // event data when clickmode is having 'select' in its flag list.\n emitSelected(gd, undefined);\n }\n }\n\n Fx.click(gd, evt, plotinfo.id);\n }).catch(Lib.error);\n };\n\n dragOptions.doneFn = function() {\n corners.remove();\n\n throttle.done(throttleID).then(function() {\n throttle.clear(throttleID);\n\n if(!immediateSelect && currentPolygon && dragOptions.selectionDefs) {\n // save last polygons\n currentPolygon.subtract = subtract;\n dragOptions.selectionDefs.push(currentPolygon);\n\n // we have to keep reference to arrays container\n dragOptions.mergedPolygons.length = 0;\n [].push.apply(dragOptions.mergedPolygons, mergedPolygons);\n }\n\n if(immediateSelect || isDrawMode) {\n clearSelectionsCache(dragOptions, immediateSelect);\n }\n\n if(dragOptions.doneFnCompleted) {\n dragOptions.doneFnCompleted(selection);\n }\n\n if(isSelectMode) {\n emitSelected(gd, eventData);\n }\n }).catch(Lib.error);\n };\n}\n\nfunction selectOnClick(evt, gd, xAxes, yAxes, subplot, dragOptions, polygonOutlines) {\n var hoverData = gd._hoverdata;\n var fullLayout = gd._fullLayout;\n var clickmode = fullLayout.clickmode;\n var sendEvents = clickmode.indexOf('event') > -1;\n var selection = [];\n var searchTraces, searchInfo, currentSelectionDef, selectionTesters, traceSelection;\n var thisTracesSelection, pointOrBinSelected, subtract, eventData, i;\n\n if(isHoverDataSet(hoverData)) {\n coerceSelectionsCache(evt, gd, dragOptions);\n searchTraces = determineSearchTraces(gd, xAxes, yAxes, subplot);\n var clickedPtInfo = extractClickedPtInfo(hoverData, searchTraces);\n var isBinnedTrace = clickedPtInfo.pointNumbers.length > 0;\n\n\n // Note: potentially costly operation isPointOrBinSelected is\n // called as late as possible through the use of an assignment\n // in an if condition.\n if(isBinnedTrace ?\n isOnlyThisBinSelected(searchTraces, clickedPtInfo) :\n isOnlyOnePointSelected(searchTraces) &&\n (pointOrBinSelected = isPointOrBinSelected(clickedPtInfo))) {\n if(polygonOutlines) polygonOutlines.remove();\n for(i = 0; i < searchTraces.length; i++) {\n searchInfo = searchTraces[i];\n searchInfo._module.selectPoints(searchInfo, false);\n }\n\n updateSelectedState(gd, searchTraces);\n\n clearSelectionsCache(dragOptions);\n\n if(sendEvents) {\n emitDeselect(gd);\n }\n } else {\n subtract = evt.shiftKey &&\n (pointOrBinSelected !== undefined ?\n pointOrBinSelected :\n isPointOrBinSelected(clickedPtInfo));\n currentSelectionDef = newPointSelectionDef(clickedPtInfo.pointNumber, clickedPtInfo.searchInfo, subtract);\n\n var allSelectionDefs = dragOptions.selectionDefs.concat([currentSelectionDef]);\n selectionTesters = multiTester(allSelectionDefs, selectionTesters);\n\n for(i = 0; i < searchTraces.length; i++) {\n traceSelection = searchTraces[i]._module.selectPoints(searchTraces[i], selectionTesters);\n thisTracesSelection = fillSelectionItem(traceSelection, searchTraces[i]);\n\n if(selection.length) {\n for(var j = 0; j < thisTracesSelection.length; j++) {\n selection.push(thisTracesSelection[j]);\n }\n } else selection = thisTracesSelection;\n }\n\n eventData = {points: selection};\n updateSelectedState(gd, searchTraces, eventData);\n\n if(currentSelectionDef && dragOptions) {\n dragOptions.selectionDefs.push(currentSelectionDef);\n }\n\n if(polygonOutlines) {\n var polygons = dragOptions.mergedPolygons;\n var isOpenMode = openMode(dragOptions.dragmode);\n\n // display polygons on the screen\n displayOutlines(convertPoly(polygons, isOpenMode), polygonOutlines, dragOptions);\n }\n\n if(sendEvents) {\n emitSelected(gd, eventData);\n }\n }\n }\n}\n\n/**\n * Constructs a new point selection definition object.\n */\nfunction newPointSelectionDef(pointNumber, searchInfo, subtract) {\n return {\n pointNumber: pointNumber,\n searchInfo: searchInfo,\n subtract: !!subtract\n };\n}\n\nfunction isPointSelectionDef(o) {\n return 'pointNumber' in o && 'searchInfo' in o;\n}\n\n/*\n * Constructs a new point number tester.\n */\nfunction newPointNumTester(pointSelectionDef) {\n return {\n xmin: 0,\n xmax: 0,\n ymin: 0,\n ymax: 0,\n pts: [],\n contains: function(pt, omitFirstEdge, pointNumber, searchInfo) {\n var idxWantedTrace = pointSelectionDef.searchInfo.cd[0].trace._expandedIndex;\n var idxActualTrace = searchInfo.cd[0].trace._expandedIndex;\n return idxActualTrace === idxWantedTrace &&\n pointNumber === pointSelectionDef.pointNumber;\n },\n isRect: false,\n degenerate: false,\n subtract: !!pointSelectionDef.subtract\n };\n}\n\n/**\n * Wraps multiple selection testers.\n *\n * @param {Array} list - An array of selection testers.\n *\n * @return a selection tester object with a contains function\n * that can be called to evaluate a point against all wrapped\n * selection testers that were passed in list.\n */\nfunction multiTester(list) {\n if(!list.length) return;\n\n var testers = [];\n var xmin = isPointSelectionDef(list[0]) ? 0 : list[0][0][0];\n var xmax = xmin;\n var ymin = isPointSelectionDef(list[0]) ? 0 : list[0][0][1];\n var ymax = ymin;\n\n for(var i = 0; i < list.length; i++) {\n if(isPointSelectionDef(list[i])) {\n testers.push(newPointNumTester(list[i]));\n } else {\n var tester = polygonTester(list[i]);\n tester.subtract = !!list[i].subtract;\n testers.push(tester);\n\n xmin = Math.min(xmin, tester.xmin);\n xmax = Math.max(xmax, tester.xmax);\n ymin = Math.min(ymin, tester.ymin);\n ymax = Math.max(ymax, tester.ymax);\n }\n }\n\n /**\n * Tests if the given point is within this tester.\n *\n * @param {Array} pt - [0] is the x coordinate, [1] is the y coordinate of the point.\n * @param {*} arg - An optional parameter to pass down to wrapped testers.\n * @param {number} pointNumber - The point number of the point within the underlying data array.\n * @param {number} searchInfo - An object identifying the trace the point is contained in.\n *\n * @return {boolean} true if point is considered to be selected, false otherwise.\n */\n function contains(pt, arg, pointNumber, searchInfo) {\n var contained = false;\n for(var i = 0; i < testers.length; i++) {\n if(testers[i].contains(pt, arg, pointNumber, searchInfo)) {\n // if contained by subtract tester - exclude the point\n contained = !testers[i].subtract;\n }\n }\n\n return contained;\n }\n\n return {\n xmin: xmin,\n xmax: xmax,\n ymin: ymin,\n ymax: ymax,\n pts: [],\n contains: contains,\n isRect: false,\n degenerate: false\n };\n}\n\nfunction coerceSelectionsCache(evt, gd, dragOptions) {\n var fullLayout = gd._fullLayout;\n var plotinfo = dragOptions.plotinfo;\n var dragmode = dragOptions.dragmode;\n\n var selectingOnSameSubplot = (\n fullLayout._lastSelectedSubplot &&\n fullLayout._lastSelectedSubplot === plotinfo.id\n );\n\n var hasModifierKey = (evt.shiftKey || evt.altKey) &&\n !(drawMode(dragmode) && openMode(dragmode));\n\n if(\n selectingOnSameSubplot &&\n hasModifierKey &&\n plotinfo.selection &&\n plotinfo.selection.selectionDefs &&\n !dragOptions.selectionDefs\n ) {\n // take over selection definitions from prev mode, if any\n dragOptions.selectionDefs = plotinfo.selection.selectionDefs;\n dragOptions.mergedPolygons = plotinfo.selection.mergedPolygons;\n } else if(!hasModifierKey || !plotinfo.selection) {\n clearSelectionsCache(dragOptions);\n }\n\n // clear selection outline when selecting a different subplot\n if(!selectingOnSameSubplot) {\n clearOutline(gd);\n fullLayout._lastSelectedSubplot = plotinfo.id;\n }\n}\n\nfunction hasActiveShape(gd) {\n return gd._fullLayout._activeShapeIndex >= 0;\n}\n\nfunction hasActiveSelection(gd) {\n return gd._fullLayout._activeSelectionIndex >= 0;\n}\n\nfunction clearSelectionsCache(dragOptions, immediateSelect) {\n var dragmode = dragOptions.dragmode;\n var plotinfo = dragOptions.plotinfo;\n\n var gd = dragOptions.gd;\n if(hasActiveShape(gd)) {\n gd._fullLayout._deactivateShape(gd);\n }\n if(hasActiveSelection(gd)) {\n gd._fullLayout._deactivateSelection(gd);\n }\n\n var fullLayout = gd._fullLayout;\n var zoomLayer = fullLayout._zoomlayer;\n\n var isDrawMode = drawMode(dragmode);\n var isSelectMode = selectMode(dragmode);\n\n if(isDrawMode || isSelectMode) {\n var outlines = zoomLayer.selectAll('.select-outline-' + plotinfo.id);\n if(outlines && gd._fullLayout._outlining) {\n // add shape\n var shapes;\n if(isDrawMode) {\n shapes = newShapes(outlines, dragOptions);\n }\n if(shapes) {\n Registry.call('_guiRelayout', gd, {\n shapes: shapes\n });\n }\n\n // add selection\n var selections;\n if(\n isSelectMode &&\n !hasSubplot(dragOptions) // only allow cartesian - no mapbox for now\n ) {\n selections = newSelections(outlines, dragOptions);\n }\n if(selections) {\n gd._fullLayout._noEmitSelectedAtStart = true;\n\n Registry.call('_guiRelayout', gd, {\n selections: selections\n }).then(function() {\n if(immediateSelect) { activateLastSelection(gd); }\n });\n }\n\n gd._fullLayout._outlining = false;\n }\n }\n\n plotinfo.selection = {};\n plotinfo.selection.selectionDefs = dragOptions.selectionDefs = [];\n plotinfo.selection.mergedPolygons = dragOptions.mergedPolygons = [];\n}\n\nfunction getAxId(ax) {\n return ax._id;\n}\n\nfunction determineSearchTraces(gd, xAxes, yAxes, subplot) {\n if(!gd.calcdata) return [];\n\n var searchTraces = [];\n var xAxisIds = xAxes.map(getAxId);\n var yAxisIds = yAxes.map(getAxId);\n var cd, trace, i;\n\n for(i = 0; i < gd.calcdata.length; i++) {\n cd = gd.calcdata[i];\n trace = cd[0].trace;\n\n if(trace.visible !== true || !trace._module || !trace._module.selectPoints) continue;\n\n if(\n hasSubplot({subplot: subplot}) &&\n (trace.subplot === subplot || trace.geo === subplot)\n ) {\n searchTraces.push(createSearchInfo(trace._module, cd, xAxes[0], yAxes[0]));\n } else if(trace.type === 'splom') {\n // FIXME: make sure we don't have more than single axis for splom\n if(trace._xaxes[xAxisIds[0]] && trace._yaxes[yAxisIds[0]]) {\n var info = createSearchInfo(trace._module, cd, xAxes[0], yAxes[0]);\n info.scene = gd._fullLayout._splomScenes[trace.uid];\n searchTraces.push(info);\n }\n } else if(trace.type === 'sankey') {\n var sankeyInfo = createSearchInfo(trace._module, cd, xAxes[0], yAxes[0]);\n searchTraces.push(sankeyInfo);\n } else {\n if(xAxisIds.indexOf(trace.xaxis) === -1 && (!trace._xA || !trace._xA.overlaying)) continue;\n if(yAxisIds.indexOf(trace.yaxis) === -1 && (!trace._yA || !trace._yA.overlaying)) continue;\n\n searchTraces.push(createSearchInfo(trace._module, cd,\n getFromId(gd, trace.xaxis), getFromId(gd, trace.yaxis)));\n }\n }\n\n return searchTraces;\n}\n\nfunction createSearchInfo(module, calcData, xaxis, yaxis) {\n return {\n _module: module,\n cd: calcData,\n xaxis: xaxis,\n yaxis: yaxis\n };\n}\n\nfunction isHoverDataSet(hoverData) {\n return hoverData &&\n Array.isArray(hoverData) &&\n hoverData[0].hoverOnBox !== true;\n}\n\nfunction extractClickedPtInfo(hoverData, searchTraces) {\n var hoverDatum = hoverData[0];\n var pointNumber = -1;\n var pointNumbers = [];\n var searchInfo, i;\n\n for(i = 0; i < searchTraces.length; i++) {\n searchInfo = searchTraces[i];\n if(hoverDatum.fullData._expandedIndex === searchInfo.cd[0].trace._expandedIndex) {\n // Special case for box (and violin)\n if(hoverDatum.hoverOnBox === true) {\n break;\n }\n\n // Hint: in some traces like histogram, one graphical element\n // doesn't correspond to one particular data point, but to\n // bins of data points. Thus, hoverDatum can have a binNumber\n // property instead of pointNumber.\n if(hoverDatum.pointNumber !== undefined) {\n pointNumber = hoverDatum.pointNumber;\n } else if(hoverDatum.binNumber !== undefined) {\n pointNumber = hoverDatum.binNumber;\n pointNumbers = hoverDatum.pointNumbers;\n }\n\n break;\n }\n }\n\n return {\n pointNumber: pointNumber,\n pointNumbers: pointNumbers,\n searchInfo: searchInfo\n };\n}\n\nfunction isPointOrBinSelected(clickedPtInfo) {\n var trace = clickedPtInfo.searchInfo.cd[0].trace;\n var ptNum = clickedPtInfo.pointNumber;\n var ptNums = clickedPtInfo.pointNumbers;\n var ptNumsSet = ptNums.length > 0;\n\n // When pointsNumbers is set (e.g. histogram's binning),\n // it is assumed that when the first point of\n // a bin is selected, all others are as well\n var ptNumToTest = ptNumsSet ? ptNums[0] : ptNum;\n\n // TODO potential performance improvement\n // Primarily we need this function to determine if a click adds\n // or subtracts from a selection.\n // In cases `trace.selectedpoints` is a huge array, indexOf\n // might be slow. One remedy would be to introduce a hash somewhere.\n return trace.selectedpoints ? trace.selectedpoints.indexOf(ptNumToTest) > -1 : false;\n}\n\nfunction isOnlyThisBinSelected(searchTraces, clickedPtInfo) {\n var tracesWithSelectedPts = [];\n var searchInfo, trace, isSameTrace, i;\n\n for(i = 0; i < searchTraces.length; i++) {\n searchInfo = searchTraces[i];\n if(searchInfo.cd[0].trace.selectedpoints && searchInfo.cd[0].trace.selectedpoints.length > 0) {\n tracesWithSelectedPts.push(searchInfo);\n }\n }\n\n if(tracesWithSelectedPts.length === 1) {\n isSameTrace = tracesWithSelectedPts[0] === clickedPtInfo.searchInfo;\n if(isSameTrace) {\n trace = clickedPtInfo.searchInfo.cd[0].trace;\n if(trace.selectedpoints.length === clickedPtInfo.pointNumbers.length) {\n for(i = 0; i < clickedPtInfo.pointNumbers.length; i++) {\n if(trace.selectedpoints.indexOf(clickedPtInfo.pointNumbers[i]) < 0) {\n return false;\n }\n }\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction isOnlyOnePointSelected(searchTraces) {\n var len = 0;\n var searchInfo, trace, i;\n\n for(i = 0; i < searchTraces.length; i++) {\n searchInfo = searchTraces[i];\n trace = searchInfo.cd[0].trace;\n if(trace.selectedpoints) {\n if(trace.selectedpoints.length > 1) return false;\n\n len += trace.selectedpoints.length;\n if(len > 1) return false;\n }\n }\n\n return len === 1;\n}\n\nfunction updateSelectedState(gd, searchTraces, eventData) {\n var i;\n\n // before anything else, update preGUI if necessary\n for(i = 0; i < searchTraces.length; i++) {\n var fullInputTrace = searchTraces[i].cd[0].trace._fullInput;\n var tracePreGUI = gd._fullLayout._tracePreGUI[fullInputTrace.uid] || {};\n if(tracePreGUI.selectedpoints === undefined) {\n tracePreGUI.selectedpoints = fullInputTrace._input.selectedpoints || null;\n }\n }\n\n var trace;\n if(eventData) {\n var pts = eventData.points || [];\n for(i = 0; i < searchTraces.length; i++) {\n trace = searchTraces[i].cd[0].trace;\n trace._input.selectedpoints = trace._fullInput.selectedpoints = [];\n if(trace._fullInput !== trace) trace.selectedpoints = [];\n }\n\n for(var k = 0; k < pts.length; k++) {\n var pt = pts[k];\n var data = pt.data;\n var fullData = pt.fullData;\n var pointIndex = pt.pointIndex;\n var pointIndices = pt.pointIndices;\n if(pointIndices) {\n [].push.apply(data.selectedpoints, pointIndices);\n if(trace._fullInput !== trace) {\n [].push.apply(fullData.selectedpoints, pointIndices);\n }\n } else {\n data.selectedpoints.push(pointIndex);\n if(trace._fullInput !== trace) {\n fullData.selectedpoints.push(pointIndex);\n }\n }\n }\n } else {\n for(i = 0; i < searchTraces.length; i++) {\n trace = searchTraces[i].cd[0].trace;\n delete trace.selectedpoints;\n delete trace._input.selectedpoints;\n if(trace._fullInput !== trace) {\n delete trace._fullInput.selectedpoints;\n }\n }\n }\n\n updateReglSelectedState(gd, searchTraces);\n}\n\nfunction updateReglSelectedState(gd, searchTraces) {\n var hasRegl = false;\n\n for(var i = 0; i < searchTraces.length; i++) {\n var searchInfo = searchTraces[i];\n var cd = searchInfo.cd;\n\n if(Registry.traceIs(cd[0].trace, 'regl')) {\n hasRegl = true;\n }\n\n var _module = searchInfo._module;\n var fn = _module.styleOnSelect || _module.style;\n if(fn) {\n fn(gd, cd, cd[0].node3);\n if(cd[0].nodeRangePlot3) fn(gd, cd, cd[0].nodeRangePlot3);\n }\n }\n\n if(hasRegl) {\n clearGlCanvases(gd);\n redrawReglTraces(gd);\n }\n}\n\nfunction mergePolygons(list, poly, subtract) {\n var fn = subtract ?\n polybool.difference :\n polybool.union;\n\n var res = fn({\n regions: list\n }, {\n regions: [poly]\n });\n\n var allPolygons = res.regions.reverse();\n\n for(var i = 0; i < allPolygons.length; i++) {\n var polygon = allPolygons[i];\n\n polygon.subtract = getSubtract(polygon, allPolygons.slice(0, i));\n }\n\n return allPolygons;\n}\n\nfunction fillSelectionItem(selection, searchInfo) {\n if(Array.isArray(selection)) {\n var cd = searchInfo.cd;\n var trace = searchInfo.cd[0].trace;\n\n for(var i = 0; i < selection.length; i++) {\n selection[i] = makeEventData(selection[i], trace, cd);\n }\n }\n\n return selection;\n}\n\nfunction convertPoly(polygonsIn, isOpenMode) { // add M and L command to draft positions\n var polygonsOut = [];\n for(var i = 0; i < polygonsIn.length; i++) {\n polygonsOut[i] = [];\n for(var j = 0; j < polygonsIn[i].length; j++) {\n polygonsOut[i][j] = [];\n polygonsOut[i][j][0] = j ? 'L' : 'M';\n for(var k = 0; k < polygonsIn[i][j].length; k++) {\n polygonsOut[i][j].push(\n polygonsIn[i][j][k]\n );\n }\n }\n\n if(!isOpenMode) {\n polygonsOut[i].push([\n 'Z',\n polygonsOut[i][0][1], // initial x\n polygonsOut[i][0][2] // initial y\n ]);\n }\n }\n\n return polygonsOut;\n}\n\nfunction _doSelect(selectionTesters, searchTraces) {\n var allSelections = [];\n\n var thisSelection;\n var traceSelections = [];\n var traceSelection;\n for(var i = 0; i < searchTraces.length; i++) {\n var searchInfo = searchTraces[i];\n\n traceSelection = searchInfo._module.selectPoints(searchInfo, selectionTesters);\n traceSelections.push(traceSelection);\n\n thisSelection = fillSelectionItem(traceSelection, searchInfo);\n\n allSelections = allSelections.concat(thisSelection);\n }\n\n return allSelections;\n}\n\nfunction reselect(gd, mayEmitSelected, selectionTesters, searchTraces, dragOptions) {\n var hadSearchTraces = !!searchTraces;\n var plotinfo, xRef, yRef;\n if(dragOptions) {\n plotinfo = dragOptions.plotinfo;\n xRef = dragOptions.xaxes[0]._id;\n yRef = dragOptions.yaxes[0]._id;\n }\n\n var allSelections = [];\n var allSearchTraces = [];\n\n // select layout.selection polygons\n var layoutPolygons = getLayoutPolygons(gd);\n\n // add draft outline polygons to layoutPolygons\n var fullLayout = gd._fullLayout;\n if(plotinfo) {\n var zoomLayer = fullLayout._zoomlayer;\n var mode = fullLayout.dragmode;\n var isDrawMode = drawMode(mode);\n var isSelectMode = selectMode(mode);\n if(isDrawMode || isSelectMode) {\n var xaxis = getFromId(gd, xRef, 'x');\n var yaxis = getFromId(gd, yRef, 'y');\n if(xaxis && yaxis) {\n var outlines = zoomLayer.selectAll('.select-outline-' + plotinfo.id);\n if(outlines && gd._fullLayout._outlining) {\n if(outlines.length) {\n var e = outlines[0][0]; // pick first\n var d = e.getAttribute('d');\n var outlinePolys = readPaths(d, gd, plotinfo);\n\n var draftPolygons = [];\n for(var u = 0; u < outlinePolys.length; u++) {\n var p = outlinePolys[u];\n var polygon = [];\n for(var t = 0; t < p.length; t++) {\n polygon.push([\n convert(xaxis, p[t][1]),\n convert(yaxis, p[t][2])\n ]);\n }\n\n polygon.xref = xRef;\n polygon.yref = yRef;\n polygon.subtract = getSubtract(polygon, draftPolygons);\n\n draftPolygons.push(polygon);\n }\n\n layoutPolygons = layoutPolygons.concat(draftPolygons);\n }\n }\n }\n }\n }\n\n var subplots = (xRef && yRef) ? [xRef + yRef] :\n fullLayout._subplots.cartesian;\n\n epmtySplomSelectionBatch(gd);\n\n var seenSplom = {};\n\n for(var i = 0; i < subplots.length; i++) {\n var subplot = subplots[i];\n var yAt = subplot.indexOf('y');\n var _xRef = subplot.slice(0, yAt);\n var _yRef = subplot.slice(yAt);\n\n var _selectionTesters = (xRef && yRef) ? selectionTesters : undefined;\n _selectionTesters = addTester(layoutPolygons, _xRef, _yRef, _selectionTesters);\n\n if(_selectionTesters) {\n var _searchTraces = searchTraces;\n if(!hadSearchTraces) {\n var _xA = getFromId(gd, _xRef, 'x');\n var _yA = getFromId(gd, _yRef, 'y');\n\n _searchTraces = determineSearchTraces(\n gd,\n [_xA],\n [_yA],\n subplot\n );\n\n for(var w = 0; w < _searchTraces.length; w++) {\n var s = _searchTraces[w];\n var cd0 = s.cd[0];\n var trace = cd0.trace;\n\n if(s._module.name === 'scattergl' && !cd0.t.xpx) {\n var x = trace.x;\n var y = trace.y;\n var len = trace._length;\n // generate stash for scattergl\n cd0.t.xpx = [];\n cd0.t.ypx = [];\n for(var j = 0; j < len; j++) {\n cd0.t.xpx[j] = _xA.c2p(x[j]);\n cd0.t.ypx[j] = _yA.c2p(y[j]);\n }\n }\n\n if(s._module.name === 'splom') {\n if(!seenSplom[trace.uid]) {\n seenSplom[trace.uid] = true;\n }\n }\n }\n }\n var selection = _doSelect(_selectionTesters, _searchTraces);\n\n allSelections = allSelections.concat(selection);\n allSearchTraces = allSearchTraces.concat(_searchTraces);\n }\n }\n\n var eventData = {points: allSelections};\n updateSelectedState(gd, allSearchTraces, eventData);\n\n var clickmode = fullLayout.clickmode;\n var sendEvents = clickmode.indexOf('event') > -1 && mayEmitSelected;\n\n if(\n !plotinfo && // get called from plot_api & plots\n mayEmitSelected\n ) {\n var activePolygons = getLayoutPolygons(gd, true);\n\n if(activePolygons.length) {\n var xref = activePolygons[0].xref;\n var yref = activePolygons[0].yref;\n if(xref && yref) {\n var poly = castMultiPolygon(activePolygons);\n\n var fillRangeItems = makeFillRangeItems([\n getFromId(gd, xref, 'x'),\n getFromId(gd, yref, 'y')\n ]);\n\n fillRangeItems(eventData, poly);\n }\n }\n\n if(gd._fullLayout._noEmitSelectedAtStart) {\n gd._fullLayout._noEmitSelectedAtStart = false;\n } else {\n if(sendEvents) emitSelected(gd, eventData);\n }\n\n fullLayout._reselect = false;\n }\n\n if(\n !plotinfo && // get called from plot_api & plots\n fullLayout._deselect\n ) {\n var deselect = fullLayout._deselect;\n xRef = deselect.xref;\n yRef = deselect.yref;\n\n if(!subplotSelected(xRef, yRef, allSearchTraces)) {\n deselectSubplot(gd, xRef, yRef, searchTraces);\n }\n\n if(sendEvents) {\n if(eventData.points.length) {\n emitSelected(gd, eventData);\n } else {\n emitDeselect(gd);\n }\n }\n\n fullLayout._deselect = false;\n }\n\n return {\n eventData: eventData,\n selectionTesters: selectionTesters\n };\n}\n\nfunction epmtySplomSelectionBatch(gd) {\n var cd = gd.calcdata;\n if(!cd) return;\n\n for(var i = 0; i < cd.length; i++) {\n var cd0 = cd[i][0];\n var trace = cd0.trace;\n var splomScenes = gd._fullLayout._splomScenes;\n if(splomScenes) {\n var scene = splomScenes[trace.uid];\n if(scene) {\n scene.selectBatch = [];\n }\n }\n }\n}\n\nfunction subplotSelected(xRef, yRef, searchTraces) {\n for(var i = 0; i < searchTraces.length; i++) {\n var s = searchTraces[i];\n if(\n (s.xaxis && s.xaxis._id === xRef) &&\n (s.yaxis && s.yaxis._id === yRef)\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction deselectSubplot(gd, xRef, yRef, searchTraces) {\n searchTraces = determineSearchTraces(\n gd,\n [getFromId(gd, xRef, 'x')],\n [getFromId(gd, yRef, 'y')],\n xRef + yRef\n );\n\n for(var k = 0; k < searchTraces.length; k++) {\n var searchInfo = searchTraces[k];\n searchInfo._module.selectPoints(searchInfo, false);\n }\n\n updateSelectedState(gd, searchTraces);\n}\n\nfunction addTester(layoutPolygons, xRef, yRef, selectionTesters) {\n var mergedPolygons;\n\n for(var i = 0; i < layoutPolygons.length; i++) {\n var currentPolygon = layoutPolygons[i];\n if(xRef !== currentPolygon.xref || yRef !== currentPolygon.yref) continue;\n\n if(mergedPolygons) {\n var subtract = !!currentPolygon.subtract;\n mergedPolygons = mergePolygons(mergedPolygons, currentPolygon, subtract);\n selectionTesters = multiTester(mergedPolygons);\n } else {\n mergedPolygons = [currentPolygon];\n selectionTesters = polygonTester(currentPolygon);\n }\n }\n\n return selectionTesters;\n}\n\nfunction getLayoutPolygons(gd, onlyActiveOnes) {\n var allPolygons = [];\n\n var fullLayout = gd._fullLayout;\n var allSelections = fullLayout.selections;\n var len = allSelections.length;\n\n for(var i = 0; i < len; i++) {\n if(onlyActiveOnes && i !== fullLayout._activeSelectionIndex) continue;\n\n var selection = allSelections[i];\n if(!selection) continue;\n\n var xref = selection.xref;\n var yref = selection.yref;\n\n var xaxis = getFromId(gd, xref, 'x');\n var yaxis = getFromId(gd, yref, 'y');\n\n var xmin, xmax, ymin, ymax;\n\n var polygon;\n if(selection.type === 'rect') {\n polygon = [];\n\n var x0 = convert(xaxis, selection.x0);\n var x1 = convert(xaxis, selection.x1);\n var y0 = convert(yaxis, selection.y0);\n var y1 = convert(yaxis, selection.y1);\n polygon = [[x0, y0], [x0, y1], [x1, y1], [x1, y0]];\n\n xmin = Math.min(x0, x1);\n xmax = Math.max(x0, x1);\n ymin = Math.min(y0, y1);\n ymax = Math.max(y0, y1);\n\n polygon.xmin = xmin;\n polygon.xmax = xmax;\n polygon.ymin = ymin;\n polygon.ymax = ymax;\n\n polygon.xref = xref;\n polygon.yref = yref;\n\n polygon.subtract = false;\n polygon.isRect = true;\n\n allPolygons.push(polygon);\n } else if(selection.type === 'path') {\n var segments = selection.path.split('Z');\n\n var multiPolygons = [];\n for(var j = 0; j < segments.length; j++) {\n var path = segments[j];\n if(!path) continue;\n path += 'Z';\n\n var allX = shapeHelpers.extractPathCoords(path, shapeConstants.paramIsX, 'raw');\n var allY = shapeHelpers.extractPathCoords(path, shapeConstants.paramIsY, 'raw');\n\n xmin = Infinity;\n xmax = -Infinity;\n ymin = Infinity;\n ymax = -Infinity;\n\n polygon = [];\n\n for(var k = 0; k < allX.length; k++) {\n var x = convert(xaxis, allX[k]);\n var y = convert(yaxis, allY[k]);\n\n polygon.push([x, y]);\n\n xmin = Math.min(x, xmin);\n xmax = Math.max(x, xmax);\n ymin = Math.min(y, ymin);\n ymax = Math.max(y, ymax);\n }\n\n polygon.xmin = xmin;\n polygon.xmax = xmax;\n polygon.ymin = ymin;\n polygon.ymax = ymax;\n\n polygon.xref = xref;\n polygon.yref = yref;\n polygon.subtract = getSubtract(polygon, multiPolygons);\n\n multiPolygons.push(polygon);\n allPolygons.push(polygon);\n }\n }\n }\n\n return allPolygons;\n}\n\nfunction getSubtract(polygon, previousPolygons) {\n var subtract = false;\n for(var i = 0; i < previousPolygons.length; i++) {\n var previousPolygon = previousPolygons[i];\n\n // find out if a point of polygon is inside previous polygons\n for(var k = 0; k < polygon.length; k++) {\n if(pointInPolygon(polygon[k], previousPolygon)) {\n subtract = !subtract;\n break;\n }\n }\n }\n return subtract;\n}\n\nfunction convert(ax, d) {\n if(ax.type === 'date') d = d.replace('_', ' ');\n return ax.type === 'log' ? ax.c2p(d) : ax.r2p(d, null, ax.calendar);\n}\n\nfunction castMultiPolygon(allPolygons) {\n var len = allPolygons.length;\n\n // descibe multi polygons in one polygon\n var p = [];\n for(var i = 0; i < len; i++) {\n var polygon = allPolygons[i];\n p = p.concat(polygon);\n\n // add starting vertex to close\n // which indicates next polygon\n p = p.concat([polygon[0]]);\n }\n\n return computeRectAndRanges(p);\n}\n\nfunction computeRectAndRanges(poly) {\n poly.isRect = poly.length === 5 &&\n poly[0][0] === poly[4][0] &&\n poly[0][1] === poly[4][1] &&\n (\n poly[0][0] === poly[1][0] &&\n poly[2][0] === poly[3][0] &&\n poly[0][1] === poly[3][1] &&\n poly[1][1] === poly[2][1]\n ) ||\n (\n poly[0][1] === poly[1][1] &&\n poly[2][1] === poly[3][1] &&\n poly[0][0] === poly[3][0] &&\n poly[1][0] === poly[2][0]\n );\n\n if(poly.isRect) {\n poly.xmin = Math.min(poly[0][0], poly[2][0]);\n poly.xmax = Math.max(poly[0][0], poly[2][0]);\n poly.ymin = Math.min(poly[0][1], poly[2][1]);\n poly.ymax = Math.max(poly[0][1], poly[2][1]);\n }\n\n return poly;\n}\n\nfunction makeFillRangeItems(allAxes) {\n return function(eventData, poly) {\n var range;\n var lassoPoints;\n\n for(var i = 0; i < allAxes.length; i++) {\n var ax = allAxes[i];\n var id = ax._id;\n var axLetter = id.charAt(0);\n\n if(poly.isRect) {\n if(!range) range = {};\n var min = poly[axLetter + 'min'];\n var max = poly[axLetter + 'max'];\n\n if(min !== undefined && max !== undefined) {\n range[id] = [\n p2r(ax, min),\n p2r(ax, max)\n ].sort(ascending);\n }\n } else {\n if(!lassoPoints) lassoPoints = {};\n lassoPoints[id] = poly.map(axValue(ax));\n }\n }\n\n if(range) {\n eventData.range = range;\n }\n\n if(lassoPoints) {\n eventData.lassoPoints = lassoPoints;\n }\n };\n}\n\nfunction getFillRangeItems(dragOptions) {\n var plotinfo = dragOptions.plotinfo;\n\n return (\n plotinfo.fillRangeItems || // allow subplots (i.e. geo, mapbox, sankey) to override fillRangeItems routine\n makeFillRangeItems(dragOptions.xaxes.concat(dragOptions.yaxes))\n );\n}\n\nfunction emitSelecting(gd, eventData) {\n gd.emit('plotly_selecting', eventData);\n}\n\nfunction emitSelected(gd, eventData) {\n if(eventData) {\n eventData.selections = (gd.layout || {}).selections || [];\n }\n\n gd.emit('plotly_selected', eventData);\n}\n\nfunction emitDeselect(gd) {\n gd.emit('plotly_deselect', null);\n}\n\nmodule.exports = {\n reselect: reselect,\n prepSelect: prepSelect,\n clearOutline: clearOutline,\n clearSelectionsCache: clearSelectionsCache,\n selectOnClick: selectOnClick\n};\n","'use strict';\n\nvar annAttrs = require('../annotations/attributes');\nvar fontAttrs = require('../../plots/font_attributes');\nvar scatterLineAttrs = require('../../traces/scatter/attributes').line;\nvar dash = require('../drawing/attributes').dash;\nvar extendFlat = require('../../lib/extend').extendFlat;\nvar templatedArray = require('../../plot_api/plot_template').templatedArray;\nvar axisPlaceableObjs = require('../../constants/axis_placeable_objects');\nvar basePlotAttributes = require('../../plots/attributes');\nvar shapeTexttemplateAttrs = require('../../plots/template_attributes').shapeTexttemplateAttrs;\nvar shapeLabelTexttemplateVars = require('./label_texttemplate');\n\nmodule.exports = templatedArray('shape', {\n visible: extendFlat({}, basePlotAttributes.visible, {\n editType: 'calc+arraydraw',\n description: [\n 'Determines whether or not this shape is visible.',\n 'If *legendonly*, the shape is not drawn,',\n 'but can appear as a legend item',\n '(provided that the legend itself is visible).'\n ].join(' ')\n }),\n\n showlegend: {\n valType: 'boolean',\n dflt: false,\n editType: 'calc+arraydraw',\n description: [\n 'Determines whether or not this',\n 'shape is shown in the legend.'\n ].join(' ')\n },\n\n legend: extendFlat({}, basePlotAttributes.legend, {\n editType: 'calc+arraydraw',\n description: [\n 'Sets the reference to a legend to show this shape in.',\n 'References to these legends are *legend*, *legend2*, *legend3*, etc.',\n 'Settings for these legends are set in the layout, under',\n '`layout.legend`, `layout.legend2`, etc.'\n ].join(' ')\n }),\n\n legendgroup: extendFlat({}, basePlotAttributes.legendgroup, {\n editType: 'calc+arraydraw',\n description: [\n 'Sets the legend group for this shape.',\n 'Traces and shapes part of the same legend group hide/show at the same time',\n 'when toggling legend items.'\n ].join(' ')\n }),\n\n legendgrouptitle: {\n text: extendFlat({}, basePlotAttributes.legendgrouptitle.text, {\n editType: 'calc+arraydraw'\n }),\n font: fontAttrs({\n editType: 'calc+arraydraw',\n description: [\n 'Sets this legend group\\'s title font.'\n ].join(' '),\n }),\n editType: 'calc+arraydraw',\n },\n\n legendrank: extendFlat({}, basePlotAttributes.legendrank, {\n editType: 'calc+arraydraw',\n description: [\n 'Sets the legend rank for this shape.',\n 'Items and groups with smaller ranks are presented on top/left side while',\n 'with *reversed* `legend.traceorder` they are on bottom/right side.',\n 'The default legendrank is 1000,',\n 'so that you can use ranks less than 1000 to place certain items before all unranked items,',\n 'and ranks greater than 1000 to go after all unranked items.',\n 'When having unranked or equal rank items shapes would be displayed after traces',\n 'i.e. according to their order in data and layout.'\n ].join(' ')\n }),\n\n legendwidth: extendFlat({}, basePlotAttributes.legendwidth, {\n editType: 'calc+arraydraw',\n description: 'Sets the width (in px or fraction) of the legend for this shape.',\n }),\n\n type: {\n valType: 'enumerated',\n values: ['circle', 'rect', 'path', 'line'],\n editType: 'calc+arraydraw',\n description: [\n 'Specifies the shape type to be drawn.',\n\n 'If *line*, a line is drawn from (`x0`,`y0`) to (`x1`,`y1`)',\n 'with respect to the axes\\' sizing mode.',\n\n 'If *circle*, a circle is drawn from',\n '((`x0`+`x1`)/2, (`y0`+`y1`)/2))',\n 'with radius',\n '(|(`x0`+`x1`)/2 - `x0`|, |(`y0`+`y1`)/2 -`y0`)|)',\n 'with respect to the axes\\' sizing mode.',\n\n 'If *rect*, a rectangle is drawn linking',\n '(`x0`,`y0`), (`x1`,`y0`), (`x1`,`y1`), (`x0`,`y1`), (`x0`,`y0`)',\n 'with respect to the axes\\' sizing mode.',\n\n 'If *path*, draw a custom SVG path using `path`.',\n 'with respect to the axes\\' sizing mode.'\n ].join(' ')\n },\n\n layer: {\n valType: 'enumerated',\n values: ['below', 'above'],\n dflt: 'above',\n editType: 'arraydraw',\n description: 'Specifies whether shapes are drawn below or above traces.'\n },\n\n xref: extendFlat({}, annAttrs.xref, {\n description: [\n 'Sets the shape\\'s x coordinate axis.',\n axisPlaceableObjs.axisRefDescription('x', 'left', 'right')\n ].join(' ')\n }),\n xsizemode: {\n valType: 'enumerated',\n values: ['scaled', 'pixel'],\n dflt: 'scaled',\n editType: 'calc+arraydraw',\n description: [\n 'Sets the shapes\\'s sizing mode along the x axis.',\n 'If set to *scaled*, `x0`, `x1` and x coordinates within `path` refer to',\n 'data values on the x axis or a fraction of the plot area\\'s width',\n '(`xref` set to *paper*).',\n 'If set to *pixel*, `xanchor` specifies the x position in terms',\n 'of data or plot fraction but `x0`, `x1` and x coordinates within `path`',\n 'are pixels relative to `xanchor`. This way, the shape can have',\n 'a fixed width while maintaining a position relative to data or',\n 'plot fraction.'\n ].join(' ')\n },\n xanchor: {\n valType: 'any',\n editType: 'calc+arraydraw',\n description: [\n 'Only relevant in conjunction with `xsizemode` set to *pixel*.',\n 'Specifies the anchor point on the x axis to which `x0`, `x1`',\n 'and x coordinates within `path` are relative to.',\n 'E.g. useful to attach a pixel sized shape to a certain data value.',\n 'No effect when `xsizemode` not set to *pixel*.'\n ].join(' ')\n },\n x0: {\n valType: 'any',\n editType: 'calc+arraydraw',\n description: [\n 'Sets the shape\\'s starting x position.',\n 'See `type` and `xsizemode` for more info.'\n ].join(' ')\n },\n x1: {\n valType: 'any',\n editType: 'calc+arraydraw',\n description: [\n 'Sets the shape\\'s end x position.',\n 'See `type` and `xsizemode` for more info.'\n ].join(' ')\n },\n\n yref: extendFlat({}, annAttrs.yref, {\n description: [\n 'Sets the shape\\'s y coordinate axis.',\n axisPlaceableObjs.axisRefDescription('y', 'bottom', 'top')\n ].join(' ')\n }),\n ysizemode: {\n valType: 'enumerated',\n values: ['scaled', 'pixel'],\n dflt: 'scaled',\n editType: 'calc+arraydraw',\n description: [\n 'Sets the shapes\\'s sizing mode along the y axis.',\n 'If set to *scaled*, `y0`, `y1` and y coordinates within `path` refer to',\n 'data values on the y axis or a fraction of the plot area\\'s height',\n '(`yref` set to *paper*).',\n 'If set to *pixel*, `yanchor` specifies the y position in terms',\n 'of data or plot fraction but `y0`, `y1` and y coordinates within `path`',\n 'are pixels relative to `yanchor`. This way, the shape can have',\n 'a fixed height while maintaining a position relative to data or',\n 'plot fraction.'\n ].join(' ')\n },\n yanchor: {\n valType: 'any',\n editType: 'calc+arraydraw',\n description: [\n 'Only relevant in conjunction with `ysizemode` set to *pixel*.',\n 'Specifies the anchor point on the y axis to which `y0`, `y1`',\n 'and y coordinates within `path` are relative to.',\n 'E.g. useful to attach a pixel sized shape to a certain data value.',\n 'No effect when `ysizemode` not set to *pixel*.'\n ].join(' ')\n },\n y0: {\n valType: 'any',\n editType: 'calc+arraydraw',\n description: [\n 'Sets the shape\\'s starting y position.',\n 'See `type` and `ysizemode` for more info.'\n ].join(' ')\n },\n y1: {\n valType: 'any',\n editType: 'calc+arraydraw',\n description: [\n 'Sets the shape\\'s end y position.',\n 'See `type` and `ysizemode` for more info.'\n ].join(' ')\n },\n\n path: {\n valType: 'string',\n editType: 'calc+arraydraw',\n description: [\n 'For `type` *path* - a valid SVG path with the pixel values',\n 'replaced by data values in `xsizemode`/`ysizemode` being *scaled*',\n 'and taken unmodified as pixels relative to `xanchor` and `yanchor`',\n 'in case of *pixel* size mode.',\n 'There are a few restrictions / quirks',\n 'only absolute instructions, not relative. So the allowed segments',\n 'are: M, L, H, V, Q, C, T, S, and Z',\n 'arcs (A) are not allowed because radius rx and ry are relative.',\n\n 'In the future we could consider supporting relative commands,',\n 'but we would have to decide on how to handle date and log axes.',\n 'Note that even as is, Q and C Bezier paths that are smooth on',\n 'linear axes may not be smooth on log, and vice versa.',\n 'no chained \"polybezier\" commands - specify the segment type for',\n 'each one.',\n\n 'On category axes, values are numbers scaled to the serial numbers',\n 'of categories because using the categories themselves there would',\n 'be no way to describe fractional positions',\n 'On data axes: because space and T are both normal components of path',\n 'strings, we can\\'t use either to separate date from time parts.',\n 'Therefore we\\'ll use underscore for this purpose:',\n '2015-02-21_13:45:56.789'\n ].join(' ')\n },\n\n opacity: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 1,\n editType: 'arraydraw',\n description: 'Sets the opacity of the shape.'\n },\n line: {\n color: extendFlat({}, scatterLineAttrs.color, {editType: 'arraydraw'}),\n width: extendFlat({}, scatterLineAttrs.width, {editType: 'calc+arraydraw'}),\n dash: extendFlat({}, dash, {editType: 'arraydraw'}),\n editType: 'calc+arraydraw'\n },\n fillcolor: {\n valType: 'color',\n dflt: 'rgba(0,0,0,0)',\n editType: 'arraydraw',\n description: [\n 'Sets the color filling the shape\\'s interior. Only applies to closed shapes.'\n ].join(' ')\n },\n fillrule: {\n valType: 'enumerated',\n values: ['evenodd', 'nonzero'],\n dflt: 'evenodd',\n editType: 'arraydraw',\n description: [\n 'Determines which regions of complex paths constitute the interior.',\n 'For more info please visit https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-rule'\n ].join(' ')\n },\n editable: {\n valType: 'boolean',\n dflt: false,\n editType: 'calc+arraydraw',\n description: [\n 'Determines whether the shape could be activated for edit or not.',\n 'Has no effect when the older editable shapes mode is enabled via',\n '`config.editable` or `config.edits.shapePosition`.'\n ].join(' ')\n },\n label: {\n text: {\n valType: 'string',\n dflt: '',\n editType: 'arraydraw',\n description: [\n 'Sets the text to display with shape.',\n 'It is also used for legend item if `name` is not provided.'\n ].join(' ')\n },\n texttemplate: shapeTexttemplateAttrs({}, {keys: Object.keys(shapeLabelTexttemplateVars)}),\n font: fontAttrs({\n editType: 'calc+arraydraw',\n colorEditType: 'arraydraw',\n description: 'Sets the shape label text font.'\n }),\n textposition: {\n valType: 'enumerated',\n values: [\n 'top left', 'top center', 'top right',\n 'middle left', 'middle center', 'middle right',\n 'bottom left', 'bottom center', 'bottom right',\n 'start', 'middle', 'end',\n ],\n editType: 'arraydraw',\n description: [\n 'Sets the position of the label text relative to the shape.',\n 'Supported values for rectangles, circles and paths are',\n '*top left*, *top center*, *top right*, *middle left*,',\n '*middle center*, *middle right*, *bottom left*, *bottom center*,',\n 'and *bottom right*.',\n 'Supported values for lines are *start*, *middle*, and *end*.',\n 'Default: *middle center* for rectangles, circles, and paths; *middle* for lines.',\n ].join(' ')\n },\n textangle: {\n valType: 'angle',\n dflt: 'auto',\n editType: 'calc+arraydraw',\n description: [\n 'Sets the angle at which the label text is drawn',\n 'with respect to the horizontal. For lines, angle *auto*',\n 'is the same angle as the line. For all other shapes,',\n 'angle *auto* is horizontal.'\n ].join(' ')\n },\n xanchor: {\n valType: 'enumerated',\n values: ['auto', 'left', 'center', 'right'],\n dflt: 'auto',\n editType: 'calc+arraydraw',\n description: [\n 'Sets the label\\'s horizontal position anchor',\n 'This anchor binds the specified `textposition` to the *left*, *center*',\n 'or *right* of the label text.',\n 'For example, if `textposition` is set to *top right* and',\n '`xanchor` to *right* then the right-most portion of the',\n 'label text lines up with the right-most edge of the',\n 'shape.',\n ].join(' '),\n },\n yanchor: {\n valType: 'enumerated',\n values: ['top', 'middle', 'bottom'],\n editType: 'calc+arraydraw',\n description: [\n 'Sets the label\\'s vertical position anchor',\n 'This anchor binds the specified `textposition` to the *top*, *middle*',\n 'or *bottom* of the label text.',\n 'For example, if `textposition` is set to *top right* and',\n '`yanchor` to *top* then the top-most portion of the',\n 'label text lines up with the top-most edge of the',\n 'shape.',\n ].join(' ')\n },\n padding: {\n valType: 'number',\n dflt: 3,\n min: 0,\n editType: 'arraydraw',\n description: 'Sets padding (in px) between edge of label and edge of shape.'\n },\n editType: 'arraydraw'\n },\n editType: 'arraydraw'\n});\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Axes = require('../../plots/cartesian/axes');\n\nvar constants = require('./constants');\nvar helpers = require('./helpers');\n\n\nmodule.exports = function calcAutorange(gd) {\n var fullLayout = gd._fullLayout;\n var shapeList = Lib.filterVisible(fullLayout.shapes);\n\n if(!shapeList.length || !gd._fullData.length) return;\n\n for(var i = 0; i < shapeList.length; i++) {\n var shape = shapeList[i];\n shape._extremes = {};\n\n var ax; var bounds;\n var xRefType = Axes.getRefType(shape.xref);\n var yRefType = Axes.getRefType(shape.yref);\n\n // paper and axis domain referenced shapes don't affect autorange\n if(shape.xref !== 'paper' && xRefType !== 'domain') {\n var vx0 = shape.xsizemode === 'pixel' ? shape.xanchor : shape.x0;\n var vx1 = shape.xsizemode === 'pixel' ? shape.xanchor : shape.x1;\n ax = Axes.getFromId(gd, shape.xref);\n\n bounds = shapeBounds(ax, vx0, vx1, shape.path, constants.paramIsX);\n if(bounds) {\n shape._extremes[ax._id] = Axes.findExtremes(ax, bounds, calcXPaddingOptions(shape));\n }\n }\n\n if(shape.yref !== 'paper' && yRefType !== 'domain') {\n var vy0 = shape.ysizemode === 'pixel' ? shape.yanchor : shape.y0;\n var vy1 = shape.ysizemode === 'pixel' ? shape.yanchor : shape.y1;\n ax = Axes.getFromId(gd, shape.yref);\n\n bounds = shapeBounds(ax, vy0, vy1, shape.path, constants.paramIsY);\n if(bounds) {\n shape._extremes[ax._id] = Axes.findExtremes(ax, bounds, calcYPaddingOptions(shape));\n }\n }\n }\n};\n\nfunction calcXPaddingOptions(shape) {\n return calcPaddingOptions(shape.line.width, shape.xsizemode, shape.x0, shape.x1, shape.path, false);\n}\n\nfunction calcYPaddingOptions(shape) {\n return calcPaddingOptions(shape.line.width, shape.ysizemode, shape.y0, shape.y1, shape.path, true);\n}\n\nfunction calcPaddingOptions(lineWidth, sizeMode, v0, v1, path, isYAxis) {\n var ppad = lineWidth / 2;\n var axisDirectionReverted = isYAxis;\n\n if(sizeMode === 'pixel') {\n var coords = path ?\n helpers.extractPathCoords(path, isYAxis ? constants.paramIsY : constants.paramIsX) :\n [v0, v1];\n var maxValue = Lib.aggNums(Math.max, null, coords);\n var minValue = Lib.aggNums(Math.min, null, coords);\n var beforePad = minValue < 0 ? Math.abs(minValue) + ppad : ppad;\n var afterPad = maxValue > 0 ? maxValue + ppad : ppad;\n\n return {\n ppad: ppad,\n ppadplus: axisDirectionReverted ? beforePad : afterPad,\n ppadminus: axisDirectionReverted ? afterPad : beforePad\n };\n } else {\n return {ppad: ppad};\n }\n}\n\nfunction shapeBounds(ax, v0, v1, path, paramsToUse) {\n var convertVal = (ax.type === 'category' || ax.type === 'multicategory') ? ax.r2c : ax.d2c;\n\n if(v0 !== undefined) return [convertVal(v0), convertVal(v1)];\n if(!path) return;\n\n var min = Infinity;\n var max = -Infinity;\n var segments = path.match(constants.segmentRE);\n var i;\n var segment;\n var drawnParam;\n var params;\n var val;\n\n if(ax.type === 'date') convertVal = helpers.decodeDate(convertVal);\n\n for(i = 0; i < segments.length; i++) {\n segment = segments[i];\n drawnParam = paramsToUse[segment.charAt(0)].drawn;\n if(drawnParam === undefined) continue;\n\n params = segments[i].substr(1).match(constants.paramRE);\n if(!params || params.length < drawnParam) continue;\n\n val = convertVal(params[drawnParam]);\n if(val < min) min = val;\n if(val > max) max = val;\n }\n if(max >= min) return [min, max];\n}\n","'use strict';\n\n\nmodule.exports = {\n segmentRE: /[MLHVQCTSZ][^MLHVQCTSZ]*/g,\n paramRE: /[^\\s,]+/g,\n\n // which numbers in each path segment are x (or y) values\n // drawn is which param is a drawn point, as opposed to a\n // control point (which doesn't count toward autorange.\n // TODO: this means curved paths could extend beyond the\n // autorange bounds. This is a bit tricky to get right\n // unless we revert to bounding boxes, but perhaps there's\n // a calculation we could do...)\n paramIsX: {\n M: {0: true, drawn: 0},\n L: {0: true, drawn: 0},\n H: {0: true, drawn: 0},\n V: {},\n Q: {0: true, 2: true, drawn: 2},\n C: {0: true, 2: true, 4: true, drawn: 4},\n T: {0: true, drawn: 0},\n S: {0: true, 2: true, drawn: 2},\n // A: {0: true, 5: true},\n Z: {}\n },\n\n paramIsY: {\n M: {1: true, drawn: 1},\n L: {1: true, drawn: 1},\n H: {},\n V: {0: true, drawn: 0},\n Q: {1: true, 3: true, drawn: 3},\n C: {1: true, 3: true, 5: true, drawn: 5},\n T: {1: true, drawn: 1},\n S: {1: true, 3: true, drawn: 5},\n // A: {1: true, 6: true},\n Z: {}\n },\n\n numParams: {\n M: 2,\n L: 2,\n H: 1,\n V: 1,\n Q: 4,\n C: 6,\n T: 2,\n S: 4,\n // A: 7,\n Z: 0\n }\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Axes = require('../../plots/cartesian/axes');\nvar handleArrayContainerDefaults = require('../../plots/array_container_defaults');\n\nvar attributes = require('./attributes');\nvar helpers = require('./helpers');\n\n\nmodule.exports = function supplyLayoutDefaults(layoutIn, layoutOut) {\n handleArrayContainerDefaults(layoutIn, layoutOut, {\n name: 'shapes',\n handleItemDefaults: handleShapeDefaults\n });\n};\n\nfunction dfltLabelYanchor(isLine, labelTextPosition) {\n // If shape is a line, default y-anchor is 'bottom' (so that text is above line by default)\n // Otherwise, default y-anchor is equal to y-component of `textposition`\n // (so that text is positioned inside shape bounding box by default)\n return isLine ? 'bottom' :\n labelTextPosition.indexOf('top') !== -1 ? 'top' :\n labelTextPosition.indexOf('bottom') !== -1 ? 'bottom' : 'middle';\n}\n\nfunction handleShapeDefaults(shapeIn, shapeOut, fullLayout) {\n function coerce(attr, dflt) {\n return Lib.coerce(shapeIn, shapeOut, attributes, attr, dflt);\n }\n\n shapeOut._isShape = true;\n\n var visible = coerce('visible');\n if(!visible) return;\n\n var showlegend = coerce('showlegend');\n if(showlegend) {\n coerce('legend');\n coerce('legendwidth');\n coerce('legendgroup');\n coerce('legendgrouptitle.text');\n Lib.coerceFont(coerce, 'legendgrouptitle.font');\n coerce('legendrank');\n }\n\n var path = coerce('path');\n var dfltType = path ? 'path' : 'rect';\n var shapeType = coerce('type', dfltType);\n var noPath = shapeType !== 'path';\n if(noPath) delete shapeOut.path;\n\n coerce('editable');\n coerce('layer');\n coerce('opacity');\n coerce('fillcolor');\n coerce('fillrule');\n var lineWidth = coerce('line.width');\n if(lineWidth) {\n coerce('line.color');\n coerce('line.dash');\n }\n\n var xSizeMode = coerce('xsizemode');\n var ySizeMode = coerce('ysizemode');\n\n // positioning\n var axLetters = ['x', 'y'];\n for(var i = 0; i < 2; i++) {\n var axLetter = axLetters[i];\n var attrAnchor = axLetter + 'anchor';\n var sizeMode = axLetter === 'x' ? xSizeMode : ySizeMode;\n var gdMock = {_fullLayout: fullLayout};\n var ax;\n var pos2r;\n var r2pos;\n\n // xref, yref\n var axRef = Axes.coerceRef(shapeIn, shapeOut, gdMock, axLetter, undefined,\n 'paper');\n var axRefType = Axes.getRefType(axRef);\n\n if(axRefType === 'range') {\n ax = Axes.getFromId(gdMock, axRef);\n ax._shapeIndices.push(shapeOut._index);\n r2pos = helpers.rangeToShapePosition(ax);\n pos2r = helpers.shapePositionToRange(ax);\n } else {\n pos2r = r2pos = Lib.identity;\n }\n\n // Coerce x0, x1, y0, y1\n if(noPath) {\n var dflt0 = 0.25;\n var dflt1 = 0.75;\n\n // hack until V3.0 when log has regular range behavior - make it look like other\n // ranges to send to coerce, then put it back after\n // this is all to give reasonable default position behavior on log axes, which is\n // a pretty unimportant edge case so we could just ignore this.\n var attr0 = axLetter + '0';\n var attr1 = axLetter + '1';\n var in0 = shapeIn[attr0];\n var in1 = shapeIn[attr1];\n shapeIn[attr0] = pos2r(shapeIn[attr0], true);\n shapeIn[attr1] = pos2r(shapeIn[attr1], true);\n\n if(sizeMode === 'pixel') {\n coerce(attr0, 0);\n coerce(attr1, 10);\n } else {\n Axes.coercePosition(shapeOut, gdMock, coerce, axRef, attr0, dflt0);\n Axes.coercePosition(shapeOut, gdMock, coerce, axRef, attr1, dflt1);\n }\n\n // hack part 2\n shapeOut[attr0] = r2pos(shapeOut[attr0]);\n shapeOut[attr1] = r2pos(shapeOut[attr1]);\n shapeIn[attr0] = in0;\n shapeIn[attr1] = in1;\n }\n\n // Coerce xanchor and yanchor\n if(sizeMode === 'pixel') {\n // Hack for log axis described above\n var inAnchor = shapeIn[attrAnchor];\n shapeIn[attrAnchor] = pos2r(shapeIn[attrAnchor], true);\n\n Axes.coercePosition(shapeOut, gdMock, coerce, axRef, attrAnchor, 0.25);\n\n // Hack part 2\n shapeOut[attrAnchor] = r2pos(shapeOut[attrAnchor]);\n shapeIn[attrAnchor] = inAnchor;\n }\n }\n\n if(noPath) {\n Lib.noneOrAll(shapeIn, shapeOut, ['x0', 'x1', 'y0', 'y1']);\n }\n\n // Label options\n var isLine = shapeType === 'line';\n var labelTextTemplate, labelText;\n if(noPath) { labelTextTemplate = coerce('label.texttemplate'); }\n if(!labelTextTemplate) { labelText = coerce('label.text'); }\n if(labelText || labelTextTemplate) {\n coerce('label.textangle');\n var labelTextPosition = coerce('label.textposition', isLine ? 'middle' : 'middle center');\n coerce('label.xanchor');\n coerce('label.yanchor', dfltLabelYanchor(isLine, labelTextPosition));\n coerce('label.padding');\n Lib.coerceFont(coerce, 'label.font', fullLayout.font);\n }\n}\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Axes = require('../../plots/cartesian/axes');\nvar svgTextUtils = require('../../lib/svg_text_utils');\n\nvar Drawing = require('../drawing');\n\nvar readPaths = require('./draw_newshape/helpers').readPaths;\nvar helpers = require('./helpers');\nvar getPathString = helpers.getPathString;\nvar shapeLabelTexttemplateVars = require('./label_texttemplate');\n\nvar FROM_TL = require('../../constants/alignment').FROM_TL;\n\n\nmodule.exports = function drawLabel(gd, index, options, shapeGroup) {\n // Remove existing label\n shapeGroup.selectAll('.shape-label').remove();\n\n // If no label text or texttemplate, return\n if(!(options.label.text || options.label.texttemplate)) return;\n\n // Text template overrides text\n var text;\n if(options.label.texttemplate) {\n var templateValues = {};\n if(options.type !== 'path') {\n var _xa = Axes.getFromId(gd, options.xref);\n var _ya = Axes.getFromId(gd, options.yref);\n for(var key in shapeLabelTexttemplateVars) {\n var val = shapeLabelTexttemplateVars[key](options, _xa, _ya);\n if(val !== undefined) templateValues[key] = val;\n }\n }\n text = Lib.texttemplateStringForShapes(options.label.texttemplate,\n {},\n gd._fullLayout._d3locale,\n templateValues);\n } else {\n text = options.label.text;\n }\n\n var labelGroupAttrs = {\n 'data-index': index,\n };\n var font = options.label.font;\n\n var labelTextAttrs = {\n 'data-notex': 1\n };\n\n var labelGroup = shapeGroup.append('g')\n .attr(labelGroupAttrs)\n .classed('shape-label', true);\n var labelText = labelGroup.append('text')\n .attr(labelTextAttrs)\n .classed('shape-label-text', true)\n .text(text);\n\n // Get x and y bounds of shape\n var shapex0, shapex1, shapey0, shapey1;\n if(options.path) {\n // If shape is defined as a path, get the\n // min and max bounds across all polygons in path\n var d = getPathString(gd, options);\n var polygons = readPaths(d, gd);\n shapex0 = Infinity;\n shapey0 = Infinity;\n shapex1 = -Infinity;\n shapey1 = -Infinity;\n for(var i = 0; i < polygons.length; i++) {\n for(var j = 0; j < polygons[i].length; j++) {\n var p = polygons[i][j];\n for(var k = 1; k < p.length; k += 2) {\n var _x = p[k];\n var _y = p[k + 1];\n\n shapex0 = Math.min(shapex0, _x);\n shapex1 = Math.max(shapex1, _x);\n shapey0 = Math.min(shapey0, _y);\n shapey1 = Math.max(shapey1, _y);\n }\n }\n }\n } else {\n // Otherwise, we use the x and y bounds defined in the shape options\n // and convert them to pixel coordinates\n // Setup conversion functions\n var xa = Axes.getFromId(gd, options.xref);\n var xRefType = Axes.getRefType(options.xref);\n var ya = Axes.getFromId(gd, options.yref);\n var yRefType = Axes.getRefType(options.yref);\n var x2p = helpers.getDataToPixel(gd, xa, false, xRefType);\n var y2p = helpers.getDataToPixel(gd, ya, true, yRefType);\n shapex0 = x2p(options.x0);\n shapex1 = x2p(options.x1);\n shapey0 = y2p(options.y0);\n shapey1 = y2p(options.y1);\n }\n\n // Handle `auto` angle\n var textangle = options.label.textangle;\n if(textangle === 'auto') {\n if(options.type === 'line') {\n // Auto angle for line is same angle as line\n textangle = calcTextAngle(shapex0, shapey0, shapex1, shapey1);\n } else {\n // Auto angle for all other shapes is 0\n textangle = 0;\n }\n }\n\n // Do an initial render so we can get the text bounding box height\n labelText.call(function(s) {\n s.call(Drawing.font, font).attr({});\n svgTextUtils.convertToTspans(s, gd);\n return s;\n });\n var textBB = Drawing.bBox(labelText.node());\n\n // Calculate correct (x,y) for text\n // We also determine true xanchor since xanchor depends on position when set to 'auto'\n var textPos = calcTextPosition(shapex0, shapey0, shapex1, shapey1, options, textangle, textBB);\n var textx = textPos.textx;\n var texty = textPos.texty;\n var xanchor = textPos.xanchor;\n\n // Update (x,y) position, xanchor, and angle\n labelText.attr({\n 'text-anchor': {\n left: 'start',\n center: 'middle',\n right: 'end'\n }[xanchor],\n y: texty,\n x: textx,\n transform: 'rotate(' + textangle + ',' + textx + ',' + texty + ')'\n }).call(svgTextUtils.positionText, textx, texty);\n};\n\nfunction calcTextAngle(shapex0, shapey0, shapex1, shapey1) {\n var dy, dx;\n dx = Math.abs(shapex1 - shapex0);\n if(shapex1 >= shapex0) {\n dy = shapey0 - shapey1;\n } else {\n dy = shapey1 - shapey0;\n }\n return -180 / Math.PI * Math.atan2(dy, dx);\n}\n\nfunction calcTextPosition(shapex0, shapey0, shapex1, shapey1, shapeOptions, actualTextAngle, textBB) {\n var textPosition = shapeOptions.label.textposition;\n var textAngle = shapeOptions.label.textangle;\n var textPadding = shapeOptions.label.padding;\n var shapeType = shapeOptions.type;\n var textAngleRad = Math.PI / 180 * actualTextAngle;\n var sinA = Math.sin(textAngleRad);\n var cosA = Math.cos(textAngleRad);\n var xanchor = shapeOptions.label.xanchor;\n var yanchor = shapeOptions.label.yanchor;\n\n var textx, texty, paddingX, paddingY;\n\n // Text position functions differently for lines vs. other shapes\n if(shapeType === 'line') {\n // Set base position for start vs. center vs. end of line (default is 'center')\n if(textPosition === 'start') {\n textx = shapex0;\n texty = shapey0;\n } else if(textPosition === 'end') {\n textx = shapex1;\n texty = shapey1;\n } else { // Default: center\n textx = (shapex0 + shapex1) / 2;\n texty = (shapey0 + shapey1) / 2;\n }\n\n // Set xanchor if xanchor is 'auto'\n if(xanchor === 'auto') {\n if(textPosition === 'start') {\n if(textAngle === 'auto') {\n if(shapex1 > shapex0) xanchor = 'left';\n else if(shapex1 < shapex0) xanchor = 'right';\n else xanchor = 'center';\n } else {\n if(shapex1 > shapex0) xanchor = 'right';\n else if(shapex1 < shapex0) xanchor = 'left';\n else xanchor = 'center';\n }\n } else if(textPosition === 'end') {\n if(textAngle === 'auto') {\n if(shapex1 > shapex0) xanchor = 'right';\n else if(shapex1 < shapex0) xanchor = 'left';\n else xanchor = 'center';\n } else {\n if(shapex1 > shapex0) xanchor = 'left';\n else if(shapex1 < shapex0) xanchor = 'right';\n else xanchor = 'center';\n }\n } else {\n xanchor = 'center';\n }\n }\n\n // Special case for padding when angle is 'auto' for lines\n // Padding should be treated as an orthogonal offset in this case\n // Otherwise, padding is just a simple x and y offset\n var paddingConstantsX = { left: 1, center: 0, right: -1 };\n var paddingConstantsY = { bottom: -1, middle: 0, top: 1 };\n if(textAngle === 'auto') {\n // Set direction to apply padding (based on `yanchor` only)\n var paddingDirection = paddingConstantsY[yanchor];\n paddingX = -textPadding * sinA * paddingDirection;\n paddingY = textPadding * cosA * paddingDirection;\n } else {\n // Set direction to apply padding (based on `xanchor` and `yanchor`)\n var paddingDirectionX = paddingConstantsX[xanchor];\n var paddingDirectionY = paddingConstantsY[yanchor];\n paddingX = textPadding * paddingDirectionX;\n paddingY = textPadding * paddingDirectionY;\n }\n textx = textx + paddingX;\n texty = texty + paddingY;\n } else {\n // Text position for shapes that are not lines\n // calc horizontal position\n // Horizontal needs a little extra padding to look balanced\n paddingX = textPadding + 3;\n if(textPosition.indexOf('right') !== -1) {\n textx = Math.max(shapex0, shapex1) - paddingX;\n if(xanchor === 'auto') xanchor = 'right';\n } else if(textPosition.indexOf('left') !== -1) {\n textx = Math.min(shapex0, shapex1) + paddingX;\n if(xanchor === 'auto') xanchor = 'left';\n } else { // Default: center\n textx = (shapex0 + shapex1) / 2;\n if(xanchor === 'auto') xanchor = 'center';\n }\n\n // calc vertical position\n if(textPosition.indexOf('top') !== -1) {\n texty = Math.min(shapey0, shapey1);\n } else if(textPosition.indexOf('bottom') !== -1) {\n texty = Math.max(shapey0, shapey1);\n } else {\n texty = (shapey0 + shapey1) / 2;\n }\n // Apply padding\n paddingY = textPadding;\n if(yanchor === 'bottom') {\n texty = texty - paddingY;\n } else if(yanchor === 'top') {\n texty = texty + paddingY;\n }\n }\n\n // Shift vertical (& horizontal) position according to `yanchor`\n var shiftFraction = FROM_TL[yanchor];\n // Adjust so that text is anchored at top of first line rather than at baseline of first line\n var baselineAdjust = shapeOptions.label.font.size;\n var textHeight = textBB.height;\n var xshift = (textHeight * shiftFraction - baselineAdjust) * sinA;\n var yshift = -(textHeight * shiftFraction - baselineAdjust) * cosA;\n\n return { textx: textx + xshift, texty: texty + yshift, xanchor: xanchor };\n}\n","'use strict';\n\nvar Lib = require('../../lib');\nvar strTranslate = Lib.strTranslate;\n\nvar dragElement = require('../dragelement');\nvar dragHelpers = require('../dragelement/helpers');\nvar drawMode = dragHelpers.drawMode;\nvar selectMode = dragHelpers.selectMode;\n\nvar Registry = require('../../registry');\nvar Color = require('../color');\n\nvar constants = require('./draw_newshape/constants');\nvar i000 = constants.i000;\nvar i090 = constants.i090;\nvar i180 = constants.i180;\nvar i270 = constants.i270;\n\nvar handleOutline = require('./handle_outline');\nvar clearOutlineControllers = handleOutline.clearOutlineControllers;\n\nvar helpers = require('./draw_newshape/helpers');\nvar pointsOnRectangle = helpers.pointsOnRectangle;\nvar pointsOnEllipse = helpers.pointsOnEllipse;\nvar writePaths = helpers.writePaths;\nvar newShapes = require('./draw_newshape/newshapes').newShapes;\nvar createShapeObj = require('./draw_newshape/newshapes').createShapeObj;\nvar newSelections = require('../selections/draw_newselection/newselections');\nvar drawLabel = require('./display_labels');\n\n\nmodule.exports = function displayOutlines(polygons, outlines, dragOptions, nCalls) {\n if(!nCalls) nCalls = 0;\n\n var gd = dragOptions.gd;\n\n function redraw() {\n // recursive call\n displayOutlines(polygons, outlines, dragOptions, nCalls++);\n\n if(pointsOnEllipse(polygons[0]) || dragOptions.hasText) {\n update({redrawing: true});\n }\n }\n\n function update(opts) {\n var updateObject = {};\n\n if(dragOptions.isActiveShape !== undefined) {\n dragOptions.isActiveShape = false; // i.e. to disable shape controllers\n updateObject = newShapes(outlines, dragOptions);\n }\n\n if(dragOptions.isActiveSelection !== undefined) {\n dragOptions.isActiveSelection = false; // i.e. to disable selection controllers\n updateObject = newSelections(outlines, dragOptions);\n\n gd._fullLayout._reselect = true;\n }\n\n if(Object.keys(updateObject).length) {\n Registry.call((opts || {}).redrawing ? 'relayout' : '_guiRelayout', gd, updateObject);\n }\n }\n\n var fullLayout = gd._fullLayout;\n var zoomLayer = fullLayout._zoomlayer;\n\n var dragmode = dragOptions.dragmode;\n var isDrawMode = drawMode(dragmode);\n var isSelectMode = selectMode(dragmode);\n\n if(isDrawMode || isSelectMode) {\n gd._fullLayout._outlining = true;\n }\n\n clearOutlineControllers(gd);\n\n // make outline\n outlines.attr('d', writePaths(polygons));\n\n // add controllers\n var vertexDragOptions;\n var groupDragOptions;\n var indexI; // cell index\n var indexJ; // vertex or cell-controller index\n var copyPolygons;\n\n if(!nCalls && (\n dragOptions.isActiveShape ||\n dragOptions.isActiveSelection\n )) {\n copyPolygons = recordPositions([], polygons);\n\n var g = zoomLayer.append('g').attr('class', 'outline-controllers');\n addVertexControllers(g);\n addGroupControllers();\n }\n\n // draw label\n if(isDrawMode && dragOptions.hasText) {\n var shapeGroup = zoomLayer.select('.label-temp');\n var shapeOptions = createShapeObj(outlines, dragOptions, dragOptions.dragmode);\n drawLabel(gd, 'label-temp', shapeOptions, shapeGroup);\n }\n\n function startDragVertex(evt) {\n indexI = +evt.srcElement.getAttribute('data-i');\n indexJ = +evt.srcElement.getAttribute('data-j');\n\n vertexDragOptions[indexI][indexJ].moveFn = moveVertexController;\n }\n\n function moveVertexController(dx, dy) {\n if(!polygons.length) return;\n\n var x0 = copyPolygons[indexI][indexJ][1];\n var y0 = copyPolygons[indexI][indexJ][2];\n\n var cell = polygons[indexI];\n var len = cell.length;\n if(pointsOnRectangle(cell)) {\n var _dx = dx;\n var _dy = dy;\n if(dragOptions.isActiveSelection) {\n // handle an edge contoller for rect selections\n var nextPoint = getNextPoint(cell, indexJ);\n if(nextPoint[1] === cell[indexJ][1]) { // a vertical edge\n _dy = 0;\n } else { // a horizontal edge\n _dx = 0;\n }\n }\n\n for(var q = 0; q < len; q++) {\n if(q === indexJ) continue;\n\n // move other corners of rectangle\n var pos = cell[q];\n\n if(pos[1] === cell[indexJ][1]) {\n pos[1] = x0 + _dx;\n }\n\n if(pos[2] === cell[indexJ][2]) {\n pos[2] = y0 + _dy;\n }\n }\n // move the corner\n cell[indexJ][1] = x0 + _dx;\n cell[indexJ][2] = y0 + _dy;\n\n if(!pointsOnRectangle(cell)) {\n // reject result to rectangles with ensure areas\n for(var j = 0; j < len; j++) {\n for(var k = 0; k < cell[j].length; k++) {\n cell[j][k] = copyPolygons[indexI][j][k];\n }\n }\n }\n } else { // other polylines\n cell[indexJ][1] = x0 + dx;\n cell[indexJ][2] = y0 + dy;\n }\n\n redraw();\n }\n\n function endDragVertexController() {\n update();\n }\n\n function removeVertex() {\n if(!polygons.length) return;\n if(!polygons[indexI]) return;\n if(!polygons[indexI].length) return;\n\n var newPolygon = [];\n for(var j = 0; j < polygons[indexI].length; j++) {\n if(j !== indexJ) {\n newPolygon.push(\n polygons[indexI][j]\n );\n }\n }\n\n if(newPolygon.length > 1 && !(\n newPolygon.length === 2 && newPolygon[1][0] === 'Z')\n ) {\n if(indexJ === 0) {\n newPolygon[0][0] = 'M';\n }\n\n polygons[indexI] = newPolygon;\n\n redraw();\n update();\n }\n }\n\n function clickVertexController(numClicks, evt) {\n if(numClicks === 2) {\n indexI = +evt.srcElement.getAttribute('data-i');\n indexJ = +evt.srcElement.getAttribute('data-j');\n\n var cell = polygons[indexI];\n if(\n !pointsOnRectangle(cell) &&\n !pointsOnEllipse(cell)\n ) {\n removeVertex();\n }\n }\n }\n\n function addVertexControllers(g) {\n vertexDragOptions = [];\n\n for(var i = 0; i < polygons.length; i++) {\n var cell = polygons[i];\n\n var onRect = pointsOnRectangle(cell);\n var onEllipse = !onRect && pointsOnEllipse(cell);\n\n vertexDragOptions[i] = [];\n var len = cell.length;\n for(var j = 0; j < len; j++) {\n if(cell[j][0] === 'Z') continue;\n\n if(onEllipse &&\n j !== i000 &&\n j !== i090 &&\n j !== i180 &&\n j !== i270\n ) {\n continue;\n }\n\n var rectSelection = onRect && dragOptions.isActiveSelection;\n var nextPoint;\n if(rectSelection) nextPoint = getNextPoint(cell, j);\n\n var x = cell[j][1];\n var y = cell[j][2];\n\n var vertex = g.append(rectSelection ? 'rect' : 'circle')\n .attr('data-i', i)\n .attr('data-j', j)\n .style({\n fill: Color.background,\n stroke: Color.defaultLine,\n 'stroke-width': 1,\n 'shape-rendering': 'crispEdges',\n });\n\n if(rectSelection) {\n // convert a vertex controller to an edge controller for rect selections\n var dx = nextPoint[1] - x;\n var dy = nextPoint[2] - y;\n\n var width = dy ? 5 : Math.max(Math.min(25, Math.abs(dx) - 5), 5);\n var height = dx ? 5 : Math.max(Math.min(25, Math.abs(dy) - 5), 5);\n\n vertex.classed(dy ? 'cursor-ew-resize' : 'cursor-ns-resize', true)\n .attr('width', width)\n .attr('height', height)\n .attr('x', x - width / 2)\n .attr('y', y - height / 2)\n .attr('transform', strTranslate(dx / 2, dy / 2));\n } else {\n vertex.classed('cursor-grab', true)\n .attr('r', 5)\n .attr('cx', x)\n .attr('cy', y);\n }\n\n vertexDragOptions[i][j] = {\n element: vertex.node(),\n gd: gd,\n prepFn: startDragVertex,\n doneFn: endDragVertexController,\n clickFn: clickVertexController\n };\n\n dragElement.init(vertexDragOptions[i][j]);\n }\n }\n }\n\n function moveGroup(dx, dy) {\n if(!polygons.length) return;\n\n for(var i = 0; i < polygons.length; i++) {\n for(var j = 0; j < polygons[i].length; j++) {\n for(var k = 0; k + 2 < polygons[i][j].length; k += 2) {\n polygons[i][j][k + 1] = copyPolygons[i][j][k + 1] + dx;\n polygons[i][j][k + 2] = copyPolygons[i][j][k + 2] + dy;\n }\n }\n }\n }\n\n function moveGroupController(dx, dy) {\n moveGroup(dx, dy);\n\n redraw();\n }\n\n function startDragGroupController(evt) {\n indexI = +evt.srcElement.getAttribute('data-i');\n if(!indexI) indexI = 0; // ensure non-existing move button get zero index\n\n groupDragOptions[indexI].moveFn = moveGroupController;\n }\n\n function endDragGroupController() {\n update();\n }\n\n function clickGroupController(numClicks) {\n if(numClicks === 2) {\n eraseActiveSelection(gd);\n }\n }\n\n function addGroupControllers() {\n groupDragOptions = [];\n\n if(!polygons.length) return;\n\n var i = 0;\n groupDragOptions[i] = {\n element: outlines[0][0],\n gd: gd,\n prepFn: startDragGroupController,\n doneFn: endDragGroupController,\n clickFn: clickGroupController\n };\n\n dragElement.init(groupDragOptions[i]);\n }\n};\n\nfunction recordPositions(polygonsOut, polygonsIn) {\n for(var i = 0; i < polygonsIn.length; i++) {\n var cell = polygonsIn[i];\n polygonsOut[i] = [];\n for(var j = 0; j < cell.length; j++) {\n polygonsOut[i][j] = [];\n for(var k = 0; k < cell[j].length; k++) {\n polygonsOut[i][j][k] = cell[j][k];\n }\n }\n }\n return polygonsOut;\n}\n\nfunction getNextPoint(cell, j) {\n var x = cell[j][1];\n var y = cell[j][2];\n var len = cell.length;\n var nextJ, nextX, nextY;\n nextJ = (j + 1) % len;\n nextX = cell[nextJ][1];\n nextY = cell[nextJ][2];\n\n // avoid potential double points (closing points)\n if(nextX === x && nextY === y) {\n nextJ = (j + 2) % len;\n nextX = cell[nextJ][1];\n nextY = cell[nextJ][2];\n }\n\n return [nextJ, nextX, nextY];\n}\n\nfunction eraseActiveSelection(gd) {\n // Do not allow removal of selections on other dragmodes.\n // This ensures the user could still double click to\n // deselect all trace.selectedpoints,\n // if that's what they wanted.\n // Also double click to zoom back won't result in\n // any surprising selection removal.\n if(!selectMode(gd._fullLayout.dragmode)) return;\n\n clearOutlineControllers(gd);\n\n var id = gd._fullLayout._activeSelectionIndex;\n var selections = (gd.layout || {}).selections || [];\n if(id < selections.length) {\n var list = [];\n for(var q = 0; q < selections.length; q++) {\n if(q !== id) {\n list.push(selections[q]);\n }\n }\n\n delete gd._fullLayout._activeSelectionIndex;\n\n var erasedSelection = gd._fullLayout.selections[id];\n gd._fullLayout._deselect = {\n xref: erasedSelection.xref,\n yref: erasedSelection.yref\n };\n\n Registry.call('_guiRelayout', gd, {\n selections: list\n });\n }\n}\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nvar Registry = require('../../registry');\nvar Lib = require('../../lib');\nvar Axes = require('../../plots/cartesian/axes');\n\nvar readPaths = require('./draw_newshape/helpers').readPaths;\nvar displayOutlines = require('./display_outlines');\nvar drawLabel = require('./display_labels');\n\nvar clearOutlineControllers = require('./handle_outline').clearOutlineControllers;\n\nvar Color = require('../color');\nvar Drawing = require('../drawing');\nvar arrayEditor = require('../../plot_api/plot_template').arrayEditor;\n\nvar dragElement = require('../dragelement');\nvar setCursor = require('../../lib/setcursor');\n\nvar constants = require('./constants');\nvar helpers = require('./helpers');\nvar getPathString = helpers.getPathString;\n\n\n// Shapes are stored in gd.layout.shapes, an array of objects\n// index can point to one item in this array,\n// or non-numeric to simply add a new one\n// or -1 to modify all existing\n// opt can be the full options object, or one key (to be set to value)\n// or undefined to simply redraw\n// if opt is blank, val can be 'add' or a full options object to add a new\n// annotation at that point in the array, or 'remove' to delete this one\n\nmodule.exports = {\n draw: draw,\n drawOne: drawOne,\n eraseActiveShape: eraseActiveShape,\n drawLabel: drawLabel,\n};\n\nfunction draw(gd) {\n var fullLayout = gd._fullLayout;\n\n // Remove previous shapes before drawing new in shapes in fullLayout.shapes\n fullLayout._shapeUpperLayer.selectAll('path').remove();\n fullLayout._shapeLowerLayer.selectAll('path').remove();\n fullLayout._shapeUpperLayer.selectAll('text').remove();\n fullLayout._shapeLowerLayer.selectAll('text').remove();\n\n for(var k in fullLayout._plots) {\n var shapelayer = fullLayout._plots[k].shapelayer;\n if(shapelayer) {\n shapelayer.selectAll('path').remove();\n shapelayer.selectAll('text').remove();\n }\n }\n\n for(var i = 0; i < fullLayout.shapes.length; i++) {\n if(fullLayout.shapes[i].visible === true) {\n drawOne(gd, i);\n }\n }\n\n // may need to resurrect this if we put text (LaTeX) in shapes\n // return Plots.previousPromises(gd);\n}\n\nfunction shouldSkipEdits(gd) {\n return !!gd._fullLayout._outlining;\n}\n\nfunction couldHaveActiveShape(gd) {\n // for now keep config.editable: true as it was before shape-drawing PR\n return !gd._context.edits.shapePosition;\n}\n\nfunction drawOne(gd, index) {\n // remove the existing shape if there is one.\n // because indices can change, we need to look in all shape layers\n gd._fullLayout._paperdiv\n .selectAll('.shapelayer [data-index=\"' + index + '\"]')\n .remove();\n\n var o = helpers.makeShapesOptionsAndPlotinfo(gd, index);\n var options = o.options;\n var plotinfo = o.plotinfo;\n\n // this shape is gone - quit now after deleting it\n // TODO: use d3 idioms instead of deleting and redrawing every time\n if(!options._input || options.visible !== true) return;\n\n if(options.layer !== 'below') {\n drawShape(gd._fullLayout._shapeUpperLayer);\n } else if(options.xref === 'paper' || options.yref === 'paper') {\n drawShape(gd._fullLayout._shapeLowerLayer);\n } else {\n if(plotinfo._hadPlotinfo) {\n var mainPlot = plotinfo.mainplotinfo || plotinfo;\n drawShape(mainPlot.shapelayer);\n } else {\n // Fall back to _shapeLowerLayer in case the requested subplot doesn't exist.\n // This can happen if you reference the shape to an x / y axis combination\n // that doesn't have any data on it (and layer is below)\n drawShape(gd._fullLayout._shapeLowerLayer);\n }\n }\n\n function drawShape(shapeLayer) {\n var d = getPathString(gd, options);\n var attrs = {\n 'data-index': index,\n 'fill-rule': options.fillrule,\n d: d\n };\n\n var opacity = options.opacity;\n var fillColor = options.fillcolor;\n var lineColor = options.line.width ? options.line.color : 'rgba(0,0,0,0)';\n var lineWidth = options.line.width;\n var lineDash = options.line.dash;\n if(!lineWidth && options.editable === true) {\n // ensure invisible border to activate the shape\n lineWidth = 5;\n lineDash = 'solid';\n }\n\n var isOpen = d[d.length - 1] !== 'Z';\n\n var isActiveShape = couldHaveActiveShape(gd) &&\n options.editable && gd._fullLayout._activeShapeIndex === index;\n\n if(isActiveShape) {\n fillColor = isOpen ? 'rgba(0,0,0,0)' :\n gd._fullLayout.activeshape.fillcolor;\n\n opacity = gd._fullLayout.activeshape.opacity;\n }\n\n var shapeGroup = shapeLayer.append('g')\n .classed('shape-group', true)\n .attr({ 'data-index': index });\n\n var path = shapeGroup.append('path')\n .attr(attrs)\n .style('opacity', opacity)\n .call(Color.stroke, lineColor)\n .call(Color.fill, fillColor)\n .call(Drawing.dashLine, lineDash, lineWidth);\n\n setClipPath(shapeGroup, gd, options);\n\n // Draw or clear the label\n drawLabel(gd, index, options, shapeGroup);\n\n var editHelpers;\n if(isActiveShape || gd._context.edits.shapePosition) editHelpers = arrayEditor(gd.layout, 'shapes', options);\n\n if(isActiveShape) {\n path.style({\n cursor: 'move',\n });\n\n var dragOptions = {\n element: path.node(),\n plotinfo: plotinfo,\n gd: gd,\n editHelpers: editHelpers,\n hasText: options.label.text || options.label.texttemplate,\n isActiveShape: true // i.e. to enable controllers\n };\n\n var polygons = readPaths(d, gd);\n // display polygons on the screen\n displayOutlines(polygons, path, dragOptions);\n } else {\n if(gd._context.edits.shapePosition) {\n setupDragElement(gd, path, options, index, shapeLayer, editHelpers);\n } else if(options.editable === true) {\n path.style('pointer-events',\n (isOpen || Color.opacity(fillColor) * opacity <= 0.5) ? 'stroke' : 'all'\n );\n }\n }\n path.node().addEventListener('click', function() { return activateShape(gd, path); });\n }\n}\n\nfunction setClipPath(shapePath, gd, shapeOptions) {\n // note that for layer=\"below\" the clipAxes can be different from the\n // subplot we're drawing this in. This could cause problems if the shape\n // spans two subplots. See https://github.com/plotly/plotly.js/issues/1452\n //\n // if axis is 'paper' or an axis with \" domain\" appended, then there is no\n // clip axis\n var clipAxes = (shapeOptions.xref + shapeOptions.yref).replace(/paper/g, '').replace(/[xyz][1-9]* *domain/g, '');\n\n Drawing.setClipUrl(\n shapePath,\n clipAxes ? 'clip' + gd._fullLayout._uid + clipAxes : null,\n gd\n );\n}\n\nfunction setupDragElement(gd, shapePath, shapeOptions, index, shapeLayer, editHelpers) {\n var MINWIDTH = 10;\n var MINHEIGHT = 10;\n\n var xPixelSized = shapeOptions.xsizemode === 'pixel';\n var yPixelSized = shapeOptions.ysizemode === 'pixel';\n var isLine = shapeOptions.type === 'line';\n var isPath = shapeOptions.type === 'path';\n\n var modifyItem = editHelpers.modifyItem;\n\n var x0, y0, x1, y1, xAnchor, yAnchor;\n var n0, s0, w0, e0, optN, optS, optW, optE;\n var pathIn;\n\n var shapeGroup = d3.select(shapePath.node().parentNode);\n\n // setup conversion functions\n var xa = Axes.getFromId(gd, shapeOptions.xref);\n var xRefType = Axes.getRefType(shapeOptions.xref);\n var ya = Axes.getFromId(gd, shapeOptions.yref);\n var yRefType = Axes.getRefType(shapeOptions.yref);\n var x2p = helpers.getDataToPixel(gd, xa, false, xRefType);\n var y2p = helpers.getDataToPixel(gd, ya, true, yRefType);\n var p2x = helpers.getPixelToData(gd, xa, false, xRefType);\n var p2y = helpers.getPixelToData(gd, ya, true, yRefType);\n\n var sensoryElement = obtainSensoryElement();\n var dragOptions = {\n element: sensoryElement.node(),\n gd: gd,\n prepFn: startDrag,\n doneFn: endDrag,\n clickFn: abortDrag\n };\n var dragMode;\n\n dragElement.init(dragOptions);\n\n sensoryElement.node().onmousemove = updateDragMode;\n\n function obtainSensoryElement() {\n return isLine ? createLineDragHandles() : shapePath;\n }\n\n function createLineDragHandles() {\n var minSensoryWidth = 10;\n var sensoryWidth = Math.max(shapeOptions.line.width, minSensoryWidth);\n\n // Helper shapes group\n // Note that by setting the `data-index` attr, it is ensured that\n // the helper group is purged in this modules `draw` function\n var g = shapeLayer.append('g')\n .attr('data-index', index)\n .attr('drag-helper', true);\n\n // Helper path for moving\n g.append('path')\n .attr('d', shapePath.attr('d'))\n .style({\n cursor: 'move',\n 'stroke-width': sensoryWidth,\n 'stroke-opacity': '0' // ensure not visible\n });\n\n // Helper circles for resizing\n var circleStyle = {\n 'fill-opacity': '0' // ensure not visible\n };\n var circleRadius = Math.max(sensoryWidth / 2, minSensoryWidth);\n\n g.append('circle')\n .attr({\n 'data-line-point': 'start-point',\n cx: xPixelSized ? x2p(shapeOptions.xanchor) + shapeOptions.x0 : x2p(shapeOptions.x0),\n cy: yPixelSized ? y2p(shapeOptions.yanchor) - shapeOptions.y0 : y2p(shapeOptions.y0),\n r: circleRadius\n })\n .style(circleStyle)\n .classed('cursor-grab', true);\n\n g.append('circle')\n .attr({\n 'data-line-point': 'end-point',\n cx: xPixelSized ? x2p(shapeOptions.xanchor) + shapeOptions.x1 : x2p(shapeOptions.x1),\n cy: yPixelSized ? y2p(shapeOptions.yanchor) - shapeOptions.y1 : y2p(shapeOptions.y1),\n r: circleRadius\n })\n .style(circleStyle)\n .classed('cursor-grab', true);\n\n return g;\n }\n\n function updateDragMode(evt) {\n if(shouldSkipEdits(gd)) {\n dragMode = null;\n return;\n }\n\n if(isLine) {\n if(evt.target.tagName === 'path') {\n dragMode = 'move';\n } else {\n dragMode = evt.target.attributes['data-line-point'].value === 'start-point' ?\n 'resize-over-start-point' : 'resize-over-end-point';\n }\n } else {\n // element might not be on screen at time of setup,\n // so obtain bounding box here\n var dragBBox = dragOptions.element.getBoundingClientRect();\n\n // choose 'move' or 'resize'\n // based on initial position of cursor within the drag element\n var w = dragBBox.right - dragBBox.left;\n var h = dragBBox.bottom - dragBBox.top;\n var x = evt.clientX - dragBBox.left;\n var y = evt.clientY - dragBBox.top;\n var cursor = (!isPath && w > MINWIDTH && h > MINHEIGHT && !evt.shiftKey) ?\n dragElement.getCursor(x / w, 1 - y / h) :\n 'move';\n\n setCursor(shapePath, cursor);\n\n // possible values 'move', 'sw', 'w', 'se', 'e', 'ne', 'n', 'nw' and 'w'\n dragMode = cursor.split('-')[0];\n }\n }\n\n function startDrag(evt) {\n if(shouldSkipEdits(gd)) return;\n\n // setup update strings and initial values\n if(xPixelSized) {\n xAnchor = x2p(shapeOptions.xanchor);\n }\n if(yPixelSized) {\n yAnchor = y2p(shapeOptions.yanchor);\n }\n\n if(shapeOptions.type === 'path') {\n pathIn = shapeOptions.path;\n } else {\n x0 = xPixelSized ? shapeOptions.x0 : x2p(shapeOptions.x0);\n y0 = yPixelSized ? shapeOptions.y0 : y2p(shapeOptions.y0);\n x1 = xPixelSized ? shapeOptions.x1 : x2p(shapeOptions.x1);\n y1 = yPixelSized ? shapeOptions.y1 : y2p(shapeOptions.y1);\n }\n\n if(x0 < x1) {\n w0 = x0;\n optW = 'x0';\n e0 = x1;\n optE = 'x1';\n } else {\n w0 = x1;\n optW = 'x1';\n e0 = x0;\n optE = 'x0';\n }\n\n // For fixed size shapes take opposing direction of y-axis into account.\n // Hint: For data sized shapes this is done by the y2p function.\n if((!yPixelSized && y0 < y1) || (yPixelSized && y0 > y1)) {\n n0 = y0;\n optN = 'y0';\n s0 = y1;\n optS = 'y1';\n } else {\n n0 = y1;\n optN = 'y1';\n s0 = y0;\n optS = 'y0';\n }\n\n // setup dragMode and the corresponding handler\n updateDragMode(evt);\n renderVisualCues(shapeLayer, shapeOptions);\n deactivateClipPathTemporarily(shapePath, shapeOptions, gd);\n dragOptions.moveFn = (dragMode === 'move') ? moveShape : resizeShape;\n dragOptions.altKey = evt.altKey;\n }\n\n function endDrag() {\n if(shouldSkipEdits(gd)) return;\n\n setCursor(shapePath);\n removeVisualCues(shapeLayer);\n\n // Don't rely on clipPath being activated during re-layout\n setClipPath(shapePath, gd, shapeOptions);\n Registry.call('_guiRelayout', gd, editHelpers.getUpdateObj());\n }\n\n function abortDrag() {\n if(shouldSkipEdits(gd)) return;\n\n removeVisualCues(shapeLayer);\n }\n\n function moveShape(dx, dy) {\n if(shapeOptions.type === 'path') {\n var noOp = function(coord) { return coord; };\n var moveX = noOp;\n var moveY = noOp;\n\n if(xPixelSized) {\n modifyItem('xanchor', shapeOptions.xanchor = p2x(xAnchor + dx));\n } else {\n moveX = function moveX(x) { return p2x(x2p(x) + dx); };\n if(xa && xa.type === 'date') moveX = helpers.encodeDate(moveX);\n }\n\n if(yPixelSized) {\n modifyItem('yanchor', shapeOptions.yanchor = p2y(yAnchor + dy));\n } else {\n moveY = function moveY(y) { return p2y(y2p(y) + dy); };\n if(ya && ya.type === 'date') moveY = helpers.encodeDate(moveY);\n }\n\n modifyItem('path', shapeOptions.path = movePath(pathIn, moveX, moveY));\n } else {\n if(xPixelSized) {\n modifyItem('xanchor', shapeOptions.xanchor = p2x(xAnchor + dx));\n } else {\n modifyItem('x0', shapeOptions.x0 = p2x(x0 + dx));\n modifyItem('x1', shapeOptions.x1 = p2x(x1 + dx));\n }\n\n if(yPixelSized) {\n modifyItem('yanchor', shapeOptions.yanchor = p2y(yAnchor + dy));\n } else {\n modifyItem('y0', shapeOptions.y0 = p2y(y0 + dy));\n modifyItem('y1', shapeOptions.y1 = p2y(y1 + dy));\n }\n }\n\n shapePath.attr('d', getPathString(gd, shapeOptions));\n renderVisualCues(shapeLayer, shapeOptions);\n drawLabel(gd, index, shapeOptions, shapeGroup);\n }\n\n function resizeShape(dx, dy) {\n if(isPath) {\n // TODO: implement path resize, don't forget to update dragMode code\n var noOp = function(coord) { return coord; };\n var moveX = noOp;\n var moveY = noOp;\n\n if(xPixelSized) {\n modifyItem('xanchor', shapeOptions.xanchor = p2x(xAnchor + dx));\n } else {\n moveX = function moveX(x) { return p2x(x2p(x) + dx); };\n if(xa && xa.type === 'date') moveX = helpers.encodeDate(moveX);\n }\n\n if(yPixelSized) {\n modifyItem('yanchor', shapeOptions.yanchor = p2y(yAnchor + dy));\n } else {\n moveY = function moveY(y) { return p2y(y2p(y) + dy); };\n if(ya && ya.type === 'date') moveY = helpers.encodeDate(moveY);\n }\n\n modifyItem('path', shapeOptions.path = movePath(pathIn, moveX, moveY));\n } else if(isLine) {\n if(dragMode === 'resize-over-start-point') {\n var newX0 = x0 + dx;\n var newY0 = yPixelSized ? y0 - dy : y0 + dy;\n modifyItem('x0', shapeOptions.x0 = xPixelSized ? newX0 : p2x(newX0));\n modifyItem('y0', shapeOptions.y0 = yPixelSized ? newY0 : p2y(newY0));\n } else if(dragMode === 'resize-over-end-point') {\n var newX1 = x1 + dx;\n var newY1 = yPixelSized ? y1 - dy : y1 + dy;\n modifyItem('x1', shapeOptions.x1 = xPixelSized ? newX1 : p2x(newX1));\n modifyItem('y1', shapeOptions.y1 = yPixelSized ? newY1 : p2y(newY1));\n }\n } else {\n var has = function(str) { return dragMode.indexOf(str) !== -1; };\n var hasN = has('n');\n var hasS = has('s');\n var hasW = has('w');\n var hasE = has('e');\n\n var newN = hasN ? n0 + dy : n0;\n var newS = hasS ? s0 + dy : s0;\n var newW = hasW ? w0 + dx : w0;\n var newE = hasE ? e0 + dx : e0;\n\n if(yPixelSized) {\n // Do things in opposing direction for y-axis.\n // Hint: for data-sized shapes the reversal of axis direction is done in p2y.\n if(hasN) newN = n0 - dy;\n if(hasS) newS = s0 - dy;\n }\n\n // Update shape eventually. Again, be aware of the\n // opposing direction of the y-axis of fixed size shapes.\n if(\n (!yPixelSized && newS - newN > MINHEIGHT) ||\n (yPixelSized && newN - newS > MINHEIGHT)\n ) {\n modifyItem(optN, shapeOptions[optN] = yPixelSized ? newN : p2y(newN));\n modifyItem(optS, shapeOptions[optS] = yPixelSized ? newS : p2y(newS));\n }\n if(newE - newW > MINWIDTH) {\n modifyItem(optW, shapeOptions[optW] = xPixelSized ? newW : p2x(newW));\n modifyItem(optE, shapeOptions[optE] = xPixelSized ? newE : p2x(newE));\n }\n }\n\n shapePath.attr('d', getPathString(gd, shapeOptions));\n renderVisualCues(shapeLayer, shapeOptions);\n drawLabel(gd, index, shapeOptions, shapeGroup);\n }\n\n function renderVisualCues(shapeLayer, shapeOptions) {\n if(xPixelSized || yPixelSized) {\n renderAnchor();\n }\n\n function renderAnchor() {\n var isNotPath = shapeOptions.type !== 'path';\n\n // d3 join with dummy data to satisfy d3 data-binding\n var visualCues = shapeLayer.selectAll('.visual-cue').data([0]);\n\n // Enter\n var strokeWidth = 1;\n visualCues.enter()\n .append('path')\n .attr({\n fill: '#fff',\n 'fill-rule': 'evenodd',\n stroke: '#000',\n 'stroke-width': strokeWidth\n })\n .classed('visual-cue', true);\n\n // Update\n var posX = x2p(\n xPixelSized ?\n shapeOptions.xanchor :\n Lib.midRange(\n isNotPath ?\n [shapeOptions.x0, shapeOptions.x1] :\n helpers.extractPathCoords(shapeOptions.path, constants.paramIsX))\n );\n var posY = y2p(\n yPixelSized ?\n shapeOptions.yanchor :\n Lib.midRange(\n isNotPath ?\n [shapeOptions.y0, shapeOptions.y1] :\n helpers.extractPathCoords(shapeOptions.path, constants.paramIsY))\n );\n\n posX = helpers.roundPositionForSharpStrokeRendering(posX, strokeWidth);\n posY = helpers.roundPositionForSharpStrokeRendering(posY, strokeWidth);\n\n if(xPixelSized && yPixelSized) {\n var crossPath = 'M' + (posX - 1 - strokeWidth) + ',' + (posY - 1 - strokeWidth) +\n 'h-8v2h8 v8h2v-8 h8v-2h-8 v-8h-2 Z';\n visualCues.attr('d', crossPath);\n } else if(xPixelSized) {\n var vBarPath = 'M' + (posX - 1 - strokeWidth) + ',' + (posY - 9 - strokeWidth) +\n 'v18 h2 v-18 Z';\n visualCues.attr('d', vBarPath);\n } else {\n var hBarPath = 'M' + (posX - 9 - strokeWidth) + ',' + (posY - 1 - strokeWidth) +\n 'h18 v2 h-18 Z';\n visualCues.attr('d', hBarPath);\n }\n }\n }\n\n function removeVisualCues(shapeLayer) {\n shapeLayer.selectAll('.visual-cue').remove();\n }\n\n function deactivateClipPathTemporarily(shapePath, shapeOptions, gd) {\n var xref = shapeOptions.xref;\n var yref = shapeOptions.yref;\n var xa = Axes.getFromId(gd, xref);\n var ya = Axes.getFromId(gd, yref);\n\n var clipAxes = '';\n if(xref !== 'paper' && !xa.autorange) clipAxes += xref;\n if(yref !== 'paper' && !ya.autorange) clipAxes += yref;\n\n Drawing.setClipUrl(\n shapePath,\n clipAxes ? 'clip' + gd._fullLayout._uid + clipAxes : null,\n gd\n );\n }\n}\n\nfunction movePath(pathIn, moveX, moveY) {\n return pathIn.replace(constants.segmentRE, function(segment) {\n var paramNumber = 0;\n var segmentType = segment.charAt(0);\n var xParams = constants.paramIsX[segmentType];\n var yParams = constants.paramIsY[segmentType];\n var nParams = constants.numParams[segmentType];\n\n var paramString = segment.substr(1).replace(constants.paramRE, function(param) {\n if(paramNumber >= nParams) return param;\n\n if(xParams[paramNumber]) param = moveX(param);\n else if(yParams[paramNumber]) param = moveY(param);\n\n paramNumber++;\n\n return param;\n });\n\n return segmentType + paramString;\n });\n}\n\nfunction activateShape(gd, path) {\n if(!couldHaveActiveShape(gd)) return;\n\n var element = path.node();\n var id = +element.getAttribute('data-index');\n if(id >= 0) {\n // deactivate if already active\n if(id === gd._fullLayout._activeShapeIndex) {\n deactivateShape(gd);\n return;\n }\n\n gd._fullLayout._activeShapeIndex = id;\n gd._fullLayout._deactivateShape = deactivateShape;\n draw(gd);\n }\n}\n\nfunction deactivateShape(gd) {\n if(!couldHaveActiveShape(gd)) return;\n\n var id = gd._fullLayout._activeShapeIndex;\n if(id >= 0) {\n clearOutlineControllers(gd);\n delete gd._fullLayout._activeShapeIndex;\n draw(gd);\n }\n}\n\nfunction eraseActiveShape(gd) {\n if(!couldHaveActiveShape(gd)) return;\n\n clearOutlineControllers(gd);\n\n var id = gd._fullLayout._activeShapeIndex;\n var shapes = (gd.layout || {}).shapes || [];\n if(id < shapes.length) {\n var list = [];\n for(var q = 0; q < shapes.length; q++) {\n if(q !== id) {\n list.push(shapes[q]);\n }\n }\n\n delete gd._fullLayout._activeShapeIndex;\n\n return Registry.call('_guiRelayout', gd, {\n shapes: list\n });\n }\n}\n","'use strict';\n\nvar overrideAll = require('../../../plot_api/edit_types').overrideAll;\nvar basePlotAttributes = require('../../../plots/attributes');\nvar fontAttrs = require('../../../plots/font_attributes');\nvar dash = require('../../drawing/attributes').dash;\nvar extendFlat = require('../../../lib/extend').extendFlat;\nvar shapeTexttemplateAttrs = require('../../../plots/template_attributes').shapeTexttemplateAttrs;\nvar shapeLabelTexttemplateVars = require('../label_texttemplate');\n\nmodule.exports = overrideAll({\n newshape: {\n visible: extendFlat({}, basePlotAttributes.visible, {\n description: [\n 'Determines whether or not new shape is visible.',\n 'If *legendonly*, the shape is not drawn,',\n 'but can appear as a legend item',\n '(provided that the legend itself is visible).'\n ].join(' ')\n }),\n\n showlegend: {\n valType: 'boolean',\n dflt: false,\n description: [\n 'Determines whether or not new',\n 'shape is shown in the legend.'\n ].join(' ')\n },\n\n legend: extendFlat({}, basePlotAttributes.legend, {\n description: [\n 'Sets the reference to a legend to show new shape in.',\n 'References to these legends are *legend*, *legend2*, *legend3*, etc.',\n 'Settings for these legends are set in the layout, under',\n '`layout.legend`, `layout.legend2`, etc.'\n ].join(' ')\n }),\n\n legendgroup: extendFlat({}, basePlotAttributes.legendgroup, {\n description: [\n 'Sets the legend group for new shape.',\n 'Traces and shapes part of the same legend group hide/show at the same time',\n 'when toggling legend items.'\n ].join(' ')\n }),\n\n legendgrouptitle: {\n text: extendFlat({}, basePlotAttributes.legendgrouptitle.text, {\n }),\n font: fontAttrs({\n description: [\n 'Sets this legend group\\'s title font.'\n ].join(' '),\n })\n },\n\n legendrank: extendFlat({}, basePlotAttributes.legendrank, {\n description: [\n 'Sets the legend rank for new shape.',\n 'Items and groups with smaller ranks are presented on top/left side while',\n 'with *reversed* `legend.traceorder` they are on bottom/right side.',\n 'The default legendrank is 1000,',\n 'so that you can use ranks less than 1000 to place certain items before all unranked items,',\n 'and ranks greater than 1000 to go after all unranked items.'\n ].join(' ')\n }),\n\n legendwidth: extendFlat({}, basePlotAttributes.legendwidth, {\n description: 'Sets the width (in px or fraction) of the legend for new shape.',\n }),\n\n line: {\n color: {\n valType: 'color',\n description: [\n 'Sets the line color.',\n 'By default uses either dark grey or white',\n 'to increase contrast with background color.'\n ].join(' ')\n },\n width: {\n valType: 'number',\n min: 0,\n dflt: 4,\n description: 'Sets the line width (in px).'\n },\n dash: extendFlat({}, dash, {\n dflt: 'solid',\n })\n },\n fillcolor: {\n valType: 'color',\n dflt: 'rgba(0,0,0,0)',\n description: [\n 'Sets the color filling new shapes\\' interior.',\n 'Please note that if using a fillcolor with alpha greater than half,',\n 'drag inside the active shape starts moving the shape underneath,',\n 'otherwise a new shape could be started over.'\n ].join(' ')\n },\n fillrule: {\n valType: 'enumerated',\n values: ['evenodd', 'nonzero'],\n dflt: 'evenodd',\n description: [\n 'Determines the path\\'s interior.',\n 'For more info please visit https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-rule'\n ].join(' ')\n },\n opacity: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 1,\n description: 'Sets the opacity of new shapes.'\n },\n layer: {\n valType: 'enumerated',\n values: ['below', 'above'],\n dflt: 'above',\n description: 'Specifies whether new shapes are drawn below or above traces.'\n },\n drawdirection: {\n valType: 'enumerated',\n values: ['ortho', 'horizontal', 'vertical', 'diagonal'],\n dflt: 'diagonal',\n description: [\n 'When `dragmode` is set to *drawrect*, *drawline* or *drawcircle*',\n 'this limits the drag to be horizontal, vertical or diagonal.',\n 'Using *diagonal* there is no limit e.g. in drawing lines in any direction.',\n '*ortho* limits the draw to be either horizontal or vertical.',\n '*horizontal* allows horizontal extend.',\n '*vertical* allows vertical extend.'\n ].join(' ')\n },\n\n name: extendFlat({}, basePlotAttributes.name, {\n description: [\n 'Sets new shape name.',\n 'The name appears as the legend item.'\n ].join(' ')\n }),\n\n label: {\n text: {\n valType: 'string',\n dflt: '',\n description: [\n 'Sets the text to display with the new shape.',\n 'It is also used for legend item if `name` is not provided.'\n ].join(' ')\n },\n texttemplate: shapeTexttemplateAttrs({newshape: true}, {keys: Object.keys(shapeLabelTexttemplateVars)}),\n font: fontAttrs({\n description: 'Sets the new shape label text font.'\n }),\n textposition: {\n valType: 'enumerated',\n values: [\n 'top left', 'top center', 'top right',\n 'middle left', 'middle center', 'middle right',\n 'bottom left', 'bottom center', 'bottom right',\n 'start', 'middle', 'end',\n ],\n description: [\n 'Sets the position of the label text relative to the new shape.',\n 'Supported values for rectangles, circles and paths are',\n '*top left*, *top center*, *top right*, *middle left*,',\n '*middle center*, *middle right*, *bottom left*, *bottom center*,',\n 'and *bottom right*.',\n 'Supported values for lines are *start*, *middle*, and *end*.',\n 'Default: *middle center* for rectangles, circles, and paths; *middle* for lines.',\n ].join(' ')\n },\n textangle: {\n valType: 'angle',\n dflt: 'auto',\n description: [\n 'Sets the angle at which the label text is drawn',\n 'with respect to the horizontal. For lines, angle *auto*',\n 'is the same angle as the line. For all other shapes,',\n 'angle *auto* is horizontal.'\n ].join(' ')\n },\n xanchor: {\n valType: 'enumerated',\n values: ['auto', 'left', 'center', 'right'],\n dflt: 'auto',\n description: [\n 'Sets the label\\'s horizontal position anchor',\n 'This anchor binds the specified `textposition` to the *left*, *center*',\n 'or *right* of the label text.',\n 'For example, if `textposition` is set to *top right* and',\n '`xanchor` to *right* then the right-most portion of the',\n 'label text lines up with the right-most edge of the',\n 'new shape.',\n ].join(' '),\n },\n yanchor: {\n valType: 'enumerated',\n values: ['top', 'middle', 'bottom'],\n description: [\n 'Sets the label\\'s vertical position anchor',\n 'This anchor binds the specified `textposition` to the *top*, *middle*',\n 'or *bottom* of the label text.',\n 'For example, if `textposition` is set to *top right* and',\n '`yanchor` to *top* then the top-most portion of the',\n 'label text lines up with the top-most edge of the',\n 'new shape.',\n ].join(' ')\n },\n padding: {\n valType: 'number',\n dflt: 3,\n min: 0,\n description: 'Sets padding (in px) between edge of label and edge of new shape.'\n }\n }\n },\n\n activeshape: {\n fillcolor: {\n valType: 'color',\n dflt: 'rgb(255,0,255)',\n description: 'Sets the color filling the active shape\\' interior.'\n },\n opacity: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 0.5,\n description: 'Sets the opacity of the active shape.'\n }\n }\n}, 'none', 'from-root');\n","'use strict';\n\nvar CIRCLE_SIDES = 32; // should be divisible by 4\n\nmodule.exports = {\n CIRCLE_SIDES: CIRCLE_SIDES,\n i000: 0,\n i090: CIRCLE_SIDES / 4,\n i180: CIRCLE_SIDES / 2,\n i270: CIRCLE_SIDES / 4 * 3,\n cos45: Math.cos(Math.PI / 4),\n sin45: Math.sin(Math.PI / 4),\n SQRT2: Math.sqrt(2)\n};\n","'use strict';\n\nvar Color = require('../../color');\nvar Lib = require('../../../lib');\n\n\nfunction dfltLabelYanchor(isLine, labelTextPosition) {\n // If shape is a line, default y-anchor is 'bottom' (so that text is above line by default)\n // Otherwise, default y-anchor is equal to y-component of `textposition`\n // (so that text is positioned inside shape bounding box by default)\n return isLine ? 'bottom' :\n labelTextPosition.indexOf('top') !== -1 ? 'top' :\n labelTextPosition.indexOf('bottom') !== -1 ? 'bottom' : 'middle';\n}\n\nmodule.exports = function supplyDrawNewShapeDefaults(layoutIn, layoutOut, coerce) {\n coerce('newshape.visible');\n coerce('newshape.name');\n coerce('newshape.showlegend');\n coerce('newshape.legend');\n coerce('newshape.legendwidth');\n coerce('newshape.legendgroup');\n coerce('newshape.legendgrouptitle.text');\n Lib.coerceFont(coerce, 'newshape.legendgrouptitle.font');\n coerce('newshape.legendrank');\n\n coerce('newshape.drawdirection');\n coerce('newshape.layer');\n coerce('newshape.fillcolor');\n coerce('newshape.fillrule');\n coerce('newshape.opacity');\n var newshapeLineWidth = coerce('newshape.line.width');\n if(newshapeLineWidth) {\n var bgcolor = (layoutIn || {}).plot_bgcolor || '#FFF';\n coerce('newshape.line.color', Color.contrast(bgcolor));\n coerce('newshape.line.dash');\n }\n\n var isLine = layoutIn.dragmode === 'drawline';\n var labelText = coerce('newshape.label.text');\n var labelTextTemplate = coerce('newshape.label.texttemplate');\n if(labelText || labelTextTemplate) {\n coerce('newshape.label.textangle');\n var labelTextPosition = coerce('newshape.label.textposition', isLine ? 'middle' : 'middle center');\n coerce('newshape.label.xanchor');\n coerce('newshape.label.yanchor', dfltLabelYanchor(isLine, labelTextPosition));\n coerce('newshape.label.padding');\n Lib.coerceFont(coerce, 'newshape.label.font', layoutOut.font);\n }\n\n coerce('activeshape.fillcolor');\n coerce('activeshape.opacity');\n};\n","'use strict';\n\nvar parseSvgPath = require('parse-svg-path');\n\nvar constants = require('./constants');\nvar CIRCLE_SIDES = constants.CIRCLE_SIDES;\nvar SQRT2 = constants.SQRT2;\n\nvar cartesianHelpers = require('../../selections/helpers');\nvar p2r = cartesianHelpers.p2r;\nvar r2p = cartesianHelpers.r2p;\n\nvar iC = [0, 3, 4, 5, 6, 1, 2];\nvar iQS = [0, 3, 4, 1, 2];\n\nexports.writePaths = function(polygons) {\n var nI = polygons.length;\n if(!nI) return 'M0,0Z';\n\n var str = '';\n for(var i = 0; i < nI; i++) {\n var nJ = polygons[i].length;\n for(var j = 0; j < nJ; j++) {\n var w = polygons[i][j][0];\n if(w === 'Z') {\n str += 'Z';\n } else {\n var nK = polygons[i][j].length;\n for(var k = 0; k < nK; k++) {\n var realK = k;\n if(w === 'Q' || w === 'S') {\n realK = iQS[k];\n } else if(w === 'C') {\n realK = iC[k];\n }\n\n str += polygons[i][j][realK];\n if(k > 0 && k < nK - 1) {\n str += ',';\n }\n }\n }\n }\n }\n\n return str;\n};\n\nexports.readPaths = function(str, gd, plotinfo, isActiveShape) {\n var cmd = parseSvgPath(str);\n\n var polys = [];\n var n = -1;\n var newPoly = function() {\n n++;\n polys[n] = [];\n };\n\n var k;\n var x = 0;\n var y = 0;\n var initX;\n var initY;\n var recStart = function() {\n initX = x;\n initY = y;\n };\n\n recStart();\n for(var i = 0; i < cmd.length; i++) {\n var newPos = [];\n\n var x1, x2, y1, y2; // i.e. extra params for curves\n\n var c = cmd[i][0];\n var w = c;\n switch(c) {\n case 'M':\n newPoly();\n x = +cmd[i][1];\n y = +cmd[i][2];\n newPos.push([w, x, y]);\n\n recStart();\n break;\n\n case 'Q':\n case 'S':\n x1 = +cmd[i][1];\n y1 = +cmd[i][2];\n x = +cmd[i][3];\n y = +cmd[i][4];\n newPos.push([w, x, y, x1, y1]); // -> iQS order\n break;\n\n case 'C':\n x1 = +cmd[i][1];\n y1 = +cmd[i][2];\n x2 = +cmd[i][3];\n y2 = +cmd[i][4];\n x = +cmd[i][5];\n y = +cmd[i][6];\n newPos.push([w, x, y, x1, y1, x2, y2]); // -> iC order\n break;\n\n case 'T':\n case 'L':\n x = +cmd[i][1];\n y = +cmd[i][2];\n newPos.push([w, x, y]);\n break;\n\n case 'H':\n w = 'L'; // convert to line (for now)\n x = +cmd[i][1];\n newPos.push([w, x, y]);\n break;\n\n case 'V':\n w = 'L'; // convert to line (for now)\n y = +cmd[i][1];\n newPos.push([w, x, y]);\n break;\n\n case 'A':\n w = 'L'; // convert to line to handle circle\n var rx = +cmd[i][1];\n var ry = +cmd[i][2];\n if(!+cmd[i][4]) {\n rx = -rx;\n ry = -ry;\n }\n\n var cenX = x - rx;\n var cenY = y;\n for(k = 1; k <= CIRCLE_SIDES / 2; k++) {\n var t = 2 * Math.PI * k / CIRCLE_SIDES;\n newPos.push([\n w,\n cenX + rx * Math.cos(t),\n cenY + ry * Math.sin(t)\n ]);\n }\n break;\n\n case 'Z':\n if(x !== initX || y !== initY) {\n x = initX;\n y = initY;\n newPos.push([w, x, y]);\n }\n break;\n }\n\n var domain = (plotinfo || {}).domain;\n var size = gd._fullLayout._size;\n var xPixelSized = plotinfo && plotinfo.xsizemode === 'pixel';\n var yPixelSized = plotinfo && plotinfo.ysizemode === 'pixel';\n var noOffset = isActiveShape === false;\n\n for(var j = 0; j < newPos.length; j++) {\n for(k = 0; k + 2 < 7; k += 2) {\n var _x = newPos[j][k + 1];\n var _y = newPos[j][k + 2];\n\n if(_x === undefined || _y === undefined) continue;\n // keep track of end point for Z\n x = _x;\n y = _y;\n\n if(plotinfo) {\n if(plotinfo.xaxis && plotinfo.xaxis.p2r) {\n if(noOffset) _x -= plotinfo.xaxis._offset;\n if(xPixelSized) {\n _x = r2p(plotinfo.xaxis, plotinfo.xanchor) + _x;\n } else {\n _x = p2r(plotinfo.xaxis, _x);\n }\n } else {\n if(noOffset) _x -= size.l;\n if(domain) _x = domain.x[0] + _x / size.w;\n else _x = _x / size.w;\n }\n\n if(plotinfo.yaxis && plotinfo.yaxis.p2r) {\n if(noOffset) _y -= plotinfo.yaxis._offset;\n if(yPixelSized) {\n _y = r2p(plotinfo.yaxis, plotinfo.yanchor) - _y;\n } else {\n _y = p2r(plotinfo.yaxis, _y);\n }\n } else {\n if(noOffset) _y -= size.t;\n if(domain) _y = domain.y[1] - _y / size.h;\n else _y = 1 - _y / size.h;\n }\n }\n\n newPos[j][k + 1] = _x;\n newPos[j][k + 2] = _y;\n }\n polys[n].push(\n newPos[j].slice()\n );\n }\n }\n\n return polys;\n};\n\nfunction almostEq(a, b) {\n return Math.abs(a - b) <= 1e-6;\n}\n\nfunction dist(a, b) {\n var dx = b[1] - a[1];\n var dy = b[2] - a[2];\n return Math.sqrt(\n dx * dx +\n dy * dy\n );\n}\n\nexports.pointsOnRectangle = function(cell) {\n var len = cell.length;\n if(len !== 5) return false;\n\n for(var j = 1; j < 3; j++) {\n var e01 = cell[0][j] - cell[1][j];\n var e32 = cell[3][j] - cell[2][j];\n\n if(!almostEq(e01, e32)) return false;\n\n var e03 = cell[0][j] - cell[3][j];\n var e12 = cell[1][j] - cell[2][j];\n if(!almostEq(e03, e12)) return false;\n }\n\n // N.B. rotated rectangles are not valid rects since rotation is not supported in shapes for now.\n if(\n !almostEq(cell[0][1], cell[1][1]) &&\n !almostEq(cell[0][1], cell[3][1])\n ) return false;\n\n // reject cases with zero area\n return !!(\n dist(cell[0], cell[1]) *\n dist(cell[0], cell[3])\n );\n};\n\nexports.pointsOnEllipse = function(cell) {\n var len = cell.length;\n if(len !== CIRCLE_SIDES + 1) return false;\n\n // opposite diagonals should be the same\n len = CIRCLE_SIDES;\n for(var i = 0; i < len; i++) {\n var k = (len * 2 - i) % len;\n\n var k2 = (len / 2 + k) % len;\n var i2 = (len / 2 + i) % len;\n\n if(!almostEq(\n dist(cell[i], cell[i2]),\n dist(cell[k], cell[k2])\n )) return false;\n }\n return true;\n};\n\nexports.handleEllipse = function(isEllipse, start, end) {\n if(!isEllipse) return [start, end]; // i.e. case of line\n\n var pos = exports.ellipseOver({\n x0: start[0],\n y0: start[1],\n x1: end[0],\n y1: end[1]\n });\n\n var cx = (pos.x1 + pos.x0) / 2;\n var cy = (pos.y1 + pos.y0) / 2;\n var rx = (pos.x1 - pos.x0) / 2;\n var ry = (pos.y1 - pos.y0) / 2;\n\n // make a circle when one dimension is zero\n if(!rx) rx = ry = ry / SQRT2;\n if(!ry) ry = rx = rx / SQRT2;\n\n var cell = [];\n for(var i = 0; i < CIRCLE_SIDES; i++) {\n var t = i * 2 * Math.PI / CIRCLE_SIDES;\n cell.push([\n cx + rx * Math.cos(t),\n cy + ry * Math.sin(t),\n ]);\n }\n return cell;\n};\n\nexports.ellipseOver = function(pos) {\n var x0 = pos.x0;\n var y0 = pos.y0;\n var x1 = pos.x1;\n var y1 = pos.y1;\n\n var dx = x1 - x0;\n var dy = y1 - y0;\n\n x0 -= dx;\n y0 -= dy;\n\n var cx = (x0 + x1) / 2;\n var cy = (y0 + y1) / 2;\n\n var scale = SQRT2;\n dx *= scale;\n dy *= scale;\n\n return {\n x0: cx - dx,\n y0: cy - dy,\n x1: cx + dx,\n y1: cy + dy\n };\n};\n\nexports.fixDatesForPaths = function(polygons, xaxis, yaxis) {\n var xIsDate = xaxis.type === 'date';\n var yIsDate = yaxis.type === 'date';\n if(!xIsDate && !yIsDate) return polygons;\n\n for(var i = 0; i < polygons.length; i++) {\n for(var j = 0; j < polygons[i].length; j++) {\n for(var k = 0; k + 2 < polygons[i][j].length; k += 2) {\n if(xIsDate) polygons[i][j][k + 1] = polygons[i][j][k + 1].replace(' ', '_');\n if(yIsDate) polygons[i][j][k + 2] = polygons[i][j][k + 2].replace(' ', '_');\n }\n }\n }\n\n return polygons;\n};\n","'use strict';\n\nvar dragHelpers = require('../../dragelement/helpers');\nvar drawMode = dragHelpers.drawMode;\nvar openMode = dragHelpers.openMode;\n\nvar constants = require('./constants');\nvar i000 = constants.i000;\nvar i090 = constants.i090;\nvar i180 = constants.i180;\nvar i270 = constants.i270;\nvar cos45 = constants.cos45;\nvar sin45 = constants.sin45;\n\nvar cartesianHelpers = require('../../selections/helpers');\nvar p2r = cartesianHelpers.p2r;\nvar r2p = cartesianHelpers.r2p;\n\nvar handleOutline = require('.././handle_outline');\nvar clearOutline = handleOutline.clearOutline;\n\nvar helpers = require('./helpers');\nvar readPaths = helpers.readPaths;\nvar writePaths = helpers.writePaths;\nvar ellipseOver = helpers.ellipseOver;\nvar fixDatesForPaths = helpers.fixDatesForPaths;\n\nfunction newShapes(outlines, dragOptions) {\n if(!outlines.length) return;\n var e = outlines[0][0]; // pick first\n if(!e) return;\n\n var gd = dragOptions.gd;\n\n var isActiveShape = dragOptions.isActiveShape;\n var dragmode = dragOptions.dragmode;\n\n var shapes = (gd.layout || {}).shapes || [];\n\n if(!drawMode(dragmode) && isActiveShape !== undefined) {\n var id = gd._fullLayout._activeShapeIndex;\n if(id < shapes.length) {\n switch(gd._fullLayout.shapes[id].type) {\n case 'rect':\n dragmode = 'drawrect';\n break;\n case 'circle':\n dragmode = 'drawcircle';\n break;\n case 'line':\n dragmode = 'drawline';\n break;\n case 'path':\n var path = shapes[id].path || '';\n if(path[path.length - 1] === 'Z') {\n dragmode = 'drawclosedpath';\n } else {\n dragmode = 'drawopenpath';\n }\n break;\n }\n }\n }\n\n var newShape = createShapeObj(outlines, dragOptions, dragmode);\n\n clearOutline(gd);\n\n var editHelpers = dragOptions.editHelpers;\n var modifyItem = (editHelpers || {}).modifyItem;\n\n var allShapes = [];\n for(var q = 0; q < shapes.length; q++) {\n var beforeEdit = gd._fullLayout.shapes[q];\n allShapes[q] = beforeEdit._input;\n\n if(\n isActiveShape !== undefined &&\n q === gd._fullLayout._activeShapeIndex\n ) {\n var afterEdit = newShape;\n\n switch(beforeEdit.type) {\n case 'line':\n case 'rect':\n case 'circle':\n modifyItem('x0', afterEdit.x0);\n modifyItem('x1', afterEdit.x1);\n modifyItem('y0', afterEdit.y0);\n modifyItem('y1', afterEdit.y1);\n break;\n\n case 'path':\n modifyItem('path', afterEdit.path);\n break;\n }\n }\n }\n\n if(isActiveShape === undefined) {\n allShapes.push(newShape); // add new shape\n return allShapes;\n }\n\n return editHelpers ? editHelpers.getUpdateObj() : {};\n}\n\nfunction createShapeObj(outlines, dragOptions, dragmode) {\n var e = outlines[0][0]; // pick first outline\n var gd = dragOptions.gd;\n\n var d = e.getAttribute('d');\n var newStyle = gd._fullLayout.newshape;\n var plotinfo = dragOptions.plotinfo;\n var isActiveShape = dragOptions.isActiveShape;\n\n var xaxis = plotinfo.xaxis;\n var yaxis = plotinfo.yaxis;\n var xPaper = !!plotinfo.domain || !plotinfo.xaxis;\n var yPaper = !!plotinfo.domain || !plotinfo.yaxis;\n\n var isOpenMode = openMode(dragmode);\n var polygons = readPaths(d, gd, plotinfo, isActiveShape);\n\n var newShape = {\n editable: true,\n\n visible: newStyle.visible,\n name: newStyle.name,\n showlegend: newStyle.showlegend,\n legend: newStyle.legend,\n legendwidth: newStyle.legendwidth,\n legendgroup: newStyle.legendgroup,\n legendgrouptitle: {\n text: newStyle.legendgrouptitle.text,\n font: newStyle.legendgrouptitle.font\n },\n legendrank: newStyle.legendrank,\n\n label: newStyle.label,\n\n xref: xPaper ? 'paper' : xaxis._id,\n yref: yPaper ? 'paper' : yaxis._id,\n\n layer: newStyle.layer,\n opacity: newStyle.opacity,\n line: {\n color: newStyle.line.color,\n width: newStyle.line.width,\n dash: newStyle.line.dash\n }\n };\n\n if(!isOpenMode) {\n newShape.fillcolor = newStyle.fillcolor;\n newShape.fillrule = newStyle.fillrule;\n }\n\n var cell;\n // line, rect and circle can be in one cell\n // only define cell if there is single cell\n if(polygons.length === 1) cell = polygons[0];\n\n if(\n cell &&\n cell.length === 5 && // ensure we only have 4 corners for a rect\n dragmode === 'drawrect'\n ) {\n newShape.type = 'rect';\n newShape.x0 = cell[0][1];\n newShape.y0 = cell[0][2];\n newShape.x1 = cell[2][1];\n newShape.y1 = cell[2][2];\n } else if(\n cell &&\n dragmode === 'drawline'\n ) {\n newShape.type = 'line';\n newShape.x0 = cell[0][1];\n newShape.y0 = cell[0][2];\n newShape.x1 = cell[1][1];\n newShape.y1 = cell[1][2];\n } else if(\n cell &&\n dragmode === 'drawcircle'\n ) {\n newShape.type = 'circle'; // an ellipse!\n\n var xA = cell[i000][1];\n var xB = cell[i090][1];\n var xC = cell[i180][1];\n var xD = cell[i270][1];\n\n var yA = cell[i000][2];\n var yB = cell[i090][2];\n var yC = cell[i180][2];\n var yD = cell[i270][2];\n\n var xDateOrLog = plotinfo.xaxis && (\n plotinfo.xaxis.type === 'date' ||\n plotinfo.xaxis.type === 'log'\n );\n\n var yDateOrLog = plotinfo.yaxis && (\n plotinfo.yaxis.type === 'date' ||\n plotinfo.yaxis.type === 'log'\n );\n\n if(xDateOrLog) {\n xA = r2p(plotinfo.xaxis, xA);\n xB = r2p(plotinfo.xaxis, xB);\n xC = r2p(plotinfo.xaxis, xC);\n xD = r2p(plotinfo.xaxis, xD);\n }\n\n if(yDateOrLog) {\n yA = r2p(plotinfo.yaxis, yA);\n yB = r2p(plotinfo.yaxis, yB);\n yC = r2p(plotinfo.yaxis, yC);\n yD = r2p(plotinfo.yaxis, yD);\n }\n\n var x0 = (xB + xD) / 2;\n var y0 = (yA + yC) / 2;\n var rx = (xD - xB + xC - xA) / 2;\n var ry = (yD - yB + yC - yA) / 2;\n var pos = ellipseOver({\n x0: x0,\n y0: y0,\n x1: x0 + rx * cos45,\n y1: y0 + ry * sin45\n });\n\n if(xDateOrLog) {\n pos.x0 = p2r(plotinfo.xaxis, pos.x0);\n pos.x1 = p2r(plotinfo.xaxis, pos.x1);\n }\n\n if(yDateOrLog) {\n pos.y0 = p2r(plotinfo.yaxis, pos.y0);\n pos.y1 = p2r(plotinfo.yaxis, pos.y1);\n }\n\n newShape.x0 = pos.x0;\n newShape.y0 = pos.y0;\n newShape.x1 = pos.x1;\n newShape.y1 = pos.y1;\n } else {\n newShape.type = 'path';\n if(xaxis && yaxis) fixDatesForPaths(polygons, xaxis, yaxis);\n newShape.path = writePaths(polygons);\n cell = null;\n }\n return newShape;\n}\n\nmodule.exports = {\n newShapes: newShapes,\n createShapeObj: createShapeObj,\n};\n","'use strict';\n\nfunction clearOutlineControllers(gd) {\n var zoomLayer = gd._fullLayout._zoomlayer;\n if(zoomLayer) {\n zoomLayer.selectAll('.outline-controllers').remove();\n }\n}\n\nfunction clearOutline(gd) {\n var zoomLayer = gd._fullLayout._zoomlayer;\n if(zoomLayer) {\n // until we get around to persistent selections, remove the outline\n // here. The selection itself will be removed when the plot redraws\n // at the end.\n zoomLayer.selectAll('.select-outline').remove();\n }\n\n gd._fullLayout._outlining = false;\n}\n\nmodule.exports = {\n clearOutlineControllers: clearOutlineControllers,\n clearOutline: clearOutline\n};\n","'use strict';\n\nvar constants = require('./constants');\n\nvar Lib = require('../../lib');\nvar Axes = require('../../plots/cartesian/axes');\n\n// special position conversion functions... category axis positions can't be\n// specified by their data values, because they don't make a continuous mapping.\n// so these have to be specified in terms of the category serial numbers,\n// but can take fractional values. Other axis types we specify position based on\n// the actual data values.\n// TODO: in V3.0 (when log axis ranges are in data units) range and shape position\n// will be identical, so rangeToShapePosition and shapePositionToRange can be\n// removed entirely.\n\nexports.rangeToShapePosition = function(ax) {\n return (ax.type === 'log') ? ax.r2d : function(v) { return v; };\n};\n\nexports.shapePositionToRange = function(ax) {\n return (ax.type === 'log') ? ax.d2r : function(v) { return v; };\n};\n\nexports.decodeDate = function(convertToPx) {\n return function(v) {\n if(v.replace) v = v.replace('_', ' ');\n return convertToPx(v);\n };\n};\n\nexports.encodeDate = function(convertToDate) {\n return function(v) { return convertToDate(v).replace(' ', '_'); };\n};\n\nexports.extractPathCoords = function(path, paramsToUse, isRaw) {\n var extractedCoordinates = [];\n\n var segments = path.match(constants.segmentRE);\n segments.forEach(function(segment) {\n var relevantParamIdx = paramsToUse[segment.charAt(0)].drawn;\n if(relevantParamIdx === undefined) return;\n\n var params = segment.substr(1).match(constants.paramRE);\n if(!params || params.length < relevantParamIdx) return;\n\n var str = params[relevantParamIdx];\n var pos = isRaw ? str : Lib.cleanNumber(str);\n\n extractedCoordinates.push(pos);\n });\n\n return extractedCoordinates;\n};\n\nexports.getDataToPixel = function(gd, axis, isVertical, refType) {\n var gs = gd._fullLayout._size;\n var dataToPixel;\n\n if(axis) {\n if(refType === 'domain') {\n dataToPixel = function(v) {\n return axis._length * (isVertical ? (1 - v) : v) + axis._offset;\n };\n } else {\n var d2r = exports.shapePositionToRange(axis);\n\n dataToPixel = function(v) {\n return axis._offset + axis.r2p(d2r(v, true));\n };\n\n if(axis.type === 'date') dataToPixel = exports.decodeDate(dataToPixel);\n }\n } else if(isVertical) {\n dataToPixel = function(v) { return gs.t + gs.h * (1 - v); };\n } else {\n dataToPixel = function(v) { return gs.l + gs.w * v; };\n }\n\n return dataToPixel;\n};\n\nexports.getPixelToData = function(gd, axis, isVertical, opt) {\n var gs = gd._fullLayout._size;\n var pixelToData;\n\n if(axis) {\n if(opt === 'domain') {\n pixelToData = function(p) {\n var q = (p - axis._offset) / axis._length;\n return isVertical ? 1 - q : q;\n };\n } else {\n var r2d = exports.rangeToShapePosition(axis);\n pixelToData = function(p) { return r2d(axis.p2r(p - axis._offset)); };\n }\n } else if(isVertical) {\n pixelToData = function(p) { return 1 - (p - gs.t) / gs.h; };\n } else {\n pixelToData = function(p) { return (p - gs.l) / gs.w; };\n }\n\n return pixelToData;\n};\n\n/**\n * Based on the given stroke width, rounds the passed\n * position value to represent either a full or half pixel.\n *\n * In case of an odd stroke width (e.g. 1), this measure ensures\n * that a stroke positioned at the returned position isn't rendered\n * blurry due to anti-aliasing.\n *\n * In case of an even stroke width (e.g. 2), this measure ensures\n * that the position value is transformed to a full pixel value\n * so that anti-aliasing doesn't take effect either.\n *\n * @param {number} pos The raw position value to be transformed\n * @param {number} strokeWidth The stroke width\n * @returns {number} either an integer or a .5 decimal number\n */\nexports.roundPositionForSharpStrokeRendering = function(pos, strokeWidth) {\n var strokeWidthIsOdd = Math.round(strokeWidth % 2) === 1;\n var posValAsInt = Math.round(pos);\n\n return strokeWidthIsOdd ? posValAsInt + 0.5 : posValAsInt;\n};\n\nexports.makeShapesOptionsAndPlotinfo = function(gd, index) {\n var options = gd._fullLayout.shapes[index] || {};\n\n var plotinfo = gd._fullLayout._plots[options.xref + options.yref];\n var hasPlotinfo = !!plotinfo;\n if(hasPlotinfo) {\n plotinfo._hadPlotinfo = true;\n } else {\n plotinfo = {};\n if(options.xref && options.xref !== 'paper') plotinfo.xaxis = gd._fullLayout[options.xref + 'axis'];\n if(options.yref && options.yref !== 'paper') plotinfo.yaxis = gd._fullLayout[options.yref + 'axis'];\n }\n\n plotinfo.xsizemode = options.xsizemode;\n plotinfo.ysizemode = options.ysizemode;\n plotinfo.xanchor = options.xanchor;\n plotinfo.yanchor = options.yanchor;\n\n return {\n options: options,\n plotinfo: plotinfo\n };\n};\n\n// TODO: move to selections helpers?\nexports.makeSelectionsOptionsAndPlotinfo = function(gd, index) {\n var options = gd._fullLayout.selections[index] || {};\n\n var plotinfo = gd._fullLayout._plots[options.xref + options.yref];\n var hasPlotinfo = !!plotinfo;\n if(hasPlotinfo) {\n plotinfo._hadPlotinfo = true;\n } else {\n plotinfo = {};\n if(options.xref) plotinfo.xaxis = gd._fullLayout[options.xref + 'axis'];\n if(options.yref) plotinfo.yaxis = gd._fullLayout[options.yref + 'axis'];\n }\n\n return {\n options: options,\n plotinfo: plotinfo\n };\n};\n\n\nexports.getPathString = function(gd, options) {\n var type = options.type;\n var xRefType = Axes.getRefType(options.xref);\n var yRefType = Axes.getRefType(options.yref);\n var xa = Axes.getFromId(gd, options.xref);\n var ya = Axes.getFromId(gd, options.yref);\n var gs = gd._fullLayout._size;\n var x2r, x2p, y2r, y2p;\n var x0, x1, y0, y1;\n\n if(xa) {\n if(xRefType === 'domain') {\n x2p = function(v) { return xa._offset + xa._length * v; };\n } else {\n x2r = exports.shapePositionToRange(xa);\n x2p = function(v) { return xa._offset + xa.r2p(x2r(v, true)); };\n }\n } else {\n x2p = function(v) { return gs.l + gs.w * v; };\n }\n\n if(ya) {\n if(yRefType === 'domain') {\n y2p = function(v) { return ya._offset + ya._length * (1 - v); };\n } else {\n y2r = exports.shapePositionToRange(ya);\n y2p = function(v) { return ya._offset + ya.r2p(y2r(v, true)); };\n }\n } else {\n y2p = function(v) { return gs.t + gs.h * (1 - v); };\n }\n\n if(type === 'path') {\n if(xa && xa.type === 'date') x2p = exports.decodeDate(x2p);\n if(ya && ya.type === 'date') y2p = exports.decodeDate(y2p);\n return convertPath(options, x2p, y2p);\n }\n\n if(options.xsizemode === 'pixel') {\n var xAnchorPos = x2p(options.xanchor);\n x0 = xAnchorPos + options.x0;\n x1 = xAnchorPos + options.x1;\n } else {\n x0 = x2p(options.x0);\n x1 = x2p(options.x1);\n }\n\n if(options.ysizemode === 'pixel') {\n var yAnchorPos = y2p(options.yanchor);\n y0 = yAnchorPos - options.y0;\n y1 = yAnchorPos - options.y1;\n } else {\n y0 = y2p(options.y0);\n y1 = y2p(options.y1);\n }\n\n if(type === 'line') return 'M' + x0 + ',' + y0 + 'L' + x1 + ',' + y1;\n if(type === 'rect') return 'M' + x0 + ',' + y0 + 'H' + x1 + 'V' + y1 + 'H' + x0 + 'Z';\n\n // circle\n var cx = (x0 + x1) / 2;\n var cy = (y0 + y1) / 2;\n var rx = Math.abs(cx - x0);\n var ry = Math.abs(cy - y0);\n var rArc = 'A' + rx + ',' + ry;\n var rightPt = (cx + rx) + ',' + cy;\n var topPt = cx + ',' + (cy - ry);\n return 'M' + rightPt + rArc + ' 0 1,1 ' + topPt +\n rArc + ' 0 0,1 ' + rightPt + 'Z';\n};\n\n\nfunction convertPath(options, x2p, y2p) {\n var pathIn = options.path;\n var xSizemode = options.xsizemode;\n var ySizemode = options.ysizemode;\n var xAnchor = options.xanchor;\n var yAnchor = options.yanchor;\n\n return pathIn.replace(constants.segmentRE, function(segment) {\n var paramNumber = 0;\n var segmentType = segment.charAt(0);\n var xParams = constants.paramIsX[segmentType];\n var yParams = constants.paramIsY[segmentType];\n var nParams = constants.numParams[segmentType];\n\n var paramString = segment.substr(1).replace(constants.paramRE, function(param) {\n if(xParams[paramNumber]) {\n if(xSizemode === 'pixel') param = x2p(xAnchor) + Number(param);\n else param = x2p(param);\n } else if(yParams[paramNumber]) {\n if(ySizemode === 'pixel') param = y2p(yAnchor) - Number(param);\n else param = y2p(param);\n }\n paramNumber++;\n\n if(paramNumber > nParams) param = 'X';\n return param;\n });\n\n if(paramNumber > nParams) {\n paramString = paramString.replace(/[\\s,]*X.*/, '');\n Lib.log('Ignoring extra params in segment ' + segment);\n }\n\n return segmentType + paramString;\n });\n}\n","'use strict';\n\nvar drawModule = require('./draw');\n\nmodule.exports = {\n moduleType: 'component',\n name: 'shapes',\n\n layoutAttributes: require('./attributes'),\n supplyLayoutDefaults: require('./defaults'),\n supplyDrawNewShapeDefaults: require('./draw_newshape/defaults'),\n includeBasePlot: require('../../plots/cartesian/include_components')('shapes'),\n\n calcAutorange: require('./calc_autorange'),\n draw: drawModule.draw,\n drawOne: drawModule.drawOne\n};\n","'use strict';\n\n// Wrapper functions to handle paper-referenced shapes, which have no axis\n\nfunction d2l(v, axis) {\n return axis ? axis.d2l(v) : v;\n}\n\nfunction l2d(v, axis) {\n return axis ? axis.l2d(v) : v;\n}\n\n\nfunction x0Fn(shape) { return shape.x0; }\nfunction x1Fn(shape) { return shape.x1; }\nfunction y0Fn(shape) { return shape.y0; }\nfunction y1Fn(shape) { return shape.y1; }\n\nfunction dxFn(shape, xa) {\n return d2l(shape.x1, xa) - d2l(shape.x0, xa);\n}\n\nfunction dyFn(shape, xa, ya) {\n return d2l(shape.y1, ya) - d2l(shape.y0, ya);\n}\n\nfunction widthFn(shape, xa) {\n return Math.abs(dxFn(shape, xa));\n}\n\nfunction heightFn(shape, xa, ya) {\n return Math.abs(dyFn(shape, xa, ya));\n}\n\nfunction lengthFn(shape, xa, ya) {\n return (shape.type !== 'line') ? undefined :\n Math.sqrt(\n Math.pow(dxFn(shape, xa), 2) +\n Math.pow(dyFn(shape, xa, ya), 2)\n );\n}\n\nfunction xcenterFn(shape, xa) {\n return l2d((d2l(shape.x1, xa) + d2l(shape.x0, xa)) / 2, xa);\n}\n\nfunction ycenterFn(shape, xa, ya) {\n return l2d((d2l(shape.y1, ya) + d2l(shape.y0, ya)) / 2, ya);\n}\n\nfunction slopeFn(shape, xa, ya) {\n return (shape.type !== 'line') ? undefined : (\n dyFn(shape, xa, ya) / dxFn(shape, xa)\n );\n}\n\nmodule.exports = {\n x0: x0Fn,\n x1: x1Fn,\n y0: y0Fn,\n y1: y1Fn,\n slope: slopeFn,\n dx: dxFn,\n dy: dyFn,\n width: widthFn,\n height: heightFn,\n length: lengthFn,\n xcenter: xcenterFn,\n ycenter: ycenterFn,\n};\n","'use strict';\n\nvar fontAttrs = require('../../plots/font_attributes');\nvar padAttrs = require('../../plots/pad_attributes');\nvar extendDeepAll = require('../../lib/extend').extendDeepAll;\nvar overrideAll = require('../../plot_api/edit_types').overrideAll;\nvar animationAttrs = require('../../plots/animation_attributes');\nvar templatedArray = require('../../plot_api/plot_template').templatedArray;\nvar constants = require('./constants');\n\nvar stepsAttrs = templatedArray('step', {\n visible: {\n valType: 'boolean',\n dflt: true,\n description: [\n 'Determines whether or not this step is included in the slider.'\n ].join(' ')\n },\n method: {\n valType: 'enumerated',\n values: ['restyle', 'relayout', 'animate', 'update', 'skip'],\n dflt: 'restyle',\n description: [\n 'Sets the Plotly method to be called when the slider value is changed.',\n 'If the `skip` method is used, the API slider will function as normal',\n 'but will perform no API calls and will not bind automatically to state',\n 'updates. This may be used to create a component interface and attach to',\n 'slider events manually via JavaScript.'\n ].join(' ')\n },\n args: {\n valType: 'info_array',\n freeLength: true,\n items: [\n { valType: 'any' },\n { valType: 'any' },\n { valType: 'any' }\n ],\n description: [\n 'Sets the arguments values to be passed to the Plotly',\n 'method set in `method` on slide.'\n ].join(' ')\n },\n label: {\n valType: 'string',\n description: 'Sets the text label to appear on the slider'\n },\n value: {\n valType: 'string',\n description: [\n 'Sets the value of the slider step, used to refer to the step programatically.',\n 'Defaults to the slider label if not provided.'\n ].join(' ')\n },\n execute: {\n valType: 'boolean',\n dflt: true,\n description: [\n 'When true, the API method is executed. When false, all other behaviors are the same',\n 'and command execution is skipped. This may be useful when hooking into, for example,',\n 'the `plotly_sliderchange` method and executing the API command manually without losing',\n 'the benefit of the slider automatically binding to the state of the plot through the',\n 'specification of `method` and `args`.'\n ].join(' ')\n }\n});\n\nmodule.exports = overrideAll(templatedArray('slider', {\n visible: {\n valType: 'boolean',\n dflt: true,\n description: [\n 'Determines whether or not the slider is visible.'\n ].join(' ')\n },\n\n active: {\n valType: 'number',\n min: 0,\n dflt: 0,\n description: [\n 'Determines which button (by index starting from 0) is',\n 'considered active.'\n ].join(' ')\n },\n\n steps: stepsAttrs,\n\n lenmode: {\n valType: 'enumerated',\n values: ['fraction', 'pixels'],\n dflt: 'fraction',\n description: [\n 'Determines whether this slider length',\n 'is set in units of plot *fraction* or in *pixels.',\n 'Use `len` to set the value.'\n ].join(' ')\n },\n len: {\n valType: 'number',\n min: 0,\n dflt: 1,\n description: [\n 'Sets the length of the slider',\n 'This measure excludes the padding of both ends.',\n 'That is, the slider\\'s length is this length minus the',\n 'padding on both ends.'\n ].join(' ')\n },\n x: {\n valType: 'number',\n min: -2,\n max: 3,\n dflt: 0,\n description: 'Sets the x position (in normalized coordinates) of the slider.'\n },\n pad: extendDeepAll(padAttrs({editType: 'arraydraw'}), {\n description: 'Set the padding of the slider component along each side.'\n }, {t: {dflt: 20}}),\n xanchor: {\n valType: 'enumerated',\n values: ['auto', 'left', 'center', 'right'],\n dflt: 'left',\n description: [\n 'Sets the slider\\'s horizontal position anchor.',\n 'This anchor binds the `x` position to the *left*, *center*',\n 'or *right* of the range selector.'\n ].join(' ')\n },\n y: {\n valType: 'number',\n min: -2,\n max: 3,\n dflt: 0,\n description: 'Sets the y position (in normalized coordinates) of the slider.'\n },\n yanchor: {\n valType: 'enumerated',\n values: ['auto', 'top', 'middle', 'bottom'],\n dflt: 'top',\n description: [\n 'Sets the slider\\'s vertical position anchor',\n 'This anchor binds the `y` position to the *top*, *middle*',\n 'or *bottom* of the range selector.'\n ].join(' ')\n },\n\n transition: {\n duration: {\n valType: 'number',\n min: 0,\n dflt: 150,\n description: 'Sets the duration of the slider transition'\n },\n easing: {\n valType: 'enumerated',\n values: animationAttrs.transition.easing.values,\n dflt: 'cubic-in-out',\n description: 'Sets the easing function of the slider transition'\n }\n },\n\n currentvalue: {\n visible: {\n valType: 'boolean',\n dflt: true,\n description: [\n 'Shows the currently-selected value above the slider.'\n ].join(' ')\n },\n\n xanchor: {\n valType: 'enumerated',\n values: ['left', 'center', 'right'],\n dflt: 'left',\n description: [\n 'The alignment of the value readout relative to the length of the slider.'\n ].join(' ')\n },\n\n offset: {\n valType: 'number',\n dflt: 10,\n description: [\n 'The amount of space, in pixels, between the current value label',\n 'and the slider.'\n ].join(' ')\n },\n\n prefix: {\n valType: 'string',\n description: 'When currentvalue.visible is true, this sets the prefix of the label.'\n },\n\n suffix: {\n valType: 'string',\n description: 'When currentvalue.visible is true, this sets the suffix of the label.'\n },\n\n font: fontAttrs({\n description: 'Sets the font of the current value label text.'\n })\n },\n\n font: fontAttrs({\n description: 'Sets the font of the slider step labels.'\n }),\n\n activebgcolor: {\n valType: 'color',\n dflt: constants.gripBgActiveColor,\n description: [\n 'Sets the background color of the slider grip',\n 'while dragging.'\n ].join(' ')\n },\n bgcolor: {\n valType: 'color',\n dflt: constants.railBgColor,\n description: 'Sets the background color of the slider.'\n },\n bordercolor: {\n valType: 'color',\n dflt: constants.railBorderColor,\n description: 'Sets the color of the border enclosing the slider.'\n },\n borderwidth: {\n valType: 'number',\n min: 0,\n dflt: constants.railBorderWidth,\n description: 'Sets the width (in px) of the border enclosing the slider.'\n },\n ticklen: {\n valType: 'number',\n min: 0,\n dflt: constants.tickLength,\n description: 'Sets the length in pixels of step tick marks'\n },\n tickcolor: {\n valType: 'color',\n dflt: constants.tickColor,\n description: 'Sets the color of the border enclosing the slider.'\n },\n tickwidth: {\n valType: 'number',\n min: 0,\n dflt: 1,\n description: 'Sets the tick width (in px).'\n },\n minorticklen: {\n valType: 'number',\n min: 0,\n dflt: constants.minorTickLength,\n description: 'Sets the length in pixels of minor step tick marks'\n }\n}), 'arraydraw', 'from-root');\n","'use strict';\n\n\nmodule.exports = {\n\n // layout attribute name\n name: 'sliders',\n\n // class names\n containerClassName: 'slider-container',\n groupClassName: 'slider-group',\n inputAreaClass: 'slider-input-area',\n railRectClass: 'slider-rail-rect',\n railTouchRectClass: 'slider-rail-touch-rect',\n gripRectClass: 'slider-grip-rect',\n tickRectClass: 'slider-tick-rect',\n inputProxyClass: 'slider-input-proxy',\n labelsClass: 'slider-labels',\n labelGroupClass: 'slider-label-group',\n labelClass: 'slider-label',\n currentValueClass: 'slider-current-value',\n\n railHeight: 5,\n\n // DOM attribute name in button group keeping track\n // of active update menu\n menuIndexAttrName: 'slider-active-index',\n\n // id root pass to Plots.autoMargin\n autoMarginIdRoot: 'slider-',\n\n // min item width / height\n minWidth: 30,\n minHeight: 30,\n\n // padding around item text\n textPadX: 40,\n\n // arrow offset off right edge\n arrowOffsetX: 4,\n\n railRadius: 2,\n railWidth: 5,\n railBorder: 4,\n railBorderWidth: 1,\n railBorderColor: '#bec8d9',\n railBgColor: '#f8fafc',\n\n // The distance of the rail from the edge of the touchable area\n // Slightly less than the step inset because of the curved edges\n // of the rail\n railInset: 8,\n\n // The distance from the extremal tick marks to the edge of the\n // touchable area. This is basically the same as the grip radius,\n // but for other styles it wouldn't really need to be.\n stepInset: 10,\n\n gripRadius: 10,\n gripWidth: 20,\n gripHeight: 20,\n gripBorder: 20,\n gripBorderWidth: 1,\n gripBorderColor: '#bec8d9',\n gripBgColor: '#f6f8fa',\n gripBgActiveColor: '#dbdde0',\n\n labelPadding: 8,\n labelOffset: 0,\n\n tickWidth: 1,\n tickColor: '#333',\n tickOffset: 25,\n tickLength: 7,\n\n minorTickOffset: 25,\n minorTickColor: '#333',\n minorTickLength: 4,\n\n // Extra space below the current value label:\n currentValuePadding: 8,\n currentValueInset: 0,\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar handleArrayContainerDefaults = require('../../plots/array_container_defaults');\n\nvar attributes = require('./attributes');\nvar constants = require('./constants');\n\nvar name = constants.name;\nvar stepAttrs = attributes.steps;\n\n\nmodule.exports = function slidersDefaults(layoutIn, layoutOut) {\n handleArrayContainerDefaults(layoutIn, layoutOut, {\n name: name,\n handleItemDefaults: sliderDefaults\n });\n};\n\nfunction sliderDefaults(sliderIn, sliderOut, layoutOut) {\n function coerce(attr, dflt) {\n return Lib.coerce(sliderIn, sliderOut, attributes, attr, dflt);\n }\n\n var steps = handleArrayContainerDefaults(sliderIn, sliderOut, {\n name: 'steps',\n handleItemDefaults: stepDefaults\n });\n\n var stepCount = 0;\n for(var i = 0; i < steps.length; i++) {\n if(steps[i].visible) stepCount++;\n }\n\n var visible;\n // If it has fewer than two options, it's not really a slider\n if(stepCount < 2) visible = sliderOut.visible = false;\n else visible = coerce('visible');\n if(!visible) return;\n\n sliderOut._stepCount = stepCount;\n var visSteps = sliderOut._visibleSteps = Lib.filterVisible(steps);\n\n var active = coerce('active');\n if(!(steps[active] || {}).visible) sliderOut.active = visSteps[0]._index;\n\n coerce('x');\n coerce('y');\n Lib.noneOrAll(sliderIn, sliderOut, ['x', 'y']);\n\n coerce('xanchor');\n coerce('yanchor');\n\n coerce('len');\n coerce('lenmode');\n\n coerce('pad.t');\n coerce('pad.r');\n coerce('pad.b');\n coerce('pad.l');\n\n Lib.coerceFont(coerce, 'font', layoutOut.font);\n\n var currentValueIsVisible = coerce('currentvalue.visible');\n\n if(currentValueIsVisible) {\n coerce('currentvalue.xanchor');\n coerce('currentvalue.prefix');\n coerce('currentvalue.suffix');\n coerce('currentvalue.offset');\n\n Lib.coerceFont(coerce, 'currentvalue.font', sliderOut.font);\n }\n\n coerce('transition.duration');\n coerce('transition.easing');\n\n coerce('bgcolor');\n coerce('activebgcolor');\n coerce('bordercolor');\n coerce('borderwidth');\n coerce('ticklen');\n coerce('tickwidth');\n coerce('tickcolor');\n coerce('minorticklen');\n}\n\nfunction stepDefaults(valueIn, valueOut) {\n function coerce(attr, dflt) {\n return Lib.coerce(valueIn, valueOut, stepAttrs, attr, dflt);\n }\n\n var visible;\n if(valueIn.method !== 'skip' && !Array.isArray(valueIn.args)) {\n visible = valueOut.visible = false;\n } else visible = coerce('visible');\n\n if(visible) {\n coerce('method');\n coerce('args');\n var label = coerce('label', 'step-' + valueOut._index);\n coerce('value', label);\n coerce('execute');\n }\n}\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nvar Plots = require('../../plots/plots');\nvar Color = require('../color');\nvar Drawing = require('../drawing');\nvar Lib = require('../../lib');\nvar strTranslate = Lib.strTranslate;\nvar svgTextUtils = require('../../lib/svg_text_utils');\nvar arrayEditor = require('../../plot_api/plot_template').arrayEditor;\n\nvar constants = require('./constants');\nvar alignmentConstants = require('../../constants/alignment');\nvar LINE_SPACING = alignmentConstants.LINE_SPACING;\nvar FROM_TL = alignmentConstants.FROM_TL;\nvar FROM_BR = alignmentConstants.FROM_BR;\n\nmodule.exports = function draw(gd) {\n var staticPlot = gd._context.staticPlot;\n var fullLayout = gd._fullLayout;\n var sliderData = makeSliderData(fullLayout, gd);\n\n // draw a container for *all* sliders:\n var sliders = fullLayout._infolayer\n .selectAll('g.' + constants.containerClassName)\n .data(sliderData.length > 0 ? [0] : []);\n\n sliders.enter().append('g')\n .classed(constants.containerClassName, true)\n .style('cursor', staticPlot ? null : 'ew-resize');\n\n function clearSlider(sliderOpts) {\n if(sliderOpts._commandObserver) {\n sliderOpts._commandObserver.remove();\n delete sliderOpts._commandObserver;\n }\n\n // Most components don't need to explicitly remove autoMargin, because\n // marginPushers does this - but slider updates don't go through\n // a full replot so we need to explicitly remove it.\n Plots.autoMargin(gd, autoMarginId(sliderOpts));\n }\n\n sliders.exit().each(function() {\n d3.select(this).selectAll('g.' + constants.groupClassName)\n .each(clearSlider);\n })\n .remove();\n\n // Return early if no menus visible:\n if(sliderData.length === 0) return;\n\n var sliderGroups = sliders.selectAll('g.' + constants.groupClassName)\n .data(sliderData, keyFunction);\n\n sliderGroups.enter().append('g')\n .classed(constants.groupClassName, true);\n\n sliderGroups.exit()\n .each(clearSlider)\n .remove();\n\n // Find the dimensions of the sliders:\n for(var i = 0; i < sliderData.length; i++) {\n var sliderOpts = sliderData[i];\n findDimensions(gd, sliderOpts);\n }\n\n sliderGroups.each(function(sliderOpts) {\n var gSlider = d3.select(this);\n\n computeLabelSteps(sliderOpts);\n\n Plots.manageCommandObserver(gd, sliderOpts, sliderOpts._visibleSteps, function(data) {\n // NB: Same as below. This is *not* always the same as sliderOpts since\n // if a new set of steps comes in, the reference in this callback would\n // be invalid. We need to refetch it from the slider group, which is\n // the join data that creates this slider. So if this slider still exists,\n // the group should be valid, *to the best of my knowledge.* If not,\n // we'd have to look it up by d3 data join index/key.\n var opts = gSlider.data()[0];\n\n if(opts.active === data.index) return;\n if(opts._dragging) return;\n\n setActive(gd, gSlider, opts, data.index, false, true);\n });\n\n drawSlider(gd, d3.select(this), sliderOpts);\n });\n};\n\nfunction autoMarginId(sliderOpts) {\n return constants.autoMarginIdRoot + sliderOpts._index;\n}\n\n// This really only just filters by visibility:\nfunction makeSliderData(fullLayout, gd) {\n var contOpts = fullLayout[constants.name];\n var sliderData = [];\n\n for(var i = 0; i < contOpts.length; i++) {\n var item = contOpts[i];\n if(!item.visible) continue;\n item._gd = gd;\n sliderData.push(item);\n }\n\n return sliderData;\n}\n\n// This is set in the defaults step:\nfunction keyFunction(opts) {\n return opts._index;\n}\n\n// Compute the dimensions (mutates sliderOpts):\nfunction findDimensions(gd, sliderOpts) {\n var sliderLabels = Drawing.tester.selectAll('g.' + constants.labelGroupClass)\n .data(sliderOpts._visibleSteps);\n\n sliderLabels.enter().append('g')\n .classed(constants.labelGroupClass, true);\n\n // loop over fake buttons to find width / height\n var maxLabelWidth = 0;\n var labelHeight = 0;\n sliderLabels.each(function(stepOpts) {\n var labelGroup = d3.select(this);\n\n var text = drawLabel(labelGroup, {step: stepOpts}, sliderOpts);\n\n var textNode = text.node();\n if(textNode) {\n var bBox = Drawing.bBox(textNode);\n labelHeight = Math.max(labelHeight, bBox.height);\n maxLabelWidth = Math.max(maxLabelWidth, bBox.width);\n }\n });\n\n sliderLabels.remove();\n\n var dims = sliderOpts._dims = {};\n\n dims.inputAreaWidth = Math.max(\n constants.railWidth,\n constants.gripHeight\n );\n\n // calculate some overall dimensions - some of these are needed for\n // calculating the currentValue dimensions\n var graphSize = gd._fullLayout._size;\n dims.lx = graphSize.l + graphSize.w * sliderOpts.x;\n dims.ly = graphSize.t + graphSize.h * (1 - sliderOpts.y);\n\n if(sliderOpts.lenmode === 'fraction') {\n // fraction:\n dims.outerLength = Math.round(graphSize.w * sliderOpts.len);\n } else {\n // pixels:\n dims.outerLength = sliderOpts.len;\n }\n\n // The length of the rail, *excluding* padding on either end:\n dims.inputAreaStart = 0;\n dims.inputAreaLength = Math.round(dims.outerLength - sliderOpts.pad.l - sliderOpts.pad.r);\n\n var textableInputLength = dims.inputAreaLength - 2 * constants.stepInset;\n var availableSpacePerLabel = textableInputLength / (sliderOpts._stepCount - 1);\n var computedSpacePerLabel = maxLabelWidth + constants.labelPadding;\n dims.labelStride = Math.max(1, Math.ceil(computedSpacePerLabel / availableSpacePerLabel));\n dims.labelHeight = labelHeight;\n\n // loop over all possible values for currentValue to find the\n // area we need for it\n dims.currentValueMaxWidth = 0;\n dims.currentValueHeight = 0;\n dims.currentValueTotalHeight = 0;\n dims.currentValueMaxLines = 1;\n\n if(sliderOpts.currentvalue.visible) {\n // Get the dimensions of the current value label:\n var dummyGroup = Drawing.tester.append('g');\n\n sliderLabels.each(function(stepOpts) {\n var curValPrefix = drawCurrentValue(dummyGroup, sliderOpts, stepOpts.label);\n var curValSize = (curValPrefix.node() && Drawing.bBox(curValPrefix.node())) || {width: 0, height: 0};\n var lines = svgTextUtils.lineCount(curValPrefix);\n dims.currentValueMaxWidth = Math.max(dims.currentValueMaxWidth, Math.ceil(curValSize.width));\n dims.currentValueHeight = Math.max(dims.currentValueHeight, Math.ceil(curValSize.height));\n dims.currentValueMaxLines = Math.max(dims.currentValueMaxLines, lines);\n });\n\n dims.currentValueTotalHeight = dims.currentValueHeight + sliderOpts.currentvalue.offset;\n\n dummyGroup.remove();\n }\n\n dims.height = dims.currentValueTotalHeight + constants.tickOffset + sliderOpts.ticklen + constants.labelOffset + dims.labelHeight + sliderOpts.pad.t + sliderOpts.pad.b;\n\n var xanchor = 'left';\n if(Lib.isRightAnchor(sliderOpts)) {\n dims.lx -= dims.outerLength;\n xanchor = 'right';\n }\n if(Lib.isCenterAnchor(sliderOpts)) {\n dims.lx -= dims.outerLength / 2;\n xanchor = 'center';\n }\n\n var yanchor = 'top';\n if(Lib.isBottomAnchor(sliderOpts)) {\n dims.ly -= dims.height;\n yanchor = 'bottom';\n }\n if(Lib.isMiddleAnchor(sliderOpts)) {\n dims.ly -= dims.height / 2;\n yanchor = 'middle';\n }\n\n dims.outerLength = Math.ceil(dims.outerLength);\n dims.height = Math.ceil(dims.height);\n dims.lx = Math.round(dims.lx);\n dims.ly = Math.round(dims.ly);\n\n var marginOpts = {\n y: sliderOpts.y,\n b: dims.height * FROM_BR[yanchor],\n t: dims.height * FROM_TL[yanchor]\n };\n\n if(sliderOpts.lenmode === 'fraction') {\n marginOpts.l = 0;\n marginOpts.xl = sliderOpts.x - sliderOpts.len * FROM_TL[xanchor];\n marginOpts.r = 0;\n marginOpts.xr = sliderOpts.x + sliderOpts.len * FROM_BR[xanchor];\n } else {\n marginOpts.x = sliderOpts.x;\n marginOpts.l = dims.outerLength * FROM_TL[xanchor];\n marginOpts.r = dims.outerLength * FROM_BR[xanchor];\n }\n\n Plots.autoMargin(gd, autoMarginId(sliderOpts), marginOpts);\n}\n\nfunction drawSlider(gd, sliderGroup, sliderOpts) {\n // This is related to the other long notes in this file regarding what happens\n // when slider steps disappear. This particular fix handles what happens when\n // the *current* slider step is removed. The drawing functions will error out\n // when they fail to find it, so the fix for now is that it will just draw the\n // slider in the first position but will not execute the command.\n if(!((sliderOpts.steps[sliderOpts.active] || {}).visible)) {\n sliderOpts.active = sliderOpts._visibleSteps[0]._index;\n }\n\n // These are carefully ordered for proper z-ordering:\n sliderGroup\n .call(drawCurrentValue, sliderOpts)\n .call(drawRail, sliderOpts)\n .call(drawLabelGroup, sliderOpts)\n .call(drawTicks, sliderOpts)\n .call(drawTouchRect, gd, sliderOpts)\n .call(drawGrip, gd, sliderOpts);\n\n var dims = sliderOpts._dims;\n\n // Position the rectangle:\n Drawing.setTranslate(sliderGroup, dims.lx + sliderOpts.pad.l, dims.ly + sliderOpts.pad.t);\n\n sliderGroup.call(setGripPosition, sliderOpts, false);\n sliderGroup.call(drawCurrentValue, sliderOpts);\n}\n\nfunction drawCurrentValue(sliderGroup, sliderOpts, valueOverride) {\n if(!sliderOpts.currentvalue.visible) return;\n\n var dims = sliderOpts._dims;\n var x0, textAnchor;\n\n switch(sliderOpts.currentvalue.xanchor) {\n case 'right':\n // This is anchored left and adjusted by the width of the longest label\n // so that the prefix doesn't move. The goal of this is to emphasize\n // what's actually changing and make the update less distracting.\n x0 = dims.inputAreaLength - constants.currentValueInset - dims.currentValueMaxWidth;\n textAnchor = 'left';\n break;\n case 'center':\n x0 = dims.inputAreaLength * 0.5;\n textAnchor = 'middle';\n break;\n default:\n x0 = constants.currentValueInset;\n textAnchor = 'left';\n }\n\n var text = Lib.ensureSingle(sliderGroup, 'text', constants.labelClass, function(s) {\n s.attr({\n 'text-anchor': textAnchor,\n 'data-notex': 1\n });\n });\n\n var str = sliderOpts.currentvalue.prefix ? sliderOpts.currentvalue.prefix : '';\n\n if(typeof valueOverride === 'string') {\n str += valueOverride;\n } else {\n var curVal = sliderOpts.steps[sliderOpts.active].label;\n var _meta = sliderOpts._gd._fullLayout._meta;\n if(_meta) curVal = Lib.templateString(curVal, _meta);\n str += curVal;\n }\n\n if(sliderOpts.currentvalue.suffix) {\n str += sliderOpts.currentvalue.suffix;\n }\n\n text.call(Drawing.font, sliderOpts.currentvalue.font)\n .text(str)\n .call(svgTextUtils.convertToTspans, sliderOpts._gd);\n\n var lines = svgTextUtils.lineCount(text);\n\n var y0 = (dims.currentValueMaxLines + 1 - lines) *\n sliderOpts.currentvalue.font.size * LINE_SPACING;\n\n svgTextUtils.positionText(text, x0, y0);\n\n return text;\n}\n\nfunction drawGrip(sliderGroup, gd, sliderOpts) {\n var grip = Lib.ensureSingle(sliderGroup, 'rect', constants.gripRectClass, function(s) {\n s.call(attachGripEvents, gd, sliderGroup, sliderOpts)\n .style('pointer-events', 'all');\n });\n\n grip.attr({\n width: constants.gripWidth,\n height: constants.gripHeight,\n rx: constants.gripRadius,\n ry: constants.gripRadius,\n })\n .call(Color.stroke, sliderOpts.bordercolor)\n .call(Color.fill, sliderOpts.bgcolor)\n .style('stroke-width', sliderOpts.borderwidth + 'px');\n}\n\nfunction drawLabel(item, data, sliderOpts) {\n var text = Lib.ensureSingle(item, 'text', constants.labelClass, function(s) {\n s.attr({\n 'text-anchor': 'middle',\n 'data-notex': 1\n });\n });\n\n var tx = data.step.label;\n var _meta = sliderOpts._gd._fullLayout._meta;\n if(_meta) tx = Lib.templateString(tx, _meta);\n\n text.call(Drawing.font, sliderOpts.font)\n .text(tx)\n .call(svgTextUtils.convertToTspans, sliderOpts._gd);\n\n return text;\n}\n\nfunction drawLabelGroup(sliderGroup, sliderOpts) {\n var labels = Lib.ensureSingle(sliderGroup, 'g', constants.labelsClass);\n var dims = sliderOpts._dims;\n\n var labelItems = labels.selectAll('g.' + constants.labelGroupClass)\n .data(dims.labelSteps);\n\n labelItems.enter().append('g')\n .classed(constants.labelGroupClass, true);\n\n labelItems.exit().remove();\n\n labelItems.each(function(d) {\n var item = d3.select(this);\n\n item.call(drawLabel, d, sliderOpts);\n\n Drawing.setTranslate(item,\n normalizedValueToPosition(sliderOpts, d.fraction),\n constants.tickOffset +\n sliderOpts.ticklen +\n // position is the baseline of the top line of text only, even\n // if the label spans multiple lines\n sliderOpts.font.size * LINE_SPACING +\n constants.labelOffset +\n dims.currentValueTotalHeight\n );\n });\n}\n\nfunction handleInput(gd, sliderGroup, sliderOpts, normalizedPosition, doTransition) {\n var quantizedPosition = Math.round(normalizedPosition * (sliderOpts._stepCount - 1));\n var quantizedIndex = sliderOpts._visibleSteps[quantizedPosition]._index;\n\n if(quantizedIndex !== sliderOpts.active) {\n setActive(gd, sliderGroup, sliderOpts, quantizedIndex, true, doTransition);\n }\n}\n\nfunction setActive(gd, sliderGroup, sliderOpts, index, doCallback, doTransition) {\n var previousActive = sliderOpts.active;\n sliderOpts.active = index;\n\n // due to templating, it's possible this slider doesn't even exist yet\n arrayEditor(gd.layout, constants.name, sliderOpts)\n .applyUpdate('active', index);\n\n var step = sliderOpts.steps[sliderOpts.active];\n\n sliderGroup.call(setGripPosition, sliderOpts, doTransition);\n sliderGroup.call(drawCurrentValue, sliderOpts);\n\n gd.emit('plotly_sliderchange', {\n slider: sliderOpts,\n step: sliderOpts.steps[sliderOpts.active],\n interaction: doCallback,\n previousActive: previousActive\n });\n\n if(step && step.method && doCallback) {\n if(sliderGroup._nextMethod) {\n // If we've already queued up an update, just overwrite it with the most recent:\n sliderGroup._nextMethod.step = step;\n sliderGroup._nextMethod.doCallback = doCallback;\n sliderGroup._nextMethod.doTransition = doTransition;\n } else {\n sliderGroup._nextMethod = {step: step, doCallback: doCallback, doTransition: doTransition};\n sliderGroup._nextMethodRaf = window.requestAnimationFrame(function() {\n var _step = sliderGroup._nextMethod.step;\n if(!_step.method) return;\n\n if(_step.execute) {\n Plots.executeAPICommand(gd, _step.method, _step.args);\n }\n\n sliderGroup._nextMethod = null;\n sliderGroup._nextMethodRaf = null;\n });\n }\n }\n}\n\nfunction attachGripEvents(item, gd, sliderGroup) {\n if(gd._context.staticPlot) return;\n\n var node = sliderGroup.node();\n var $gd = d3.select(gd);\n\n // NB: This is *not* the same as sliderOpts itself! These callbacks\n // are in a closure so this array won't actually be correct if the\n // steps have changed since this was initialized. The sliderGroup,\n // however, has not changed since that *is* the slider, so it must\n // be present to receive mouse events.\n function getSliderOpts() {\n return sliderGroup.data()[0];\n }\n\n function mouseDownHandler() {\n var sliderOpts = getSliderOpts();\n gd.emit('plotly_sliderstart', {slider: sliderOpts});\n\n var grip = sliderGroup.select('.' + constants.gripRectClass);\n\n d3.event.stopPropagation();\n d3.event.preventDefault();\n grip.call(Color.fill, sliderOpts.activebgcolor);\n\n var normalizedPosition = positionToNormalizedValue(sliderOpts, d3.mouse(node)[0]);\n handleInput(gd, sliderGroup, sliderOpts, normalizedPosition, true);\n sliderOpts._dragging = true;\n\n function mouseMoveHandler() {\n var sliderOpts = getSliderOpts();\n var normalizedPosition = positionToNormalizedValue(sliderOpts, d3.mouse(node)[0]);\n handleInput(gd, sliderGroup, sliderOpts, normalizedPosition, false);\n }\n\n $gd.on('mousemove', mouseMoveHandler);\n $gd.on('touchmove', mouseMoveHandler);\n\n function mouseUpHandler() {\n var sliderOpts = getSliderOpts();\n sliderOpts._dragging = false;\n grip.call(Color.fill, sliderOpts.bgcolor);\n $gd.on('mouseup', null);\n $gd.on('mousemove', null);\n $gd.on('touchend', null);\n $gd.on('touchmove', null);\n\n gd.emit('plotly_sliderend', {\n slider: sliderOpts,\n step: sliderOpts.steps[sliderOpts.active]\n });\n }\n\n $gd.on('mouseup', mouseUpHandler);\n $gd.on('touchend', mouseUpHandler);\n }\n\n item.on('mousedown', mouseDownHandler);\n item.on('touchstart', mouseDownHandler);\n}\n\nfunction drawTicks(sliderGroup, sliderOpts) {\n var tick = sliderGroup.selectAll('rect.' + constants.tickRectClass)\n .data(sliderOpts._visibleSteps);\n var dims = sliderOpts._dims;\n\n tick.enter().append('rect')\n .classed(constants.tickRectClass, true);\n\n tick.exit().remove();\n\n tick.attr({\n width: sliderOpts.tickwidth + 'px',\n 'shape-rendering': 'crispEdges'\n });\n\n tick.each(function(d, i) {\n var isMajor = i % dims.labelStride === 0;\n var item = d3.select(this);\n\n item\n .attr({height: isMajor ? sliderOpts.ticklen : sliderOpts.minorticklen})\n .call(Color.fill, isMajor ? sliderOpts.tickcolor : sliderOpts.tickcolor);\n\n Drawing.setTranslate(item,\n normalizedValueToPosition(sliderOpts, i / (sliderOpts._stepCount - 1)) - 0.5 * sliderOpts.tickwidth,\n (isMajor ? constants.tickOffset : constants.minorTickOffset) + dims.currentValueTotalHeight\n );\n });\n}\n\nfunction computeLabelSteps(sliderOpts) {\n var dims = sliderOpts._dims;\n dims.labelSteps = [];\n var nsteps = sliderOpts._stepCount;\n\n for(var i = 0; i < nsteps; i += dims.labelStride) {\n dims.labelSteps.push({\n fraction: i / (nsteps - 1),\n step: sliderOpts._visibleSteps[i]\n });\n }\n}\n\nfunction setGripPosition(sliderGroup, sliderOpts, doTransition) {\n var grip = sliderGroup.select('rect.' + constants.gripRectClass);\n\n var quantizedIndex = 0;\n for(var i = 0; i < sliderOpts._stepCount; i++) {\n if(sliderOpts._visibleSteps[i]._index === sliderOpts.active) {\n quantizedIndex = i;\n break;\n }\n }\n\n var x = normalizedValueToPosition(sliderOpts, quantizedIndex / (sliderOpts._stepCount - 1));\n\n // If this is true, then *this component* is already invoking its own command\n // and has triggered its own animation.\n if(sliderOpts._invokingCommand) return;\n\n var el = grip;\n if(doTransition && sliderOpts.transition.duration > 0) {\n el = el.transition()\n .duration(sliderOpts.transition.duration)\n .ease(sliderOpts.transition.easing);\n }\n\n // Drawing.setTranslate doesn't work here because of the transition duck-typing.\n // It's also not necessary because there are no other transitions to preserve.\n el.attr('transform', strTranslate(x - constants.gripWidth * 0.5, sliderOpts._dims.currentValueTotalHeight));\n}\n\n// Convert a number from [0-1] to a pixel position relative to the slider group container:\nfunction normalizedValueToPosition(sliderOpts, normalizedPosition) {\n var dims = sliderOpts._dims;\n return dims.inputAreaStart + constants.stepInset +\n (dims.inputAreaLength - 2 * constants.stepInset) * Math.min(1, Math.max(0, normalizedPosition));\n}\n\n// Convert a position relative to the slider group to a nubmer in [0, 1]\nfunction positionToNormalizedValue(sliderOpts, position) {\n var dims = sliderOpts._dims;\n return Math.min(1, Math.max(0, (position - constants.stepInset - dims.inputAreaStart) / (dims.inputAreaLength - 2 * constants.stepInset - 2 * dims.inputAreaStart)));\n}\n\nfunction drawTouchRect(sliderGroup, gd, sliderOpts) {\n var dims = sliderOpts._dims;\n var rect = Lib.ensureSingle(sliderGroup, 'rect', constants.railTouchRectClass, function(s) {\n s.call(attachGripEvents, gd, sliderGroup, sliderOpts)\n .style('pointer-events', 'all');\n });\n\n rect.attr({\n width: dims.inputAreaLength,\n height: Math.max(dims.inputAreaWidth, constants.tickOffset + sliderOpts.ticklen + dims.labelHeight)\n })\n .call(Color.fill, sliderOpts.bgcolor)\n .attr('opacity', 0);\n\n Drawing.setTranslate(rect, 0, dims.currentValueTotalHeight);\n}\n\nfunction drawRail(sliderGroup, sliderOpts) {\n var dims = sliderOpts._dims;\n var computedLength = dims.inputAreaLength - constants.railInset * 2;\n var rect = Lib.ensureSingle(sliderGroup, 'rect', constants.railRectClass);\n\n rect.attr({\n width: computedLength,\n height: constants.railWidth,\n rx: constants.railRadius,\n ry: constants.railRadius,\n 'shape-rendering': 'crispEdges'\n })\n .call(Color.stroke, sliderOpts.bordercolor)\n .call(Color.fill, sliderOpts.bgcolor)\n .style('stroke-width', sliderOpts.borderwidth + 'px');\n\n Drawing.setTranslate(rect,\n constants.railInset,\n (dims.inputAreaWidth - constants.railWidth) * 0.5 + dims.currentValueTotalHeight\n );\n}\n","'use strict';\n\nvar constants = require('./constants');\n\nmodule.exports = {\n moduleType: 'component',\n name: constants.name,\n\n layoutAttributes: require('./attributes'),\n supplyLayoutDefaults: require('./defaults'),\n\n draw: require('./draw')\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\nvar isNumeric = require('fast-isnumeric');\n\nvar Plots = require('../../plots/plots');\nvar Registry = require('../../registry');\nvar Lib = require('../../lib');\nvar strTranslate = Lib.strTranslate;\nvar Drawing = require('../drawing');\nvar Color = require('../color');\nvar svgTextUtils = require('../../lib/svg_text_utils');\nvar interactConstants = require('../../constants/interactions');\n\nvar OPPOSITE_SIDE = require('../../constants/alignment').OPPOSITE_SIDE;\nvar numStripRE = / [XY][0-9]* /;\n\n/**\n * Titles - (re)draw titles on the axes and plot:\n * @param {DOM element} gd - the graphDiv\n * @param {string} titleClass - the css class of this title\n * @param {object} options - how and what to draw\n * propContainer - the layout object containing `title` and `titlefont`\n * attributes that apply to this title\n * propName - the full name of the title property (for Plotly.relayout)\n * [traceIndex] - include only if this property applies to one trace\n * (such as a colorbar title) - then editing pipes to Plotly.restyle\n * instead of Plotly.relayout\n * placeholder - placeholder text for an empty editable title\n * [avoid] {object} - include if this title should move to avoid other elements\n * selection - d3 selection of elements to avoid\n * side - which direction to move if there is a conflict\n * [offsetLeft] - if these elements are subject to a translation\n * wrt the title element\n * [offsetTop]\n * attributes {object} - position and alignment attributes\n * x - pixels\n * y - pixels\n * text-anchor - start|middle|end\n * transform {object} - how to transform the title after positioning\n * rotate - degrees\n * offset - shift up/down in the rotated frame (unused?)\n * containerGroup - if an svg element already exists to hold this\n * title, include here. Otherwise it will go in fullLayout._infolayer\n * _meta {object (optional} - meta key-value to for title with\n * Lib.templateString, default to fullLayout._meta, if not provided\n *\n * @return {selection} d3 selection of title container group\n */\nfunction draw(gd, titleClass, options) {\n var cont = options.propContainer;\n var prop = options.propName;\n var placeholder = options.placeholder;\n var traceIndex = options.traceIndex;\n var avoid = options.avoid || {};\n var attributes = options.attributes;\n var transform = options.transform;\n var group = options.containerGroup;\n\n var fullLayout = gd._fullLayout;\n\n var opacity = 1;\n var isplaceholder = false;\n var title = cont.title;\n var txt = (title && title.text ? title.text : '').trim();\n\n var font = title && title.font ? title.font : {};\n var fontFamily = font.family;\n var fontSize = font.size;\n var fontColor = font.color;\n\n // only make this title editable if we positively identify its property\n // as one that has editing enabled.\n var editAttr;\n if(prop === 'title.text') editAttr = 'titleText';\n else if(prop.indexOf('axis') !== -1) editAttr = 'axisTitleText';\n else if(prop.indexOf('colorbar' !== -1)) editAttr = 'colorbarTitleText';\n var editable = gd._context.edits[editAttr];\n\n if(txt === '') opacity = 0;\n // look for placeholder text while stripping out numbers from eg X2, Y3\n // this is just for backward compatibility with the old version that had\n // \"Click to enter X2 title\" and may have gotten saved in some old plots,\n // we don't want this to show up when these are displayed.\n else if(txt.replace(numStripRE, ' % ') === placeholder.replace(numStripRE, ' % ')) {\n opacity = 0.2;\n isplaceholder = true;\n if(!editable) txt = '';\n }\n\n if(options._meta) {\n txt = Lib.templateString(txt, options._meta);\n } else if(fullLayout._meta) {\n txt = Lib.templateString(txt, fullLayout._meta);\n }\n\n var elShouldExist = txt || editable;\n\n var hColorbarMoveTitle;\n if(!group) {\n group = Lib.ensureSingle(fullLayout._infolayer, 'g', 'g-' + titleClass);\n hColorbarMoveTitle = fullLayout._hColorbarMoveTitle;\n }\n\n var el = group.selectAll('text')\n .data(elShouldExist ? [0] : []);\n el.enter().append('text');\n el.text(txt)\n // this is hacky, but convertToTspans uses the class\n // to determine whether to rotate mathJax...\n // so we need to clear out any old class and put the\n // correct one (only relevant for colorbars, at least\n // for now) - ie don't use .classed\n .attr('class', titleClass);\n el.exit().remove();\n\n if(!elShouldExist) return group;\n\n function titleLayout(titleEl) {\n Lib.syncOrAsync([drawTitle, scootTitle], titleEl);\n }\n\n function drawTitle(titleEl) {\n var transformVal;\n\n if(!transform && hColorbarMoveTitle) {\n transform = {};\n }\n\n if(transform) {\n transformVal = '';\n if(transform.rotate) {\n transformVal += 'rotate(' + [transform.rotate, attributes.x, attributes.y] + ')';\n }\n if(transform.offset || hColorbarMoveTitle) {\n transformVal += strTranslate(0, (transform.offset || 0) - (hColorbarMoveTitle || 0));\n }\n } else {\n transformVal = null;\n }\n\n titleEl.attr('transform', transformVal);\n\n titleEl.style({\n 'font-family': fontFamily,\n 'font-size': d3.round(fontSize, 2) + 'px',\n fill: Color.rgb(fontColor),\n opacity: opacity * Color.opacity(fontColor),\n 'font-weight': Plots.fontWeight\n })\n .attr(attributes)\n .call(svgTextUtils.convertToTspans, gd);\n\n return Plots.previousPromises(gd);\n }\n\n function scootTitle(titleElIn) {\n var titleGroup = d3.select(titleElIn.node().parentNode);\n\n if(avoid && avoid.selection && avoid.side && txt) {\n titleGroup.attr('transform', null);\n\n // move toward avoid.side (= left, right, top, bottom) if needed\n // can include pad (pixels, default 2)\n var backside = OPPOSITE_SIDE[avoid.side];\n var shiftSign = (avoid.side === 'left' || avoid.side === 'top') ? -1 : 1;\n var pad = isNumeric(avoid.pad) ? avoid.pad : 2;\n\n var titlebb = Drawing.bBox(titleGroup.node());\n\n // Account for reservedMargins\n var reservedMargins = {t: 0, b: 0, l: 0, r: 0};\n var margins = gd._fullLayout._reservedMargin;\n for(var key in margins) {\n for(var side in margins[key]) {\n var val = margins[key][side];\n reservedMargins[side] = Math.max(reservedMargins[side], val);\n }\n }\n var paperbb = {\n left: reservedMargins.l,\n top: reservedMargins.t,\n right: fullLayout.width - reservedMargins.r,\n bottom: fullLayout.height - reservedMargins.b\n };\n\n var maxshift = avoid.maxShift ||\n shiftSign * (paperbb[avoid.side] - titlebb[avoid.side]);\n var shift = 0;\n\n // Prevent the title going off the paper\n if(maxshift < 0) {\n shift = maxshift;\n } else {\n // so we don't have to offset each avoided element,\n // give the title the opposite offset\n var offsetLeft = avoid.offsetLeft || 0;\n var offsetTop = avoid.offsetTop || 0;\n titlebb.left -= offsetLeft;\n titlebb.right -= offsetLeft;\n titlebb.top -= offsetTop;\n titlebb.bottom -= offsetTop;\n\n // iterate over a set of elements (avoid.selection)\n // to avoid collisions with\n avoid.selection.each(function() {\n var avoidbb = Drawing.bBox(this);\n\n if(Lib.bBoxIntersect(titlebb, avoidbb, pad)) {\n shift = Math.max(shift, shiftSign * (\n avoidbb[avoid.side] - titlebb[backside]) + pad);\n }\n });\n shift = Math.min(maxshift, shift);\n // Keeping track of this for calculation of full axis size if needed\n cont._titleScoot = Math.abs(shift);\n }\n\n if(shift > 0 || maxshift < 0) {\n var shiftTemplate = {\n left: [-shift, 0],\n right: [shift, 0],\n top: [0, -shift],\n bottom: [0, shift]\n }[avoid.side];\n titleGroup.attr('transform', strTranslate(shiftTemplate[0], shiftTemplate[1]));\n }\n }\n }\n\n el.call(titleLayout);\n\n function setPlaceholder() {\n opacity = 0;\n isplaceholder = true;\n el.text(placeholder)\n .on('mouseover.opacity', function() {\n d3.select(this).transition()\n .duration(interactConstants.SHOW_PLACEHOLDER).style('opacity', 1);\n })\n .on('mouseout.opacity', function() {\n d3.select(this).transition()\n .duration(interactConstants.HIDE_PLACEHOLDER).style('opacity', 0);\n });\n }\n\n if(editable) {\n if(!txt) setPlaceholder();\n else el.on('.opacity', null);\n\n el.call(svgTextUtils.makeEditable, {gd: gd})\n .on('edit', function(text) {\n if(traceIndex !== undefined) {\n Registry.call('_guiRestyle', gd, prop, text, traceIndex);\n } else {\n Registry.call('_guiRelayout', gd, prop, text);\n }\n })\n .on('cancel', function() {\n this.text(this.attr('data-unformatted'))\n .call(titleLayout);\n })\n .on('input', function(d) {\n this.text(d || ' ')\n .call(svgTextUtils.positionText, attributes.x, attributes.y);\n });\n }\n el.classed('js-placeholder', isplaceholder);\n\n return group;\n}\n\nmodule.exports = {\n draw: draw\n};\n","'use strict';\n\nvar fontAttrs = require('../../plots/font_attributes');\nvar colorAttrs = require('../color/attributes');\nvar extendFlat = require('../../lib/extend').extendFlat;\nvar overrideAll = require('../../plot_api/edit_types').overrideAll;\nvar padAttrs = require('../../plots/pad_attributes');\nvar templatedArray = require('../../plot_api/plot_template').templatedArray;\n\nvar buttonsAttrs = templatedArray('button', {\n visible: {\n valType: 'boolean',\n description: 'Determines whether or not this button is visible.'\n },\n method: {\n valType: 'enumerated',\n values: ['restyle', 'relayout', 'animate', 'update', 'skip'],\n dflt: 'restyle',\n description: [\n 'Sets the Plotly method to be called on click.',\n 'If the `skip` method is used, the API updatemenu will function as normal',\n 'but will perform no API calls and will not bind automatically to state',\n 'updates. This may be used to create a component interface and attach to',\n 'updatemenu events manually via JavaScript.'\n ].join(' ')\n },\n args: {\n valType: 'info_array',\n freeLength: true,\n items: [\n {valType: 'any'},\n {valType: 'any'},\n {valType: 'any'}\n ],\n description: [\n 'Sets the arguments values to be passed to the Plotly',\n 'method set in `method` on click.'\n ].join(' ')\n },\n args2: {\n valType: 'info_array',\n freeLength: true,\n items: [\n {valType: 'any'},\n {valType: 'any'},\n {valType: 'any'}\n ],\n description: [\n 'Sets a 2nd set of `args`,',\n 'these arguments values are passed to the Plotly',\n 'method set in `method` when clicking this button while in the active state.',\n 'Use this to create toggle buttons.'\n ].join(' ')\n },\n label: {\n valType: 'string',\n dflt: '',\n description: 'Sets the text label to appear on the button.'\n },\n execute: {\n valType: 'boolean',\n dflt: true,\n description: [\n 'When true, the API method is executed. When false, all other behaviors are the same',\n 'and command execution is skipped. This may be useful when hooking into, for example,',\n 'the `plotly_buttonclicked` method and executing the API command manually without losing',\n 'the benefit of the updatemenu automatically binding to the state of the plot through the',\n 'specification of `method` and `args`.'\n ].join(' ')\n }\n});\n\nmodule.exports = overrideAll(templatedArray('updatemenu', {\n _arrayAttrRegexps: [/^updatemenus\\[(0|[1-9][0-9]+)\\]\\.buttons/],\n\n visible: {\n valType: 'boolean',\n description: [\n 'Determines whether or not the update menu is visible.'\n ].join(' ')\n },\n\n type: {\n valType: 'enumerated',\n values: ['dropdown', 'buttons'],\n dflt: 'dropdown',\n description: [\n 'Determines whether the buttons are accessible via a dropdown menu',\n 'or whether the buttons are stacked horizontally or vertically'\n ].join(' ')\n },\n\n direction: {\n valType: 'enumerated',\n values: ['left', 'right', 'up', 'down'],\n dflt: 'down',\n description: [\n 'Determines the direction in which the buttons are laid out, whether',\n 'in a dropdown menu or a row/column of buttons. For `left` and `up`,',\n 'the buttons will still appear in left-to-right or top-to-bottom order',\n 'respectively.'\n ].join(' ')\n },\n\n active: {\n valType: 'integer',\n min: -1,\n dflt: 0,\n description: [\n 'Determines which button (by index starting from 0) is',\n 'considered active.'\n ].join(' ')\n },\n\n showactive: {\n valType: 'boolean',\n dflt: true,\n description: 'Highlights active dropdown item or active button if true.'\n },\n\n buttons: buttonsAttrs,\n\n x: {\n valType: 'number',\n min: -2,\n max: 3,\n dflt: -0.05,\n description: 'Sets the x position (in normalized coordinates) of the update menu.'\n },\n xanchor: {\n valType: 'enumerated',\n values: ['auto', 'left', 'center', 'right'],\n dflt: 'right',\n description: [\n 'Sets the update menu\\'s horizontal position anchor.',\n 'This anchor binds the `x` position to the *left*, *center*',\n 'or *right* of the range selector.'\n ].join(' ')\n },\n y: {\n valType: 'number',\n min: -2,\n max: 3,\n dflt: 1,\n description: 'Sets the y position (in normalized coordinates) of the update menu.'\n },\n yanchor: {\n valType: 'enumerated',\n values: ['auto', 'top', 'middle', 'bottom'],\n dflt: 'top',\n description: [\n 'Sets the update menu\\'s vertical position anchor',\n 'This anchor binds the `y` position to the *top*, *middle*',\n 'or *bottom* of the range selector.'\n ].join(' ')\n },\n\n pad: extendFlat(padAttrs({editType: 'arraydraw'}), {\n description: 'Sets the padding around the buttons or dropdown menu.'\n }),\n\n font: fontAttrs({\n description: 'Sets the font of the update menu button text.'\n }),\n\n bgcolor: {\n valType: 'color',\n description: 'Sets the background color of the update menu buttons.'\n },\n bordercolor: {\n valType: 'color',\n dflt: colorAttrs.borderLine,\n description: 'Sets the color of the border enclosing the update menu.'\n },\n borderwidth: {\n valType: 'number',\n min: 0,\n dflt: 1,\n editType: 'arraydraw',\n description: 'Sets the width (in px) of the border enclosing the update menu.'\n }\n}), 'arraydraw', 'from-root');\n","'use strict';\n\n\nmodule.exports = {\n\n // layout attribute name\n name: 'updatemenus',\n\n // class names\n containerClassName: 'updatemenu-container',\n headerGroupClassName: 'updatemenu-header-group',\n headerClassName: 'updatemenu-header',\n headerArrowClassName: 'updatemenu-header-arrow',\n dropdownButtonGroupClassName: 'updatemenu-dropdown-button-group',\n dropdownButtonClassName: 'updatemenu-dropdown-button',\n buttonClassName: 'updatemenu-button',\n itemRectClassName: 'updatemenu-item-rect',\n itemTextClassName: 'updatemenu-item-text',\n\n // DOM attribute name in button group keeping track\n // of active update menu\n menuIndexAttrName: 'updatemenu-active-index',\n\n // id root pass to Plots.autoMargin\n autoMarginIdRoot: 'updatemenu-',\n\n // options when 'active: -1'\n blankHeaderOpts: { label: ' ' },\n\n // min item width / height\n minWidth: 30,\n minHeight: 30,\n\n // padding around item text\n textPadX: 24,\n arrowPadX: 16,\n\n // item rect radii\n rx: 2,\n ry: 2,\n\n // item text x offset off left edge\n textOffsetX: 12,\n\n // item text y offset (w.r.t. middle)\n textOffsetY: 3,\n\n // arrow offset off right edge\n arrowOffsetX: 4,\n\n // gap between header and buttons\n gapButtonHeader: 5,\n\n // gap between between buttons\n gapButton: 2,\n\n // color given to active buttons\n activeColor: '#F4FAFF',\n\n // color given to hovered buttons\n hoverColor: '#F4FAFF',\n\n // symbol for menu open arrow\n arrowSymbol: {\n left: '◄',\n right: '►',\n up: '▲',\n down: '▼'\n }\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar handleArrayContainerDefaults = require('../../plots/array_container_defaults');\n\nvar attributes = require('./attributes');\nvar constants = require('./constants');\n\nvar name = constants.name;\nvar buttonAttrs = attributes.buttons;\n\n\nmodule.exports = function updateMenusDefaults(layoutIn, layoutOut) {\n var opts = {\n name: name,\n handleItemDefaults: menuDefaults\n };\n\n handleArrayContainerDefaults(layoutIn, layoutOut, opts);\n};\n\nfunction menuDefaults(menuIn, menuOut, layoutOut) {\n function coerce(attr, dflt) {\n return Lib.coerce(menuIn, menuOut, attributes, attr, dflt);\n }\n\n var buttons = handleArrayContainerDefaults(menuIn, menuOut, {\n name: 'buttons',\n handleItemDefaults: buttonDefaults\n });\n\n var visible = coerce('visible', buttons.length > 0);\n if(!visible) return;\n\n coerce('active');\n coerce('direction');\n coerce('type');\n coerce('showactive');\n\n coerce('x');\n coerce('y');\n Lib.noneOrAll(menuIn, menuOut, ['x', 'y']);\n\n coerce('xanchor');\n coerce('yanchor');\n\n coerce('pad.t');\n coerce('pad.r');\n coerce('pad.b');\n coerce('pad.l');\n\n Lib.coerceFont(coerce, 'font', layoutOut.font);\n\n coerce('bgcolor', layoutOut.paper_bgcolor);\n coerce('bordercolor');\n coerce('borderwidth');\n}\n\nfunction buttonDefaults(buttonIn, buttonOut) {\n function coerce(attr, dflt) {\n return Lib.coerce(buttonIn, buttonOut, buttonAttrs, attr, dflt);\n }\n\n var visible = coerce('visible',\n (buttonIn.method === 'skip' || Array.isArray(buttonIn.args)));\n if(visible) {\n coerce('method');\n coerce('args');\n coerce('args2');\n coerce('label');\n coerce('execute');\n }\n}\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nvar Plots = require('../../plots/plots');\nvar Color = require('../color');\nvar Drawing = require('../drawing');\nvar Lib = require('../../lib');\nvar svgTextUtils = require('../../lib/svg_text_utils');\nvar arrayEditor = require('../../plot_api/plot_template').arrayEditor;\n\nvar LINE_SPACING = require('../../constants/alignment').LINE_SPACING;\n\nvar constants = require('./constants');\nvar ScrollBox = require('./scrollbox');\n\nmodule.exports = function draw(gd) {\n var fullLayout = gd._fullLayout;\n var menuData = Lib.filterVisible(fullLayout[constants.name]);\n\n /* Update menu data is bound to the header-group.\n * The items in the header group are always present.\n *\n * Upon clicking on a header its corresponding button\n * data is bound to the button-group.\n *\n * We draw all headers in one group before all buttons\n * so that the buttons *always* appear above the headers.\n *\n * Note that only one set of buttons are visible at once.\n *\n * \n *\n * \n * \n * \n * \n * \n * \n * ...\n *\n * \n * \n * \n * ...\n */\n\n function clearAutoMargin(menuOpts) {\n Plots.autoMargin(gd, autoMarginId(menuOpts));\n }\n\n // draw update menu container\n var menus = fullLayout._menulayer\n .selectAll('g.' + constants.containerClassName)\n .data(menuData.length > 0 ? [0] : []);\n\n menus.enter().append('g')\n .classed(constants.containerClassName, true)\n .style('cursor', 'pointer');\n\n menus.exit().each(function() {\n // Most components don't need to explicitly remove autoMargin, because\n // marginPushers does this - but updatemenu updates don't go through\n // a full replot so we need to explicitly remove it.\n // This is for removing *all* updatemenus, removing individuals is\n // handled below, in headerGroups.exit\n d3.select(this).selectAll('g.' + constants.headerGroupClassName)\n .each(clearAutoMargin);\n }).remove();\n\n // return early if no update menus are visible\n if(menuData.length === 0) return;\n\n // join header group\n var headerGroups = menus.selectAll('g.' + constants.headerGroupClassName)\n .data(menuData, keyFunction);\n\n headerGroups.enter().append('g')\n .classed(constants.headerGroupClassName, true);\n\n // draw dropdown button container\n var gButton = Lib.ensureSingle(menus, 'g', constants.dropdownButtonGroupClassName, function(s) {\n s.style('pointer-events', 'all');\n });\n\n // find dimensions before plotting anything (this mutates menuOpts)\n for(var i = 0; i < menuData.length; i++) {\n var menuOpts = menuData[i];\n findDimensions(gd, menuOpts);\n }\n\n // setup scrollbox\n var scrollBoxId = 'updatemenus' + fullLayout._uid;\n var scrollBox = new ScrollBox(gd, gButton, scrollBoxId);\n\n // remove exiting header, remove dropped buttons and reset margins\n if(headerGroups.enter().size()) {\n // make sure gButton is on top of all headers\n gButton.node().parentNode.appendChild(gButton.node());\n gButton.call(removeAllButtons);\n }\n\n headerGroups.exit().each(function(menuOpts) {\n gButton.call(removeAllButtons);\n clearAutoMargin(menuOpts);\n }).remove();\n\n // draw headers!\n headerGroups.each(function(menuOpts) {\n var gHeader = d3.select(this);\n\n var _gButton = menuOpts.type === 'dropdown' ? gButton : null;\n\n Plots.manageCommandObserver(gd, menuOpts, menuOpts.buttons, function(data) {\n setActive(gd, menuOpts, menuOpts.buttons[data.index], gHeader, _gButton, scrollBox, data.index, true);\n });\n\n if(menuOpts.type === 'dropdown') {\n drawHeader(gd, gHeader, gButton, scrollBox, menuOpts);\n\n // if this menu is active, update the dropdown container\n if(isActive(gButton, menuOpts)) {\n drawButtons(gd, gHeader, gButton, scrollBox, menuOpts);\n }\n } else {\n drawButtons(gd, gHeader, null, null, menuOpts);\n }\n });\n};\n\n// Note that '_index' is set at the default step,\n// it corresponds to the menu index in the user layout update menu container.\n// Because a menu can be set invisible,\n// this is a more 'consistent' field than the index in the menuData.\nfunction keyFunction(menuOpts) {\n return menuOpts._index;\n}\n\nfunction isFolded(gButton) {\n return +gButton.attr(constants.menuIndexAttrName) === -1;\n}\n\nfunction isActive(gButton, menuOpts) {\n return +gButton.attr(constants.menuIndexAttrName) === menuOpts._index;\n}\n\nfunction setActive(gd, menuOpts, buttonOpts, gHeader, gButton, scrollBox, buttonIndex, isSilentUpdate) {\n // update 'active' attribute in menuOpts\n menuOpts.active = buttonIndex;\n\n // due to templating, it's possible this slider doesn't even exist yet\n arrayEditor(gd.layout, constants.name, menuOpts)\n .applyUpdate('active', buttonIndex);\n\n if(menuOpts.type === 'buttons') {\n drawButtons(gd, gHeader, null, null, menuOpts);\n } else if(menuOpts.type === 'dropdown') {\n // fold up buttons and redraw header\n gButton.attr(constants.menuIndexAttrName, '-1');\n\n drawHeader(gd, gHeader, gButton, scrollBox, menuOpts);\n\n if(!isSilentUpdate) {\n drawButtons(gd, gHeader, gButton, scrollBox, menuOpts);\n }\n }\n}\n\nfunction drawHeader(gd, gHeader, gButton, scrollBox, menuOpts) {\n var header = Lib.ensureSingle(gHeader, 'g', constants.headerClassName, function(s) {\n s.style('pointer-events', 'all');\n });\n\n var dims = menuOpts._dims;\n var active = menuOpts.active;\n var headerOpts = menuOpts.buttons[active] || constants.blankHeaderOpts;\n var posOpts = { y: menuOpts.pad.t, yPad: 0, x: menuOpts.pad.l, xPad: 0, index: 0 };\n var positionOverrides = {\n width: dims.headerWidth,\n height: dims.headerHeight\n };\n\n header\n .call(drawItem, menuOpts, headerOpts, gd)\n .call(setItemPosition, menuOpts, posOpts, positionOverrides);\n\n // draw drop arrow at the right edge\n var arrow = Lib.ensureSingle(gHeader, 'text', constants.headerArrowClassName, function(s) {\n s.attr('text-anchor', 'end')\n .call(Drawing.font, menuOpts.font)\n .text(constants.arrowSymbol[menuOpts.direction]);\n });\n\n arrow.attr({\n x: dims.headerWidth - constants.arrowOffsetX + menuOpts.pad.l,\n y: dims.headerHeight / 2 + constants.textOffsetY + menuOpts.pad.t\n });\n\n header.on('click', function() {\n gButton.call(removeAllButtons,\n String(isActive(gButton, menuOpts) ? -1 : menuOpts._index)\n );\n\n drawButtons(gd, gHeader, gButton, scrollBox, menuOpts);\n });\n\n header.on('mouseover', function() {\n header.call(styleOnMouseOver);\n });\n\n header.on('mouseout', function() {\n header.call(styleOnMouseOut, menuOpts);\n });\n\n // translate header group\n Drawing.setTranslate(gHeader, dims.lx, dims.ly);\n}\n\nfunction drawButtons(gd, gHeader, gButton, scrollBox, menuOpts) {\n // If this is a set of buttons, set pointer events = all since we play\n // some minor games with which container is which in order to simplify\n // the drawing of *either* buttons or menus\n if(!gButton) {\n gButton = gHeader;\n gButton.attr('pointer-events', 'all');\n }\n\n var buttonData = (!isFolded(gButton) || menuOpts.type === 'buttons') ?\n menuOpts.buttons :\n [];\n\n var klass = menuOpts.type === 'dropdown' ? constants.dropdownButtonClassName : constants.buttonClassName;\n\n var buttons = gButton.selectAll('g.' + klass)\n .data(Lib.filterVisible(buttonData));\n\n var enter = buttons.enter().append('g')\n .classed(klass, true);\n\n var exit = buttons.exit();\n\n if(menuOpts.type === 'dropdown') {\n enter.attr('opacity', '0')\n .transition()\n .attr('opacity', '1');\n\n exit.transition()\n .attr('opacity', '0')\n .remove();\n } else {\n exit.remove();\n }\n\n var x0 = 0;\n var y0 = 0;\n var dims = menuOpts._dims;\n\n var isVertical = ['up', 'down'].indexOf(menuOpts.direction) !== -1;\n\n if(menuOpts.type === 'dropdown') {\n if(isVertical) {\n y0 = dims.headerHeight + constants.gapButtonHeader;\n } else {\n x0 = dims.headerWidth + constants.gapButtonHeader;\n }\n }\n\n if(menuOpts.type === 'dropdown' && menuOpts.direction === 'up') {\n y0 = -constants.gapButtonHeader + constants.gapButton - dims.openHeight;\n }\n\n if(menuOpts.type === 'dropdown' && menuOpts.direction === 'left') {\n x0 = -constants.gapButtonHeader + constants.gapButton - dims.openWidth;\n }\n\n var posOpts = {\n x: dims.lx + x0 + menuOpts.pad.l,\n y: dims.ly + y0 + menuOpts.pad.t,\n yPad: constants.gapButton,\n xPad: constants.gapButton,\n index: 0,\n };\n\n var scrollBoxPosition = {\n l: posOpts.x + menuOpts.borderwidth,\n t: posOpts.y + menuOpts.borderwidth\n };\n\n buttons.each(function(buttonOpts, buttonIndex) {\n var button = d3.select(this);\n\n button\n .call(drawItem, menuOpts, buttonOpts, gd)\n .call(setItemPosition, menuOpts, posOpts);\n\n button.on('click', function() {\n // skip `dragend` events\n if(d3.event.defaultPrevented) return;\n\n if(buttonOpts.execute) {\n if(buttonOpts.args2 && menuOpts.active === buttonIndex) {\n setActive(gd, menuOpts, buttonOpts, gHeader, gButton, scrollBox, -1);\n Plots.executeAPICommand(gd, buttonOpts.method, buttonOpts.args2);\n } else {\n setActive(gd, menuOpts, buttonOpts, gHeader, gButton, scrollBox, buttonIndex);\n Plots.executeAPICommand(gd, buttonOpts.method, buttonOpts.args);\n }\n }\n\n gd.emit('plotly_buttonclicked', {menu: menuOpts, button: buttonOpts, active: menuOpts.active});\n });\n\n button.on('mouseover', function() {\n button.call(styleOnMouseOver);\n });\n\n button.on('mouseout', function() {\n button.call(styleOnMouseOut, menuOpts);\n buttons.call(styleButtons, menuOpts);\n });\n });\n\n buttons.call(styleButtons, menuOpts);\n\n if(isVertical) {\n scrollBoxPosition.w = Math.max(dims.openWidth, dims.headerWidth);\n scrollBoxPosition.h = posOpts.y - scrollBoxPosition.t;\n } else {\n scrollBoxPosition.w = posOpts.x - scrollBoxPosition.l;\n scrollBoxPosition.h = Math.max(dims.openHeight, dims.headerHeight);\n }\n\n scrollBoxPosition.direction = menuOpts.direction;\n\n if(scrollBox) {\n if(buttons.size()) {\n drawScrollBox(gd, gHeader, gButton, scrollBox, menuOpts, scrollBoxPosition);\n } else {\n hideScrollBox(scrollBox);\n }\n }\n}\n\nfunction drawScrollBox(gd, gHeader, gButton, scrollBox, menuOpts, position) {\n // enable the scrollbox\n var direction = menuOpts.direction;\n var isVertical = (direction === 'up' || direction === 'down');\n var dims = menuOpts._dims;\n\n var active = menuOpts.active;\n var translateX, translateY;\n var i;\n if(isVertical) {\n translateY = 0;\n for(i = 0; i < active; i++) {\n translateY += dims.heights[i] + constants.gapButton;\n }\n } else {\n translateX = 0;\n for(i = 0; i < active; i++) {\n translateX += dims.widths[i] + constants.gapButton;\n }\n }\n\n scrollBox.enable(position, translateX, translateY);\n\n if(scrollBox.hbar) {\n scrollBox.hbar\n .attr('opacity', '0')\n .transition()\n .attr('opacity', '1');\n }\n\n if(scrollBox.vbar) {\n scrollBox.vbar\n .attr('opacity', '0')\n .transition()\n .attr('opacity', '1');\n }\n}\n\nfunction hideScrollBox(scrollBox) {\n var hasHBar = !!scrollBox.hbar;\n var hasVBar = !!scrollBox.vbar;\n\n if(hasHBar) {\n scrollBox.hbar\n .transition()\n .attr('opacity', '0')\n .each('end', function() {\n hasHBar = false;\n if(!hasVBar) scrollBox.disable();\n });\n }\n\n if(hasVBar) {\n scrollBox.vbar\n .transition()\n .attr('opacity', '0')\n .each('end', function() {\n hasVBar = false;\n if(!hasHBar) scrollBox.disable();\n });\n }\n}\n\nfunction drawItem(item, menuOpts, itemOpts, gd) {\n item.call(drawItemRect, menuOpts)\n .call(drawItemText, menuOpts, itemOpts, gd);\n}\n\nfunction drawItemRect(item, menuOpts) {\n var rect = Lib.ensureSingle(item, 'rect', constants.itemRectClassName, function(s) {\n s.attr({\n rx: constants.rx,\n ry: constants.ry,\n 'shape-rendering': 'crispEdges'\n });\n });\n\n rect.call(Color.stroke, menuOpts.bordercolor)\n .call(Color.fill, menuOpts.bgcolor)\n .style('stroke-width', menuOpts.borderwidth + 'px');\n}\n\nfunction drawItemText(item, menuOpts, itemOpts, gd) {\n var text = Lib.ensureSingle(item, 'text', constants.itemTextClassName, function(s) {\n s.attr({\n 'text-anchor': 'start',\n 'data-notex': 1\n });\n });\n\n var tx = itemOpts.label;\n var _meta = gd._fullLayout._meta;\n if(_meta) tx = Lib.templateString(tx, _meta);\n\n text.call(Drawing.font, menuOpts.font)\n .text(tx)\n .call(svgTextUtils.convertToTspans, gd);\n}\n\nfunction styleButtons(buttons, menuOpts) {\n var active = menuOpts.active;\n\n buttons.each(function(buttonOpts, i) {\n var button = d3.select(this);\n\n if(i === active && menuOpts.showactive) {\n button.select('rect.' + constants.itemRectClassName)\n .call(Color.fill, constants.activeColor);\n }\n });\n}\n\nfunction styleOnMouseOver(item) {\n item.select('rect.' + constants.itemRectClassName)\n .call(Color.fill, constants.hoverColor);\n}\n\nfunction styleOnMouseOut(item, menuOpts) {\n item.select('rect.' + constants.itemRectClassName)\n .call(Color.fill, menuOpts.bgcolor);\n}\n\n// find item dimensions (this mutates menuOpts)\nfunction findDimensions(gd, menuOpts) {\n var dims = menuOpts._dims = {\n width1: 0,\n height1: 0,\n heights: [],\n widths: [],\n totalWidth: 0,\n totalHeight: 0,\n openWidth: 0,\n openHeight: 0,\n lx: 0,\n ly: 0\n };\n\n var fakeButtons = Drawing.tester.selectAll('g.' + constants.dropdownButtonClassName)\n .data(Lib.filterVisible(menuOpts.buttons));\n\n fakeButtons.enter().append('g')\n .classed(constants.dropdownButtonClassName, true);\n\n var isVertical = ['up', 'down'].indexOf(menuOpts.direction) !== -1;\n\n // loop over fake buttons to find width / height\n fakeButtons.each(function(buttonOpts, i) {\n var button = d3.select(this);\n\n button.call(drawItem, menuOpts, buttonOpts, gd);\n\n var text = button.select('.' + constants.itemTextClassName);\n\n // width is given by max width of all buttons\n var tWidth = text.node() && Drawing.bBox(text.node()).width;\n var wEff = Math.max(tWidth + constants.textPadX, constants.minWidth);\n\n // height is determined by item text\n var tHeight = menuOpts.font.size * LINE_SPACING;\n var tLines = svgTextUtils.lineCount(text);\n var hEff = Math.max(tHeight * tLines, constants.minHeight) + constants.textOffsetY;\n\n hEff = Math.ceil(hEff);\n wEff = Math.ceil(wEff);\n\n // Store per-item sizes since a row of horizontal buttons, for example,\n // don't all need to be the same width:\n dims.widths[i] = wEff;\n dims.heights[i] = hEff;\n\n // Height and width of individual element:\n dims.height1 = Math.max(dims.height1, hEff);\n dims.width1 = Math.max(dims.width1, wEff);\n\n if(isVertical) {\n dims.totalWidth = Math.max(dims.totalWidth, wEff);\n dims.openWidth = dims.totalWidth;\n dims.totalHeight += hEff + constants.gapButton;\n dims.openHeight += hEff + constants.gapButton;\n } else {\n dims.totalWidth += wEff + constants.gapButton;\n dims.openWidth += wEff + constants.gapButton;\n dims.totalHeight = Math.max(dims.totalHeight, hEff);\n dims.openHeight = dims.totalHeight;\n }\n });\n\n if(isVertical) {\n dims.totalHeight -= constants.gapButton;\n } else {\n dims.totalWidth -= constants.gapButton;\n }\n\n\n dims.headerWidth = dims.width1 + constants.arrowPadX;\n dims.headerHeight = dims.height1;\n\n if(menuOpts.type === 'dropdown') {\n if(isVertical) {\n dims.width1 += constants.arrowPadX;\n dims.totalHeight = dims.height1;\n } else {\n dims.totalWidth = dims.width1;\n }\n dims.totalWidth += constants.arrowPadX;\n }\n\n fakeButtons.remove();\n\n var paddedWidth = dims.totalWidth + menuOpts.pad.l + menuOpts.pad.r;\n var paddedHeight = dims.totalHeight + menuOpts.pad.t + menuOpts.pad.b;\n\n var graphSize = gd._fullLayout._size;\n dims.lx = graphSize.l + graphSize.w * menuOpts.x;\n dims.ly = graphSize.t + graphSize.h * (1 - menuOpts.y);\n\n var xanchor = 'left';\n if(Lib.isRightAnchor(menuOpts)) {\n dims.lx -= paddedWidth;\n xanchor = 'right';\n }\n if(Lib.isCenterAnchor(menuOpts)) {\n dims.lx -= paddedWidth / 2;\n xanchor = 'center';\n }\n\n var yanchor = 'top';\n if(Lib.isBottomAnchor(menuOpts)) {\n dims.ly -= paddedHeight;\n yanchor = 'bottom';\n }\n if(Lib.isMiddleAnchor(menuOpts)) {\n dims.ly -= paddedHeight / 2;\n yanchor = 'middle';\n }\n\n dims.totalWidth = Math.ceil(dims.totalWidth);\n dims.totalHeight = Math.ceil(dims.totalHeight);\n dims.lx = Math.round(dims.lx);\n dims.ly = Math.round(dims.ly);\n\n Plots.autoMargin(gd, autoMarginId(menuOpts), {\n x: menuOpts.x,\n y: menuOpts.y,\n l: paddedWidth * ({right: 1, center: 0.5}[xanchor] || 0),\n r: paddedWidth * ({left: 1, center: 0.5}[xanchor] || 0),\n b: paddedHeight * ({top: 1, middle: 0.5}[yanchor] || 0),\n t: paddedHeight * ({bottom: 1, middle: 0.5}[yanchor] || 0)\n });\n}\n\nfunction autoMarginId(menuOpts) {\n return constants.autoMarginIdRoot + menuOpts._index;\n}\n\n// set item positions (mutates posOpts)\nfunction setItemPosition(item, menuOpts, posOpts, overrideOpts) {\n overrideOpts = overrideOpts || {};\n var rect = item.select('.' + constants.itemRectClassName);\n var text = item.select('.' + constants.itemTextClassName);\n var borderWidth = menuOpts.borderwidth;\n var index = posOpts.index;\n var dims = menuOpts._dims;\n\n Drawing.setTranslate(item, borderWidth + posOpts.x, borderWidth + posOpts.y);\n\n var isVertical = ['up', 'down'].indexOf(menuOpts.direction) !== -1;\n var finalHeight = overrideOpts.height || (isVertical ? dims.heights[index] : dims.height1);\n\n rect.attr({\n x: 0,\n y: 0,\n width: overrideOpts.width || (isVertical ? dims.width1 : dims.widths[index]),\n height: finalHeight\n });\n\n var tHeight = menuOpts.font.size * LINE_SPACING;\n var tLines = svgTextUtils.lineCount(text);\n var spanOffset = ((tLines - 1) * tHeight / 2);\n\n svgTextUtils.positionText(text, constants.textOffsetX,\n finalHeight / 2 - spanOffset + constants.textOffsetY);\n\n if(isVertical) {\n posOpts.y += dims.heights[index] + posOpts.yPad;\n } else {\n posOpts.x += dims.widths[index] + posOpts.xPad;\n }\n\n posOpts.index++;\n}\n\nfunction removeAllButtons(gButton, newMenuIndexAttr) {\n gButton\n .attr(constants.menuIndexAttrName, newMenuIndexAttr || '-1')\n .selectAll('g.' + constants.dropdownButtonClassName).remove();\n}\n","'use strict';\n\nvar constants = require('./constants');\n\nmodule.exports = {\n moduleType: 'component',\n name: constants.name,\n\n layoutAttributes: require('./attributes'),\n supplyLayoutDefaults: require('./defaults'),\n\n draw: require('./draw')\n};\n","'use strict';\n\nmodule.exports = ScrollBox;\n\nvar d3 = require('@plotly/d3');\n\nvar Color = require('../color');\nvar Drawing = require('../drawing');\n\nvar Lib = require('../../lib');\n\n/**\n * Helper class to setup a scroll box\n *\n * @class\n * @param gd Plotly's graph div\n * @param container Container to be scroll-boxed (as a D3 selection)\n * @param {string} id Id for the clip path to implement the scroll box\n */\nfunction ScrollBox(gd, container, id) {\n this.gd = gd;\n this.container = container;\n this.id = id;\n\n // See ScrollBox.prototype.enable for further definition\n this.position = null; // scrollbox position\n this.translateX = null; // scrollbox horizontal translation\n this.translateY = null; // scrollbox vertical translation\n this.hbar = null; // horizontal scrollbar D3 selection\n this.vbar = null; // vertical scrollbar D3 selection\n\n // element to capture pointer events\n this.bg = this.container.selectAll('rect.scrollbox-bg').data([0]);\n\n this.bg.exit()\n .on('.drag', null)\n .on('wheel', null)\n .remove();\n\n this.bg.enter().append('rect')\n .classed('scrollbox-bg', true)\n .style('pointer-events', 'all')\n .attr({\n opacity: 0,\n x: 0,\n y: 0,\n width: 0,\n height: 0\n });\n}\n\n// scroll bar dimensions\nScrollBox.barWidth = 2;\nScrollBox.barLength = 20;\nScrollBox.barRadius = 2;\nScrollBox.barPad = 1;\nScrollBox.barColor = '#808BA4';\n\n/**\n * If needed, setup a clip path and scrollbars\n *\n * @method\n * @param {Object} position\n * @param {number} position.l Left side position (in pixels)\n * @param {number} position.t Top side (in pixels)\n * @param {number} position.w Width (in pixels)\n * @param {number} position.h Height (in pixels)\n * @param {string} [position.direction='down']\n * Either 'down', 'left', 'right' or 'up'\n * @param {number} [translateX=0] Horizontal offset (in pixels)\n * @param {number} [translateY=0] Vertical offset (in pixels)\n */\nScrollBox.prototype.enable = function enable(position, translateX, translateY) {\n var fullLayout = this.gd._fullLayout;\n var fullWidth = fullLayout.width;\n var fullHeight = fullLayout.height;\n\n // compute position of scrollbox\n this.position = position;\n\n var l = this.position.l;\n var w = this.position.w;\n var t = this.position.t;\n var h = this.position.h;\n var direction = this.position.direction;\n var isDown = (direction === 'down');\n var isLeft = (direction === 'left');\n var isRight = (direction === 'right');\n var isUp = (direction === 'up');\n var boxW = w;\n var boxH = h;\n var boxL, boxR;\n var boxT, boxB;\n\n if(!isDown && !isLeft && !isRight && !isUp) {\n this.position.direction = 'down';\n isDown = true;\n }\n\n var isVertical = isDown || isUp;\n if(isVertical) {\n boxL = l;\n boxR = boxL + boxW;\n\n if(isDown) {\n // anchor to top side\n boxT = t;\n boxB = Math.min(boxT + boxH, fullHeight);\n boxH = boxB - boxT;\n } else {\n // anchor to bottom side\n boxB = t + boxH;\n boxT = Math.max(boxB - boxH, 0);\n boxH = boxB - boxT;\n }\n } else {\n boxT = t;\n boxB = boxT + boxH;\n\n if(isLeft) {\n // anchor to right side\n boxR = l + boxW;\n boxL = Math.max(boxR - boxW, 0);\n boxW = boxR - boxL;\n } else {\n // anchor to left side\n boxL = l;\n boxR = Math.min(boxL + boxW, fullWidth);\n boxW = boxR - boxL;\n }\n }\n\n this._box = {\n l: boxL,\n t: boxT,\n w: boxW,\n h: boxH\n };\n\n // compute position of horizontal scroll bar\n var needsHorizontalScrollBar = (w > boxW);\n var hbarW = ScrollBox.barLength + 2 * ScrollBox.barPad;\n var hbarH = ScrollBox.barWidth + 2 * ScrollBox.barPad;\n // draw horizontal scrollbar on the bottom side\n var hbarL = l;\n var hbarT = t + h;\n\n if(hbarT + hbarH > fullHeight) hbarT = fullHeight - hbarH;\n\n var hbar = this.container.selectAll('rect.scrollbar-horizontal').data(\n (needsHorizontalScrollBar) ? [0] : []);\n\n hbar.exit()\n .on('.drag', null)\n .remove();\n\n hbar.enter().append('rect')\n .classed('scrollbar-horizontal', true)\n .call(Color.fill, ScrollBox.barColor);\n\n if(needsHorizontalScrollBar) {\n this.hbar = hbar.attr({\n rx: ScrollBox.barRadius,\n ry: ScrollBox.barRadius,\n x: hbarL,\n y: hbarT,\n width: hbarW,\n height: hbarH\n });\n\n // hbar center moves between hbarXMin and hbarXMin + hbarTranslateMax\n this._hbarXMin = hbarL + hbarW / 2;\n this._hbarTranslateMax = boxW - hbarW;\n } else {\n delete this.hbar;\n delete this._hbarXMin;\n delete this._hbarTranslateMax;\n }\n\n // compute position of vertical scroll bar\n var needsVerticalScrollBar = (h > boxH);\n var vbarW = ScrollBox.barWidth + 2 * ScrollBox.barPad;\n var vbarH = ScrollBox.barLength + 2 * ScrollBox.barPad;\n // draw vertical scrollbar on the right side\n var vbarL = l + w;\n var vbarT = t;\n\n if(vbarL + vbarW > fullWidth) vbarL = fullWidth - vbarW;\n\n var vbar = this.container.selectAll('rect.scrollbar-vertical').data(\n (needsVerticalScrollBar) ? [0] : []);\n\n vbar.exit()\n .on('.drag', null)\n .remove();\n\n vbar.enter().append('rect')\n .classed('scrollbar-vertical', true)\n .call(Color.fill, ScrollBox.barColor);\n\n if(needsVerticalScrollBar) {\n this.vbar = vbar.attr({\n rx: ScrollBox.barRadius,\n ry: ScrollBox.barRadius,\n x: vbarL,\n y: vbarT,\n width: vbarW,\n height: vbarH\n });\n\n // vbar center moves between vbarYMin and vbarYMin + vbarTranslateMax\n this._vbarYMin = vbarT + vbarH / 2;\n this._vbarTranslateMax = boxH - vbarH;\n } else {\n delete this.vbar;\n delete this._vbarYMin;\n delete this._vbarTranslateMax;\n }\n\n // setup a clip path (if scroll bars are needed)\n var clipId = this.id;\n var clipL = boxL - 0.5;\n var clipR = (needsVerticalScrollBar) ? boxR + vbarW + 0.5 : boxR + 0.5;\n var clipT = boxT - 0.5;\n var clipB = (needsHorizontalScrollBar) ? boxB + hbarH + 0.5 : boxB + 0.5;\n\n var clipPath = fullLayout._topdefs.selectAll('#' + clipId)\n .data((needsHorizontalScrollBar || needsVerticalScrollBar) ? [0] : []);\n\n clipPath.exit().remove();\n\n clipPath.enter()\n .append('clipPath').attr('id', clipId)\n .append('rect');\n\n if(needsHorizontalScrollBar || needsVerticalScrollBar) {\n this._clipRect = clipPath.select('rect').attr({\n x: Math.floor(clipL),\n y: Math.floor(clipT),\n width: Math.ceil(clipR) - Math.floor(clipL),\n height: Math.ceil(clipB) - Math.floor(clipT)\n });\n\n this.container.call(Drawing.setClipUrl, clipId, this.gd);\n\n this.bg.attr({\n x: l,\n y: t,\n width: w,\n height: h\n });\n } else {\n this.bg.attr({\n width: 0,\n height: 0\n });\n this.container\n .on('wheel', null)\n .on('.drag', null)\n .call(Drawing.setClipUrl, null);\n delete this._clipRect;\n }\n\n // set up drag listeners (if scroll bars are needed)\n if(needsHorizontalScrollBar || needsVerticalScrollBar) {\n var onBoxDrag = d3.behavior.drag()\n .on('dragstart', function() {\n d3.event.sourceEvent.preventDefault();\n })\n .on('drag', this._onBoxDrag.bind(this));\n\n this.container\n .on('wheel', null)\n .on('wheel', this._onBoxWheel.bind(this))\n .on('.drag', null)\n .call(onBoxDrag);\n\n var onBarDrag = d3.behavior.drag()\n .on('dragstart', function() {\n d3.event.sourceEvent.preventDefault();\n d3.event.sourceEvent.stopPropagation();\n })\n .on('drag', this._onBarDrag.bind(this));\n\n if(needsHorizontalScrollBar) {\n this.hbar\n .on('.drag', null)\n .call(onBarDrag);\n }\n\n if(needsVerticalScrollBar) {\n this.vbar\n .on('.drag', null)\n .call(onBarDrag);\n }\n }\n\n // set scrollbox translation\n this.setTranslate(translateX, translateY);\n};\n\n/**\n * If present, remove clip-path and scrollbars\n *\n * @method\n */\nScrollBox.prototype.disable = function disable() {\n if(this.hbar || this.vbar) {\n this.bg.attr({\n width: 0,\n height: 0\n });\n this.container\n .on('wheel', null)\n .on('.drag', null)\n .call(Drawing.setClipUrl, null);\n delete this._clipRect;\n }\n\n if(this.hbar) {\n this.hbar.on('.drag', null);\n this.hbar.remove();\n delete this.hbar;\n delete this._hbarXMin;\n delete this._hbarTranslateMax;\n }\n\n if(this.vbar) {\n this.vbar.on('.drag', null);\n this.vbar.remove();\n delete this.vbar;\n delete this._vbarYMin;\n delete this._vbarTranslateMax;\n }\n};\n\n/**\n * Handles scroll box drag events\n *\n * @method\n */\nScrollBox.prototype._onBoxDrag = function _onBoxDrag() {\n var translateX = this.translateX;\n var translateY = this.translateY;\n\n if(this.hbar) {\n translateX -= d3.event.dx;\n }\n\n if(this.vbar) {\n translateY -= d3.event.dy;\n }\n\n this.setTranslate(translateX, translateY);\n};\n\n/**\n * Handles scroll box wheel events\n *\n * @method\n */\nScrollBox.prototype._onBoxWheel = function _onBoxWheel() {\n var translateX = this.translateX;\n var translateY = this.translateY;\n\n if(this.hbar) {\n translateX += d3.event.deltaY;\n }\n\n if(this.vbar) {\n translateY += d3.event.deltaY;\n }\n\n this.setTranslate(translateX, translateY);\n};\n\n/**\n * Handles scroll bar drag events\n *\n * @method\n */\nScrollBox.prototype._onBarDrag = function _onBarDrag() {\n var translateX = this.translateX;\n var translateY = this.translateY;\n\n if(this.hbar) {\n var xMin = translateX + this._hbarXMin;\n var xMax = xMin + this._hbarTranslateMax;\n var x = Lib.constrain(d3.event.x, xMin, xMax);\n var xf = (x - xMin) / (xMax - xMin);\n\n var translateXMax = this.position.w - this._box.w;\n\n translateX = xf * translateXMax;\n }\n\n if(this.vbar) {\n var yMin = translateY + this._vbarYMin;\n var yMax = yMin + this._vbarTranslateMax;\n var y = Lib.constrain(d3.event.y, yMin, yMax);\n var yf = (y - yMin) / (yMax - yMin);\n\n var translateYMax = this.position.h - this._box.h;\n\n translateY = yf * translateYMax;\n }\n\n this.setTranslate(translateX, translateY);\n};\n\n/**\n * Set clip path and scroll bar translate transform\n *\n * @method\n * @param {number} [translateX=0] Horizontal offset (in pixels)\n * @param {number} [translateY=0] Vertical offset (in pixels)\n */\nScrollBox.prototype.setTranslate = function setTranslate(translateX, translateY) {\n // store translateX and translateY (needed by mouse event handlers)\n var translateXMax = this.position.w - this._box.w;\n var translateYMax = this.position.h - this._box.h;\n\n translateX = Lib.constrain(translateX || 0, 0, translateXMax);\n translateY = Lib.constrain(translateY || 0, 0, translateYMax);\n\n this.translateX = translateX;\n this.translateY = translateY;\n\n this.container.call(Drawing.setTranslate,\n this._box.l - this.position.l - translateX,\n this._box.t - this.position.t - translateY);\n\n if(this._clipRect) {\n this._clipRect.attr({\n x: Math.floor(this.position.l + translateX - 0.5),\n y: Math.floor(this.position.t + translateY - 0.5)\n });\n }\n\n if(this.hbar) {\n var xf = translateX / translateXMax;\n\n this.hbar.call(Drawing.setTranslate,\n translateX + xf * this._hbarTranslateMax,\n translateY);\n }\n\n if(this.vbar) {\n var yf = translateY / translateYMax;\n\n this.vbar.call(Drawing.setTranslate,\n translateX,\n translateY + yf * this._vbarTranslateMax);\n }\n};\n","'use strict';\n\n// fraction of some size to get to a named position\nmodule.exports = {\n // from bottom left: this is the origin of our paper-reference\n // positioning system\n FROM_BL: {\n left: 0,\n center: 0.5,\n right: 1,\n bottom: 0,\n middle: 0.5,\n top: 1\n },\n // from top left: this is the screen pixel positioning origin\n FROM_TL: {\n left: 0,\n center: 0.5,\n right: 1,\n bottom: 1,\n middle: 0.5,\n top: 0\n },\n // from bottom right: sometimes you just need the opposite of ^^\n FROM_BR: {\n left: 1,\n center: 0.5,\n right: 0,\n bottom: 0,\n middle: 0.5,\n top: 1\n },\n // multiple of fontSize to get the vertical offset between lines\n LINE_SPACING: 1.3,\n\n // multiple of fontSize to shift from the baseline\n // to the cap (captical letter) line\n // (to use when we don't calculate this shift from Drawing.bBox)\n // This is an approximation since in reality cap height can differ\n // from font to font. However, according to Wikipedia\n // an \"average\" font might have a cap height of 70% of the em\n // https://en.wikipedia.org/wiki/Em_(typography)#History\n CAP_SHIFT: 0.70,\n\n // half the cap height (distance between baseline and cap line)\n // of an \"average\" font (for more info see above).\n MID_SHIFT: 0.35,\n\n OPPOSITE_SIDE: {\n left: 'right',\n right: 'left',\n top: 'bottom',\n bottom: 'top'\n }\n};\n","'use strict';\n\nmodule.exports = {\n axisRefDescription: function(axisname, lower, upper) {\n return [\n 'If set to a', axisname, 'axis id (e.g. *' + axisname + '* or',\n '*' + axisname + '2*), the `' + axisname + '` position refers to a',\n axisname, 'coordinate. If set to *paper*, the `' + axisname + '`',\n 'position refers to the distance from the', lower, 'of the plotting',\n 'area in normalized coordinates where *0* (*1*) corresponds to the',\n lower, '(' + upper + '). If set to a', axisname, 'axis ID followed by',\n '*domain* (separated by a space), the position behaves like for',\n '*paper*, but refers to the distance in fractions of the domain',\n 'length from the', lower, 'of the domain of that axis: e.g.,',\n '*' + axisname + '2 domain* refers to the domain of the second',\n axisname, ' axis and a', axisname, 'position of 0.5 refers to the',\n 'point between the', lower, 'and the', upper, 'of the domain of the',\n 'second', axisname, 'axis.',\n ].join(' ');\n }\n};\n","'use strict';\n\nmodule.exports = {\n FORMAT_LINK: 'https://github.com/d3/d3-format/tree/v1.4.5#d3-format',\n DATE_FORMAT_LINK: 'https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format'\n};\n","'use strict';\n\n\nmodule.exports = {\n /**\n * Timing information for interactive elements\n */\n SHOW_PLACEHOLDER: 100,\n HIDE_PLACEHOLDER: 1000,\n\n // opacity dimming fraction for points that are not in selection\n DESELECTDIM: 0.2\n};\n","'use strict';\n\n\nmodule.exports = {\n /**\n * Standardize all missing data in calcdata to use undefined\n * never null or NaN.\n * That way we can use !==undefined, or !== BADNUM,\n * to test for real data\n */\n BADNUM: undefined,\n\n /*\n * Limit certain operations to well below floating point max value\n * to avoid glitches: Make sure that even when you multiply it by the\n * number of pixels on a giant screen it still works\n */\n FP_SAFE: Number.MAX_VALUE * 1e-4,\n\n /*\n * conversion of date units to milliseconds\n * year and month constants are marked \"AVG\"\n * to remind us that not all years and months\n * have the same length\n */\n ONEMAXYEAR: 31622400000, // 366 * ONEDAY\n ONEAVGYEAR: 31557600000, // 365.25 days\n ONEMINYEAR: 31536000000, // 365 * ONEDAY\n ONEMAXQUARTER: 7948800000, // 92 * ONEDAY\n ONEAVGQUARTER: 7889400000, // 1/4 of ONEAVGYEAR\n ONEMINQUARTER: 7689600000, // 89 * ONEDAY\n ONEMAXMONTH: 2678400000, // 31 * ONEDAY\n ONEAVGMONTH: 2629800000, // 1/12 of ONEAVGYEAR\n ONEMINMONTH: 2419200000, // 28 * ONEDAY\n ONEWEEK: 604800000, // 7 * ONEDAY\n ONEDAY: 86400000, // 24 * ONEHOUR\n ONEHOUR: 3600000,\n ONEMIN: 60000,\n ONESEC: 1000,\n\n /*\n * For fast conversion btwn world calendars and epoch ms, the Julian Day Number\n * of the unix epoch. From calendars.instance().newDate(1970, 1, 1).toJD()\n */\n EPOCHJD: 2440587.5,\n\n /*\n * Are two values nearly equal? Compare to 1PPM\n */\n ALMOST_EQUAL: 1 - 1e-6,\n\n /*\n * If we're asked to clip a non-positive log value, how far off-screen\n * do we put it?\n */\n LOG_CLIP: 10,\n\n /*\n * not a number, but for displaying numbers: the \"minus sign\" symbol is\n * wider than the regular ascii dash \"-\"\n */\n MINUS_SIGN: '\\u2212'\n};\n","'use strict';\n\n// Pixelated image rendering\n// The actual CSS declaration is prepended with fallbacks for older browsers.\n// NB. IE's `-ms-interpolation-mode` works only with not with SVG \n// https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering\n// https://caniuse.com/?search=image-rendering\n// http://phrogz.net/tmp/canvas_image_zoom.html\n\nexports.CSS_DECLARATIONS = [\n ['image-rendering', 'optimizeSpeed'],\n ['image-rendering', '-moz-crisp-edges'],\n ['image-rendering', '-o-crisp-edges'],\n ['image-rendering', '-webkit-optimize-contrast'],\n ['image-rendering', 'optimize-contrast'],\n ['image-rendering', 'crisp-edges'],\n ['image-rendering', 'pixelated']\n];\n\nexports.STYLE = exports.CSS_DECLARATIONS.map(function(d) {\n return d.join(': ') + '; ';\n}).join('');\n","'use strict';\n\n\nexports.xmlns = 'http://www.w3.org/2000/xmlns/';\nexports.svg = 'http://www.w3.org/2000/svg';\nexports.xlink = 'http://www.w3.org/1999/xlink';\n\n// the 'old' d3 quirk got fix in v3.5.7\n// https://github.com/mbostock/d3/commit/a6f66e9dd37f764403fc7c1f26be09ab4af24fed\nexports.svgAttrs = {\n xmlns: exports.svg,\n 'xmlns:xlink': exports.xlink\n};\n"],"names":["fontAttrs","require","colorAttrs","buttonAttrs","templatedArray","visible","valType","dflt","editType","description","step","values","join","stepmode","count","min","label","module","exports","buttons","x","max","xanchor","y","yanchor","font","bgcolor","lightLine","activecolor","bordercolor","defaultLine","borderwidth","yPad","minButtonWidth","rx","ry","lightAmount","darkAmount","Lib","Color","Template","handleArrayContainerDefaults","attributes","constants","buttonDefaults","buttonIn","buttonOut","selectorOut","opts","calendar","coerce","attr","containerIn","containerOut","layout","counterAxes","selectorIn","rangeselector","newContainer","name","handleItemDefaults","length","posDflt","anchoredList","filter","ax","anchor","_id","posY","i","domain","Math","getPosDflt","noneOrAll","coerceFont","bgColor","contrast","d3","Registry","Plots","Drawing","strTranslate","svgTextUtils","axisIds","alignmentConstants","LINE_SPACING","FROM_TL","FROM_BR","getUpdateObject","selectorKeyFunc","d","drawButtonRect","button","selectorLayout","rect","ensureSingle","s","call","stroke","fill","_isActive","_isHovered","getFillColor","style","drawButtonText","gd","text","_meta","templateString","charAt","getLabel","_fullLayout","convertToTspans","selectors","_infolayer","selectAll","data","axes","list","axis","push","makeSelectorData","enter","append","classed","exit","remove","cursor","each","selector","select","this","axisLayout","filterVisible","update","autorange","keys","Object","range","isActive","on","_dragged","axName","width","height","borderWidth","tHeight","size","hEff","lineCount","tWidth","node","bBox","tLines","wEff","positionText","graphSize","_size","lx","l","w","ly","t","h","isRightAnchor","isCenterAnchor","isBottomAnchor","isMiddleAnchor","ceil","round","autoMargin","r","b","reposition","_name","d3Time","titleCase","buttonLayout","xrange","range0","currentRange","base","Date","r2l","utcStep","l2r","offset","base2","range1","getXRange","moduleType","schema","subplots","xaxis","layoutAttributes","handleDefaults","draw","colorAttributes","background","impliedEdits","undefined","items","thickness","listAxes","getAutoRange","_input","containerClassName","bgClassName","rangePlotClassName","maskMinClassName","maskMaxClassName","slideBoxClassName","grabberMinClassName","grabAreaMinClassName","handleMinClassName","grabberMaxClassName","grabAreaMaxClassName","handleMaxClassName","maskMinOppAxisClassName","maskMaxOppAxisClassName","maskColor","maskOppAxisColor","slideBoxFill","slideBoxCursor","grabAreaFill","grabAreaCursor","grabAreaWidth","handleWidth","handleRadius","handleStrokeWidth","extraPad","oppAxisAttrs","layoutIn","layoutOut","axIn","axOut","rangeslider","_requestRangeslider","isPlainObject","rangeContainerIn","rangeContainerOut","plot_bgcolor","isValidRange","_subplots","yIds","cartesian","subplotId","substr","indexOf","name2id","map","yNames","simpleMap","id2name","yName","rangemodeDflt","yAxOut","coerceRange","slice","Titles","Cartesian","axisIDs","dragElement","setCursor","eventX","event","clientX","touches","drawBg","rangeSlider","axisOpts","bg","borderCorrect","offsetShift","_offsetShift","lw","crispRound","_width","_height","transform","addClipPath","fullLayout","ensureSingleById","_topdefs","_clipId","drawRangePlot","mainplotinfo","calcData","calcdata","rangePlots","_subplotsWith","identity","id","setClipUrl","order","plotgroup","isMainPlot","oppAxisOpts","getFromId","oppAxisName","oppAxisRangeOpts","mockFigure","type","margin","_context","rangebreaks","rangemode","supplyDefaults","xa","ya","clearCalc","setScale","plotinfo","yaxis","isRangePlot","mainplot","rangePlot","out","calcTrace","trace","filterRangePlotCalcData","drawMasks","maskOppBorder","drawSlideBox","staticPlot","drawGrabbers","grabberMin","grabberMax","handleFixAttrs","handleDynamicAttrs","grabAreaFixAttrs","rangeSliderData","_rangeSliderData","_uid","rangeSliders","newRng","rng","axRng","cleanRange","gs","_counterDomainMin","side","_depth","_rl","rl0","rl1","drl","p2d","v","d2p","rsBreaks","locateBreaks","j","brk","lBreaks","m2","_B","pmin","pmax","range0OppAxis","distOppAxis","d2pOppAxis","slideBox","grabAreaMin","grabAreaMax","mouseDownHandler","target","startX","offsetX","getBoundingClientRect","left","minVal","maxVal","dragCover","coverSlip","mouseMove","e","pixelMin","pixelMax","delta","_length","tmp","_pixelMin","_pixelMax","clamp","constrain","dataMin","dataMax","window","requestAnimationFrame","setDataRange","mouseUp","removeEventListener","removeElement","addEventListener","setupDragElement","hw2","clampOppAxis","clampHandle","pixelMinOppAxis","pixelMaxOppAxis","xMin","xMax","setPixelRange","propContainer","propName","placeholder","_dfltTitle","_offset","title","isVisible","makeData","_has","floor","autoMarginOpts","axLetter","bottomDepth","titleHeight","match","BR_TAG_ALL","pad","attrs","helpers","extendFlat","calcAutorange","_isSubplotObj","annAttrs","scatterLineAttrs","dash","overrideAll","axisPlaceableObjs","xref","axisRefDescription","yref","x0","x1","y0","y1","path","opacity","line","color","BENDPX","MINSELECT","SELECTDELAY","SELECTID","Axes","handleSelectionDefaults","selectionIn","selectionOut","noPath","axLetters","pos2r","r2pos","gdMock","axRef","coerceRef","_selectionIndices","_index","rangeToShapePosition","shapePositionToRange","attr0","attr1","in0","in1","coercePosition","p0","p1","selections","selection","readPaths","displayOutlines","clearOutlineControllers","arrayEditor","getPathString","k","_selectionLayer","_plots","selectionLayer","drawOne","couldHaveActiveSelection","editSelection","index","_paperdiv","o","makeSelectionsOptionsAndPlotinfo","options","fillColor","lineColor","lineWidth","lineDash","isActiveSelection","_activeSelectionIndex","activeselection","fillcolor","allPaths","sensory","dashLine","setClipPath","editHelpers","dragOptions","element","polygons","forePath","getAttribute","deactivateSelection","_deactivateSelection","activateSelection","drawSelection","selectionPath","selectionOptions","clipAxes","activateLastSelection","newselection","mode","selectMode","clearOutline","writePaths","fixDatesForPaths","outlines","newStyle","dragmode","cell","newSelection","modifyItem","allSelections","q","beforeEdit","afterEdit","getUpdateObj","p2r","r2p","axValue","getTransform","drawModule","supplyLayoutDefaults","supplyDrawNewSelectionDefaults","includeBasePlot","reselect","prepSelect","clearSelectionsCache","selectOnClick","polybool","pointInPolygon","dashStyle","Fx","makeEventData","dragHelpers","freeMode","rectMode","drawMode","openMode","shapeHelpers","shapeConstants","newShapeHelpers","handleEllipse","newShapes","newSelections","ascending","sorterAsc","libPolygon","throttle","clearGlCanvases","redrawReglTraces","filteredPolygon","polygonTester","tester","hasSubplot","subplot","evt","xAxes","yAxes","polygonOutlines","searchTraces","searchInfo","currentSelectionDef","selectionTesters","thisTracesSelection","pointOrBinSelected","subtract","eventData","hoverData","_hoverdata","sendEvents","clickmode","Array","isArray","hoverOnBox","isHoverDataSet","coerceSelectionsCache","clickedPtInfo","hoverDatum","pointNumber","pointNumbers","fullData","_expandedIndex","cd","binNumber","extractClickedPtInfo","determineSearchTraces","tracesWithSelectedPts","selectedpoints","isOnlyThisBinSelected","len","isOnlyOnePointSelected","isPointOrBinSelected","_module","selectPoints","updateSelectedState","emitDeselect","shiftKey","newPointSelectionDef","multiTester","selectionDefs","concat","fillSelectionItem","points","mergedPolygons","isOpenMode","convertPoly","emitSelected","isPointSelectionDef","newPointNumTester","pointSelectionDef","xmin","xmax","ymin","ymax","pts","contains","pt","omitFirstEdge","idxWantedTrace","isRect","degenerate","testers","arg","contained","selectingOnSameSubplot","_lastSelectedSubplot","hasModifierKey","altKey","immediateSelect","_activeShapeIndex","hasActiveShape","_deactivateShape","hasActiveSelection","zoomLayer","_zoomlayer","isDrawMode","isSelectMode","shapes","_outlining","_noEmitSelectedAtStart","then","getAxId","xAxisIds","yAxisIds","geo","_xaxes","_yaxes","info","createSearchInfo","scene","_splomScenes","uid","sankeyInfo","_xA","overlaying","_yA","ptNum","ptNums","ptNumToTest","fullInputTrace","_fullInput","tracePreGUI","_tracePreGUI","pointIndex","pointIndices","apply","hasRegl","traceIs","fn","styleOnSelect","node3","nodeRangePlot3","updateReglSelectedState","mergePolygons","poly","allPolygons","difference","union","regions","reverse","polygon","getSubtract","polygonsIn","polygonsOut","_doSelect","thisSelection","traceSelection","traceSelections","mayEmitSelected","xRef","yRef","hadSearchTraces","xaxes","yaxes","allSearchTraces","layoutPolygons","getLayoutPolygons","outlinePolys","draftPolygons","u","p","convert","splomScenes","selectBatch","epmtySplomSelectionBatch","seenSplom","yAt","_xRef","_yRef","_selectionTesters","addTester","_searchTraces","cd0","xpx","ypx","c2p","activePolygons","castMultiPolygon","makeFillRangeItems","fillRangeItems","_reselect","_deselect","deselect","subplotSelected","deselectSubplot","currentPolygon","onlyActiveOnes","segments","split","multiPolygons","allX","extractPathCoords","paramIsX","allY","paramIsY","Infinity","previousPolygons","previousPolygon","replace","computeRectAndRanges","allAxes","lassoPoints","sort","emit","startY","isCartesian","isFreeMode","isRectMode","isEllipse","isLineOrEllipse","dragBBox","top","_calcInverseTransform","transformedCoords","apply3DTransform","_invTransform","filterPoly","scaleX","_invScaleX","scaleY","_invScaleY","path0","xAxis","yAxis","pw","ph","newshape","hasText","texttemplate","fillC","strokeC","corners","shapeGroup","empty","throttleID","_clearSubplotSelections","selectionErased","getFillRangeItems","moveFn","dx0","dy0","dx","abs","dy","direction","start","end","selectdirection","drawdirection","addPt","filtered","_res","extraPoints","newPoints","found","curveNumber","emitSelecting","clickFn","numClicks","done","clear","clickedXaxis","clickedYaxis","subSelections","click","catch","error","doneFn","doneFnCompleted","basePlotAttributes","shapeTexttemplateAttrs","shapeLabelTexttemplateVars","showlegend","legend","legendgroup","legendgrouptitle","legendrank","legendwidth","layer","xsizemode","ysizemode","fillrule","editable","colorEditType","textposition","textangle","padding","calcXPaddingOptions","shape","calcPaddingOptions","calcYPaddingOptions","sizeMode","v0","v1","isYAxis","ppad","axisDirectionReverted","coords","maxValue","aggNums","minValue","beforePad","afterPad","ppadplus","ppadminus","shapeBounds","paramsToUse","convertVal","r2c","d2c","drawnParam","params","val","segmentRE","decodeDate","drawn","paramRE","shapeList","_fullData","bounds","_extremes","xRefType","getRefType","yRefType","vx0","vx1","findExtremes","vy0","vy1","M","L","H","V","Q","C","T","S","Z","numParams","handleShapeDefaults","shapeIn","shapeOut","_isShape","shapeType","xSizeMode","ySizeMode","attrAnchor","_shapeIndices","inAnchor","labelTextTemplate","labelText","isLine","labelTextPosition","dfltLabelYanchor","templateValues","_xa","_ya","key","texttemplateStringForShapes","_d3locale","shapex0","shapex1","shapey0","shapey1","labelGroupAttrs","_x","_y","x2p","getDataToPixel","y2p","PI","atan2","calcTextAngle","textPos","shapeOptions","actualTextAngle","textBB","textx","texty","paddingX","paddingY","textPosition","textAngle","textPadding","textAngleRad","sinA","sin","cosA","cos","paddingConstantsX","center","right","paddingConstantsY","bottom","middle","paddingDirection","shiftFraction","baselineAdjust","textHeight","calcTextPosition","i000","i090","i180","i270","pointsOnRectangle","pointsOnEllipse","createShapeObj","drawLabel","getNextPoint","nextJ","nextX","nextY","nCalls","redraw","redrawing","updateObject","isActiveShape","vertexDragOptions","groupDragOptions","indexI","indexJ","copyPolygons","recordPositions","g","onRect","onEllipse","nextPoint","rectSelection","vertex","prepFn","startDragVertex","endDragVertexController","clickVertexController","init","addVertexControllers","startDragGroupController","endDragGroupController","clickGroupController","addGroupControllers","srcElement","moveVertexController","_dx","_dy","pos","newPolygon","removeVertex","moveGroupController","moveGroup","erasedSelection","eraseActiveSelection","_shapeUpperLayer","_shapeLowerLayer","shapelayer","shouldSkipEdits","couldHaveActiveShape","edits","shapePosition","makeShapesOptionsAndPlotinfo","drawShape","_hadPlotinfo","shapeLayer","isOpen","activeshape","shapePath","xAnchor","yAnchor","n0","s0","w0","e0","optN","optS","optW","optE","pathIn","dragMode","MINWIDTH","MINHEIGHT","xPixelSized","yPixelSized","isPath","parentNode","p2x","getPixelToData","p2y","sensoryElement","obtainSensoryElement","startDrag","endDrag","abortDrag","createLineDragHandles","minSensoryWidth","sensoryWidth","circleStyle","circleRadius","cx","cy","updateDragMode","tagName","value","clientY","getCursor","renderVisualCues","deactivateClipPathTemporarily","moveShape","resizeShape","removeVisualCues","noOp","coord","moveX","moveY","encodeDate","movePath","newX0","newY0","newX1","newY1","has","str","hasN","hasS","hasW","hasE","newN","newS","newW","newE","renderAnchor","isNotPath","visualCues","strokeWidth","posX","midRange","roundPositionForSharpStrokeRendering","crossPath","vBarPath","hBarPath","onmousemove","deactivateShape","activateShape","segment","paramNumber","segmentType","xParams","yParams","nParams","param","eraseActiveShape","CIRCLE_SIDES","cos45","sin45","SQRT2","sqrt","parseSvgPath","cartesianHelpers","iC","iQS","almostEq","a","dist","nI","nJ","nK","realK","initX","initY","cmd","polys","n","recStart","x2","y2","newPos","c","cenX","cenY","noOffset","k2","i2","ellipseOver","xIsDate","yIsDate","xPaper","yPaper","newShape","xA","xB","xC","xD","yA","yB","yC","yD","xDateOrLog","yDateOrLog","allShapes","r2d","d2r","convertToPx","convertToDate","isRaw","extractedCoordinates","forEach","relevantParamIdx","cleanNumber","isVertical","refType","dataToPixel","opt","pixelToData","strokeWidthIsOdd","posValAsInt","x2r","y2r","xSizemode","ySizemode","paramString","Number","log","convertPath","xAnchorPos","yAnchorPos","rArc","rightPt","supplyDrawNewShapeDefaults","d2l","l2d","dxFn","dyFn","slope","pow","xcenter","ycenter","padAttrs","extendDeepAll","animationAttrs","stepsAttrs","method","args","freeLength","execute","active","steps","lenmode","transition","duration","easing","currentvalue","prefix","suffix","activebgcolor","gripBgActiveColor","railBgColor","railBorderColor","railBorderWidth","ticklen","tickLength","tickcolor","tickColor","tickwidth","minorticklen","minorTickLength","groupClassName","inputAreaClass","railRectClass","railTouchRectClass","gripRectClass","tickRectClass","inputProxyClass","labelsClass","labelGroupClass","labelClass","currentValueClass","railHeight","menuIndexAttrName","autoMarginIdRoot","minWidth","minHeight","textPadX","arrowOffsetX","railRadius","railWidth","railBorder","railInset","stepInset","gripRadius","gripWidth","gripHeight","gripBorder","gripBorderWidth","gripBorderColor","gripBgColor","labelPadding","labelOffset","tickWidth","tickOffset","minorTickOffset","minorTickColor","currentValuePadding","currentValueInset","stepAttrs","sliderDefaults","sliderIn","sliderOut","stepDefaults","stepCount","_stepCount","visSteps","_visibleSteps","valueIn","valueOut","autoMarginId","sliderOpts","keyFunction","findDimensions","sliderLabels","maxLabelWidth","labelHeight","stepOpts","textNode","dims","_dims","inputAreaWidth","outerLength","inputAreaStart","inputAreaLength","availableSpacePerLabel","computedSpacePerLabel","labelStride","currentValueMaxWidth","currentValueHeight","currentValueTotalHeight","currentValueMaxLines","dummyGroup","curValPrefix","drawCurrentValue","curValSize","lines","marginOpts","xl","xr","sliderGroup","valueOverride","textAnchor","curVal","_gd","drawGrip","attachGripEvents","item","tx","drawLabelGroup","labels","labelItems","labelSteps","setTranslate","normalizedValueToPosition","fraction","handleInput","normalizedPosition","doTransition","quantizedPosition","quantizedIndex","setActive","doCallback","previousActive","applyUpdate","setGripPosition","slider","interaction","_nextMethod","_nextMethodRaf","_step","executeAPICommand","$gd","getSliderOpts","grip","stopPropagation","preventDefault","positionToNormalizedValue","mouse","mouseMoveHandler","mouseUpHandler","_dragging","drawTicks","tick","isMajor","_invokingCommand","el","ease","position","drawTouchRect","drawRail","computedLength","sliderData","contOpts","makeSliderData","sliders","clearSlider","_commandObserver","sliderGroups","gSlider","nsteps","computeLabelSteps","manageCommandObserver","drawSlider","isNumeric","interactConstants","OPPOSITE_SIDE","numStripRE","titleClass","editAttr","cont","prop","traceIndex","avoid","group","containerGroup","isplaceholder","txt","trim","fontFamily","family","fontSize","fontColor","hColorbarMoveTitle","elShouldExist","_hColorbarMoveTitle","titleLayout","titleEl","syncOrAsync","drawTitle","scootTitle","transformVal","rotate","rgb","fontWeight","previousPromises","titleElIn","titleGroup","backside","shiftSign","titlebb","reservedMargins","margins","_reservedMargin","paperbb","maxshift","maxShift","shift","offsetLeft","offsetTop","avoidbb","bBoxIntersect","_titleScoot","shiftTemplate","SHOW_PLACEHOLDER","HIDE_PLACEHOLDER","makeEditable","buttonsAttrs","args2","_arrayAttrRegexps","showactive","borderLine","headerGroupClassName","headerClassName","headerArrowClassName","dropdownButtonGroupClassName","dropdownButtonClassName","buttonClassName","itemRectClassName","itemTextClassName","blankHeaderOpts","arrowPadX","textOffsetX","textOffsetY","gapButtonHeader","gapButton","activeColor","hoverColor","arrowSymbol","up","down","menuDefaults","menuIn","menuOut","paper_bgcolor","ScrollBox","menuOpts","gButton","buttonOpts","gHeader","scrollBox","buttonIndex","isSilentUpdate","drawButtons","drawHeader","header","headerOpts","posOpts","xPad","positionOverrides","headerWidth","headerHeight","drawItem","setItemPosition","removeAllButtons","String","styleOnMouseOver","styleOnMouseOut","buttonData","isFolded","klass","openHeight","openWidth","scrollBoxPosition","defaultPrevented","menu","styleButtons","translateX","translateY","heights","widths","enable","hbar","vbar","drawScrollBox","hasHBar","hasVBar","disable","hideScrollBox","itemOpts","drawItemRect","drawItemText","width1","height1","totalWidth","totalHeight","fakeButtons","paddedWidth","paddedHeight","overrideOpts","finalHeight","spanOffset","newMenuIndexAttr","menuData","clearAutoMargin","menus","_menulayer","headerGroups","scrollBoxId","appendChild","_gButton","container","barWidth","barLength","barRadius","barPad","barColor","prototype","fullWidth","fullHeight","boxL","boxR","boxT","boxB","isDown","isLeft","isUp","boxW","boxH","_box","needsHorizontalScrollBar","hbarW","hbarH","hbarL","hbarT","_hbarXMin","_hbarTranslateMax","needsVerticalScrollBar","vbarW","vbarH","vbarL","vbarT","_vbarYMin","_vbarTranslateMax","clipId","clipL","clipR","clipT","clipB","clipPath","_clipRect","onBoxDrag","behavior","drag","sourceEvent","_onBoxDrag","bind","_onBoxWheel","onBarDrag","_onBarDrag","deltaY","yMin","yMax","translateXMax","translateYMax","xf","yf","FROM_BL","CAP_SHIFT","MID_SHIFT","axisname","lower","upper","FORMAT_LINK","DATE_FORMAT_LINK","DESELECTDIM","BADNUM","FP_SAFE","MAX_VALUE","ONEMAXYEAR","ONEAVGYEAR","ONEMINYEAR","ONEMAXQUARTER","ONEAVGQUARTER","ONEMINQUARTER","ONEMAXMONTH","ONEAVGMONTH","ONEMINMONTH","ONEWEEK","ONEDAY","ONEHOUR","ONEMIN","ONESEC","EPOCHJD","ALMOST_EQUAL","LOG_CLIP","MINUS_SIGN","CSS_DECLARATIONS","STYLE","xmlns","svg","xlink","svgAttrs"],"sourceRoot":""}