@veritone-ce/design-system 2.9.0-next.2 → 2.9.0-next.3

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