plotly.js 2.9.0 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.circleci/config.yml +39 -1
- package/.circleci/test.sh +14 -1
- package/CHANGELOG.md +11 -1
- package/CONTRIBUTING.md +1 -1
- package/README.md +12 -4
- package/dist/README.md +26 -26
- package/dist/plot-schema.json +98 -0
- package/dist/plotly-basic.js +174 -83
- package/dist/plotly-basic.min.js +3 -3
- package/dist/plotly-cartesian.js +174 -83
- package/dist/plotly-cartesian.min.js +4 -4
- package/dist/plotly-finance.js +174 -83
- package/dist/plotly-finance.min.js +3 -3
- package/dist/plotly-geo-assets.js +2 -2
- package/dist/plotly-geo.js +174 -83
- package/dist/plotly-geo.min.js +3 -3
- package/dist/plotly-gl2d.js +174 -83
- package/dist/plotly-gl2d.min.js +6 -6
- package/dist/plotly-gl3d.js +174 -83
- package/dist/plotly-gl3d.min.js +8 -8
- package/dist/plotly-mapbox.js +174 -83
- package/dist/plotly-mapbox.min.js +2 -2
- package/dist/plotly-strict.js +174 -83
- package/dist/plotly-strict.min.js +6 -6
- package/dist/plotly-with-meta.js +178 -83
- package/dist/plotly.js +174 -83
- package/dist/plotly.min.js +2 -2
- package/package.json +6 -3
- package/src/components/drawing/index.js +28 -24
- package/src/components/legend/style.js +10 -6
- package/src/lib/svg_text_utils.js +106 -21
- package/src/plot_api/plot_config.js +9 -0
- package/src/snapshot/tosvg.js +14 -25
- package/src/traces/scatter/attributes.js +2 -0
- package/src/traces/scatter/defaults.js +2 -0
- package/src/traces/scatter/plot.js +4 -4
- package/src/traces/scatter/style.js +1 -1
- package/src/version.js +1 -1
- package/tasks/noci_test.sh +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plotly.js",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.0",
|
|
4
4
|
"description": "The open source javascript graphing library that powers plotly",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -52,6 +52,8 @@
|
|
|
52
52
|
"test-requirejs": "node tasks/test_requirejs.js",
|
|
53
53
|
"test-plain-obj": "node tasks/test_plain_obj.js",
|
|
54
54
|
"test": "npm run test-jasmine -- --nowatch && npm run test-bundle && npm run test-image && npm run test-export && npm run test-syntax && npm run lint",
|
|
55
|
+
"mathjax3": "node devtools/test_dashboard/server.js --mathjax3",
|
|
56
|
+
"mathjax3chtml": "node devtools/test_dashboard/server.js --mathjax3chtml",
|
|
55
57
|
"strict": "node devtools/test_dashboard/server.js --strict",
|
|
56
58
|
"start": "node devtools/test_dashboard/server.js",
|
|
57
59
|
"baseline": "node test/image/make_baseline.js",
|
|
@@ -140,7 +142,7 @@
|
|
|
140
142
|
"into-stream": "^6.0.0",
|
|
141
143
|
"jasmine-core": "^3.5.0",
|
|
142
144
|
"jsdom": "^19.0.0",
|
|
143
|
-
"karma": "^6.3.
|
|
145
|
+
"karma": "^6.3.16",
|
|
144
146
|
"karma-browserify": "^8.1.0",
|
|
145
147
|
"karma-chrome-launcher": "^3.1.0",
|
|
146
148
|
"karma-firefox-launcher": "^2.1.2",
|
|
@@ -152,7 +154,8 @@
|
|
|
152
154
|
"karma-viewport": "1.0.2",
|
|
153
155
|
"lodash": "^4.17.21",
|
|
154
156
|
"madge": "^5.0.1",
|
|
155
|
-
"mathjax": "2.7.5",
|
|
157
|
+
"mathjax-v2": "npm:mathjax@2.7.5",
|
|
158
|
+
"mathjax-v3": "npm:mathjax@^3.2.0",
|
|
156
159
|
"minify-stream": "^2.1.0",
|
|
157
160
|
"npm-link-check": "^4.0.0",
|
|
158
161
|
"open": "^8.4.0",
|
|
@@ -177,24 +177,42 @@ drawing.dashStyle = function(dash, lineWidth) {
|
|
|
177
177
|
return dash;
|
|
178
178
|
};
|
|
179
179
|
|
|
180
|
+
function setFillStyle(sel, trace, gd) {
|
|
181
|
+
var markerPattern = trace.fillpattern;
|
|
182
|
+
var patternShape = markerPattern && drawing.getPatternAttr(markerPattern.shape, 0, '');
|
|
183
|
+
if(patternShape) {
|
|
184
|
+
var patternBGColor = drawing.getPatternAttr(markerPattern.bgcolor, 0, null);
|
|
185
|
+
var patternFGColor = drawing.getPatternAttr(markerPattern.fgcolor, 0, null);
|
|
186
|
+
var patternFGOpacity = markerPattern.fgopacity;
|
|
187
|
+
var patternSize = drawing.getPatternAttr(markerPattern.size, 0, 8);
|
|
188
|
+
var patternSolidity = drawing.getPatternAttr(markerPattern.solidity, 0, 0.3);
|
|
189
|
+
var patternID = trace.uid;
|
|
190
|
+
drawing.pattern(sel, 'point', gd, patternID,
|
|
191
|
+
patternShape, patternSize, patternSolidity,
|
|
192
|
+
undefined, markerPattern.fillmode,
|
|
193
|
+
patternBGColor, patternFGColor, patternFGOpacity
|
|
194
|
+
);
|
|
195
|
+
} else if(trace.fillcolor) {
|
|
196
|
+
sel.call(Color.fill, trace.fillcolor);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
180
200
|
// Same as fillGroupStyle, except in this case the selection may be a transition
|
|
181
|
-
drawing.singleFillStyle = function(sel) {
|
|
201
|
+
drawing.singleFillStyle = function(sel, gd) {
|
|
182
202
|
var node = d3.select(sel.node());
|
|
183
203
|
var data = node.data();
|
|
184
|
-
var
|
|
185
|
-
|
|
186
|
-
sel.call(Color.fill, fillcolor);
|
|
187
|
-
}
|
|
204
|
+
var trace = ((data[0] || [])[0] || {}).trace || {};
|
|
205
|
+
setFillStyle(sel, trace, gd);
|
|
188
206
|
};
|
|
189
207
|
|
|
190
|
-
drawing.fillGroupStyle = function(s) {
|
|
208
|
+
drawing.fillGroupStyle = function(s, gd) {
|
|
191
209
|
s.style('stroke-width', 0)
|
|
192
210
|
.each(function(d) {
|
|
193
211
|
var shape = d3.select(this);
|
|
194
212
|
// N.B. 'd' won't be a calcdata item when
|
|
195
213
|
// fill !== 'none' on a segment-less and marker-less trace
|
|
196
214
|
if(d[0].trace) {
|
|
197
|
-
shape
|
|
215
|
+
setFillStyle(shape, d[0].trace, gd);
|
|
198
216
|
}
|
|
199
217
|
});
|
|
200
218
|
};
|
|
@@ -347,12 +365,7 @@ drawing.gradient = function(sel, gd, gradientID, type, colorscale, prop) {
|
|
|
347
365
|
sel.style(prop, getFullUrl(fullID, gd))
|
|
348
366
|
.style(prop + '-opacity', null);
|
|
349
367
|
|
|
350
|
-
|
|
351
|
-
return '.' + s.attr('class').replace(/\s/g, '.');
|
|
352
|
-
};
|
|
353
|
-
var k = className2query(d3.select(sel.node().parentNode)) +
|
|
354
|
-
'>' + className2query(sel);
|
|
355
|
-
fullLayout._gradientUrlQueryParts[k] = 1;
|
|
368
|
+
sel.classed('gradient_filled', true);
|
|
356
369
|
};
|
|
357
370
|
|
|
358
371
|
/**
|
|
@@ -559,11 +572,6 @@ drawing.pattern = function(sel, calledBy, gd, patternID, shape, size, solidity,
|
|
|
559
572
|
.style('fill-opacity', null);
|
|
560
573
|
|
|
561
574
|
sel.classed('pattern_filled', true);
|
|
562
|
-
var className2query = function(s) {
|
|
563
|
-
return '.' + s.attr('class').replace(/\s/g, '.');
|
|
564
|
-
};
|
|
565
|
-
var k = className2query(d3.select(sel.node().parentNode)) + '>.pattern_filled';
|
|
566
|
-
fullLayout._patternUrlQueryParts[k] = 1;
|
|
567
575
|
};
|
|
568
576
|
|
|
569
577
|
/*
|
|
@@ -579,9 +587,7 @@ drawing.initGradients = function(gd) {
|
|
|
579
587
|
var gradientsGroup = Lib.ensureSingle(fullLayout._defs, 'g', 'gradients');
|
|
580
588
|
gradientsGroup.selectAll('linearGradient,radialGradient').remove();
|
|
581
589
|
|
|
582
|
-
|
|
583
|
-
// used to fix URL strings during image exports
|
|
584
|
-
fullLayout._gradientUrlQueryParts = {};
|
|
590
|
+
d3.select(gd).selectAll('.gradient_filled').classed('gradient_filled', false);
|
|
585
591
|
};
|
|
586
592
|
|
|
587
593
|
drawing.initPatterns = function(gd) {
|
|
@@ -590,9 +596,7 @@ drawing.initPatterns = function(gd) {
|
|
|
590
596
|
var patternsGroup = Lib.ensureSingle(fullLayout._defs, 'g', 'patterns');
|
|
591
597
|
patternsGroup.selectAll('pattern').remove();
|
|
592
598
|
|
|
593
|
-
|
|
594
|
-
// used to fix URL strings during image exports
|
|
595
|
-
fullLayout._patternUrlQueryParts = {};
|
|
599
|
+
d3.select(gd).selectAll('.pattern_filled').classed('pattern_filled', false);
|
|
596
600
|
};
|
|
597
601
|
|
|
598
602
|
drawing.getPatternAttr = function(mp, i, dflt) {
|
|
@@ -111,12 +111,16 @@ module.exports = function style(s, gd, legend) {
|
|
|
111
111
|
var colorscale = cOpts.colorscale;
|
|
112
112
|
var reversescale = cOpts.reversescale;
|
|
113
113
|
|
|
114
|
-
var
|
|
114
|
+
var fillStyle = function(s) {
|
|
115
115
|
if(s.size()) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
if(showFill) {
|
|
117
|
+
Drawing.fillGroupStyle(s, gd);
|
|
118
|
+
} else {
|
|
119
|
+
var gradientID = 'legendfill-' + trace.uid;
|
|
120
|
+
Drawing.gradient(s, gd, gradientID,
|
|
121
|
+
getGradientDirection(reversescale),
|
|
122
|
+
colorscale, 'fill');
|
|
123
|
+
}
|
|
120
124
|
}
|
|
121
125
|
};
|
|
122
126
|
|
|
@@ -145,7 +149,7 @@ module.exports = function style(s, gd, legend) {
|
|
|
145
149
|
fill.enter().append('path').classed('js-fill', true);
|
|
146
150
|
fill.exit().remove();
|
|
147
151
|
fill.attr('d', pathStart + 'h' + itemWidth + 'v6h-' + itemWidth + 'z')
|
|
148
|
-
.call(
|
|
152
|
+
.call(fillStyle);
|
|
149
153
|
|
|
150
154
|
if(showLine || showGradientLine) {
|
|
151
155
|
var lw = boundLineWidth(undefined, trace.line, MAX_LINE_WIDTH, CST_LINE_WIDTH);
|
|
@@ -19,6 +19,7 @@ exports.convertToTspans = function(_context, gd, _callback) {
|
|
|
19
19
|
// Until we get tex integrated more fully (so it can be used along with non-tex)
|
|
20
20
|
// allow some elements to prohibit it by attaching 'data-notex' to the original
|
|
21
21
|
var tex = (!_context.attr('data-notex')) &&
|
|
22
|
+
gd && gd._context.typesetMath &&
|
|
22
23
|
(typeof MathJax !== 'undefined') &&
|
|
23
24
|
str.match(FIND_TEX);
|
|
24
25
|
|
|
@@ -173,70 +174,154 @@ function cleanEscapesForTex(s) {
|
|
|
173
174
|
.replace(GT_MATCH, '\\gt ');
|
|
174
175
|
}
|
|
175
176
|
|
|
177
|
+
var inlineMath = [['$', '$'], ['\\(', '\\)']];
|
|
178
|
+
|
|
176
179
|
function texToSVG(_texString, _config, _callback) {
|
|
180
|
+
var MathJaxVersion = parseInt(
|
|
181
|
+
(MathJax.version || '').split('.')[0]
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
if(
|
|
185
|
+
MathJaxVersion !== 2 &&
|
|
186
|
+
MathJaxVersion !== 3
|
|
187
|
+
) {
|
|
188
|
+
Lib.warn('No MathJax version:', MathJax.version);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
|
|
177
192
|
var originalRenderer,
|
|
178
193
|
originalConfig,
|
|
179
194
|
originalProcessSectionDelay,
|
|
180
195
|
tmpDiv;
|
|
181
196
|
|
|
182
|
-
|
|
183
|
-
function() {
|
|
197
|
+
var setConfig2 = function() {
|
|
184
198
|
originalConfig = Lib.extendDeepAll({}, MathJax.Hub.config);
|
|
185
199
|
|
|
186
200
|
originalProcessSectionDelay = MathJax.Hub.processSectionDelay;
|
|
187
201
|
if(MathJax.Hub.processSectionDelay !== undefined) {
|
|
188
|
-
// MathJax 2.5+
|
|
202
|
+
// MathJax 2.5+ but not 3+
|
|
189
203
|
MathJax.Hub.processSectionDelay = 0;
|
|
190
204
|
}
|
|
191
205
|
|
|
192
206
|
return MathJax.Hub.Config({
|
|
193
207
|
messageStyle: 'none',
|
|
194
208
|
tex2jax: {
|
|
195
|
-
inlineMath:
|
|
209
|
+
inlineMath: inlineMath
|
|
196
210
|
},
|
|
197
211
|
displayAlign: 'left',
|
|
198
212
|
});
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
var setConfig3 = function() {
|
|
216
|
+
originalConfig = Lib.extendDeepAll({}, MathJax.config);
|
|
217
|
+
|
|
218
|
+
if(!MathJax.config.tex) {
|
|
219
|
+
MathJax.config.tex = {};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
MathJax.config.tex.inlineMath = inlineMath;
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
var setRenderer2 = function() {
|
|
202
226
|
originalRenderer = MathJax.Hub.config.menuSettings.renderer;
|
|
203
227
|
if(originalRenderer !== 'SVG') {
|
|
204
228
|
return MathJax.Hub.setRenderer('SVG');
|
|
205
229
|
}
|
|
206
|
-
}
|
|
207
|
-
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
var setRenderer3 = function() {
|
|
233
|
+
originalRenderer = MathJax.config.startup.output;
|
|
234
|
+
if(originalRenderer !== 'svg') {
|
|
235
|
+
MathJax.config.startup.output = 'svg';
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
var initiateMathJax = function() {
|
|
208
240
|
var randomID = 'math-output-' + Lib.randstr({}, 64);
|
|
209
241
|
tmpDiv = d3.select('body').append('div')
|
|
210
242
|
.attr({id: randomID})
|
|
211
|
-
.style({
|
|
212
|
-
|
|
243
|
+
.style({
|
|
244
|
+
visibility: 'hidden',
|
|
245
|
+
position: 'absolute',
|
|
246
|
+
'font-size': _config.fontSize + 'px'
|
|
247
|
+
})
|
|
213
248
|
.text(cleanEscapesForTex(_texString));
|
|
214
249
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
250
|
+
var tmpNode = tmpDiv.node();
|
|
251
|
+
|
|
252
|
+
return MathJaxVersion === 2 ?
|
|
253
|
+
MathJax.Hub.Typeset(tmpNode) :
|
|
254
|
+
MathJax.typeset([tmpNode]);
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
var finalizeMathJax = function() {
|
|
258
|
+
var sel = tmpDiv.select(
|
|
259
|
+
MathJaxVersion === 2 ? '.MathJax_SVG' : '.MathJax'
|
|
260
|
+
);
|
|
219
261
|
|
|
220
|
-
|
|
262
|
+
var node = !sel.empty() && tmpDiv.select('svg').node();
|
|
263
|
+
if(!node) {
|
|
221
264
|
Lib.log('There was an error in the tex syntax.', _texString);
|
|
222
265
|
_callback();
|
|
223
266
|
} else {
|
|
224
|
-
var
|
|
225
|
-
|
|
267
|
+
var nodeBBox = node.getBoundingClientRect();
|
|
268
|
+
var glyphDefs;
|
|
269
|
+
if(MathJaxVersion === 2) {
|
|
270
|
+
glyphDefs = d3.select('body').select('#MathJax_SVG_glyphs');
|
|
271
|
+
} else {
|
|
272
|
+
glyphDefs = sel.select('defs');
|
|
273
|
+
}
|
|
274
|
+
_callback(sel, glyphDefs, nodeBBox);
|
|
226
275
|
}
|
|
227
276
|
|
|
228
277
|
tmpDiv.remove();
|
|
278
|
+
};
|
|
229
279
|
|
|
280
|
+
var resetRenderer2 = function() {
|
|
230
281
|
if(originalRenderer !== 'SVG') {
|
|
231
282
|
return MathJax.Hub.setRenderer(originalRenderer);
|
|
232
283
|
}
|
|
233
|
-
}
|
|
234
|
-
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
var resetRenderer3 = function() {
|
|
287
|
+
if(originalRenderer !== 'svg') {
|
|
288
|
+
MathJax.config.startup.output = originalRenderer;
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
var resetConfig2 = function() {
|
|
235
293
|
if(originalProcessSectionDelay !== undefined) {
|
|
236
294
|
MathJax.Hub.processSectionDelay = originalProcessSectionDelay;
|
|
237
295
|
}
|
|
238
296
|
return MathJax.Hub.Config(originalConfig);
|
|
239
|
-
}
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
var resetConfig3 = function() {
|
|
300
|
+
MathJax.config = originalConfig;
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
if(MathJaxVersion === 2) {
|
|
304
|
+
MathJax.Hub.Queue(
|
|
305
|
+
setConfig2,
|
|
306
|
+
setRenderer2,
|
|
307
|
+
initiateMathJax,
|
|
308
|
+
finalizeMathJax,
|
|
309
|
+
resetRenderer2,
|
|
310
|
+
resetConfig2
|
|
311
|
+
);
|
|
312
|
+
} else if(MathJaxVersion === 3) {
|
|
313
|
+
setConfig3();
|
|
314
|
+
setRenderer3();
|
|
315
|
+
MathJax.startup.defaultReady();
|
|
316
|
+
|
|
317
|
+
MathJax.startup.promise.then(function() {
|
|
318
|
+
initiateMathJax();
|
|
319
|
+
finalizeMathJax();
|
|
320
|
+
|
|
321
|
+
resetRenderer3();
|
|
322
|
+
resetConfig3();
|
|
323
|
+
});
|
|
324
|
+
}
|
|
240
325
|
}
|
|
241
326
|
|
|
242
327
|
var TAG_STYLES = {
|
|
@@ -22,6 +22,15 @@ var configAttributes = {
|
|
|
22
22
|
].join(' ')
|
|
23
23
|
},
|
|
24
24
|
|
|
25
|
+
typesetMath: {
|
|
26
|
+
valType: 'boolean',
|
|
27
|
+
dflt: true,
|
|
28
|
+
description: [
|
|
29
|
+
'Determines whether math should be typeset or not,',
|
|
30
|
+
'when MathJax (either v2 or v3) is present on the page.'
|
|
31
|
+
].join(' ')
|
|
32
|
+
},
|
|
33
|
+
|
|
25
34
|
plotlyServerURL: {
|
|
26
35
|
valType: 'string',
|
|
27
36
|
dflt: '',
|
package/src/snapshot/tosvg.js
CHANGED
|
@@ -33,7 +33,7 @@ module.exports = function toSVG(gd, format, scale) {
|
|
|
33
33
|
var toppaper = fullLayout._toppaper;
|
|
34
34
|
var width = fullLayout.width;
|
|
35
35
|
var height = fullLayout.height;
|
|
36
|
-
var i
|
|
36
|
+
var i;
|
|
37
37
|
|
|
38
38
|
// make background color a rect in the svg, then revert after scraping
|
|
39
39
|
// all other alterations have been dealt with by properly preparing the svg
|
|
@@ -106,32 +106,21 @@ module.exports = function toSVG(gd, format, scale) {
|
|
|
106
106
|
}
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
for(k in fullLayout._gradientUrlQueryParts) queryParts.push(k);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if(fullLayout._patternUrlQueryParts) {
|
|
115
|
-
for(k in fullLayout._patternUrlQueryParts) queryParts.push(k);
|
|
116
|
-
}
|
|
109
|
+
svg.selectAll('.gradient_filled,.pattern_filled').each(function() {
|
|
110
|
+
var pt = d3.select(this);
|
|
117
111
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
var fill = this.style.fill;
|
|
125
|
-
if(fill && fill.indexOf('url(') !== -1) {
|
|
126
|
-
pt.style('fill', fill.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB));
|
|
127
|
-
}
|
|
112
|
+
// similar to font family styles above,
|
|
113
|
+
// we must remove " after the SVG DOM has been serialized
|
|
114
|
+
var fill = this.style.fill;
|
|
115
|
+
if(fill && fill.indexOf('url(') !== -1) {
|
|
116
|
+
pt.style('fill', fill.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB));
|
|
117
|
+
}
|
|
128
118
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
119
|
+
var stroke = this.style.stroke;
|
|
120
|
+
if(stroke && stroke.indexOf('url(') !== -1) {
|
|
121
|
+
pt.style('stroke', stroke.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB));
|
|
122
|
+
}
|
|
123
|
+
});
|
|
135
124
|
|
|
136
125
|
if(format === 'pdf' || format === 'eps') {
|
|
137
126
|
// these formats make the extra line MathJax adds around symbols look super thick in some cases
|
|
@@ -6,6 +6,7 @@ var hovertemplateAttrs = require('../../plots/template_attributes').hovertemplat
|
|
|
6
6
|
var colorScaleAttrs = require('../../components/colorscale/attributes');
|
|
7
7
|
var fontAttrs = require('../../plots/font_attributes');
|
|
8
8
|
var dash = require('../../components/drawing/attributes').dash;
|
|
9
|
+
var pattern = require('../../components/drawing/attributes').pattern;
|
|
9
10
|
|
|
10
11
|
var Drawing = require('../../components/drawing');
|
|
11
12
|
var constants = require('./constants');
|
|
@@ -363,6 +364,7 @@ module.exports = {
|
|
|
363
364
|
'marker color, or marker line color, whichever is available.'
|
|
364
365
|
].join(' ')
|
|
365
366
|
},
|
|
367
|
+
fillpattern: pattern,
|
|
366
368
|
marker: extendFlat({
|
|
367
369
|
symbol: {
|
|
368
370
|
valType: 'enumerated',
|
|
@@ -14,6 +14,7 @@ var handleLineDefaults = require('./line_defaults');
|
|
|
14
14
|
var handleLineShapeDefaults = require('./line_shape_defaults');
|
|
15
15
|
var handleTextDefaults = require('./text_defaults');
|
|
16
16
|
var handleFillColorDefaults = require('./fillcolor_defaults');
|
|
17
|
+
var coercePattern = require('../../lib').coercePattern;
|
|
17
18
|
|
|
18
19
|
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
|
|
19
20
|
function coerce(attr, dflt) {
|
|
@@ -67,6 +68,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
|
|
|
67
68
|
if(traceOut.fill !== 'none') {
|
|
68
69
|
handleFillColorDefaults(traceIn, traceOut, defaultColor, coerce);
|
|
69
70
|
if(!subTypes.hasLines(traceOut)) handleLineShapeDefaults(traceIn, traceOut, coerce);
|
|
71
|
+
coercePattern(coerce, 'fillpattern', traceOut.fillcolor, false);
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
var lineColor = (traceOut.line || {}).color;
|
|
@@ -304,11 +304,11 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
|
|
|
304
304
|
// the points on the axes are the first two points. Otherwise
|
|
305
305
|
// animations get a little crazy if the number of points changes.
|
|
306
306
|
transition(ownFillEl3).attr('d', 'M' + pt1 + 'L' + pt0 + 'L' + fullpath.substr(1))
|
|
307
|
-
.call(Drawing.singleFillStyle);
|
|
307
|
+
.call(Drawing.singleFillStyle, gd);
|
|
308
308
|
} else {
|
|
309
309
|
// fill to self: just join the path to itself
|
|
310
310
|
transition(ownFillEl3).attr('d', fullpath + 'Z')
|
|
311
|
-
.call(Drawing.singleFillStyle);
|
|
311
|
+
.call(Drawing.singleFillStyle, gd);
|
|
312
312
|
}
|
|
313
313
|
}
|
|
314
314
|
} else if(tonext) {
|
|
@@ -320,7 +320,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
|
|
|
320
320
|
// This makes strange results if one path is *not* entirely
|
|
321
321
|
// inside the other, but then that is a strange usage.
|
|
322
322
|
transition(tonext).attr('d', fullpath + 'Z' + prevRevpath + 'Z')
|
|
323
|
-
.call(Drawing.singleFillStyle);
|
|
323
|
+
.call(Drawing.singleFillStyle, gd);
|
|
324
324
|
} else {
|
|
325
325
|
// tonextx/y: for now just connect endpoints with lines. This is
|
|
326
326
|
// the correct behavior if the endpoints are at the same value of
|
|
@@ -328,7 +328,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
|
|
|
328
328
|
// things depending on whether the new endpoint projects onto the
|
|
329
329
|
// existing curve or off the end of it
|
|
330
330
|
transition(tonext).attr('d', fullpath + 'L' + prevRevpath.substr(1) + 'Z')
|
|
331
|
-
.call(Drawing.singleFillStyle);
|
|
331
|
+
.call(Drawing.singleFillStyle, gd);
|
|
332
332
|
}
|
|
333
333
|
trace._polygons = trace._polygons.concat(prevPolygons);
|
|
334
334
|
} else {
|
package/src/version.js
CHANGED
package/tasks/noci_test.sh
CHANGED
|
@@ -28,7 +28,7 @@ test_image () {
|
|
|
28
28
|
$root/../orca/bin/orca.js graph \
|
|
29
29
|
$root/test/image/mocks/mapbox_osm-style.json \
|
|
30
30
|
$root/test/image/mocks/mapbox_density0-legend.json \
|
|
31
|
-
--mathjax $root/node_modules/mathjax/MathJax.js \
|
|
31
|
+
--mathjax $root/node_modules/mathjax-v2/MathJax.js \
|
|
32
32
|
--plotly $root/build/plotly.js \
|
|
33
33
|
--mapbox-access-token "pk.eyJ1IjoicGxvdGx5LWpzLXRlc3RzIiwiYSI6ImNrNG9meTJmOTAxa3UzZm10dWdteDQ2eWMifQ.2REjOFyIrleMqwS8H8y1-A" \
|
|
34
34
|
--output-dir $root/test/image/baselines/ \
|