@veritone-ce/design-system 2.8.13-next.1 → 2.8.13
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/dist/cjs/Dialog/components.js +90 -29
- package/dist/cjs/Dialog/state.js +8 -2
- package/dist/cjs/Dialog/styles.module.scss.js +2 -2
- package/dist/cjs/FileUploader/controlled.js +0 -7
- package/dist/cjs/Menu/controlled.js +77 -2
- package/dist/cjs/Select/controlled.js +3 -0
- package/dist/cjs/Table/AutoTable/controlled.js +1 -2
- package/dist/cjs/Table/AutoTable/styles.module.scss.js +1 -1
- package/dist/cjs/TablePagination/index.js +8 -21
- package/dist/cjs/index.js +0 -11
- package/dist/cjs/styles/createPalette.js +0 -11
- package/dist/cjs/styles.css +1 -1
- package/dist/cjs/unstable/Card/index.js +33 -0
- package/dist/cjs/unstable/Card/styles.module.scss.js +1 -1
- package/dist/cjs/unstable/index.js +13 -39
- package/dist/esm/Dialog/components.js +89 -28
- package/dist/esm/Dialog/state.js +8 -2
- package/dist/esm/Dialog/styles.module.scss.js +2 -2
- package/dist/esm/FileUploader/controlled.js +0 -7
- package/dist/esm/Menu/controlled.js +77 -2
- package/dist/esm/Select/controlled.js +3 -0
- package/dist/esm/Table/AutoTable/controlled.js +1 -2
- package/dist/esm/Table/AutoTable/styles.module.scss.js +1 -1
- package/dist/esm/TablePagination/index.js +8 -21
- package/dist/esm/index.js +1 -1
- package/dist/esm/styles/createPalette.js +1 -1
- package/dist/esm/styles.css +1 -1
- package/dist/esm/unstable/Card/index.js +29 -0
- package/dist/esm/unstable/Card/styles.module.scss.js +1 -1
- package/dist/esm/unstable/index.js +1 -5
- package/dist/types/Dialog/components.d.ts +20 -27
- package/dist/types/Dialog/factory.d.ts +5 -4
- package/dist/types/Dialog/state.d.ts +15 -1
- package/dist/types/Menu/controlled.d.ts +9 -1
- package/dist/types/Select/types.d.ts +8 -0
- package/dist/types/TablePagination/index.d.ts +1 -1
- package/dist/types/styles/createPalette.d.ts +2 -13
- package/dist/types/unstable/Card/index.d.ts +11 -2
- package/dist/types/unstable/extras/chart/index.d.ts +33 -15
- package/dist/types/unstable/index.d.ts +0 -3
- package/package.json +7 -1
- package/dist/cjs/bundled_modules/d3-array/src/ascending.js +0 -9
- package/dist/cjs/bundled_modules/d3-array/src/bisect.js +0 -16
- package/dist/cjs/bundled_modules/d3-array/src/bisector.js +0 -62
- package/dist/cjs/bundled_modules/d3-array/src/descending.js +0 -13
- package/dist/cjs/bundled_modules/d3-array/src/deviation.js +0 -12
- package/dist/cjs/bundled_modules/d3-array/src/fsum.js +0 -45
- package/dist/cjs/bundled_modules/d3-array/src/intersection.js +0 -25
- package/dist/cjs/bundled_modules/d3-array/src/max.js +0 -26
- package/dist/cjs/bundled_modules/d3-array/src/mean.js +0 -25
- package/dist/cjs/bundled_modules/d3-array/src/median.js +0 -11
- package/dist/cjs/bundled_modules/d3-array/src/merge.js +0 -15
- package/dist/cjs/bundled_modules/d3-array/src/min.js +0 -26
- package/dist/cjs/bundled_modules/d3-array/src/number.js +0 -27
- package/dist/cjs/bundled_modules/d3-array/src/permute.js +0 -9
- package/dist/cjs/bundled_modules/d3-array/src/quantile.js +0 -36
- package/dist/cjs/bundled_modules/d3-array/src/quickselect.js +0 -59
- package/dist/cjs/bundled_modules/d3-array/src/range.js +0 -19
- package/dist/cjs/bundled_modules/d3-array/src/sort.js +0 -20
- package/dist/cjs/bundled_modules/d3-array/src/sum.js +0 -17
- package/dist/cjs/bundled_modules/d3-array/src/ticks.js +0 -63
- package/dist/cjs/bundled_modules/d3-array/src/union.js +0 -17
- package/dist/cjs/bundled_modules/d3-array/src/variance.js +0 -31
- package/dist/cjs/bundled_modules/d3-color/src/color.js +0 -410
- package/dist/cjs/bundled_modules/d3-color/src/cubehelix.js +0 -68
- package/dist/cjs/bundled_modules/d3-color/src/define.js +0 -17
- package/dist/cjs/bundled_modules/d3-color/src/lab.js +0 -124
- package/dist/cjs/bundled_modules/d3-color/src/math.js +0 -7
- package/dist/cjs/bundled_modules/d3-delaunay/src/delaunay.js +0 -254
- package/dist/cjs/bundled_modules/d3-delaunay/src/path.js +0 -43
- package/dist/cjs/bundled_modules/d3-delaunay/src/polygon.js +0 -23
- package/dist/cjs/bundled_modules/d3-delaunay/src/voronoi.js +0 -338
- package/dist/cjs/bundled_modules/d3-dispatch/src/dispatch.js +0 -88
- package/dist/cjs/bundled_modules/d3-dsv/src/dsv.js +0 -170
- package/dist/cjs/bundled_modules/d3-force/src/center.js +0 -46
- package/dist/cjs/bundled_modules/d3-force/src/collide.js +0 -106
- package/dist/cjs/bundled_modules/d3-force/src/constant.js +0 -11
- package/dist/cjs/bundled_modules/d3-force/src/jiggle.js +0 -9
- package/dist/cjs/bundled_modules/d3-force/src/lcg.js +0 -15
- package/dist/cjs/bundled_modules/d3-force/src/link.js +0 -123
- package/dist/cjs/bundled_modules/d3-force/src/manyBody.js +0 -122
- package/dist/cjs/bundled_modules/d3-force/src/simulation.js +0 -164
- package/dist/cjs/bundled_modules/d3-force/src/x.js +0 -47
- package/dist/cjs/bundled_modules/d3-force/src/y.js +0 -47
- package/dist/cjs/bundled_modules/d3-format/src/defaultLocale.js +0 -24
- package/dist/cjs/bundled_modules/d3-format/src/exponent.js +0 -11
- package/dist/cjs/bundled_modules/d3-format/src/formatDecimal.js +0 -27
- package/dist/cjs/bundled_modules/d3-format/src/formatGroup.js +0 -24
- package/dist/cjs/bundled_modules/d3-format/src/formatNumerals.js +0 -13
- package/dist/cjs/bundled_modules/d3-format/src/formatPrefixAuto.js +0 -22
- package/dist/cjs/bundled_modules/d3-format/src/formatRounded.js +0 -17
- package/dist/cjs/bundled_modules/d3-format/src/formatSpecifier.js +0 -54
- package/dist/cjs/bundled_modules/d3-format/src/formatTrim.js +0 -17
- package/dist/cjs/bundled_modules/d3-format/src/formatTypes.js +0 -25
- package/dist/cjs/bundled_modules/d3-format/src/identity.js +0 -9
- package/dist/cjs/bundled_modules/d3-format/src/locale.js +0 -154
- package/dist/cjs/bundled_modules/d3-format/src/precisionFixed.js +0 -11
- package/dist/cjs/bundled_modules/d3-format/src/precisionPrefix.js +0 -11
- package/dist/cjs/bundled_modules/d3-format/src/precisionRound.js +0 -12
- package/dist/cjs/bundled_modules/d3-geo/src/area.js +0 -83
- package/dist/cjs/bundled_modules/d3-geo/src/bounds.js +0 -185
- package/dist/cjs/bundled_modules/d3-geo/src/cartesian.js +0 -43
- package/dist/cjs/bundled_modules/d3-geo/src/centroid.js +0 -149
- package/dist/cjs/bundled_modules/d3-geo/src/circle.js +0 -35
- package/dist/cjs/bundled_modules/d3-geo/src/clip/antimeridian.js +0 -98
- package/dist/cjs/bundled_modules/d3-geo/src/clip/buffer.js +0 -30
- package/dist/cjs/bundled_modules/d3-geo/src/clip/circle.js +0 -183
- package/dist/cjs/bundled_modules/d3-geo/src/clip/index.js +0 -137
- package/dist/cjs/bundled_modules/d3-geo/src/clip/line.js +0 -65
- package/dist/cjs/bundled_modules/d3-geo/src/clip/rectangle.js +0 -174
- package/dist/cjs/bundled_modules/d3-geo/src/clip/rejoin.js +0 -109
- package/dist/cjs/bundled_modules/d3-geo/src/compose.js +0 -18
- package/dist/cjs/bundled_modules/d3-geo/src/graticule.js +0 -107
- package/dist/cjs/bundled_modules/d3-geo/src/identity.js +0 -7
- package/dist/cjs/bundled_modules/d3-geo/src/math.js +0 -57
- package/dist/cjs/bundled_modules/d3-geo/src/noop.js +0 -7
- package/dist/cjs/bundled_modules/d3-geo/src/path/area.js +0 -54
- package/dist/cjs/bundled_modules/d3-geo/src/path/bounds.js +0 -32
- package/dist/cjs/bundled_modules/d3-geo/src/path/centroid.js +0 -104
- package/dist/cjs/bundled_modules/d3-geo/src/path/context.js +0 -51
- package/dist/cjs/bundled_modules/d3-geo/src/path/index.js +0 -82
- package/dist/cjs/bundled_modules/d3-geo/src/path/measure.js +0 -49
- package/dist/cjs/bundled_modules/d3-geo/src/path/string.js +0 -92
- package/dist/cjs/bundled_modules/d3-geo/src/pointEqual.js +0 -11
- package/dist/cjs/bundled_modules/d3-geo/src/polygonContains.js +0 -80
- package/dist/cjs/bundled_modules/d3-geo/src/projection/albers.js +0 -16
- package/dist/cjs/bundled_modules/d3-geo/src/projection/albersUsa.js +0 -117
- package/dist/cjs/bundled_modules/d3-geo/src/projection/azimuthal.js +0 -32
- package/dist/cjs/bundled_modules/d3-geo/src/projection/azimuthalEqualArea.js +0 -24
- package/dist/cjs/bundled_modules/d3-geo/src/projection/azimuthalEquidistant.js +0 -24
- package/dist/cjs/bundled_modules/d3-geo/src/projection/conic.js +0 -19
- package/dist/cjs/bundled_modules/d3-geo/src/projection/conicConformal.js +0 -45
- package/dist/cjs/bundled_modules/d3-geo/src/projection/conicEqualArea.js +0 -40
- package/dist/cjs/bundled_modules/d3-geo/src/projection/conicEquidistant.js +0 -39
- package/dist/cjs/bundled_modules/d3-geo/src/projection/cylindricalEqualArea.js +0 -19
- package/dist/cjs/bundled_modules/d3-geo/src/projection/equalEarth.js +0 -43
- package/dist/cjs/bundled_modules/d3-geo/src/projection/equirectangular.js +0 -19
- package/dist/cjs/bundled_modules/d3-geo/src/projection/fit.js +0 -54
- package/dist/cjs/bundled_modules/d3-geo/src/projection/gnomonic.js +0 -23
- package/dist/cjs/bundled_modules/d3-geo/src/projection/identity.js +0 -91
- package/dist/cjs/bundled_modules/d3-geo/src/projection/index.js +0 -184
- package/dist/cjs/bundled_modules/d3-geo/src/projection/mercator.js +0 -60
- package/dist/cjs/bundled_modules/d3-geo/src/projection/naturalEarth1.js +0 -35
- package/dist/cjs/bundled_modules/d3-geo/src/projection/orthographic.js +0 -22
- package/dist/cjs/bundled_modules/d3-geo/src/projection/resample.js +0 -108
- package/dist/cjs/bundled_modules/d3-geo/src/projection/stereographic.js +0 -25
- package/dist/cjs/bundled_modules/d3-geo/src/projection/transverseMercator.js +0 -34
- package/dist/cjs/bundled_modules/d3-geo/src/rotation.js +0 -86
- package/dist/cjs/bundled_modules/d3-geo/src/stream.js +0 -75
- package/dist/cjs/bundled_modules/d3-geo/src/transform.js +0 -24
- package/dist/cjs/bundled_modules/d3-geo-projection/src/math.js +0 -28
- package/dist/cjs/bundled_modules/d3-geo-projection/src/mollweide.js +0 -38
- package/dist/cjs/bundled_modules/d3-hierarchy/src/accessors.js +0 -13
- package/dist/cjs/bundled_modules/d3-hierarchy/src/array.js +0 -27
- package/dist/cjs/bundled_modules/d3-hierarchy/src/cluster.js +0 -90
- package/dist/cjs/bundled_modules/d3-hierarchy/src/constant.js +0 -16
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/ancestors.js +0 -13
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/count.js +0 -18
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/descendants.js +0 -9
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/each.js +0 -13
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/eachAfter.js +0 -21
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/eachBefore.js +0 -18
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/find.js +0 -14
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/index.js +0 -99
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/iterator.js +0 -20
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/leaves.js +0 -15
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/links.js +0 -15
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/path.js +0 -36
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/sort.js +0 -13
- package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/sum.js +0 -15
- package/dist/cjs/bundled_modules/d3-hierarchy/src/lcg.js +0 -15
- package/dist/cjs/bundled_modules/d3-hierarchy/src/pack/enclose.js +0 -122
- package/dist/cjs/bundled_modules/d3-hierarchy/src/pack/index.js +0 -87
- package/dist/cjs/bundled_modules/d3-hierarchy/src/pack/siblings.js +0 -118
- package/dist/cjs/bundled_modules/d3-hierarchy/src/partition.js +0 -58
- package/dist/cjs/bundled_modules/d3-hierarchy/src/stratify.js +0 -151
- package/dist/cjs/bundled_modules/d3-hierarchy/src/tree.js +0 -243
- package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/binary.js +0 -52
- package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/dice.js +0 -18
- package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/index.js +0 -100
- package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/resquarify.js +0 -42
- package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/round.js +0 -12
- package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/slice.js +0 -18
- package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/sliceDice.js +0 -12
- package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/squarify.js +0 -74
- package/dist/cjs/bundled_modules/d3-interpolate/src/array.js +0 -29
- package/dist/cjs/bundled_modules/d3-interpolate/src/basis.js +0 -26
- package/dist/cjs/bundled_modules/d3-interpolate/src/basisClosed.js +0 -19
- package/dist/cjs/bundled_modules/d3-interpolate/src/color.js +0 -37
- package/dist/cjs/bundled_modules/d3-interpolate/src/constant.js +0 -7
- package/dist/cjs/bundled_modules/d3-interpolate/src/cubehelix.js +0 -36
- package/dist/cjs/bundled_modules/d3-interpolate/src/date.js +0 -12
- package/dist/cjs/bundled_modules/d3-interpolate/src/discrete.js +0 -12
- package/dist/cjs/bundled_modules/d3-interpolate/src/hcl.js +0 -28
- package/dist/cjs/bundled_modules/d3-interpolate/src/hsl.js +0 -28
- package/dist/cjs/bundled_modules/d3-interpolate/src/hue.js +0 -15
- package/dist/cjs/bundled_modules/d3-interpolate/src/index.js +0 -53
- package/dist/cjs/bundled_modules/d3-interpolate/src/lab.js +0 -22
- package/dist/cjs/bundled_modules/d3-interpolate/src/number.js +0 -11
- package/dist/cjs/bundled_modules/d3-interpolate/src/numberArray.js +0 -21
- package/dist/cjs/bundled_modules/d3-interpolate/src/object.js +0 -29
- package/dist/cjs/bundled_modules/d3-interpolate/src/piecewise.js +0 -17
- package/dist/cjs/bundled_modules/d3-interpolate/src/quantize.js +0 -11
- package/dist/cjs/bundled_modules/d3-interpolate/src/rgb.js +0 -63
- package/dist/cjs/bundled_modules/d3-interpolate/src/round.js +0 -11
- package/dist/cjs/bundled_modules/d3-interpolate/src/string.js +0 -70
- package/dist/cjs/bundled_modules/d3-interpolate/src/transform/decompose.js +0 -33
- package/dist/cjs/bundled_modules/d3-interpolate/src/transform/index.js +0 -68
- package/dist/cjs/bundled_modules/d3-interpolate/src/transform/parse.js +0 -23
- package/dist/cjs/bundled_modules/d3-interpolate/src/value.js +0 -28
- package/dist/cjs/bundled_modules/d3-interpolate/src/zoom.js +0 -77
- package/dist/cjs/bundled_modules/d3-path/src/path.js +0 -157
- package/dist/cjs/bundled_modules/d3-quadtree/src/add.js +0 -91
- package/dist/cjs/bundled_modules/d3-quadtree/src/cover.js +0 -49
- package/dist/cjs/bundled_modules/d3-quadtree/src/data.js +0 -13
- package/dist/cjs/bundled_modules/d3-quadtree/src/extent.js +0 -11
- package/dist/cjs/bundled_modules/d3-quadtree/src/find.js +0 -76
- package/dist/cjs/bundled_modules/d3-quadtree/src/quad.js +0 -13
- package/dist/cjs/bundled_modules/d3-quadtree/src/quadtree.js +0 -79
- package/dist/cjs/bundled_modules/d3-quadtree/src/remove.js +0 -69
- package/dist/cjs/bundled_modules/d3-quadtree/src/root.js +0 -9
- package/dist/cjs/bundled_modules/d3-quadtree/src/size.js +0 -13
- package/dist/cjs/bundled_modules/d3-quadtree/src/visit.js +0 -22
- package/dist/cjs/bundled_modules/d3-quadtree/src/visitAfter.js +0 -27
- package/dist/cjs/bundled_modules/d3-quadtree/src/x.js +0 -14
- package/dist/cjs/bundled_modules/d3-quadtree/src/y.js +0 -14
- package/dist/cjs/bundled_modules/d3-scale/src/constant.js +0 -11
- package/dist/cjs/bundled_modules/d3-scale/src/continuous.js +0 -136
- package/dist/cjs/bundled_modules/d3-scale/src/diverging.js +0 -116
- package/dist/cjs/bundled_modules/d3-scale/src/identity.js +0 -34
- package/dist/cjs/bundled_modules/d3-scale/src/init.js +0 -31
- package/dist/cjs/bundled_modules/d3-scale/src/linear.js +0 -77
- package/dist/cjs/bundled_modules/d3-scale/src/log.js +0 -148
- package/dist/cjs/bundled_modules/d3-scale/src/nice.js +0 -24
- package/dist/cjs/bundled_modules/d3-scale/src/number.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale/src/ordinal.js +0 -53
- package/dist/cjs/bundled_modules/d3-scale/src/pow.js +0 -58
- package/dist/cjs/bundled_modules/d3-scale/src/quantile.js +0 -65
- package/dist/cjs/bundled_modules/d3-scale/src/quantize.js +0 -62
- package/dist/cjs/bundled_modules/d3-scale/src/sequential.js +0 -119
- package/dist/cjs/bundled_modules/d3-scale/src/symlog.js +0 -42
- package/dist/cjs/bundled_modules/d3-scale/src/threshold.js +0 -45
- package/dist/cjs/bundled_modules/d3-scale/src/tickFormat.js +0 -39
- package/dist/cjs/bundled_modules/d3-scale/src/time.js +0 -85
- package/dist/cjs/bundled_modules/d3-scale/src/utcTime.js +0 -21
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Accent.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Dark2.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Paired.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Pastel1.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Pastel2.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Set1.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Set2.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Set3.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/category10.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/observable10.js +0 -9
- package/dist/cjs/bundled_modules/d3-scale-chromatic/src/colors.js +0 -11
- package/dist/cjs/bundled_modules/d3-shape/src/arc.js +0 -274
- package/dist/cjs/bundled_modules/d3-shape/src/area.js +0 -118
- package/dist/cjs/bundled_modules/d3-shape/src/array.js +0 -11
- package/dist/cjs/bundled_modules/d3-shape/src/constant.js +0 -11
- package/dist/cjs/bundled_modules/d3-shape/src/curve/basis.js +0 -59
- package/dist/cjs/bundled_modules/d3-shape/src/curve/basisClosed.js +0 -58
- package/dist/cjs/bundled_modules/d3-shape/src/curve/basisOpen.js +0 -45
- package/dist/cjs/bundled_modules/d3-shape/src/curve/bundle.js +0 -62
- package/dist/cjs/bundled_modules/d3-shape/src/curve/cardinal.js +0 -69
- package/dist/cjs/bundled_modules/d3-shape/src/curve/cardinalClosed.js +0 -68
- package/dist/cjs/bundled_modules/d3-shape/src/curve/cardinalOpen.js +0 -56
- package/dist/cjs/bundled_modules/d3-shape/src/curve/catmullRom.js +0 -95
- package/dist/cjs/bundled_modules/d3-shape/src/curve/catmullRomClosed.js +0 -80
- package/dist/cjs/bundled_modules/d3-shape/src/curve/catmullRomOpen.js +0 -68
- package/dist/cjs/bundled_modules/d3-shape/src/curve/linear.js +0 -37
- package/dist/cjs/bundled_modules/d3-shape/src/curve/linearClosed.js +0 -31
- package/dist/cjs/bundled_modules/d3-shape/src/curve/monotone.js +0 -109
- package/dist/cjs/bundled_modules/d3-shape/src/curve/natural.js +0 -71
- package/dist/cjs/bundled_modules/d3-shape/src/curve/step.js +0 -61
- package/dist/cjs/bundled_modules/d3-shape/src/line.js +0 -64
- package/dist/cjs/bundled_modules/d3-shape/src/math.js +0 -36
- package/dist/cjs/bundled_modules/d3-shape/src/noop.js +0 -7
- package/dist/cjs/bundled_modules/d3-shape/src/path.js +0 -23
- package/dist/cjs/bundled_modules/d3-shape/src/point.js +0 -12
- package/dist/cjs/bundled_modules/d3-shape/src/symbol/circle.js +0 -15
- package/dist/cjs/bundled_modules/d3-shape/src/symbol.js +0 -38
- package/dist/cjs/bundled_modules/d3-time/src/day.js +0 -41
- package/dist/cjs/bundled_modules/d3-time/src/duration.js +0 -17
- package/dist/cjs/bundled_modules/d3-time/src/hour.js +0 -31
- package/dist/cjs/bundled_modules/d3-time/src/interval.js +0 -73
- package/dist/cjs/bundled_modules/d3-time/src/millisecond.js +0 -29
- package/dist/cjs/bundled_modules/d3-time/src/minute.js +0 -31
- package/dist/cjs/bundled_modules/d3-time/src/month.js +0 -32
- package/dist/cjs/bundled_modules/d3-time/src/second.js +0 -18
- package/dist/cjs/bundled_modules/d3-time/src/ticks.js +0 -64
- package/dist/cjs/bundled_modules/d3-time/src/week.js +0 -73
- package/dist/cjs/bundled_modules/d3-time/src/year.js +0 -54
- package/dist/cjs/bundled_modules/d3-time-format/src/defaultLocale.js +0 -33
- package/dist/cjs/bundled_modules/d3-time-format/src/locale.js +0 -694
- package/dist/cjs/bundled_modules/d3-timer/src/interval.js +0 -23
- package/dist/cjs/bundled_modules/d3-timer/src/timer.js +0 -117
- package/dist/cjs/bundled_modules/delaunator/index.js +0 -485
- package/dist/cjs/bundled_modules/internmap/src/index.js +0 -66
- package/dist/cjs/bundled_modules/json-stringify-pretty-compact/index.js +0 -104
- package/dist/cjs/bundled_modules/robust-predicates/esm/orient2d.js +0 -184
- package/dist/cjs/bundled_modules/robust-predicates/esm/util.js +0 -95
- package/dist/cjs/bundled_modules/topojson-client/src/feature.js +0 -77
- package/dist/cjs/bundled_modules/topojson-client/src/identity.js +0 -9
- package/dist/cjs/bundled_modules/topojson-client/src/mesh.js +0 -60
- package/dist/cjs/bundled_modules/topojson-client/src/reverse.js +0 -10
- package/dist/cjs/bundled_modules/topojson-client/src/stitch.js +0 -79
- package/dist/cjs/bundled_modules/topojson-client/src/transform.js +0 -25
- package/dist/cjs/bundled_modules/vega/build/vega.module.js +0 -272
- package/dist/cjs/bundled_modules/vega-canvas/build/vega-canvas.browser.js +0 -18
- package/dist/cjs/bundled_modules/vega-crossfilter/build/vega-crossfilter.js +0 -676
- package/dist/cjs/bundled_modules/vega-dataflow/build/vega-dataflow.js +0 -2102
- package/dist/cjs/bundled_modules/vega-embed/build/embed.js +0 -2939
- package/dist/cjs/bundled_modules/vega-encode/build/vega-encode.js +0 -962
- package/dist/cjs/bundled_modules/vega-event-selector/build/vega-event-selector.js +0 -192
- package/dist/cjs/bundled_modules/vega-expression/build/vega-expression.js +0 -1615
- package/dist/cjs/bundled_modules/vega-force/build/vega-force.js +0 -295
- package/dist/cjs/bundled_modules/vega-format/build/vega-format.js +0 -201
- package/dist/cjs/bundled_modules/vega-functions/build/vega-functions.js +0 -842
- package/dist/cjs/bundled_modules/vega-geo/build/vega-geo.js +0 -1333
- package/dist/cjs/bundled_modules/vega-hierarchy/build/vega-hierarchy.js +0 -580
- package/dist/cjs/bundled_modules/vega-interpreter/build/vega-interpreter.js +0 -310
- package/dist/cjs/bundled_modules/vega-label/build/vega-label.js +0 -876
- package/dist/cjs/bundled_modules/vega-lite/build/index.js +0 -20157
- package/dist/cjs/bundled_modules/vega-loader/build/vega-loader.browser.js +0 -337
- package/dist/cjs/bundled_modules/vega-parser/build/vega-parser.js +0 -3805
- package/dist/cjs/bundled_modules/vega-projection/build/vega-projection.js +0 -90
- package/dist/cjs/bundled_modules/vega-regression/build/vega-regression.js +0 -236
- package/dist/cjs/bundled_modules/vega-runtime/build/vega-runtime.js +0 -588
- package/dist/cjs/bundled_modules/vega-scale/build/vega-scale.js +0 -846
- package/dist/cjs/bundled_modules/vega-scenegraph/build/vega-scenegraph.js +0 -5040
- package/dist/cjs/bundled_modules/vega-schema-url-parser/dist/parser.modern.js +0 -7
- package/dist/cjs/bundled_modules/vega-selections/build/vega-selection.js +0 -342
- package/dist/cjs/bundled_modules/vega-statistics/build/vega-statistics.js +0 -1193
- package/dist/cjs/bundled_modules/vega-themes/build/index.js +0 -853
- package/dist/cjs/bundled_modules/vega-time/build/vega-time.js +0 -342
- package/dist/cjs/bundled_modules/vega-tooltip/build/index.js +0 -353
- package/dist/cjs/bundled_modules/vega-transforms/build/vega-transforms.js +0 -3781
- package/dist/cjs/bundled_modules/vega-util/build/vega-util.js +0 -824
- package/dist/cjs/bundled_modules/vega-view/build/vega-view.js +0 -1306
- package/dist/cjs/bundled_modules/vega-view-transforms/build/vega-view-transforms.js +0 -1313
- package/dist/cjs/bundled_modules/vega-voronoi/build/vega-voronoi.js +0 -80
- package/dist/cjs/bundled_modules/vega-wordcloud/build/vega-wordcloud.js +0 -540
- package/dist/cjs/styles/entrypoint.scss.js +0 -7
- package/dist/cjs/unstable/Card/components.js +0 -213
- package/dist/cjs/unstable/Card/state.js +0 -53
- package/dist/cjs/unstable/StatCard/index.js +0 -124
- package/dist/cjs/unstable/StatCard/index.module.scss.js +0 -7
- package/dist/cjs/unstable/extras/chart/BarChart.js +0 -42
- package/dist/cjs/unstable/extras/chart/Chart.js +0 -100
- package/dist/cjs/unstable/extras/chart/DistributionChart.js +0 -84
- package/dist/cjs/unstable/extras/chart/DonutChart.js +0 -43
- package/dist/cjs/unstable/extras/chart/LineChart.js +0 -45
- package/dist/cjs/unstable/extras/chart/PieChart.js +0 -39
- package/dist/cjs/unstable/extras/chart/TimelineChart.js +0 -48
- package/dist/cjs/unstable/extras/chart/index.js +0 -23
- package/dist/cjs/unstable/skeleton/index.js +0 -74
- package/dist/cjs/unstable/skeleton/index.module.scss.js +0 -7
- package/dist/cjs/unstable/suspense/index.js +0 -18
- package/dist/cjs/unstable/suspense/index.module.scss.js +0 -7
- package/dist/cjs/unstable/suspense/loader.js +0 -23
- package/dist/esm/bundled_modules/d3-array/src/ascending.js +0 -5
- package/dist/esm/bundled_modules/d3-array/src/bisect.js +0 -10
- package/dist/esm/bundled_modules/d3-array/src/bisector.js +0 -58
- package/dist/esm/bundled_modules/d3-array/src/descending.js +0 -9
- package/dist/esm/bundled_modules/d3-array/src/deviation.js +0 -8
- package/dist/esm/bundled_modules/d3-array/src/fsum.js +0 -43
- package/dist/esm/bundled_modules/d3-array/src/intersection.js +0 -21
- package/dist/esm/bundled_modules/d3-array/src/max.js +0 -22
- package/dist/esm/bundled_modules/d3-array/src/mean.js +0 -21
- package/dist/esm/bundled_modules/d3-array/src/median.js +0 -7
- package/dist/esm/bundled_modules/d3-array/src/merge.js +0 -11
- package/dist/esm/bundled_modules/d3-array/src/min.js +0 -22
- package/dist/esm/bundled_modules/d3-array/src/number.js +0 -22
- package/dist/esm/bundled_modules/d3-array/src/permute.js +0 -5
- package/dist/esm/bundled_modules/d3-array/src/quantile.js +0 -31
- package/dist/esm/bundled_modules/d3-array/src/quickselect.js +0 -55
- package/dist/esm/bundled_modules/d3-array/src/range.js +0 -15
- package/dist/esm/bundled_modules/d3-array/src/sort.js +0 -17
- package/dist/esm/bundled_modules/d3-array/src/sum.js +0 -13
- package/dist/esm/bundled_modules/d3-array/src/ticks.js +0 -57
- package/dist/esm/bundled_modules/d3-array/src/union.js +0 -13
- package/dist/esm/bundled_modules/d3-array/src/variance.js +0 -27
- package/dist/esm/bundled_modules/d3-color/src/color.js +0 -398
- package/dist/esm/bundled_modules/d3-color/src/cubehelix.js +0 -63
- package/dist/esm/bundled_modules/d3-color/src/define.js +0 -12
- package/dist/esm/bundled_modules/d3-color/src/lab.js +0 -117
- package/dist/esm/bundled_modules/d3-color/src/math.js +0 -4
- package/dist/esm/bundled_modules/d3-delaunay/src/delaunay.js +0 -250
- package/dist/esm/bundled_modules/d3-delaunay/src/path.js +0 -39
- package/dist/esm/bundled_modules/d3-delaunay/src/polygon.js +0 -19
- package/dist/esm/bundled_modules/d3-delaunay/src/voronoi.js +0 -334
- package/dist/esm/bundled_modules/d3-dispatch/src/dispatch.js +0 -84
- package/dist/esm/bundled_modules/d3-dsv/src/dsv.js +0 -166
- package/dist/esm/bundled_modules/d3-force/src/center.js +0 -42
- package/dist/esm/bundled_modules/d3-force/src/collide.js +0 -102
- package/dist/esm/bundled_modules/d3-force/src/constant.js +0 -7
- package/dist/esm/bundled_modules/d3-force/src/jiggle.js +0 -5
- package/dist/esm/bundled_modules/d3-force/src/lcg.js +0 -11
- package/dist/esm/bundled_modules/d3-force/src/link.js +0 -119
- package/dist/esm/bundled_modules/d3-force/src/manyBody.js +0 -118
- package/dist/esm/bundled_modules/d3-force/src/simulation.js +0 -158
- package/dist/esm/bundled_modules/d3-force/src/x.js +0 -43
- package/dist/esm/bundled_modules/d3-force/src/y.js +0 -43
- package/dist/esm/bundled_modules/d3-format/src/defaultLocale.js +0 -20
- package/dist/esm/bundled_modules/d3-format/src/exponent.js +0 -7
- package/dist/esm/bundled_modules/d3-format/src/formatDecimal.js +0 -22
- package/dist/esm/bundled_modules/d3-format/src/formatGroup.js +0 -20
- package/dist/esm/bundled_modules/d3-format/src/formatNumerals.js +0 -9
- package/dist/esm/bundled_modules/d3-format/src/formatPrefixAuto.js +0 -18
- package/dist/esm/bundled_modules/d3-format/src/formatRounded.js +0 -13
- package/dist/esm/bundled_modules/d3-format/src/formatSpecifier.js +0 -49
- package/dist/esm/bundled_modules/d3-format/src/formatTrim.js +0 -13
- package/dist/esm/bundled_modules/d3-format/src/formatTypes.js +0 -21
- package/dist/esm/bundled_modules/d3-format/src/identity.js +0 -5
- package/dist/esm/bundled_modules/d3-format/src/locale.js +0 -150
- package/dist/esm/bundled_modules/d3-format/src/precisionFixed.js +0 -7
- package/dist/esm/bundled_modules/d3-format/src/precisionPrefix.js +0 -7
- package/dist/esm/bundled_modules/d3-format/src/precisionRound.js +0 -8
- package/dist/esm/bundled_modules/d3-geo/src/area.js +0 -78
- package/dist/esm/bundled_modules/d3-geo/src/bounds.js +0 -181
- package/dist/esm/bundled_modules/d3-geo/src/cartesian.js +0 -35
- package/dist/esm/bundled_modules/d3-geo/src/centroid.js +0 -145
- package/dist/esm/bundled_modules/d3-geo/src/circle.js +0 -33
- package/dist/esm/bundled_modules/d3-geo/src/clip/antimeridian.js +0 -94
- package/dist/esm/bundled_modules/d3-geo/src/clip/buffer.js +0 -26
- package/dist/esm/bundled_modules/d3-geo/src/clip/circle.js +0 -179
- package/dist/esm/bundled_modules/d3-geo/src/clip/index.js +0 -133
- package/dist/esm/bundled_modules/d3-geo/src/clip/line.js +0 -61
- package/dist/esm/bundled_modules/d3-geo/src/clip/rectangle.js +0 -170
- package/dist/esm/bundled_modules/d3-geo/src/clip/rejoin.js +0 -105
- package/dist/esm/bundled_modules/d3-geo/src/compose.js +0 -14
- package/dist/esm/bundled_modules/d3-geo/src/graticule.js +0 -103
- package/dist/esm/bundled_modules/d3-geo/src/identity.js +0 -3
- package/dist/esm/bundled_modules/d3-geo/src/math.js +0 -33
- package/dist/esm/bundled_modules/d3-geo/src/noop.js +0 -3
- package/dist/esm/bundled_modules/d3-geo/src/path/area.js +0 -50
- package/dist/esm/bundled_modules/d3-geo/src/path/bounds.js +0 -28
- package/dist/esm/bundled_modules/d3-geo/src/path/centroid.js +0 -100
- package/dist/esm/bundled_modules/d3-geo/src/path/context.js +0 -47
- package/dist/esm/bundled_modules/d3-geo/src/path/index.js +0 -78
- package/dist/esm/bundled_modules/d3-geo/src/path/measure.js +0 -45
- package/dist/esm/bundled_modules/d3-geo/src/path/string.js +0 -88
- package/dist/esm/bundled_modules/d3-geo/src/pointEqual.js +0 -7
- package/dist/esm/bundled_modules/d3-geo/src/polygonContains.js +0 -76
- package/dist/esm/bundled_modules/d3-geo/src/projection/albers.js +0 -12
- package/dist/esm/bundled_modules/d3-geo/src/projection/albersUsa.js +0 -113
- package/dist/esm/bundled_modules/d3-geo/src/projection/azimuthal.js +0 -29
- package/dist/esm/bundled_modules/d3-geo/src/projection/azimuthalEqualArea.js +0 -19
- package/dist/esm/bundled_modules/d3-geo/src/projection/azimuthalEquidistant.js +0 -19
- package/dist/esm/bundled_modules/d3-geo/src/projection/conic.js +0 -17
- package/dist/esm/bundled_modules/d3-geo/src/projection/conicConformal.js +0 -40
- package/dist/esm/bundled_modules/d3-geo/src/projection/conicEqualArea.js +0 -35
- package/dist/esm/bundled_modules/d3-geo/src/projection/conicEquidistant.js +0 -34
- package/dist/esm/bundled_modules/d3-geo/src/projection/cylindricalEqualArea.js +0 -17
- package/dist/esm/bundled_modules/d3-geo/src/projection/equalEarth.js +0 -38
- package/dist/esm/bundled_modules/d3-geo/src/projection/equirectangular.js +0 -14
- package/dist/esm/bundled_modules/d3-geo/src/projection/fit.js +0 -49
- package/dist/esm/bundled_modules/d3-geo/src/projection/gnomonic.js +0 -18
- package/dist/esm/bundled_modules/d3-geo/src/projection/identity.js +0 -87
- package/dist/esm/bundled_modules/d3-geo/src/projection/index.js +0 -179
- package/dist/esm/bundled_modules/d3-geo/src/projection/mercator.js +0 -54
- package/dist/esm/bundled_modules/d3-geo/src/projection/naturalEarth1.js +0 -30
- package/dist/esm/bundled_modules/d3-geo/src/projection/orthographic.js +0 -17
- package/dist/esm/bundled_modules/d3-geo/src/projection/resample.js +0 -104
- package/dist/esm/bundled_modules/d3-geo/src/projection/stereographic.js +0 -20
- package/dist/esm/bundled_modules/d3-geo/src/projection/transverseMercator.js +0 -29
- package/dist/esm/bundled_modules/d3-geo/src/rotation.js +0 -81
- package/dist/esm/bundled_modules/d3-geo/src/stream.js +0 -71
- package/dist/esm/bundled_modules/d3-geo/src/transform.js +0 -22
- package/dist/esm/bundled_modules/d3-geo-projection/src/math.js +0 -18
- package/dist/esm/bundled_modules/d3-geo-projection/src/mollweide.js +0 -31
- package/dist/esm/bundled_modules/d3-hierarchy/src/accessors.js +0 -10
- package/dist/esm/bundled_modules/d3-hierarchy/src/array.js +0 -22
- package/dist/esm/bundled_modules/d3-hierarchy/src/cluster.js +0 -86
- package/dist/esm/bundled_modules/d3-hierarchy/src/constant.js +0 -11
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/ancestors.js +0 -9
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/count.js +0 -14
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/descendants.js +0 -5
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/each.js +0 -9
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/eachAfter.js +0 -17
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/eachBefore.js +0 -14
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/find.js +0 -10
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/index.js +0 -93
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/iterator.js +0 -16
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/leaves.js +0 -11
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/links.js +0 -11
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/path.js +0 -32
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/sort.js +0 -9
- package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/sum.js +0 -11
- package/dist/esm/bundled_modules/d3-hierarchy/src/lcg.js +0 -11
- package/dist/esm/bundled_modules/d3-hierarchy/src/pack/enclose.js +0 -120
- package/dist/esm/bundled_modules/d3-hierarchy/src/pack/index.js +0 -83
- package/dist/esm/bundled_modules/d3-hierarchy/src/pack/siblings.js +0 -116
- package/dist/esm/bundled_modules/d3-hierarchy/src/partition.js +0 -54
- package/dist/esm/bundled_modules/d3-hierarchy/src/stratify.js +0 -147
- package/dist/esm/bundled_modules/d3-hierarchy/src/tree.js +0 -239
- package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/binary.js +0 -48
- package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/dice.js +0 -14
- package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/index.js +0 -96
- package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/resquarify.js +0 -38
- package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/round.js +0 -8
- package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/slice.js +0 -14
- package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/sliceDice.js +0 -8
- package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/squarify.js +0 -68
- package/dist/esm/bundled_modules/d3-interpolate/src/array.js +0 -24
- package/dist/esm/bundled_modules/d3-interpolate/src/basis.js +0 -21
- package/dist/esm/bundled_modules/d3-interpolate/src/basisClosed.js +0 -15
- package/dist/esm/bundled_modules/d3-interpolate/src/color.js +0 -31
- package/dist/esm/bundled_modules/d3-interpolate/src/constant.js +0 -3
- package/dist/esm/bundled_modules/d3-interpolate/src/cubehelix.js +0 -31
- package/dist/esm/bundled_modules/d3-interpolate/src/date.js +0 -8
- package/dist/esm/bundled_modules/d3-interpolate/src/discrete.js +0 -8
- package/dist/esm/bundled_modules/d3-interpolate/src/hcl.js +0 -23
- package/dist/esm/bundled_modules/d3-interpolate/src/hsl.js +0 -23
- package/dist/esm/bundled_modules/d3-interpolate/src/hue.js +0 -11
- package/dist/esm/bundled_modules/d3-interpolate/src/index.js +0 -21
- package/dist/esm/bundled_modules/d3-interpolate/src/lab.js +0 -18
- package/dist/esm/bundled_modules/d3-interpolate/src/number.js +0 -7
- package/dist/esm/bundled_modules/d3-interpolate/src/numberArray.js +0 -16
- package/dist/esm/bundled_modules/d3-interpolate/src/object.js +0 -25
- package/dist/esm/bundled_modules/d3-interpolate/src/piecewise.js +0 -13
- package/dist/esm/bundled_modules/d3-interpolate/src/quantize.js +0 -7
- package/dist/esm/bundled_modules/d3-interpolate/src/rgb.js +0 -57
- package/dist/esm/bundled_modules/d3-interpolate/src/round.js +0 -7
- package/dist/esm/bundled_modules/d3-interpolate/src/string.js +0 -66
- package/dist/esm/bundled_modules/d3-interpolate/src/transform/decompose.js +0 -28
- package/dist/esm/bundled_modules/d3-interpolate/src/transform/index.js +0 -65
- package/dist/esm/bundled_modules/d3-interpolate/src/transform/parse.js +0 -20
- package/dist/esm/bundled_modules/d3-interpolate/src/value.js +0 -24
- package/dist/esm/bundled_modules/d3-interpolate/src/zoom.js +0 -73
- package/dist/esm/bundled_modules/d3-path/src/path.js +0 -154
- package/dist/esm/bundled_modules/d3-quadtree/src/add.js +0 -86
- package/dist/esm/bundled_modules/d3-quadtree/src/cover.js +0 -45
- package/dist/esm/bundled_modules/d3-quadtree/src/data.js +0 -9
- package/dist/esm/bundled_modules/d3-quadtree/src/extent.js +0 -7
- package/dist/esm/bundled_modules/d3-quadtree/src/find.js +0 -72
- package/dist/esm/bundled_modules/d3-quadtree/src/quad.js +0 -9
- package/dist/esm/bundled_modules/d3-quadtree/src/quadtree.js +0 -75
- package/dist/esm/bundled_modules/d3-quadtree/src/remove.js +0 -64
- package/dist/esm/bundled_modules/d3-quadtree/src/root.js +0 -5
- package/dist/esm/bundled_modules/d3-quadtree/src/size.js +0 -9
- package/dist/esm/bundled_modules/d3-quadtree/src/visit.js +0 -18
- package/dist/esm/bundled_modules/d3-quadtree/src/visitAfter.js +0 -23
- package/dist/esm/bundled_modules/d3-quadtree/src/x.js +0 -9
- package/dist/esm/bundled_modules/d3-quadtree/src/y.js +0 -9
- package/dist/esm/bundled_modules/d3-scale/src/constant.js +0 -7
- package/dist/esm/bundled_modules/d3-scale/src/continuous.js +0 -129
- package/dist/esm/bundled_modules/d3-scale/src/diverging.js +0 -108
- package/dist/esm/bundled_modules/d3-scale/src/identity.js +0 -30
- package/dist/esm/bundled_modules/d3-scale/src/init.js +0 -28
- package/dist/esm/bundled_modules/d3-scale/src/linear.js +0 -72
- package/dist/esm/bundled_modules/d3-scale/src/log.js +0 -143
- package/dist/esm/bundled_modules/d3-scale/src/nice.js +0 -20
- package/dist/esm/bundled_modules/d3-scale/src/number.js +0 -5
- package/dist/esm/bundled_modules/d3-scale/src/ordinal.js +0 -48
- package/dist/esm/bundled_modules/d3-scale/src/pow.js +0 -52
- package/dist/esm/bundled_modules/d3-scale/src/quantile.js +0 -61
- package/dist/esm/bundled_modules/d3-scale/src/quantize.js +0 -58
- package/dist/esm/bundled_modules/d3-scale/src/sequential.js +0 -110
- package/dist/esm/bundled_modules/d3-scale/src/symlog.js +0 -37
- package/dist/esm/bundled_modules/d3-scale/src/threshold.js +0 -41
- package/dist/esm/bundled_modules/d3-scale/src/tickFormat.js +0 -35
- package/dist/esm/bundled_modules/d3-scale/src/time.js +0 -80
- package/dist/esm/bundled_modules/d3-scale/src/utcTime.js +0 -17
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Accent.js +0 -5
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Dark2.js +0 -5
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Paired.js +0 -5
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Pastel1.js +0 -5
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Pastel2.js +0 -5
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Set1.js +0 -5
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Set2.js +0 -5
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Set3.js +0 -5
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/category10.js +0 -5
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/observable10.js +0 -5
- package/dist/esm/bundled_modules/d3-scale-chromatic/src/colors.js +0 -7
- package/dist/esm/bundled_modules/d3-shape/src/arc.js +0 -270
- package/dist/esm/bundled_modules/d3-shape/src/area.js +0 -114
- package/dist/esm/bundled_modules/d3-shape/src/array.js +0 -7
- package/dist/esm/bundled_modules/d3-shape/src/constant.js +0 -7
- package/dist/esm/bundled_modules/d3-shape/src/curve/basis.js +0 -53
- package/dist/esm/bundled_modules/d3-shape/src/curve/basisClosed.js +0 -54
- package/dist/esm/bundled_modules/d3-shape/src/curve/basisOpen.js +0 -41
- package/dist/esm/bundled_modules/d3-shape/src/curve/bundle.js +0 -58
- package/dist/esm/bundled_modules/d3-shape/src/curve/cardinal.js +0 -63
- package/dist/esm/bundled_modules/d3-shape/src/curve/cardinalClosed.js +0 -63
- package/dist/esm/bundled_modules/d3-shape/src/curve/cardinalOpen.js +0 -51
- package/dist/esm/bundled_modules/d3-shape/src/curve/catmullRom.js +0 -90
- package/dist/esm/bundled_modules/d3-shape/src/curve/catmullRomClosed.js +0 -76
- package/dist/esm/bundled_modules/d3-shape/src/curve/catmullRomOpen.js +0 -64
- package/dist/esm/bundled_modules/d3-shape/src/curve/linear.js +0 -33
- package/dist/esm/bundled_modules/d3-shape/src/curve/linearClosed.js +0 -27
- package/dist/esm/bundled_modules/d3-shape/src/curve/monotone.js +0 -106
- package/dist/esm/bundled_modules/d3-shape/src/curve/natural.js +0 -67
- package/dist/esm/bundled_modules/d3-shape/src/curve/step.js +0 -55
- package/dist/esm/bundled_modules/d3-shape/src/line.js +0 -60
- package/dist/esm/bundled_modules/d3-shape/src/math.js +0 -22
- package/dist/esm/bundled_modules/d3-shape/src/noop.js +0 -3
- package/dist/esm/bundled_modules/d3-shape/src/path.js +0 -21
- package/dist/esm/bundled_modules/d3-shape/src/point.js +0 -9
- package/dist/esm/bundled_modules/d3-shape/src/symbol/circle.js +0 -11
- package/dist/esm/bundled_modules/d3-shape/src/symbol.js +0 -34
- package/dist/esm/bundled_modules/d3-time/src/day.js +0 -37
- package/dist/esm/bundled_modules/d3-time/src/duration.js +0 -9
- package/dist/esm/bundled_modules/d3-time/src/hour.js +0 -28
- package/dist/esm/bundled_modules/d3-time/src/interval.js +0 -71
- package/dist/esm/bundled_modules/d3-time/src/millisecond.js +0 -27
- package/dist/esm/bundled_modules/d3-time/src/minute.js +0 -28
- package/dist/esm/bundled_modules/d3-time/src/month.js +0 -29
- package/dist/esm/bundled_modules/d3-time/src/second.js +0 -16
- package/dist/esm/bundled_modules/d3-time/src/ticks.js +0 -59
- package/dist/esm/bundled_modules/d3-time/src/week.js +0 -58
- package/dist/esm/bundled_modules/d3-time/src/year.js +0 -51
- package/dist/esm/bundled_modules/d3-time-format/src/defaultLocale.js +0 -29
- package/dist/esm/bundled_modules/d3-time-format/src/locale.js +0 -690
- package/dist/esm/bundled_modules/d3-timer/src/interval.js +0 -19
- package/dist/esm/bundled_modules/d3-timer/src/timer.js +0 -112
- package/dist/esm/bundled_modules/delaunator/index.js +0 -481
- package/dist/esm/bundled_modules/internmap/src/index.js +0 -63
- package/dist/esm/bundled_modules/json-stringify-pretty-compact/index.js +0 -100
- package/dist/esm/bundled_modules/robust-predicates/esm/orient2d.js +0 -182
- package/dist/esm/bundled_modules/robust-predicates/esm/util.js +0 -88
- package/dist/esm/bundled_modules/topojson-client/src/feature.js +0 -72
- package/dist/esm/bundled_modules/topojson-client/src/identity.js +0 -5
- package/dist/esm/bundled_modules/topojson-client/src/mesh.js +0 -55
- package/dist/esm/bundled_modules/topojson-client/src/reverse.js +0 -6
- package/dist/esm/bundled_modules/topojson-client/src/stitch.js +0 -75
- package/dist/esm/bundled_modules/topojson-client/src/transform.js +0 -21
- package/dist/esm/bundled_modules/vega/build/vega.module.js +0 -38
- package/dist/esm/bundled_modules/vega-canvas/build/vega-canvas.browser.js +0 -14
- package/dist/esm/bundled_modules/vega-crossfilter/build/vega-crossfilter.js +0 -673
- package/dist/esm/bundled_modules/vega-dataflow/build/vega-dataflow.js +0 -2080
- package/dist/esm/bundled_modules/vega-embed/build/embed.js +0 -2932
- package/dist/esm/bundled_modules/vega-encode/build/vega-encode.js +0 -952
- package/dist/esm/bundled_modules/vega-event-selector/build/vega-event-selector.js +0 -190
- package/dist/esm/bundled_modules/vega-expression/build/vega-expression.js +0 -1597
- package/dist/esm/bundled_modules/vega-force/build/vega-force.js +0 -293
- package/dist/esm/bundled_modules/vega-format/build/vega-format.js +0 -191
- package/dist/esm/bundled_modules/vega-functions/build/vega-functions.js +0 -779
- package/dist/esm/bundled_modules/vega-geo/build/vega-geo.js +0 -1322
- package/dist/esm/bundled_modules/vega-hierarchy/build/vega-hierarchy.js +0 -572
- package/dist/esm/bundled_modules/vega-interpreter/build/vega-interpreter.js +0 -308
- package/dist/esm/bundled_modules/vega-label/build/vega-label.js +0 -874
- package/dist/esm/bundled_modules/vega-lite/build/index.js +0 -20110
- package/dist/esm/bundled_modules/vega-loader/build/vega-loader.browser.js +0 -328
- package/dist/esm/bundled_modules/vega-parser/build/vega-parser.js +0 -3783
- package/dist/esm/bundled_modules/vega-projection/build/vega-projection.js +0 -86
- package/dist/esm/bundled_modules/vega-regression/build/vega-regression.js +0 -233
- package/dist/esm/bundled_modules/vega-runtime/build/vega-runtime.js +0 -586
- package/dist/esm/bundled_modules/vega-scale/build/vega-scale.js +0 -799
- package/dist/esm/bundled_modules/vega-scenegraph/build/vega-scenegraph.js +0 -4982
- package/dist/esm/bundled_modules/vega-schema-url-parser/dist/parser.modern.js +0 -3
- package/dist/esm/bundled_modules/vega-selections/build/vega-selection.js +0 -336
- package/dist/esm/bundled_modules/vega-statistics/build/vega-statistics.js +0 -1157
- package/dist/esm/bundled_modules/vega-themes/build/index.js +0 -837
- package/dist/esm/bundled_modules/vega-time/build/vega-time.js +0 -314
- package/dist/esm/bundled_modules/vega-tooltip/build/index.js +0 -339
- package/dist/esm/bundled_modules/vega-transforms/build/vega-transforms.js +0 -3740
- package/dist/esm/bundled_modules/vega-util/build/vega-util.js +0 -753
- package/dist/esm/bundled_modules/vega-view/build/vega-view.js +0 -1304
- package/dist/esm/bundled_modules/vega-view-transforms/build/vega-view-transforms.js +0 -1306
- package/dist/esm/bundled_modules/vega-voronoi/build/vega-voronoi.js +0 -78
- package/dist/esm/bundled_modules/vega-wordcloud/build/vega-wordcloud.js +0 -538
- package/dist/esm/styles/entrypoint.scss.js +0 -3
- package/dist/esm/unstable/Card/components.js +0 -182
- package/dist/esm/unstable/Card/state.js +0 -30
- package/dist/esm/unstable/StatCard/index.js +0 -116
- package/dist/esm/unstable/StatCard/index.module.scss.js +0 -3
- package/dist/esm/unstable/extras/chart/BarChart.js +0 -40
- package/dist/esm/unstable/extras/chart/Chart.js +0 -96
- package/dist/esm/unstable/extras/chart/DistributionChart.js +0 -82
- package/dist/esm/unstable/extras/chart/DonutChart.js +0 -41
- package/dist/esm/unstable/extras/chart/LineChart.js +0 -43
- package/dist/esm/unstable/extras/chart/PieChart.js +0 -37
- package/dist/esm/unstable/extras/chart/TimelineChart.js +0 -46
- package/dist/esm/unstable/extras/chart/index.js +0 -8
- package/dist/esm/unstable/skeleton/index.js +0 -69
- package/dist/esm/unstable/skeleton/index.module.scss.js +0 -3
- package/dist/esm/unstable/suspense/index.js +0 -15
- package/dist/esm/unstable/suspense/index.module.scss.js +0 -3
- package/dist/esm/unstable/suspense/loader.js +0 -20
- package/dist/types/unstable/Card/components.d.ts +0 -90
- package/dist/types/unstable/Card/state.d.ts +0 -20
- package/dist/types/unstable/StatCard/index.d.ts +0 -33
- package/dist/types/unstable/extras/chart/BarChart.d.ts +0 -16
- package/dist/types/unstable/extras/chart/Chart.d.ts +0 -33
- package/dist/types/unstable/extras/chart/DistributionChart.d.ts +0 -18
- package/dist/types/unstable/extras/chart/DonutChart.d.ts +0 -16
- package/dist/types/unstable/extras/chart/LineChart.d.ts +0 -16
- package/dist/types/unstable/extras/chart/PieChart.d.ts +0 -14
- package/dist/types/unstable/extras/chart/TimelineChart.d.ts +0 -15
- package/dist/types/unstable/skeleton/index.d.ts +0 -15
- package/dist/types/unstable/suspense/index.d.ts +0 -9
- package/dist/types/unstable/suspense/loader.d.ts +0 -7
|
@@ -1,3783 +0,0 @@
|
|
|
1
|
-
import { stringValue as $, isObject, error, mergeConfig, array, hasOwnProperty as has$1, extend, isArray, isString, peek, splitAccessPath } from '../../vega-util/build/vega-util.js';
|
|
2
|
-
import { parseExpression as parser } from '../../vega-functions/build/vega-functions.js';
|
|
3
|
-
import { parseSelector as eventSelector } from '../../vega-event-selector/build/vega-event-selector.js';
|
|
4
|
-
import { isValidScaleType, isDiscrete, isContinuous, isDiscretizing, isQuantile } from '../../vega-scale/build/vega-scale.js';
|
|
5
|
-
import { definition as definition$1 } from '../../vega-dataflow/build/vega-dataflow.js';
|
|
6
|
-
|
|
7
|
-
function parseAutosize (spec) {
|
|
8
|
-
return isObject(spec) ? spec : {
|
|
9
|
-
type: spec || 'pad'
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const number = _ => +_ || 0;
|
|
14
|
-
const paddingObject = _ => ({
|
|
15
|
-
top: _,
|
|
16
|
-
bottom: _,
|
|
17
|
-
left: _,
|
|
18
|
-
right: _
|
|
19
|
-
});
|
|
20
|
-
function parsePadding (spec) {
|
|
21
|
-
return !isObject(spec) ? paddingObject(number(spec)) : spec.signal ? spec : {
|
|
22
|
-
top: number(spec.top),
|
|
23
|
-
bottom: number(spec.bottom),
|
|
24
|
-
left: number(spec.left),
|
|
25
|
-
right: number(spec.right)
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const encoder = _ => isObject(_) && !isArray(_) ? extend({}, _) : {
|
|
30
|
-
value: _
|
|
31
|
-
};
|
|
32
|
-
function addEncode(object, name, value, set) {
|
|
33
|
-
if (value != null) {
|
|
34
|
-
const isEncoder = isObject(value) && !isArray(value) || isArray(value) && value.length && isObject(value[0]);
|
|
35
|
-
|
|
36
|
-
// Always assign signal to update, even if the signal is from the enter block
|
|
37
|
-
if (isEncoder) {
|
|
38
|
-
object.update[name] = value;
|
|
39
|
-
} else {
|
|
40
|
-
object[set || 'enter'][name] = {
|
|
41
|
-
value: value
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
return 1;
|
|
45
|
-
} else {
|
|
46
|
-
return 0;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function addEncoders(object, enter, update) {
|
|
50
|
-
for (const name in enter) {
|
|
51
|
-
addEncode(object, name, enter[name]);
|
|
52
|
-
}
|
|
53
|
-
for (const name in update) {
|
|
54
|
-
addEncode(object, name, update[name], 'update');
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
function extendEncode(encode, extra, skip) {
|
|
58
|
-
for (const name in extra) {
|
|
59
|
-
if (skip && has$1(skip, name)) continue;
|
|
60
|
-
encode[name] = extend(encode[name] || {}, extra[name]);
|
|
61
|
-
}
|
|
62
|
-
return encode;
|
|
63
|
-
}
|
|
64
|
-
function has(key, encode) {
|
|
65
|
-
return encode && (encode.enter && encode.enter[key] || encode.update && encode.update[key]);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const MarkRole = 'mark';
|
|
69
|
-
const FrameRole = 'frame';
|
|
70
|
-
const ScopeRole = 'scope';
|
|
71
|
-
const AxisRole = 'axis';
|
|
72
|
-
const AxisDomainRole = 'axis-domain';
|
|
73
|
-
const AxisGridRole = 'axis-grid';
|
|
74
|
-
const AxisLabelRole = 'axis-label';
|
|
75
|
-
const AxisTickRole = 'axis-tick';
|
|
76
|
-
const AxisTitleRole = 'axis-title';
|
|
77
|
-
const LegendRole = 'legend';
|
|
78
|
-
const LegendBandRole = 'legend-band';
|
|
79
|
-
const LegendEntryRole = 'legend-entry';
|
|
80
|
-
const LegendGradientRole = 'legend-gradient';
|
|
81
|
-
const LegendLabelRole = 'legend-label';
|
|
82
|
-
const LegendSymbolRole = 'legend-symbol';
|
|
83
|
-
const LegendTitleRole = 'legend-title';
|
|
84
|
-
const TitleRole = 'title';
|
|
85
|
-
const TitleTextRole = 'title-text';
|
|
86
|
-
const TitleSubtitleRole = 'title-subtitle';
|
|
87
|
-
|
|
88
|
-
function applyDefaults (encode, type, role, style, config) {
|
|
89
|
-
const defaults = {},
|
|
90
|
-
enter = {};
|
|
91
|
-
let update, key, skip, props;
|
|
92
|
-
|
|
93
|
-
// if text mark, apply global lineBreak settings (#2370)
|
|
94
|
-
key = 'lineBreak';
|
|
95
|
-
if (type === 'text' && config[key] != null && !has(key, encode)) {
|
|
96
|
-
applyDefault(defaults, key, config[key]);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// ignore legend and axis roles
|
|
100
|
-
if (role == 'legend' || String(role).startsWith('axis')) {
|
|
101
|
-
role = null;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// resolve mark config
|
|
105
|
-
props = role === FrameRole ? config.group : role === MarkRole ? extend({}, config.mark, config[type]) : null;
|
|
106
|
-
for (key in props) {
|
|
107
|
-
// do not apply defaults if relevant fields are defined
|
|
108
|
-
skip = has(key, encode) || (key === 'fill' || key === 'stroke') && (has('fill', encode) || has('stroke', encode));
|
|
109
|
-
if (!skip) applyDefault(defaults, key, props[key]);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// resolve styles, apply with increasing precedence
|
|
113
|
-
array(style).forEach(name => {
|
|
114
|
-
const props = config.style && config.style[name];
|
|
115
|
-
for (const key in props) {
|
|
116
|
-
if (!has(key, encode)) {
|
|
117
|
-
applyDefault(defaults, key, props[key]);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
encode = extend({}, encode); // defensive copy
|
|
122
|
-
for (key in defaults) {
|
|
123
|
-
props = defaults[key];
|
|
124
|
-
if (props.signal) {
|
|
125
|
-
(update = update || {})[key] = props;
|
|
126
|
-
} else {
|
|
127
|
-
enter[key] = props;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
encode.enter = extend(enter, encode.enter);
|
|
131
|
-
if (update) encode.update = extend(update, encode.update);
|
|
132
|
-
return encode;
|
|
133
|
-
}
|
|
134
|
-
function applyDefault(defaults, key, value) {
|
|
135
|
-
defaults[key] = value && value.signal ? {
|
|
136
|
-
signal: value.signal
|
|
137
|
-
} : {
|
|
138
|
-
value: value
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const scaleRef = scale => isString(scale) ? $(scale) : scale.signal ? `(${scale.signal})` : field(scale);
|
|
143
|
-
function entry$1(enc) {
|
|
144
|
-
if (enc.gradient != null) {
|
|
145
|
-
return gradient(enc);
|
|
146
|
-
}
|
|
147
|
-
let value = enc.signal ? `(${enc.signal})` : enc.color ? color(enc.color) : enc.field != null ? field(enc.field) : enc.value !== undefined ? $(enc.value) : undefined;
|
|
148
|
-
if (enc.scale != null) {
|
|
149
|
-
value = scale(enc, value);
|
|
150
|
-
}
|
|
151
|
-
if (value === undefined) {
|
|
152
|
-
value = null;
|
|
153
|
-
}
|
|
154
|
-
if (enc.exponent != null) {
|
|
155
|
-
value = `pow(${value},${property(enc.exponent)})`;
|
|
156
|
-
}
|
|
157
|
-
if (enc.mult != null) {
|
|
158
|
-
value += `*${property(enc.mult)}`;
|
|
159
|
-
}
|
|
160
|
-
if (enc.offset != null) {
|
|
161
|
-
value += `+${property(enc.offset)}`;
|
|
162
|
-
}
|
|
163
|
-
if (enc.round) {
|
|
164
|
-
value = `round(${value})`;
|
|
165
|
-
}
|
|
166
|
-
return value;
|
|
167
|
-
}
|
|
168
|
-
const _color = (type, x, y, z) => `(${type}(${[x, y, z].map(entry$1).join(',')})+'')`;
|
|
169
|
-
function color(enc) {
|
|
170
|
-
return enc.c ? _color('hcl', enc.h, enc.c, enc.l) : enc.h || enc.s ? _color('hsl', enc.h, enc.s, enc.l) : enc.l || enc.a ? _color('lab', enc.l, enc.a, enc.b) : enc.r || enc.g || enc.b ? _color('rgb', enc.r, enc.g, enc.b) : null;
|
|
171
|
-
}
|
|
172
|
-
function gradient(enc) {
|
|
173
|
-
// map undefined to null; expression lang does not allow undefined
|
|
174
|
-
const args = [enc.start, enc.stop, enc.count].map(_ => _ == null ? null : $(_));
|
|
175
|
-
|
|
176
|
-
// trim null inputs from the end
|
|
177
|
-
while (args.length && peek(args) == null) args.pop();
|
|
178
|
-
args.unshift(scaleRef(enc.gradient));
|
|
179
|
-
return `gradient(${args.join(',')})`;
|
|
180
|
-
}
|
|
181
|
-
function property(property) {
|
|
182
|
-
return isObject(property) ? '(' + entry$1(property) + ')' : property;
|
|
183
|
-
}
|
|
184
|
-
function field(ref) {
|
|
185
|
-
return resolveField(isObject(ref) ? ref : {
|
|
186
|
-
datum: ref
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
function resolveField(ref) {
|
|
190
|
-
let object, level, field;
|
|
191
|
-
if (ref.signal) {
|
|
192
|
-
object = 'datum';
|
|
193
|
-
field = ref.signal;
|
|
194
|
-
} else if (ref.group || ref.parent) {
|
|
195
|
-
level = Math.max(1, ref.level || 1);
|
|
196
|
-
object = 'item';
|
|
197
|
-
while (level-- > 0) {
|
|
198
|
-
object += '.mark.group';
|
|
199
|
-
}
|
|
200
|
-
if (ref.parent) {
|
|
201
|
-
field = ref.parent;
|
|
202
|
-
object += '.datum';
|
|
203
|
-
} else {
|
|
204
|
-
field = ref.group;
|
|
205
|
-
}
|
|
206
|
-
} else if (ref.datum) {
|
|
207
|
-
object = 'datum';
|
|
208
|
-
field = ref.datum;
|
|
209
|
-
} else {
|
|
210
|
-
error('Invalid field reference: ' + $(ref));
|
|
211
|
-
}
|
|
212
|
-
if (!ref.signal) {
|
|
213
|
-
field = isString(field) ? splitAccessPath(field).map($).join('][') : resolveField(field);
|
|
214
|
-
}
|
|
215
|
-
return object + '[' + field + ']';
|
|
216
|
-
}
|
|
217
|
-
function scale(enc, value) {
|
|
218
|
-
const scale = scaleRef(enc.scale);
|
|
219
|
-
if (enc.range != null) {
|
|
220
|
-
// pull value from scale range
|
|
221
|
-
value = `lerp(_range(${scale}), ${+enc.range})`;
|
|
222
|
-
} else {
|
|
223
|
-
// run value through scale and/or pull scale bandwidth
|
|
224
|
-
if (value !== undefined) value = `_scale(${scale}, ${value})`;
|
|
225
|
-
if (enc.band) {
|
|
226
|
-
value = (value ? value + '+' : '') + `_bandwidth(${scale})` + (+enc.band === 1 ? '' : '*' + property(enc.band));
|
|
227
|
-
if (enc.extra) {
|
|
228
|
-
// include logic to handle extraneous elements
|
|
229
|
-
value = `(datum.extra ? _scale(${scale}, datum.extra.value) : ${value})`;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
if (value == null) value = '0';
|
|
233
|
-
}
|
|
234
|
-
return value;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
function rule (enc) {
|
|
238
|
-
let code = '';
|
|
239
|
-
enc.forEach(rule => {
|
|
240
|
-
const value = entry$1(rule);
|
|
241
|
-
code += rule.test ? `(${rule.test})?${value}:` : value;
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
// if no else clause, terminate with null (#1366)
|
|
245
|
-
if (peek(code) === ':') {
|
|
246
|
-
code += 'null';
|
|
247
|
-
}
|
|
248
|
-
return code;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
function parseEncode (encode, type, role, style, scope, params) {
|
|
252
|
-
const enc = {};
|
|
253
|
-
params = params || {};
|
|
254
|
-
params.encoders = {
|
|
255
|
-
$encode: enc
|
|
256
|
-
};
|
|
257
|
-
encode = applyDefaults(encode, type, role, style, scope.config);
|
|
258
|
-
for (const key in encode) {
|
|
259
|
-
enc[key] = parseBlock(encode[key], type, params, scope);
|
|
260
|
-
}
|
|
261
|
-
return params;
|
|
262
|
-
}
|
|
263
|
-
function parseBlock(block, marktype, params, scope) {
|
|
264
|
-
const channels = {},
|
|
265
|
-
fields = {};
|
|
266
|
-
for (const name in block) {
|
|
267
|
-
if (block[name] != null) {
|
|
268
|
-
// skip any null entries
|
|
269
|
-
channels[name] = parse$1(expr(block[name]), scope, params, fields);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
return {
|
|
273
|
-
$expr: {
|
|
274
|
-
marktype,
|
|
275
|
-
channels
|
|
276
|
-
},
|
|
277
|
-
$fields: Object.keys(fields),
|
|
278
|
-
$output: Object.keys(block)
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
function expr(enc) {
|
|
282
|
-
return isArray(enc) ? rule(enc) : entry$1(enc);
|
|
283
|
-
}
|
|
284
|
-
function parse$1(code, scope, params, fields) {
|
|
285
|
-
const expr = parser(code, scope);
|
|
286
|
-
expr.$fields.forEach(name => fields[name] = 1);
|
|
287
|
-
extend(params, expr.$params);
|
|
288
|
-
return expr.$expr;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
const OUTER = 'outer',
|
|
292
|
-
OUTER_INVALID = ['value', 'update', 'init', 'react', 'bind'];
|
|
293
|
-
function outerError(prefix, name) {
|
|
294
|
-
error(prefix + ' for "outer" push: ' + $(name));
|
|
295
|
-
}
|
|
296
|
-
function parseSignal (signal, scope) {
|
|
297
|
-
const name = signal.name;
|
|
298
|
-
if (signal.push === OUTER) {
|
|
299
|
-
// signal must already be defined, raise error if not
|
|
300
|
-
if (!scope.signals[name]) outerError('No prior signal definition', name);
|
|
301
|
-
// signal push must not use properties reserved for standard definition
|
|
302
|
-
OUTER_INVALID.forEach(prop => {
|
|
303
|
-
if (signal[prop] !== undefined) outerError('Invalid property ', prop);
|
|
304
|
-
});
|
|
305
|
-
} else {
|
|
306
|
-
// define a new signal in the current scope
|
|
307
|
-
const op = scope.addSignal(name, signal.value);
|
|
308
|
-
if (signal.react === false) op.react = false;
|
|
309
|
-
if (signal.bind) scope.addBinding(name, signal.bind);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
function Entry(type, value, params, parent) {
|
|
314
|
-
this.id = -1;
|
|
315
|
-
this.type = type;
|
|
316
|
-
this.value = value;
|
|
317
|
-
this.params = params;
|
|
318
|
-
if (parent) this.parent = parent;
|
|
319
|
-
}
|
|
320
|
-
function entry(type, value, params, parent) {
|
|
321
|
-
return new Entry(type, value, params, parent);
|
|
322
|
-
}
|
|
323
|
-
function operator(value, params) {
|
|
324
|
-
return entry('operator', value, params);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// -----
|
|
328
|
-
|
|
329
|
-
function ref(op) {
|
|
330
|
-
const ref = {
|
|
331
|
-
$ref: op.id
|
|
332
|
-
};
|
|
333
|
-
// if operator not yet registered, cache ref to resolve later
|
|
334
|
-
if (op.id < 0) (op.refs = op.refs || []).push(ref);
|
|
335
|
-
return ref;
|
|
336
|
-
}
|
|
337
|
-
function fieldRef$1(field, name) {
|
|
338
|
-
return name ? {
|
|
339
|
-
$field: field,
|
|
340
|
-
$name: name
|
|
341
|
-
} : {
|
|
342
|
-
$field: field
|
|
343
|
-
};
|
|
344
|
-
}
|
|
345
|
-
const keyFieldRef = fieldRef$1('key');
|
|
346
|
-
function compareRef(fields, orders) {
|
|
347
|
-
return {
|
|
348
|
-
$compare: fields,
|
|
349
|
-
$order: orders
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
function keyRef(fields, flat) {
|
|
353
|
-
const ref = {
|
|
354
|
-
$key: fields
|
|
355
|
-
};
|
|
356
|
-
if (flat) ref.$flat = true;
|
|
357
|
-
return ref;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// -----
|
|
361
|
-
|
|
362
|
-
const Ascending = 'ascending';
|
|
363
|
-
const Descending = 'descending';
|
|
364
|
-
function sortKey(sort) {
|
|
365
|
-
return !isObject(sort) ? '' : (sort.order === Descending ? '-' : '+') + aggrField(sort.op, sort.field);
|
|
366
|
-
}
|
|
367
|
-
function aggrField(op, field) {
|
|
368
|
-
return (op && op.signal ? '$' + op.signal : op || '') + (op && field ? '_' : '') + (field && field.signal ? '$' + field.signal : field || '');
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
// -----
|
|
372
|
-
|
|
373
|
-
const Scope$1 = 'scope';
|
|
374
|
-
const View = 'view';
|
|
375
|
-
function isSignal(_) {
|
|
376
|
-
return _ && _.signal;
|
|
377
|
-
}
|
|
378
|
-
function isExpr$1(_) {
|
|
379
|
-
return _ && _.expr;
|
|
380
|
-
}
|
|
381
|
-
function hasSignal(_) {
|
|
382
|
-
if (isSignal(_)) return true;
|
|
383
|
-
if (isObject(_)) for (const key in _) {
|
|
384
|
-
if (hasSignal(_[key])) return true;
|
|
385
|
-
}
|
|
386
|
-
return false;
|
|
387
|
-
}
|
|
388
|
-
function value(specValue, defaultValue) {
|
|
389
|
-
return specValue != null ? specValue : defaultValue;
|
|
390
|
-
}
|
|
391
|
-
function deref(v) {
|
|
392
|
-
return v && v.signal || v;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
const Timer = 'timer';
|
|
396
|
-
function parseStream(stream, scope) {
|
|
397
|
-
const method = stream.merge ? mergeStream : stream.stream ? nestedStream : stream.type ? eventStream : error('Invalid stream specification: ' + $(stream));
|
|
398
|
-
return method(stream, scope);
|
|
399
|
-
}
|
|
400
|
-
function eventSource(source) {
|
|
401
|
-
return source === Scope$1 ? View : source || View;
|
|
402
|
-
}
|
|
403
|
-
function mergeStream(stream, scope) {
|
|
404
|
-
const list = stream.merge.map(s => parseStream(s, scope)),
|
|
405
|
-
entry = streamParameters({
|
|
406
|
-
merge: list
|
|
407
|
-
}, stream, scope);
|
|
408
|
-
return scope.addStream(entry).id;
|
|
409
|
-
}
|
|
410
|
-
function nestedStream(stream, scope) {
|
|
411
|
-
const id = parseStream(stream.stream, scope),
|
|
412
|
-
entry = streamParameters({
|
|
413
|
-
stream: id
|
|
414
|
-
}, stream, scope);
|
|
415
|
-
return scope.addStream(entry).id;
|
|
416
|
-
}
|
|
417
|
-
function eventStream(stream, scope) {
|
|
418
|
-
let id;
|
|
419
|
-
if (stream.type === Timer) {
|
|
420
|
-
id = scope.event(Timer, stream.throttle);
|
|
421
|
-
stream = {
|
|
422
|
-
between: stream.between,
|
|
423
|
-
filter: stream.filter
|
|
424
|
-
};
|
|
425
|
-
} else {
|
|
426
|
-
id = scope.event(eventSource(stream.source), stream.type);
|
|
427
|
-
}
|
|
428
|
-
const entry = streamParameters({
|
|
429
|
-
stream: id
|
|
430
|
-
}, stream, scope);
|
|
431
|
-
return Object.keys(entry).length === 1 ? id : scope.addStream(entry).id;
|
|
432
|
-
}
|
|
433
|
-
function streamParameters(entry, stream, scope) {
|
|
434
|
-
let param = stream.between;
|
|
435
|
-
if (param) {
|
|
436
|
-
if (param.length !== 2) {
|
|
437
|
-
error('Stream "between" parameter must have 2 entries: ' + $(stream));
|
|
438
|
-
}
|
|
439
|
-
entry.between = [parseStream(param[0], scope), parseStream(param[1], scope)];
|
|
440
|
-
}
|
|
441
|
-
param = stream.filter ? [].concat(stream.filter) : [];
|
|
442
|
-
if (stream.marktype || stream.markname || stream.markrole) {
|
|
443
|
-
// add filter for mark type, name and/or role
|
|
444
|
-
param.push(filterMark(stream.marktype, stream.markname, stream.markrole));
|
|
445
|
-
}
|
|
446
|
-
if (stream.source === Scope$1) {
|
|
447
|
-
// add filter to limit events from sub-scope only
|
|
448
|
-
param.push('inScope(event.item)');
|
|
449
|
-
}
|
|
450
|
-
if (param.length) {
|
|
451
|
-
entry.filter = parser('(' + param.join(')&&(') + ')', scope).$expr;
|
|
452
|
-
}
|
|
453
|
-
if ((param = stream.throttle) != null) {
|
|
454
|
-
entry.throttle = +param;
|
|
455
|
-
}
|
|
456
|
-
if ((param = stream.debounce) != null) {
|
|
457
|
-
entry.debounce = +param;
|
|
458
|
-
}
|
|
459
|
-
if (stream.consume) {
|
|
460
|
-
entry.consume = true;
|
|
461
|
-
}
|
|
462
|
-
return entry;
|
|
463
|
-
}
|
|
464
|
-
function filterMark(type, name, role) {
|
|
465
|
-
const item = 'event.item';
|
|
466
|
-
return item + (type && type !== '*' ? '&&' + item + '.mark.marktype===\'' + type + '\'' : '') + (role ? '&&' + item + '.mark.role===\'' + role + '\'' : '') + (name ? '&&' + item + '.mark.name===\'' + name + '\'' : '');
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
// bypass expression parser for internal operator references
|
|
470
|
-
const OP_VALUE_EXPR = {
|
|
471
|
-
code: '_.$value',
|
|
472
|
-
ast: {
|
|
473
|
-
type: 'Identifier',
|
|
474
|
-
value: 'value'
|
|
475
|
-
}
|
|
476
|
-
};
|
|
477
|
-
function parseUpdate (spec, scope, target) {
|
|
478
|
-
const encode = spec.encode,
|
|
479
|
-
entry = {
|
|
480
|
-
target: target
|
|
481
|
-
};
|
|
482
|
-
let events = spec.events,
|
|
483
|
-
update = spec.update,
|
|
484
|
-
sources = [];
|
|
485
|
-
if (!events) {
|
|
486
|
-
error('Signal update missing events specification.');
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
// interpret as an event selector string
|
|
490
|
-
if (isString(events)) {
|
|
491
|
-
events = eventSelector(events, scope.isSubscope() ? Scope$1 : View);
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
// separate event streams from signal updates
|
|
495
|
-
events = array(events).filter(s => s.signal || s.scale ? (sources.push(s), 0) : 1);
|
|
496
|
-
|
|
497
|
-
// merge internal operator listeners
|
|
498
|
-
if (sources.length > 1) {
|
|
499
|
-
sources = [mergeSources(sources)];
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// merge event streams, include as source
|
|
503
|
-
if (events.length) {
|
|
504
|
-
sources.push(events.length > 1 ? {
|
|
505
|
-
merge: events
|
|
506
|
-
} : events[0]);
|
|
507
|
-
}
|
|
508
|
-
if (encode != null) {
|
|
509
|
-
if (update) error('Signal encode and update are mutually exclusive.');
|
|
510
|
-
update = 'encode(item(),' + $(encode) + ')';
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
// resolve update value
|
|
514
|
-
entry.update = isString(update) ? parser(update, scope) : update.expr != null ? parser(update.expr, scope) : update.value != null ? update.value : update.signal != null ? {
|
|
515
|
-
$expr: OP_VALUE_EXPR,
|
|
516
|
-
$params: {
|
|
517
|
-
$value: scope.signalRef(update.signal)
|
|
518
|
-
}
|
|
519
|
-
} : error('Invalid signal update specification.');
|
|
520
|
-
if (spec.force) {
|
|
521
|
-
entry.options = {
|
|
522
|
-
force: true
|
|
523
|
-
};
|
|
524
|
-
}
|
|
525
|
-
sources.forEach(source => scope.addUpdate(extend(streamSource(source, scope), entry)));
|
|
526
|
-
}
|
|
527
|
-
function streamSource(stream, scope) {
|
|
528
|
-
return {
|
|
529
|
-
source: stream.signal ? scope.signalRef(stream.signal) : stream.scale ? scope.scaleRef(stream.scale) : parseStream(stream, scope)
|
|
530
|
-
};
|
|
531
|
-
}
|
|
532
|
-
function mergeSources(sources) {
|
|
533
|
-
return {
|
|
534
|
-
signal: '[' + sources.map(s => s.scale ? 'scale("' + s.scale + '")' : s.signal) + ']'
|
|
535
|
-
};
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
function parseSignalUpdates (signal, scope) {
|
|
539
|
-
const op = scope.getSignal(signal.name);
|
|
540
|
-
let expr = signal.update;
|
|
541
|
-
if (signal.init) {
|
|
542
|
-
if (expr) {
|
|
543
|
-
error('Signals can not include both init and update expressions.');
|
|
544
|
-
} else {
|
|
545
|
-
expr = signal.init;
|
|
546
|
-
op.initonly = true;
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
if (expr) {
|
|
550
|
-
expr = parser(expr, scope);
|
|
551
|
-
op.update = expr.$expr;
|
|
552
|
-
op.params = expr.$params;
|
|
553
|
-
}
|
|
554
|
-
if (signal.on) {
|
|
555
|
-
signal.on.forEach(_ => parseUpdate(_, scope, op.id));
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
const transform = name => (params, value, parent) => entry(name, value, params || undefined, parent);
|
|
560
|
-
const Aggregate = transform('aggregate');
|
|
561
|
-
const AxisTicks = transform('axisticks');
|
|
562
|
-
const Bound = transform('bound');
|
|
563
|
-
const Collect = transform('collect');
|
|
564
|
-
const Compare = transform('compare');
|
|
565
|
-
const DataJoin = transform('datajoin');
|
|
566
|
-
const Encode = transform('encode');
|
|
567
|
-
const Expression = transform('expression');
|
|
568
|
-
const Facet = transform('facet');
|
|
569
|
-
const Field = transform('field');
|
|
570
|
-
const Key = transform('key');
|
|
571
|
-
const LegendEntries = transform('legendentries');
|
|
572
|
-
const Load = transform('load');
|
|
573
|
-
const Mark = transform('mark');
|
|
574
|
-
const MultiExtent = transform('multiextent');
|
|
575
|
-
const MultiValues = transform('multivalues');
|
|
576
|
-
const Overlap = transform('overlap');
|
|
577
|
-
const Params = transform('params');
|
|
578
|
-
const PreFacet = transform('prefacet');
|
|
579
|
-
const Projection = transform('projection');
|
|
580
|
-
const Proxy = transform('proxy');
|
|
581
|
-
const Relay = transform('relay');
|
|
582
|
-
const Render = transform('render');
|
|
583
|
-
const Scale = transform('scale');
|
|
584
|
-
const Sieve = transform('sieve');
|
|
585
|
-
const SortItems = transform('sortitems');
|
|
586
|
-
const ViewLayout = transform('viewlayout');
|
|
587
|
-
const Values = transform('values');
|
|
588
|
-
|
|
589
|
-
let FIELD_REF_ID = 0;
|
|
590
|
-
const MULTIDOMAIN_SORT_OPS = {
|
|
591
|
-
min: 'min',
|
|
592
|
-
max: 'max',
|
|
593
|
-
count: 'sum'
|
|
594
|
-
};
|
|
595
|
-
function initScale(spec, scope) {
|
|
596
|
-
const type = spec.type || 'linear';
|
|
597
|
-
if (!isValidScaleType(type)) {
|
|
598
|
-
error('Unrecognized scale type: ' + $(type));
|
|
599
|
-
}
|
|
600
|
-
scope.addScale(spec.name, {
|
|
601
|
-
type,
|
|
602
|
-
domain: undefined
|
|
603
|
-
});
|
|
604
|
-
}
|
|
605
|
-
function parseScale(spec, scope) {
|
|
606
|
-
const params = scope.getScale(spec.name).params;
|
|
607
|
-
let key;
|
|
608
|
-
params.domain = parseScaleDomain(spec.domain, spec, scope);
|
|
609
|
-
if (spec.range != null) {
|
|
610
|
-
params.range = parseScaleRange(spec, scope, params);
|
|
611
|
-
}
|
|
612
|
-
if (spec.interpolate != null) {
|
|
613
|
-
parseScaleInterpolate(spec.interpolate, params);
|
|
614
|
-
}
|
|
615
|
-
if (spec.nice != null) {
|
|
616
|
-
params.nice = parseScaleNice(spec.nice, scope);
|
|
617
|
-
}
|
|
618
|
-
if (spec.bins != null) {
|
|
619
|
-
params.bins = parseScaleBins(spec.bins, scope);
|
|
620
|
-
}
|
|
621
|
-
for (key in spec) {
|
|
622
|
-
if (has$1(params, key) || key === 'name') continue;
|
|
623
|
-
params[key] = parseLiteral(spec[key], scope);
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
function parseLiteral(v, scope) {
|
|
627
|
-
return !isObject(v) ? v : v.signal ? scope.signalRef(v.signal) : error('Unsupported object: ' + $(v));
|
|
628
|
-
}
|
|
629
|
-
function parseArray(v, scope) {
|
|
630
|
-
return v.signal ? scope.signalRef(v.signal) : v.map(v => parseLiteral(v, scope));
|
|
631
|
-
}
|
|
632
|
-
function dataLookupError(name) {
|
|
633
|
-
error('Can not find data set: ' + $(name));
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
// -- SCALE DOMAIN ----
|
|
637
|
-
|
|
638
|
-
function parseScaleDomain(domain, spec, scope) {
|
|
639
|
-
if (!domain) {
|
|
640
|
-
if (spec.domainMin != null || spec.domainMax != null) {
|
|
641
|
-
error('No scale domain defined for domainMin/domainMax to override.');
|
|
642
|
-
}
|
|
643
|
-
return; // default domain
|
|
644
|
-
}
|
|
645
|
-
return domain.signal ? scope.signalRef(domain.signal) : (isArray(domain) ? explicitDomain : domain.fields ? multipleDomain : singularDomain)(domain, spec, scope);
|
|
646
|
-
}
|
|
647
|
-
function explicitDomain(domain, spec, scope) {
|
|
648
|
-
return domain.map(v => parseLiteral(v, scope));
|
|
649
|
-
}
|
|
650
|
-
function singularDomain(domain, spec, scope) {
|
|
651
|
-
const data = scope.getData(domain.data);
|
|
652
|
-
if (!data) dataLookupError(domain.data);
|
|
653
|
-
return isDiscrete(spec.type) ? data.valuesRef(scope, domain.field, parseSort(domain.sort, false)) : isQuantile(spec.type) ? data.domainRef(scope, domain.field) : data.extentRef(scope, domain.field);
|
|
654
|
-
}
|
|
655
|
-
function multipleDomain(domain, spec, scope) {
|
|
656
|
-
const data = domain.data,
|
|
657
|
-
fields = domain.fields.reduce((dom, d) => {
|
|
658
|
-
d = isString(d) ? {
|
|
659
|
-
data: data,
|
|
660
|
-
field: d
|
|
661
|
-
} : isArray(d) || d.signal ? fieldRef(d, scope) : d;
|
|
662
|
-
dom.push(d);
|
|
663
|
-
return dom;
|
|
664
|
-
}, []);
|
|
665
|
-
return (isDiscrete(spec.type) ? ordinalMultipleDomain : isQuantile(spec.type) ? quantileMultipleDomain : numericMultipleDomain)(domain, scope, fields);
|
|
666
|
-
}
|
|
667
|
-
function fieldRef(data, scope) {
|
|
668
|
-
const name = '_:vega:_' + FIELD_REF_ID++,
|
|
669
|
-
coll = Collect({});
|
|
670
|
-
if (isArray(data)) {
|
|
671
|
-
coll.value = {
|
|
672
|
-
$ingest: data
|
|
673
|
-
};
|
|
674
|
-
} else if (data.signal) {
|
|
675
|
-
const code = 'setdata(' + $(name) + ',' + data.signal + ')';
|
|
676
|
-
coll.params.input = scope.signalRef(code);
|
|
677
|
-
}
|
|
678
|
-
scope.addDataPipeline(name, [coll, Sieve({})]);
|
|
679
|
-
return {
|
|
680
|
-
data: name,
|
|
681
|
-
field: 'data'
|
|
682
|
-
};
|
|
683
|
-
}
|
|
684
|
-
function ordinalMultipleDomain(domain, scope, fields) {
|
|
685
|
-
const sort = parseSort(domain.sort, true);
|
|
686
|
-
let a, v;
|
|
687
|
-
|
|
688
|
-
// get value counts for each domain field
|
|
689
|
-
const counts = fields.map(f => {
|
|
690
|
-
const data = scope.getData(f.data);
|
|
691
|
-
if (!data) dataLookupError(f.data);
|
|
692
|
-
return data.countsRef(scope, f.field, sort);
|
|
693
|
-
});
|
|
694
|
-
|
|
695
|
-
// aggregate the results from each domain field
|
|
696
|
-
const p = {
|
|
697
|
-
groupby: keyFieldRef,
|
|
698
|
-
pulse: counts
|
|
699
|
-
};
|
|
700
|
-
if (sort) {
|
|
701
|
-
a = sort.op || 'count';
|
|
702
|
-
v = sort.field ? aggrField(a, sort.field) : 'count';
|
|
703
|
-
p.ops = [MULTIDOMAIN_SORT_OPS[a]];
|
|
704
|
-
p.fields = [scope.fieldRef(v)];
|
|
705
|
-
p.as = [v];
|
|
706
|
-
}
|
|
707
|
-
a = scope.add(Aggregate(p));
|
|
708
|
-
|
|
709
|
-
// collect aggregate output
|
|
710
|
-
const c = scope.add(Collect({
|
|
711
|
-
pulse: ref(a)
|
|
712
|
-
}));
|
|
713
|
-
|
|
714
|
-
// extract values for combined domain
|
|
715
|
-
v = scope.add(Values({
|
|
716
|
-
field: keyFieldRef,
|
|
717
|
-
sort: scope.sortRef(sort),
|
|
718
|
-
pulse: ref(c)
|
|
719
|
-
}));
|
|
720
|
-
return ref(v);
|
|
721
|
-
}
|
|
722
|
-
function parseSort(sort, multidomain) {
|
|
723
|
-
if (sort) {
|
|
724
|
-
if (!sort.field && !sort.op) {
|
|
725
|
-
if (isObject(sort)) sort.field = 'key';else sort = {
|
|
726
|
-
field: 'key'
|
|
727
|
-
};
|
|
728
|
-
} else if (!sort.field && sort.op !== 'count') {
|
|
729
|
-
error('No field provided for sort aggregate op: ' + sort.op);
|
|
730
|
-
} else if (multidomain && sort.field) {
|
|
731
|
-
if (sort.op && !MULTIDOMAIN_SORT_OPS[sort.op]) {
|
|
732
|
-
error('Multiple domain scales can not be sorted using ' + sort.op);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
return sort;
|
|
737
|
-
}
|
|
738
|
-
function quantileMultipleDomain(domain, scope, fields) {
|
|
739
|
-
// get value arrays for each domain field
|
|
740
|
-
const values = fields.map(f => {
|
|
741
|
-
const data = scope.getData(f.data);
|
|
742
|
-
if (!data) dataLookupError(f.data);
|
|
743
|
-
return data.domainRef(scope, f.field);
|
|
744
|
-
});
|
|
745
|
-
|
|
746
|
-
// combine value arrays
|
|
747
|
-
return ref(scope.add(MultiValues({
|
|
748
|
-
values: values
|
|
749
|
-
})));
|
|
750
|
-
}
|
|
751
|
-
function numericMultipleDomain(domain, scope, fields) {
|
|
752
|
-
// get extents for each domain field
|
|
753
|
-
const extents = fields.map(f => {
|
|
754
|
-
const data = scope.getData(f.data);
|
|
755
|
-
if (!data) dataLookupError(f.data);
|
|
756
|
-
return data.extentRef(scope, f.field);
|
|
757
|
-
});
|
|
758
|
-
|
|
759
|
-
// combine extents
|
|
760
|
-
return ref(scope.add(MultiExtent({
|
|
761
|
-
extents: extents
|
|
762
|
-
})));
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
// -- SCALE BINS -----
|
|
766
|
-
|
|
767
|
-
function parseScaleBins(v, scope) {
|
|
768
|
-
return v.signal || isArray(v) ? parseArray(v, scope) : scope.objectProperty(v);
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
// -- SCALE NICE -----
|
|
772
|
-
|
|
773
|
-
function parseScaleNice(nice, scope) {
|
|
774
|
-
return nice.signal ? scope.signalRef(nice.signal) : isObject(nice) ? {
|
|
775
|
-
interval: parseLiteral(nice.interval),
|
|
776
|
-
step: parseLiteral(nice.step)
|
|
777
|
-
} : parseLiteral(nice);
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
// -- SCALE INTERPOLATION -----
|
|
781
|
-
|
|
782
|
-
function parseScaleInterpolate(interpolate, params) {
|
|
783
|
-
params.interpolate = parseLiteral(interpolate.type || interpolate);
|
|
784
|
-
if (interpolate.gamma != null) {
|
|
785
|
-
params.interpolateGamma = parseLiteral(interpolate.gamma);
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
|
|
789
|
-
// -- SCALE RANGE -----
|
|
790
|
-
|
|
791
|
-
function parseScaleRange(spec, scope, params) {
|
|
792
|
-
const config = scope.config.range;
|
|
793
|
-
let range = spec.range;
|
|
794
|
-
if (range.signal) {
|
|
795
|
-
return scope.signalRef(range.signal);
|
|
796
|
-
} else if (isString(range)) {
|
|
797
|
-
if (config && has$1(config, range)) {
|
|
798
|
-
spec = extend({}, spec, {
|
|
799
|
-
range: config[range]
|
|
800
|
-
});
|
|
801
|
-
return parseScaleRange(spec, scope, params);
|
|
802
|
-
} else if (range === 'width') {
|
|
803
|
-
range = [0, {
|
|
804
|
-
signal: 'width'
|
|
805
|
-
}];
|
|
806
|
-
} else if (range === 'height') {
|
|
807
|
-
range = isDiscrete(spec.type) ? [0, {
|
|
808
|
-
signal: 'height'
|
|
809
|
-
}] : [{
|
|
810
|
-
signal: 'height'
|
|
811
|
-
}, 0];
|
|
812
|
-
} else {
|
|
813
|
-
error('Unrecognized scale range value: ' + $(range));
|
|
814
|
-
}
|
|
815
|
-
} else if (range.scheme) {
|
|
816
|
-
params.scheme = isArray(range.scheme) ? parseArray(range.scheme, scope) : parseLiteral(range.scheme, scope);
|
|
817
|
-
if (range.extent) params.schemeExtent = parseArray(range.extent, scope);
|
|
818
|
-
if (range.count) params.schemeCount = parseLiteral(range.count, scope);
|
|
819
|
-
return;
|
|
820
|
-
} else if (range.step) {
|
|
821
|
-
params.rangeStep = parseLiteral(range.step, scope);
|
|
822
|
-
return;
|
|
823
|
-
} else if (isDiscrete(spec.type) && !isArray(range)) {
|
|
824
|
-
return parseScaleDomain(range, spec, scope);
|
|
825
|
-
} else if (!isArray(range)) {
|
|
826
|
-
error('Unsupported range type: ' + $(range));
|
|
827
|
-
}
|
|
828
|
-
return range.map(v => (isArray(v) ? parseArray : parseLiteral)(v, scope));
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
function parseProjection (proj, scope) {
|
|
832
|
-
const config = scope.config.projection || {},
|
|
833
|
-
params = {};
|
|
834
|
-
for (const name in proj) {
|
|
835
|
-
if (name === 'name') continue;
|
|
836
|
-
params[name] = parseParameter$1(proj[name], name, scope);
|
|
837
|
-
}
|
|
838
|
-
|
|
839
|
-
// apply projection defaults from config
|
|
840
|
-
for (const name in config) {
|
|
841
|
-
if (params[name] == null) {
|
|
842
|
-
params[name] = parseParameter$1(config[name], name, scope);
|
|
843
|
-
}
|
|
844
|
-
}
|
|
845
|
-
scope.addProjection(proj.name, params);
|
|
846
|
-
}
|
|
847
|
-
function parseParameter$1(_, name, scope) {
|
|
848
|
-
return isArray(_) ? _.map(_ => parseParameter$1(_, name, scope)) : !isObject(_) ? _ : _.signal ? scope.signalRef(_.signal) : name === 'fit' ? _ : error('Unsupported parameter object: ' + $(_));
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
const Top = 'top';
|
|
852
|
-
const Left = 'left';
|
|
853
|
-
const Right = 'right';
|
|
854
|
-
const Bottom = 'bottom';
|
|
855
|
-
const Center = 'center';
|
|
856
|
-
const Vertical = 'vertical';
|
|
857
|
-
const Start = 'start';
|
|
858
|
-
const Middle = 'middle';
|
|
859
|
-
const End = 'end';
|
|
860
|
-
const Index = 'index';
|
|
861
|
-
const Label = 'label';
|
|
862
|
-
const Offset = 'offset';
|
|
863
|
-
const Perc = 'perc';
|
|
864
|
-
const Perc2 = 'perc2';
|
|
865
|
-
const Value = 'value';
|
|
866
|
-
const GuideLabelStyle = 'guide-label';
|
|
867
|
-
const GuideTitleStyle = 'guide-title';
|
|
868
|
-
const GroupTitleStyle = 'group-title';
|
|
869
|
-
const GroupSubtitleStyle = 'group-subtitle';
|
|
870
|
-
|
|
871
|
-
/** All values of LegendType */
|
|
872
|
-
const Symbols = 'symbol';
|
|
873
|
-
const Gradient = 'gradient';
|
|
874
|
-
const Discrete = 'discrete';
|
|
875
|
-
const Size = 'size';
|
|
876
|
-
const Shape = 'shape';
|
|
877
|
-
const Fill = 'fill';
|
|
878
|
-
const Stroke = 'stroke';
|
|
879
|
-
const StrokeWidth = 'strokeWidth';
|
|
880
|
-
const StrokeDash = 'strokeDash';
|
|
881
|
-
const Opacity = 'opacity';
|
|
882
|
-
|
|
883
|
-
// Encoding channels supported by legends
|
|
884
|
-
// In priority order of 'canonical' scale
|
|
885
|
-
const LegendScales = [Size, Shape, Fill, Stroke, StrokeWidth, StrokeDash, Opacity];
|
|
886
|
-
const Skip = {
|
|
887
|
-
name: 1,
|
|
888
|
-
style: 1,
|
|
889
|
-
interactive: 1
|
|
890
|
-
};
|
|
891
|
-
const zero = {
|
|
892
|
-
value: 0
|
|
893
|
-
};
|
|
894
|
-
const one = {
|
|
895
|
-
value: 1
|
|
896
|
-
};
|
|
897
|
-
|
|
898
|
-
const GroupMark = 'group';
|
|
899
|
-
const RectMark = 'rect';
|
|
900
|
-
const RuleMark = 'rule';
|
|
901
|
-
const SymbolMark = 'symbol';
|
|
902
|
-
const TextMark = 'text';
|
|
903
|
-
|
|
904
|
-
function guideGroup (mark) {
|
|
905
|
-
mark.type = GroupMark;
|
|
906
|
-
mark.interactive = mark.interactive || false;
|
|
907
|
-
return mark;
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
function lookup(spec, config) {
|
|
911
|
-
const _ = (name, dflt) => value(spec[name], value(config[name], dflt));
|
|
912
|
-
_.isVertical = s => Vertical === value(spec.direction, config.direction || (s ? config.symbolDirection : config.gradientDirection));
|
|
913
|
-
_.gradientLength = () => value(spec.gradientLength, config.gradientLength || config.gradientWidth);
|
|
914
|
-
_.gradientThickness = () => value(spec.gradientThickness, config.gradientThickness || config.gradientHeight);
|
|
915
|
-
_.entryColumns = () => value(spec.columns, value(config.columns, +_.isVertical(true)));
|
|
916
|
-
return _;
|
|
917
|
-
}
|
|
918
|
-
function getEncoding(name, encode) {
|
|
919
|
-
const v = encode && (encode.update && encode.update[name] || encode.enter && encode.enter[name]);
|
|
920
|
-
return v && v.signal ? v : v ? v.value : null;
|
|
921
|
-
}
|
|
922
|
-
function getStyle(name, scope, style) {
|
|
923
|
-
const s = scope.config.style[style];
|
|
924
|
-
return s && s[name];
|
|
925
|
-
}
|
|
926
|
-
function anchorExpr(s, e, m) {
|
|
927
|
-
return `item.anchor === '${Start}' ? ${s} : item.anchor === '${End}' ? ${e} : ${m}`;
|
|
928
|
-
}
|
|
929
|
-
const alignExpr$1 = anchorExpr($(Left), $(Right), $(Center));
|
|
930
|
-
function tickBand(_) {
|
|
931
|
-
const v = _('tickBand');
|
|
932
|
-
let offset = _('tickOffset'),
|
|
933
|
-
band,
|
|
934
|
-
extra;
|
|
935
|
-
if (!v) {
|
|
936
|
-
// if no tick band entry, fall back on other properties
|
|
937
|
-
band = _('bandPosition');
|
|
938
|
-
extra = _('tickExtra');
|
|
939
|
-
} else if (v.signal) {
|
|
940
|
-
// if signal, augment code to interpret values
|
|
941
|
-
band = {
|
|
942
|
-
signal: `(${v.signal}) === 'extent' ? 1 : 0.5`
|
|
943
|
-
};
|
|
944
|
-
extra = {
|
|
945
|
-
signal: `(${v.signal}) === 'extent'`
|
|
946
|
-
};
|
|
947
|
-
if (!isObject(offset)) {
|
|
948
|
-
offset = {
|
|
949
|
-
signal: `(${v.signal}) === 'extent' ? 0 : ${offset}`
|
|
950
|
-
};
|
|
951
|
-
}
|
|
952
|
-
} else if (v === 'extent') {
|
|
953
|
-
// if constant, simply set values
|
|
954
|
-
band = 1;
|
|
955
|
-
extra = true;
|
|
956
|
-
offset = 0;
|
|
957
|
-
} else {
|
|
958
|
-
band = 0.5;
|
|
959
|
-
extra = false;
|
|
960
|
-
}
|
|
961
|
-
return {
|
|
962
|
-
extra,
|
|
963
|
-
band,
|
|
964
|
-
offset
|
|
965
|
-
};
|
|
966
|
-
}
|
|
967
|
-
function extendOffset(value, offset) {
|
|
968
|
-
return !offset ? value : !value ? offset : !isObject(value) ? {
|
|
969
|
-
value,
|
|
970
|
-
offset
|
|
971
|
-
} : Object.assign({}, value, {
|
|
972
|
-
offset: extendOffset(value.offset, offset)
|
|
973
|
-
});
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
function guideMark (mark, extras) {
|
|
977
|
-
if (extras) {
|
|
978
|
-
mark.name = extras.name;
|
|
979
|
-
mark.style = extras.style || mark.style;
|
|
980
|
-
mark.interactive = !!extras.interactive;
|
|
981
|
-
mark.encode = extendEncode(mark.encode, extras, Skip);
|
|
982
|
-
} else {
|
|
983
|
-
mark.interactive = false;
|
|
984
|
-
}
|
|
985
|
-
return mark;
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
function legendGradient (spec, scale, config, userEncode) {
|
|
989
|
-
const _ = lookup(spec, config),
|
|
990
|
-
vertical = _.isVertical(),
|
|
991
|
-
thickness = _.gradientThickness(),
|
|
992
|
-
length = _.gradientLength();
|
|
993
|
-
let enter, start, stop, width, height;
|
|
994
|
-
if (vertical) {
|
|
995
|
-
start = [0, 1];
|
|
996
|
-
stop = [0, 0];
|
|
997
|
-
width = thickness;
|
|
998
|
-
height = length;
|
|
999
|
-
} else {
|
|
1000
|
-
start = [0, 0];
|
|
1001
|
-
stop = [1, 0];
|
|
1002
|
-
width = length;
|
|
1003
|
-
height = thickness;
|
|
1004
|
-
}
|
|
1005
|
-
const encode = {
|
|
1006
|
-
enter: enter = {
|
|
1007
|
-
opacity: zero,
|
|
1008
|
-
x: zero,
|
|
1009
|
-
y: zero,
|
|
1010
|
-
width: encoder(width),
|
|
1011
|
-
height: encoder(height)
|
|
1012
|
-
},
|
|
1013
|
-
update: extend({}, enter, {
|
|
1014
|
-
opacity: one,
|
|
1015
|
-
fill: {
|
|
1016
|
-
gradient: scale,
|
|
1017
|
-
start: start,
|
|
1018
|
-
stop: stop
|
|
1019
|
-
}
|
|
1020
|
-
}),
|
|
1021
|
-
exit: {
|
|
1022
|
-
opacity: zero
|
|
1023
|
-
}
|
|
1024
|
-
};
|
|
1025
|
-
addEncoders(encode, {
|
|
1026
|
-
stroke: _('gradientStrokeColor'),
|
|
1027
|
-
strokeWidth: _('gradientStrokeWidth')
|
|
1028
|
-
}, {
|
|
1029
|
-
// update
|
|
1030
|
-
opacity: _('gradientOpacity')
|
|
1031
|
-
});
|
|
1032
|
-
return guideMark({
|
|
1033
|
-
type: RectMark,
|
|
1034
|
-
role: LegendGradientRole,
|
|
1035
|
-
encode
|
|
1036
|
-
}, userEncode);
|
|
1037
|
-
}
|
|
1038
|
-
|
|
1039
|
-
function legendGradientDiscrete (spec, scale, config, userEncode, dataRef) {
|
|
1040
|
-
const _ = lookup(spec, config),
|
|
1041
|
-
vertical = _.isVertical(),
|
|
1042
|
-
thickness = _.gradientThickness(),
|
|
1043
|
-
length = _.gradientLength();
|
|
1044
|
-
let u,
|
|
1045
|
-
v,
|
|
1046
|
-
uu,
|
|
1047
|
-
vv,
|
|
1048
|
-
adjust = '';
|
|
1049
|
-
vertical ? (u = 'y', uu = 'y2', v = 'x', vv = 'width', adjust = '1-') : (u = 'x', uu = 'x2', v = 'y', vv = 'height');
|
|
1050
|
-
const enter = {
|
|
1051
|
-
opacity: zero,
|
|
1052
|
-
fill: {
|
|
1053
|
-
scale: scale,
|
|
1054
|
-
field: Value
|
|
1055
|
-
}
|
|
1056
|
-
};
|
|
1057
|
-
enter[u] = {
|
|
1058
|
-
signal: adjust + 'datum.' + Perc,
|
|
1059
|
-
mult: length
|
|
1060
|
-
};
|
|
1061
|
-
enter[v] = zero;
|
|
1062
|
-
enter[uu] = {
|
|
1063
|
-
signal: adjust + 'datum.' + Perc2,
|
|
1064
|
-
mult: length
|
|
1065
|
-
};
|
|
1066
|
-
enter[vv] = encoder(thickness);
|
|
1067
|
-
const encode = {
|
|
1068
|
-
enter: enter,
|
|
1069
|
-
update: extend({}, enter, {
|
|
1070
|
-
opacity: one
|
|
1071
|
-
}),
|
|
1072
|
-
exit: {
|
|
1073
|
-
opacity: zero
|
|
1074
|
-
}
|
|
1075
|
-
};
|
|
1076
|
-
addEncoders(encode, {
|
|
1077
|
-
stroke: _('gradientStrokeColor'),
|
|
1078
|
-
strokeWidth: _('gradientStrokeWidth')
|
|
1079
|
-
}, {
|
|
1080
|
-
// update
|
|
1081
|
-
opacity: _('gradientOpacity')
|
|
1082
|
-
});
|
|
1083
|
-
return guideMark({
|
|
1084
|
-
type: RectMark,
|
|
1085
|
-
role: LegendBandRole,
|
|
1086
|
-
key: Value,
|
|
1087
|
-
from: dataRef,
|
|
1088
|
-
encode
|
|
1089
|
-
}, userEncode);
|
|
1090
|
-
}
|
|
1091
|
-
|
|
1092
|
-
const alignExpr = `datum.${Perc}<=0?"${Left}":datum.${Perc}>=1?"${Right}":"${Center}"`,
|
|
1093
|
-
baselineExpr = `datum.${Perc}<=0?"${Bottom}":datum.${Perc}>=1?"${Top}":"${Middle}"`;
|
|
1094
|
-
function legendGradientLabels (spec, config, userEncode, dataRef) {
|
|
1095
|
-
const _ = lookup(spec, config),
|
|
1096
|
-
vertical = _.isVertical(),
|
|
1097
|
-
thickness = encoder(_.gradientThickness()),
|
|
1098
|
-
length = _.gradientLength();
|
|
1099
|
-
let overlap = _('labelOverlap'),
|
|
1100
|
-
enter,
|
|
1101
|
-
update,
|
|
1102
|
-
u,
|
|
1103
|
-
v,
|
|
1104
|
-
adjust = '';
|
|
1105
|
-
const encode = {
|
|
1106
|
-
enter: enter = {
|
|
1107
|
-
opacity: zero
|
|
1108
|
-
},
|
|
1109
|
-
update: update = {
|
|
1110
|
-
opacity: one,
|
|
1111
|
-
text: {
|
|
1112
|
-
field: Label
|
|
1113
|
-
}
|
|
1114
|
-
},
|
|
1115
|
-
exit: {
|
|
1116
|
-
opacity: zero
|
|
1117
|
-
}
|
|
1118
|
-
};
|
|
1119
|
-
addEncoders(encode, {
|
|
1120
|
-
fill: _('labelColor'),
|
|
1121
|
-
fillOpacity: _('labelOpacity'),
|
|
1122
|
-
font: _('labelFont'),
|
|
1123
|
-
fontSize: _('labelFontSize'),
|
|
1124
|
-
fontStyle: _('labelFontStyle'),
|
|
1125
|
-
fontWeight: _('labelFontWeight'),
|
|
1126
|
-
limit: value(spec.labelLimit, config.gradientLabelLimit)
|
|
1127
|
-
});
|
|
1128
|
-
if (vertical) {
|
|
1129
|
-
enter.align = {
|
|
1130
|
-
value: 'left'
|
|
1131
|
-
};
|
|
1132
|
-
enter.baseline = update.baseline = {
|
|
1133
|
-
signal: baselineExpr
|
|
1134
|
-
};
|
|
1135
|
-
u = 'y';
|
|
1136
|
-
v = 'x';
|
|
1137
|
-
adjust = '1-';
|
|
1138
|
-
} else {
|
|
1139
|
-
enter.align = update.align = {
|
|
1140
|
-
signal: alignExpr
|
|
1141
|
-
};
|
|
1142
|
-
enter.baseline = {
|
|
1143
|
-
value: 'top'
|
|
1144
|
-
};
|
|
1145
|
-
u = 'x';
|
|
1146
|
-
v = 'y';
|
|
1147
|
-
}
|
|
1148
|
-
enter[u] = update[u] = {
|
|
1149
|
-
signal: adjust + 'datum.' + Perc,
|
|
1150
|
-
mult: length
|
|
1151
|
-
};
|
|
1152
|
-
enter[v] = update[v] = thickness;
|
|
1153
|
-
thickness.offset = value(spec.labelOffset, config.gradientLabelOffset) || 0;
|
|
1154
|
-
overlap = overlap ? {
|
|
1155
|
-
separation: _('labelSeparation'),
|
|
1156
|
-
method: overlap,
|
|
1157
|
-
order: 'datum.' + Index
|
|
1158
|
-
} : undefined;
|
|
1159
|
-
|
|
1160
|
-
// type, role, style, key, dataRef, encode, extras
|
|
1161
|
-
return guideMark({
|
|
1162
|
-
type: TextMark,
|
|
1163
|
-
role: LegendLabelRole,
|
|
1164
|
-
style: GuideLabelStyle,
|
|
1165
|
-
key: Value,
|
|
1166
|
-
from: dataRef,
|
|
1167
|
-
encode,
|
|
1168
|
-
overlap
|
|
1169
|
-
}, userEncode);
|
|
1170
|
-
}
|
|
1171
|
-
|
|
1172
|
-
// userEncode is top-level, includes entries, symbols, labels
|
|
1173
|
-
function legendSymbolGroups (spec, config, userEncode, dataRef, columns) {
|
|
1174
|
-
const _ = lookup(spec, config),
|
|
1175
|
-
entries = userEncode.entries,
|
|
1176
|
-
interactive = !!(entries && entries.interactive),
|
|
1177
|
-
name = entries ? entries.name : undefined,
|
|
1178
|
-
height = _('clipHeight'),
|
|
1179
|
-
symbolOffset = _('symbolOffset'),
|
|
1180
|
-
valueRef = {
|
|
1181
|
-
data: 'value'
|
|
1182
|
-
},
|
|
1183
|
-
xSignal = `(${columns}) ? datum.${Offset} : datum.${Size}`,
|
|
1184
|
-
yEncode = height ? encoder(height) : {
|
|
1185
|
-
field: Size
|
|
1186
|
-
},
|
|
1187
|
-
index = `datum.${Index}`,
|
|
1188
|
-
ncols = `max(1, ${columns})`;
|
|
1189
|
-
let encode, enter, update, nrows, sort;
|
|
1190
|
-
yEncode.mult = 0.5;
|
|
1191
|
-
|
|
1192
|
-
// -- LEGEND SYMBOLS --
|
|
1193
|
-
encode = {
|
|
1194
|
-
enter: enter = {
|
|
1195
|
-
opacity: zero,
|
|
1196
|
-
x: {
|
|
1197
|
-
signal: xSignal,
|
|
1198
|
-
mult: 0.5,
|
|
1199
|
-
offset: symbolOffset
|
|
1200
|
-
},
|
|
1201
|
-
y: yEncode
|
|
1202
|
-
},
|
|
1203
|
-
update: update = {
|
|
1204
|
-
opacity: one,
|
|
1205
|
-
x: enter.x,
|
|
1206
|
-
y: enter.y
|
|
1207
|
-
},
|
|
1208
|
-
exit: {
|
|
1209
|
-
opacity: zero
|
|
1210
|
-
}
|
|
1211
|
-
};
|
|
1212
|
-
let baseFill = null,
|
|
1213
|
-
baseStroke = null;
|
|
1214
|
-
if (!spec.fill) {
|
|
1215
|
-
baseFill = config.symbolBaseFillColor;
|
|
1216
|
-
baseStroke = config.symbolBaseStrokeColor;
|
|
1217
|
-
}
|
|
1218
|
-
addEncoders(encode, {
|
|
1219
|
-
fill: _('symbolFillColor', baseFill),
|
|
1220
|
-
shape: _('symbolType'),
|
|
1221
|
-
size: _('symbolSize'),
|
|
1222
|
-
stroke: _('symbolStrokeColor', baseStroke),
|
|
1223
|
-
strokeDash: _('symbolDash'),
|
|
1224
|
-
strokeDashOffset: _('symbolDashOffset'),
|
|
1225
|
-
strokeWidth: _('symbolStrokeWidth')
|
|
1226
|
-
}, {
|
|
1227
|
-
// update
|
|
1228
|
-
opacity: _('symbolOpacity')
|
|
1229
|
-
});
|
|
1230
|
-
LegendScales.forEach(scale => {
|
|
1231
|
-
if (spec[scale]) {
|
|
1232
|
-
update[scale] = enter[scale] = {
|
|
1233
|
-
scale: spec[scale],
|
|
1234
|
-
field: Value
|
|
1235
|
-
};
|
|
1236
|
-
}
|
|
1237
|
-
});
|
|
1238
|
-
const symbols = guideMark({
|
|
1239
|
-
type: SymbolMark,
|
|
1240
|
-
role: LegendSymbolRole,
|
|
1241
|
-
key: Value,
|
|
1242
|
-
from: valueRef,
|
|
1243
|
-
clip: height ? true : undefined,
|
|
1244
|
-
encode
|
|
1245
|
-
}, userEncode.symbols);
|
|
1246
|
-
|
|
1247
|
-
// -- LEGEND LABELS --
|
|
1248
|
-
const labelOffset = encoder(symbolOffset);
|
|
1249
|
-
labelOffset.offset = _('labelOffset');
|
|
1250
|
-
encode = {
|
|
1251
|
-
enter: enter = {
|
|
1252
|
-
opacity: zero,
|
|
1253
|
-
x: {
|
|
1254
|
-
signal: xSignal,
|
|
1255
|
-
offset: labelOffset
|
|
1256
|
-
},
|
|
1257
|
-
y: yEncode
|
|
1258
|
-
},
|
|
1259
|
-
update: update = {
|
|
1260
|
-
opacity: one,
|
|
1261
|
-
text: {
|
|
1262
|
-
field: Label
|
|
1263
|
-
},
|
|
1264
|
-
x: enter.x,
|
|
1265
|
-
y: enter.y
|
|
1266
|
-
},
|
|
1267
|
-
exit: {
|
|
1268
|
-
opacity: zero
|
|
1269
|
-
}
|
|
1270
|
-
};
|
|
1271
|
-
addEncoders(encode, {
|
|
1272
|
-
align: _('labelAlign'),
|
|
1273
|
-
baseline: _('labelBaseline'),
|
|
1274
|
-
fill: _('labelColor'),
|
|
1275
|
-
fillOpacity: _('labelOpacity'),
|
|
1276
|
-
font: _('labelFont'),
|
|
1277
|
-
fontSize: _('labelFontSize'),
|
|
1278
|
-
fontStyle: _('labelFontStyle'),
|
|
1279
|
-
fontWeight: _('labelFontWeight'),
|
|
1280
|
-
limit: _('labelLimit')
|
|
1281
|
-
});
|
|
1282
|
-
const labels = guideMark({
|
|
1283
|
-
type: TextMark,
|
|
1284
|
-
role: LegendLabelRole,
|
|
1285
|
-
style: GuideLabelStyle,
|
|
1286
|
-
key: Value,
|
|
1287
|
-
from: valueRef,
|
|
1288
|
-
encode
|
|
1289
|
-
}, userEncode.labels);
|
|
1290
|
-
|
|
1291
|
-
// -- LEGEND ENTRY GROUPS --
|
|
1292
|
-
encode = {
|
|
1293
|
-
enter: {
|
|
1294
|
-
noBound: {
|
|
1295
|
-
value: !height
|
|
1296
|
-
},
|
|
1297
|
-
// ignore width/height in bounds calc
|
|
1298
|
-
width: zero,
|
|
1299
|
-
height: height ? encoder(height) : zero,
|
|
1300
|
-
opacity: zero
|
|
1301
|
-
},
|
|
1302
|
-
exit: {
|
|
1303
|
-
opacity: zero
|
|
1304
|
-
},
|
|
1305
|
-
update: update = {
|
|
1306
|
-
opacity: one,
|
|
1307
|
-
row: {
|
|
1308
|
-
signal: null
|
|
1309
|
-
},
|
|
1310
|
-
column: {
|
|
1311
|
-
signal: null
|
|
1312
|
-
}
|
|
1313
|
-
}
|
|
1314
|
-
};
|
|
1315
|
-
|
|
1316
|
-
// annotate and sort groups to ensure correct ordering
|
|
1317
|
-
if (_.isVertical(true)) {
|
|
1318
|
-
nrows = `ceil(item.mark.items.length / ${ncols})`;
|
|
1319
|
-
update.row.signal = `${index}%${nrows}`;
|
|
1320
|
-
update.column.signal = `floor(${index} / ${nrows})`;
|
|
1321
|
-
sort = {
|
|
1322
|
-
field: ['row', index]
|
|
1323
|
-
};
|
|
1324
|
-
} else {
|
|
1325
|
-
update.row.signal = `floor(${index} / ${ncols})`;
|
|
1326
|
-
update.column.signal = `${index} % ${ncols}`;
|
|
1327
|
-
sort = {
|
|
1328
|
-
field: index
|
|
1329
|
-
};
|
|
1330
|
-
}
|
|
1331
|
-
// handle zero column case (implies infinite columns)
|
|
1332
|
-
update.column.signal = `(${columns})?${update.column.signal}:${index}`;
|
|
1333
|
-
|
|
1334
|
-
// facet legend entries into sub-groups
|
|
1335
|
-
dataRef = {
|
|
1336
|
-
facet: {
|
|
1337
|
-
data: dataRef,
|
|
1338
|
-
name: 'value',
|
|
1339
|
-
groupby: Index
|
|
1340
|
-
}
|
|
1341
|
-
};
|
|
1342
|
-
return guideGroup({
|
|
1343
|
-
role: ScopeRole,
|
|
1344
|
-
from: dataRef,
|
|
1345
|
-
encode: extendEncode(encode, entries, Skip),
|
|
1346
|
-
marks: [symbols, labels],
|
|
1347
|
-
name,
|
|
1348
|
-
interactive,
|
|
1349
|
-
sort
|
|
1350
|
-
});
|
|
1351
|
-
}
|
|
1352
|
-
function legendSymbolLayout(spec, config) {
|
|
1353
|
-
const _ = lookup(spec, config);
|
|
1354
|
-
|
|
1355
|
-
// layout parameters for legend entries
|
|
1356
|
-
return {
|
|
1357
|
-
align: _('gridAlign'),
|
|
1358
|
-
columns: _.entryColumns(),
|
|
1359
|
-
center: {
|
|
1360
|
-
row: true,
|
|
1361
|
-
column: false
|
|
1362
|
-
},
|
|
1363
|
-
padding: {
|
|
1364
|
-
row: _('rowPadding'),
|
|
1365
|
-
column: _('columnPadding')
|
|
1366
|
-
}
|
|
1367
|
-
};
|
|
1368
|
-
}
|
|
1369
|
-
|
|
1370
|
-
// expression logic for align, anchor, angle, and baseline calculation
|
|
1371
|
-
const isL = 'item.orient === "left"',
|
|
1372
|
-
isR = 'item.orient === "right"',
|
|
1373
|
-
isLR = `(${isL} || ${isR})`,
|
|
1374
|
-
isVG = `datum.vgrad && ${isLR}`,
|
|
1375
|
-
baseline = anchorExpr('"top"', '"bottom"', '"middle"'),
|
|
1376
|
-
alignFlip = anchorExpr('"right"', '"left"', '"center"'),
|
|
1377
|
-
exprAlign = `datum.vgrad && ${isR} ? (${alignFlip}) : (${isLR} && !(datum.vgrad && ${isL})) ? "left" : ${alignExpr$1}`,
|
|
1378
|
-
exprAnchor = `item._anchor || (${isLR} ? "middle" : "start")`,
|
|
1379
|
-
exprAngle = `${isVG} ? (${isL} ? -90 : 90) : 0`,
|
|
1380
|
-
exprBaseline = `${isLR} ? (datum.vgrad ? (${isR} ? "bottom" : "top") : ${baseline}) : "top"`;
|
|
1381
|
-
function legendTitle (spec, config, userEncode, dataRef) {
|
|
1382
|
-
const _ = lookup(spec, config);
|
|
1383
|
-
const encode = {
|
|
1384
|
-
enter: {
|
|
1385
|
-
opacity: zero
|
|
1386
|
-
},
|
|
1387
|
-
update: {
|
|
1388
|
-
opacity: one,
|
|
1389
|
-
x: {
|
|
1390
|
-
field: {
|
|
1391
|
-
group: 'padding'
|
|
1392
|
-
}
|
|
1393
|
-
},
|
|
1394
|
-
y: {
|
|
1395
|
-
field: {
|
|
1396
|
-
group: 'padding'
|
|
1397
|
-
}
|
|
1398
|
-
}
|
|
1399
|
-
},
|
|
1400
|
-
exit: {
|
|
1401
|
-
opacity: zero
|
|
1402
|
-
}
|
|
1403
|
-
};
|
|
1404
|
-
addEncoders(encode, {
|
|
1405
|
-
orient: _('titleOrient'),
|
|
1406
|
-
_anchor: _('titleAnchor'),
|
|
1407
|
-
anchor: {
|
|
1408
|
-
signal: exprAnchor
|
|
1409
|
-
},
|
|
1410
|
-
angle: {
|
|
1411
|
-
signal: exprAngle
|
|
1412
|
-
},
|
|
1413
|
-
align: {
|
|
1414
|
-
signal: exprAlign
|
|
1415
|
-
},
|
|
1416
|
-
baseline: {
|
|
1417
|
-
signal: exprBaseline
|
|
1418
|
-
},
|
|
1419
|
-
text: spec.title,
|
|
1420
|
-
fill: _('titleColor'),
|
|
1421
|
-
fillOpacity: _('titleOpacity'),
|
|
1422
|
-
font: _('titleFont'),
|
|
1423
|
-
fontSize: _('titleFontSize'),
|
|
1424
|
-
fontStyle: _('titleFontStyle'),
|
|
1425
|
-
fontWeight: _('titleFontWeight'),
|
|
1426
|
-
limit: _('titleLimit'),
|
|
1427
|
-
lineHeight: _('titleLineHeight')
|
|
1428
|
-
}, {
|
|
1429
|
-
// require update
|
|
1430
|
-
align: _('titleAlign'),
|
|
1431
|
-
baseline: _('titleBaseline')
|
|
1432
|
-
});
|
|
1433
|
-
return guideMark({
|
|
1434
|
-
type: TextMark,
|
|
1435
|
-
role: LegendTitleRole,
|
|
1436
|
-
style: GuideTitleStyle,
|
|
1437
|
-
from: dataRef,
|
|
1438
|
-
encode
|
|
1439
|
-
}, userEncode);
|
|
1440
|
-
}
|
|
1441
|
-
|
|
1442
|
-
function clip (clip, scope) {
|
|
1443
|
-
let expr;
|
|
1444
|
-
if (isObject(clip)) {
|
|
1445
|
-
if (clip.signal) {
|
|
1446
|
-
expr = clip.signal;
|
|
1447
|
-
} else if (clip.path) {
|
|
1448
|
-
expr = 'pathShape(' + param(clip.path) + ')';
|
|
1449
|
-
} else if (clip.sphere) {
|
|
1450
|
-
expr = 'geoShape(' + param(clip.sphere) + ', {type: "Sphere"})';
|
|
1451
|
-
}
|
|
1452
|
-
}
|
|
1453
|
-
return expr ? scope.signalRef(expr) : !!clip;
|
|
1454
|
-
}
|
|
1455
|
-
function param(value) {
|
|
1456
|
-
return isObject(value) && value.signal ? value.signal : $(value);
|
|
1457
|
-
}
|
|
1458
|
-
|
|
1459
|
-
function getRole (spec) {
|
|
1460
|
-
const role = spec.role || '';
|
|
1461
|
-
return role.startsWith('axis') || role.startsWith('legend') || role.startsWith('title') ? role : spec.type === GroupMark ? ScopeRole : role || MarkRole;
|
|
1462
|
-
}
|
|
1463
|
-
|
|
1464
|
-
function definition (spec) {
|
|
1465
|
-
return {
|
|
1466
|
-
marktype: spec.type,
|
|
1467
|
-
name: spec.name || undefined,
|
|
1468
|
-
role: spec.role || getRole(spec),
|
|
1469
|
-
zindex: +spec.zindex || undefined,
|
|
1470
|
-
aria: spec.aria,
|
|
1471
|
-
description: spec.description
|
|
1472
|
-
};
|
|
1473
|
-
}
|
|
1474
|
-
|
|
1475
|
-
function interactive (spec, scope) {
|
|
1476
|
-
return spec && spec.signal ? scope.signalRef(spec.signal) : spec === false ? false : true;
|
|
1477
|
-
}
|
|
1478
|
-
|
|
1479
|
-
/**
|
|
1480
|
-
* Parse a data transform specification.
|
|
1481
|
-
*/
|
|
1482
|
-
function parseTransform (spec, scope) {
|
|
1483
|
-
const def = definition$1(spec.type);
|
|
1484
|
-
if (!def) error('Unrecognized transform type: ' + $(spec.type));
|
|
1485
|
-
const t = entry(def.type.toLowerCase(), null, parseParameters(def, spec, scope));
|
|
1486
|
-
if (spec.signal) scope.addSignal(spec.signal, scope.proxy(t));
|
|
1487
|
-
t.metadata = def.metadata || {};
|
|
1488
|
-
return t;
|
|
1489
|
-
}
|
|
1490
|
-
|
|
1491
|
-
/**
|
|
1492
|
-
* Parse all parameters of a data transform.
|
|
1493
|
-
*/
|
|
1494
|
-
function parseParameters(def, spec, scope) {
|
|
1495
|
-
const params = {},
|
|
1496
|
-
n = def.params.length;
|
|
1497
|
-
for (let i = 0; i < n; ++i) {
|
|
1498
|
-
const pdef = def.params[i];
|
|
1499
|
-
params[pdef.name] = parseParameter(pdef, spec, scope);
|
|
1500
|
-
}
|
|
1501
|
-
return params;
|
|
1502
|
-
}
|
|
1503
|
-
|
|
1504
|
-
/**
|
|
1505
|
-
* Parse a data transform parameter.
|
|
1506
|
-
*/
|
|
1507
|
-
function parseParameter(def, spec, scope) {
|
|
1508
|
-
const type = def.type,
|
|
1509
|
-
value = spec[def.name];
|
|
1510
|
-
if (type === 'index') {
|
|
1511
|
-
return parseIndexParameter(def, spec, scope);
|
|
1512
|
-
} else if (value === undefined) {
|
|
1513
|
-
if (def.required) {
|
|
1514
|
-
error('Missing required ' + $(spec.type) + ' parameter: ' + $(def.name));
|
|
1515
|
-
}
|
|
1516
|
-
return;
|
|
1517
|
-
} else if (type === 'param') {
|
|
1518
|
-
return parseSubParameters(def, spec, scope);
|
|
1519
|
-
} else if (type === 'projection') {
|
|
1520
|
-
return scope.projectionRef(spec[def.name]);
|
|
1521
|
-
}
|
|
1522
|
-
return def.array && !isSignal(value) ? value.map(v => parameterValue(def, v, scope)) : parameterValue(def, value, scope);
|
|
1523
|
-
}
|
|
1524
|
-
|
|
1525
|
-
/**
|
|
1526
|
-
* Parse a single parameter value.
|
|
1527
|
-
*/
|
|
1528
|
-
function parameterValue(def, value, scope) {
|
|
1529
|
-
const type = def.type;
|
|
1530
|
-
if (isSignal(value)) {
|
|
1531
|
-
return isExpr(type) ? error('Expression references can not be signals.') : isField(type) ? scope.fieldRef(value) : isCompare(type) ? scope.compareRef(value) : scope.signalRef(value.signal);
|
|
1532
|
-
} else {
|
|
1533
|
-
const expr = def.expr || isField(type);
|
|
1534
|
-
return expr && outerExpr(value) ? scope.exprRef(value.expr, value.as) : expr && outerField(value) ? fieldRef$1(value.field, value.as) : isExpr(type) ? parser(value, scope) : isData(type) ? ref(scope.getData(value).values) : isField(type) ? fieldRef$1(value) : isCompare(type) ? scope.compareRef(value) : value;
|
|
1535
|
-
}
|
|
1536
|
-
}
|
|
1537
|
-
|
|
1538
|
-
/**
|
|
1539
|
-
* Parse parameter for accessing an index of another data set.
|
|
1540
|
-
*/
|
|
1541
|
-
function parseIndexParameter(def, spec, scope) {
|
|
1542
|
-
if (!isString(spec.from)) {
|
|
1543
|
-
error('Lookup "from" parameter must be a string literal.');
|
|
1544
|
-
}
|
|
1545
|
-
return scope.getData(spec.from).lookupRef(scope, spec.key);
|
|
1546
|
-
}
|
|
1547
|
-
|
|
1548
|
-
/**
|
|
1549
|
-
* Parse a parameter that contains one or more sub-parameter objects.
|
|
1550
|
-
*/
|
|
1551
|
-
function parseSubParameters(def, spec, scope) {
|
|
1552
|
-
const value = spec[def.name];
|
|
1553
|
-
if (def.array) {
|
|
1554
|
-
if (!isArray(value)) {
|
|
1555
|
-
// signals not allowed!
|
|
1556
|
-
error('Expected an array of sub-parameters. Instead: ' + $(value));
|
|
1557
|
-
}
|
|
1558
|
-
return value.map(v => parseSubParameter(def, v, scope));
|
|
1559
|
-
} else {
|
|
1560
|
-
return parseSubParameter(def, value, scope);
|
|
1561
|
-
}
|
|
1562
|
-
}
|
|
1563
|
-
|
|
1564
|
-
/**
|
|
1565
|
-
* Parse a sub-parameter object.
|
|
1566
|
-
*/
|
|
1567
|
-
function parseSubParameter(def, value, scope) {
|
|
1568
|
-
const n = def.params.length;
|
|
1569
|
-
let pdef;
|
|
1570
|
-
|
|
1571
|
-
// loop over defs to find matching key
|
|
1572
|
-
for (let i = 0; i < n; ++i) {
|
|
1573
|
-
pdef = def.params[i];
|
|
1574
|
-
for (const k in pdef.key) {
|
|
1575
|
-
if (pdef.key[k] !== value[k]) {
|
|
1576
|
-
pdef = null;
|
|
1577
|
-
break;
|
|
1578
|
-
}
|
|
1579
|
-
}
|
|
1580
|
-
if (pdef) break;
|
|
1581
|
-
}
|
|
1582
|
-
// raise error if matching key not found
|
|
1583
|
-
if (!pdef) error('Unsupported parameter: ' + $(value));
|
|
1584
|
-
|
|
1585
|
-
// parse params, create Params transform, return ref
|
|
1586
|
-
const params = extend(parseParameters(pdef, value, scope), pdef.key);
|
|
1587
|
-
return ref(scope.add(Params(params)));
|
|
1588
|
-
}
|
|
1589
|
-
|
|
1590
|
-
// -- Utilities -----
|
|
1591
|
-
|
|
1592
|
-
const outerExpr = _ => _ && _.expr;
|
|
1593
|
-
const outerField = _ => _ && _.field;
|
|
1594
|
-
const isData = _ => _ === 'data';
|
|
1595
|
-
const isExpr = _ => _ === 'expr';
|
|
1596
|
-
const isField = _ => _ === 'field';
|
|
1597
|
-
const isCompare = _ => _ === 'compare';
|
|
1598
|
-
|
|
1599
|
-
function parseData$1 (from, group, scope) {
|
|
1600
|
-
let facet, key, op, dataRef, parent;
|
|
1601
|
-
|
|
1602
|
-
// if no source data, generate singleton datum
|
|
1603
|
-
if (!from) {
|
|
1604
|
-
dataRef = ref(scope.add(Collect(null, [{}])));
|
|
1605
|
-
}
|
|
1606
|
-
|
|
1607
|
-
// if faceted, process facet specification
|
|
1608
|
-
else if (facet = from.facet) {
|
|
1609
|
-
if (!group) error('Only group marks can be faceted.');
|
|
1610
|
-
|
|
1611
|
-
// use pre-faceted source data, if available
|
|
1612
|
-
if (facet.field != null) {
|
|
1613
|
-
dataRef = parent = getDataRef(facet, scope);
|
|
1614
|
-
} else {
|
|
1615
|
-
// generate facet aggregates if no direct data specification
|
|
1616
|
-
if (!from.data) {
|
|
1617
|
-
op = parseTransform(extend({
|
|
1618
|
-
type: 'aggregate',
|
|
1619
|
-
groupby: array(facet.groupby)
|
|
1620
|
-
}, facet.aggregate), scope);
|
|
1621
|
-
op.params.key = scope.keyRef(facet.groupby);
|
|
1622
|
-
op.params.pulse = getDataRef(facet, scope);
|
|
1623
|
-
dataRef = parent = ref(scope.add(op));
|
|
1624
|
-
} else {
|
|
1625
|
-
parent = ref(scope.getData(from.data).aggregate);
|
|
1626
|
-
}
|
|
1627
|
-
key = scope.keyRef(facet.groupby, true);
|
|
1628
|
-
}
|
|
1629
|
-
}
|
|
1630
|
-
|
|
1631
|
-
// if not yet defined, get source data reference
|
|
1632
|
-
if (!dataRef) {
|
|
1633
|
-
dataRef = getDataRef(from, scope);
|
|
1634
|
-
}
|
|
1635
|
-
return {
|
|
1636
|
-
key: key,
|
|
1637
|
-
pulse: dataRef,
|
|
1638
|
-
parent: parent
|
|
1639
|
-
};
|
|
1640
|
-
}
|
|
1641
|
-
function getDataRef(from, scope) {
|
|
1642
|
-
return from.$ref ? from : from.data && from.data.$ref ? from.data : ref(scope.getData(from.data).output);
|
|
1643
|
-
}
|
|
1644
|
-
|
|
1645
|
-
function DataScope(scope, input, output, values, aggr) {
|
|
1646
|
-
this.scope = scope; // parent scope object
|
|
1647
|
-
this.input = input; // first operator in pipeline (tuple input)
|
|
1648
|
-
this.output = output; // last operator in pipeline (tuple output)
|
|
1649
|
-
this.values = values; // operator for accessing tuples (but not tuple flow)
|
|
1650
|
-
|
|
1651
|
-
// last aggregate in transform pipeline
|
|
1652
|
-
this.aggregate = aggr;
|
|
1653
|
-
|
|
1654
|
-
// lookup table of field indices
|
|
1655
|
-
this.index = {};
|
|
1656
|
-
}
|
|
1657
|
-
DataScope.fromEntries = function (scope, entries) {
|
|
1658
|
-
const n = entries.length,
|
|
1659
|
-
values = entries[n - 1],
|
|
1660
|
-
output = entries[n - 2];
|
|
1661
|
-
let input = entries[0],
|
|
1662
|
-
aggr = null,
|
|
1663
|
-
i = 1;
|
|
1664
|
-
if (input && input.type === 'load') {
|
|
1665
|
-
input = entries[1];
|
|
1666
|
-
}
|
|
1667
|
-
|
|
1668
|
-
// add operator entries to this scope, wire up pulse chain
|
|
1669
|
-
scope.add(entries[0]);
|
|
1670
|
-
for (; i < n; ++i) {
|
|
1671
|
-
entries[i].params.pulse = ref(entries[i - 1]);
|
|
1672
|
-
scope.add(entries[i]);
|
|
1673
|
-
if (entries[i].type === 'aggregate') aggr = entries[i];
|
|
1674
|
-
}
|
|
1675
|
-
return new DataScope(scope, input, output, values, aggr);
|
|
1676
|
-
};
|
|
1677
|
-
function fieldKey(field) {
|
|
1678
|
-
return isString(field) ? field : null;
|
|
1679
|
-
}
|
|
1680
|
-
function addSortField(scope, p, sort) {
|
|
1681
|
-
const as = aggrField(sort.op, sort.field);
|
|
1682
|
-
let s;
|
|
1683
|
-
if (p.ops) {
|
|
1684
|
-
for (let i = 0, n = p.as.length; i < n; ++i) {
|
|
1685
|
-
if (p.as[i] === as) return;
|
|
1686
|
-
}
|
|
1687
|
-
} else {
|
|
1688
|
-
p.ops = ['count'];
|
|
1689
|
-
p.fields = [null];
|
|
1690
|
-
p.as = ['count'];
|
|
1691
|
-
}
|
|
1692
|
-
if (sort.op) {
|
|
1693
|
-
p.ops.push((s = sort.op.signal) ? scope.signalRef(s) : sort.op);
|
|
1694
|
-
p.fields.push(scope.fieldRef(sort.field));
|
|
1695
|
-
p.as.push(as);
|
|
1696
|
-
}
|
|
1697
|
-
}
|
|
1698
|
-
function cache(scope, ds, name, optype, field, counts, index) {
|
|
1699
|
-
const cache = ds[name] || (ds[name] = {}),
|
|
1700
|
-
sort = sortKey(counts);
|
|
1701
|
-
let k = fieldKey(field),
|
|
1702
|
-
v,
|
|
1703
|
-
op;
|
|
1704
|
-
if (k != null) {
|
|
1705
|
-
scope = ds.scope;
|
|
1706
|
-
k = k + (sort ? '|' + sort : '');
|
|
1707
|
-
v = cache[k];
|
|
1708
|
-
}
|
|
1709
|
-
if (!v) {
|
|
1710
|
-
const params = counts ? {
|
|
1711
|
-
field: keyFieldRef,
|
|
1712
|
-
pulse: ds.countsRef(scope, field, counts)
|
|
1713
|
-
} : {
|
|
1714
|
-
field: scope.fieldRef(field),
|
|
1715
|
-
pulse: ref(ds.output)
|
|
1716
|
-
};
|
|
1717
|
-
if (sort) params.sort = scope.sortRef(counts);
|
|
1718
|
-
op = scope.add(entry(optype, undefined, params));
|
|
1719
|
-
if (index) ds.index[field] = op;
|
|
1720
|
-
v = ref(op);
|
|
1721
|
-
if (k != null) cache[k] = v;
|
|
1722
|
-
}
|
|
1723
|
-
return v;
|
|
1724
|
-
}
|
|
1725
|
-
DataScope.prototype = {
|
|
1726
|
-
countsRef(scope, field, sort) {
|
|
1727
|
-
const ds = this,
|
|
1728
|
-
cache = ds.counts || (ds.counts = {}),
|
|
1729
|
-
k = fieldKey(field);
|
|
1730
|
-
let v, a, p;
|
|
1731
|
-
if (k != null) {
|
|
1732
|
-
scope = ds.scope;
|
|
1733
|
-
v = cache[k];
|
|
1734
|
-
}
|
|
1735
|
-
if (!v) {
|
|
1736
|
-
p = {
|
|
1737
|
-
groupby: scope.fieldRef(field, 'key'),
|
|
1738
|
-
pulse: ref(ds.output)
|
|
1739
|
-
};
|
|
1740
|
-
if (sort && sort.field) addSortField(scope, p, sort);
|
|
1741
|
-
a = scope.add(Aggregate(p));
|
|
1742
|
-
v = scope.add(Collect({
|
|
1743
|
-
pulse: ref(a)
|
|
1744
|
-
}));
|
|
1745
|
-
v = {
|
|
1746
|
-
agg: a,
|
|
1747
|
-
ref: ref(v)
|
|
1748
|
-
};
|
|
1749
|
-
if (k != null) cache[k] = v;
|
|
1750
|
-
} else if (sort && sort.field) {
|
|
1751
|
-
addSortField(scope, v.agg.params, sort);
|
|
1752
|
-
}
|
|
1753
|
-
return v.ref;
|
|
1754
|
-
},
|
|
1755
|
-
tuplesRef() {
|
|
1756
|
-
return ref(this.values);
|
|
1757
|
-
},
|
|
1758
|
-
extentRef(scope, field) {
|
|
1759
|
-
return cache(scope, this, 'extent', 'extent', field, false);
|
|
1760
|
-
},
|
|
1761
|
-
domainRef(scope, field) {
|
|
1762
|
-
return cache(scope, this, 'domain', 'values', field, false);
|
|
1763
|
-
},
|
|
1764
|
-
valuesRef(scope, field, sort) {
|
|
1765
|
-
return cache(scope, this, 'vals', 'values', field, sort || true);
|
|
1766
|
-
},
|
|
1767
|
-
lookupRef(scope, field) {
|
|
1768
|
-
return cache(scope, this, 'lookup', 'tupleindex', field, false);
|
|
1769
|
-
},
|
|
1770
|
-
indataRef(scope, field) {
|
|
1771
|
-
return cache(scope, this, 'indata', 'tupleindex', field, true, true);
|
|
1772
|
-
}
|
|
1773
|
-
};
|
|
1774
|
-
|
|
1775
|
-
function parseFacet (spec, scope, group) {
|
|
1776
|
-
const facet = spec.from.facet,
|
|
1777
|
-
name = facet.name,
|
|
1778
|
-
data = getDataRef(facet, scope);
|
|
1779
|
-
let op;
|
|
1780
|
-
if (!facet.name) {
|
|
1781
|
-
error('Facet must have a name: ' + $(facet));
|
|
1782
|
-
}
|
|
1783
|
-
if (!facet.data) {
|
|
1784
|
-
error('Facet must reference a data set: ' + $(facet));
|
|
1785
|
-
}
|
|
1786
|
-
if (facet.field) {
|
|
1787
|
-
op = scope.add(PreFacet({
|
|
1788
|
-
field: scope.fieldRef(facet.field),
|
|
1789
|
-
pulse: data
|
|
1790
|
-
}));
|
|
1791
|
-
} else if (facet.groupby) {
|
|
1792
|
-
op = scope.add(Facet({
|
|
1793
|
-
key: scope.keyRef(facet.groupby),
|
|
1794
|
-
group: ref(scope.proxy(group.parent)),
|
|
1795
|
-
pulse: data
|
|
1796
|
-
}));
|
|
1797
|
-
} else {
|
|
1798
|
-
error('Facet must specify groupby or field: ' + $(facet));
|
|
1799
|
-
}
|
|
1800
|
-
|
|
1801
|
-
// initialize facet subscope
|
|
1802
|
-
const subscope = scope.fork(),
|
|
1803
|
-
source = subscope.add(Collect()),
|
|
1804
|
-
values = subscope.add(Sieve({
|
|
1805
|
-
pulse: ref(source)
|
|
1806
|
-
}));
|
|
1807
|
-
subscope.addData(name, new DataScope(subscope, source, source, values));
|
|
1808
|
-
subscope.addSignal('parent', null);
|
|
1809
|
-
|
|
1810
|
-
// parse faceted subflow
|
|
1811
|
-
op.params.subflow = {
|
|
1812
|
-
$subflow: subscope.parse(spec).toRuntime()
|
|
1813
|
-
};
|
|
1814
|
-
}
|
|
1815
|
-
|
|
1816
|
-
function parseSubflow (spec, scope, input) {
|
|
1817
|
-
const op = scope.add(PreFacet({
|
|
1818
|
-
pulse: input.pulse
|
|
1819
|
-
})),
|
|
1820
|
-
subscope = scope.fork();
|
|
1821
|
-
subscope.add(Sieve());
|
|
1822
|
-
subscope.addSignal('parent', null);
|
|
1823
|
-
|
|
1824
|
-
// parse group mark subflow
|
|
1825
|
-
op.params.subflow = {
|
|
1826
|
-
$subflow: subscope.parse(spec).toRuntime()
|
|
1827
|
-
};
|
|
1828
|
-
}
|
|
1829
|
-
|
|
1830
|
-
function parseTrigger (spec, scope, name) {
|
|
1831
|
-
const remove = spec.remove,
|
|
1832
|
-
insert = spec.insert,
|
|
1833
|
-
toggle = spec.toggle,
|
|
1834
|
-
modify = spec.modify,
|
|
1835
|
-
values = spec.values,
|
|
1836
|
-
op = scope.add(operator());
|
|
1837
|
-
const update = 'if(' + spec.trigger + ',modify("' + name + '",' + [insert, remove, toggle, modify, values].map(_ => _ == null ? 'null' : _).join(',') + '),0)';
|
|
1838
|
-
const expr = parser(update, scope);
|
|
1839
|
-
op.update = expr.$expr;
|
|
1840
|
-
op.params = expr.$params;
|
|
1841
|
-
}
|
|
1842
|
-
|
|
1843
|
-
function parseMark (spec, scope) {
|
|
1844
|
-
const role = getRole(spec),
|
|
1845
|
-
group = spec.type === GroupMark,
|
|
1846
|
-
facet = spec.from && spec.from.facet,
|
|
1847
|
-
overlap = spec.overlap;
|
|
1848
|
-
let layout = spec.layout || role === ScopeRole || role === FrameRole,
|
|
1849
|
-
ops,
|
|
1850
|
-
op,
|
|
1851
|
-
store,
|
|
1852
|
-
enc,
|
|
1853
|
-
name,
|
|
1854
|
-
layoutRef,
|
|
1855
|
-
boundRef;
|
|
1856
|
-
const nested = role === MarkRole || layout || facet;
|
|
1857
|
-
|
|
1858
|
-
// resolve input data
|
|
1859
|
-
const input = parseData$1(spec.from, group, scope);
|
|
1860
|
-
|
|
1861
|
-
// data join to map tuples to visual items
|
|
1862
|
-
op = scope.add(DataJoin({
|
|
1863
|
-
key: input.key || (spec.key ? fieldRef$1(spec.key) : undefined),
|
|
1864
|
-
pulse: input.pulse,
|
|
1865
|
-
clean: !group
|
|
1866
|
-
}));
|
|
1867
|
-
const joinRef = ref(op);
|
|
1868
|
-
|
|
1869
|
-
// collect visual items
|
|
1870
|
-
op = store = scope.add(Collect({
|
|
1871
|
-
pulse: joinRef
|
|
1872
|
-
}));
|
|
1873
|
-
|
|
1874
|
-
// connect visual items to scenegraph
|
|
1875
|
-
op = scope.add(Mark({
|
|
1876
|
-
markdef: definition(spec),
|
|
1877
|
-
interactive: interactive(spec.interactive, scope),
|
|
1878
|
-
clip: clip(spec.clip, scope),
|
|
1879
|
-
context: {
|
|
1880
|
-
$context: true
|
|
1881
|
-
},
|
|
1882
|
-
groups: scope.lookup(),
|
|
1883
|
-
parent: scope.signals.parent ? scope.signalRef('parent') : null,
|
|
1884
|
-
index: scope.markpath(),
|
|
1885
|
-
pulse: ref(op)
|
|
1886
|
-
}));
|
|
1887
|
-
const markRef = ref(op);
|
|
1888
|
-
|
|
1889
|
-
// add visual encoders
|
|
1890
|
-
op = enc = scope.add(Encode(parseEncode(spec.encode, spec.type, role, spec.style, scope, {
|
|
1891
|
-
mod: false,
|
|
1892
|
-
pulse: markRef
|
|
1893
|
-
})));
|
|
1894
|
-
|
|
1895
|
-
// monitor parent marks to propagate changes
|
|
1896
|
-
op.params.parent = scope.encode();
|
|
1897
|
-
|
|
1898
|
-
// add post-encoding transforms, if defined
|
|
1899
|
-
if (spec.transform) {
|
|
1900
|
-
spec.transform.forEach(_ => {
|
|
1901
|
-
const tx = parseTransform(_, scope),
|
|
1902
|
-
md = tx.metadata;
|
|
1903
|
-
if (md.generates || md.changes) {
|
|
1904
|
-
error('Mark transforms should not generate new data.');
|
|
1905
|
-
}
|
|
1906
|
-
if (!md.nomod) enc.params.mod = true; // update encode mod handling
|
|
1907
|
-
tx.params.pulse = ref(op);
|
|
1908
|
-
scope.add(op = tx);
|
|
1909
|
-
});
|
|
1910
|
-
}
|
|
1911
|
-
|
|
1912
|
-
// if item sort specified, perform post-encoding
|
|
1913
|
-
if (spec.sort) {
|
|
1914
|
-
op = scope.add(SortItems({
|
|
1915
|
-
sort: scope.compareRef(spec.sort),
|
|
1916
|
-
pulse: ref(op)
|
|
1917
|
-
}));
|
|
1918
|
-
}
|
|
1919
|
-
const encodeRef = ref(op);
|
|
1920
|
-
|
|
1921
|
-
// add view layout operator if needed
|
|
1922
|
-
if (facet || layout) {
|
|
1923
|
-
layout = scope.add(ViewLayout({
|
|
1924
|
-
layout: scope.objectProperty(spec.layout),
|
|
1925
|
-
legends: scope.legends,
|
|
1926
|
-
mark: markRef,
|
|
1927
|
-
pulse: encodeRef
|
|
1928
|
-
}));
|
|
1929
|
-
layoutRef = ref(layout);
|
|
1930
|
-
}
|
|
1931
|
-
|
|
1932
|
-
// compute bounding boxes
|
|
1933
|
-
const bound = scope.add(Bound({
|
|
1934
|
-
mark: markRef,
|
|
1935
|
-
pulse: layoutRef || encodeRef
|
|
1936
|
-
}));
|
|
1937
|
-
boundRef = ref(bound);
|
|
1938
|
-
|
|
1939
|
-
// if group mark, recurse to parse nested content
|
|
1940
|
-
if (group) {
|
|
1941
|
-
// juggle layout & bounds to ensure they run *after* any faceting transforms
|
|
1942
|
-
if (nested) {
|
|
1943
|
-
ops = scope.operators;
|
|
1944
|
-
ops.pop();
|
|
1945
|
-
if (layout) ops.pop();
|
|
1946
|
-
}
|
|
1947
|
-
scope.pushState(encodeRef, layoutRef || boundRef, joinRef);
|
|
1948
|
-
facet ? parseFacet(spec, scope, input) // explicit facet
|
|
1949
|
-
: nested ? parseSubflow(spec, scope, input) // standard mark group
|
|
1950
|
-
: scope.parse(spec); // guide group, we can avoid nested scopes
|
|
1951
|
-
scope.popState();
|
|
1952
|
-
if (nested) {
|
|
1953
|
-
if (layout) ops.push(layout);
|
|
1954
|
-
ops.push(bound);
|
|
1955
|
-
}
|
|
1956
|
-
}
|
|
1957
|
-
|
|
1958
|
-
// if requested, add overlap removal transform
|
|
1959
|
-
if (overlap) {
|
|
1960
|
-
boundRef = parseOverlap(overlap, boundRef, scope);
|
|
1961
|
-
}
|
|
1962
|
-
|
|
1963
|
-
// render / sieve items
|
|
1964
|
-
const render = scope.add(Render({
|
|
1965
|
-
pulse: boundRef
|
|
1966
|
-
})),
|
|
1967
|
-
sieve = scope.add(Sieve({
|
|
1968
|
-
pulse: ref(render)
|
|
1969
|
-
}, undefined, scope.parent()));
|
|
1970
|
-
|
|
1971
|
-
// if mark is named, make accessible as reactive geometry
|
|
1972
|
-
// add trigger updates if defined
|
|
1973
|
-
if (spec.name != null) {
|
|
1974
|
-
name = spec.name;
|
|
1975
|
-
scope.addData(name, new DataScope(scope, store, render, sieve));
|
|
1976
|
-
if (spec.on) spec.on.forEach(on => {
|
|
1977
|
-
if (on.insert || on.remove || on.toggle) {
|
|
1978
|
-
error('Marks only support modify triggers.');
|
|
1979
|
-
}
|
|
1980
|
-
parseTrigger(on, scope, name);
|
|
1981
|
-
});
|
|
1982
|
-
}
|
|
1983
|
-
}
|
|
1984
|
-
function parseOverlap(overlap, source, scope) {
|
|
1985
|
-
const method = overlap.method,
|
|
1986
|
-
bound = overlap.bound,
|
|
1987
|
-
sep = overlap.separation;
|
|
1988
|
-
const params = {
|
|
1989
|
-
separation: isSignal(sep) ? scope.signalRef(sep.signal) : sep,
|
|
1990
|
-
method: isSignal(method) ? scope.signalRef(method.signal) : method,
|
|
1991
|
-
pulse: source
|
|
1992
|
-
};
|
|
1993
|
-
if (overlap.order) {
|
|
1994
|
-
params.sort = scope.compareRef({
|
|
1995
|
-
field: overlap.order
|
|
1996
|
-
});
|
|
1997
|
-
}
|
|
1998
|
-
if (bound) {
|
|
1999
|
-
const tol = bound.tolerance;
|
|
2000
|
-
params.boundTolerance = isSignal(tol) ? scope.signalRef(tol.signal) : +tol;
|
|
2001
|
-
params.boundScale = scope.scaleRef(bound.scale);
|
|
2002
|
-
params.boundOrient = bound.orient;
|
|
2003
|
-
}
|
|
2004
|
-
return ref(scope.add(Overlap(params)));
|
|
2005
|
-
}
|
|
2006
|
-
|
|
2007
|
-
function parseLegend (spec, scope) {
|
|
2008
|
-
const config = scope.config.legend,
|
|
2009
|
-
encode = spec.encode || {},
|
|
2010
|
-
_ = lookup(spec, config),
|
|
2011
|
-
legendEncode = encode.legend || {},
|
|
2012
|
-
name = legendEncode.name || undefined,
|
|
2013
|
-
interactive = legendEncode.interactive,
|
|
2014
|
-
style = legendEncode.style,
|
|
2015
|
-
scales = {};
|
|
2016
|
-
let scale = 0,
|
|
2017
|
-
entryLayout,
|
|
2018
|
-
params,
|
|
2019
|
-
children;
|
|
2020
|
-
|
|
2021
|
-
// resolve scales and 'canonical' scale name
|
|
2022
|
-
LegendScales.forEach(s => spec[s] ? (scales[s] = spec[s], scale = scale || spec[s]) : 0);
|
|
2023
|
-
if (!scale) error('Missing valid scale for legend.');
|
|
2024
|
-
|
|
2025
|
-
// resolve legend type (symbol, gradient, or discrete gradient)
|
|
2026
|
-
const type = legendType(spec, scope.scaleType(scale));
|
|
2027
|
-
|
|
2028
|
-
// single-element data source for legend group
|
|
2029
|
-
const datum = {
|
|
2030
|
-
title: spec.title != null,
|
|
2031
|
-
scales: scales,
|
|
2032
|
-
type: type,
|
|
2033
|
-
vgrad: type !== 'symbol' && _.isVertical()
|
|
2034
|
-
};
|
|
2035
|
-
const dataRef = ref(scope.add(Collect(null, [datum])));
|
|
2036
|
-
|
|
2037
|
-
// encoding properties for legend entry sub-group
|
|
2038
|
-
const entryEncode = {
|
|
2039
|
-
enter: {
|
|
2040
|
-
x: {
|
|
2041
|
-
value: 0
|
|
2042
|
-
},
|
|
2043
|
-
y: {
|
|
2044
|
-
value: 0
|
|
2045
|
-
}
|
|
2046
|
-
}
|
|
2047
|
-
};
|
|
2048
|
-
|
|
2049
|
-
// data source for legend values
|
|
2050
|
-
const entryRef = ref(scope.add(LegendEntries(params = {
|
|
2051
|
-
type: type,
|
|
2052
|
-
scale: scope.scaleRef(scale),
|
|
2053
|
-
count: scope.objectProperty(_('tickCount')),
|
|
2054
|
-
limit: scope.property(_('symbolLimit')),
|
|
2055
|
-
values: scope.objectProperty(spec.values),
|
|
2056
|
-
minstep: scope.property(spec.tickMinStep),
|
|
2057
|
-
formatType: scope.property(spec.formatType),
|
|
2058
|
-
formatSpecifier: scope.property(spec.format)
|
|
2059
|
-
})));
|
|
2060
|
-
|
|
2061
|
-
// continuous gradient legend
|
|
2062
|
-
if (type === Gradient) {
|
|
2063
|
-
children = [legendGradient(spec, scale, config, encode.gradient), legendGradientLabels(spec, config, encode.labels, entryRef)];
|
|
2064
|
-
// adjust default tick count based on the gradient length
|
|
2065
|
-
params.count = params.count || scope.signalRef(`max(2,2*floor((${deref(_.gradientLength())})/100))`);
|
|
2066
|
-
}
|
|
2067
|
-
|
|
2068
|
-
// discrete gradient legend
|
|
2069
|
-
else if (type === Discrete) {
|
|
2070
|
-
children = [legendGradientDiscrete(spec, scale, config, encode.gradient, entryRef), legendGradientLabels(spec, config, encode.labels, entryRef)];
|
|
2071
|
-
}
|
|
2072
|
-
|
|
2073
|
-
// symbol legend
|
|
2074
|
-
else {
|
|
2075
|
-
// determine legend symbol group layout
|
|
2076
|
-
entryLayout = legendSymbolLayout(spec, config);
|
|
2077
|
-
children = [legendSymbolGroups(spec, config, encode, entryRef, deref(entryLayout.columns))];
|
|
2078
|
-
// pass symbol size information to legend entry generator
|
|
2079
|
-
params.size = sizeExpression(spec, scope, children[0].marks);
|
|
2080
|
-
}
|
|
2081
|
-
|
|
2082
|
-
// generate legend marks
|
|
2083
|
-
children = [guideGroup({
|
|
2084
|
-
role: LegendEntryRole,
|
|
2085
|
-
from: dataRef,
|
|
2086
|
-
encode: entryEncode,
|
|
2087
|
-
marks: children,
|
|
2088
|
-
layout: entryLayout,
|
|
2089
|
-
interactive
|
|
2090
|
-
})];
|
|
2091
|
-
|
|
2092
|
-
// include legend title if defined
|
|
2093
|
-
if (datum.title) {
|
|
2094
|
-
children.push(legendTitle(spec, config, encode.title, dataRef));
|
|
2095
|
-
}
|
|
2096
|
-
|
|
2097
|
-
// parse legend specification
|
|
2098
|
-
return parseMark(guideGroup({
|
|
2099
|
-
role: LegendRole,
|
|
2100
|
-
from: dataRef,
|
|
2101
|
-
encode: extendEncode(buildLegendEncode(_, spec, config), legendEncode, Skip),
|
|
2102
|
-
marks: children,
|
|
2103
|
-
aria: _('aria'),
|
|
2104
|
-
description: _('description'),
|
|
2105
|
-
zindex: _('zindex'),
|
|
2106
|
-
name,
|
|
2107
|
-
interactive,
|
|
2108
|
-
style
|
|
2109
|
-
}), scope);
|
|
2110
|
-
}
|
|
2111
|
-
function legendType(spec, scaleType) {
|
|
2112
|
-
let type = spec.type || Symbols;
|
|
2113
|
-
if (!spec.type && scaleCount(spec) === 1 && (spec.fill || spec.stroke)) {
|
|
2114
|
-
type = isContinuous(scaleType) ? Gradient : isDiscretizing(scaleType) ? Discrete : Symbols;
|
|
2115
|
-
}
|
|
2116
|
-
return type !== Gradient ? type : isDiscretizing(scaleType) ? Discrete : Gradient;
|
|
2117
|
-
}
|
|
2118
|
-
function scaleCount(spec) {
|
|
2119
|
-
return LegendScales.reduce((count, type) => count + (spec[type] ? 1 : 0), 0);
|
|
2120
|
-
}
|
|
2121
|
-
function buildLegendEncode(_, spec, config) {
|
|
2122
|
-
const encode = {
|
|
2123
|
-
enter: {},
|
|
2124
|
-
update: {}
|
|
2125
|
-
};
|
|
2126
|
-
addEncoders(encode, {
|
|
2127
|
-
orient: _('orient'),
|
|
2128
|
-
offset: _('offset'),
|
|
2129
|
-
padding: _('padding'),
|
|
2130
|
-
titlePadding: _('titlePadding'),
|
|
2131
|
-
cornerRadius: _('cornerRadius'),
|
|
2132
|
-
fill: _('fillColor'),
|
|
2133
|
-
stroke: _('strokeColor'),
|
|
2134
|
-
strokeWidth: config.strokeWidth,
|
|
2135
|
-
strokeDash: config.strokeDash,
|
|
2136
|
-
x: _('legendX'),
|
|
2137
|
-
y: _('legendY'),
|
|
2138
|
-
// accessibility support
|
|
2139
|
-
format: spec.format,
|
|
2140
|
-
formatType: spec.formatType
|
|
2141
|
-
});
|
|
2142
|
-
return encode;
|
|
2143
|
-
}
|
|
2144
|
-
function sizeExpression(spec, scope, marks) {
|
|
2145
|
-
const size = deref(getChannel('size', spec, marks)),
|
|
2146
|
-
strokeWidth = deref(getChannel('strokeWidth', spec, marks)),
|
|
2147
|
-
fontSize = deref(getFontSize(marks[1].encode, scope, GuideLabelStyle));
|
|
2148
|
-
return parser(`max(ceil(sqrt(${size})+${strokeWidth}),${fontSize})`, scope);
|
|
2149
|
-
}
|
|
2150
|
-
function getChannel(name, spec, marks) {
|
|
2151
|
-
return spec[name] ? `scale("${spec[name]}",datum)` : getEncoding(name, marks[0].encode);
|
|
2152
|
-
}
|
|
2153
|
-
function getFontSize(encode, scope, style) {
|
|
2154
|
-
return getEncoding('fontSize', encode) || getStyle('fontSize', scope, style);
|
|
2155
|
-
}
|
|
2156
|
-
|
|
2157
|
-
const angleExpr = `item.orient==="${Left}"?-90:item.orient==="${Right}"?90:0`;
|
|
2158
|
-
function parseTitle (spec, scope) {
|
|
2159
|
-
spec = isString(spec) ? {
|
|
2160
|
-
text: spec
|
|
2161
|
-
} : spec;
|
|
2162
|
-
const _ = lookup(spec, scope.config.title),
|
|
2163
|
-
encode = spec.encode || {},
|
|
2164
|
-
userEncode = encode.group || {},
|
|
2165
|
-
name = userEncode.name || undefined,
|
|
2166
|
-
interactive = userEncode.interactive,
|
|
2167
|
-
style = userEncode.style,
|
|
2168
|
-
children = [];
|
|
2169
|
-
|
|
2170
|
-
// single-element data source for group title
|
|
2171
|
-
const datum = {},
|
|
2172
|
-
dataRef = ref(scope.add(Collect(null, [datum])));
|
|
2173
|
-
|
|
2174
|
-
// include title text
|
|
2175
|
-
children.push(buildTitle(spec, _, titleEncode(spec), dataRef));
|
|
2176
|
-
|
|
2177
|
-
// include subtitle text
|
|
2178
|
-
if (spec.subtitle) {
|
|
2179
|
-
children.push(buildSubTitle(spec, _, encode.subtitle, dataRef));
|
|
2180
|
-
}
|
|
2181
|
-
|
|
2182
|
-
// parse title specification
|
|
2183
|
-
return parseMark(guideGroup({
|
|
2184
|
-
role: TitleRole,
|
|
2185
|
-
from: dataRef,
|
|
2186
|
-
encode: groupEncode(_, userEncode),
|
|
2187
|
-
marks: children,
|
|
2188
|
-
aria: _('aria'),
|
|
2189
|
-
description: _('description'),
|
|
2190
|
-
zindex: _('zindex'),
|
|
2191
|
-
name,
|
|
2192
|
-
interactive,
|
|
2193
|
-
style
|
|
2194
|
-
}), scope);
|
|
2195
|
-
}
|
|
2196
|
-
|
|
2197
|
-
// provide backwards-compatibility for title custom encode;
|
|
2198
|
-
// the top-level encode block has been *deprecated*.
|
|
2199
|
-
function titleEncode(spec) {
|
|
2200
|
-
const encode = spec.encode;
|
|
2201
|
-
return encode && encode.title || extend({
|
|
2202
|
-
name: spec.name,
|
|
2203
|
-
interactive: spec.interactive,
|
|
2204
|
-
style: spec.style
|
|
2205
|
-
}, encode);
|
|
2206
|
-
}
|
|
2207
|
-
function groupEncode(_, userEncode) {
|
|
2208
|
-
const encode = {
|
|
2209
|
-
enter: {},
|
|
2210
|
-
update: {}
|
|
2211
|
-
};
|
|
2212
|
-
addEncoders(encode, {
|
|
2213
|
-
orient: _('orient'),
|
|
2214
|
-
anchor: _('anchor'),
|
|
2215
|
-
align: {
|
|
2216
|
-
signal: alignExpr$1
|
|
2217
|
-
},
|
|
2218
|
-
angle: {
|
|
2219
|
-
signal: angleExpr
|
|
2220
|
-
},
|
|
2221
|
-
limit: _('limit'),
|
|
2222
|
-
frame: _('frame'),
|
|
2223
|
-
offset: _('offset') || 0,
|
|
2224
|
-
padding: _('subtitlePadding')
|
|
2225
|
-
});
|
|
2226
|
-
return extendEncode(encode, userEncode, Skip);
|
|
2227
|
-
}
|
|
2228
|
-
function buildTitle(spec, _, userEncode, dataRef) {
|
|
2229
|
-
const zero = {
|
|
2230
|
-
value: 0
|
|
2231
|
-
},
|
|
2232
|
-
text = spec.text,
|
|
2233
|
-
encode = {
|
|
2234
|
-
enter: {
|
|
2235
|
-
opacity: zero
|
|
2236
|
-
},
|
|
2237
|
-
update: {
|
|
2238
|
-
opacity: {
|
|
2239
|
-
value: 1
|
|
2240
|
-
}
|
|
2241
|
-
},
|
|
2242
|
-
exit: {
|
|
2243
|
-
opacity: zero
|
|
2244
|
-
}
|
|
2245
|
-
};
|
|
2246
|
-
addEncoders(encode, {
|
|
2247
|
-
text: text,
|
|
2248
|
-
align: {
|
|
2249
|
-
signal: 'item.mark.group.align'
|
|
2250
|
-
},
|
|
2251
|
-
angle: {
|
|
2252
|
-
signal: 'item.mark.group.angle'
|
|
2253
|
-
},
|
|
2254
|
-
limit: {
|
|
2255
|
-
signal: 'item.mark.group.limit'
|
|
2256
|
-
},
|
|
2257
|
-
baseline: 'top',
|
|
2258
|
-
dx: _('dx'),
|
|
2259
|
-
dy: _('dy'),
|
|
2260
|
-
fill: _('color'),
|
|
2261
|
-
font: _('font'),
|
|
2262
|
-
fontSize: _('fontSize'),
|
|
2263
|
-
fontStyle: _('fontStyle'),
|
|
2264
|
-
fontWeight: _('fontWeight'),
|
|
2265
|
-
lineHeight: _('lineHeight')
|
|
2266
|
-
}, {
|
|
2267
|
-
// update
|
|
2268
|
-
align: _('align'),
|
|
2269
|
-
angle: _('angle'),
|
|
2270
|
-
baseline: _('baseline')
|
|
2271
|
-
});
|
|
2272
|
-
return guideMark({
|
|
2273
|
-
type: TextMark,
|
|
2274
|
-
role: TitleTextRole,
|
|
2275
|
-
style: GroupTitleStyle,
|
|
2276
|
-
from: dataRef,
|
|
2277
|
-
encode
|
|
2278
|
-
}, userEncode);
|
|
2279
|
-
}
|
|
2280
|
-
function buildSubTitle(spec, _, userEncode, dataRef) {
|
|
2281
|
-
const zero = {
|
|
2282
|
-
value: 0
|
|
2283
|
-
},
|
|
2284
|
-
text = spec.subtitle,
|
|
2285
|
-
encode = {
|
|
2286
|
-
enter: {
|
|
2287
|
-
opacity: zero
|
|
2288
|
-
},
|
|
2289
|
-
update: {
|
|
2290
|
-
opacity: {
|
|
2291
|
-
value: 1
|
|
2292
|
-
}
|
|
2293
|
-
},
|
|
2294
|
-
exit: {
|
|
2295
|
-
opacity: zero
|
|
2296
|
-
}
|
|
2297
|
-
};
|
|
2298
|
-
addEncoders(encode, {
|
|
2299
|
-
text: text,
|
|
2300
|
-
align: {
|
|
2301
|
-
signal: 'item.mark.group.align'
|
|
2302
|
-
},
|
|
2303
|
-
angle: {
|
|
2304
|
-
signal: 'item.mark.group.angle'
|
|
2305
|
-
},
|
|
2306
|
-
limit: {
|
|
2307
|
-
signal: 'item.mark.group.limit'
|
|
2308
|
-
},
|
|
2309
|
-
baseline: 'top',
|
|
2310
|
-
dx: _('dx'),
|
|
2311
|
-
dy: _('dy'),
|
|
2312
|
-
fill: _('subtitleColor'),
|
|
2313
|
-
font: _('subtitleFont'),
|
|
2314
|
-
fontSize: _('subtitleFontSize'),
|
|
2315
|
-
fontStyle: _('subtitleFontStyle'),
|
|
2316
|
-
fontWeight: _('subtitleFontWeight'),
|
|
2317
|
-
lineHeight: _('subtitleLineHeight')
|
|
2318
|
-
}, {
|
|
2319
|
-
// update
|
|
2320
|
-
align: _('align'),
|
|
2321
|
-
angle: _('angle'),
|
|
2322
|
-
baseline: _('baseline')
|
|
2323
|
-
});
|
|
2324
|
-
return guideMark({
|
|
2325
|
-
type: TextMark,
|
|
2326
|
-
role: TitleSubtitleRole,
|
|
2327
|
-
style: GroupSubtitleStyle,
|
|
2328
|
-
from: dataRef,
|
|
2329
|
-
encode
|
|
2330
|
-
}, userEncode);
|
|
2331
|
-
}
|
|
2332
|
-
|
|
2333
|
-
function parseData(data, scope) {
|
|
2334
|
-
const transforms = [];
|
|
2335
|
-
if (data.transform) {
|
|
2336
|
-
data.transform.forEach(tx => {
|
|
2337
|
-
transforms.push(parseTransform(tx, scope));
|
|
2338
|
-
});
|
|
2339
|
-
}
|
|
2340
|
-
if (data.on) {
|
|
2341
|
-
data.on.forEach(on => {
|
|
2342
|
-
parseTrigger(on, scope, data.name);
|
|
2343
|
-
});
|
|
2344
|
-
}
|
|
2345
|
-
scope.addDataPipeline(data.name, analyze(data, scope, transforms));
|
|
2346
|
-
}
|
|
2347
|
-
|
|
2348
|
-
/**
|
|
2349
|
-
* Analyze a data pipeline, add needed operators.
|
|
2350
|
-
*/
|
|
2351
|
-
function analyze(data, scope, ops) {
|
|
2352
|
-
const output = [];
|
|
2353
|
-
let source = null,
|
|
2354
|
-
modify = false,
|
|
2355
|
-
generate = false,
|
|
2356
|
-
upstream,
|
|
2357
|
-
i,
|
|
2358
|
-
n,
|
|
2359
|
-
t,
|
|
2360
|
-
m;
|
|
2361
|
-
if (data.values) {
|
|
2362
|
-
// hard-wired input data set
|
|
2363
|
-
if (isSignal(data.values) || hasSignal(data.format)) {
|
|
2364
|
-
// if either values is signal or format has signal, use dynamic loader
|
|
2365
|
-
output.push(load(scope, data));
|
|
2366
|
-
output.push(source = collect());
|
|
2367
|
-
} else {
|
|
2368
|
-
// otherwise, ingest upon dataflow init
|
|
2369
|
-
output.push(source = collect({
|
|
2370
|
-
$ingest: data.values,
|
|
2371
|
-
$format: data.format
|
|
2372
|
-
}));
|
|
2373
|
-
}
|
|
2374
|
-
} else if (data.url) {
|
|
2375
|
-
// load data from external source
|
|
2376
|
-
if (hasSignal(data.url) || hasSignal(data.format)) {
|
|
2377
|
-
// if either url or format has signal, use dynamic loader
|
|
2378
|
-
output.push(load(scope, data));
|
|
2379
|
-
output.push(source = collect());
|
|
2380
|
-
} else {
|
|
2381
|
-
// otherwise, request load upon dataflow init
|
|
2382
|
-
output.push(source = collect({
|
|
2383
|
-
$request: data.url,
|
|
2384
|
-
$format: data.format
|
|
2385
|
-
}));
|
|
2386
|
-
}
|
|
2387
|
-
} else if (data.source) {
|
|
2388
|
-
// derives from one or more other data sets
|
|
2389
|
-
source = upstream = array(data.source).map(d => ref(scope.getData(d).output));
|
|
2390
|
-
output.push(null); // populate later
|
|
2391
|
-
}
|
|
2392
|
-
|
|
2393
|
-
// scan data transforms, add collectors as needed
|
|
2394
|
-
for (i = 0, n = ops.length; i < n; ++i) {
|
|
2395
|
-
t = ops[i];
|
|
2396
|
-
m = t.metadata;
|
|
2397
|
-
if (!source && !m.source) {
|
|
2398
|
-
output.push(source = collect());
|
|
2399
|
-
}
|
|
2400
|
-
output.push(t);
|
|
2401
|
-
if (m.generates) generate = true;
|
|
2402
|
-
if (m.modifies && !generate) modify = true;
|
|
2403
|
-
if (m.source) source = t;else if (m.changes) source = null;
|
|
2404
|
-
}
|
|
2405
|
-
if (upstream) {
|
|
2406
|
-
n = upstream.length - 1;
|
|
2407
|
-
output[0] = Relay({
|
|
2408
|
-
derive: modify,
|
|
2409
|
-
pulse: n ? upstream : upstream[0]
|
|
2410
|
-
});
|
|
2411
|
-
if (modify || n) {
|
|
2412
|
-
// collect derived and multi-pulse tuples
|
|
2413
|
-
output.splice(1, 0, collect());
|
|
2414
|
-
}
|
|
2415
|
-
}
|
|
2416
|
-
if (!source) output.push(collect());
|
|
2417
|
-
output.push(Sieve({}));
|
|
2418
|
-
return output;
|
|
2419
|
-
}
|
|
2420
|
-
function collect(values) {
|
|
2421
|
-
const s = Collect({}, values);
|
|
2422
|
-
s.metadata = {
|
|
2423
|
-
source: true
|
|
2424
|
-
};
|
|
2425
|
-
return s;
|
|
2426
|
-
}
|
|
2427
|
-
function load(scope, data) {
|
|
2428
|
-
return Load({
|
|
2429
|
-
url: data.url ? scope.property(data.url) : undefined,
|
|
2430
|
-
async: data.async ? scope.property(data.async) : undefined,
|
|
2431
|
-
values: data.values ? scope.property(data.values) : undefined,
|
|
2432
|
-
format: scope.objectProperty(data.format)
|
|
2433
|
-
});
|
|
2434
|
-
}
|
|
2435
|
-
|
|
2436
|
-
const isX = orient => orient === Bottom || orient === Top;
|
|
2437
|
-
|
|
2438
|
-
// get sign coefficient based on axis orient
|
|
2439
|
-
const getSign = (orient, a, b) => isSignal(orient) ? ifLeftTopExpr(orient.signal, a, b) : orient === Left || orient === Top ? a : b;
|
|
2440
|
-
|
|
2441
|
-
// condition on axis x-direction
|
|
2442
|
-
const ifX = (orient, a, b) => isSignal(orient) ? ifXEnc(orient.signal, a, b) : isX(orient) ? a : b;
|
|
2443
|
-
|
|
2444
|
-
// condition on axis y-direction
|
|
2445
|
-
const ifY = (orient, a, b) => isSignal(orient) ? ifYEnc(orient.signal, a, b) : isX(orient) ? b : a;
|
|
2446
|
-
const ifTop = (orient, a, b) => isSignal(orient) ? ifTopExpr(orient.signal, a, b) : orient === Top ? {
|
|
2447
|
-
value: a
|
|
2448
|
-
} : {
|
|
2449
|
-
value: b
|
|
2450
|
-
};
|
|
2451
|
-
const ifRight = (orient, a, b) => isSignal(orient) ? ifRightExpr(orient.signal, a, b) : orient === Right ? {
|
|
2452
|
-
value: a
|
|
2453
|
-
} : {
|
|
2454
|
-
value: b
|
|
2455
|
-
};
|
|
2456
|
-
const ifXEnc = ($orient, a, b) => ifEnc(`${$orient} === '${Top}' || ${$orient} === '${Bottom}'`, a, b);
|
|
2457
|
-
const ifYEnc = ($orient, a, b) => ifEnc(`${$orient} !== '${Top}' && ${$orient} !== '${Bottom}'`, a, b);
|
|
2458
|
-
const ifLeftTopExpr = ($orient, a, b) => ifExpr(`${$orient} === '${Left}' || ${$orient} === '${Top}'`, a, b);
|
|
2459
|
-
const ifTopExpr = ($orient, a, b) => ifExpr(`${$orient} === '${Top}'`, a, b);
|
|
2460
|
-
const ifRightExpr = ($orient, a, b) => ifExpr(`${$orient} === '${Right}'`, a, b);
|
|
2461
|
-
const ifEnc = (test, a, b) => {
|
|
2462
|
-
// ensure inputs are encoder objects (or null)
|
|
2463
|
-
a = a != null ? encoder(a) : a;
|
|
2464
|
-
b = b != null ? encoder(b) : b;
|
|
2465
|
-
if (isSimple(a) && isSimple(b)) {
|
|
2466
|
-
// if possible generate simple signal expression
|
|
2467
|
-
a = a ? a.signal || $(a.value) : null;
|
|
2468
|
-
b = b ? b.signal || $(b.value) : null;
|
|
2469
|
-
return {
|
|
2470
|
-
signal: `${test} ? (${a}) : (${b})`
|
|
2471
|
-
};
|
|
2472
|
-
} else {
|
|
2473
|
-
// otherwise generate rule set
|
|
2474
|
-
return [extend({
|
|
2475
|
-
test
|
|
2476
|
-
}, a)].concat(b || []);
|
|
2477
|
-
}
|
|
2478
|
-
};
|
|
2479
|
-
const isSimple = enc => enc == null || Object.keys(enc).length === 1;
|
|
2480
|
-
const ifExpr = (test, a, b) => ({
|
|
2481
|
-
signal: `${test} ? (${toExpr(a)}) : (${toExpr(b)})`
|
|
2482
|
-
});
|
|
2483
|
-
const ifOrient = ($orient, t, b, l, r) => ({
|
|
2484
|
-
signal: (l != null ? `${$orient} === '${Left}' ? (${toExpr(l)}) : ` : '') + (b != null ? `${$orient} === '${Bottom}' ? (${toExpr(b)}) : ` : '') + (r != null ? `${$orient} === '${Right}' ? (${toExpr(r)}) : ` : '') + (t != null ? `${$orient} === '${Top}' ? (${toExpr(t)}) : ` : '') + '(null)'
|
|
2485
|
-
});
|
|
2486
|
-
const toExpr = v => isSignal(v) ? v.signal : v == null ? null : $(v);
|
|
2487
|
-
const mult = (sign, value) => value === 0 ? 0 : isSignal(sign) ? {
|
|
2488
|
-
signal: `(${sign.signal}) * ${value}`
|
|
2489
|
-
} : {
|
|
2490
|
-
value: sign * value
|
|
2491
|
-
};
|
|
2492
|
-
const patch = (value, base) => {
|
|
2493
|
-
const s = value.signal;
|
|
2494
|
-
return s && s.endsWith('(null)') ? {
|
|
2495
|
-
signal: s.slice(0, -6) + base.signal
|
|
2496
|
-
} : value;
|
|
2497
|
-
};
|
|
2498
|
-
|
|
2499
|
-
function fallback(prop, config, axisConfig, style) {
|
|
2500
|
-
let styleProp;
|
|
2501
|
-
if (config && has$1(config, prop)) {
|
|
2502
|
-
return config[prop];
|
|
2503
|
-
} else if (has$1(axisConfig, prop)) {
|
|
2504
|
-
return axisConfig[prop];
|
|
2505
|
-
} else if (prop.startsWith('title')) {
|
|
2506
|
-
switch (prop) {
|
|
2507
|
-
case 'titleColor':
|
|
2508
|
-
styleProp = 'fill';
|
|
2509
|
-
break;
|
|
2510
|
-
case 'titleFont':
|
|
2511
|
-
case 'titleFontSize':
|
|
2512
|
-
case 'titleFontWeight':
|
|
2513
|
-
styleProp = prop[5].toLowerCase() + prop.slice(6);
|
|
2514
|
-
}
|
|
2515
|
-
return style[GuideTitleStyle][styleProp];
|
|
2516
|
-
} else if (prop.startsWith('label')) {
|
|
2517
|
-
switch (prop) {
|
|
2518
|
-
case 'labelColor':
|
|
2519
|
-
styleProp = 'fill';
|
|
2520
|
-
break;
|
|
2521
|
-
case 'labelFont':
|
|
2522
|
-
case 'labelFontSize':
|
|
2523
|
-
styleProp = prop[5].toLowerCase() + prop.slice(6);
|
|
2524
|
-
}
|
|
2525
|
-
return style[GuideLabelStyle][styleProp];
|
|
2526
|
-
}
|
|
2527
|
-
return null;
|
|
2528
|
-
}
|
|
2529
|
-
function keys(objects) {
|
|
2530
|
-
const map = {};
|
|
2531
|
-
for (const obj of objects) {
|
|
2532
|
-
if (!obj) continue;
|
|
2533
|
-
for (const key in obj) map[key] = 1;
|
|
2534
|
-
}
|
|
2535
|
-
return Object.keys(map);
|
|
2536
|
-
}
|
|
2537
|
-
function axisConfig (spec, scope) {
|
|
2538
|
-
var config = scope.config,
|
|
2539
|
-
style = config.style,
|
|
2540
|
-
axis = config.axis,
|
|
2541
|
-
band = scope.scaleType(spec.scale) === 'band' && config.axisBand,
|
|
2542
|
-
orient = spec.orient,
|
|
2543
|
-
xy,
|
|
2544
|
-
or,
|
|
2545
|
-
key;
|
|
2546
|
-
if (isSignal(orient)) {
|
|
2547
|
-
const xyKeys = keys([config.axisX, config.axisY]),
|
|
2548
|
-
orientKeys = keys([config.axisTop, config.axisBottom, config.axisLeft, config.axisRight]);
|
|
2549
|
-
xy = {};
|
|
2550
|
-
for (key of xyKeys) {
|
|
2551
|
-
xy[key] = ifX(orient, fallback(key, config.axisX, axis, style), fallback(key, config.axisY, axis, style));
|
|
2552
|
-
}
|
|
2553
|
-
or = {};
|
|
2554
|
-
for (key of orientKeys) {
|
|
2555
|
-
or[key] = ifOrient(orient.signal, fallback(key, config.axisTop, axis, style), fallback(key, config.axisBottom, axis, style), fallback(key, config.axisLeft, axis, style), fallback(key, config.axisRight, axis, style));
|
|
2556
|
-
}
|
|
2557
|
-
} else {
|
|
2558
|
-
xy = orient === Top || orient === Bottom ? config.axisX : config.axisY;
|
|
2559
|
-
or = config['axis' + orient[0].toUpperCase() + orient.slice(1)];
|
|
2560
|
-
}
|
|
2561
|
-
const result = xy || or || band ? extend({}, axis, xy, or, band) : axis;
|
|
2562
|
-
return result;
|
|
2563
|
-
}
|
|
2564
|
-
|
|
2565
|
-
function axisDomain (spec, config, userEncode, dataRef) {
|
|
2566
|
-
const _ = lookup(spec, config),
|
|
2567
|
-
orient = spec.orient;
|
|
2568
|
-
let enter, update;
|
|
2569
|
-
const encode = {
|
|
2570
|
-
enter: enter = {
|
|
2571
|
-
opacity: zero
|
|
2572
|
-
},
|
|
2573
|
-
update: update = {
|
|
2574
|
-
opacity: one
|
|
2575
|
-
},
|
|
2576
|
-
exit: {
|
|
2577
|
-
opacity: zero
|
|
2578
|
-
}
|
|
2579
|
-
};
|
|
2580
|
-
addEncoders(encode, {
|
|
2581
|
-
stroke: _('domainColor'),
|
|
2582
|
-
strokeCap: _('domainCap'),
|
|
2583
|
-
strokeDash: _('domainDash'),
|
|
2584
|
-
strokeDashOffset: _('domainDashOffset'),
|
|
2585
|
-
strokeWidth: _('domainWidth'),
|
|
2586
|
-
strokeOpacity: _('domainOpacity')
|
|
2587
|
-
});
|
|
2588
|
-
const pos0 = position(spec, 0);
|
|
2589
|
-
const pos1 = position(spec, 1);
|
|
2590
|
-
enter.x = update.x = ifX(orient, pos0, zero);
|
|
2591
|
-
enter.x2 = update.x2 = ifX(orient, pos1);
|
|
2592
|
-
enter.y = update.y = ifY(orient, pos0, zero);
|
|
2593
|
-
enter.y2 = update.y2 = ifY(orient, pos1);
|
|
2594
|
-
return guideMark({
|
|
2595
|
-
type: RuleMark,
|
|
2596
|
-
role: AxisDomainRole,
|
|
2597
|
-
from: dataRef,
|
|
2598
|
-
encode
|
|
2599
|
-
}, userEncode);
|
|
2600
|
-
}
|
|
2601
|
-
function position(spec, pos) {
|
|
2602
|
-
return {
|
|
2603
|
-
scale: spec.scale,
|
|
2604
|
-
range: pos
|
|
2605
|
-
};
|
|
2606
|
-
}
|
|
2607
|
-
|
|
2608
|
-
function axisGrid (spec, config, userEncode, dataRef, band) {
|
|
2609
|
-
const _ = lookup(spec, config),
|
|
2610
|
-
orient = spec.orient,
|
|
2611
|
-
vscale = spec.gridScale,
|
|
2612
|
-
sign = getSign(orient, 1, -1),
|
|
2613
|
-
offset = offsetValue(spec.offset, sign);
|
|
2614
|
-
let enter, exit, update;
|
|
2615
|
-
const encode = {
|
|
2616
|
-
enter: enter = {
|
|
2617
|
-
opacity: zero
|
|
2618
|
-
},
|
|
2619
|
-
update: update = {
|
|
2620
|
-
opacity: one
|
|
2621
|
-
},
|
|
2622
|
-
exit: exit = {
|
|
2623
|
-
opacity: zero
|
|
2624
|
-
}
|
|
2625
|
-
};
|
|
2626
|
-
addEncoders(encode, {
|
|
2627
|
-
stroke: _('gridColor'),
|
|
2628
|
-
strokeCap: _('gridCap'),
|
|
2629
|
-
strokeDash: _('gridDash'),
|
|
2630
|
-
strokeDashOffset: _('gridDashOffset'),
|
|
2631
|
-
strokeOpacity: _('gridOpacity'),
|
|
2632
|
-
strokeWidth: _('gridWidth')
|
|
2633
|
-
});
|
|
2634
|
-
const tickPos = {
|
|
2635
|
-
scale: spec.scale,
|
|
2636
|
-
field: Value,
|
|
2637
|
-
band: band.band,
|
|
2638
|
-
extra: band.extra,
|
|
2639
|
-
offset: band.offset,
|
|
2640
|
-
round: _('tickRound')
|
|
2641
|
-
};
|
|
2642
|
-
const sz = ifX(orient, {
|
|
2643
|
-
signal: 'height'
|
|
2644
|
-
}, {
|
|
2645
|
-
signal: 'width'
|
|
2646
|
-
});
|
|
2647
|
-
const gridStart = vscale ? {
|
|
2648
|
-
scale: vscale,
|
|
2649
|
-
range: 0,
|
|
2650
|
-
mult: sign,
|
|
2651
|
-
offset: offset
|
|
2652
|
-
} : {
|
|
2653
|
-
value: 0,
|
|
2654
|
-
offset: offset
|
|
2655
|
-
};
|
|
2656
|
-
const gridEnd = vscale ? {
|
|
2657
|
-
scale: vscale,
|
|
2658
|
-
range: 1,
|
|
2659
|
-
mult: sign,
|
|
2660
|
-
offset: offset
|
|
2661
|
-
} : extend(sz, {
|
|
2662
|
-
mult: sign,
|
|
2663
|
-
offset: offset
|
|
2664
|
-
});
|
|
2665
|
-
enter.x = update.x = ifX(orient, tickPos, gridStart);
|
|
2666
|
-
enter.y = update.y = ifY(orient, tickPos, gridStart);
|
|
2667
|
-
enter.x2 = update.x2 = ifY(orient, gridEnd);
|
|
2668
|
-
enter.y2 = update.y2 = ifX(orient, gridEnd);
|
|
2669
|
-
exit.x = ifX(orient, tickPos);
|
|
2670
|
-
exit.y = ifY(orient, tickPos);
|
|
2671
|
-
return guideMark({
|
|
2672
|
-
type: RuleMark,
|
|
2673
|
-
role: AxisGridRole,
|
|
2674
|
-
key: Value,
|
|
2675
|
-
from: dataRef,
|
|
2676
|
-
encode
|
|
2677
|
-
}, userEncode);
|
|
2678
|
-
}
|
|
2679
|
-
function offsetValue(offset, sign) {
|
|
2680
|
-
if (sign === 1) ; else if (!isObject(offset)) {
|
|
2681
|
-
offset = isSignal(sign) ? {
|
|
2682
|
-
signal: `(${sign.signal}) * (${offset || 0})`
|
|
2683
|
-
} : sign * (offset || 0);
|
|
2684
|
-
} else {
|
|
2685
|
-
let entry = offset = extend({}, offset);
|
|
2686
|
-
while (entry.mult != null) {
|
|
2687
|
-
if (!isObject(entry.mult)) {
|
|
2688
|
-
entry.mult = isSignal(sign) // no offset if sign === 1
|
|
2689
|
-
? {
|
|
2690
|
-
signal: `(${entry.mult}) * (${sign.signal})`
|
|
2691
|
-
} : entry.mult * sign;
|
|
2692
|
-
return offset;
|
|
2693
|
-
} else {
|
|
2694
|
-
entry = entry.mult = extend({}, entry.mult);
|
|
2695
|
-
}
|
|
2696
|
-
}
|
|
2697
|
-
entry.mult = sign;
|
|
2698
|
-
}
|
|
2699
|
-
return offset;
|
|
2700
|
-
}
|
|
2701
|
-
|
|
2702
|
-
function axisTicks (spec, config, userEncode, dataRef, size, band) {
|
|
2703
|
-
const _ = lookup(spec, config),
|
|
2704
|
-
orient = spec.orient,
|
|
2705
|
-
sign = getSign(orient, -1, 1);
|
|
2706
|
-
let enter, exit, update;
|
|
2707
|
-
const encode = {
|
|
2708
|
-
enter: enter = {
|
|
2709
|
-
opacity: zero
|
|
2710
|
-
},
|
|
2711
|
-
update: update = {
|
|
2712
|
-
opacity: one
|
|
2713
|
-
},
|
|
2714
|
-
exit: exit = {
|
|
2715
|
-
opacity: zero
|
|
2716
|
-
}
|
|
2717
|
-
};
|
|
2718
|
-
addEncoders(encode, {
|
|
2719
|
-
stroke: _('tickColor'),
|
|
2720
|
-
strokeCap: _('tickCap'),
|
|
2721
|
-
strokeDash: _('tickDash'),
|
|
2722
|
-
strokeDashOffset: _('tickDashOffset'),
|
|
2723
|
-
strokeOpacity: _('tickOpacity'),
|
|
2724
|
-
strokeWidth: _('tickWidth')
|
|
2725
|
-
});
|
|
2726
|
-
const tickSize = encoder(size);
|
|
2727
|
-
tickSize.mult = sign;
|
|
2728
|
-
const tickPos = {
|
|
2729
|
-
scale: spec.scale,
|
|
2730
|
-
field: Value,
|
|
2731
|
-
band: band.band,
|
|
2732
|
-
extra: band.extra,
|
|
2733
|
-
offset: band.offset,
|
|
2734
|
-
round: _('tickRound')
|
|
2735
|
-
};
|
|
2736
|
-
update.y = enter.y = ifX(orient, zero, tickPos);
|
|
2737
|
-
update.y2 = enter.y2 = ifX(orient, tickSize);
|
|
2738
|
-
exit.x = ifX(orient, tickPos);
|
|
2739
|
-
update.x = enter.x = ifY(orient, zero, tickPos);
|
|
2740
|
-
update.x2 = enter.x2 = ifY(orient, tickSize);
|
|
2741
|
-
exit.y = ifY(orient, tickPos);
|
|
2742
|
-
return guideMark({
|
|
2743
|
-
type: RuleMark,
|
|
2744
|
-
role: AxisTickRole,
|
|
2745
|
-
key: Value,
|
|
2746
|
-
from: dataRef,
|
|
2747
|
-
encode
|
|
2748
|
-
}, userEncode);
|
|
2749
|
-
}
|
|
2750
|
-
|
|
2751
|
-
function flushExpr(scale, threshold, a, b, c) {
|
|
2752
|
-
return {
|
|
2753
|
-
signal: 'flush(range("' + scale + '"), ' + 'scale("' + scale + '", datum.value), ' + threshold + ',' + a + ',' + b + ',' + c + ')'
|
|
2754
|
-
};
|
|
2755
|
-
}
|
|
2756
|
-
function axisLabels (spec, config, userEncode, dataRef, size, band) {
|
|
2757
|
-
const _ = lookup(spec, config),
|
|
2758
|
-
orient = spec.orient,
|
|
2759
|
-
scale = spec.scale,
|
|
2760
|
-
sign = getSign(orient, -1, 1),
|
|
2761
|
-
flush = deref(_('labelFlush')),
|
|
2762
|
-
flushOffset = deref(_('labelFlushOffset')),
|
|
2763
|
-
labelAlign = _('labelAlign'),
|
|
2764
|
-
labelBaseline = _('labelBaseline');
|
|
2765
|
-
let flushOn = flush === 0 || !!flush,
|
|
2766
|
-
update;
|
|
2767
|
-
const tickSize = encoder(size);
|
|
2768
|
-
tickSize.mult = sign;
|
|
2769
|
-
tickSize.offset = encoder(_('labelPadding') || 0);
|
|
2770
|
-
tickSize.offset.mult = sign;
|
|
2771
|
-
const tickPos = {
|
|
2772
|
-
scale: scale,
|
|
2773
|
-
field: Value,
|
|
2774
|
-
band: 0.5,
|
|
2775
|
-
offset: extendOffset(band.offset, _('labelOffset'))
|
|
2776
|
-
};
|
|
2777
|
-
const align = ifX(orient, flushOn ? flushExpr(scale, flush, '"left"', '"right"', '"center"') : {
|
|
2778
|
-
value: 'center'
|
|
2779
|
-
}, ifRight(orient, 'left', 'right'));
|
|
2780
|
-
const baseline = ifX(orient, ifTop(orient, 'bottom', 'top'), flushOn ? flushExpr(scale, flush, '"top"', '"bottom"', '"middle"') : {
|
|
2781
|
-
value: 'middle'
|
|
2782
|
-
});
|
|
2783
|
-
const offsetExpr = flushExpr(scale, flush, `-(${flushOffset})`, flushOffset, 0);
|
|
2784
|
-
flushOn = flushOn && flushOffset;
|
|
2785
|
-
const enter = {
|
|
2786
|
-
opacity: zero,
|
|
2787
|
-
x: ifX(orient, tickPos, tickSize),
|
|
2788
|
-
y: ifY(orient, tickPos, tickSize)
|
|
2789
|
-
};
|
|
2790
|
-
const encode = {
|
|
2791
|
-
enter: enter,
|
|
2792
|
-
update: update = {
|
|
2793
|
-
opacity: one,
|
|
2794
|
-
text: {
|
|
2795
|
-
field: Label
|
|
2796
|
-
},
|
|
2797
|
-
x: enter.x,
|
|
2798
|
-
y: enter.y,
|
|
2799
|
-
align,
|
|
2800
|
-
baseline
|
|
2801
|
-
},
|
|
2802
|
-
exit: {
|
|
2803
|
-
opacity: zero,
|
|
2804
|
-
x: enter.x,
|
|
2805
|
-
y: enter.y
|
|
2806
|
-
}
|
|
2807
|
-
};
|
|
2808
|
-
addEncoders(encode, {
|
|
2809
|
-
dx: !labelAlign && flushOn ? ifX(orient, offsetExpr) : null,
|
|
2810
|
-
dy: !labelBaseline && flushOn ? ifY(orient, offsetExpr) : null
|
|
2811
|
-
});
|
|
2812
|
-
addEncoders(encode, {
|
|
2813
|
-
angle: _('labelAngle'),
|
|
2814
|
-
fill: _('labelColor'),
|
|
2815
|
-
fillOpacity: _('labelOpacity'),
|
|
2816
|
-
font: _('labelFont'),
|
|
2817
|
-
fontSize: _('labelFontSize'),
|
|
2818
|
-
fontWeight: _('labelFontWeight'),
|
|
2819
|
-
fontStyle: _('labelFontStyle'),
|
|
2820
|
-
limit: _('labelLimit'),
|
|
2821
|
-
lineHeight: _('labelLineHeight')
|
|
2822
|
-
}, {
|
|
2823
|
-
align: labelAlign,
|
|
2824
|
-
baseline: labelBaseline
|
|
2825
|
-
});
|
|
2826
|
-
const bound = _('labelBound');
|
|
2827
|
-
let overlap = _('labelOverlap');
|
|
2828
|
-
|
|
2829
|
-
// if overlap method or bound defined, request label overlap removal
|
|
2830
|
-
overlap = overlap || bound ? {
|
|
2831
|
-
separation: _('labelSeparation'),
|
|
2832
|
-
method: overlap,
|
|
2833
|
-
order: 'datum.index',
|
|
2834
|
-
bound: bound ? {
|
|
2835
|
-
scale,
|
|
2836
|
-
orient,
|
|
2837
|
-
tolerance: bound
|
|
2838
|
-
} : null
|
|
2839
|
-
} : undefined;
|
|
2840
|
-
if (update.align !== align) {
|
|
2841
|
-
update.align = patch(update.align, align);
|
|
2842
|
-
}
|
|
2843
|
-
if (update.baseline !== baseline) {
|
|
2844
|
-
update.baseline = patch(update.baseline, baseline);
|
|
2845
|
-
}
|
|
2846
|
-
return guideMark({
|
|
2847
|
-
type: TextMark,
|
|
2848
|
-
role: AxisLabelRole,
|
|
2849
|
-
style: GuideLabelStyle,
|
|
2850
|
-
key: Value,
|
|
2851
|
-
from: dataRef,
|
|
2852
|
-
encode,
|
|
2853
|
-
overlap
|
|
2854
|
-
}, userEncode);
|
|
2855
|
-
}
|
|
2856
|
-
|
|
2857
|
-
function axisTitle (spec, config, userEncode, dataRef) {
|
|
2858
|
-
const _ = lookup(spec, config),
|
|
2859
|
-
orient = spec.orient,
|
|
2860
|
-
sign = getSign(orient, -1, 1);
|
|
2861
|
-
let enter, update;
|
|
2862
|
-
const encode = {
|
|
2863
|
-
enter: enter = {
|
|
2864
|
-
opacity: zero,
|
|
2865
|
-
anchor: encoder(_('titleAnchor', null)),
|
|
2866
|
-
align: {
|
|
2867
|
-
signal: alignExpr$1
|
|
2868
|
-
}
|
|
2869
|
-
},
|
|
2870
|
-
update: update = extend({}, enter, {
|
|
2871
|
-
opacity: one,
|
|
2872
|
-
text: encoder(spec.title)
|
|
2873
|
-
}),
|
|
2874
|
-
exit: {
|
|
2875
|
-
opacity: zero
|
|
2876
|
-
}
|
|
2877
|
-
};
|
|
2878
|
-
const titlePos = {
|
|
2879
|
-
signal: `lerp(range("${spec.scale}"), ${anchorExpr(0, 1, 0.5)})`
|
|
2880
|
-
};
|
|
2881
|
-
update.x = ifX(orient, titlePos);
|
|
2882
|
-
update.y = ifY(orient, titlePos);
|
|
2883
|
-
enter.angle = ifX(orient, zero, mult(sign, 90));
|
|
2884
|
-
enter.baseline = ifX(orient, ifTop(orient, Bottom, Top), {
|
|
2885
|
-
value: Bottom
|
|
2886
|
-
});
|
|
2887
|
-
update.angle = enter.angle;
|
|
2888
|
-
update.baseline = enter.baseline;
|
|
2889
|
-
addEncoders(encode, {
|
|
2890
|
-
fill: _('titleColor'),
|
|
2891
|
-
fillOpacity: _('titleOpacity'),
|
|
2892
|
-
font: _('titleFont'),
|
|
2893
|
-
fontSize: _('titleFontSize'),
|
|
2894
|
-
fontStyle: _('titleFontStyle'),
|
|
2895
|
-
fontWeight: _('titleFontWeight'),
|
|
2896
|
-
limit: _('titleLimit'),
|
|
2897
|
-
lineHeight: _('titleLineHeight')
|
|
2898
|
-
}, {
|
|
2899
|
-
// require update
|
|
2900
|
-
align: _('titleAlign'),
|
|
2901
|
-
angle: _('titleAngle'),
|
|
2902
|
-
baseline: _('titleBaseline')
|
|
2903
|
-
});
|
|
2904
|
-
autoLayout(_, orient, encode, userEncode);
|
|
2905
|
-
encode.update.align = patch(encode.update.align, enter.align);
|
|
2906
|
-
encode.update.angle = patch(encode.update.angle, enter.angle);
|
|
2907
|
-
encode.update.baseline = patch(encode.update.baseline, enter.baseline);
|
|
2908
|
-
return guideMark({
|
|
2909
|
-
type: TextMark,
|
|
2910
|
-
role: AxisTitleRole,
|
|
2911
|
-
style: GuideTitleStyle,
|
|
2912
|
-
from: dataRef,
|
|
2913
|
-
encode
|
|
2914
|
-
}, userEncode);
|
|
2915
|
-
}
|
|
2916
|
-
function autoLayout(_, orient, encode, userEncode) {
|
|
2917
|
-
const auto = (value, dim) => value != null ? (encode.update[dim] = patch(encoder(value), encode.update[dim]), false) : !has(dim, userEncode) ? true : false;
|
|
2918
|
-
const autoY = auto(_('titleX'), 'x'),
|
|
2919
|
-
autoX = auto(_('titleY'), 'y');
|
|
2920
|
-
encode.enter.auto = autoX === autoY ? encoder(autoX) : ifX(orient, encoder(autoX), encoder(autoY));
|
|
2921
|
-
}
|
|
2922
|
-
|
|
2923
|
-
function parseAxis (spec, scope) {
|
|
2924
|
-
const config = axisConfig(spec, scope),
|
|
2925
|
-
encode = spec.encode || {},
|
|
2926
|
-
axisEncode = encode.axis || {},
|
|
2927
|
-
name = axisEncode.name || undefined,
|
|
2928
|
-
interactive = axisEncode.interactive,
|
|
2929
|
-
style = axisEncode.style,
|
|
2930
|
-
_ = lookup(spec, config),
|
|
2931
|
-
band = tickBand(_);
|
|
2932
|
-
|
|
2933
|
-
// single-element data source for axis group
|
|
2934
|
-
const datum = {
|
|
2935
|
-
scale: spec.scale,
|
|
2936
|
-
ticks: !!_('ticks'),
|
|
2937
|
-
labels: !!_('labels'),
|
|
2938
|
-
grid: !!_('grid'),
|
|
2939
|
-
domain: !!_('domain'),
|
|
2940
|
-
title: spec.title != null
|
|
2941
|
-
};
|
|
2942
|
-
const dataRef = ref(scope.add(Collect({}, [datum])));
|
|
2943
|
-
|
|
2944
|
-
// data source for axis ticks
|
|
2945
|
-
const ticksRef = ref(scope.add(AxisTicks({
|
|
2946
|
-
scale: scope.scaleRef(spec.scale),
|
|
2947
|
-
extra: scope.property(band.extra),
|
|
2948
|
-
count: scope.objectProperty(spec.tickCount),
|
|
2949
|
-
values: scope.objectProperty(spec.values),
|
|
2950
|
-
minstep: scope.property(spec.tickMinStep),
|
|
2951
|
-
formatType: scope.property(spec.formatType),
|
|
2952
|
-
formatSpecifier: scope.property(spec.format)
|
|
2953
|
-
})));
|
|
2954
|
-
|
|
2955
|
-
// generate axis marks
|
|
2956
|
-
const children = [];
|
|
2957
|
-
let size;
|
|
2958
|
-
|
|
2959
|
-
// include axis gridlines if requested
|
|
2960
|
-
if (datum.grid) {
|
|
2961
|
-
children.push(axisGrid(spec, config, encode.grid, ticksRef, band));
|
|
2962
|
-
}
|
|
2963
|
-
|
|
2964
|
-
// include axis ticks if requested
|
|
2965
|
-
if (datum.ticks) {
|
|
2966
|
-
size = _('tickSize');
|
|
2967
|
-
children.push(axisTicks(spec, config, encode.ticks, ticksRef, size, band));
|
|
2968
|
-
}
|
|
2969
|
-
|
|
2970
|
-
// include axis labels if requested
|
|
2971
|
-
if (datum.labels) {
|
|
2972
|
-
size = datum.ticks ? size : 0;
|
|
2973
|
-
children.push(axisLabels(spec, config, encode.labels, ticksRef, size, band));
|
|
2974
|
-
}
|
|
2975
|
-
|
|
2976
|
-
// include axis domain path if requested
|
|
2977
|
-
if (datum.domain) {
|
|
2978
|
-
children.push(axisDomain(spec, config, encode.domain, dataRef));
|
|
2979
|
-
}
|
|
2980
|
-
|
|
2981
|
-
// include axis title if defined
|
|
2982
|
-
if (datum.title) {
|
|
2983
|
-
children.push(axisTitle(spec, config, encode.title, dataRef));
|
|
2984
|
-
}
|
|
2985
|
-
|
|
2986
|
-
// parse axis specification
|
|
2987
|
-
return parseMark(guideGroup({
|
|
2988
|
-
role: AxisRole,
|
|
2989
|
-
from: dataRef,
|
|
2990
|
-
encode: extendEncode(buildAxisEncode(_, spec), axisEncode, Skip),
|
|
2991
|
-
marks: children,
|
|
2992
|
-
aria: _('aria'),
|
|
2993
|
-
description: _('description'),
|
|
2994
|
-
zindex: _('zindex'),
|
|
2995
|
-
name,
|
|
2996
|
-
interactive,
|
|
2997
|
-
style
|
|
2998
|
-
}), scope);
|
|
2999
|
-
}
|
|
3000
|
-
function buildAxisEncode(_, spec) {
|
|
3001
|
-
const encode = {
|
|
3002
|
-
enter: {},
|
|
3003
|
-
update: {}
|
|
3004
|
-
};
|
|
3005
|
-
addEncoders(encode, {
|
|
3006
|
-
orient: _('orient'),
|
|
3007
|
-
offset: _('offset') || 0,
|
|
3008
|
-
position: value(spec.position, 0),
|
|
3009
|
-
titlePadding: _('titlePadding'),
|
|
3010
|
-
minExtent: _('minExtent'),
|
|
3011
|
-
maxExtent: _('maxExtent'),
|
|
3012
|
-
range: {
|
|
3013
|
-
signal: `abs(span(range("${spec.scale}")))`
|
|
3014
|
-
},
|
|
3015
|
-
translate: _('translate'),
|
|
3016
|
-
// accessibility support
|
|
3017
|
-
format: spec.format,
|
|
3018
|
-
formatType: spec.formatType
|
|
3019
|
-
});
|
|
3020
|
-
return encode;
|
|
3021
|
-
}
|
|
3022
|
-
|
|
3023
|
-
function parseScope (spec, scope, preprocessed) {
|
|
3024
|
-
const signals = array(spec.signals),
|
|
3025
|
-
scales = array(spec.scales);
|
|
3026
|
-
|
|
3027
|
-
// parse signal definitions, if not already preprocessed
|
|
3028
|
-
if (!preprocessed) signals.forEach(_ => parseSignal(_, scope));
|
|
3029
|
-
|
|
3030
|
-
// parse cartographic projection definitions
|
|
3031
|
-
array(spec.projections).forEach(_ => parseProjection(_, scope));
|
|
3032
|
-
|
|
3033
|
-
// initialize scale references
|
|
3034
|
-
scales.forEach(_ => initScale(_, scope));
|
|
3035
|
-
|
|
3036
|
-
// parse data sources
|
|
3037
|
-
array(spec.data).forEach(_ => parseData(_, scope));
|
|
3038
|
-
|
|
3039
|
-
// parse scale definitions
|
|
3040
|
-
scales.forEach(_ => parseScale(_, scope));
|
|
3041
|
-
|
|
3042
|
-
// parse signal updates
|
|
3043
|
-
(preprocessed || signals).forEach(_ => parseSignalUpdates(_, scope));
|
|
3044
|
-
|
|
3045
|
-
// parse axis definitions
|
|
3046
|
-
array(spec.axes).forEach(_ => parseAxis(_, scope));
|
|
3047
|
-
|
|
3048
|
-
// parse mark definitions
|
|
3049
|
-
array(spec.marks).forEach(_ => parseMark(_, scope));
|
|
3050
|
-
|
|
3051
|
-
// parse legend definitions
|
|
3052
|
-
array(spec.legends).forEach(_ => parseLegend(_, scope));
|
|
3053
|
-
|
|
3054
|
-
// parse title, if defined
|
|
3055
|
-
if (spec.title) parseTitle(spec.title, scope);
|
|
3056
|
-
|
|
3057
|
-
// parse collected lambda (anonymous) expressions
|
|
3058
|
-
scope.parseLambdas();
|
|
3059
|
-
return scope;
|
|
3060
|
-
}
|
|
3061
|
-
|
|
3062
|
-
const rootEncode = spec => extendEncode({
|
|
3063
|
-
enter: {
|
|
3064
|
-
x: {
|
|
3065
|
-
value: 0
|
|
3066
|
-
},
|
|
3067
|
-
y: {
|
|
3068
|
-
value: 0
|
|
3069
|
-
}
|
|
3070
|
-
},
|
|
3071
|
-
update: {
|
|
3072
|
-
width: {
|
|
3073
|
-
signal: 'width'
|
|
3074
|
-
},
|
|
3075
|
-
height: {
|
|
3076
|
-
signal: 'height'
|
|
3077
|
-
}
|
|
3078
|
-
}
|
|
3079
|
-
}, spec);
|
|
3080
|
-
function parseView(spec, scope) {
|
|
3081
|
-
const config = scope.config;
|
|
3082
|
-
|
|
3083
|
-
// add scenegraph root
|
|
3084
|
-
const root = ref(scope.root = scope.add(operator()));
|
|
3085
|
-
|
|
3086
|
-
// parse top-level signal definitions
|
|
3087
|
-
const signals = collectSignals(spec, config);
|
|
3088
|
-
signals.forEach(_ => parseSignal(_, scope));
|
|
3089
|
-
|
|
3090
|
-
// assign description, event, legend, and locale configuration
|
|
3091
|
-
scope.description = spec.description || config.description;
|
|
3092
|
-
scope.eventConfig = config.events;
|
|
3093
|
-
scope.legends = scope.objectProperty(config.legend && config.legend.layout);
|
|
3094
|
-
scope.locale = config.locale;
|
|
3095
|
-
|
|
3096
|
-
// store root group item
|
|
3097
|
-
const input = scope.add(Collect());
|
|
3098
|
-
|
|
3099
|
-
// encode root group item
|
|
3100
|
-
const encode = scope.add(Encode(parseEncode(rootEncode(spec.encode), GroupMark, FrameRole, spec.style, scope, {
|
|
3101
|
-
pulse: ref(input)
|
|
3102
|
-
})));
|
|
3103
|
-
|
|
3104
|
-
// perform view layout
|
|
3105
|
-
const parent = scope.add(ViewLayout({
|
|
3106
|
-
layout: scope.objectProperty(spec.layout),
|
|
3107
|
-
legends: scope.legends,
|
|
3108
|
-
autosize: scope.signalRef('autosize'),
|
|
3109
|
-
mark: root,
|
|
3110
|
-
pulse: ref(encode)
|
|
3111
|
-
}));
|
|
3112
|
-
scope.operators.pop();
|
|
3113
|
-
|
|
3114
|
-
// parse remainder of specification
|
|
3115
|
-
scope.pushState(ref(encode), ref(parent), null);
|
|
3116
|
-
parseScope(spec, scope, signals);
|
|
3117
|
-
scope.operators.push(parent);
|
|
3118
|
-
|
|
3119
|
-
// bound / render / sieve root item
|
|
3120
|
-
let op = scope.add(Bound({
|
|
3121
|
-
mark: root,
|
|
3122
|
-
pulse: ref(parent)
|
|
3123
|
-
}));
|
|
3124
|
-
op = scope.add(Render({
|
|
3125
|
-
pulse: ref(op)
|
|
3126
|
-
}));
|
|
3127
|
-
op = scope.add(Sieve({
|
|
3128
|
-
pulse: ref(op)
|
|
3129
|
-
}));
|
|
3130
|
-
|
|
3131
|
-
// track metadata for root item
|
|
3132
|
-
scope.addData('root', new DataScope(scope, input, input, op));
|
|
3133
|
-
return scope;
|
|
3134
|
-
}
|
|
3135
|
-
function signalObject(name, value) {
|
|
3136
|
-
return value && value.signal ? {
|
|
3137
|
-
name,
|
|
3138
|
-
update: value.signal
|
|
3139
|
-
} : {
|
|
3140
|
-
name,
|
|
3141
|
-
value
|
|
3142
|
-
};
|
|
3143
|
-
}
|
|
3144
|
-
|
|
3145
|
-
/**
|
|
3146
|
-
* Collect top-level signals, merging values as needed. Signals
|
|
3147
|
-
* defined in the config signals arrays are added only if that
|
|
3148
|
-
* signal is not explicitly defined in the specification.
|
|
3149
|
-
* Built-in signals (autosize, background, padding, width, height)
|
|
3150
|
-
* receive special treatment. They are initialized using the
|
|
3151
|
-
* top-level spec property, or, if undefined in the spec, using
|
|
3152
|
-
* the corresponding top-level config property. If this property
|
|
3153
|
-
* is a signal reference object, the signal expression maps to the
|
|
3154
|
-
* signal 'update' property. If the spec's top-level signal array
|
|
3155
|
-
* contains an entry that matches a built-in signal, that entry
|
|
3156
|
-
* will be merged with the built-in specification, potentially
|
|
3157
|
-
* overwriting existing 'value' or 'update' properties.
|
|
3158
|
-
*/
|
|
3159
|
-
function collectSignals(spec, config) {
|
|
3160
|
-
const _ = name => value(spec[name], config[name]),
|
|
3161
|
-
signals = [signalObject('background', _('background')), signalObject('autosize', parseAutosize(_('autosize'))), signalObject('padding', parsePadding(_('padding'))), signalObject('width', _('width') || 0), signalObject('height', _('height') || 0)],
|
|
3162
|
-
pre = signals.reduce((p, s) => (p[s.name] = s, p), {}),
|
|
3163
|
-
map = {};
|
|
3164
|
-
|
|
3165
|
-
// add spec signal array
|
|
3166
|
-
array(spec.signals).forEach(s => {
|
|
3167
|
-
if (has$1(pre, s.name)) {
|
|
3168
|
-
// merge if built-in signal
|
|
3169
|
-
s = extend(pre[s.name], s);
|
|
3170
|
-
} else {
|
|
3171
|
-
// otherwise add to signal list
|
|
3172
|
-
signals.push(s);
|
|
3173
|
-
}
|
|
3174
|
-
map[s.name] = s;
|
|
3175
|
-
});
|
|
3176
|
-
|
|
3177
|
-
// add config signal array
|
|
3178
|
-
array(config.signals).forEach(s => {
|
|
3179
|
-
if (!has$1(map, s.name) && !has$1(pre, s.name)) {
|
|
3180
|
-
// add to signal list if not already defined
|
|
3181
|
-
signals.push(s);
|
|
3182
|
-
}
|
|
3183
|
-
});
|
|
3184
|
-
return signals;
|
|
3185
|
-
}
|
|
3186
|
-
|
|
3187
|
-
function Scope(config, options) {
|
|
3188
|
-
this.config = config || {};
|
|
3189
|
-
this.options = options || {};
|
|
3190
|
-
this.bindings = [];
|
|
3191
|
-
this.field = {};
|
|
3192
|
-
this.signals = {};
|
|
3193
|
-
this.lambdas = {};
|
|
3194
|
-
this.scales = {};
|
|
3195
|
-
this.events = {};
|
|
3196
|
-
this.data = {};
|
|
3197
|
-
this.streams = [];
|
|
3198
|
-
this.updates = [];
|
|
3199
|
-
this.operators = [];
|
|
3200
|
-
this.eventConfig = null;
|
|
3201
|
-
this.locale = null;
|
|
3202
|
-
this._id = 0;
|
|
3203
|
-
this._subid = 0;
|
|
3204
|
-
this._nextsub = [0];
|
|
3205
|
-
this._parent = [];
|
|
3206
|
-
this._encode = [];
|
|
3207
|
-
this._lookup = [];
|
|
3208
|
-
this._markpath = [];
|
|
3209
|
-
}
|
|
3210
|
-
function Subscope(scope) {
|
|
3211
|
-
this.config = scope.config;
|
|
3212
|
-
this.options = scope.options;
|
|
3213
|
-
this.legends = scope.legends;
|
|
3214
|
-
this.field = Object.create(scope.field);
|
|
3215
|
-
this.signals = Object.create(scope.signals);
|
|
3216
|
-
this.lambdas = Object.create(scope.lambdas);
|
|
3217
|
-
this.scales = Object.create(scope.scales);
|
|
3218
|
-
this.events = Object.create(scope.events);
|
|
3219
|
-
this.data = Object.create(scope.data);
|
|
3220
|
-
this.streams = [];
|
|
3221
|
-
this.updates = [];
|
|
3222
|
-
this.operators = [];
|
|
3223
|
-
this._id = 0;
|
|
3224
|
-
this._subid = ++scope._nextsub[0];
|
|
3225
|
-
this._nextsub = scope._nextsub;
|
|
3226
|
-
this._parent = scope._parent.slice();
|
|
3227
|
-
this._encode = scope._encode.slice();
|
|
3228
|
-
this._lookup = scope._lookup.slice();
|
|
3229
|
-
this._markpath = scope._markpath;
|
|
3230
|
-
}
|
|
3231
|
-
Scope.prototype = Subscope.prototype = {
|
|
3232
|
-
parse(spec) {
|
|
3233
|
-
return parseScope(spec, this);
|
|
3234
|
-
},
|
|
3235
|
-
fork() {
|
|
3236
|
-
return new Subscope(this);
|
|
3237
|
-
},
|
|
3238
|
-
isSubscope() {
|
|
3239
|
-
return this._subid > 0;
|
|
3240
|
-
},
|
|
3241
|
-
toRuntime() {
|
|
3242
|
-
this.finish();
|
|
3243
|
-
return {
|
|
3244
|
-
description: this.description,
|
|
3245
|
-
operators: this.operators,
|
|
3246
|
-
streams: this.streams,
|
|
3247
|
-
updates: this.updates,
|
|
3248
|
-
bindings: this.bindings,
|
|
3249
|
-
eventConfig: this.eventConfig,
|
|
3250
|
-
locale: this.locale
|
|
3251
|
-
};
|
|
3252
|
-
},
|
|
3253
|
-
id() {
|
|
3254
|
-
return (this._subid ? this._subid + ':' : 0) + this._id++;
|
|
3255
|
-
},
|
|
3256
|
-
add(op) {
|
|
3257
|
-
this.operators.push(op);
|
|
3258
|
-
op.id = this.id();
|
|
3259
|
-
// if pre-registration references exist, resolve them now
|
|
3260
|
-
if (op.refs) {
|
|
3261
|
-
op.refs.forEach(ref => {
|
|
3262
|
-
ref.$ref = op.id;
|
|
3263
|
-
});
|
|
3264
|
-
op.refs = null;
|
|
3265
|
-
}
|
|
3266
|
-
return op;
|
|
3267
|
-
},
|
|
3268
|
-
proxy(op) {
|
|
3269
|
-
const vref = op instanceof Entry ? ref(op) : op;
|
|
3270
|
-
return this.add(Proxy({
|
|
3271
|
-
value: vref
|
|
3272
|
-
}));
|
|
3273
|
-
},
|
|
3274
|
-
addStream(stream) {
|
|
3275
|
-
this.streams.push(stream);
|
|
3276
|
-
stream.id = this.id();
|
|
3277
|
-
return stream;
|
|
3278
|
-
},
|
|
3279
|
-
addUpdate(update) {
|
|
3280
|
-
this.updates.push(update);
|
|
3281
|
-
return update;
|
|
3282
|
-
},
|
|
3283
|
-
// Apply metadata
|
|
3284
|
-
finish() {
|
|
3285
|
-
let name, ds;
|
|
3286
|
-
|
|
3287
|
-
// annotate root
|
|
3288
|
-
if (this.root) this.root.root = true;
|
|
3289
|
-
|
|
3290
|
-
// annotate signals
|
|
3291
|
-
for (name in this.signals) {
|
|
3292
|
-
this.signals[name].signal = name;
|
|
3293
|
-
}
|
|
3294
|
-
|
|
3295
|
-
// annotate scales
|
|
3296
|
-
for (name in this.scales) {
|
|
3297
|
-
this.scales[name].scale = name;
|
|
3298
|
-
}
|
|
3299
|
-
|
|
3300
|
-
// annotate data sets
|
|
3301
|
-
function annotate(op, name, type) {
|
|
3302
|
-
let data, list;
|
|
3303
|
-
if (op) {
|
|
3304
|
-
data = op.data || (op.data = {});
|
|
3305
|
-
list = data[name] || (data[name] = []);
|
|
3306
|
-
list.push(type);
|
|
3307
|
-
}
|
|
3308
|
-
}
|
|
3309
|
-
for (name in this.data) {
|
|
3310
|
-
ds = this.data[name];
|
|
3311
|
-
annotate(ds.input, name, 'input');
|
|
3312
|
-
annotate(ds.output, name, 'output');
|
|
3313
|
-
annotate(ds.values, name, 'values');
|
|
3314
|
-
for (const field in ds.index) {
|
|
3315
|
-
annotate(ds.index[field], name, 'index:' + field);
|
|
3316
|
-
}
|
|
3317
|
-
}
|
|
3318
|
-
return this;
|
|
3319
|
-
},
|
|
3320
|
-
// ----
|
|
3321
|
-
|
|
3322
|
-
pushState(encode, parent, lookup) {
|
|
3323
|
-
this._encode.push(ref(this.add(Sieve({
|
|
3324
|
-
pulse: encode
|
|
3325
|
-
}))));
|
|
3326
|
-
this._parent.push(parent);
|
|
3327
|
-
this._lookup.push(lookup ? ref(this.proxy(lookup)) : null);
|
|
3328
|
-
this._markpath.push(-1);
|
|
3329
|
-
},
|
|
3330
|
-
popState() {
|
|
3331
|
-
this._encode.pop();
|
|
3332
|
-
this._parent.pop();
|
|
3333
|
-
this._lookup.pop();
|
|
3334
|
-
this._markpath.pop();
|
|
3335
|
-
},
|
|
3336
|
-
parent() {
|
|
3337
|
-
return peek(this._parent);
|
|
3338
|
-
},
|
|
3339
|
-
encode() {
|
|
3340
|
-
return peek(this._encode);
|
|
3341
|
-
},
|
|
3342
|
-
lookup() {
|
|
3343
|
-
return peek(this._lookup);
|
|
3344
|
-
},
|
|
3345
|
-
markpath() {
|
|
3346
|
-
const p = this._markpath;
|
|
3347
|
-
return ++p[p.length - 1];
|
|
3348
|
-
},
|
|
3349
|
-
// ----
|
|
3350
|
-
|
|
3351
|
-
fieldRef(field, name) {
|
|
3352
|
-
if (isString(field)) return fieldRef$1(field, name);
|
|
3353
|
-
if (!field.signal) {
|
|
3354
|
-
error('Unsupported field reference: ' + $(field));
|
|
3355
|
-
}
|
|
3356
|
-
const s = field.signal;
|
|
3357
|
-
let f = this.field[s];
|
|
3358
|
-
if (!f) {
|
|
3359
|
-
const params = {
|
|
3360
|
-
name: this.signalRef(s)
|
|
3361
|
-
};
|
|
3362
|
-
if (name) params.as = name;
|
|
3363
|
-
this.field[s] = f = ref(this.add(Field(params)));
|
|
3364
|
-
}
|
|
3365
|
-
return f;
|
|
3366
|
-
},
|
|
3367
|
-
compareRef(cmp) {
|
|
3368
|
-
let signal = false;
|
|
3369
|
-
const check = _ => isSignal(_) ? (signal = true, this.signalRef(_.signal)) : isExpr$1(_) ? (signal = true, this.exprRef(_.expr)) : _;
|
|
3370
|
-
const fields = array(cmp.field).map(check),
|
|
3371
|
-
orders = array(cmp.order).map(check);
|
|
3372
|
-
return signal ? ref(this.add(Compare({
|
|
3373
|
-
fields: fields,
|
|
3374
|
-
orders: orders
|
|
3375
|
-
}))) : compareRef(fields, orders);
|
|
3376
|
-
},
|
|
3377
|
-
keyRef(fields, flat) {
|
|
3378
|
-
let signal = false;
|
|
3379
|
-
const check = _ => isSignal(_) ? (signal = true, ref(sig[_.signal])) : _;
|
|
3380
|
-
const sig = this.signals;
|
|
3381
|
-
fields = array(fields).map(check);
|
|
3382
|
-
return signal ? ref(this.add(Key({
|
|
3383
|
-
fields: fields,
|
|
3384
|
-
flat: flat
|
|
3385
|
-
}))) : keyRef(fields, flat);
|
|
3386
|
-
},
|
|
3387
|
-
sortRef(sort) {
|
|
3388
|
-
if (!sort) return sort;
|
|
3389
|
-
|
|
3390
|
-
// including id ensures stable sorting
|
|
3391
|
-
const a = aggrField(sort.op, sort.field),
|
|
3392
|
-
o = sort.order || Ascending;
|
|
3393
|
-
return o.signal ? ref(this.add(Compare({
|
|
3394
|
-
fields: a,
|
|
3395
|
-
orders: this.signalRef(o.signal)
|
|
3396
|
-
}))) : compareRef(a, o);
|
|
3397
|
-
},
|
|
3398
|
-
// ----
|
|
3399
|
-
|
|
3400
|
-
event(source, type) {
|
|
3401
|
-
const key = source + ':' + type;
|
|
3402
|
-
if (!this.events[key]) {
|
|
3403
|
-
const id = this.id();
|
|
3404
|
-
this.streams.push({
|
|
3405
|
-
id: id,
|
|
3406
|
-
source: source,
|
|
3407
|
-
type: type
|
|
3408
|
-
});
|
|
3409
|
-
this.events[key] = id;
|
|
3410
|
-
}
|
|
3411
|
-
return this.events[key];
|
|
3412
|
-
},
|
|
3413
|
-
// ----
|
|
3414
|
-
|
|
3415
|
-
hasOwnSignal(name) {
|
|
3416
|
-
return has$1(this.signals, name);
|
|
3417
|
-
},
|
|
3418
|
-
addSignal(name, value) {
|
|
3419
|
-
if (this.hasOwnSignal(name)) {
|
|
3420
|
-
error('Duplicate signal name: ' + $(name));
|
|
3421
|
-
}
|
|
3422
|
-
const op = value instanceof Entry ? value : this.add(operator(value));
|
|
3423
|
-
return this.signals[name] = op;
|
|
3424
|
-
},
|
|
3425
|
-
getSignal(name) {
|
|
3426
|
-
if (!this.signals[name]) {
|
|
3427
|
-
error('Unrecognized signal name: ' + $(name));
|
|
3428
|
-
}
|
|
3429
|
-
return this.signals[name];
|
|
3430
|
-
},
|
|
3431
|
-
signalRef(s) {
|
|
3432
|
-
if (this.signals[s]) {
|
|
3433
|
-
return ref(this.signals[s]);
|
|
3434
|
-
} else if (!has$1(this.lambdas, s)) {
|
|
3435
|
-
this.lambdas[s] = this.add(operator(null));
|
|
3436
|
-
}
|
|
3437
|
-
return ref(this.lambdas[s]);
|
|
3438
|
-
},
|
|
3439
|
-
parseLambdas() {
|
|
3440
|
-
const code = Object.keys(this.lambdas);
|
|
3441
|
-
for (let i = 0, n = code.length; i < n; ++i) {
|
|
3442
|
-
const s = code[i],
|
|
3443
|
-
e = parser(s, this),
|
|
3444
|
-
op = this.lambdas[s];
|
|
3445
|
-
op.params = e.$params;
|
|
3446
|
-
op.update = e.$expr;
|
|
3447
|
-
}
|
|
3448
|
-
},
|
|
3449
|
-
property(spec) {
|
|
3450
|
-
return spec && spec.signal ? this.signalRef(spec.signal) : spec;
|
|
3451
|
-
},
|
|
3452
|
-
objectProperty(spec) {
|
|
3453
|
-
return !spec || !isObject(spec) ? spec : this.signalRef(spec.signal || propertyLambda(spec));
|
|
3454
|
-
},
|
|
3455
|
-
exprRef(code, name) {
|
|
3456
|
-
const params = {
|
|
3457
|
-
expr: parser(code, this)
|
|
3458
|
-
};
|
|
3459
|
-
if (name) params.expr.$name = name;
|
|
3460
|
-
return ref(this.add(Expression(params)));
|
|
3461
|
-
},
|
|
3462
|
-
addBinding(name, bind) {
|
|
3463
|
-
if (!this.bindings) {
|
|
3464
|
-
error('Nested signals do not support binding: ' + $(name));
|
|
3465
|
-
}
|
|
3466
|
-
this.bindings.push(extend({
|
|
3467
|
-
signal: name
|
|
3468
|
-
}, bind));
|
|
3469
|
-
},
|
|
3470
|
-
// ----
|
|
3471
|
-
|
|
3472
|
-
addScaleProj(name, transform) {
|
|
3473
|
-
if (has$1(this.scales, name)) {
|
|
3474
|
-
error('Duplicate scale or projection name: ' + $(name));
|
|
3475
|
-
}
|
|
3476
|
-
this.scales[name] = this.add(transform);
|
|
3477
|
-
},
|
|
3478
|
-
addScale(name, params) {
|
|
3479
|
-
this.addScaleProj(name, Scale(params));
|
|
3480
|
-
},
|
|
3481
|
-
addProjection(name, params) {
|
|
3482
|
-
this.addScaleProj(name, Projection(params));
|
|
3483
|
-
},
|
|
3484
|
-
getScale(name) {
|
|
3485
|
-
if (!this.scales[name]) {
|
|
3486
|
-
error('Unrecognized scale name: ' + $(name));
|
|
3487
|
-
}
|
|
3488
|
-
return this.scales[name];
|
|
3489
|
-
},
|
|
3490
|
-
scaleRef(name) {
|
|
3491
|
-
return ref(this.getScale(name));
|
|
3492
|
-
},
|
|
3493
|
-
scaleType(name) {
|
|
3494
|
-
return this.getScale(name).params.type;
|
|
3495
|
-
},
|
|
3496
|
-
projectionRef(name) {
|
|
3497
|
-
return this.scaleRef(name);
|
|
3498
|
-
},
|
|
3499
|
-
projectionType(name) {
|
|
3500
|
-
return this.scaleType(name);
|
|
3501
|
-
},
|
|
3502
|
-
// ----
|
|
3503
|
-
|
|
3504
|
-
addData(name, dataScope) {
|
|
3505
|
-
if (has$1(this.data, name)) {
|
|
3506
|
-
error('Duplicate data set name: ' + $(name));
|
|
3507
|
-
}
|
|
3508
|
-
return this.data[name] = dataScope;
|
|
3509
|
-
},
|
|
3510
|
-
getData(name) {
|
|
3511
|
-
if (!this.data[name]) {
|
|
3512
|
-
error('Undefined data set name: ' + $(name));
|
|
3513
|
-
}
|
|
3514
|
-
return this.data[name];
|
|
3515
|
-
},
|
|
3516
|
-
addDataPipeline(name, entries) {
|
|
3517
|
-
if (has$1(this.data, name)) {
|
|
3518
|
-
error('Duplicate data set name: ' + $(name));
|
|
3519
|
-
}
|
|
3520
|
-
return this.addData(name, DataScope.fromEntries(this, entries));
|
|
3521
|
-
}
|
|
3522
|
-
};
|
|
3523
|
-
function propertyLambda(spec) {
|
|
3524
|
-
return (isArray(spec) ? arrayLambda : objectLambda)(spec);
|
|
3525
|
-
}
|
|
3526
|
-
function arrayLambda(array) {
|
|
3527
|
-
const n = array.length;
|
|
3528
|
-
let code = '[';
|
|
3529
|
-
for (let i = 0; i < n; ++i) {
|
|
3530
|
-
const value = array[i];
|
|
3531
|
-
code += (i > 0 ? ',' : '') + (isObject(value) ? value.signal || propertyLambda(value) : $(value));
|
|
3532
|
-
}
|
|
3533
|
-
return code + ']';
|
|
3534
|
-
}
|
|
3535
|
-
function objectLambda(obj) {
|
|
3536
|
-
let code = '{',
|
|
3537
|
-
i = 0,
|
|
3538
|
-
key,
|
|
3539
|
-
value;
|
|
3540
|
-
for (key in obj) {
|
|
3541
|
-
value = obj[key];
|
|
3542
|
-
code += (++i > 1 ? ',' : '') + $(key) + ':' + (isObject(value) ? value.signal || propertyLambda(value) : $(value));
|
|
3543
|
-
}
|
|
3544
|
-
return code + '}';
|
|
3545
|
-
}
|
|
3546
|
-
|
|
3547
|
-
/**
|
|
3548
|
-
* Standard configuration defaults for Vega specification parsing.
|
|
3549
|
-
* Users can provide their own (sub-)set of these default values
|
|
3550
|
-
* by passing in a config object to the top-level parse method.
|
|
3551
|
-
*/
|
|
3552
|
-
function defaults () {
|
|
3553
|
-
const defaultFont = 'sans-serif',
|
|
3554
|
-
defaultSymbolSize = 30,
|
|
3555
|
-
defaultStrokeWidth = 2,
|
|
3556
|
-
defaultColor = '#4c78a8',
|
|
3557
|
-
black = '#000',
|
|
3558
|
-
gray = '#888',
|
|
3559
|
-
lightGray = '#ddd';
|
|
3560
|
-
return {
|
|
3561
|
-
// default visualization description
|
|
3562
|
-
description: 'Vega visualization',
|
|
3563
|
-
// default padding around visualization
|
|
3564
|
-
padding: 0,
|
|
3565
|
-
// default for automatic sizing; options: 'none', 'pad', 'fit'
|
|
3566
|
-
// or provide an object (e.g., {'type': 'pad', 'resize': true})
|
|
3567
|
-
autosize: 'pad',
|
|
3568
|
-
// default view background color
|
|
3569
|
-
// covers the entire view component
|
|
3570
|
-
background: null,
|
|
3571
|
-
// default event handling configuration
|
|
3572
|
-
// preventDefault for view-sourced event types except 'wheel'
|
|
3573
|
-
events: {
|
|
3574
|
-
defaults: {
|
|
3575
|
-
allow: ['wheel']
|
|
3576
|
-
}
|
|
3577
|
-
},
|
|
3578
|
-
// defaults for top-level group marks
|
|
3579
|
-
// accepts mark properties (fill, stroke, etc)
|
|
3580
|
-
// covers the data rectangle within group width/height
|
|
3581
|
-
group: null,
|
|
3582
|
-
// defaults for basic mark types
|
|
3583
|
-
// each subset accepts mark properties (fill, stroke, etc)
|
|
3584
|
-
mark: null,
|
|
3585
|
-
arc: {
|
|
3586
|
-
fill: defaultColor
|
|
3587
|
-
},
|
|
3588
|
-
area: {
|
|
3589
|
-
fill: defaultColor
|
|
3590
|
-
},
|
|
3591
|
-
image: null,
|
|
3592
|
-
line: {
|
|
3593
|
-
stroke: defaultColor,
|
|
3594
|
-
strokeWidth: defaultStrokeWidth
|
|
3595
|
-
},
|
|
3596
|
-
path: {
|
|
3597
|
-
stroke: defaultColor
|
|
3598
|
-
},
|
|
3599
|
-
rect: {
|
|
3600
|
-
fill: defaultColor
|
|
3601
|
-
},
|
|
3602
|
-
rule: {
|
|
3603
|
-
stroke: black
|
|
3604
|
-
},
|
|
3605
|
-
shape: {
|
|
3606
|
-
stroke: defaultColor
|
|
3607
|
-
},
|
|
3608
|
-
symbol: {
|
|
3609
|
-
fill: defaultColor,
|
|
3610
|
-
size: 64
|
|
3611
|
-
},
|
|
3612
|
-
text: {
|
|
3613
|
-
fill: black,
|
|
3614
|
-
font: defaultFont,
|
|
3615
|
-
fontSize: 11
|
|
3616
|
-
},
|
|
3617
|
-
trail: {
|
|
3618
|
-
fill: defaultColor,
|
|
3619
|
-
size: defaultStrokeWidth
|
|
3620
|
-
},
|
|
3621
|
-
// style definitions
|
|
3622
|
-
style: {
|
|
3623
|
-
// axis & legend labels
|
|
3624
|
-
'guide-label': {
|
|
3625
|
-
fill: black,
|
|
3626
|
-
font: defaultFont,
|
|
3627
|
-
fontSize: 10
|
|
3628
|
-
},
|
|
3629
|
-
// axis & legend titles
|
|
3630
|
-
'guide-title': {
|
|
3631
|
-
fill: black,
|
|
3632
|
-
font: defaultFont,
|
|
3633
|
-
fontSize: 11,
|
|
3634
|
-
fontWeight: 'bold'
|
|
3635
|
-
},
|
|
3636
|
-
// headers, including chart title
|
|
3637
|
-
'group-title': {
|
|
3638
|
-
fill: black,
|
|
3639
|
-
font: defaultFont,
|
|
3640
|
-
fontSize: 13,
|
|
3641
|
-
fontWeight: 'bold'
|
|
3642
|
-
},
|
|
3643
|
-
// chart subtitle
|
|
3644
|
-
'group-subtitle': {
|
|
3645
|
-
fill: black,
|
|
3646
|
-
font: defaultFont,
|
|
3647
|
-
fontSize: 12
|
|
3648
|
-
},
|
|
3649
|
-
// defaults for styled point marks in Vega-Lite
|
|
3650
|
-
point: {
|
|
3651
|
-
size: defaultSymbolSize,
|
|
3652
|
-
strokeWidth: defaultStrokeWidth,
|
|
3653
|
-
shape: 'circle'
|
|
3654
|
-
},
|
|
3655
|
-
circle: {
|
|
3656
|
-
size: defaultSymbolSize,
|
|
3657
|
-
strokeWidth: defaultStrokeWidth
|
|
3658
|
-
},
|
|
3659
|
-
square: {
|
|
3660
|
-
size: defaultSymbolSize,
|
|
3661
|
-
strokeWidth: defaultStrokeWidth,
|
|
3662
|
-
shape: 'square'
|
|
3663
|
-
},
|
|
3664
|
-
// defaults for styled group marks in Vega-Lite
|
|
3665
|
-
cell: {
|
|
3666
|
-
fill: 'transparent',
|
|
3667
|
-
stroke: lightGray
|
|
3668
|
-
},
|
|
3669
|
-
view: {
|
|
3670
|
-
fill: 'transparent'
|
|
3671
|
-
}
|
|
3672
|
-
},
|
|
3673
|
-
// defaults for title
|
|
3674
|
-
title: {
|
|
3675
|
-
orient: 'top',
|
|
3676
|
-
anchor: 'middle',
|
|
3677
|
-
offset: 4,
|
|
3678
|
-
subtitlePadding: 3
|
|
3679
|
-
},
|
|
3680
|
-
// defaults for axes
|
|
3681
|
-
axis: {
|
|
3682
|
-
minExtent: 0,
|
|
3683
|
-
maxExtent: 200,
|
|
3684
|
-
bandPosition: 0.5,
|
|
3685
|
-
domain: true,
|
|
3686
|
-
domainWidth: 1,
|
|
3687
|
-
domainColor: gray,
|
|
3688
|
-
grid: false,
|
|
3689
|
-
gridWidth: 1,
|
|
3690
|
-
gridColor: lightGray,
|
|
3691
|
-
labels: true,
|
|
3692
|
-
labelAngle: 0,
|
|
3693
|
-
labelLimit: 180,
|
|
3694
|
-
labelOffset: 0,
|
|
3695
|
-
labelPadding: 2,
|
|
3696
|
-
ticks: true,
|
|
3697
|
-
tickColor: gray,
|
|
3698
|
-
tickOffset: 0,
|
|
3699
|
-
tickRound: true,
|
|
3700
|
-
tickSize: 5,
|
|
3701
|
-
tickWidth: 1,
|
|
3702
|
-
titlePadding: 4
|
|
3703
|
-
},
|
|
3704
|
-
// correction for centering bias
|
|
3705
|
-
axisBand: {
|
|
3706
|
-
tickOffset: -0.5
|
|
3707
|
-
},
|
|
3708
|
-
// defaults for cartographic projection
|
|
3709
|
-
projection: {
|
|
3710
|
-
type: 'mercator'
|
|
3711
|
-
},
|
|
3712
|
-
// defaults for legends
|
|
3713
|
-
legend: {
|
|
3714
|
-
orient: 'right',
|
|
3715
|
-
padding: 0,
|
|
3716
|
-
gridAlign: 'each',
|
|
3717
|
-
columnPadding: 10,
|
|
3718
|
-
rowPadding: 2,
|
|
3719
|
-
symbolDirection: 'vertical',
|
|
3720
|
-
gradientDirection: 'vertical',
|
|
3721
|
-
gradientLength: 200,
|
|
3722
|
-
gradientThickness: 16,
|
|
3723
|
-
gradientStrokeColor: lightGray,
|
|
3724
|
-
gradientStrokeWidth: 0,
|
|
3725
|
-
gradientLabelOffset: 2,
|
|
3726
|
-
labelAlign: 'left',
|
|
3727
|
-
labelBaseline: 'middle',
|
|
3728
|
-
labelLimit: 160,
|
|
3729
|
-
labelOffset: 4,
|
|
3730
|
-
labelOverlap: true,
|
|
3731
|
-
symbolLimit: 30,
|
|
3732
|
-
symbolType: 'circle',
|
|
3733
|
-
symbolSize: 100,
|
|
3734
|
-
symbolOffset: 0,
|
|
3735
|
-
symbolStrokeWidth: 1.5,
|
|
3736
|
-
symbolBaseFillColor: 'transparent',
|
|
3737
|
-
symbolBaseStrokeColor: gray,
|
|
3738
|
-
titleLimit: 180,
|
|
3739
|
-
titleOrient: 'top',
|
|
3740
|
-
titlePadding: 5,
|
|
3741
|
-
layout: {
|
|
3742
|
-
offset: 18,
|
|
3743
|
-
direction: 'horizontal',
|
|
3744
|
-
left: {
|
|
3745
|
-
direction: 'vertical'
|
|
3746
|
-
},
|
|
3747
|
-
right: {
|
|
3748
|
-
direction: 'vertical'
|
|
3749
|
-
}
|
|
3750
|
-
}
|
|
3751
|
-
},
|
|
3752
|
-
// defaults for scale ranges
|
|
3753
|
-
range: {
|
|
3754
|
-
category: {
|
|
3755
|
-
scheme: 'tableau10'
|
|
3756
|
-
},
|
|
3757
|
-
ordinal: {
|
|
3758
|
-
scheme: 'blues'
|
|
3759
|
-
},
|
|
3760
|
-
heatmap: {
|
|
3761
|
-
scheme: 'yellowgreenblue'
|
|
3762
|
-
},
|
|
3763
|
-
ramp: {
|
|
3764
|
-
scheme: 'blues'
|
|
3765
|
-
},
|
|
3766
|
-
diverging: {
|
|
3767
|
-
scheme: 'blueorange',
|
|
3768
|
-
extent: [1, 0]
|
|
3769
|
-
},
|
|
3770
|
-
symbol: ['circle', 'square', 'triangle-up', 'cross', 'diamond', 'triangle-right', 'triangle-down', 'triangle-left']
|
|
3771
|
-
}
|
|
3772
|
-
};
|
|
3773
|
-
}
|
|
3774
|
-
|
|
3775
|
-
function parse (spec, config, options) {
|
|
3776
|
-
if (!isObject(spec)) {
|
|
3777
|
-
error('Input Vega specification must be an object.');
|
|
3778
|
-
}
|
|
3779
|
-
config = mergeConfig(defaults(), config, spec.config);
|
|
3780
|
-
return parseView(spec, new Scope(config, options)).toRuntime();
|
|
3781
|
-
}
|
|
3782
|
-
|
|
3783
|
-
export { AxisDomainRole, AxisGridRole, AxisLabelRole, AxisRole, AxisTickRole, AxisTitleRole, DataScope, FrameRole, LegendEntryRole, LegendLabelRole, LegendRole, LegendSymbolRole, LegendTitleRole, MarkRole, Scope, ScopeRole, defaults as config, parse, parseSignal as signal, parseSignalUpdates as signalUpdates, parseStream as stream };
|