kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
125 lines (108 loc) • 14.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _reactVis = require("react-vis");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _dataUtils = require("../../utils/data-utils");
var _templateObject, _templateObject2;
var LineChartWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .rv-xy-plot {\n /* important for rendering hint */\n position: relative;\n }\n .rv-xy-plot__inner {\n /* important to show axis */\n overflow: visible;\n }\n\n .rv-xy-plot__grid-lines__line {\n stroke: ", ";\n stroke-dasharray: 1px 4px;\n }\n\n .rv-xy-plot__axis__tick__text {\n font-size: 9px;\n fill: ", ";\n }\n"])), function (props) {
return props.theme.histogramFillOutRange;
}, function (props) {
return props.theme.textColor;
});
var StyledHint = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: #d3d8e0;\n border-radius: 2px;\n color: ", ";\n font-size: 9px;\n margin: 4px;\n padding: 3px 6px;\n pointer-events: none;\n user-select: none;\n"])), function (props) {
return props.theme.textColorLT;
});
var HintContent = function HintContent(_ref) {
var x = _ref.x,
y = _ref.y,
format = _ref.format;
return /*#__PURE__*/_react["default"].createElement(StyledHint, null, /*#__PURE__*/_react["default"].createElement("div", {
className: "hint--x"
}, format(x)), /*#__PURE__*/_react["default"].createElement("div", {
className: "row"
}, y));
};
var MARGIN = {
top: 0,
bottom: 0,
left: 0,
right: 0
};
function LineChartFactory() {
var LineChart = function LineChart(_ref2) {
var brushComponent = _ref2.brushComponent,
brushing = _ref2.brushing,
color = _ref2.color,
enableChartHover = _ref2.enableChartHover,
height = _ref2.height,
hoveredDP = _ref2.hoveredDP,
isEnlarged = _ref2.isEnlarged,
lineChart = _ref2.lineChart,
margin = _ref2.margin,
onMouseMove = _ref2.onMouseMove,
width = _ref2.width,
timezone = _ref2.timezone,
timeFormat = _ref2.timeFormat;
var series = lineChart.series,
yDomain = lineChart.yDomain;
var brushData = (0, _react.useMemo)(function () {
return [{
x: series[0].x,
y: yDomain[1],
customComponent: function customComponent() {
return brushComponent;
}
}];
}, [series, yDomain, brushComponent]);
var hintFormatter = (0, _react.useMemo)(function () {
return (0, _dataUtils.datetimeFormatter)(timezone)(timeFormat);
}, [timezone, timeFormat]);
return /*#__PURE__*/_react["default"].createElement(LineChartWrapper, {
style: {
marginTop: "".concat(margin.top, "px")
}
}, /*#__PURE__*/_react["default"].createElement(_reactVis.XYPlot, {
xType: "time",
width: width,
height: height,
margin: MARGIN,
onMouseLeave: function onMouseLeave() {
onMouseMove(null);
}
}, /*#__PURE__*/_react["default"].createElement(_reactVis.HorizontalGridLines, {
tickTotal: 3
}), /*#__PURE__*/_react["default"].createElement(_reactVis.LineSeries, {
style: {
fill: 'none'
},
strokeWidth: 2,
color: color,
data: series,
onNearestX: enableChartHover ? onMouseMove : null
}), /*#__PURE__*/_react["default"].createElement(_reactVis.MarkSeries, {
data: hoveredDP ? [hoveredDP] : [],
color: color,
size: 3
}), /*#__PURE__*/_react["default"].createElement(_reactVis.CustomSVGSeries, {
data: brushData
}), isEnlarged && /*#__PURE__*/_react["default"].createElement(_reactVis.YAxis, {
tickTotal: 3
}), hoveredDP && enableChartHover && !brushing ? /*#__PURE__*/_react["default"].createElement(_reactVis.Hint, {
value: hoveredDP
}, /*#__PURE__*/_react["default"].createElement(HintContent, (0, _extends2["default"])({}, hoveredDP, {
format: hintFormatter
}))) : null));
};
return LineChart;
}
var _default = LineChartFactory;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9saW5lLWNoYXJ0LmpzIl0sIm5hbWVzIjpbIkxpbmVDaGFydFdyYXBwZXIiLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsInRoZW1lIiwiaGlzdG9ncmFtRmlsbE91dFJhbmdlIiwidGV4dENvbG9yIiwiU3R5bGVkSGludCIsInRleHRDb2xvckxUIiwiSGludENvbnRlbnQiLCJ4IiwieSIsImZvcm1hdCIsIk1BUkdJTiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIkxpbmVDaGFydEZhY3RvcnkiLCJMaW5lQ2hhcnQiLCJicnVzaENvbXBvbmVudCIsImJydXNoaW5nIiwiY29sb3IiLCJlbmFibGVDaGFydEhvdmVyIiwiaGVpZ2h0IiwiaG92ZXJlZERQIiwiaXNFbmxhcmdlZCIsImxpbmVDaGFydCIsIm1hcmdpbiIsIm9uTW91c2VNb3ZlIiwid2lkdGgiLCJ0aW1lem9uZSIsInRpbWVGb3JtYXQiLCJzZXJpZXMiLCJ5RG9tYWluIiwiYnJ1c2hEYXRhIiwiY3VzdG9tQ29tcG9uZW50IiwiaGludEZvcm1hdHRlciIsIm1hcmdpblRvcCIsImZpbGwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFTQTs7QUFDQTs7OztBQUVBLElBQU1BLGdCQUFnQixHQUFHQyw2QkFBT0MsR0FBVixvYkFXUixVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLHFCQUFoQjtBQUFBLENBWEcsRUFpQlYsVUFBQUYsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZRSxTQUFoQjtBQUFBLENBakJLLENBQXRCOztBQXFCQSxJQUFNQyxVQUFVLEdBQUdOLDZCQUFPQyxHQUFWLHVRQUdMLFVBQUFDLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUksV0FBaEI7QUFBQSxDQUhBLENBQWhCOztBQVdBLElBQU1DLFdBQVcsR0FBRyxTQUFk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aUI7QUFML0MsTUFWRixlQWlCRSxnQ0FBQyxvQkFBRDtBQUFZLE1BQUEsSUFBSSxFQUFFSixTQUFTLEdBQUcsQ0FBQ0EsU0FBRCxDQUFILEdBQWlCLEVBQTVDO0FBQWdELE1BQUEsS0FBSyxFQUFFSCxLQUF2RDtBQUE4RCxNQUFBLElBQUksRUFBRTtBQUFwRSxNQWpCRixlQWtCRSxnQ0FBQyx5QkFBRDtBQUFpQixNQUFBLElBQUksRUFBRWE7QUFBdkIsTUFsQkYsRUFtQkdULFVBQVUsaUJBQUksZ0NBQUMsZUFBRDtBQUFPLE1BQUEsU0FBUyxFQUFFO0FBQWxCLE1BbkJqQixFQW9CR0QsU0FBUyxJQUFJRixnQkFBYixJQUFpQyxDQUFDRixRQUFsQyxnQkFDQyxnQ0FBQyxjQUFEO0FBQU0sTUFBQSxLQUFLLEVBQUVJO0FBQWIsb0JBQ0UsZ0NBQUMsV0FBRCxnQ0FBaUJBLFNBQWpCO0FBQTRCLE1BQUEsTUFBTSxFQUFFWTtBQUFwQyxPQURGLENBREQsR0FJRyxJQXhCTixDQURGLENBREY7QUE4QkQsR0F2REQ7O0FBd0RBLFNBQU9sQixTQUFQO0FBQ0Q7O2VBRWNELGdCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIxIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7dXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgSG9yaXpvbnRhbEdyaWRMaW5lcyxcbiAgTGluZVNlcmllcyxcbiAgWFlQbG90LFxuICBDdXN0b21TVkdTZXJpZXMsXG4gIEhpbnQsXG4gIFlBeGlzLFxuICBNYXJrU2VyaWVzXG59IGZyb20gJ3JlYWN0LXZpcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7ZGF0ZXRpbWVGb3JtYXR0ZXJ9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuXG5jb25zdCBMaW5lQ2hhcnRXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgLnJ2LXh5LXBsb3Qge1xuICAgIC8qIGltcG9ydGFudCBmb3IgcmVuZGVyaW5nIGhpbnQgKi9cbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cbiAgLnJ2LXh5LXBsb3RfX2lubmVyIHtcbiAgICAvKiBpbXBvcnRhbnQgdG8gc2hvdyBheGlzICovXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIH1cblxuICAucnYteHktcGxvdF9fZ3JpZC1saW5lc19fbGluZSB7XG4gICAgc3Ryb2tlOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmhpc3RvZ3JhbUZpbGxPdXRSYW5nZX07XG4gICAgc3Ryb2tlLWRhc2hhcnJheTogMXB4IDRweDtcbiAgfVxuXG4gIC5ydi14eS1wbG90X19heGlzX190aWNrX190ZXh0IHtcbiAgICBmb250LXNpemU6IDlweDtcbiAgICBmaWxsOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZEhpbnQgPSBzdHlsZWQuZGl2YFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDNkOGUwO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckxUfTtcbiAgZm9udC1zaXplOiA5cHg7XG4gIG1hcmdpbjogNHB4O1xuICBwYWRkaW5nOiAzcHggNnB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG5gO1xuXG5jb25zdCBIaW50Q29udGVudCA9ICh7eCwgeSwgZm9ybWF0fSkgPT4gKFxuICA8U3R5bGVkSGludD5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cImhpbnQtLXhcIj57Zm9ybWF0KHgpfTwvZGl2PlxuICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+e3l9PC9kaXY+XG4gIDwvU3R5bGVkSGludD5cbik7XG5cbmNvbnN0IE1BUkdJTiA9IHt0b3A6IDAsIGJvdHRvbTogMCwgbGVmdDogMCwgcmlnaHQ6IDB9O1xuZnVuY3Rpb24gTGluZUNoYXJ0RmFjdG9yeSgpIHtcbiAgY29uc3QgTGluZUNoYXJ0ID0gKHtcbiAgICBicnVzaENvbXBvbmVudCxcbiAgICBicnVzaGluZyxcbiAgICBjb2xvcixcbiAgICBlbmFibGVDaGFydEhvdmVyLFxuICAgIGhlaWdodCxcbiAgICBob3ZlcmVkRFAsXG4gICAgaXNFbmxhcmdlZCxcbiAgICBsaW5lQ2hhcnQsXG4gICAgbWFyZ2luLFxuICAgIG9uTW91c2VNb3ZlLFxuICAgIHdpZHRoLFxuICAgIHRpbWV6b25lLFxuICAgIHRpbWVGb3JtYXRcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHtzZXJpZXMsIHlEb21haW59ID0gbGluZUNoYXJ0O1xuXG4gICAgY29uc3QgYnJ1c2hEYXRhID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICByZXR1cm4gW3t4OiBzZXJpZXNbMF0ueCwgeTogeURvbWFpblsxXSwgY3VzdG9tQ29tcG9uZW50OiAoKSA9PiBicnVzaENvbXBvbmVudH1dO1xuICAgIH0sIFtzZXJpZXMsIHlEb21haW4sIGJydXNoQ29tcG9uZW50XSk7XG4gICAgY29uc3QgaGludEZvcm1hdHRlciA9IHVzZU1lbW8oKCkgPT4gZGF0ZXRpbWVGb3JtYXR0ZXIodGltZXpvbmUpKHRpbWVGb3JtYXQpLCBbXG4gICAgICB0aW1lem9uZSxcbiAgICAgIHRpbWVGb3JtYXRcbiAgICBdKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8TGluZUNoYXJ0V3JhcHBlciBzdHlsZT17e21hcmdpblRvcDogYCR7bWFyZ2luLnRvcH1weGB9fT5cbiAgICAgICAgPFhZUGxvdFxuICAgICAgICAgIHhUeXBlPVwidGltZVwiXG4gICAgICAgICAgd2lkdGg9e3dpZHRofVxuICAgICAgICAgIGhlaWdodD17aGVpZ2h0fVxuICAgICAgICAgIG1hcmdpbj17TUFSR0lOfVxuICAgICAgICAgIG9uTW91c2VMZWF2ZT17KCkgPT4ge1xuICAgICAgICAgICAgb25Nb3VzZU1vdmUobnVsbCk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxIb3Jpem9udGFsR3JpZExpbmVzIHRpY2tUb3RhbD17M30gLz5cbiAgICAgICAgICA8TGluZVNlcmllc1xuICAgICAgICAgICAgc3R5bGU9e3tmaWxsOiAnbm9uZSd9fVxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezJ9XG4gICAgICAgICAgICBjb2xvcj17Y29sb3J9XG4gICAgICAgICAgICBkYXRhPXtzZXJpZXN9XG4gICAgICAgICAgICBvbk5lYXJlc3RYPXtlbmFibGVDaGFydEhvdmVyID8gb25Nb3VzZU1vdmUgOiBudWxsfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPE1hcmtTZXJpZXMgZGF0YT17aG92ZXJlZERQID8gW2hvdmVyZWREUF0gOiBbXX0gY29sb3I9e2NvbG9yfSBzaXplPXszfSAvPlxuICAgICAgICAgIDxDdXN0b21TVkdTZXJpZXMgZGF0YT17YnJ1c2hEYXRhfSAvPlxuICAgICAgICAgIHtpc0VubGFyZ2VkICYmIDxZQXhpcyB0aWNrVG90YWw9ezN9IC8+fVxuICAgICAgICAgIHtob3ZlcmVkRFAgJiYgZW5hYmxlQ2hhcnRIb3ZlciAmJiAhYnJ1c2hpbmcgPyAoXG4gICAgICAgICAgICA8SGludCB2YWx1ZT17aG92ZXJlZERQfT5cbiAgICAgICAgICAgICAgPEhpbnRDb250ZW50IHsuLi5ob3ZlcmVkRFB9IGZvcm1hdD17aGludEZvcm1hdHRlcn0gLz5cbiAgICAgICAgICAgIDwvSGludD5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9YWVBsb3Q+XG4gICAgICA8L0xpbmVDaGFydFdyYXBwZXI+XG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIExpbmVDaGFydDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTGluZUNoYXJ0RmFjdG9yeTtcbiJdfQ==