@deck.gl-community/react 9.0.1

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 (34) hide show
  1. package/README.md +3 -0
  2. package/dist/components/icon.d.ts +3 -0
  3. package/dist/components/icon.js +6 -0
  4. package/dist/components/long-press-button.d.ts +13 -0
  5. package/dist/components/long-press-button.js +31 -0
  6. package/dist/components/modal.d.ts +8 -0
  7. package/dist/components/modal.js +70 -0
  8. package/dist/components/positioned-view-control.d.ts +9 -0
  9. package/dist/components/positioned-view-control.js +5 -0
  10. package/dist/components/view-control.d.ts +38 -0
  11. package/dist/components/view-control.js +128 -0
  12. package/dist/index.cjs +521 -0
  13. package/dist/index.cjs.map +7 -0
  14. package/dist/index.d.ts +10 -0
  15. package/dist/index.js +13 -0
  16. package/dist/overlays/html-cluster-overlay.d.ts +13 -0
  17. package/dist/overlays/html-cluster-overlay.js +53 -0
  18. package/dist/overlays/html-overlay-item.d.ts +12 -0
  19. package/dist/overlays/html-overlay-item.js +13 -0
  20. package/dist/overlays/html-overlay.d.ts +19 -0
  21. package/dist/overlays/html-overlay.js +65 -0
  22. package/dist/overlays/html-tooltip-overlay.d.ts +16 -0
  23. package/dist/overlays/html-tooltip-overlay.js +53 -0
  24. package/package.json +50 -0
  25. package/src/components/icon.tsx +7 -0
  26. package/src/components/long-press-button.tsx +43 -0
  27. package/src/components/modal.tsx +92 -0
  28. package/src/components/positioned-view-control.tsx +16 -0
  29. package/src/components/view-control.tsx +163 -0
  30. package/src/index.ts +19 -0
  31. package/src/overlays/html-cluster-overlay.ts +80 -0
  32. package/src/overlays/html-overlay-item.tsx +30 -0
  33. package/src/overlays/html-overlay.tsx +91 -0
  34. package/src/overlays/html-tooltip-overlay.tsx +74 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,521 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var __publicField = (obj, key, value) => {
30
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
31
+ return value;
32
+ };
33
+
34
+ // dist/index.js
35
+ var dist_exports = {};
36
+ __export(dist_exports, {
37
+ Button: () => Button,
38
+ HtmlClusterOverlay: () => HtmlClusterOverlay,
39
+ HtmlOverlay: () => HtmlOverlay,
40
+ HtmlOverlayItem: () => HtmlOverlayItem,
41
+ HtmlTooltipOverlay: () => HtmlTooltipOverlay,
42
+ Icon: () => Icon,
43
+ LongPressButton: () => LongPressButton,
44
+ Modal: () => EditorModal,
45
+ PositionedViewControl: () => PositionedViewControl,
46
+ ViewControl: () => ViewControl
47
+ });
48
+ module.exports = __toCommonJS(dist_exports);
49
+
50
+ // dist/components/long-press-button.js
51
+ var import_react = __toESM(require("react"), 1);
52
+ var import_prop_types = __toESM(require("prop-types"), 1);
53
+ var LongPressButton = class extends import_react.PureComponent {
54
+ buttonPressTimer = null;
55
+ _repeat = () => {
56
+ if (this.buttonPressTimer) {
57
+ this.props.onClick();
58
+ this.buttonPressTimer = setTimeout(this._repeat, 100);
59
+ }
60
+ };
61
+ _handleButtonPress = () => {
62
+ this.buttonPressTimer = setTimeout(this._repeat, 100);
63
+ };
64
+ _handleButtonRelease = () => {
65
+ if (this.buttonPressTimer) {
66
+ clearTimeout(this.buttonPressTimer);
67
+ }
68
+ this.buttonPressTimer = null;
69
+ };
70
+ render() {
71
+ return import_react.default.createElement("div", { onMouseDown: (event) => {
72
+ this._handleButtonPress();
73
+ document.addEventListener("mouseup", this._handleButtonRelease, { once: true });
74
+ } }, this.props.children);
75
+ }
76
+ };
77
+ __publicField(LongPressButton, "propTypes", {
78
+ onClick: import_prop_types.default.func.isRequired,
79
+ // eslint-disable-next-line react/forbid-prop-types
80
+ children: import_prop_types.default.any.isRequired
81
+ });
82
+
83
+ // dist/components/view-control.js
84
+ var import_react2 = __toESM(require("react"), 1);
85
+ var import_prop_types2 = __toESM(require("prop-types"), 1);
86
+ var import_styled_components = __toESM(require("styled-components"), 1);
87
+ var ViewControlWrapper = import_styled_components.default.div`
88
+ align-items: center;
89
+ display: flex;
90
+ flex-direction: column;
91
+ position: absolute;
92
+ z-index: 99;
93
+ user-select: none;
94
+ `;
95
+ var NavigationButtonContainer = import_styled_components.default.div`
96
+ background: #f7f7f7;
97
+ border-radius: 23px;
98
+ border: 0.5px solid #eaeaea;
99
+ box-shadow: inset 11px 11px 5px -7px rgba(230, 230, 230, 0.49);
100
+ height: 46px;
101
+ width: 46px;
102
+ `;
103
+ var NavigationButton = import_styled_components.default.div`
104
+ color: #848484;
105
+ cursor: pointer;
106
+ left: ${(props) => props.left};
107
+ position: absolute;
108
+ top: ${(props) => props.top};
109
+ transform: rotate(${(props) => props.rotate || 0}deg);
110
+
111
+ &:hover,
112
+ &:active {
113
+ color: #00ade6;
114
+ }
115
+ `;
116
+ var ZoomControlWrapper = import_styled_components.default.div`
117
+ align-items: center;
118
+ background: #f7f7f7;
119
+ border: 0.5px solid #eaeaea;
120
+ display: flex;
121
+ flex-direction: column;
122
+ margin-top: 6px;
123
+ padding: 2px 0;
124
+ width: 18px;
125
+ `;
126
+ var VerticalSlider = import_styled_components.default.div`
127
+ display: inline-block;
128
+ height: 100px;
129
+ padding: 0;
130
+ width: 10px;
131
+
132
+ > input[type='range'][orient='vertical'] {
133
+ -webkit-appearance: slider-vertical;
134
+ height: 100px;
135
+ padding: 0;
136
+ margin: 0;
137
+ width: 10px;
138
+ }
139
+ `;
140
+ var ZoomControlButton = import_styled_components.default.div`
141
+ cursor: pointer;
142
+ font-size: 14px;
143
+ font-weight: 500;
144
+ margin: -4px;
145
+
146
+ &:hover,
147
+ &:active {
148
+ color: #00ade6;
149
+ }
150
+ `;
151
+ var ViewControl = class extends import_react2.PureComponent {
152
+ // pan actions
153
+ panUp = () => this.props.panBy(0, this.props.deltaPan);
154
+ panDown = () => this.props.panBy(0, -1 * this.props.deltaPan);
155
+ panLeft = () => this.props.panBy(this.props.deltaPan, 0);
156
+ panRight = () => this.props.panBy(-1 * this.props.deltaPan, 0);
157
+ // zoom actions
158
+ zoomIn = () => this.props.zoomBy(this.props.deltaZoom);
159
+ zoomOut = () => this.props.zoomBy(-1 * this.props.deltaZoom);
160
+ onChangeZoomLevel = (evt) => {
161
+ const delta = evt.target.value - this.props.zoomLevel;
162
+ this.props.zoomBy(delta);
163
+ };
164
+ render() {
165
+ const buttons = [
166
+ { top: -2, left: 14, rotate: 0, onClick: this.panUp, content: "\u25B2", key: "up" },
167
+ { top: 12, left: 0, rotate: -90, onClick: this.panLeft, content: "\u25C0", key: "left" },
168
+ { top: 12, left: 28, rotate: 90, onClick: this.panRight, content: "\u25B6", key: "right" },
169
+ { top: 25, left: 14, rotate: 180, onClick: this.panDown, content: "\u25BC", key: "down" }
170
+ ];
171
+ return import_react2.default.createElement(
172
+ ViewControlWrapper,
173
+ null,
174
+ import_react2.default.createElement(
175
+ NavigationButtonContainer,
176
+ null,
177
+ buttons.map((b) => import_react2.default.createElement(
178
+ NavigationButton,
179
+ { key: b.key, top: `${b.top}px`, left: `${b.left}px`, rotate: b.rotate },
180
+ import_react2.default.createElement(LongPressButton, { onClick: b.onClick }, b.content)
181
+ )),
182
+ import_react2.default.createElement(NavigationButton, { top: "12px", left: "16px", onClick: this.props.fitBounds }, "\xA4")
183
+ ),
184
+ import_react2.default.createElement(
185
+ ZoomControlWrapper,
186
+ null,
187
+ import_react2.default.createElement(
188
+ ZoomControlButton,
189
+ null,
190
+ import_react2.default.createElement(LongPressButton, { onClick: this.zoomIn }, "+")
191
+ ),
192
+ import_react2.default.createElement(
193
+ VerticalSlider,
194
+ null,
195
+ import_react2.default.createElement("input", {
196
+ type: "range",
197
+ value: this.props.zoomLevel,
198
+ min: this.props.minZoom,
199
+ max: this.props.maxZoom,
200
+ step: this.props.deltaZoom,
201
+ onChange: this.onChangeZoomLevel,
202
+ /* @ts-expect-error */
203
+ orient: "vertical"
204
+ })
205
+ ),
206
+ import_react2.default.createElement(
207
+ ZoomControlButton,
208
+ null,
209
+ import_react2.default.createElement(LongPressButton, { onClick: this.zoomOut }, "-")
210
+ )
211
+ )
212
+ );
213
+ }
214
+ };
215
+ __publicField(ViewControl, "displayName", "ViewControl");
216
+ __publicField(ViewControl, "propTypes", {
217
+ // functions
218
+ fitBounds: import_prop_types2.default.func,
219
+ panBy: import_prop_types2.default.func,
220
+ zoomBy: import_prop_types2.default.func,
221
+ // current zoom level
222
+ zoomLevel: import_prop_types2.default.number,
223
+ // configuration
224
+ minZoom: import_prop_types2.default.number,
225
+ maxZoom: import_prop_types2.default.number,
226
+ deltaPan: import_prop_types2.default.number,
227
+ deltaZoom: import_prop_types2.default.number
228
+ });
229
+ __publicField(ViewControl, "defaultProps", {
230
+ fitBounds: () => {
231
+ },
232
+ panBy: () => {
233
+ },
234
+ zoomBy: () => {
235
+ },
236
+ deltaPan: 10,
237
+ deltaZoom: 0.1,
238
+ minZoom: 0.1,
239
+ maxZoom: 1
240
+ });
241
+
242
+ // dist/components/positioned-view-control.js
243
+ var import_react3 = __toESM(require("react"), 1);
244
+ var PositionedViewControl = ({ fitBounds, panBy, zoomBy, zoomLevel, maxZoom, minZoom }) => import_react3.default.createElement(
245
+ "div",
246
+ { style: { position: "relative", top: "20px", left: "20px" } },
247
+ import_react3.default.createElement(ViewControl, { fitBounds, panBy, zoomBy, zoomLevel, maxZoom, minZoom })
248
+ );
249
+
250
+ // dist/components/modal.js
251
+ var React4 = __toESM(require("react"), 1);
252
+ var import_styled_react_modal = __toESM(require("styled-react-modal"), 1);
253
+ var import_styled_components2 = __toESM(require("styled-components"), 1);
254
+ var Button = import_styled_components2.default.button`
255
+ display: inline-block;
256
+ color: #fff;
257
+ background-color: rgb(90, 98, 94);
258
+ font-size: 1em;
259
+ margin: 0.25em;
260
+ padding: 0.375em 0.75em;
261
+ border: 1px solid transparent;
262
+ border-radius: 0.25em;
263
+ display: block;
264
+ `;
265
+ var StyledModal = import_styled_react_modal.default.styled`
266
+ position: relative;
267
+ display: block;
268
+ width: 50rem;
269
+ height: auto;
270
+ max-width: 500px;
271
+ margin: 1.75rem auto;
272
+ box-sizing: border-box;
273
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
274
+ font-size: 1rem;
275
+ font-weight: 400;
276
+ color: rgb(21, 25, 29);
277
+ line-height: 1.5;
278
+ text-align: left;
279
+ `;
280
+ var Content = import_styled_components2.default.div`
281
+ position: relative;
282
+ display: flex;
283
+ flex-direction: column;
284
+ width: 100%;
285
+ pointer-events: auto;
286
+ background-color: #fff;
287
+ background-clip: padding-box;
288
+ border: 1px solid rgba(0, 0, 0, 0.2);
289
+ border-radius: 0.3rem;
290
+ outline: 0;
291
+ `;
292
+ var HeaderRow = import_styled_components2.default.div`
293
+ display: flex;
294
+ align-items: flex-start;
295
+ justify-content: space-between;
296
+ padding: 0.75rem 0.75rem;
297
+ border-bottom: 1px solid rgb(222, 226, 230);
298
+ `;
299
+ var Header = import_styled_components2.default.h5`
300
+ font-size: 1.25rem;
301
+ font-weight: 500;
302
+ margin: 0;
303
+ `;
304
+ function EditorModal(props) {
305
+ const [isOpen, setIsOpen] = React4.useState(true);
306
+ function toggleModal() {
307
+ if (isOpen) {
308
+ props.onClose();
309
+ }
310
+ setIsOpen(!isOpen);
311
+ }
312
+ return React4.createElement(
313
+ React4.Fragment,
314
+ null,
315
+ React4.createElement(
316
+ import_styled_react_modal.ModalProvider,
317
+ null,
318
+ React4.createElement(
319
+ StyledModal,
320
+ { isOpen, onBackgroundClick: toggleModal, onEscapeKeydown: toggleModal },
321
+ React4.createElement(
322
+ Content,
323
+ null,
324
+ React4.createElement(
325
+ HeaderRow,
326
+ null,
327
+ React4.createElement(Header, null, props.title)
328
+ ),
329
+ props.content
330
+ )
331
+ )
332
+ )
333
+ );
334
+ }
335
+
336
+ // dist/components/icon.js
337
+ var React5 = __toESM(require("react"), 1);
338
+ var import_boxicons = require("boxicons");
339
+ function Icon(props) {
340
+ return React5.createElement("box-icon", { color: "currentColor", ...props });
341
+ }
342
+
343
+ // dist/overlays/html-overlay.js
344
+ var React6 = __toESM(require("react"), 1);
345
+ var styles = {
346
+ mainContainer: {
347
+ width: "100%",
348
+ height: "100%",
349
+ position: "absolute",
350
+ pointerEvents: "none",
351
+ overflow: "hidden"
352
+ }
353
+ };
354
+ var HtmlOverlay = class extends React6.Component {
355
+ // Override this to provide your items
356
+ getItems() {
357
+ const { children } = this.props;
358
+ if (children) {
359
+ return Array.isArray(children) ? children : [children];
360
+ }
361
+ return [];
362
+ }
363
+ getCoords(coordinates) {
364
+ const pos = this.props.viewport.project(coordinates);
365
+ if (!pos)
366
+ return [-1, -1];
367
+ return pos;
368
+ }
369
+ inView([x, y]) {
370
+ const { viewport, overflowMargin = 0 } = this.props;
371
+ const { width, height } = viewport;
372
+ return !(x < -overflowMargin || y < -overflowMargin || x > width + overflowMargin || y > height + overflowMargin);
373
+ }
374
+ scaleWithZoom(n) {
375
+ const { zoom } = this.props.viewport;
376
+ return n / Math.pow(2, 20 - zoom);
377
+ }
378
+ breakpointWithZoom(threshold, a, b) {
379
+ const { zoom } = this.props.viewport;
380
+ return zoom > threshold ? a : b;
381
+ }
382
+ getViewport() {
383
+ return this.props.viewport;
384
+ }
385
+ getZoom() {
386
+ return this.props.viewport.zoom;
387
+ }
388
+ render() {
389
+ const { zIndex = 1 } = this.props;
390
+ const style = Object.assign({ zIndex }, styles.mainContainer);
391
+ const renderItems = [];
392
+ this.getItems().filter(Boolean).forEach((item, index) => {
393
+ const [x, y] = this.getCoords(item.props.coordinates);
394
+ if (this.inView([x, y])) {
395
+ const key = item.key === null || item.key === void 0 ? index : item.key;
396
+ renderItems.push(React6.cloneElement(item, { x, y, key }));
397
+ }
398
+ });
399
+ return React6.createElement("div", { style }, renderItems);
400
+ }
401
+ };
402
+ // This is needed for Deck.gl 8.0+
403
+ __publicField(HtmlOverlay, "deckGLViewProps", true);
404
+
405
+ // dist/overlays/html-overlay-item.js
406
+ var React7 = __toESM(require("react"), 1);
407
+ var HtmlOverlayItem = class extends React7.Component {
408
+ render() {
409
+ const { x, y, children, style, coordinates, ...props } = this.props;
410
+ const { zIndex = "auto", ...remainingStyle } = style || {};
411
+ return (
412
+ // Using transform translate to position overlay items will result in a smooth zooming
413
+ // effect, whereas using the top/left css properties will cause overlay items to
414
+ // jiggle when zooming
415
+ React7.createElement(
416
+ "div",
417
+ { style: { transform: `translate(${x}px, ${y}px)`, position: "absolute", zIndex } },
418
+ React7.createElement("div", { style: { userSelect: "none", ...remainingStyle }, ...props }, children)
419
+ )
420
+ );
421
+ }
422
+ };
423
+
424
+ // dist/overlays/html-cluster-overlay.js
425
+ var import_helpers = require("@turf/helpers");
426
+ var import_supercluster = __toESM(require("supercluster"), 1);
427
+ var HtmlClusterOverlay = class extends HtmlOverlay {
428
+ _superCluster;
429
+ _lastObjects = null;
430
+ getItems() {
431
+ const newObjects = this.getAllObjects();
432
+ if (newObjects !== this._lastObjects) {
433
+ this._superCluster = new import_supercluster.default(this.getClusterOptions());
434
+ this._superCluster.load(newObjects.map((object) => (0, import_helpers.point)(this.getObjectCoordinates(object), { object })));
435
+ this._lastObjects = newObjects;
436
+ }
437
+ const clusters = this._superCluster.getClusters([-180, -90, 180, 90], Math.round(this.getZoom()));
438
+ return clusters.map(({ geometry: { coordinates }, properties: { cluster, point_count: pointCount, cluster_id: clusterId, object } }) => cluster ? this.renderCluster(coordinates, clusterId, pointCount) : this.renderObject(coordinates, object));
439
+ }
440
+ getClusterObjects(clusterId) {
441
+ return this._superCluster.getLeaves(clusterId, Infinity).map((object) => object.properties.object);
442
+ }
443
+ // Override to provide items that need clustering.
444
+ // If the items have not changed please provide the same array to avoid
445
+ // regeneration of the cluster which causes performance issues.
446
+ getAllObjects() {
447
+ return [];
448
+ }
449
+ // override to provide coordinates for each object of getAllObjects()
450
+ getObjectCoordinates(obj) {
451
+ return [0, 0];
452
+ }
453
+ // Get options object used when instantiating supercluster
454
+ getClusterOptions() {
455
+ return {
456
+ maxZoom: 20
457
+ };
458
+ }
459
+ // override to return an HtmlOverlayItem
460
+ renderObject(coordinates, obj) {
461
+ return null;
462
+ }
463
+ // override to return an HtmlOverlayItem
464
+ // use getClusterObjects() to get cluster contents
465
+ renderCluster(coordinates, clusterId, pointCount) {
466
+ return null;
467
+ }
468
+ };
469
+
470
+ // dist/overlays/html-tooltip-overlay.js
471
+ var React8 = __toESM(require("react"), 1);
472
+ var styles2 = {
473
+ tooltip: {
474
+ transform: "translate(-50%,-100%)",
475
+ backgroundColor: "rgba(0, 0, 0, 0.3)",
476
+ padding: "4px 8px",
477
+ borderRadius: 8,
478
+ color: "white"
479
+ }
480
+ };
481
+ var SHOW_TOOLTIP_TIMEOUT = 250;
482
+ var HtmlTooltipOverlay = class extends HtmlOverlay {
483
+ constructor(props) {
484
+ super(props);
485
+ this.state = { visible: false, pickingInfo: null };
486
+ }
487
+ componentWillMount() {
488
+ this.context.nebula.queryObjectEvents.on("pick", ({ event, pickingInfo }) => {
489
+ if (this.timeoutID !== null) {
490
+ window.clearTimeout(this.timeoutID);
491
+ }
492
+ this.timeoutID = null;
493
+ if (pickingInfo && this._getTooltip(pickingInfo)) {
494
+ this.timeoutID = window.setTimeout(() => {
495
+ this.setState({ visible: true, pickingInfo });
496
+ }, SHOW_TOOLTIP_TIMEOUT);
497
+ } else {
498
+ this.setState({ visible: false });
499
+ }
500
+ });
501
+ }
502
+ timeoutID = null;
503
+ state = void 0;
504
+ _getTooltip(pickingInfo) {
505
+ return pickingInfo.object.style.tooltip;
506
+ }
507
+ _makeOverlay() {
508
+ const { pickingInfo } = this.state;
509
+ if (pickingInfo) {
510
+ return React8.createElement(HtmlOverlayItem, { key: 0, coordinates: pickingInfo.lngLat, style: styles2.tooltip }, this._getTooltip(pickingInfo));
511
+ }
512
+ return null;
513
+ }
514
+ getItems() {
515
+ if (this.state.visible) {
516
+ return [this._makeOverlay()];
517
+ }
518
+ return [];
519
+ }
520
+ };
521
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["index.js", "components/long-press-button.js", "components/view-control.js", "components/positioned-view-control.js", "components/modal.js", "components/icon.js", "overlays/html-overlay.js", "overlays/html-overlay-item.js", "overlays/html-cluster-overlay.js", "overlays/html-tooltip-overlay.js"],
4
+ "sourcesContent": ["// Components (originally from @deck.gl-community/react-graph-layers)\nexport { LongPressButton } from './components/long-press-button';\nexport { ViewControl } from './components/view-control';\nexport { PositionedViewControl } from './components/positioned-view-control';\n// Components (originally from @nebula.gl/editor)\nexport { EditorModal as Modal } from './components/modal';\nexport { Button } from './components/modal';\nexport { Icon } from './components/icon';\n// Overlays (originally from @nebula.gl/overlays)\nexport { HtmlOverlay } from './overlays/html-overlay';\nexport { HtmlOverlayItem } from './overlays/html-overlay-item';\nexport { HtmlClusterOverlay } from './overlays/html-cluster-overlay';\nexport { HtmlTooltipOverlay } from './overlays/html-tooltip-overlay';\n", "import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nexport class LongPressButton extends PureComponent {\n static propTypes = {\n onClick: PropTypes.func.isRequired,\n // eslint-disable-next-line react/forbid-prop-types\n children: PropTypes.any.isRequired\n };\n buttonPressTimer = null;\n _repeat = () => {\n if (this.buttonPressTimer) {\n this.props.onClick();\n this.buttonPressTimer = setTimeout(this._repeat, 100);\n }\n };\n _handleButtonPress = () => {\n this.buttonPressTimer = setTimeout(this._repeat, 100);\n };\n _handleButtonRelease = () => {\n if (this.buttonPressTimer) {\n clearTimeout(this.buttonPressTimer);\n }\n this.buttonPressTimer = null;\n };\n render() {\n return (React.createElement(\"div\", { onMouseDown: (event) => {\n this._handleButtonPress();\n document.addEventListener('mouseup', this._handleButtonRelease, { once: true });\n } }, this.props.children));\n }\n}\n", "// @ts-nocheck TODO\nimport React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { LongPressButton } from './long-press-button';\nexport const ViewControlWrapper = styled.div `\n align-items: center;\n display: flex;\n flex-direction: column;\n position: absolute;\n z-index: 99;\n user-select: none;\n`;\nexport const NavigationButtonContainer = styled.div `\n background: #f7f7f7;\n border-radius: 23px;\n border: 0.5px solid #eaeaea;\n box-shadow: inset 11px 11px 5px -7px rgba(230, 230, 230, 0.49);\n height: 46px;\n width: 46px;\n`;\nexport const NavigationButton = styled.div `\n color: #848484;\n cursor: pointer;\n left: ${(props) => props.left};\n position: absolute;\n top: ${(props) => props.top};\n transform: rotate(${(props) => props.rotate || 0}deg);\n\n &:hover,\n &:active {\n color: #00ade6;\n }\n`;\nexport const ZoomControlWrapper = styled.div `\n align-items: center;\n background: #f7f7f7;\n border: 0.5px solid #eaeaea;\n display: flex;\n flex-direction: column;\n margin-top: 6px;\n padding: 2px 0;\n width: 18px;\n`;\nexport const VerticalSlider = styled.div `\n display: inline-block;\n height: 100px;\n padding: 0;\n width: 10px;\n\n > input[type='range'][orient='vertical'] {\n -webkit-appearance: slider-vertical;\n height: 100px;\n padding: 0;\n margin: 0;\n width: 10px;\n }\n`;\nexport const ZoomControlButton = styled.div `\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n margin: -4px;\n\n &:hover,\n &:active {\n color: #00ade6;\n }\n`;\nexport class ViewControl extends PureComponent {\n static displayName = 'ViewControl';\n static propTypes = {\n // functions\n fitBounds: PropTypes.func,\n panBy: PropTypes.func,\n zoomBy: PropTypes.func,\n // current zoom level\n zoomLevel: PropTypes.number,\n // configuration\n minZoom: PropTypes.number,\n maxZoom: PropTypes.number,\n deltaPan: PropTypes.number,\n deltaZoom: PropTypes.number\n };\n static defaultProps = {\n fitBounds: () => { },\n panBy: () => { },\n zoomBy: () => { },\n deltaPan: 10,\n deltaZoom: 0.1,\n minZoom: 0.1,\n maxZoom: 1\n };\n // pan actions\n panUp = () => this.props.panBy(0, this.props.deltaPan);\n panDown = () => this.props.panBy(0, -1 * this.props.deltaPan);\n panLeft = () => this.props.panBy(this.props.deltaPan, 0);\n panRight = () => this.props.panBy(-1 * this.props.deltaPan, 0);\n // zoom actions\n zoomIn = () => this.props.zoomBy(this.props.deltaZoom);\n zoomOut = () => this.props.zoomBy(-1 * this.props.deltaZoom);\n onChangeZoomLevel = (evt) => {\n const delta = evt.target.value - this.props.zoomLevel;\n this.props.zoomBy(delta);\n };\n render() {\n const buttons = [\n { top: -2, left: 14, rotate: 0, onClick: this.panUp, content: '\u25B2', key: 'up' },\n { top: 12, left: 0, rotate: -90, onClick: this.panLeft, content: '\u25C0', key: 'left' },\n { top: 12, left: 28, rotate: 90, onClick: this.panRight, content: '\u25B6', key: 'right' },\n { top: 25, left: 14, rotate: 180, onClick: this.panDown, content: '\u25BC', key: 'down' }\n ];\n return (React.createElement(ViewControlWrapper, null,\n React.createElement(NavigationButtonContainer, null,\n buttons.map((b) => (React.createElement(NavigationButton, { key: b.key, top: `${b.top}px`, left: `${b.left}px`, rotate: b.rotate },\n React.createElement(LongPressButton, { onClick: b.onClick }, b.content)))),\n React.createElement(NavigationButton, { top: '12px', left: '16px', onClick: this.props.fitBounds }, '\u00A4')),\n React.createElement(ZoomControlWrapper, null,\n React.createElement(ZoomControlButton, null,\n React.createElement(LongPressButton, { onClick: this.zoomIn }, '+')),\n React.createElement(VerticalSlider, null,\n React.createElement(\"input\", { type: \"range\", value: this.props.zoomLevel, min: this.props.minZoom, max: this.props.maxZoom, step: this.props.deltaZoom, onChange: this.onChangeZoomLevel, \n /* @ts-expect-error */\n orient: \"vertical\" })),\n React.createElement(ZoomControlButton, null,\n React.createElement(LongPressButton, { onClick: this.zoomOut }, '-')))));\n }\n}\n", "import { ViewControl } from './view-control';\nimport React from 'react';\n// A wrapper for positioning the ViewControl component\nexport const PositionedViewControl = ({ fitBounds, panBy, zoomBy, zoomLevel, maxZoom, minZoom }) => (React.createElement(\"div\", { style: { position: 'relative', top: '20px', left: '20px' } },\n React.createElement(ViewControl, { fitBounds: fitBounds, panBy: panBy, zoomBy: zoomBy, zoomLevel: zoomLevel, maxZoom: maxZoom, minZoom: minZoom })));\n", "/* eslint-env browser */\nimport * as React from 'react';\nimport Modal, { ModalProvider } from 'styled-react-modal';\nimport styled from 'styled-components';\nexport const Button = styled.button `\n display: inline-block;\n color: #fff;\n background-color: rgb(90, 98, 94);\n font-size: 1em;\n margin: 0.25em;\n padding: 0.375em 0.75em;\n border: 1px solid transparent;\n border-radius: 0.25em;\n display: block;\n`;\nconst StyledModal = Modal.styled `\n position: relative;\n display: block;\n width: 50rem;\n height: auto;\n max-width: 500px;\n margin: 1.75rem auto;\n box-sizing: border-box;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n color: rgb(21, 25, 29);\n line-height: 1.5;\n text-align: left;\n`;\nconst Content = styled.div `\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n`;\nconst HeaderRow = styled.div `\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 0.75rem 0.75rem;\n border-bottom: 1px solid rgb(222, 226, 230);\n`;\nconst Header = styled.h5 `\n font-size: 1.25rem;\n font-weight: 500;\n margin: 0;\n`;\nexport function EditorModal(props) {\n const [isOpen, setIsOpen] = React.useState(true);\n function toggleModal() {\n if (isOpen) {\n props.onClose();\n }\n setIsOpen(!isOpen);\n }\n return (React.createElement(React.Fragment, null,\n React.createElement(ModalProvider, null,\n React.createElement(StyledModal, { isOpen: isOpen, onBackgroundClick: toggleModal, onEscapeKeydown: toggleModal },\n React.createElement(Content, null,\n React.createElement(HeaderRow, null,\n React.createElement(Header, null, props.title)),\n props.content)))));\n}\n", "import * as React from 'react';\nimport 'boxicons';\nexport function Icon(props) {\n // @ts-expect-error TODO\n return React.createElement(\"box-icon\", { color: \"currentColor\", ...props });\n}\n", "import * as React from 'react';\nconst styles = {\n mainContainer: {\n width: '100%',\n height: '100%',\n position: 'absolute',\n pointerEvents: 'none',\n overflow: 'hidden'\n }\n};\nexport class HtmlOverlay extends React.Component {\n // This is needed for Deck.gl 8.0+\n static deckGLViewProps = true;\n // Override this to provide your items\n getItems() {\n const { children } = this.props;\n if (children) {\n return Array.isArray(children) ? children : [children];\n }\n return [];\n }\n getCoords(coordinates) {\n const pos = this.props.viewport.project(coordinates);\n if (!pos)\n return [-1, -1];\n return pos;\n }\n inView([x, y]) {\n const { viewport, overflowMargin = 0 } = this.props;\n const { width, height } = viewport;\n return !(x < -overflowMargin ||\n y < -overflowMargin ||\n x > width + overflowMargin ||\n y > height + overflowMargin);\n }\n scaleWithZoom(n) {\n const { zoom } = this.props.viewport;\n return n / Math.pow(2, 20 - zoom);\n }\n breakpointWithZoom(threshold, a, b) {\n const { zoom } = this.props.viewport;\n return zoom > threshold ? a : b;\n }\n getViewport() {\n return this.props.viewport;\n }\n getZoom() {\n return this.props.viewport.zoom;\n }\n render() {\n const { zIndex = 1 } = this.props;\n const style = Object.assign({ zIndex }, styles.mainContainer);\n const renderItems = [];\n this.getItems()\n .filter(Boolean)\n .forEach((item, index) => {\n const [x, y] = this.getCoords(item.props.coordinates);\n if (this.inView([x, y])) {\n const key = item.key === null || item.key === undefined ? index : item.key;\n renderItems.push(React.cloneElement(item, { x, y, key }));\n }\n });\n return React.createElement(\"div\", { style: style }, renderItems);\n }\n}\n", "import * as React from 'react';\nexport class HtmlOverlayItem extends React.Component {\n render() {\n const { x, y, children, style, coordinates, ...props } = this.props;\n const { zIndex = 'auto', ...remainingStyle } = style || {};\n return (\n // Using transform translate to position overlay items will result in a smooth zooming\n // effect, whereas using the top/left css properties will cause overlay items to\n // jiggle when zooming\n React.createElement(\"div\", { style: { transform: `translate(${x}px, ${y}px)`, position: 'absolute', zIndex } },\n React.createElement(\"div\", { style: { userSelect: 'none', ...remainingStyle }, ...props }, children)));\n }\n}\n", "import { point } from '@turf/helpers';\nimport Supercluster from 'supercluster';\nimport { HtmlOverlay } from './html-overlay';\nexport class HtmlClusterOverlay extends HtmlOverlay {\n _superCluster;\n _lastObjects = null;\n getItems() {\n // supercluster().load() is expensive and we want to run it only\n // when necessary and not for every frame.\n // TODO: Warn if this is running many times / sec\n const newObjects = this.getAllObjects();\n if (newObjects !== this._lastObjects) {\n this._superCluster = new Supercluster(this.getClusterOptions());\n this._superCluster.load(newObjects.map((object) => point(this.getObjectCoordinates(object), { object })));\n this._lastObjects = newObjects;\n // console.log('new Supercluster() run');\n }\n const clusters = this._superCluster.getClusters([-180, -90, 180, 90], Math.round(this.getZoom()));\n return clusters.map(({ geometry: { coordinates }, properties: { cluster, point_count: pointCount, cluster_id: clusterId, object } }) => cluster\n ? this.renderCluster(coordinates, clusterId, pointCount)\n : this.renderObject(coordinates, object));\n }\n getClusterObjects(clusterId) {\n return this._superCluster\n .getLeaves(clusterId, Infinity)\n .map((object) => object.properties.object);\n }\n // Override to provide items that need clustering.\n // If the items have not changed please provide the same array to avoid\n // regeneration of the cluster which causes performance issues.\n getAllObjects() {\n return [];\n }\n // override to provide coordinates for each object of getAllObjects()\n getObjectCoordinates(obj) {\n return [0, 0];\n }\n // Get options object used when instantiating supercluster\n getClusterOptions() {\n return {\n maxZoom: 20\n };\n }\n // override to return an HtmlOverlayItem\n renderObject(coordinates, obj) {\n return null;\n }\n // override to return an HtmlOverlayItem\n // use getClusterObjects() to get cluster contents\n renderCluster(coordinates, clusterId, pointCount) {\n return null;\n }\n}\n", "import * as React from 'react';\nimport { HtmlOverlay } from './html-overlay';\nimport { HtmlOverlayItem } from './html-overlay-item';\nconst styles = {\n tooltip: {\n transform: 'translate(-50%,-100%)',\n backgroundColor: 'rgba(0, 0, 0, 0.3)',\n padding: '4px 8px',\n borderRadius: 8,\n color: 'white'\n }\n};\nconst SHOW_TOOLTIP_TIMEOUT = 250;\nexport class HtmlTooltipOverlay extends HtmlOverlay {\n constructor(props) {\n super(props);\n this.state = { visible: false, pickingInfo: null };\n }\n componentWillMount() {\n this.context.nebula.queryObjectEvents.on('pick', ({ event, pickingInfo }) => {\n if (this.timeoutID !== null) {\n window.clearTimeout(this.timeoutID);\n }\n this.timeoutID = null;\n if (pickingInfo && this._getTooltip(pickingInfo)) {\n this.timeoutID = window.setTimeout(() => {\n this.setState({ visible: true, pickingInfo });\n }, SHOW_TOOLTIP_TIMEOUT);\n }\n else {\n this.setState({ visible: false });\n }\n });\n }\n timeoutID = null;\n state = undefined;\n _getTooltip(pickingInfo) {\n return pickingInfo.object.style.tooltip;\n }\n _makeOverlay() {\n const { pickingInfo } = this.state;\n if (pickingInfo) {\n return (React.createElement(HtmlOverlayItem, { key: 0, coordinates: pickingInfo.lngLat, style: styles.tooltip }, this._getTooltip(pickingInfo)));\n }\n return null;\n }\n getItems() {\n if (this.state.visible) {\n return [this._makeOverlay()];\n }\n return [];\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "PropTypes", "import_react", "import_prop_types", "styled", "React", "PropTypes", "import_react", "React", "React", "import_styled_components", "styled", "Modal", "React", "React", "React", "Supercluster", "React", "styles"]
7
+ }
@@ -0,0 +1,10 @@
1
+ export { LongPressButton } from './components/long-press-button';
2
+ export { ViewControl } from './components/view-control';
3
+ export { PositionedViewControl } from './components/positioned-view-control';
4
+ export { EditorModal as Modal } from './components/modal';
5
+ export { Button } from './components/modal';
6
+ export { Icon } from './components/icon';
7
+ export { HtmlOverlay } from './overlays/html-overlay';
8
+ export { HtmlOverlayItem } from './overlays/html-overlay-item';
9
+ export { HtmlClusterOverlay } from './overlays/html-cluster-overlay';
10
+ export { HtmlTooltipOverlay } from './overlays/html-tooltip-overlay';
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ // Components (originally from @deck.gl-community/react-graph-layers)
2
+ export { LongPressButton } from './components/long-press-button';
3
+ export { ViewControl } from './components/view-control';
4
+ export { PositionedViewControl } from './components/positioned-view-control';
5
+ // Components (originally from @nebula.gl/editor)
6
+ export { EditorModal as Modal } from './components/modal';
7
+ export { Button } from './components/modal';
8
+ export { Icon } from './components/icon';
9
+ // Overlays (originally from @nebula.gl/overlays)
10
+ export { HtmlOverlay } from './overlays/html-overlay';
11
+ export { HtmlOverlayItem } from './overlays/html-overlay-item';
12
+ export { HtmlClusterOverlay } from './overlays/html-cluster-overlay';
13
+ export { HtmlTooltipOverlay } from './overlays/html-tooltip-overlay';
@@ -0,0 +1,13 @@
1
+ import Supercluster from 'supercluster';
2
+ import { HtmlOverlay } from './html-overlay';
3
+ export declare class HtmlClusterOverlay<ObjType> extends HtmlOverlay {
4
+ _superCluster: Supercluster;
5
+ _lastObjects: ObjType[] | null | undefined;
6
+ getItems(): Record<string, any>[];
7
+ getClusterObjects(clusterId: number): ObjType[];
8
+ getAllObjects(): ObjType[];
9
+ getObjectCoordinates(obj: ObjType): [number, number];
10
+ getClusterOptions(): Record<string, any> | null | undefined;
11
+ renderObject(coordinates: number[], obj: ObjType): Record<string, any> | null | undefined;
12
+ renderCluster(coordinates: number[], clusterId: number, pointCount: number): Record<string, any> | null | undefined;
13
+ }
@@ -0,0 +1,53 @@
1
+ import { point } from '@turf/helpers';
2
+ import Supercluster from 'supercluster';
3
+ import { HtmlOverlay } from './html-overlay';
4
+ export class HtmlClusterOverlay extends HtmlOverlay {
5
+ _superCluster;
6
+ _lastObjects = null;
7
+ getItems() {
8
+ // supercluster().load() is expensive and we want to run it only
9
+ // when necessary and not for every frame.
10
+ // TODO: Warn if this is running many times / sec
11
+ const newObjects = this.getAllObjects();
12
+ if (newObjects !== this._lastObjects) {
13
+ this._superCluster = new Supercluster(this.getClusterOptions());
14
+ this._superCluster.load(newObjects.map((object) => point(this.getObjectCoordinates(object), { object })));
15
+ this._lastObjects = newObjects;
16
+ // console.log('new Supercluster() run');
17
+ }
18
+ const clusters = this._superCluster.getClusters([-180, -90, 180, 90], Math.round(this.getZoom()));
19
+ return clusters.map(({ geometry: { coordinates }, properties: { cluster, point_count: pointCount, cluster_id: clusterId, object } }) => cluster
20
+ ? this.renderCluster(coordinates, clusterId, pointCount)
21
+ : this.renderObject(coordinates, object));
22
+ }
23
+ getClusterObjects(clusterId) {
24
+ return this._superCluster
25
+ .getLeaves(clusterId, Infinity)
26
+ .map((object) => object.properties.object);
27
+ }
28
+ // Override to provide items that need clustering.
29
+ // If the items have not changed please provide the same array to avoid
30
+ // regeneration of the cluster which causes performance issues.
31
+ getAllObjects() {
32
+ return [];
33
+ }
34
+ // override to provide coordinates for each object of getAllObjects()
35
+ getObjectCoordinates(obj) {
36
+ return [0, 0];
37
+ }
38
+ // Get options object used when instantiating supercluster
39
+ getClusterOptions() {
40
+ return {
41
+ maxZoom: 20
42
+ };
43
+ }
44
+ // override to return an HtmlOverlayItem
45
+ renderObject(coordinates, obj) {
46
+ return null;
47
+ }
48
+ // override to return an HtmlOverlayItem
49
+ // use getClusterObjects() to get cluster contents
50
+ renderCluster(coordinates, clusterId, pointCount) {
51
+ return null;
52
+ }
53
+ }