@elastic/charts 48.0.1 → 50.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/chart_types/flame_chart/flame_chart.js +6 -3
  2. package/dist/chart_types/flame_chart/flame_chart.js.map +1 -1
  3. package/dist/chart_types/metric/renderer/dom/index.js +18 -15
  4. package/dist/chart_types/metric/renderer/dom/index.js.map +1 -1
  5. package/dist/chart_types/metric/renderer/dom/metric.js +1 -0
  6. package/dist/chart_types/metric/renderer/dom/metric.js.map +1 -1
  7. package/dist/chart_types/metric/renderer/dom/text.js +84 -40
  8. package/dist/chart_types/metric/renderer/dom/text.js.map +1 -1
  9. package/dist/chart_types/metric/specs/index.d.ts +16 -7
  10. package/dist/chart_types/metric/specs/index.d.ts.map +1 -1
  11. package/dist/chart_types/metric/specs/index.js +7 -3
  12. package/dist/chart_types/metric/specs/index.js.map +1 -1
  13. package/dist/chart_types/specs.d.ts +1 -1
  14. package/dist/chart_types/specs.d.ts.map +1 -1
  15. package/dist/chart_types/specs.js.map +1 -1
  16. package/dist/chart_types/timeslip/timeslip/axis_model.js.map +1 -1
  17. package/dist/chart_types/timeslip/timeslip/data.js +3 -4
  18. package/dist/chart_types/timeslip/timeslip/data.js.map +1 -1
  19. package/dist/chart_types/timeslip/timeslip/domain_tween.js.map +1 -1
  20. package/dist/chart_types/timeslip/timeslip/render/annotations/chart_title.js +4 -4
  21. package/dist/chart_types/timeslip/timeslip/render/annotations/chart_title.js.map +1 -1
  22. package/dist/chart_types/timeslip/timeslip/render/annotations/time_extent.js +3 -2
  23. package/dist/chart_types/timeslip/timeslip/render/annotations/time_extent.js.map +1 -1
  24. package/dist/chart_types/timeslip/timeslip/render/annotations/time_unit.js +8 -3
  25. package/dist/chart_types/timeslip/timeslip/render/annotations/time_unit.js.map +1 -1
  26. package/dist/chart_types/timeslip/timeslip/render/cartesian.d.ts +9 -1
  27. package/dist/chart_types/timeslip/timeslip/render/cartesian.d.ts.map +1 -1
  28. package/dist/chart_types/timeslip/timeslip/render/cartesian.js +4 -30
  29. package/dist/chart_types/timeslip/timeslip/render/cartesian.js.map +1 -1
  30. package/dist/chart_types/timeslip/timeslip/render/column.js +99 -46
  31. package/dist/chart_types/timeslip/timeslip/render/column.js.map +1 -1
  32. package/dist/chart_types/timeslip/timeslip/render/glyphs/bar.js.map +1 -1
  33. package/dist/chart_types/timeslip/timeslip/render/glyphs/boxplot.d.ts +10 -1
  34. package/dist/chart_types/timeslip/timeslip/render/glyphs/boxplot.d.ts.map +1 -1
  35. package/dist/chart_types/timeslip/timeslip/render/glyphs/boxplot.js +1 -1
  36. package/dist/chart_types/timeslip/timeslip/render/glyphs/boxplot.js.map +1 -1
  37. package/dist/chart_types/timeslip/timeslip/render/glyphs/debug_box.js.map +1 -1
  38. package/dist/chart_types/timeslip/timeslip/render/raster.js +96 -119
  39. package/dist/chart_types/timeslip/timeslip/render/raster.js.map +1 -1
  40. package/dist/chart_types/timeslip/timeslip/timeslip_render.d.ts +7 -1
  41. package/dist/chart_types/timeslip/timeslip/timeslip_render.d.ts.map +1 -1
  42. package/dist/chart_types/timeslip/timeslip/timeslip_render.js +378 -438
  43. package/dist/chart_types/timeslip/timeslip/timeslip_render.js.map +1 -1
  44. package/dist/chart_types/timeslip/timeslip/utils/dom.js +4 -3
  45. package/dist/chart_types/timeslip/timeslip/utils/dom.js.map +1 -1
  46. package/dist/chart_types/timeslip/timeslip/utils/math.js.map +1 -1
  47. package/dist/chart_types/timeslip/timeslip/utils/scale.d.ts +2 -0
  48. package/dist/chart_types/timeslip/timeslip/utils/scale.d.ts.map +1 -0
  49. package/dist/chart_types/timeslip/timeslip/utils/{projection.js → scale.js} +1 -1
  50. package/dist/chart_types/timeslip/timeslip/utils/scale.js.map +1 -0
  51. package/dist/chart_types/timeslip/timeslip_api.d.ts +3 -11
  52. package/dist/chart_types/timeslip/timeslip_api.d.ts.map +1 -1
  53. package/dist/chart_types/timeslip/timeslip_api.js.map +1 -1
  54. package/dist/chart_types/timeslip/timeslip_chart.js +3 -1
  55. package/dist/chart_types/timeslip/timeslip_chart.js.map +1 -1
  56. package/dist/chart_types/xy_chart/axes/timeslip/multilayer_ticks.js +14 -11
  57. package/dist/chart_types/xy_chart/axes/timeslip/multilayer_ticks.js.map +1 -1
  58. package/dist/chart_types/xy_chart/axes/timeslip/rasters.d.ts +2 -0
  59. package/dist/chart_types/xy_chart/axes/timeslip/rasters.d.ts.map +1 -1
  60. package/dist/chart_types/xy_chart/axes/timeslip/rasters.js +1 -1
  61. package/dist/chart_types/xy_chart/axes/timeslip/rasters.js.map +1 -1
  62. package/dist/chart_types/xy_chart/axes/timeslip/time_unit_translations.d.ts +2 -0
  63. package/dist/chart_types/xy_chart/axes/timeslip/time_unit_translations.d.ts.map +1 -0
  64. package/dist/chart_types/xy_chart/axes/timeslip/time_unit_translations.js +127 -0
  65. package/dist/chart_types/xy_chart/axes/timeslip/time_unit_translations.js.map +1 -0
  66. package/dist/chart_types/xy_chart/domains/x_domain.js +3 -4
  67. package/dist/chart_types/xy_chart/domains/x_domain.js.map +1 -1
  68. package/dist/chart_types/xy_chart/utils/specs.js.map +1 -1
  69. package/dist/common/iterables.js +40 -1
  70. package/dist/common/iterables.js.map +1 -1
  71. package/dist/common/predicate.js +5 -1
  72. package/dist/common/predicate.js.map +1 -1
  73. package/dist/theme.scss +9 -0
  74. package/dist/theme_dark.css +1 -1
  75. package/dist/theme_dark.css.map +1 -1
  76. package/dist/theme_light.css +1 -1
  77. package/dist/theme_light.css.map +1 -1
  78. package/dist/theme_only_dark.css +1 -1
  79. package/dist/theme_only_dark.css.map +1 -1
  80. package/dist/theme_only_light.css +1 -1
  81. package/dist/theme_only_light.css.map +1 -1
  82. package/dist/utils/themes/dark_theme.d.ts.map +1 -1
  83. package/dist/utils/themes/dark_theme.js +2 -0
  84. package/dist/utils/themes/dark_theme.js.map +1 -1
  85. package/dist/utils/themes/light_theme.d.ts.map +1 -1
  86. package/dist/utils/themes/light_theme.js +2 -0
  87. package/dist/utils/themes/light_theme.js.map +1 -1
  88. package/dist/utils/themes/theme.d.ts +2 -0
  89. package/dist/utils/themes/theme.d.ts.map +1 -1
  90. package/dist/utils/themes/theme.js.map +1 -1
  91. package/dist/utils/time_zone.d.ts +2 -0
  92. package/dist/utils/time_zone.d.ts.map +1 -0
  93. package/dist/utils/time_zone.js +29 -0
  94. package/dist/utils/time_zone.js.map +1 -0
  95. package/package.json +1 -1
  96. package/dist/chart_types/timeslip/timeslip/translations.d.ts +0 -2
  97. package/dist/chart_types/timeslip/timeslip/translations.d.ts.map +0 -1
  98. package/dist/chart_types/timeslip/timeslip/translations.js +0 -215
  99. package/dist/chart_types/timeslip/timeslip/translations.js.map +0 -1
  100. package/dist/chart_types/timeslip/timeslip/utils/generator.d.ts +0 -2
  101. package/dist/chart_types/timeslip/timeslip/utils/generator.d.ts.map +0 -1
  102. package/dist/chart_types/timeslip/timeslip/utils/generator.js +0 -18
  103. package/dist/chart_types/timeslip/timeslip/utils/generator.js.map +0 -1
  104. package/dist/chart_types/timeslip/timeslip/utils/projection.d.ts +0 -2
  105. package/dist/chart_types/timeslip/timeslip/utils/projection.d.ts.map +0 -1
  106. package/dist/chart_types/timeslip/timeslip/utils/projection.js.map +0 -1
@@ -10,33 +10,6 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
- var __generator = (this && this.__generator) || function (thisArg, body) {
14
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
15
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
16
- function verb(n) { return function (v) { return step([n, v]); }; }
17
- function step(op) {
18
- if (f) throw new TypeError("Generator is already executing.");
19
- while (_) try {
20
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
21
- if (y = 0, t) op = [op[0] & 2, t.value];
22
- switch (op[0]) {
23
- case 0: case 1: t = op; break;
24
- case 4: _.label++; return { value: op[1], done: false };
25
- case 5: _.label++; y = op[1]; op = [0]; continue;
26
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
27
- default:
28
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
29
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
30
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
31
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
32
- if (t[2]) _.ops.pop();
33
- _.trys.pop(); continue;
34
- }
35
- op = body.call(thisArg, _);
36
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
37
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
38
- }
39
- };
40
13
  var __read = (this && this.__read) || function (o, n) {
41
14
  var m = typeof Symbol === "function" && o[Symbol.iterator];
42
15
  if (!m) return o;
@@ -64,7 +37,9 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
64
37
  };
65
38
  Object.defineProperty(exports, "__esModule", { value: true });
66
39
  exports.timeslipRender = void 0;
40
+ var time_zone_1 = require("../../../utils/time_zone");
67
41
  var cached_chrono_1 = require("../../xy_chart/axes/timeslip/chrono/cached_chrono");
42
+ var multilayer_ticks_1 = require("../../xy_chart/axes/timeslip/multilayer_ticks");
68
43
  var rasters_1 = require("../../xy_chart/axes/timeslip/rasters");
69
44
  var axis_model_1 = require("./axis_model");
70
45
  var data_1 = require("./data");
@@ -75,449 +50,414 @@ var time_unit_1 = require("./render/annotations/time_unit");
75
50
  var cartesian_1 = require("./render/cartesian");
76
51
  var debug_box_1 = require("./render/glyphs/debug_box");
77
52
  var dom_1 = require("./utils/dom");
78
- var generator_1 = require("./utils/generator");
79
53
  var math_1 = require("./utils/math");
80
- var projection_1 = require("./utils/projection");
54
+ var scale_1 = require("./utils/scale");
81
55
  var panOngoing = function (interactionState) { return Number.isFinite(interactionState.dragStartX); };
82
- var timeslipRender = function (canvas, ctx, getData) {
83
- var processAction = (0, generator_1.toCallbackFn)(handleEvents());
84
- var initialDarkMode = false;
85
- var drawCartesianBox = false;
86
- var singleValuedMetricsAggregationFunctionNames = {
87
- sum: 'value',
88
- min: 'minimum',
89
- max: 'maximum',
90
- avg: 'average',
91
- cardinality: 'cardinality',
92
- median_absolute_deviation: 'med abs dev',
93
- rate: 'rate',
94
- value_count: 'value count',
95
- };
96
- var aggregationFunctionNames = __assign({}, singleValuedMetricsAggregationFunctionNames);
97
- var metricFieldNames = ['machine.ram', 'bytes', 'memory'];
98
- var minZoom = 0;
99
- var maxZoom = 35;
100
- var lineThicknessSteps = [0.5, 0.75, 1, 1, 1, 1.25, 1.25, 1.5, 1.5, 1.75, 1.75, 2, 2, 2, 2, 2];
101
- var lumaSteps = [192, 72, 32, 16, 8, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0];
102
- var smallFontSize = 12;
103
- var timeZone = 'Europe/Zurich';
104
- var themeLight = {
105
- defaultFontColor: 'black',
106
- subduedFontColor: '#393939',
107
- offHourFontColor: 'black',
108
- weekendFontColor: 'darkred',
109
- backgroundColor: { r: 255, g: 255, b: 255 },
110
- lumaSteps: lumaSteps,
111
- };
112
- var themeDark = {
113
- defaultFontColor: 'white',
114
- subduedFontColor: 'darkgrey',
115
- offHourFontColor: 'white',
116
- weekendFontColor: 'indianred',
117
- backgroundColor: { r: 0, g: 0, b: 0 },
118
- lumaSteps: lumaSteps.map(function (l) { return 255 - l; }),
119
- };
120
- var config = __assign(__assign(__assign({ darkMode: initialDarkMode, sparse: false, implicit: false, maxLabelRowCount: 2, queryConfig: {
121
- metricFieldName: metricFieldNames[0],
122
- aggregation: 'value_count',
123
- boxplot: false,
124
- window: 0,
125
- alpha: 0.4,
126
- beta: 0.2,
127
- gamma: 0.2,
128
- period: 1,
129
- multiplicative: false,
130
- binOffset: 0,
131
- }, a11y: {
132
- shortcuts: true,
133
- contrast: 'medium',
134
- animation: true,
135
- sonification: false,
136
- }, locale: 'en-US', numUnit: 'short' }, (initialDarkMode && themeDark)), (!initialDarkMode && themeLight)), { barChroma: { r: 96, g: 146, b: 192 }, barFillAlpha: 0.3, lineThicknessSteps: lineThicknessSteps, domainFrom: (0, cached_chrono_1.cachedZonedDateTimeFrom)({ timeZone: timeZone, year: 2012, month: 1, day: 1 })[cached_chrono_1.timeProp.epochSeconds], domainTo: (0, cached_chrono_1.cachedZonedDateTimeFrom)({ timeZone: timeZone, year: 2022, month: 1, day: 1 })[cached_chrono_1.timeProp.epochSeconds], minBinWidth: 'day', maxBinWidth: 'year', pixelRangeFrom: 100, pixelRangeTo: 500, tickLabelMaxProtrusionLeft: 0, tickLabelMaxProtrusionRight: 0, protrudeAxisLeft: true, protrudeAxisRight: true, smallFontSize: smallFontSize, cssFontShorthand: "normal normal 100 ".concat(smallFontSize, "px Inter, Helvetica, Arial, sans-serif"), monospacedFontShorthand: "normal normal 100 ".concat(smallFontSize, "px \"Roboto Mono\", Consolas, Menlo, Courier, monospace"), rowPixelPitch: 16, horizontalPixelOffset: 4, verticalPixelOffset: 6, minimumTickPixelDistance: 24, workHourMin: 6, workHourMax: 21, clipLeft: true, clipRight: true });
137
- var dpi = window.devicePixelRatio;
138
- var horizontalCartesianAreaPad = [0.04, 0.04];
139
- var verticalCartesianAreaPad = [0.12, 0.12];
140
- var interactionState = {
141
- zoom: 5.248,
142
- pan: 0.961,
143
- multitouch: [],
144
- dragStartX: NaN,
145
- zoomStart: NaN,
146
- panStart: NaN,
147
- lastDragX: NaN,
148
- dragVelocity: NaN,
149
- flyVelocity: NaN,
150
- niceDomainMin: NaN,
151
- niceDomainMax: NaN,
152
- screenDimensions: (0, dom_1.elementSizes)(canvas, horizontalCartesianAreaPad, verticalCartesianAreaPad),
153
- searchText: '',
154
- };
155
- var localeOptions = {
156
- hour12: false,
157
- year: 'numeric',
158
- month: 'short',
159
- day: '2-digit',
160
- hour: '2-digit',
161
- minute: '2-digit',
162
- second: '2-digit',
163
- };
164
- var dataState = {
165
- valid: false,
166
- pending: false,
167
- lo: { year: Infinity, month: 12, day: 31, hour: 23, minute: 59, second: 59 },
168
- hi: { year: -Infinity, month: 1, day: 1, hour: 0, minute: 0, second: 0 },
169
- binUnit: '',
170
- binUnitCount: NaN,
171
- queryConfig: {},
172
- dataResponse: { stats: {}, rows: [] },
173
- };
174
- var rasterSelector = (0, rasters_1.rasters)(config, timeZone);
175
- var defaultLabelFormat = new Intl.DateTimeFormat(config.locale, {
176
- weekday: 'short',
177
- hour: 'numeric',
178
- minute: 'numeric',
179
- timeZone: timeZone,
180
- }).format;
181
- var defaultMinorTickLabelFormat = new Intl.DateTimeFormat(config.locale, {
182
- weekday: 'short',
183
- hour: 'numeric',
184
- minute: 'numeric',
185
- timeZone: timeZone,
186
- }).format;
187
- var fadeOutPixelWidth = 12;
188
- var invalid = function (dataDemand) {
189
- return (!dataState.valid ||
190
- dataState.binUnit !== dataDemand.binUnit ||
191
- dataState.binUnitCount !== dataDemand.binUnitCount ||
192
- dataDemand.lo.timePointSec < dataState.lo.timePointSec ||
193
- dataDemand.hi.timePointSec > dataState.hi.timePointSec ||
194
- dataState.queryConfig !== JSON.stringify(config.queryConfig) ||
195
- dataState.searchText !== interactionState.searchText);
196
- };
197
- var updateDataState = function (dataDemand, config, dataResponse, interactionState) {
198
- dataState.pending = false;
199
- dataState.valid = true;
200
- dataState.lo = dataDemand.lo;
201
- dataState.hi = dataDemand.hi;
202
- dataState.binUnit = dataDemand.binUnit;
203
- dataState.binUnitCount = dataDemand.binUnitCount;
204
- dataState.queryConfig = JSON.stringify(config.queryConfig);
205
- dataState.dataResponse = dataResponse;
206
- dataState.searchText = interactionState.searchText;
207
- };
208
- var yTickNumberFormatter = new Intl.NumberFormat(config.locale, config.numUnit === 'none'
209
- ? {}
210
- : {
211
- notation: 'compact',
212
- compactDisplay: config.numUnit,
213
- });
214
- var ZERO_Y_BASE = true;
215
- var emWidth = ctx.measureText('mmmmmmmmmm').width / 10;
216
- var canvasWidth = NaN;
217
- var canvasHeight = NaN;
218
- var fromSec = config.domainFrom;
219
- var toSec = config.domainTo;
56
+ var initialDarkMode = false;
57
+ var drawCartesianBox = false;
58
+ var minZoom = 0;
59
+ var maxZoom = 35;
60
+ var lineThicknessSteps = [0.5, 0.75, 1, 1, 1, 1.25, 1.25, 1.5, 1.5, 1.75, 1.75, 2, 2, 2, 2, 2];
61
+ var lumaSteps = [192, 72, 32, 16, 8, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0];
62
+ var smallFontSize = 12;
63
+ var timeZone = (0, time_zone_1.getValidatedTimeZone)((0, time_zone_1.getZoneFromSpecs)([]));
64
+ var themeLight = {
65
+ defaultFontColor: 'black',
66
+ subduedFontColor: '#393939',
67
+ offHourFontColor: 'black',
68
+ weekendFontColor: 'darkred',
69
+ backgroundColor: { r: 255, g: 255, b: 255 },
70
+ lumaSteps: lumaSteps,
71
+ };
72
+ var themeDark = {
73
+ defaultFontColor: 'white',
74
+ subduedFontColor: 'darkgrey',
75
+ offHourFontColor: 'white',
76
+ weekendFontColor: 'indianred',
77
+ backgroundColor: { r: 0, g: 0, b: 0 },
78
+ lumaSteps: lumaSteps.map(function (l) { return 255 - l; }),
79
+ };
80
+ var rasterConfig = {
81
+ minimumTickPixelDistance: multilayer_ticks_1.MINIMUM_TICK_PIXEL_DISTANCE,
82
+ locale: multilayer_ticks_1.DEFAULT_LOCALE,
83
+ };
84
+ var config = __assign(__assign(__assign({ darkMode: initialDarkMode }, (initialDarkMode ? themeDark : themeLight)), rasterConfig), { sparse: false, implicit: false, maxLabelRowCount: 2, a11y: {
85
+ contrast: 'medium',
86
+ }, numUnit: 'short', barChroma: { r: 96, g: 146, b: 192 }, barFillAlpha: 0.3, lineThicknessSteps: lineThicknessSteps, domainFrom: (0, cached_chrono_1.cachedZonedDateTimeFrom)({ timeZone: timeZone, year: 2012, month: 1, day: 1 })[cached_chrono_1.timeProp.epochSeconds], domainTo: (0, cached_chrono_1.cachedZonedDateTimeFrom)({ timeZone: timeZone, year: 2022, month: 1, day: 1 })[cached_chrono_1.timeProp.epochSeconds], smallFontSize: smallFontSize, cssFontShorthand: "normal normal 100 ".concat(smallFontSize, "px Inter, Helvetica, Arial, sans-serif"), monospacedFontShorthand: "normal normal 100 ".concat(smallFontSize, "px \"Roboto Mono\", Consolas, Menlo, Courier, monospace"), rowPixelPitch: 16, horizontalPixelOffset: 4, verticalPixelOffset: 6, clipLeft: true, clipRight: true, yTickOverhang: 8, yTickGap: 8 });
87
+ var rasterSelector = (0, rasters_1.rasters)(rasterConfig, timeZone);
88
+ var ZERO_Y_BASE = true;
89
+ var horizontalCartesianAreaPad = [0.04, 0.04];
90
+ var verticalCartesianAreaPad = [0.12, 0.12];
91
+ var initialZoom = 5.248;
92
+ var initialPan = 0.961;
93
+ var localeOptions = {
94
+ hour12: false,
95
+ year: 'numeric',
96
+ month: 'short',
97
+ day: '2-digit',
98
+ hour: '2-digit',
99
+ minute: '2-digit',
100
+ second: '2-digit',
101
+ };
102
+ var defaultLabelFormat = new Intl.DateTimeFormat(config.locale, {
103
+ weekday: 'short',
104
+ hour: 'numeric',
105
+ minute: 'numeric',
106
+ timeZone: timeZone,
107
+ }).format.bind(Intl.DateTimeFormat);
108
+ var defaultMinorTickLabelFormat = new Intl.DateTimeFormat(config.locale, {
109
+ weekday: 'short',
110
+ hour: 'numeric',
111
+ minute: 'numeric',
112
+ timeZone: timeZone,
113
+ }).format.bind(Intl.DateTimeFormat);
114
+ var fadeOutPixelWidth = 12;
115
+ var chartTopFontSize = config.smallFontSize + 2;
116
+ var background = config.backgroundColor;
117
+ var backgroundFillStyle = "rgba(".concat(background.r, ",").concat(background.g, ",").concat(background.b, ",1)");
118
+ var dragVelocityAttenuation = 0.92;
119
+ var wheelPanVelocityDivisor = 1000;
120
+ var wheelZoomVelocityDivisor = 250;
121
+ var keyZoomVelocityDivisor = 2;
122
+ var keyPanVelocityDivisor = 10;
123
+ var velocityThreshold = 0.01;
124
+ var touchMidpoint = function (multitouch) { return (multitouch[0].x + multitouch[1].x) / 2; };
125
+ var isNonNull = function (thing) { return thing !== null; };
126
+ var invalid = function (dataState, dataDemand) {
127
+ var _a, _b, _c, _d, _e, _f, _g, _h;
128
+ return !dataState.valid ||
129
+ dataState.binUnit !== dataDemand.binUnit ||
130
+ dataState.binUnitCount !== dataDemand.binUnitCount ||
131
+ ((_b = (_a = dataDemand.lo) === null || _a === void 0 ? void 0 : _a.timePointSec) !== null && _b !== void 0 ? _b : -Infinity) < ((_d = (_c = dataState.lo) === null || _c === void 0 ? void 0 : _c.timePointSec) !== null && _d !== void 0 ? _d : -Infinity) ||
132
+ ((_f = (_e = dataDemand.hi) === null || _e === void 0 ? void 0 : _e.timePointSec) !== null && _f !== void 0 ? _f : Infinity) > ((_h = (_g = dataState.hi) === null || _g === void 0 ? void 0 : _g.timePointSec) !== null && _h !== void 0 ? _h : Infinity);
133
+ };
134
+ var updateDataState = function (dataState, dataDemand, dataResponse) {
135
+ dataState.pending = false;
136
+ dataState.valid = true;
137
+ dataState.lo = dataDemand.lo;
138
+ dataState.hi = dataDemand.hi;
139
+ dataState.binUnit = dataDemand.binUnit;
140
+ dataState.binUnitCount = dataDemand.binUnitCount;
141
+ dataState.dataResponse = dataResponse;
142
+ };
143
+ var yTickNumberFormatter = new Intl.NumberFormat(config.locale, config.numUnit === 'none'
144
+ ? {}
145
+ : {
146
+ notation: 'compact',
147
+ compactDisplay: config.numUnit,
148
+ }).format.bind(Intl.NumberFormat);
149
+ var zoomMultiplier = function (zoom) { return Math.pow(2, zoom); };
150
+ var inCartesianArea = function (screenDimensions, e) {
151
+ var x = (0, dom_1.zoomSafePointerX)(e);
152
+ var y = (0, dom_1.zoomSafePointerY)(e);
153
+ var innerTop = screenDimensions.innerTop, innerBottom = screenDimensions.innerBottom, innerLeft = screenDimensions.innerLeft, innerRight = screenDimensions.innerRight;
154
+ return innerLeft <= x && x <= innerRight && innerTop <= y && y <= innerBottom;
155
+ };
156
+ var getTimeDomain = function (interactionState, fromSec, toSec) {
220
157
  var fullTimeExtent = toSec - fromSec;
221
- var zoomMultiplier = function () { return Math.pow(2, interactionState.zoom); };
222
- var rAF = -1;
223
- var prevT = 0;
224
- var timedRender = function (t) {
225
- var deltaT = t - prevT;
226
- prevT = t;
227
- chartWithTime(ctx, config, interactionState, deltaT);
228
- };
229
- function scheduleChartRender() {
230
- window.cancelAnimationFrame(rAF);
231
- rAF = window.requestAnimationFrame(timedRender);
158
+ var pan = interactionState.pan;
159
+ var zoomedTimeExtent = fullTimeExtent / zoomMultiplier(interactionState.zoom);
160
+ var leeway = fullTimeExtent - zoomedTimeExtent;
161
+ var domainFrom = fromSec + pan * leeway;
162
+ var domainTo = toSec - (1 - pan) * leeway;
163
+ return { domainFrom: domainFrom, domainTo: domainTo };
164
+ };
165
+ var getPanDeltaPerDragPixel = function (interactionState) {
166
+ return 1 / ((zoomMultiplier(interactionState.zoom) - 1) * interactionState.screenDimensions.innerWidth);
167
+ };
168
+ var panFromDeltaPixel = function (interactionState, panStart, delta) {
169
+ var panDeltaPerDragPixel = getPanDeltaPerDragPixel(interactionState);
170
+ interactionState.pan = Math.max(0, Math.min(1, panStart - panDeltaPerDragPixel * delta)) || 0;
171
+ };
172
+ var inCartesianBand = function (screenDimensions, y) {
173
+ var cartesianTop = screenDimensions.innerTop, cartesianBottom = screenDimensions.innerBottom;
174
+ return cartesianTop <= y && y <= cartesianBottom;
175
+ };
176
+ var zoom = function (interactionState, pointerUnitLocation, newZoom, panDelta) {
177
+ if (panDelta === void 0) { panDelta = 0; }
178
+ var oldInvisibleFraction = 1 - 1 / zoomMultiplier(interactionState.zoom);
179
+ interactionState.zoom = (0, math_1.clamp)(newZoom, minZoom, maxZoom);
180
+ var newInvisibleFraction = 1 - 1 / zoomMultiplier(interactionState.zoom);
181
+ interactionState.pan =
182
+ (0, math_1.unitClamp)((0, math_1.mix)(pointerUnitLocation + panDelta, interactionState.pan, oldInvisibleFraction / newInvisibleFraction)) ||
183
+ 0;
184
+ };
185
+ var zoomAroundX = function (interactionState, centerX, newZoom, panDelta) {
186
+ if (panDelta === void 0) { panDelta = 0; }
187
+ var _a = interactionState.screenDimensions, cartesianWidth = _a.innerWidth, cartesianLeft = _a.innerLeft;
188
+ var unitZoomCenter = Math.max(0, Math.min(cartesianWidth, centerX - cartesianLeft)) / cartesianWidth;
189
+ zoom(interactionState, unitZoomCenter, newZoom, panDelta);
190
+ };
191
+ var pan = function (interactionState, normalizedDeltaPan) {
192
+ var deltaPan = normalizedDeltaPan / Math.pow(2, interactionState.zoom);
193
+ interactionState.pan = (0, math_1.unitClamp)(interactionState.pan + deltaPan) || 0;
194
+ };
195
+ var panZoomJump = function (interactionState, panDirection, zoomDirection) {
196
+ var panOrZoom = panDirection || zoomDirection;
197
+ if (panOrZoom) {
198
+ if (panDirection)
199
+ pan(interactionState, panDirection / keyPanVelocityDivisor);
200
+ if (zoomDirection)
201
+ zoom(interactionState, 0.5, interactionState.zoom + zoomDirection / keyZoomVelocityDivisor);
232
202
  }
233
- function doCartesian(ctx, cartesianHeight, config, interactionState, deltaT, cartesianWidth, timeDomainFrom, timeDomainTo) {
234
- ctx.save();
235
- ctx.translate(0, cartesianHeight);
236
- var domainLandmarks = __spreadArray([
237
- dataState.dataResponse.stats.minValue,
238
- dataState.dataResponse.stats.maxValue
239
- ], __read((ZERO_Y_BASE ? [0] : [])), false);
240
- var desiredTickCount = (0, projection_1.getDesiredTickCount)(cartesianHeight, config.smallFontSize, config.sparse);
241
- var _a = (0, axis_model_1.axisModel)(domainLandmarks, desiredTickCount), niceDomainMin = _a.niceDomainMin, niceDomainMax = _a.niceDomainMax, niceTicks = _a.niceTicks;
242
- var yTweenOngoing = (0, domain_tween_1.domainTween)(interactionState, deltaT, niceDomainMin, niceDomainMax);
243
- var yUnitScale = (0, projection_1.axisScale)(interactionState.niceDomainMin, interactionState.niceDomainMax);
244
- var yUnitScaleClamped = function (d) { return (0, math_1.unitClamp)(yUnitScale(d)); };
245
- var dataDemand = (0, cartesian_1.renderCartesian)(ctx, config, dataState, config, defaultMinorTickLabelFormat, emWidth, fadeOutPixelWidth, defaultLabelFormat, yTickNumberFormatter, rasterSelector, cartesianWidth, cartesianHeight, {
246
- domainFrom: timeDomainFrom,
247
- domainTo: timeDomainTo,
248
- }, yUnitScale, yUnitScaleClamped, niceTicks);
249
- ctx.restore();
250
- return { yTweenOngoing: yTweenOngoing, dataDemand: dataDemand };
203
+ return panOrZoom;
204
+ };
205
+ var dragStartAtX = function (interactionState, startingX) {
206
+ interactionState.dragStartX = startingX;
207
+ interactionState.lastDragX = startingX;
208
+ interactionState.dragVelocity = NaN;
209
+ interactionState.flyVelocity = NaN;
210
+ interactionState.panStart = interactionState.pan;
211
+ };
212
+ var zoomOrPan = function (interactionState, panning, centerX, deltaY) {
213
+ if (panning) {
214
+ pan(interactionState, -deltaY / wheelPanVelocityDivisor);
251
215
  }
252
- function getTimeDomain() {
253
- var pan = interactionState.pan;
254
- var zoomedTimeExtent = fullTimeExtent / zoomMultiplier();
255
- var leeway = fullTimeExtent - zoomedTimeExtent;
256
- var timeDomainFrom = fromSec + pan * leeway;
257
- var timeDomainTo = toSec - (1 - pan) * leeway;
258
- return { timeDomainFrom: timeDomainFrom, timeDomainTo: timeDomainTo };
216
+ else {
217
+ var newZoom = interactionState.zoom - deltaY / wheelZoomVelocityDivisor;
218
+ zoomAroundX(interactionState, centerX, newZoom);
259
219
  }
260
- function ensureCanvasElementSize(newCanvasWidth, newCanvasHeight) {
261
- if (newCanvasWidth !== canvasWidth) {
262
- canvas.setAttribute('width', String(newCanvasWidth));
263
- canvasWidth = newCanvasWidth;
264
- }
265
- if (newCanvasHeight !== canvasHeight) {
266
- canvas.setAttribute('height', String(newCanvasHeight));
267
- canvasHeight = newCanvasHeight;
268
- }
220
+ };
221
+ var endDrag = function (interactionState) {
222
+ interactionState.flyVelocity = interactionState.dragVelocity;
223
+ interactionState.dragVelocity = NaN;
224
+ interactionState.dragStartX = NaN;
225
+ interactionState.panStart = NaN;
226
+ };
227
+ var panFromX = function (interactionState, currentX) {
228
+ var deltaX = currentX - interactionState.lastDragX;
229
+ var dragVelocity = interactionState.dragVelocity;
230
+ interactionState.dragVelocity =
231
+ deltaX * dragVelocity > 0 && Math.abs(deltaX) < Math.abs(dragVelocity)
232
+ ? dragVelocity
233
+ : deltaX;
234
+ interactionState.lastDragX = currentX;
235
+ var delta = currentX - interactionState.dragStartX;
236
+ panFromDeltaPixel(interactionState, interactionState.panStart, delta);
237
+ return delta;
238
+ };
239
+ var touches = function (e) {
240
+ var _a, _b;
241
+ return __spreadArray([], __read(new Array((_b = (_a = e.touches) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0)), false).map(function (n) { return e.touches.item(n); })
242
+ .filter(isNonNull)
243
+ .map(function (t) { return ({ id: t.identifier, x: t.clientX }); })
244
+ .sort(function (_a, _b) {
245
+ var a = _a.x;
246
+ var b = _b.x;
247
+ return a - b;
248
+ });
249
+ };
250
+ var touchUpdate = function (interactionState, multitouch) {
251
+ if (interactionState.multitouch.length === 0 && multitouch.length === 2) {
252
+ interactionState.multitouch = multitouch;
253
+ interactionState.zoomStart = interactionState.zoom;
254
+ var centerX = touchMidpoint(multitouch);
255
+ dragStartAtX(interactionState, centerX);
269
256
  }
270
- function renderChartWithTime(ctx, backgroundFillStyle, newCanvasWidth, newCanvasHeight, config, chartWidth, cartesianTop, aggregationFunctionName, cartesianLeft, cartesianHeight, interactionState, deltaT, cartesianWidth, timeDomainFrom, timeDomainTo, drawCartesianBox, chartTopFontSize) {
271
- ctx.save();
272
- ctx.scale(dpi, dpi);
273
- ctx.fillStyle = backgroundFillStyle;
274
- ctx.fillRect(0, 0, newCanvasWidth, newCanvasHeight);
275
- (0, chart_title_1.renderChartTitle)(ctx, config, chartWidth, cartesianTop, aggregationFunctionName);
276
- ctx.translate(cartesianLeft, cartesianTop);
277
- var _a = doCartesian(ctx, cartesianHeight, config, interactionState, deltaT, cartesianWidth, timeDomainFrom, timeDomainTo), yTweenOngoing = _a.yTweenOngoing, dataDemand = _a.dataDemand;
278
- if (drawCartesianBox) {
279
- (0, debug_box_1.renderDebugBox)(ctx, cartesianWidth, cartesianHeight);
280
- }
281
- (0, time_unit_1.renderTimeUnitAnnotation)(ctx, config, dataDemand.binUnitCount, dataDemand.binUnit, chartTopFontSize, dataDemand.unitBarMaxWidthPixels);
282
- (0, time_extent_1.renderTimeExtentAnnotation)(ctx, config, localeOptions, timeDomainFrom, timeDomainTo, cartesianWidth, chartTopFontSize);
283
- ctx.restore();
284
- return { yTweenOngoing: yTweenOngoing, dataDemand: dataDemand };
257
+ else if (multitouch.length !== 2 ||
258
+ __spreadArray(__spreadArray([], __read(multitouch), false), __read(interactionState.multitouch), false).filter(function (t, i, a) { return a.findIndex(function (tt) { return tt.id === t.id; }) === i; })
259
+ .length !== 2) {
260
+ interactionState.multitouch = [];
261
+ interactionState.zoomStart = NaN;
285
262
  }
286
- var dataArrived = function (_a) {
287
- var dataDemand = _a.dataDemand, dataResponse = _a.dataResponse;
288
- updateDataState(dataDemand, config, dataResponse, interactionState);
289
- scheduleChartRender();
290
- };
291
- function chartWithTime(ctx, config, interactionState, deltaT) {
292
- var _a = interactionState.screenDimensions, chartWidth = _a.outerWidth, chartHeight = _a.outerHeight, cartesianLeft = _a.innerLeft, cartesianWidth = _a.innerWidth, cartesianTop = _a.innerTop, cartesianHeight = _a.innerHeight;
293
- var _b = getTimeDomain(), timeDomainFrom = _b.timeDomainFrom, timeDomainTo = _b.timeDomainTo;
294
- var qc = config.queryConfig;
295
- var aggregationFunctionName = aggregationFunctionNames[qc.aggregation];
296
- var chartTopFontSize = config.smallFontSize + 2;
297
- var background = config.backgroundColor;
298
- var backgroundFillStyle = "rgba(".concat(background.r, ",").concat(background.g, ",").concat(background.b, ",1)");
299
- var newCanvasWidth = dpi * chartWidth;
300
- var newCanvasHeight = dpi * chartHeight;
301
- ensureCanvasElementSize(newCanvasWidth, newCanvasHeight);
302
- var _c = renderChartWithTime(ctx, backgroundFillStyle, newCanvasWidth, newCanvasHeight, config, chartWidth, cartesianTop, aggregationFunctionName, cartesianLeft, cartesianHeight, interactionState, deltaT, cartesianWidth, timeDomainFrom, timeDomainTo, drawCartesianBox, chartTopFontSize), yTweenOngoing = _c.yTweenOngoing, dataDemand = _c.dataDemand;
303
- if (!dataState.pending &&
304
- invalid(dataDemand) &&
305
- dataDemand.lo &&
306
- dataDemand.hi &&
307
- dataDemand.binUnit &&
308
- dataDemand.binUnitCount) {
309
- dataState.pending = true;
310
- processAction({
311
- dataDemand: dataDemand,
312
- target: data_1.dataSource,
313
- type: 'dataArrived',
314
- dataResponse: (0, data_1.getEnrichedData)(getData(dataDemand)),
315
- });
316
- }
317
- else if (yTweenOngoing) {
318
- scheduleChartRender();
319
- }
263
+ var isPinchZoom = interactionState.multitouch.length === 2;
264
+ if (isPinchZoom) {
265
+ var centerX = touchMidpoint(multitouch);
266
+ var zoomMultiplierValue = (multitouch[1].x - multitouch[0].x) / (interactionState.multitouch[1].x - interactionState.multitouch[0].x);
267
+ var panDelta = 0;
268
+ zoomAroundX(interactionState, centerX, interactionState.zoomStart + Math.log2(zoomMultiplierValue), panDelta);
320
269
  }
321
- var setDomElements = function () {
322
- var chartSizeInfo = (0, dom_1.elementSizes)(canvas, horizontalCartesianAreaPad, verticalCartesianAreaPad);
323
- interactionState.screenDimensions = chartSizeInfo;
324
- var _a = config.backgroundColor, r = _a.r, g = _a.g, b = _a.b;
325
- var backgroundColorCSS = "rgb(".concat(r, ",").concat(g, ",").concat(b, ")");
326
- document.body.style.backgroundColor = backgroundColorCSS;
327
- };
328
- var fullRender = function () {
329
- setDomElements();
330
- scheduleChartRender();
331
- };
332
- fullRender();
333
- var getPanDeltaPerDragPixel = function () { return 1 / ((zoomMultiplier() - 1) * interactionState.screenDimensions.innerWidth); };
334
- var panFromDeltaPixel = function (panStart, delta) {
335
- var panDeltaPerDragPixel = getPanDeltaPerDragPixel();
336
- interactionState.pan = Math.max(0, Math.min(1, panStart - panDeltaPerDragPixel * delta)) || 0;
337
- };
338
- var inCartesianBand = function (e) {
339
- var y = (0, dom_1.zoomSafePointerY)(e);
340
- var _a = interactionState.screenDimensions, cartesianTop = _a.innerTop, cartesianBottom = _a.innerBottom;
341
- return cartesianTop <= y && y <= cartesianBottom;
342
- };
343
- var inCartesianArea = function (e) {
344
- var x = (0, dom_1.zoomSafePointerX)(e);
345
- var y = (0, dom_1.zoomSafePointerY)(e);
346
- var _a = interactionState.screenDimensions, innerTop = _a.innerTop, innerBottom = _a.innerBottom, innerLeft = _a.innerLeft, innerRight = _a.innerRight;
347
- return innerLeft <= x && x <= innerRight && innerTop <= y && y <= innerBottom;
348
- };
349
- var zoom = function (pointerUnitLocation, newZoom, panDelta) {
350
- if (panDelta === void 0) { panDelta = 0; }
351
- var oldInvisibleFraction = 1 - 1 / zoomMultiplier();
352
- interactionState.zoom = (0, math_1.clamp)(newZoom, minZoom, maxZoom);
353
- var newInvisibleFraction = 1 - 1 / zoomMultiplier();
354
- interactionState.pan =
355
- (0, math_1.unitClamp)((0, math_1.mix)(pointerUnitLocation + panDelta, interactionState.pan, oldInvisibleFraction / newInvisibleFraction)) || 0;
356
- };
357
- var zoomAroundX = function (centerX, newZoom, panDelta) {
358
- if (panDelta === void 0) { panDelta = 0; }
359
- var _a = interactionState.screenDimensions, cartesianWidth = _a.innerWidth, cartesianLeft = _a.innerLeft;
360
- var unitZoomCenter = Math.max(0, Math.min(cartesianWidth, centerX - cartesianLeft)) / cartesianWidth;
361
- zoom(unitZoomCenter, newZoom, panDelta);
270
+ return isPinchZoom;
271
+ };
272
+ var kineticFlywheel = function (interactionState) {
273
+ var velocity = interactionState.flyVelocity;
274
+ var needsViewUpdate = Math.abs(velocity) > velocityThreshold;
275
+ if (needsViewUpdate) {
276
+ panFromDeltaPixel(interactionState, interactionState.pan, velocity);
277
+ interactionState.flyVelocity *= dragVelocityAttenuation;
278
+ }
279
+ else {
280
+ interactionState.flyVelocity = NaN;
281
+ }
282
+ return needsViewUpdate;
283
+ };
284
+ var touchstart = function () {
285
+ };
286
+ var ensureCanvasResolution = function (canvas, _a, newCanvasWidth, newCanvasHeight) {
287
+ var outerWidth = _a.outerWidth, outerHeight = _a.outerHeight;
288
+ if (newCanvasWidth !== outerWidth) {
289
+ canvas.setAttribute('width', String(newCanvasWidth));
290
+ }
291
+ if (newCanvasHeight !== outerHeight) {
292
+ canvas.setAttribute('height', String(newCanvasHeight));
293
+ }
294
+ };
295
+ var withAnimation = function (renderer) {
296
+ var rAF = -1;
297
+ return function () {
298
+ window.cancelAnimationFrame(rAF);
299
+ rAF = window.requestAnimationFrame(renderer);
362
300
  };
363
- var pan = function (normalizedDeltaPan) {
364
- var deltaPan = normalizedDeltaPan / Math.pow(2, interactionState.zoom);
365
- interactionState.pan = (0, math_1.unitClamp)(interactionState.pan + deltaPan) || 0;
301
+ };
302
+ var withDeltaTime = function (renderer) {
303
+ var prevT = 0;
304
+ return function (t) {
305
+ var deltaT = t - prevT;
306
+ prevT = t;
307
+ renderer(deltaT);
366
308
  };
367
- var dragVelocityAttenuation = 0.92;
368
- var wheelPanVelocityDivisor = 1000;
369
- var wheelZoomVelocityDivisor = 250;
370
- var keyZoomVelocityDivisor = 2;
371
- var keyPanVelocityDivisor = 10;
309
+ };
310
+ var doCartesian = function (ctx, cartesianHeight, interactionState, deltaT, cartesianWidth, timeDomain, dataState, emWidth) {
311
+ ctx.save();
312
+ ctx.translate(0, cartesianHeight);
313
+ var domainLandmarks = __spreadArray([
314
+ dataState.dataResponse.stats.minValue,
315
+ dataState.dataResponse.stats.maxValue
316
+ ], __read((ZERO_Y_BASE ? [0] : [])), false);
317
+ var desiredTickCount = (0, scale_1.getDesiredTickCount)(cartesianHeight, config.smallFontSize, config.sparse);
318
+ var _a = (0, axis_model_1.axisModel)(domainLandmarks, desiredTickCount), niceDomainMin = _a.niceDomainMin, niceDomainMax = _a.niceDomainMax, niceTicks = _a.niceTicks;
319
+ var yTweenOngoing = (0, domain_tween_1.domainTween)(interactionState, deltaT, niceDomainMin, niceDomainMax);
320
+ var yUnitScale = (0, scale_1.axisScale)(interactionState.niceDomainMin, interactionState.niceDomainMax);
321
+ var yUnitScaleClamped = function (d) { return (0, math_1.unitClamp)(yUnitScale(d)); };
322
+ var dataDemand = (0, cartesian_1.renderCartesian)(ctx, config, dataState, defaultMinorTickLabelFormat, emWidth, fadeOutPixelWidth, defaultLabelFormat, yTickNumberFormatter, rasterSelector, cartesianWidth, cartesianHeight, timeDomain, yUnitScale, yUnitScaleClamped, niceTicks);
323
+ ctx.restore();
324
+ return { yTweenOngoing: yTweenOngoing, dataDemand: dataDemand };
325
+ };
326
+ var renderChartWithTime = function (ctx, backgroundFillStyle, newCanvasWidth, newCanvasHeight, config, chartWidth, cartesianTop, cartesianLeft, cartesianHeight, interactionState, deltaT, cartesianWidth, drawCartesianBox, chartTopFontSize, dataState, emWidth, dpi, fromSec, toSec) {
327
+ ctx.save();
328
+ ctx.scale(dpi, dpi);
329
+ ctx.fillStyle = backgroundFillStyle;
330
+ ctx.fillRect(0, 0, newCanvasWidth, newCanvasHeight);
331
+ (0, chart_title_1.renderChartTitle)(ctx, config.subduedFontColor, chartWidth, cartesianTop);
332
+ ctx.translate(cartesianLeft, cartesianTop);
333
+ var timeDomain = getTimeDomain(interactionState, fromSec, toSec);
334
+ var _a = doCartesian(ctx, cartesianHeight, interactionState, deltaT, cartesianWidth, timeDomain, dataState, emWidth), yTweenOngoing = _a.yTweenOngoing, dataDemand = _a.dataDemand;
335
+ if (drawCartesianBox) {
336
+ (0, debug_box_1.renderDebugBox)(ctx, cartesianWidth, cartesianHeight);
337
+ }
338
+ (0, time_unit_1.renderTimeUnitAnnotation)(ctx, config, dataDemand.binUnitCount, dataDemand.binUnit, chartTopFontSize, dataDemand.unitBarMaxWidthPixels);
339
+ (0, time_extent_1.renderTimeExtentAnnotation)(ctx, config, localeOptions, timeDomain, cartesianWidth, chartTopFontSize);
340
+ ctx.restore();
341
+ return { yTweenOngoing: yTweenOngoing, dataDemand: dataDemand };
342
+ };
343
+ var chartWithTime = function (canvas, ctx, config, interactionState, dataState, deltaT, dpi, emWidth) {
344
+ var newScreenDimensions = (0, dom_1.elementSizes)(canvas, horizontalCartesianAreaPad, verticalCartesianAreaPad);
345
+ var chartWidth = newScreenDimensions.outerWidth, chartHeight = newScreenDimensions.outerHeight, cartesianLeft = newScreenDimensions.innerLeft, cartesianWidth = newScreenDimensions.innerWidth, cartesianTop = newScreenDimensions.innerTop, cartesianHeight = newScreenDimensions.innerHeight;
346
+ var newCanvasWidth = dpi * chartWidth;
347
+ var newCanvasHeight = dpi * chartHeight;
348
+ ensureCanvasResolution(canvas, interactionState.screenDimensions, newCanvasWidth, newCanvasHeight);
349
+ interactionState.screenDimensions = newScreenDimensions;
350
+ var _a = renderChartWithTime(ctx, backgroundFillStyle, newCanvasWidth, newCanvasHeight, config, chartWidth, cartesianTop, cartesianLeft, cartesianHeight, interactionState, deltaT, cartesianWidth, drawCartesianBox, chartTopFontSize, dataState, emWidth, dpi, config.domainFrom, config.domainTo), yTweenOngoing = _a.yTweenOngoing, dataDemand = _a.dataDemand;
351
+ var dataArrived = !dataState.pending &&
352
+ invalid(dataState, dataDemand) &&
353
+ dataDemand.lo &&
354
+ dataDemand.hi &&
355
+ dataDemand.binUnit &&
356
+ dataDemand.binUnitCount;
357
+ if (dataArrived) {
358
+ dataState.pending = true;
359
+ }
360
+ return { dataArrived: dataArrived, yTweenOngoing: yTweenOngoing, dataDemand: dataDemand };
361
+ };
362
+ var getNullInteractionState = function (canvas) { return ({
363
+ zoom: initialZoom,
364
+ pan: initialPan,
365
+ multitouch: [],
366
+ dragStartX: NaN,
367
+ zoomStart: NaN,
368
+ panStart: NaN,
369
+ lastDragX: NaN,
370
+ dragVelocity: NaN,
371
+ flyVelocity: NaN,
372
+ niceDomainMin: NaN,
373
+ niceDomainMax: NaN,
374
+ screenDimensions: (0, dom_1.elementSizes)(canvas, horizontalCartesianAreaPad, verticalCartesianAreaPad),
375
+ }); };
376
+ var getNullDataState = function () { return ({
377
+ valid: false,
378
+ pending: false,
379
+ lo: { timePointSec: Infinity, nextTimePointSec: Infinity },
380
+ hi: { timePointSec: -Infinity, nextTimePointSec: -Infinity },
381
+ binUnit: 'year',
382
+ binUnitCount: NaN,
383
+ dataResponse: { stats: { minValue: NaN, maxValue: NaN }, rows: [] },
384
+ }); };
385
+ var setupEventHandlers = function (canvas, interactionState, timedRender, scheduleChartRender) {
372
386
  var wheel = function (e) {
373
- if (!inCartesianBand(e))
387
+ if (!inCartesianBand(interactionState.screenDimensions, (0, dom_1.zoomSafePointerY)(e)))
374
388
  return;
375
- if (e.metaKey) {
376
- pan(-e.deltaY / wheelPanVelocityDivisor);
377
- }
378
- else {
379
- var centerX = (0, dom_1.zoomSafePointerX)(e);
380
- var newZoom = interactionState.zoom - e.deltaY / wheelZoomVelocityDivisor;
381
- zoomAroundX(centerX, newZoom);
382
- }
389
+ zoomOrPan(interactionState, e.metaKey, (0, dom_1.zoomSafePointerX)(e), e.deltaY);
383
390
  scheduleChartRender();
384
391
  };
385
- var dragStartAtX = function (startingX) {
386
- interactionState.dragStartX = startingX;
387
- interactionState.lastDragX = startingX;
388
- interactionState.dragVelocity = NaN;
389
- interactionState.flyVelocity = NaN;
390
- interactionState.panStart = interactionState.pan;
391
- };
392
- var dragStart = function (e) { return dragStartAtX((0, dom_1.zoomSafePointerX)(e)); };
393
- var kineticDragHandler = function (t) {
394
- var velocity = interactionState.flyVelocity;
395
- if (Math.abs(velocity) > 0.01) {
396
- panFromDeltaPixel(interactionState.pan, velocity);
397
- interactionState.flyVelocity *= dragVelocityAttenuation;
392
+ var dragStart = function (e) { return dragStartAtX(interactionState, (0, dom_1.zoomSafePointerX)(e)); };
393
+ var kineticDragFlywheel = function (t) {
394
+ var needsRerender = kineticFlywheel(interactionState);
395
+ if (needsRerender) {
398
396
  timedRender(t);
399
- window.requestAnimationFrame(kineticDragHandler);
400
- }
401
- else {
402
- interactionState.flyVelocity = NaN;
397
+ window.requestAnimationFrame(kineticDragFlywheel);
403
398
  }
404
399
  };
405
400
  var dragEnd = function () {
406
- interactionState.flyVelocity = interactionState.dragVelocity;
407
- interactionState.dragVelocity = NaN;
408
- interactionState.dragStartX = NaN;
409
- interactionState.panStart = NaN;
410
- window.requestAnimationFrame(kineticDragHandler);
411
- };
412
- var panFromX = function (currentX) {
413
- var deltaX = currentX - interactionState.lastDragX;
414
- var dragVelocity = interactionState.dragVelocity;
415
- interactionState.dragVelocity =
416
- deltaX * dragVelocity > 0 && Math.abs(deltaX) < Math.abs(dragVelocity)
417
- ? dragVelocity
418
- : deltaX;
419
- interactionState.lastDragX = currentX;
420
- var delta = currentX - interactionState.dragStartX;
421
- panFromDeltaPixel(interactionState.panStart, delta);
422
- return delta;
401
+ endDrag(interactionState);
402
+ window.requestAnimationFrame(kineticDragFlywheel);
423
403
  };
424
- var touchMidpoint = function (multitouch) { return (multitouch[0].x + multitouch[1].x) / 2; };
425
404
  var touchmove = function (e) {
426
- var _a;
427
- var multitouch = __spreadArray([], __read(((_a = e.touches) !== null && _a !== void 0 ? _a : [])), false).map(function (t) { return ({
428
- id: t.identifier,
429
- x: (0, dom_1.zoomSafePointerX)(t),
430
- }); })
431
- .sort(function (_a, _b) {
432
- var a = _a.x;
433
- var b = _b.x;
434
- return a - b;
435
- });
436
- if (interactionState.multitouch.length === 0 && multitouch.length === 2) {
437
- interactionState.multitouch = multitouch;
438
- interactionState.zoomStart = interactionState.zoom;
439
- var centerX = touchMidpoint(multitouch);
440
- dragStartAtX(centerX);
441
- }
442
- else if (multitouch.length !== 2 ||
443
- __spreadArray(__spreadArray([], __read(multitouch), false), __read(interactionState.multitouch), false).filter(function (t, i, a) { return a.findIndex(function (tt) { return tt.id === t.id; }) === i; })
444
- .length !== 2) {
445
- interactionState.multitouch = [];
446
- interactionState.zoomStart = NaN;
447
- }
448
- if (interactionState.multitouch.length === 2) {
449
- var centerX = touchMidpoint(multitouch);
450
- var zoomMultiplier_1 = (multitouch[1].x - multitouch[0].x) / (interactionState.multitouch[1].x - interactionState.multitouch[0].x);
451
- var panDelta = 0;
452
- zoomAroundX(centerX, interactionState.zoomStart + Math.log2(zoomMultiplier_1), panDelta);
405
+ var shouldUpdate = touchUpdate(interactionState, touches(e));
406
+ if (shouldUpdate)
453
407
  scheduleChartRender();
454
- }
455
- else if (inCartesianArea(e) || Number.isFinite(interactionState.panStart)) {
456
- if (!panOngoing(interactionState)) {
457
- dragStart(e);
408
+ };
409
+ var mousemove = function (e) {
410
+ if (e.buttons !== 1)
411
+ return;
412
+ interactionState.multitouch = [];
413
+ interactionState.zoomStart = NaN;
414
+ if (inCartesianArea(interactionState.screenDimensions, e) || Number.isFinite(interactionState.panStart)) {
415
+ if (panOngoing(interactionState)) {
416
+ panFromX(interactionState, (0, dom_1.zoomSafePointerX)(e));
417
+ scheduleChartRender();
458
418
  }
459
419
  else {
460
- var currentX = (0, dom_1.zoomSafePointerX)(e);
461
- panFromX(currentX);
462
- scheduleChartRender();
420
+ dragStart(e);
463
421
  }
464
422
  }
465
423
  };
466
- var touchstart = function (e) { return inCartesianArea(e) && dragStart(e); };
467
- var touchend = dragEnd;
468
- var mousedown = touchstart;
469
- var mousemove = function (e) { return e.buttons === 1 && touchmove(e); };
470
- var mouseup = touchend;
471
- var touchcancel = touchend;
472
- var chartKeydown = function (e) {
473
- var panDirection = { ArrowLeft: -1, ArrowRight: 1 }[e.code];
474
- var zoomDirection = { ArrowUp: -1, ArrowDown: 1 }[e.code];
475
- if (panDirection || zoomDirection) {
476
- if (panDirection)
477
- pan(panDirection / keyPanVelocityDivisor);
478
- if (zoomDirection)
479
- zoom(0.5, interactionState.zoom + zoomDirection / keyZoomVelocityDivisor);
424
+ var mousedown = function (e) { return inCartesianArea(interactionState.screenDimensions, e) && dragStart(e); };
425
+ var keydown = function (e) {
426
+ var _a, _b;
427
+ var panDirection = (_a = { ArrowLeft: -1, ArrowRight: 1 }[e.code]) !== null && _a !== void 0 ? _a : 0;
428
+ var zoomDirection = (_b = { ArrowUp: -1, ArrowDown: 1 }[e.code]) !== null && _b !== void 0 ? _b : 0;
429
+ if (panZoomJump(interactionState, panDirection, zoomDirection)) {
480
430
  e.preventDefault();
481
431
  scheduleChartRender();
482
432
  }
483
433
  };
484
- var resize = function () { return fullRender(); };
485
- var eventHandlersForWindow = { resize: resize };
486
- var eventHandlersForCanvas = {
487
- wheel: wheel,
488
- mousemove: mousemove,
489
- mousedown: mousedown,
490
- mouseup: mouseup,
491
- touchmove: touchmove,
492
- touchstart: touchstart,
493
- touchend: touchend,
494
- touchcancel: touchcancel,
495
- keydown: chartKeydown,
434
+ window.addEventListener('resize', scheduleChartRender, { passive: false });
435
+ canvas.addEventListener('wheel', wheel, { passive: false });
436
+ canvas.addEventListener('mousemove', mousemove, { passive: false });
437
+ canvas.addEventListener('mousedown', mousedown, { passive: false });
438
+ canvas.addEventListener('mouseup', dragEnd, { passive: false });
439
+ canvas.addEventListener('touchmove', touchmove, { passive: false });
440
+ canvas.addEventListener('touchstart', touchstart, { passive: false });
441
+ canvas.addEventListener('touchend', dragEnd, { passive: false });
442
+ canvas.addEventListener('touchcancel', dragEnd, { passive: false });
443
+ canvas.addEventListener('keydown', keydown, { passive: false });
444
+ };
445
+ var timeslipRender = function (canvas, ctx, getData) {
446
+ var dpi = window.devicePixelRatio;
447
+ var emWidth = ctx.measureText('mmmmmmmmmm').width / 10;
448
+ var interactionState = getNullInteractionState(canvas);
449
+ var dataState = getNullDataState();
450
+ var chartWithUpdate = function (t) {
451
+ var _a = chartWithTime(canvas, ctx, config, interactionState, dataState, t, dpi, emWidth), dataArrived = _a.dataArrived, yTweenOngoing = _a.yTweenOngoing, dataDemand = _a.dataDemand;
452
+ if (dataArrived)
453
+ updateDataState(dataState, dataDemand, (0, data_1.getEnrichedData)(getData(dataDemand)));
454
+ if (dataArrived || yTweenOngoing)
455
+ scheduleChartRender();
496
456
  };
497
- var eventHandlersForData = { dataArrived: dataArrived };
498
- var eventHandlers = new Map([
499
- [window, eventHandlersForWindow],
500
- [canvas, eventHandlersForCanvas],
501
- [data_1.dataSource, eventHandlersForData],
502
- ]);
503
- function handleEvents() {
504
- var e, handler;
505
- return __generator(this, function (_a) {
506
- switch (_a.label) {
507
- case 0: return [4];
508
- case 1:
509
- e = _a.sent();
510
- handler = eventHandlers.get(e.target)[e.type];
511
- if (handler)
512
- handler(e);
513
- _a.label = 2;
514
- case 2: return [3, 0];
515
- case 3: return [2];
516
- }
517
- });
518
- }
519
- (0, generator_1.observe)(window, processAction, eventHandlersForWindow);
520
- (0, generator_1.observe)(canvas, processAction, eventHandlersForCanvas);
457
+ var timedRender = withDeltaTime(chartWithUpdate);
458
+ var scheduleChartRender = withAnimation(timedRender);
459
+ scheduleChartRender();
460
+ setupEventHandlers(canvas, interactionState, timedRender, scheduleChartRender);
521
461
  };
522
462
  exports.timeslipRender = timeslipRender;
523
463
  //# sourceMappingURL=timeslip_render.js.map