kepler.gl 3.2.0 → 3.2.2

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 (96) hide show
  1. package/dist/src/ai-assistant/src/config/models.d.ts +8 -0
  2. package/dist/src/components/src/side-panel/layer-panel/vector-tile-layer-configurator.d.ts +3 -2
  3. package/dist/src/localization/src/translations/en.d.ts +1 -0
  4. package/dist/src/utils/src/arrow-data-container.d.ts +3 -2
  5. package/dist/src/utils/src/data-container-utils.d.ts +2 -0
  6. package/package.json +2 -2
  7. package/src/actions/package.json +8 -8
  8. package/src/ai-assistant/dist/components/ai-assistant-config.js +40 -24
  9. package/src/ai-assistant/dist/config/models.d.ts +8 -0
  10. package/src/ai-assistant/dist/config/models.js +16 -8
  11. package/src/ai-assistant/dist/localization.js +7 -7
  12. package/src/ai-assistant/dist/reducers/index.js +3 -2
  13. package/src/ai-assistant/package.json +16 -16
  14. package/src/ai-assistant/src/components/ai-assistant-config.tsx +39 -28
  15. package/src/ai-assistant/src/config/models.ts +37 -25
  16. package/src/ai-assistant/src/localization.ts +6 -6
  17. package/src/ai-assistant/src/reducers/index.ts +2 -1
  18. package/src/cloud-providers/package.json +2 -2
  19. package/src/common-utils/package.json +3 -3
  20. package/src/components/dist/common/color-legend.js +8 -8
  21. package/src/components/dist/common/data-table/index.js +13 -9
  22. package/src/components/dist/map/map-legend-panel.js +10 -4
  23. package/src/components/dist/map/map-legend.js +2 -2
  24. package/src/components/dist/plot-container.js +4 -2
  25. package/src/components/dist/side-panel/interaction-panel/interaction-panel.js +2 -2
  26. package/src/components/dist/side-panel/layer-panel/color-breaks-panel.js +11 -2
  27. package/src/components/dist/side-panel/layer-panel/color-scale-selector.js +65 -12
  28. package/src/components/dist/side-panel/layer-panel/custom-palette.js +18 -7
  29. package/src/components/dist/side-panel/layer-panel/vector-tile-layer-configurator.d.ts +3 -2
  30. package/src/components/dist/side-panel/layer-panel/vector-tile-layer-configurator.js +18 -4
  31. package/src/components/package.json +15 -15
  32. package/src/components/src/common/color-legend.tsx +15 -2
  33. package/src/components/src/common/data-table/index.tsx +1 -1
  34. package/src/components/src/map/map-legend-panel.tsx +21 -2
  35. package/src/components/src/map/map-legend.tsx +1 -1
  36. package/src/components/src/plot-container.tsx +2 -1
  37. package/src/components/src/side-panel/interaction-panel/interaction-panel.tsx +1 -0
  38. package/src/components/src/side-panel/layer-panel/color-breaks-panel.tsx +14 -3
  39. package/src/components/src/side-panel/layer-panel/color-scale-selector.tsx +62 -8
  40. package/src/components/src/side-panel/layer-panel/custom-palette.tsx +11 -5
  41. package/src/components/src/side-panel/layer-panel/vector-tile-layer-configurator.tsx +19 -2
  42. package/src/constants/dist/default-settings.js +1 -1
  43. package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/1b/11/43d4199b6142de0b88c672f2b036c5aa4ca836cf35977bbafcdb1962b91e94f8336655a57f0742571ceb13fc69ef4ba0e3cb91dc9a8d61ef041c6eb15e7a +1 -0
  44. package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/b3/bd/e4f91c7af9e320b979e29ad3b9e3a4dfcd61e4a09d6e4579104c40dcace7651b443fdd6d7ff5d947ed6c9df2c0bbbcc76a2ea86d6398e4945257eeb80dd5 +1 -0
  45. package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/ac/e2/e903ec95ada0b0075fdcfb6133e2e75c9b3b0504a29ca665704aaed90b2b +2 -0
  46. package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/b4/c5/a43653dff3b380f7b0793080a57c980a9a136764933e79454de0fe43a5ca +2 -0
  47. package/src/constants/package.json +2 -2
  48. package/src/constants/umd/keplergl.min.js +1 -1
  49. package/src/deckgl-arrow-layers/package.json +2 -2
  50. package/src/deckgl-layers/package.json +4 -4
  51. package/src/duckdb/dist/table/duckdb-table-utils.js +3 -2
  52. package/src/duckdb/package.json +6 -6
  53. package/src/duckdb/src/table/duckdb-table-utils.ts +5 -1
  54. package/src/effects/package.json +5 -5
  55. package/src/layers/dist/geojson-layer/geojson-utils.js +23 -5
  56. package/src/layers/dist/icon-layer/icon-layer.js +12 -2
  57. package/src/layers/dist/vector-tile/common-tile/tile-dataset.d.ts +4 -0
  58. package/src/layers/dist/vector-tile/common-tile/tile-dataset.js +10 -1
  59. package/src/layers/dist/vector-tile/vector-tile-layer.d.ts +11 -0
  60. package/src/layers/dist/vector-tile/vector-tile-layer.js +113 -7
  61. package/src/layers/package.json +9 -9
  62. package/src/layers/src/geojson-layer/geojson-utils.ts +22 -0
  63. package/src/layers/src/icon-layer/icon-layer.ts +49 -38
  64. package/src/layers/src/vector-tile/common-tile/tile-dataset.ts +7 -0
  65. package/src/layers/src/vector-tile/vector-tile-layer.ts +110 -6
  66. package/src/localization/dist/translations/en.d.ts +1 -0
  67. package/src/localization/dist/translations/en.js +2 -1
  68. package/src/localization/package.json +1 -1
  69. package/src/localization/src/translations/en.ts +1 -0
  70. package/src/processors/dist/data-processor.js +15 -5
  71. package/src/processors/package.json +7 -7
  72. package/src/processors/src/data-processor.ts +19 -4
  73. package/src/reducers/package.json +16 -16
  74. package/src/schemas/package.json +7 -7
  75. package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/52/82/28cacf6fd462b779c22675964b655bf3a9f3ce9ec3c9b141a401a5bf90cb7d904ac65ab8e484570130b12771af0a0d5bab20e6976cfa773666763e046a6a +1 -0
  76. package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/53/93/f8e389b6450ee0636bf336363d2d6865d8a1fe2445c15cc1e36c651e1ddf448358eb74e894f4bf6fc48ef881dc64cc221c48b133ecf0e02132f2c5fbfe11 +1 -0
  77. package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/2e/45/ed6e0c1beb8bca4698a47b5feda8789a22d96978bc4839949bd26e827454 +2 -0
  78. package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/56/db/b5a812c56b0d1dcdcd33da37e464062a19c8752cb2296603dc72d2c54d31 +2 -0
  79. package/src/styles/package.json +2 -2
  80. package/src/styles/umd/keplergl.min.js +1 -1
  81. package/src/table/dist/dataset-utils.js +18 -7
  82. package/src/table/dist/kepler-table.js +2 -1
  83. package/src/table/package.json +5 -5
  84. package/src/table/src/dataset-utils.ts +7 -2
  85. package/src/table/src/kepler-table.ts +1 -0
  86. package/src/tasks/package.json +2 -2
  87. package/src/types/actions.d.ts +1 -0
  88. package/src/types/package.json +1 -1
  89. package/src/utils/dist/arrow-data-container.d.ts +3 -2
  90. package/src/utils/dist/arrow-data-container.js +3 -3
  91. package/src/utils/dist/data-container-utils.d.ts +2 -0
  92. package/src/utils/dist/data-container-utils.js +3 -2
  93. package/src/utils/package.json +4 -4
  94. package/src/utils/src/arrow-data-container.ts +9 -7
  95. package/src/utils/src/data-container-utils.ts +3 -1
  96. package/umd/keplergl.min.js +1366 -1333
@@ -12,6 +12,7 @@ var _react = _interopRequireDefault(require("react"));
12
12
  var _reactRedux = require("react-redux");
13
13
  var _styledComponents = _interopRequireDefault(require("styled-components"));
14
14
  var _sourceDataSelector = _interopRequireDefault(require("../common/source-data-selector"));
15
+ var _fieldSelector = _interopRequireDefault(require("../../common/field-selector"));
15
16
  var _channelByValueSelector = _interopRequireDefault(require("./channel-by-value-selector"));
16
17
  var _layerConfigGroup = _interopRequireWildcard(require("./layer-config-group"));
17
18
  var _layerColorSelector = require("./layer-color-selector");
@@ -23,8 +24,8 @@ var _templateObject; // SPDX-License-Identifier: MIT
23
24
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
24
25
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
25
26
  var StyledLayerConfigurator = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 12px;\n"])));
26
- VectorTileLayerConfiguratorFactory.deps = [_channelByValueSelector["default"], _layerColorSelector.LayerColorRangeSelectorFactory, _layerColorSelector.LayerColorSelectorFactory, _layerConfigGroup["default"], _visConfigSlider["default"], _visConfigSwitch["default"], _sourceDataSelector["default"]];
27
- function VectorTileLayerConfiguratorFactory(ChannelByValueSelector, LayerColorRangeSelector, LayerColorSelector, LayerConfigGroup, VisConfigSlider, VisConfigSwitch) {
27
+ VectorTileLayerConfiguratorFactory.deps = [_channelByValueSelector["default"], _layerColorSelector.LayerColorRangeSelectorFactory, _layerColorSelector.LayerColorSelectorFactory, _layerConfigGroup["default"], _visConfigSlider["default"], _visConfigSwitch["default"], _sourceDataSelector["default"], _fieldSelector["default"]];
28
+ function VectorTileLayerConfiguratorFactory(ChannelByValueSelector, LayerColorRangeSelector, LayerColorSelector, LayerConfigGroup, VisConfigSlider, VisConfigSwitch, _SourceDataSelector, FieldSelector) {
28
29
  var VectorTileLayerConfigurator = function VectorTileLayerConfigurator(_ref) {
29
30
  var _layer$config$visConf;
30
31
  var layer = _ref.layer,
@@ -77,7 +78,20 @@ function VectorTileLayerConfiguratorFactory(ChannelByValueSelector, LayerColorRa
77
78
  label: false
78
79
  })), /*#__PURE__*/_react["default"].createElement(_layerConfigGroup.ConfigGroupCollapsibleContent, null, layerChannelConfigProps.fields ? /*#__PURE__*/_react["default"].createElement(ChannelByValueSelector, (0, _extends2["default"])({}, layerChannelConfigProps, {
79
80
  channel: layer.visualChannels.radius
80
- })) : null, /*#__PURE__*/_react["default"].createElement(VisConfigSwitch, (0, _extends2["default"])({}, layer.visConfigSettings.radiusUnits, visConfiguratorProps)))));
81
+ })) : null, /*#__PURE__*/_react["default"].createElement(VisConfigSwitch, (0, _extends2["default"])({}, layer.visConfigSettings.radiusUnits, visConfiguratorProps)))), /*#__PURE__*/_react["default"].createElement(LayerConfigGroup, (0, _extends2["default"])({}, visConfiguratorProps, {
82
+ label: "layer.uniqueIdField"
83
+ }), /*#__PURE__*/_react["default"].createElement(FieldSelector, {
84
+ fields: layerChannelConfigProps.fields || [],
85
+ value: layer.config.uniqueIdField || null,
86
+ onSelect: function onSelect(val) {
87
+ var _layerConfiguratorPro;
88
+ return (_layerConfiguratorPro = layerConfiguratorProps.onChange) === null || _layerConfiguratorPro === void 0 ? void 0 : _layerConfiguratorPro.call(layerConfiguratorProps, {
89
+ uniqueIdField: (val === null || val === void 0 ? void 0 : val.name) || null
90
+ });
91
+ },
92
+ placeholder: 'placeholder.selectField',
93
+ erasable: true
94
+ })));
81
95
  };
82
96
  var ConnectedVectorTileLayerConfigurator = (0, _reactRedux.connect)(function (state) {
83
97
  return state;
@@ -85,4 +99,4 @@ function VectorTileLayerConfiguratorFactory(ChannelByValueSelector, LayerColorRa
85
99
  return ConnectedVectorTileLayerConfigurator;
86
100
  }
87
101
  var _default = exports["default"] = VectorTileLayerConfiguratorFactory;
88
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdFJlZHV4IiwiX3N0eWxlZENvbXBvbmVudHMiLCJfc291cmNlRGF0YVNlbGVjdG9yIiwiX2NoYW5uZWxCeVZhbHVlU2VsZWN0b3IiLCJfbGF5ZXJDb25maWdHcm91cCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2xheWVyQ29sb3JTZWxlY3RvciIsIl9yYWRpdXNCeVpvb21JbnB1dCIsIl92aXNDb25maWdTbGlkZXIiLCJfdmlzQ29uZmlnU3dpdGNoIiwiX3RlbXBsYXRlT2JqZWN0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiU3R5bGVkTGF5ZXJDb25maWd1cmF0b3IiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIlZlY3RvclRpbGVMYXllckNvbmZpZ3VyYXRvckZhY3RvcnkiLCJkZXBzIiwiQ2hhbm5lbEJ5VmFsdWVTZWxlY3RvckZhY3RvcnkiLCJMYXllckNvbG9yUmFuZ2VTZWxlY3RvckZhY3RvcnkiLCJMYXllckNvbG9yU2VsZWN0b3JGYWN0b3J5IiwiTGF5ZXJDb25maWdHcm91cEZhY3RvcnkiLCJWaXNDb25maWdTbGlkZXJGYWN0b3J5IiwiVmlzQ29uZmlnU3dpdGNoRmFjdG9yeSIsIlNvdXJjZURhdGFTZWxlY3RvckZhY3RvcnkiLCJDaGFubmVsQnlWYWx1ZVNlbGVjdG9yIiwiTGF5ZXJDb2xvclJhbmdlU2VsZWN0b3IiLCJMYXllckNvbG9yU2VsZWN0b3IiLCJMYXllckNvbmZpZ0dyb3VwIiwiVmlzQ29uZmlnU2xpZGVyIiwiVmlzQ29uZmlnU3dpdGNoIiwiVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yIiwiX3JlZiIsIl9sYXllciRjb25maWckdmlzQ29uZiIsImxheWVyIiwidmlzQ29uZmlndXJhdG9yUHJvcHMiLCJsYXllckNoYW5uZWxDb25maWdQcm9wcyIsImxheWVyQ29uZmlndXJhdG9yUHJvcHMiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwibGFiZWwiLCJmaWVsZHMiLCJjaGFubmVsIiwidmlzdWFsQ2hhbm5lbHMiLCJjb2xvciIsImNvbmZpZyIsImNvbG9yRmllbGQiLCJGcmFnbWVudCIsInZpc0NvbmZpZ1NldHRpbmdzIiwiZHluYW1pY0NvbG9yIiwib3BhY2l0eSIsInN0cm9rZWQiLCJjb2xsYXBzaWJsZSIsInN0cm9rZUNvbG9yIiwic3Ryb2tlQ29sb3JGaWVsZCIsInByb3BlcnR5Iiwic2VsZWN0ZWRDb2xvciIsInZpc0NvbmZpZyIsIkNvbmZpZ0dyb3VwQ29sbGFwc2libGVDb250ZW50Iiwic3Ryb2tlT3BhY2l0eSIsInNpemVGaWVsZCIsInNpemVSYW5nZSIsInN0cm9rZVdpZHRoIiwic2l6ZSIsImVuYWJsZTNkIiwiZWxldmF0aW9uU2NhbGUiLCJoZWlnaHQiLCJkZXNjcmlwdGlvbiIsInJhZGl1c0J5Wm9vbSIsImVuYWJsZWQiLCJvbkNoYW5nZSIsInVuaXQiLCJyYWRpdXMiLCJyYWRpdXNVbml0cyIsIkNvbm5lY3RlZFZlY3RvclRpbGVMYXllckNvbmZpZ3VyYXRvciIsImNvbm5lY3QiLCJzdGF0ZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zaWRlLXBhbmVsL2xheWVyLXBhbmVsL3ZlY3Rvci10aWxlLWxheWVyLWNvbmZpZ3VyYXRvci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7VmVjdG9yVGlsZUxheWVyfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge0tlcGxlclRhYmxlIGFzIEtlcGxlckRhdGFzZXR9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuXG5pbXBvcnQgU291cmNlRGF0YVNlbGVjdG9yRmFjdG9yeSBmcm9tICcuLi9jb21tb24vc291cmNlLWRhdGEtc2VsZWN0b3InO1xuaW1wb3J0IENoYW5uZWxCeVZhbHVlU2VsZWN0b3JGYWN0b3J5IGZyb20gJy4vY2hhbm5lbC1ieS12YWx1ZS1zZWxlY3Rvcic7XG5pbXBvcnQgTGF5ZXJDb25maWdHcm91cEZhY3RvcnksIHtDb25maWdHcm91cENvbGxhcHNpYmxlQ29udGVudH0gZnJvbSAnLi9sYXllci1jb25maWctZ3JvdXAnO1xuaW1wb3J0IHtMYXllckNvbG9yUmFuZ2VTZWxlY3RvckZhY3RvcnksIExheWVyQ29sb3JTZWxlY3RvckZhY3Rvcnl9IGZyb20gJy4vbGF5ZXItY29sb3Itc2VsZWN0b3InO1xuaW1wb3J0IFZpc0NvbmZpZ0J5Wm9vbUlucHV0IGZyb20gJy4vcmFkaXVzLWJ5LXpvb20taW5wdXQnO1xuaW1wb3J0IFZpc0NvbmZpZ1NsaWRlckZhY3RvcnkgZnJvbSAnLi92aXMtY29uZmlnLXNsaWRlcic7XG5pbXBvcnQgVmlzQ29uZmlnU3dpdGNoRmFjdG9yeSBmcm9tICcuL3Zpcy1jb25maWctc3dpdGNoJztcblxuY29uc3QgU3R5bGVkTGF5ZXJDb25maWd1cmF0b3IgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tdG9wOiAxMnB4O1xuYDtcblxudHlwZSBHZXRQcm9wczxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBSZWFjdC5GQzxhbnk+PiA9IFBhcmFtZXRlcnM8UmV0dXJuVHlwZTxUPj5bMF07XG5cbnR5cGUgUHJvcHMgPSB7XG4gIGxheWVyOiBWZWN0b3JUaWxlTGF5ZXI7XG4gIGRhdGFzZXQ/OiBLZXBsZXJEYXRhc2V0O1xuICB2aXNDb25maWd1cmF0b3JQcm9wczogYW55O1xuICBsYXllckNoYW5uZWxDb25maWdQcm9wczogR2V0UHJvcHM8dHlwZW9mIENoYW5uZWxCeVZhbHVlU2VsZWN0b3JGYWN0b3J5PjtcbiAgbGF5ZXJDb25maWd1cmF0b3JQcm9wczogYW55O1xufTtcblxuVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yRmFjdG9yeS5kZXBzID0gW1xuICBDaGFubmVsQnlWYWx1ZVNlbGVjdG9yRmFjdG9yeSxcbiAgTGF5ZXJDb2xvclJhbmdlU2VsZWN0b3JGYWN0b3J5LFxuICBMYXllckNvbG9yU2VsZWN0b3JGYWN0b3J5LFxuICBMYXllckNvbmZpZ0dyb3VwRmFjdG9yeSxcbiAgVmlzQ29uZmlnU2xpZGVyRmFjdG9yeSxcbiAgVmlzQ29uZmlnU3dpdGNoRmFjdG9yeSxcbiAgU291cmNlRGF0YVNlbGVjdG9yRmFjdG9yeVxuXTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yRmFjdG9yeShcbiAgQ2hhbm5lbEJ5VmFsdWVTZWxlY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgQ2hhbm5lbEJ5VmFsdWVTZWxlY3RvckZhY3Rvcnk+LFxuICBMYXllckNvbG9yUmFuZ2VTZWxlY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgTGF5ZXJDb2xvclJhbmdlU2VsZWN0b3JGYWN0b3J5PixcbiAgTGF5ZXJDb2xvclNlbGVjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBMYXllckNvbG9yU2VsZWN0b3JGYWN0b3J5PixcbiAgTGF5ZXJDb25maWdHcm91cDogUmV0dXJuVHlwZTx0eXBlb2YgTGF5ZXJDb25maWdHcm91cEZhY3Rvcnk+LFxuICBWaXNDb25maWdTbGlkZXI6IFJldHVyblR5cGU8dHlwZW9mIFZpc0NvbmZpZ1NsaWRlckZhY3Rvcnk+LFxuICBWaXNDb25maWdTd2l0Y2g6IFJldHVyblR5cGU8dHlwZW9mIFZpc0NvbmZpZ1N3aXRjaEZhY3Rvcnk+XG4pOiBSZWFjdC5GQzxQcm9wcz4ge1xuICBjb25zdCBWZWN0b3JUaWxlTGF5ZXJDb25maWd1cmF0b3IgPSAoe1xuICAgIGxheWVyLFxuICAgIHZpc0NvbmZpZ3VyYXRvclByb3BzLFxuICAgIGxheWVyQ2hhbm5lbENvbmZpZ1Byb3BzLFxuICAgIGxheWVyQ29uZmlndXJhdG9yUHJvcHNcbiAgfTogUHJvcHMpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZExheWVyQ29uZmlndXJhdG9yPlxuICAgICAgICB7LyogRmlsbCBDb2xvciAqL31cbiAgICAgICAgPExheWVyQ29uZmlnR3JvdXAgey4uLnZpc0NvbmZpZ3VyYXRvclByb3BzfSBsYWJlbD1cImxheWVyLmZpbGxDb2xvclwiPlxuICAgICAgICAgIHtsYXllckNoYW5uZWxDb25maWdQcm9wcy5maWVsZHMgPyAoXG4gICAgICAgICAgICA8Q2hhbm5lbEJ5VmFsdWVTZWxlY3RvclxuICAgICAgICAgICAgICB7Li4ubGF5ZXJDaGFubmVsQ29uZmlnUHJvcHN9XG4gICAgICAgICAgICAgIGNoYW5uZWw9e2xheWVyLnZpc3VhbENoYW5uZWxzLmNvbG9yfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICB7bGF5ZXIuY29uZmlnLmNvbG9yRmllbGQgPyAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8VmlzQ29uZmlnU3dpdGNoXG4gICAgICAgICAgICAgICAgey4uLnZpc0NvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAgICAgICAgIHsuLi5sYXllci52aXNDb25maWdTZXR0aW5ncy5keW5hbWljQ29sb3J9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxMYXllckNvbG9yUmFuZ2VTZWxlY3RvclxuICAgICAgICAgICAgICAgIHsuLi52aXNDb25maWd1cmF0b3JQcm9wc31cbiAgICAgICAgICAgICAgICBjaGFubmVsPXtsYXllci52aXN1YWxDaGFubmVscy5jb2xvcn1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8TGF5ZXJDb2xvclNlbGVjdG9yIHsuLi5sYXllckNvbmZpZ3VyYXRvclByb3BzfSAvPlxuICAgICAgICAgICl9XG4gICAgICAgICAgPFZpc0NvbmZpZ1NsaWRlciB7Li4ubGF5ZXIudmlzQ29uZmlnU2V0dGluZ3Mub3BhY2l0eX0gey4uLnZpc0NvbmZpZ3VyYXRvclByb3BzfSAvPlxuICAgICAgICA8L0xheWVyQ29uZmlnR3JvdXA+XG5cbiAgICAgICAgey8qIFN0cm9rZSBjb2xvciAqL31cbiAgICAgICAgPExheWVyQ29uZmlnR3JvdXBcbiAgICAgICAgICB7Li4ubGF5ZXIudmlzQ29uZmlnU2V0dGluZ3Muc3Ryb2tlZH1cbiAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgbGFiZWw9XCJsYXllci5zdHJva2VDb2xvclwiXG4gICAgICAgICAgY29sbGFwc2libGVcbiAgICAgICAgPlxuICAgICAgICAgIDxDaGFubmVsQnlWYWx1ZVNlbGVjdG9yXG4gICAgICAgICAgICB7Li4ubGF5ZXJDaGFubmVsQ29uZmlnUHJvcHN9XG4gICAgICAgICAgICBjaGFubmVsPXtsYXllci52aXN1YWxDaGFubmVscy5zdHJva2VDb2xvcn1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtsYXllci5jb25maWcuc3Ryb2tlQ29sb3JGaWVsZCA/IChcbiAgICAgICAgICAgIDxMYXllckNvbG9yUmFuZ2VTZWxlY3RvclxuICAgICAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgICAgIHByb3BlcnR5PVwic3Ryb2tlQ29sb3JSYW5nZVwiXG4gICAgICAgICAgICAgIGNoYW5uZWw9e2xheWVyLnZpc3VhbENoYW5uZWxzLnN0cm9rZUNvbG9yfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPExheWVyQ29sb3JTZWxlY3RvclxuICAgICAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgICAgIHNlbGVjdGVkQ29sb3I9e2xheWVyLmNvbmZpZy52aXNDb25maWcuc3Ryb2tlQ29sb3J9XG4gICAgICAgICAgICAgIHByb3BlcnR5PVwic3Ryb2tlQ29sb3JcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxDb25maWdHcm91cENvbGxhcHNpYmxlQ29udGVudD5cbiAgICAgICAgICAgIDxWaXNDb25maWdTbGlkZXIgey4uLmxheWVyLnZpc0NvbmZpZ1NldHRpbmdzLnN0cm9rZU9wYWNpdHl9IHsuLi52aXNDb25maWd1cmF0b3JQcm9wc30gLz5cbiAgICAgICAgICA8L0NvbmZpZ0dyb3VwQ29sbGFwc2libGVDb250ZW50PlxuICAgICAgICA8L0xheWVyQ29uZmlnR3JvdXA+XG5cbiAgICAgICAgey8qIFN0cm9rZSBXaWR0aCAqL31cbiAgICAgICAgPExheWVyQ29uZmlnR3JvdXBcbiAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgey4uLmxheWVyLnZpc0NvbmZpZ1NldHRpbmdzLnN0cm9rZWR9XG4gICAgICAgICAgbGFiZWw9XCJsYXllci5zdHJva2VXaWR0aFwiXG4gICAgICAgICAgY29sbGFwc2libGVcbiAgICAgICAgPlxuICAgICAgICAgIHtsYXllci5jb25maWcuc2l6ZUZpZWxkID8gKFxuICAgICAgICAgICAgPFZpc0NvbmZpZ1NsaWRlclxuICAgICAgICAgICAgICB7Li4ubGF5ZXIudmlzQ29uZmlnU2V0dGluZ3Muc2l6ZVJhbmdlfVxuICAgICAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgICAgIGxhYmVsPXtmYWxzZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxWaXNDb25maWdTbGlkZXJcbiAgICAgICAgICAgICAgey4uLmxheWVyLnZpc0NvbmZpZ1NldHRpbmdzLnN0cm9rZVdpZHRofVxuICAgICAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgICAgIGxhYmVsPXtmYWxzZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICA8Q29uZmlnR3JvdXBDb2xsYXBzaWJsZUNvbnRlbnQ+XG4gICAgICAgICAgICA8Q2hhbm5lbEJ5VmFsdWVTZWxlY3RvclxuICAgICAgICAgICAgICB7Li4ubGF5ZXJDaGFubmVsQ29uZmlnUHJvcHN9XG4gICAgICAgICAgICAgIGNoYW5uZWw9e2xheWVyLnZpc3VhbENoYW5uZWxzLnNpemV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvQ29uZmlnR3JvdXBDb2xsYXBzaWJsZUNvbnRlbnQ+XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD5cblxuICAgICAgICB7LyogRWxldmF0aW9uICovfVxuICAgICAgICA8TGF5ZXJDb25maWdHcm91cFxuICAgICAgICAgIHsuLi52aXNDb25maWd1cmF0b3JQcm9wc31cbiAgICAgICAgICB7Li4ubGF5ZXIudmlzQ29uZmlnU2V0dGluZ3MuZW5hYmxlM2R9XG4gICAgICAgICAgY29sbGFwc2libGVcbiAgICAgICAgPlxuICAgICAgICAgIDxWaXNDb25maWdTbGlkZXJcbiAgICAgICAgICAgIHsuLi5sYXllci52aXNDb25maWdTZXR0aW5ncy5lbGV2YXRpb25TY2FsZX1cbiAgICAgICAgICAgIHsuLi52aXNDb25maWd1cmF0b3JQcm9wc31cbiAgICAgICAgICAgIGxhYmVsPXtmYWxzZX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtsYXllckNoYW5uZWxDb25maWdQcm9wcy5maWVsZHMgPyAoXG4gICAgICAgICAgICA8Q2hhbm5lbEJ5VmFsdWVTZWxlY3RvclxuICAgICAgICAgICAgICB7Li4ubGF5ZXJDaGFubmVsQ29uZmlnUHJvcHN9XG4gICAgICAgICAgICAgIGNoYW5uZWw9e2xheWVyLnZpc3VhbENoYW5uZWxzLmhlaWdodH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD5cblxuICAgICAgICB7LyogUmFkaXVzICovfVxuICAgICAgICA8TGF5ZXJDb25maWdHcm91cFxuICAgICAgICAgIHsuLi52aXNDb25maWd1cmF0b3JQcm9wc31cbiAgICAgICAgICBsYWJlbD17J2xheWVyLnJhZGl1cyd9XG4gICAgICAgICAgZGVzY3JpcHRpb249XCJQb2ludCByYWRpdXMgaW4gcGl4ZWxzIG9yIG1ldGVyc1wiXG4gICAgICAgICAgY29sbGFwc2libGVcbiAgICAgICAgPlxuICAgICAgICAgIHtsYXllci5jb25maWcudmlzQ29uZmlnLnJhZGl1c0J5Wm9vbT8uZW5hYmxlZCAmJiB2aXNDb25maWd1cmF0b3JQcm9wcy5vbkNoYW5nZSA/IChcbiAgICAgICAgICAgIDxWaXNDb25maWdCeVpvb21JbnB1dFxuICAgICAgICAgICAgICBjb25maWc9e2xheWVyLmNvbmZpZy52aXNDb25maWcucmFkaXVzQnlab29tfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dmlzQ29uZmlndXJhdG9yUHJvcHMub25DaGFuZ2V9XG4gICAgICAgICAgICAgIGxhYmVsPVwiUmFkaXVzXCJcbiAgICAgICAgICAgICAgcHJvcGVydHk9XCJyYWRpdXNCeVpvb21cIlxuICAgICAgICAgICAgICB1bml0PVwicHhcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPFZpc0NvbmZpZ1NsaWRlclxuICAgICAgICAgICAgICB7Li4ubGF5ZXIudmlzQ29uZmlnU2V0dGluZ3MucmFkaXVzfVxuICAgICAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgICAgIGxhYmVsPXtmYWxzZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIDxDb25maWdHcm91cENvbGxhcHNpYmxlQ29udGVudD5cbiAgICAgICAgICAgIHtsYXllckNoYW5uZWxDb25maWdQcm9wcy5maWVsZHMgPyAoXG4gICAgICAgICAgICAgIDxDaGFubmVsQnlWYWx1ZVNlbGVjdG9yXG4gICAgICAgICAgICAgICAgey4uLmxheWVyQ2hhbm5lbENvbmZpZ1Byb3BzfVxuICAgICAgICAgICAgICAgIGNoYW5uZWw9e2xheWVyLnZpc3VhbENoYW5uZWxzLnJhZGl1c31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPFZpc0NvbmZpZ1N3aXRjaCB7Li4ubGF5ZXIudmlzQ29uZmlnU2V0dGluZ3MucmFkaXVzVW5pdHN9IHsuLi52aXNDb25maWd1cmF0b3JQcm9wc30gLz5cbiAgICAgICAgICA8L0NvbmZpZ0dyb3VwQ29sbGFwc2libGVDb250ZW50PlxuICAgICAgICA8L0xheWVyQ29uZmlnR3JvdXA+XG4gICAgICA8L1N0eWxlZExheWVyQ29uZmlndXJhdG9yPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgQ29ubmVjdGVkVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yID0gY29ubmVjdChzdGF0ZSA9PiBzdGF0ZSkoVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yKTtcbiAgcmV0dXJuIENvbm5lY3RlZFZlY3RvclRpbGVMYXllckNvbmZpZ3VyYXRvcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGlCQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFLQSxJQUFBRyxtQkFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksdUJB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
102
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdFJlZHV4IiwiX3N0eWxlZENvbXBvbmVudHMiLCJfc291cmNlRGF0YVNlbGVjdG9yIiwiX2ZpZWxkU2VsZWN0b3IiLCJfY2hhbm5lbEJ5VmFsdWVTZWxlY3RvciIsIl9sYXllckNvbmZpZ0dyb3VwIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbGF5ZXJDb2xvclNlbGVjdG9yIiwiX3JhZGl1c0J5Wm9vbUlucHV0IiwiX3Zpc0NvbmZpZ1NsaWRlciIsIl92aXNDb25maWdTd2l0Y2giLCJfdGVtcGxhdGVPYmplY3QiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJTdHlsZWRMYXllckNvbmZpZ3VyYXRvciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yRmFjdG9yeSIsImRlcHMiLCJDaGFubmVsQnlWYWx1ZVNlbGVjdG9yRmFjdG9yeSIsIkxheWVyQ29sb3JSYW5nZVNlbGVjdG9yRmFjdG9yeSIsIkxheWVyQ29sb3JTZWxlY3RvckZhY3RvcnkiLCJMYXllckNvbmZpZ0dyb3VwRmFjdG9yeSIsIlZpc0NvbmZpZ1NsaWRlckZhY3RvcnkiLCJWaXNDb25maWdTd2l0Y2hGYWN0b3J5IiwiU291cmNlRGF0YVNlbGVjdG9yRmFjdG9yeSIsIkZpZWxkU2VsZWN0b3JGYWN0b3J5IiwiQ2hhbm5lbEJ5VmFsdWVTZWxlY3RvciIsIkxheWVyQ29sb3JSYW5nZVNlbGVjdG9yIiwiTGF5ZXJDb2xvclNlbGVjdG9yIiwiTGF5ZXJDb25maWdHcm91cCIsIlZpc0NvbmZpZ1NsaWRlciIsIlZpc0NvbmZpZ1N3aXRjaCIsIl9Tb3VyY2VEYXRhU2VsZWN0b3IiLCJGaWVsZFNlbGVjdG9yIiwiVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yIiwiX3JlZiIsIl9sYXllciRjb25maWckdmlzQ29uZiIsImxheWVyIiwidmlzQ29uZmlndXJhdG9yUHJvcHMiLCJsYXllckNoYW5uZWxDb25maWdQcm9wcyIsImxheWVyQ29uZmlndXJhdG9yUHJvcHMiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwibGFiZWwiLCJmaWVsZHMiLCJjaGFubmVsIiwidmlzdWFsQ2hhbm5lbHMiLCJjb2xvciIsImNvbmZpZyIsImNvbG9yRmllbGQiLCJGcmFnbWVudCIsInZpc0NvbmZpZ1NldHRpbmdzIiwiZHluYW1pY0NvbG9yIiwib3BhY2l0eSIsInN0cm9rZWQiLCJjb2xsYXBzaWJsZSIsInN0cm9rZUNvbG9yIiwic3Ryb2tlQ29sb3JGaWVsZCIsInByb3BlcnR5Iiwic2VsZWN0ZWRDb2xvciIsInZpc0NvbmZpZyIsIkNvbmZpZ0dyb3VwQ29sbGFwc2libGVDb250ZW50Iiwic3Ryb2tlT3BhY2l0eSIsInNpemVGaWVsZCIsInNpemVSYW5nZSIsInN0cm9rZVdpZHRoIiwic2l6ZSIsImVuYWJsZTNkIiwiZWxldmF0aW9uU2NhbGUiLCJoZWlnaHQiLCJkZXNjcmlwdGlvbiIsInJhZGl1c0J5Wm9vbSIsImVuYWJsZWQiLCJvbkNoYW5nZSIsInVuaXQiLCJyYWRpdXMiLCJyYWRpdXNVbml0cyIsInZhbHVlIiwidW5pcXVlSWRGaWVsZCIsIm9uU2VsZWN0IiwidmFsIiwiX2xheWVyQ29uZmlndXJhdG9yUHJvIiwibmFtZSIsInBsYWNlaG9sZGVyIiwiZXJhc2FibGUiLCJDb25uZWN0ZWRWZWN0b3JUaWxlTGF5ZXJDb25maWd1cmF0b3IiLCJjb25uZWN0Iiwic3RhdGUiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2lkZS1wYW5lbC9sYXllci1wYW5lbC92ZWN0b3ItdGlsZS1sYXllci1jb25maWd1cmF0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQge1ZlY3RvclRpbGVMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZSBhcyBLZXBsZXJEYXRhc2V0fSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcblxuaW1wb3J0IFNvdXJjZURhdGFTZWxlY3RvckZhY3RvcnkgZnJvbSAnLi4vY29tbW9uL3NvdXJjZS1kYXRhLXNlbGVjdG9yJztcbmltcG9ydCBGaWVsZFNlbGVjdG9yRmFjdG9yeSBmcm9tICcuLi8uLi9jb21tb24vZmllbGQtc2VsZWN0b3InO1xuaW1wb3J0IENoYW5uZWxCeVZhbHVlU2VsZWN0b3JGYWN0b3J5IGZyb20gJy4vY2hhbm5lbC1ieS12YWx1ZS1zZWxlY3Rvcic7XG5pbXBvcnQgTGF5ZXJDb25maWdHcm91cEZhY3RvcnksIHtDb25maWdHcm91cENvbGxhcHNpYmxlQ29udGVudH0gZnJvbSAnLi9sYXllci1jb25maWctZ3JvdXAnO1xuaW1wb3J0IHtMYXllckNvbG9yUmFuZ2VTZWxlY3RvckZhY3RvcnksIExheWVyQ29sb3JTZWxlY3RvckZhY3Rvcnl9IGZyb20gJy4vbGF5ZXItY29sb3Itc2VsZWN0b3InO1xuaW1wb3J0IFZpc0NvbmZpZ0J5Wm9vbUlucHV0IGZyb20gJy4vcmFkaXVzLWJ5LXpvb20taW5wdXQnO1xuaW1wb3J0IFZpc0NvbmZpZ1NsaWRlckZhY3RvcnkgZnJvbSAnLi92aXMtY29uZmlnLXNsaWRlcic7XG5pbXBvcnQgVmlzQ29uZmlnU3dpdGNoRmFjdG9yeSBmcm9tICcuL3Zpcy1jb25maWctc3dpdGNoJztcblxuY29uc3QgU3R5bGVkTGF5ZXJDb25maWd1cmF0b3IgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tdG9wOiAxMnB4O1xuYDtcblxudHlwZSBHZXRQcm9wczxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBSZWFjdC5GQzxhbnk+PiA9IFBhcmFtZXRlcnM8UmV0dXJuVHlwZTxUPj5bMF07XG5cbnR5cGUgUHJvcHMgPSB7XG4gIGxheWVyOiBWZWN0b3JUaWxlTGF5ZXI7XG4gIGRhdGFzZXQ/OiBLZXBsZXJEYXRhc2V0O1xuICB2aXNDb25maWd1cmF0b3JQcm9wczogYW55O1xuICBsYXllckNoYW5uZWxDb25maWdQcm9wczogR2V0UHJvcHM8dHlwZW9mIENoYW5uZWxCeVZhbHVlU2VsZWN0b3JGYWN0b3J5PjtcbiAgbGF5ZXJDb25maWd1cmF0b3JQcm9wczogYW55O1xufTtcblxuVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yRmFjdG9yeS5kZXBzID0gW1xuICBDaGFubmVsQnlWYWx1ZVNlbGVjdG9yRmFjdG9yeSxcbiAgTGF5ZXJDb2xvclJhbmdlU2VsZWN0b3JGYWN0b3J5LFxuICBMYXllckNvbG9yU2VsZWN0b3JGYWN0b3J5LFxuICBMYXllckNvbmZpZ0dyb3VwRmFjdG9yeSxcbiAgVmlzQ29uZmlnU2xpZGVyRmFjdG9yeSxcbiAgVmlzQ29uZmlnU3dpdGNoRmFjdG9yeSxcbiAgU291cmNlRGF0YVNlbGVjdG9yRmFjdG9yeSxcbiAgRmllbGRTZWxlY3RvckZhY3Rvcnlcbl07XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVMYXllckNvbmZpZ3VyYXRvckZhY3RvcnkoXG4gIENoYW5uZWxCeVZhbHVlU2VsZWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIENoYW5uZWxCeVZhbHVlU2VsZWN0b3JGYWN0b3J5PixcbiAgTGF5ZXJDb2xvclJhbmdlU2VsZWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIExheWVyQ29sb3JSYW5nZVNlbGVjdG9yRmFjdG9yeT4sXG4gIExheWVyQ29sb3JTZWxlY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgTGF5ZXJDb2xvclNlbGVjdG9yRmFjdG9yeT4sXG4gIExheWVyQ29uZmlnR3JvdXA6IFJldHVyblR5cGU8dHlwZW9mIExheWVyQ29uZmlnR3JvdXBGYWN0b3J5PixcbiAgVmlzQ29uZmlnU2xpZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBWaXNDb25maWdTbGlkZXJGYWN0b3J5PixcbiAgVmlzQ29uZmlnU3dpdGNoOiBSZXR1cm5UeXBlPHR5cGVvZiBWaXNDb25maWdTd2l0Y2hGYWN0b3J5PixcbiAgX1NvdXJjZURhdGFTZWxlY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgU291cmNlRGF0YVNlbGVjdG9yRmFjdG9yeT4sXG4gIEZpZWxkU2VsZWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEZpZWxkU2VsZWN0b3JGYWN0b3J5PlxuKTogUmVhY3QuRkM8UHJvcHM+IHtcbiAgY29uc3QgVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yID0gKHtcbiAgICBsYXllcixcbiAgICB2aXNDb25maWd1cmF0b3JQcm9wcyxcbiAgICBsYXllckNoYW5uZWxDb25maWdQcm9wcyxcbiAgICBsYXllckNvbmZpZ3VyYXRvclByb3BzXG4gIH06IFByb3BzKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRMYXllckNvbmZpZ3VyYXRvcj5cbiAgICAgICAgey8qIEZpbGwgQ29sb3IgKi99XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwIHsuLi52aXNDb25maWd1cmF0b3JQcm9wc30gbGFiZWw9XCJsYXllci5maWxsQ29sb3JcIj5cbiAgICAgICAgICB7bGF5ZXJDaGFubmVsQ29uZmlnUHJvcHMuZmllbGRzID8gKFxuICAgICAgICAgICAgPENoYW5uZWxCeVZhbHVlU2VsZWN0b3JcbiAgICAgICAgICAgICAgey4uLmxheWVyQ2hhbm5lbENvbmZpZ1Byb3BzfVxuICAgICAgICAgICAgICBjaGFubmVsPXtsYXllci52aXN1YWxDaGFubmVscy5jb2xvcn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAge2xheWVyLmNvbmZpZy5jb2xvckZpZWxkID8gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgPFZpc0NvbmZpZ1N3aXRjaFxuICAgICAgICAgICAgICAgIHsuLi52aXNDb25maWd1cmF0b3JQcm9wc31cbiAgICAgICAgICAgICAgICB7Li4ubGF5ZXIudmlzQ29uZmlnU2V0dGluZ3MuZHluYW1pY0NvbG9yfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8TGF5ZXJDb2xvclJhbmdlU2VsZWN0b3JcbiAgICAgICAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgICAgICAgY2hhbm5lbD17bGF5ZXIudmlzdWFsQ2hhbm5lbHMuY29sb3J9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPExheWVyQ29sb3JTZWxlY3RvciB7Li4ubGF5ZXJDb25maWd1cmF0b3JQcm9wc30gLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxWaXNDb25maWdTbGlkZXIgey4uLmxheWVyLnZpc0NvbmZpZ1NldHRpbmdzLm9wYWNpdHl9IHsuLi52aXNDb25maWd1cmF0b3JQcm9wc30gLz5cbiAgICAgICAgPC9MYXllckNvbmZpZ0dyb3VwPlxuXG4gICAgICAgIHsvKiBTdHJva2UgY29sb3IgKi99XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwXG4gICAgICAgICAgey4uLmxheWVyLnZpc0NvbmZpZ1NldHRpbmdzLnN0cm9rZWR9XG4gICAgICAgICAgey4uLnZpc0NvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAgIGxhYmVsPVwibGF5ZXIuc3Ryb2tlQ29sb3JcIlxuICAgICAgICAgIGNvbGxhcHNpYmxlXG4gICAgICAgID5cbiAgICAgICAgICA8Q2hhbm5lbEJ5VmFsdWVTZWxlY3RvclxuICAgICAgICAgICAgey4uLmxheWVyQ2hhbm5lbENvbmZpZ1Byb3BzfVxuICAgICAgICAgICAgY2hhbm5lbD17bGF5ZXIudmlzdWFsQ2hhbm5lbHMuc3Ryb2tlQ29sb3J9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7bGF5ZXIuY29uZmlnLnN0cm9rZUNvbG9yRmllbGQgPyAoXG4gICAgICAgICAgICA8TGF5ZXJDb2xvclJhbmdlU2VsZWN0b3JcbiAgICAgICAgICAgICAgey4uLnZpc0NvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAgICAgICBwcm9wZXJ0eT1cInN0cm9rZUNvbG9yUmFuZ2VcIlxuICAgICAgICAgICAgICBjaGFubmVsPXtsYXllci52aXN1YWxDaGFubmVscy5zdHJva2VDb2xvcn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxMYXllckNvbG9yU2VsZWN0b3JcbiAgICAgICAgICAgICAgey4uLnZpc0NvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAgICAgICBzZWxlY3RlZENvbG9yPXtsYXllci5jb25maWcudmlzQ29uZmlnLnN0cm9rZUNvbG9yfVxuICAgICAgICAgICAgICBwcm9wZXJ0eT1cInN0cm9rZUNvbG9yXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICA8Q29uZmlnR3JvdXBDb2xsYXBzaWJsZUNvbnRlbnQ+XG4gICAgICAgICAgICA8VmlzQ29uZmlnU2xpZGVyIHsuLi5sYXllci52aXNDb25maWdTZXR0aW5ncy5zdHJva2VPcGFjaXR5fSB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9IC8+XG4gICAgICAgICAgPC9Db25maWdHcm91cENvbGxhcHNpYmxlQ29udGVudD5cbiAgICAgICAgPC9MYXllckNvbmZpZ0dyb3VwPlxuXG4gICAgICAgIHsvKiBTdHJva2UgV2lkdGggKi99XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwXG4gICAgICAgICAgey4uLnZpc0NvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAgIHsuLi5sYXllci52aXNDb25maWdTZXR0aW5ncy5zdHJva2VkfVxuICAgICAgICAgIGxhYmVsPVwibGF5ZXIuc3Ryb2tlV2lkdGhcIlxuICAgICAgICAgIGNvbGxhcHNpYmxlXG4gICAgICAgID5cbiAgICAgICAgICB7bGF5ZXIuY29uZmlnLnNpemVGaWVsZCA/IChcbiAgICAgICAgICAgIDxWaXNDb25maWdTbGlkZXJcbiAgICAgICAgICAgICAgey4uLmxheWVyLnZpc0NvbmZpZ1NldHRpbmdzLnNpemVSYW5nZX1cbiAgICAgICAgICAgICAgey4uLnZpc0NvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAgICAgICBsYWJlbD17ZmFsc2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8VmlzQ29uZmlnU2xpZGVyXG4gICAgICAgICAgICAgIHsuLi5sYXllci52aXNDb25maWdTZXR0aW5ncy5zdHJva2VXaWR0aH1cbiAgICAgICAgICAgICAgey4uLnZpc0NvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAgICAgICBsYWJlbD17ZmFsc2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgICAgPENvbmZpZ0dyb3VwQ29sbGFwc2libGVDb250ZW50PlxuICAgICAgICAgICAgPENoYW5uZWxCeVZhbHVlU2VsZWN0b3JcbiAgICAgICAgICAgICAgey4uLmxheWVyQ2hhbm5lbENvbmZpZ1Byb3BzfVxuICAgICAgICAgICAgICBjaGFubmVsPXtsYXllci52aXN1YWxDaGFubmVscy5zaXplfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L0NvbmZpZ0dyb3VwQ29sbGFwc2libGVDb250ZW50PlxuICAgICAgICA8L0xheWVyQ29uZmlnR3JvdXA+XG5cbiAgICAgICAgey8qIEVsZXZhdGlvbiAqL31cbiAgICAgICAgPExheWVyQ29uZmlnR3JvdXBcbiAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgey4uLmxheWVyLnZpc0NvbmZpZ1NldHRpbmdzLmVuYWJsZTNkfVxuICAgICAgICAgIGNvbGxhcHNpYmxlXG4gICAgICAgID5cbiAgICAgICAgICA8VmlzQ29uZmlnU2xpZGVyXG4gICAgICAgICAgICB7Li4ubGF5ZXIudmlzQ29uZmlnU2V0dGluZ3MuZWxldmF0aW9uU2NhbGV9XG4gICAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgICBsYWJlbD17ZmFsc2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7bGF5ZXJDaGFubmVsQ29uZmlnUHJvcHMuZmllbGRzID8gKFxuICAgICAgICAgICAgPENoYW5uZWxCeVZhbHVlU2VsZWN0b3JcbiAgICAgICAgICAgICAgey4uLmxheWVyQ2hhbm5lbENvbmZpZ1Byb3BzfVxuICAgICAgICAgICAgICBjaGFubmVsPXtsYXllci52aXN1YWxDaGFubmVscy5oZWlnaHR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L0xheWVyQ29uZmlnR3JvdXA+XG5cbiAgICAgICAgey8qIFJhZGl1cyAqL31cbiAgICAgICAgPExheWVyQ29uZmlnR3JvdXBcbiAgICAgICAgICB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgbGFiZWw9eydsYXllci5yYWRpdXMnfVxuICAgICAgICAgIGRlc2NyaXB0aW9uPVwiUG9pbnQgcmFkaXVzIGluIHBpeGVscyBvciBtZXRlcnNcIlxuICAgICAgICAgIGNvbGxhcHNpYmxlXG4gICAgICAgID5cbiAgICAgICAgICB7bGF5ZXIuY29uZmlnLnZpc0NvbmZpZy5yYWRpdXNCeVpvb20/LmVuYWJsZWQgJiYgdmlzQ29uZmlndXJhdG9yUHJvcHMub25DaGFuZ2UgPyAoXG4gICAgICAgICAgICA8VmlzQ29uZmlnQnlab29tSW5wdXRcbiAgICAgICAgICAgICAgY29uZmlnPXtsYXllci5jb25maWcudmlzQ29uZmlnLnJhZGl1c0J5Wm9vbX1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e3Zpc0NvbmZpZ3VyYXRvclByb3BzLm9uQ2hhbmdlfVxuICAgICAgICAgICAgICBsYWJlbD1cIlJhZGl1c1wiXG4gICAgICAgICAgICAgIHByb3BlcnR5PVwicmFkaXVzQnlab29tXCJcbiAgICAgICAgICAgICAgdW5pdD1cInB4XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxWaXNDb25maWdTbGlkZXJcbiAgICAgICAgICAgICAgey4uLmxheWVyLnZpc0NvbmZpZ1NldHRpbmdzLnJhZGl1c31cbiAgICAgICAgICAgICAgey4uLnZpc0NvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAgICAgICBsYWJlbD17ZmFsc2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8Q29uZmlnR3JvdXBDb2xsYXBzaWJsZUNvbnRlbnQ+XG4gICAgICAgICAgICB7bGF5ZXJDaGFubmVsQ29uZmlnUHJvcHMuZmllbGRzID8gKFxuICAgICAgICAgICAgICA8Q2hhbm5lbEJ5VmFsdWVTZWxlY3RvclxuICAgICAgICAgICAgICAgIHsuLi5sYXllckNoYW5uZWxDb25maWdQcm9wc31cbiAgICAgICAgICAgICAgICBjaGFubmVsPXtsYXllci52aXN1YWxDaGFubmVscy5yYWRpdXN9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDxWaXNDb25maWdTd2l0Y2ggey4uLmxheWVyLnZpc0NvbmZpZ1NldHRpbmdzLnJhZGl1c1VuaXRzfSB7Li4udmlzQ29uZmlndXJhdG9yUHJvcHN9IC8+XG4gICAgICAgICAgPC9Db25maWdHcm91cENvbGxhcHNpYmxlQ29udGVudD5cbiAgICAgICAgPC9MYXllckNvbmZpZ0dyb3VwPlxuXG4gICAgICAgIHsvKiBVbmlxdWUgSUQgRmllbGQgKi99XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwIHsuLi52aXNDb25maWd1cmF0b3JQcm9wc30gbGFiZWw9XCJsYXllci51bmlxdWVJZEZpZWxkXCI+XG4gICAgICAgICAgPEZpZWxkU2VsZWN0b3JcbiAgICAgICAgICAgIGZpZWxkcz17bGF5ZXJDaGFubmVsQ29uZmlnUHJvcHMuZmllbGRzIHx8IFtdfVxuICAgICAgICAgICAgdmFsdWU9e2xheWVyLmNvbmZpZy51bmlxdWVJZEZpZWxkIHx8IG51bGx9XG4gICAgICAgICAgICBvblNlbGVjdD17KHZhbDogYW55KSA9PlxuICAgICAgICAgICAgICBsYXllckNvbmZpZ3VyYXRvclByb3BzLm9uQ2hhbmdlPy4oe3VuaXF1ZUlkRmllbGQ6IHZhbD8ubmFtZSB8fCBudWxsfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXsncGxhY2Vob2xkZXIuc2VsZWN0RmllbGQnfVxuICAgICAgICAgICAgZXJhc2FibGVcbiAgICAgICAgICAvPlxuICAgICAgICA8L0xheWVyQ29uZmlnR3JvdXA+XG4gICAgICA8L1N0eWxlZExheWVyQ29uZmlndXJhdG9yPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgQ29ubmVjdGVkVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yID0gY29ubmVjdChzdGF0ZSA9PiBzdGF0ZSkoVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yKTtcbiAgcmV0dXJuIENvbm5lY3RlZFZlY3RvclRpbGVMYXllckNvbmZpZ3VyYXRvcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVjdG9yVGlsZUxheWVyQ29uZmlndXJhdG9yRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGlCQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFLQSxJQUFBRyxtQkFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0Es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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kepler.gl/components",
3
3
  "author": "Shan He <shan@uber.com>",
4
- "version": "3.2.0",
4
+ "version": "3.2.2",
5
5
  "description": "kepler.gl constants used by kepler.gl components, actions and reducers",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
@@ -38,20 +38,20 @@
38
38
  "@dnd-kit/utilities": "^3.2.2",
39
39
  "@emotion/is-prop-valid": "^1.2.1",
40
40
  "@floating-ui/react": "0.25.1",
41
- "@kepler.gl/actions": "3.2.0",
42
- "@kepler.gl/cloud-providers": "3.2.0",
43
- "@kepler.gl/common-utils": "3.2.0",
44
- "@kepler.gl/constants": "3.2.0",
45
- "@kepler.gl/effects": "3.2.0",
46
- "@kepler.gl/layers": "3.2.0",
47
- "@kepler.gl/localization": "3.2.0",
48
- "@kepler.gl/processors": "3.2.0",
49
- "@kepler.gl/reducers": "3.2.0",
50
- "@kepler.gl/schemas": "3.2.0",
51
- "@kepler.gl/styles": "3.2.0",
52
- "@kepler.gl/table": "3.2.0",
53
- "@kepler.gl/types": "3.2.0",
54
- "@kepler.gl/utils": "3.2.0",
41
+ "@kepler.gl/actions": "3.2.2",
42
+ "@kepler.gl/cloud-providers": "3.2.2",
43
+ "@kepler.gl/common-utils": "3.2.2",
44
+ "@kepler.gl/constants": "3.2.2",
45
+ "@kepler.gl/effects": "3.2.2",
46
+ "@kepler.gl/layers": "3.2.2",
47
+ "@kepler.gl/localization": "3.2.2",
48
+ "@kepler.gl/processors": "3.2.2",
49
+ "@kepler.gl/reducers": "3.2.2",
50
+ "@kepler.gl/schemas": "3.2.2",
51
+ "@kepler.gl/styles": "3.2.2",
52
+ "@kepler.gl/table": "3.2.2",
53
+ "@kepler.gl/types": "3.2.2",
54
+ "@kepler.gl/utils": "3.2.2",
55
55
  "@loaders.gl/mvt": "^4.3.2",
56
56
  "@loaders.gl/pmtiles": "^4.3.2",
57
57
  "@loaders.gl/wms": "4.3.2",
@@ -32,7 +32,8 @@ const inputCss = css`
32
32
  const StyledLegend = styled.div<{disableEdit: boolean; isExpanded?: boolean}>`
33
33
  ${props => props.theme.sidePanelScrollBar};
34
34
  ${props => (props.isExpanded ? '' : `max-height: 156px;`)};
35
- overflow: auto;
35
+ overflow-y: auto;
36
+ overflow-x: hidden;
36
37
  margin-bottom: ${GAP}px;
37
38
  display: grid;
38
39
  grid-row-gap: ${GAP}px;
@@ -45,12 +46,15 @@ const StyledLegendRow = styled.div`
45
46
  display: flex;
46
47
  align-items: center;
47
48
  height: 20px;
49
+ min-width: 0;
48
50
  `;
49
51
 
50
52
  export function ResetColorLabelFactory() {
51
53
  return styled(Reset)`
52
54
  color: ${props => props.theme.labelColorLT};
53
55
  cursor: pointer;
56
+ flex-shrink: 0;
57
+ margin-left: ${GAP}px;
54
58
 
55
59
  &:hover {
56
60
  color: ${props => props.theme.panelHeaderIconHover};
@@ -66,6 +70,10 @@ const StyleInlineInput = styled(InlineInput)`
66
70
  width: unset;
67
71
  padding: 2px;
68
72
  flex: 1;
73
+ min-width: 0;
74
+ overflow: hidden;
75
+ text-overflow: ellipsis;
76
+ white-space: nowrap;
69
77
  margin: 0 ${GAP}px;
70
78
  :hover {
71
79
  height: ${ROW_H}px;
@@ -125,6 +133,11 @@ const StyledLabel = styled.div`
125
133
  font-size: 10px;
126
134
  color: ${props => props.theme.textColor};
127
135
  padding-left: 2px;
136
+ flex: 1;
137
+ min-width: 0;
138
+ overflow: hidden;
139
+ text-overflow: ellipsis;
140
+ white-space: nowrap;
128
141
  `;
129
142
 
130
143
  export type LegendRowProps = {
@@ -155,7 +168,7 @@ export function LegendRowFactory(
155
168
  [color, onUpdateLabel]
156
169
  );
157
170
  const onReset = useCallback(() => onResetLabel && onResetLabel(color), [color, onResetLabel]);
158
- const value = displayLabel ? label.toString() : '';
171
+ const value = displayLabel ? String(label ?? '') : '';
159
172
  return (
160
173
  <StyledLegendRow>
161
174
  <LegendColorDisplay color={color} />
@@ -349,7 +349,7 @@ export const TableSection = ({
349
349
  height={headerGridProps.height + browserScrollBarWidth}
350
350
  width={headerGridWidth}
351
351
  scrollLeft={scrollLeft}
352
- onScroll={onScroll}
352
+ onScroll={args => onScroll?.({...args, scrollTop:scrollTop ?? 0 })}
353
353
  />
354
354
  </div>
355
355
  <div
@@ -116,6 +116,23 @@ const StyledResizeHandle = styled.div`
116
116
  cursor: ns-resize;
117
117
  `;
118
118
 
119
+ const StyledFixedLegendContent = styled.div<{contentHeight?: number}>`
120
+ .map-control__panel-content {
121
+ max-height: calc(100vh - 100px);
122
+ ${props => (props.contentHeight ? `height: ${props.contentHeight}px;` : '')};
123
+ }
124
+
125
+ /* Hide scrollbars in export to avoid OS default styling differences */
126
+ .styled-color-legend {
127
+ -ms-overflow-style: none; /* IE and old Edge */
128
+ scrollbar-width: none; /* Firefox */
129
+ }
130
+ .styled-color-legend::-webkit-scrollbar {
131
+ width: 0 !important; /* Chrome, Safari, new Edge */
132
+ height: 0 !important;
133
+ }
134
+ `;
135
+
119
136
  export type MapLegendPanelFactoryDeps = [
120
137
  typeof MapControlTooltipFactory,
121
138
  typeof MapControlPanelFactory,
@@ -240,7 +257,7 @@ const ImageExportLegend = withTheme(({settings, isSidePanelShown, theme, childre
240
257
  const containerRef: React.MutableRefObject<HTMLDivElement | null> = useRef(null);
241
258
  const legendContentRef: React.MutableRefObject<HTMLDivElement | null> = useRef(null);
242
259
 
243
- const {positionStyles} = useLegendPosition({
260
+ const {positionStyles, contentHeight} = useLegendPosition({
244
261
  legendContentRef,
245
262
  isSidePanelShown,
246
263
  theme,
@@ -263,7 +280,9 @@ const ImageExportLegend = withTheme(({settings, isSidePanelShown, theme, childre
263
280
  ref={legendContentRef}
264
281
  style={{...positionStyles, position: 'absolute'}}
265
282
  >
266
- {children}
283
+ <StyledFixedLegendContent contentHeight={contentHeight}>
284
+ {children}
285
+ </StyledFixedLegendContent>
267
286
  </div>,
268
287
  portalRoot
269
288
  )
@@ -202,7 +202,7 @@ export function LayerColorLegendFactory(
202
202
  fieldType={(colorField && colorField.type) || 'real'}
203
203
  range={colorRange}
204
204
  onUpdateColorLegend={onUpdateColorLegend}
205
- disableEdit={disableEdit}
205
+ disableEdit={disableEdit || Boolean(isExport)}
206
206
  isFixed={isFixed}
207
207
  mapState={mapState}
208
208
  labelFormat={
@@ -276,7 +276,8 @@ export default function PlotContainerFactory(
276
276
  mapControls: {
277
277
  mapLegend: {
278
278
  show: Boolean(legend),
279
- active: true
279
+ active: true,
280
+ settings: mapFields.mapControls?.mapLegend?.settings
280
281
  }
281
282
  },
282
283
  MapComponent: Map,
@@ -35,6 +35,7 @@ interface InteractionPanelProps {
35
35
 
36
36
  const StyledInteractionPanel = styled.div`
37
37
  padding-bottom: 6px;
38
+ contain: layout paint;
38
39
  `;
39
40
 
40
41
  InteractionPanelFactory.deps = [TooltipConfigFactory, BrushConfigFactory];
@@ -12,7 +12,7 @@ import {
12
12
  colorMapToColorBreaks,
13
13
  isNumericColorBreaks as notOrdinalColorBreaks
14
14
  } from '@kepler.gl/utils';
15
- import React, {useCallback, useMemo} from 'react';
15
+ import React, {useCallback, useMemo, useEffect} from 'react';
16
16
  import styled from 'styled-components';
17
17
  import ColumnStatsChartFactory from '../../common/column-stats-chart';
18
18
  import {Edit} from '../../common/icons';
@@ -155,6 +155,17 @@ function ColorBreaksPanelFactory(
155
155
  [customPalette.colorMap, isEditingCustomBreaks, colorBreaks]
156
156
  );
157
157
 
158
+ // Update layers on editing custom breaks
159
+ useEffect(() => {
160
+ const {type} = customPalette || {};
161
+ if (
162
+ isEditingCustomBreaks &&
163
+ (type === SCALE_TYPES.customOrdinal || type === SCALE_TYPES.custom)
164
+ ) {
165
+ onScaleChange(type, customPalette);
166
+ }
167
+ }, [isEditingCustomBreaks, customPalette, onScaleChange]);
168
+
158
169
  const onClickEditCustomBreaks = useCallback(() => {
159
170
  setColorUI({
160
171
  colorRangeConfig: {
@@ -231,8 +242,8 @@ function ColorBreaksPanelFactory(
231
242
  currentBreaks={currentBreaks}
232
243
  onEdit={isCustomBreaks ? onClickEditCustomBreaks : null}
233
244
  />
234
- ) : customPalette.colorMap &&
235
- customPalette.type === 'customOrdinal' &&
245
+ ) : (isCustomBreaks || customPalette.type === SCALE_TYPES.customOrdinal) &&
246
+ customPalette.colorMap &&
236
247
  customPalette.name?.endsWith(colorField.name) ? (
237
248
  <CategoricalColorDisplay
238
249
  colorMap={customPalette.colorMap}
@@ -148,6 +148,28 @@ function ColorScaleSelectorFactory(
148
148
  );
149
149
  const [tippyInstance, setTippyInstance] = useState<TippyInstance>();
150
150
  const isEditingColorBreaks = colorUIConfig?.colorRangeConfig?.customBreaks;
151
+
152
+ // Stores the previous selection for live preview: when choosing Custom/Custom Ordinal, we apply a temporary palette.
153
+ // Cancel restores {scale, range} from this ref; Confirm keeps the change and clears the ref.
154
+ // If the user switches between different custom scale types (e.g., from "Custom" to "Custom Ordinal") or is already in a custom scale state,
155
+ // this ref is updated to always store the most recent non-custom selection. Only the latest non-custom selection is restorable on cancel.
156
+ const prevSelectionRef = React.useRef<{scale: string; range: ColorRange} | null>(null);
157
+
158
+ // when custom color scale - but Confirm is not clicked yet
159
+ const pendingOption = useMemo(
160
+ () =>
161
+ isEditingColorBreaks
162
+ ? (dropdownSelectProps.options || []).find(
163
+ o => getOptionValue(o) === colorUIConfig?.customPalette?.type
164
+ ) || null
165
+ : null,
166
+ [
167
+ isEditingColorBreaks,
168
+ dropdownSelectProps.options,
169
+ getOptionValue,
170
+ colorUIConfig?.customPalette?.type
171
+ ]
172
+ );
151
173
  const colorScale = useMemo(
152
174
  () =>
153
175
  getLayerColorScale({
@@ -234,14 +256,16 @@ function ColorScaleSelectorFactory(
234
256
  const onSelectScale = useCallback(
235
257
  val => {
236
258
  // highlight selected option
237
- if (!val || isEditingColorBreaks) return;
259
+ if (!val) return;
260
+
238
261
  const selectedScale = getOptionValue(val);
239
- if (selectedScale === SCALE_TYPES.custom) {
262
+ if (selectedScale === SCALE_TYPES.custom || selectedScale === SCALE_TYPES.customOrdinal) {
240
263
  const customPalette = initCustomPaletteByCustomScale({
241
264
  scale: selectedScale,
242
265
  field,
243
266
  range,
244
- colorBreaks
267
+ colorBreaks,
268
+ ...(selectedScale === SCALE_TYPES.customOrdinal ? {ordinalDomain} : {})
245
269
  });
246
270
  setColorUI({
247
271
  showColorChart: true,
@@ -250,28 +274,55 @@ function ColorScaleSelectorFactory(
250
274
  },
251
275
  customPalette
252
276
  });
277
+ // store previous selection for cancel, then preview custom on the map
278
+ if (!prevSelectionRef.current) {
279
+ prevSelectionRef.current = {scale: scaleType, range};
280
+ }
253
281
  onSelect(selectedScale, customPalette);
254
- } else if (hasColorMap(range) && selectedScale !== SCALE_TYPES.customOrdinal) {
282
+ } else if (hasColorMap(range)) {
255
283
  // not custom
256
284
  // remove colorMap
257
285
  // eslint-disable-next-line no-unused-vars
258
286
  const {colorMap: _, ...newRange} = range;
287
+ // reset colorUI before changing the scale
288
+ setColorUI({
289
+ showColorChart: false,
290
+ colorRangeConfig: {
291
+ customBreaks: false
292
+ }
293
+ });
259
294
  onSelect(selectedScale, newRange);
260
295
  } else {
296
+ // reset colorUI before changing the scale
297
+ setColorUI({
298
+ showColorChart: false,
299
+ colorRangeConfig: {
300
+ customBreaks: false
301
+ }
302
+ });
261
303
  onSelect(selectedScale);
262
304
  }
263
305
  },
264
- [isEditingColorBreaks, field, setColorUI, onSelect, range, getOptionValue, colorBreaks]
306
+ [field, setColorUI, onSelect, range, getOptionValue, colorBreaks, ordinalDomain, scaleType]
265
307
  );
266
308
 
267
309
  const onApply = useCallback(() => {
268
- onSelect(scaleType, colorUIConfig.customPalette);
310
+ // change scale type only if confirmed
311
+ const nextScaleType = colorUIConfig?.customPalette?.type || scaleType;
312
+ onSelect(nextScaleType, colorUIConfig.customPalette);
269
313
  hideTippy(tippyInstance);
314
+ prevSelectionRef.current = null;
270
315
  }, [onSelect, colorUIConfig.customPalette, tippyInstance, scaleType]);
271
316
 
272
317
  const onCancel = useCallback(() => {
318
+ // restore previous selection if any
319
+ if (prevSelectionRef.current) {
320
+ const {scale: prevScale, range: prevRange} = prevSelectionRef.current;
321
+ onSelect(prevScale, prevRange);
322
+ }
273
323
  hideTippy(tippyInstance);
274
- }, [tippyInstance]);
324
+ prevSelectionRef.current = null;
325
+ }, [tippyInstance, onSelect]);
275
326
 
276
327
  const isCustomBreaks =
277
328
  scaleType === SCALE_TYPES.custom || scaleType === SCALE_TYPES.customOrdinal;
@@ -317,6 +368,9 @@ function ColorScaleSelectorFactory(
317
368
  customListComponent={ColorScaleSelectDropdown}
318
369
  searchable={false}
319
370
  showOptionsWhenEmpty
371
+ selectedItems={
372
+ pendingOption ? [pendingOption] : dropdownSelectProps.selectedItems
373
+ }
320
374
  />
321
375
  )}
322
376
  </DropdownWrapper>
@@ -327,7 +381,7 @@ function ColorScaleSelectorFactory(
327
381
  <DropdownSelect
328
382
  {...dropdownSelectProps}
329
383
  displayOption={displayOption}
330
- value={dropdownSelectProps.selectedItems[0]}
384
+ value={pendingOption || dropdownSelectProps.selectedItems[0]}
331
385
  />
332
386
  </div>
333
387
  </LazyTippy>
@@ -377,8 +377,11 @@ export const EditableColorRange: React.FC<EditableColorRangeProps> = ({
377
377
  editColorMap,
378
378
  editable
379
379
  }) => {
380
- const noMinBound = !Number.isFinite(item.inputs[0]) && index === 0;
381
- const noMaxBound = !Number.isFinite(item.inputs[1]) && isLast;
380
+ const hasInputs = Array.isArray(item?.inputs);
381
+ const leftInput = hasInputs ? item.inputs[0] : undefined;
382
+ const rightInput = hasInputs ? item.inputs[1] : undefined;
383
+ const noMinBound = !Number.isFinite(leftInput) && index === 0;
384
+ const noMaxBound = !Number.isFinite(rightInput) && isLast;
382
385
  const onChangeLeft = useCallback(
383
386
  val => {
384
387
  if (editable && editColorMap) editColorMap(parseFloat(val), index - 1);
@@ -395,7 +398,7 @@ export const EditableColorRange: React.FC<EditableColorRangeProps> = ({
395
398
  return (
396
399
  <StyledRangeInput>
397
400
  <ColorPaletteInput
398
- value={noMinBound ? 'Less' : item.inputs[0].toString()}
401
+ value={noMinBound ? 'Less' : String(leftInput ?? '')}
399
402
  id={`color-palette-input-${index}-left`}
400
403
  width="50px"
401
404
  textAlign="end"
@@ -404,7 +407,7 @@ export const EditableColorRange: React.FC<EditableColorRangeProps> = ({
404
407
  />
405
408
  <Dash />
406
409
  <ColorPaletteInput
407
- value={noMaxBound ? 'More' : item.inputs[1].toString()}
410
+ value={noMaxBound ? 'More' : String(rightInput ?? '')}
408
411
  id={`color-palette-input-${index}-right`}
409
412
  width="50px"
410
413
  textAlign="end"
@@ -468,7 +471,7 @@ export const CustomPaletteInput: React.FC<CustomPaletteInputProps> = ({
468
471
  />
469
472
  </StyledColorHexInput>
470
473
  ) : null}
471
- {isNumericColorBreaks(colorBreaks) ? (
474
+ {colorBreaks && index < colorBreaks.length && isNumericColorBreaks(colorBreaks) ? (
472
475
  <EditableColorRange
473
476
  item={colorBreaks[index]}
474
477
  isLast={index === colorBreaks.length - 1}
@@ -719,6 +722,9 @@ export const CategoricalSelector: React.FC<CategoricalSelectorProps> = ({
719
722
  listAnchor: 'list__item__anchor'
720
723
  }}
721
724
  options={allValues}
725
+ // add safe string casting for the Typeahead, so fuzzy search never receives non-strings, preventing the toLowerCase crash
726
+ displayOption={o => String(o ?? '')}
727
+ filterOption={(input, o) => String(o ?? '').includes(String(input ?? ''))}
722
728
  placeholder={'Search'}
723
729
  onOptionSelected={onOptionSelected}
724
730
  customListComponent={ModifiedDropdownList}
@@ -9,6 +9,7 @@ import {VectorTileLayer} from '@kepler.gl/layers';
9
9
  import {KeplerTable as KeplerDataset} from '@kepler.gl/table';
10
10
 
11
11
  import SourceDataSelectorFactory from '../common/source-data-selector';
12
+ import FieldSelectorFactory from '../../common/field-selector';
12
13
  import ChannelByValueSelectorFactory from './channel-by-value-selector';
13
14
  import LayerConfigGroupFactory, {ConfigGroupCollapsibleContent} from './layer-config-group';
14
15
  import {LayerColorRangeSelectorFactory, LayerColorSelectorFactory} from './layer-color-selector';
@@ -37,7 +38,8 @@ VectorTileLayerConfiguratorFactory.deps = [
37
38
  LayerConfigGroupFactory,
38
39
  VisConfigSliderFactory,
39
40
  VisConfigSwitchFactory,
40
- SourceDataSelectorFactory
41
+ SourceDataSelectorFactory,
42
+ FieldSelectorFactory
41
43
  ];
42
44
 
43
45
  function VectorTileLayerConfiguratorFactory(
@@ -46,7 +48,9 @@ function VectorTileLayerConfiguratorFactory(
46
48
  LayerColorSelector: ReturnType<typeof LayerColorSelectorFactory>,
47
49
  LayerConfigGroup: ReturnType<typeof LayerConfigGroupFactory>,
48
50
  VisConfigSlider: ReturnType<typeof VisConfigSliderFactory>,
49
- VisConfigSwitch: ReturnType<typeof VisConfigSwitchFactory>
51
+ VisConfigSwitch: ReturnType<typeof VisConfigSwitchFactory>,
52
+ _SourceDataSelector: ReturnType<typeof SourceDataSelectorFactory>,
53
+ FieldSelector: ReturnType<typeof FieldSelectorFactory>
50
54
  ): React.FC<Props> {
51
55
  const VectorTileLayerConfigurator = ({
52
56
  layer,
@@ -190,6 +194,19 @@ function VectorTileLayerConfiguratorFactory(
190
194
  <VisConfigSwitch {...layer.visConfigSettings.radiusUnits} {...visConfiguratorProps} />
191
195
  </ConfigGroupCollapsibleContent>
192
196
  </LayerConfigGroup>
197
+
198
+ {/* Unique ID Field */}
199
+ <LayerConfigGroup {...visConfiguratorProps} label="layer.uniqueIdField">
200
+ <FieldSelector
201
+ fields={layerChannelConfigProps.fields || []}
202
+ value={layer.config.uniqueIdField || null}
203
+ onSelect={(val: any) =>
204
+ layerConfiguratorProps.onChange?.({uniqueIdField: val?.name || null})
205
+ }
206
+ placeholder={'placeholder.selectField'}
207
+ erasable
208
+ />
209
+ </LayerConfigGroup>
193
210
  </StyledLayerConfigurator>
194
211
  );
195
212
  };
@@ -101,7 +101,7 @@ var KEPLER_GL_NAME = exports.KEPLER_GL_NAME = 'kepler.gl';
101
101
  // Since we are injecting this during the build process with babel
102
102
  // while developing VERSION is not defined, we capture the exception and return
103
103
  // an empty string which will allow us to retrieve the latest umd version
104
- var KEPLER_GL_VERSION = exports.KEPLER_GL_VERSION = "3.2.0";
104
+ var KEPLER_GL_VERSION = exports.KEPLER_GL_VERSION = "3.2.2";
105
105
  var KEPLER_GL_WEBSITE = exports.KEPLER_GL_WEBSITE = 'http://kepler.gl/';
106
106
  var DIMENSIONS = exports.DIMENSIONS = {
107
107
  sidePanel: {