@deck.gl-community/widgets 9.2.5 → 9.2.8
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.
- package/README.md +2 -0
- package/dist/index.cjs +17 -5
- package/dist/index.cjs.map +2 -2
- package/dist/widgets/html-overlay-widget.d.ts +7 -1
- package/dist/widgets/html-overlay-widget.d.ts.map +1 -1
- package/dist/widgets/html-overlay-widget.js +19 -5
- package/dist/widgets/html-overlay-widget.js.map +1 -1
- package/package.json +2 -2
- package/src/widgets/html-overlay-widget.tsx +30 -7
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
The deck.gl-community repo is specifically set up to collect useful code that no longer has dedicated maintainers. This means that there is often no one who can respond quickly to issues. The vis.gl / Open Visualization team members who try to keep this running can only put a few hours into it every now and then. It is important to understand this limitation. If your project depends on timely fixes, and you are not able to contribute them yourself, deck.gl-community modules may not be the right choice for you.
|
|
5
5
|
:::
|
|
6
6
|
|
|
7
|
+
[](https://www.npmjs.com/package/@deck.gl-community/widgets)
|
|
8
|
+
[](https://www.npmjs.com/package/@deck.gl-community/widgets)
|
|
7
9
|

|
|
8
10
|

|
|
9
11
|
|
package/dist/index.cjs
CHANGED
|
@@ -502,6 +502,8 @@ var _HtmlOverlayWidget = class extends import_core3.Widget {
|
|
|
502
502
|
className = "deck-widget-html-overlay";
|
|
503
503
|
deck = null;
|
|
504
504
|
viewport = null;
|
|
505
|
+
overlayRoot = null;
|
|
506
|
+
overlayRootInitialized = false;
|
|
505
507
|
constructor(props = {}) {
|
|
506
508
|
super({ ..._HtmlOverlayWidget.defaultProps, ...props });
|
|
507
509
|
this.viewId = props.viewId ?? null;
|
|
@@ -521,6 +523,8 @@ var _HtmlOverlayWidget = class extends import_core3.Widget {
|
|
|
521
523
|
onRemove() {
|
|
522
524
|
this.deck = null;
|
|
523
525
|
this.viewport = null;
|
|
526
|
+
this.overlayRoot = null;
|
|
527
|
+
this.overlayRootInitialized = false;
|
|
524
528
|
}
|
|
525
529
|
onViewportChange(viewport) {
|
|
526
530
|
if (!this.viewId || this.viewId === viewport.id) {
|
|
@@ -575,13 +579,21 @@ var _HtmlOverlayWidget = class extends import_core3.Widget {
|
|
|
575
579
|
onRenderHTML(rootElement) {
|
|
576
580
|
Object.assign(rootElement.style, ROOT_STYLE, { zIndex: `${this.props.zIndex ?? 1}` });
|
|
577
581
|
const viewport = this.getViewport();
|
|
578
|
-
|
|
579
|
-
|
|
582
|
+
const element = viewport ? (() => {
|
|
583
|
+
const overlayItems = this.getOverlayItems(viewport);
|
|
584
|
+
const renderedItems = this.projectItems(overlayItems, viewport);
|
|
585
|
+
return (0, import_jsx_runtime4.jsx)(import_preact4.Fragment, { children: renderedItems });
|
|
586
|
+
})() : null;
|
|
587
|
+
const { onRenderOverlay, onCreateOverlay } = this.props;
|
|
588
|
+
if (onRenderOverlay) {
|
|
589
|
+
if (!this.overlayRootInitialized) {
|
|
590
|
+
this.overlayRoot = (onCreateOverlay == null ? void 0 : onCreateOverlay(rootElement)) ?? null;
|
|
591
|
+
this.overlayRootInitialized = true;
|
|
592
|
+
}
|
|
593
|
+
onRenderOverlay(this.overlayRoot, element, rootElement);
|
|
580
594
|
return;
|
|
581
595
|
}
|
|
582
|
-
|
|
583
|
-
const renderedItems = this.projectItems(overlayItems, viewport);
|
|
584
|
-
(0, import_preact4.render)((0, import_jsx_runtime4.jsx)(import_preact4.Fragment, { children: renderedItems }), rootElement);
|
|
596
|
+
(0, import_preact4.render)(element, rootElement);
|
|
585
597
|
}
|
|
586
598
|
};
|
|
587
599
|
var HtmlOverlayWidget = _HtmlOverlayWidget;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/widgets/pan-widget.tsx", "../src/widgets/long-press-button.tsx", "../src/widgets/view-manager-utils.ts", "../src/widgets/zoom-range-widget.tsx", "../src/widgets/html-overlay-widget.tsx", "../src/widgets/html-overlay-item.tsx", "../src/widgets/html-cluster-widget.ts", "../src/widgets/html-tooltip-widget.tsx"],
|
|
4
|
-
"sourcesContent": ["// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport {PanWidget} from './widgets/pan-widget';\nexport type {PanWidgetProps} from './widgets/pan-widget';\n\nexport {ZoomRangeWidget} from './widgets/zoom-range-widget';\nexport type {ZoomRangeWidgetProps} from './widgets/zoom-range-widget';\n\nexport {HtmlOverlayWidget} from './widgets/html-overlay-widget';\nexport type {HtmlOverlayWidgetProps} from './widgets/html-overlay-widget';\nexport {HtmlOverlayItem} from './widgets/html-overlay-item';\nexport type {HtmlOverlayItemProps} from './widgets/html-overlay-item';\nexport {HtmlClusterWidget} from './widgets/html-cluster-widget';\nexport type {HtmlClusterWidgetProps} from './widgets/html-cluster-widget';\nexport {HtmlTooltipWidget} from './widgets/html-tooltip-widget';\nexport type {HtmlTooltipWidgetProps} from './widgets/html-tooltip-widget';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {render} from 'preact';\nimport type {JSX} from 'preact';\nimport {LongPressButton} from './long-press-button';\nimport {cloneViewState, hasViewManager} from './view-manager-utils';\nimport {\n Widget,\n type Deck,\n type Viewport,\n type WidgetPlacement,\n type WidgetProps\n} from '@deck.gl/core';\n\nexport type PanWidgetProps = WidgetProps & {\n viewId?: string | null;\n placement?: WidgetPlacement;\n /** Amount in screen pixels to pan by when a button is pressed. */\n step?: number;\n};\n\nconst WRAPPER_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'absolute',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n zIndex: '99',\n userSelect: 'none'\n};\n\nconst NAVIGATION_CONTAINER_STYLE: JSX.CSSProperties = {\n position: 'relative',\n background: '#f7f7f7',\n borderRadius: '23px',\n border: '0.5px solid #eaeaea',\n boxShadow: 'inset 11px 11px 5px -7px rgba(230, 230, 230, 0.49)',\n height: '46px',\n width: '46px'\n};\n\nconst NAVIGATION_BUTTON_STYLE: JSX.CSSProperties = {\n color: '#848484',\n cursor: 'pointer',\n position: 'absolute',\n pointerEvents: 'auto'\n};\n\nexport class PanWidget extends Widget<PanWidgetProps> {\n static override defaultProps = {\n id: 'pan',\n viewId: null,\n _container: null,\n placement: 'top-left',\n step: 48,\n style: {},\n className: ''\n } satisfies Required<WidgetProps> & Required<Pick<PanWidgetProps, 'step'>> & PanWidgetProps;\n\n placement: WidgetPlacement = 'top-left';\n className = 'deck-widget-pan';\n deck?: Deck | null = null;\n step: number;\n\n constructor(props: PanWidgetProps = {}) {\n super({...PanWidget.defaultProps, ...props});\n this.viewId = props.viewId ?? null;\n this.placement = props.placement ?? 'top-left';\n this.step = props.step ?? PanWidget.defaultProps.step;\n }\n\n override setProps(props: Partial<PanWidgetProps>): void {\n if (props.viewId !== undefined) {\n this.viewId = props.viewId;\n }\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.step !== undefined) {\n this.step = props.step;\n }\n super.setProps(props);\n }\n\n override onAdd({deck, viewId}: {deck: Deck; viewId: string | null}): void {\n this.deck = deck;\n if (this.viewId === undefined) {\n this.viewId = viewId;\n }\n }\n\n override onRemove(): void {\n this.deck = null;\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n const style = {...WRAPPER_STYLE, ...this.props.style};\n Object.assign(rootElement.style, style);\n\n const buttons = [\n {top: -2, left: 14, onClick: () => this.handlePan(0, this.step), label: '\u25B2', key: 'up'},\n {top: 12, left: 0, onClick: () => this.handlePan(this.step, 0), label: '\u25C0', key: 'left'},\n {top: 12, left: 28, onClick: () => this.handlePan(-this.step, 0), label: '\u25B6', key: 'right'},\n {top: 25, left: 14, onClick: () => this.handlePan(0, -this.step), label: '\u25BC', key: 'down'}\n ] as const;\n\n const ui = (\n <div style={NAVIGATION_CONTAINER_STYLE}>\n {buttons.map((button) => {\n const buttonStyle: JSX.CSSProperties = {\n ...NAVIGATION_BUTTON_STYLE,\n top: `${button.top}px`,\n left: `${button.left}px`\n };\n\n return (\n <div key={button.key} style={buttonStyle}>\n <LongPressButton onClick={button.onClick}>{button.label}</LongPressButton>\n </div>\n );\n })}\n </div>\n );\n\n render(ui, rootElement);\n }\n\n private getTargetViewports(): Viewport[] {\n const deck = this.deck;\n if (!deck) {\n return [];\n }\n\n if (this.viewId) {\n if (hasViewManager(deck)) {\n const viewport = deck.viewManager?.getViewport(this.viewId);\n return viewport ? [viewport] : [];\n }\n return [];\n }\n return deck.getViewports();\n }\n\n private getViewState(viewport: Viewport): any {\n const deck = this.deck;\n const viewManager = hasViewManager(deck) ? deck.viewManager : null;\n const viewId = this.viewId || viewport.id;\n if (viewManager) {\n try {\n return {...viewManager.getViewState(viewId)};\n } catch (err) {\n return cloneViewState(viewManager.viewState);\n }\n }\n return cloneViewState(viewport);\n }\n\n private handlePan(deltaX: number, deltaY: number) {\n if (!this.deck) {\n return;\n }\n\n const viewports = this.getTargetViewports();\n for (const viewport of viewports) {\n const center = viewport.unproject([viewport.width / 2, viewport.height / 2]);\n if (center) {\n const nextPixel: [number, number] = [\n viewport.width / 2 + deltaX,\n viewport.height / 2 + deltaY\n ];\n\n const viewState = this.getViewState(viewport);\n const panUpdate = viewport.panByPosition(center, nextPixel);\n const nextViewState = {...viewState, ...panUpdate};\n const viewId = this.viewId || viewport.id || 'default-view';\n\n // @ts-ignore Using private method until a public alternative is available\n this.deck._onViewStateChange({viewId, viewState: nextViewState, interactionState: {}});\n }\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Component, type ComponentChildren} from 'preact';\n\nconst REPEAT_DELAY_MS = 300;\nconst REPEAT_INTERVAL_MS = 100;\n\nexport type LongPressButtonProps = {\n onClick: () => void;\n children: ComponentChildren;\n};\n\nexport class LongPressButton extends Component<LongPressButtonProps> {\n buttonPressTimer: ReturnType<typeof setTimeout> | null = null;\n usingPointerEvents = false;\n\n private stopEvent(event: Event) {\n event.stopPropagation();\n if (typeof (event as any).stopImmediatePropagation === 'function') {\n (event as any).stopImmediatePropagation();\n }\n if (typeof (event as any).preventDefault === 'function') {\n (event as any).preventDefault();\n }\n }\n\n private repeat = () => {\n if (this.buttonPressTimer) {\n this.props.onClick();\n this.buttonPressTimer = setTimeout(this.repeat, REPEAT_INTERVAL_MS);\n }\n };\n\n private startPress(event: Event) {\n this.stopEvent(event);\n this.props.onClick();\n this.buttonPressTimer = setTimeout(this.repeat, REPEAT_DELAY_MS);\n }\n\n private endPress(event?: Event) {\n if (event) {\n this.stopEvent(event);\n }\n if (this.buttonPressTimer) {\n clearTimeout(this.buttonPressTimer);\n }\n this.buttonPressTimer = null;\n }\n\n private handlePointerDown = (event: PointerEvent) => {\n this.usingPointerEvents = true;\n (event.currentTarget as HTMLElement | null)?.setPointerCapture?.(event.pointerId);\n this.startPress(event);\n };\n\n private handlePointerUp = (event: PointerEvent) => {\n (event.currentTarget as HTMLElement | null)?.releasePointerCapture?.(event.pointerId);\n this.endPress(event);\n };\n\n private handlePointerCancel = (event: PointerEvent) => {\n (event.currentTarget as HTMLElement | null)?.releasePointerCapture?.(event.pointerId);\n this.endPress(event);\n };\n\n private handleMouseDown = (event: MouseEvent) => {\n if (this.usingPointerEvents) {\n return;\n }\n this.startPress(event);\n document.addEventListener('mouseup', this.handleMouseUp, {once: true});\n };\n\n private handleMouseUp = (event: MouseEvent) => {\n if (this.usingPointerEvents) {\n return;\n }\n this.endPress(event);\n };\n\n private handleTouchStart = (event: TouchEvent) => {\n if (this.usingPointerEvents) {\n return;\n }\n this.startPress(event);\n document.addEventListener('touchend', this.handleTouchEnd, {once: true});\n document.addEventListener('touchcancel', this.handleTouchEnd, {once: true});\n };\n\n private handleTouchEnd = (event: TouchEvent) => {\n if (this.usingPointerEvents) {\n return;\n }\n this.endPress(event);\n };\n\n render() {\n return (\n <div className=\"deck-widget-button\">\n <div\n style={{pointerEvents: 'auto'}}\n onPointerDown={this.handlePointerDown}\n onPointerUp={this.handlePointerUp}\n onPointerCancel={this.handlePointerCancel}\n onPointerMove={(event) => this.stopEvent(event)}\n onPointerLeave={this.handlePointerCancel}\n onPointerOut={this.handlePointerCancel}\n onMouseDown={this.handleMouseDown}\n onMouseUp={this.handleMouseUp}\n onMouseMove={(event) => this.stopEvent(event)}\n onTouchStart={this.handleTouchStart}\n onTouchEnd={this.handleTouchEnd}\n onTouchMove={(event) => this.stopEvent(event)}\n onContextMenu={(event) => event.preventDefault()}\n onWheel={(event) => this.stopEvent(event)}\n onClick={(event) => this.stopEvent(event)}\n >\n {this.props.children}\n </div>\n </div>\n );\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Deck, Viewport} from '@deck.gl/core';\n\nexport type DeckWithViewManager = Deck & {\n viewManager?: {\n getViewport: (id: string) => Viewport | null;\n getViewState: (id: string) => any;\n viewState?: any;\n };\n};\n\nexport function hasViewManager(deck: Deck | null): deck is DeckWithViewManager {\n return Boolean(deck && typeof deck === 'object' && 'viewManager' in deck);\n}\n\nexport function cloneViewState(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object') {\n return {...(value as Record<string, unknown>)};\n }\n return {};\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {render} from 'preact';\nimport type {JSX} from 'preact';\nimport {LongPressButton} from './long-press-button';\nimport {cloneViewState, hasViewManager} from './view-manager-utils';\nimport {\n Widget,\n type Deck,\n type Viewport,\n type WidgetPlacement,\n type WidgetProps\n} from '@deck.gl/core';\n\nexport type ZoomRangeWidgetProps = WidgetProps & {\n viewId?: string | null;\n placement?: WidgetPlacement;\n minZoom?: number;\n maxZoom?: number;\n step?: number;\n};\n\nconst WRAPPER_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'absolute',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n background: '#f7f7f7',\n border: '0.5px solid #eaeaea',\n marginTop: '6px',\n padding: '2px 0',\n width: '18px',\n userSelect: 'none',\n pointerEvents: 'auto'\n};\n\nconst ZOOM_BUTTON_STYLE: JSX.CSSProperties = {\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: '500',\n margin: '-4px'\n};\n\nconst SLIDER_CONTAINER_STYLE: JSX.CSSProperties = {\n display: 'inline-block',\n height: '100px',\n padding: '0',\n width: '10px'\n};\n\nconst VERTICAL_SLIDER_STYLE: JSX.CSSProperties = {\n writingMode: 'vertical-lr',\n height: '100px',\n padding: '0',\n margin: '0',\n width: '10px'\n};\n\nexport class ZoomRangeWidget extends Widget<ZoomRangeWidgetProps> {\n static override defaultProps = {\n id: 'zoom-range',\n viewId: null,\n _container: null,\n placement: 'top-left',\n minZoom: undefined,\n maxZoom: undefined,\n step: 0.1,\n style: {},\n className: ''\n } satisfies Required<WidgetProps> &\n Required<Pick<ZoomRangeWidgetProps, 'step'>> &\n ZoomRangeWidgetProps;\n\n placement: WidgetPlacement = 'top-left';\n className = 'deck-widget-zoom-range';\n deck?: Deck | null = null;\n step: number;\n currentZoom = 0;\n inferredMinZoom: number | null = null;\n inferredMaxZoom: number | null = null;\n\n constructor(props: ZoomRangeWidgetProps = {}) {\n super({...ZoomRangeWidget.defaultProps, ...props});\n this.viewId = props.viewId ?? null;\n this.placement = props.placement ?? 'top-left';\n this.step = props.step ?? ZoomRangeWidget.defaultProps.step;\n }\n\n override setProps(props: Partial<ZoomRangeWidgetProps>): void {\n if (props.viewId !== undefined) {\n this.viewId = props.viewId;\n }\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.step !== undefined) {\n this.step = props.step;\n }\n super.setProps(props);\n }\n\n override onAdd({deck, viewId}: {deck: Deck; viewId: string | null}): void {\n this.deck = deck;\n if (this.viewId === undefined) {\n this.viewId = viewId;\n }\n }\n\n override onRemove(): void {\n this.deck = null;\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n const style = {...WRAPPER_STYLE, ...this.props.style};\n Object.assign(rootElement.style, style);\n\n const {minZoom, maxZoom} = this.getZoomBounds();\n const clampedZoom = Math.max(minZoom, Math.min(maxZoom, this.currentZoom));\n\n const stopEventPropagation = (event: Event) => {\n event.stopPropagation();\n if (typeof (event as any).stopImmediatePropagation === 'function') {\n (event as any).stopImmediatePropagation();\n }\n };\n\n const ui = (\n <>\n <div style={ZOOM_BUTTON_STYLE}>\n <LongPressButton onClick={() => this.handleZoomDelta(this.step)}>{'+'}</LongPressButton>\n </div>\n <div\n style={SLIDER_CONTAINER_STYLE}\n onPointerDown={stopEventPropagation}\n onPointerMove={stopEventPropagation}\n onPointerUp={stopEventPropagation}\n onMouseDown={stopEventPropagation}\n onMouseMove={stopEventPropagation}\n onMouseUp={stopEventPropagation}\n onClick={stopEventPropagation}\n onWheel={stopEventPropagation}\n onTouchStart={stopEventPropagation}\n onTouchMove={stopEventPropagation}\n onTouchEnd={stopEventPropagation}\n >\n <input\n type=\"range\"\n value={clampedZoom}\n min={minZoom}\n max={maxZoom}\n step={this.step}\n onInput={(event) => this.handleZoomTo(Number((event.target as HTMLInputElement).value))}\n onChange={(event) =>\n this.handleZoomTo(Number((event.target as HTMLInputElement).value))\n }\n onPointerDown={stopEventPropagation}\n onPointerMove={stopEventPropagation}\n onPointerUp={stopEventPropagation}\n onMouseDown={stopEventPropagation}\n onMouseMove={stopEventPropagation}\n onMouseUp={stopEventPropagation}\n onClick={stopEventPropagation}\n onWheel={stopEventPropagation}\n onTouchStart={stopEventPropagation}\n onTouchMove={stopEventPropagation}\n onTouchEnd={stopEventPropagation}\n /* @ts-expect-error - non-standard attribute for vertical sliders */\n orient=\"vertical\"\n style={VERTICAL_SLIDER_STYLE}\n />\n </div>\n <div style={ZOOM_BUTTON_STYLE}>\n <LongPressButton onClick={() => this.handleZoomDelta(-this.step)}>{'-'}</LongPressButton>\n </div>\n </>\n );\n\n render(ui, rootElement);\n }\n\n override onViewportChange(viewport: Viewport): void {\n const viewState = this.getViewState(viewport);\n const zoom = Number(viewState?.zoom);\n if (Number.isFinite(zoom)) {\n this.currentZoom = zoom;\n }\n\n if (this.props.minZoom === undefined) {\n const minZoom = Number(viewState?.minZoom);\n if (Number.isFinite(minZoom)) {\n this.inferredMinZoom = minZoom;\n }\n }\n\n if (this.props.maxZoom === undefined) {\n const maxZoom = Number(viewState?.maxZoom);\n if (Number.isFinite(maxZoom)) {\n this.inferredMaxZoom = maxZoom;\n }\n }\n\n this.updateHTML();\n }\n\n private getZoomBounds(): {minZoom: number; maxZoom: number} {\n const minZoom = this.props.minZoom ?? this.inferredMinZoom ?? Number.NEGATIVE_INFINITY;\n const maxZoom = this.props.maxZoom ?? this.inferredMaxZoom ?? Number.POSITIVE_INFINITY;\n\n if (minZoom > maxZoom) {\n return {minZoom: maxZoom, maxZoom: minZoom};\n }\n return {\n minZoom: Number.isFinite(minZoom) ? minZoom : -20,\n maxZoom: Number.isFinite(maxZoom) ? maxZoom : 20\n };\n }\n\n private getTargetViewports(): Viewport[] {\n const deck = this.deck;\n if (!deck) {\n return [];\n }\n if (this.viewId) {\n if (hasViewManager(deck)) {\n const viewport = deck.viewManager?.getViewport(this.viewId);\n return viewport ? [viewport] : [];\n }\n return [];\n }\n return deck.getViewports();\n }\n\n private getViewState(viewport: Viewport): any {\n const deck = this.deck;\n const viewManager = hasViewManager(deck) ? deck.viewManager : null;\n const viewId = this.viewId || viewport.id;\n if (viewManager) {\n try {\n return {...viewManager.getViewState(viewId)};\n } catch (err) {\n return cloneViewState(viewManager.viewState);\n }\n }\n return cloneViewState(viewport);\n }\n\n private handleZoomDelta(delta: number) {\n const {minZoom, maxZoom} = this.getZoomBounds();\n\n for (const viewport of this.getTargetViewports()) {\n const viewState = this.getViewState(viewport);\n const baseZoom = Number(viewState.zoom);\n const current = Number.isFinite(baseZoom) ? baseZoom : this.currentZoom;\n const nextZoom = Math.max(minZoom, Math.min(maxZoom, current + delta));\n this.updateViewState(viewport, {...viewState, zoom: nextZoom});\n }\n }\n\n private handleZoomTo(zoom: number) {\n const {minZoom, maxZoom} = this.getZoomBounds();\n const nextZoom = Math.max(minZoom, Math.min(maxZoom, zoom));\n\n for (const viewport of this.getTargetViewports()) {\n const viewState = this.getViewState(viewport);\n this.updateViewState(viewport, {...viewState, zoom: nextZoom});\n }\n }\n\n private updateViewState(viewport: Viewport, viewState: any) {\n if (!this.deck) {\n return;\n }\n\n const viewId = this.viewId || viewport.id || 'default-view';\n this.currentZoom = Number(viewState.zoom) || this.currentZoom;\n this.updateHTML();\n\n // @ts-ignore Using private method until a public alternative is available\n this.deck._onViewStateChange({viewId, viewState, interactionState: {}});\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n cloneElement,\n render,\n toChildArray,\n Fragment,\n type ComponentChildren,\n type VNode\n} from 'preact';\nimport type {Deck, Viewport, WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport {Widget} from '@deck.gl/core';\n\nexport type HtmlOverlayWidgetProps = WidgetProps & {\n /** View id to attach the overlay to. Defaults to the containing view. */\n viewId?: string | null;\n /** Margin beyond the viewport before hiding overlay items. */\n overflowMargin?: number;\n /** z-index for the overlay container. */\n zIndex?: number;\n /** Items to render; defaults to the supplied children. */\n items?: ComponentChildren;\n};\n\nconst ROOT_STYLE: Partial<CSSStyleDeclaration> = {\n width: '100%',\n height: '100%',\n position: 'absolute',\n pointerEvents: 'none',\n overflow: 'hidden'\n};\n\nexport class HtmlOverlayWidget<\n PropsT extends HtmlOverlayWidgetProps = HtmlOverlayWidgetProps\n> extends Widget<PropsT> {\n static override defaultProps = {\n id: 'html-overlay',\n viewId: null,\n _container: null,\n overflowMargin: 0,\n zIndex: 1,\n style: {},\n className: ''\n } satisfies Required<WidgetProps> &\n Required<Pick<HtmlOverlayWidgetProps, 'overflowMargin' | 'zIndex'>> &\n HtmlOverlayWidgetProps;\n\n placement: WidgetPlacement = 'fill';\n className = 'deck-widget-html-overlay';\n deck?: Deck | null = null;\n protected viewport: Viewport | null = null;\n\n constructor(props: PropsT = {} as PropsT) {\n super({...HtmlOverlayWidget.defaultProps, ...props});\n this.viewId = props.viewId ?? null;\n }\n\n override setProps(props: Partial<PropsT>): void {\n if (props.viewId !== undefined) {\n this.viewId = props.viewId;\n }\n super.setProps(props);\n }\n\n override onAdd({deck, viewId}: {deck: Deck; viewId: string | null}): void {\n this.deck = deck;\n if (this.viewId === undefined) {\n this.viewId = viewId;\n }\n }\n\n override onRemove(): void {\n this.deck = null;\n this.viewport = null;\n }\n\n override onViewportChange(viewport: Viewport): void {\n if (!this.viewId || this.viewId === viewport.id) {\n this.viewport = viewport;\n this.updateHTML();\n }\n }\n\n protected getViewport(): Viewport | null {\n return this.viewport;\n }\n\n protected getZoom(): number {\n return this.viewport?.zoom ?? 0;\n }\n\n protected scaleWithZoom(n: number): number {\n return n / Math.pow(2, 20 - this.getZoom());\n }\n\n protected breakpointWithZoom<T>(threshold: number, a: T, b: T): T {\n return this.getZoom() > threshold ? a : b;\n }\n\n protected getCoords(viewport: Viewport, coordinates: number[]): [number, number] {\n const pos = viewport.project(coordinates);\n if (!pos) return [-1, -1];\n return pos as [number, number];\n }\n\n protected inView(viewport: Viewport, [x, y]: number[]): boolean {\n const overflowMargin = this.props.overflowMargin ?? 0;\n const {width, height} = viewport;\n return !(\n x < -overflowMargin ||\n y < -overflowMargin ||\n x > width + overflowMargin ||\n y > height + overflowMargin\n );\n }\n\n protected getOverlayItems(viewport: Viewport): VNode[] {\n const {items} = this.props;\n return (items ? toChildArray(items) : []) as VNode[];\n }\n\n protected projectItems(items: VNode[], viewport: Viewport): VNode[] {\n const renderItems: VNode[] = [];\n items.filter(Boolean).forEach((item, index) => {\n const coordinates = (item.props as any)?.coordinates;\n if (!coordinates) {\n return;\n }\n const [x, y] = this.getCoords(viewport, coordinates);\n if (this.inView(viewport, [x, y])) {\n const key = item.key === null || item.key === undefined ? index : item.key;\n renderItems.push(cloneElement(item, {x, y, key}));\n }\n });\n\n return renderItems;\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n Object.assign(rootElement.style, ROOT_STYLE, {zIndex: `${this.props.zIndex ?? 1}`});\n\n const viewport = this.getViewport();\n if (!viewport) {\n render(null, rootElement);\n return;\n }\n\n const overlayItems = this.getOverlayItems(viewport);\n const renderedItems = this.projectItems(overlayItems, viewport);\n\n render(<Fragment>{renderedItems}</Fragment>, rootElement);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ComponentChildren, JSX} from 'preact';\n\nexport type HtmlOverlayItemProps = {\n /** Injected by HtmlOverlayWidget */\n x?: number;\n /** Injected by HtmlOverlayWidget */\n y?: number;\n\n /** Coordinates of this overlay in [lng, lat] (and optional z). */\n coordinates: number[];\n children?: ComponentChildren;\n style?: JSX.CSSProperties;\n};\n\nexport function HtmlOverlayItem({x = 0, y = 0, children, style, ...props}: HtmlOverlayItemProps) {\n const {zIndex = 'auto', ...remainingStyle} = style || {};\n\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 <div\n style={{transform: `translate(${x}px, ${y}px)`, position: 'absolute', zIndex: `${zIndex}`}}\n >\n <div style={{userSelect: 'none', ...remainingStyle}} {...props}>\n {children}\n </div>\n </div>\n );\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {point} from '@turf/helpers';\nimport Supercluster from 'supercluster';\nimport type {VNode} from 'preact';\n\nimport type {WidgetProps, Viewport} from '@deck.gl/core';\nimport {HtmlOverlayWidget, type HtmlOverlayWidgetProps} from './html-overlay-widget';\n\nexport type HtmlClusterWidgetProps = HtmlOverlayWidgetProps & WidgetProps;\n\nexport abstract class HtmlClusterWidget<ObjType> extends HtmlOverlayWidget<HtmlClusterWidgetProps> {\n static override defaultProps = {\n ...HtmlOverlayWidget.defaultProps,\n id: 'html-cluster-overlay'\n } satisfies Required<WidgetProps> & HtmlClusterWidgetProps;\n\n protected superCluster: Supercluster | null = null;\n protected lastObjects: ObjType[] | null = null;\n\n protected override getOverlayItems(viewport: Viewport): VNode[] {\n const newObjects = this.getAllObjects();\n if (newObjects !== this.lastObjects) {\n this.superCluster = new Supercluster(this.getClusterOptions());\n this.superCluster.load(\n newObjects.map((object) => point(this.getObjectCoordinates(object), {object}))\n );\n this.lastObjects = newObjects;\n }\n\n const clusters =\n this.superCluster?.getClusters([-180, -90, 180, 90], Math.round(this.getZoom())) ?? [];\n\n const overlayItems = clusters.map(\n ({\n geometry: {coordinates},\n properties: {cluster, point_count: pointCount, cluster_id: clusterId, object}\n }) =>\n cluster\n ? this.renderCluster(coordinates, clusterId, pointCount)\n : this.renderObject(coordinates, object)\n );\n\n return overlayItems.filter(Boolean) as VNode[];\n }\n\n getClusterObjects(clusterId: number): ObjType[] {\n return (\n this.superCluster\n ?.getLeaves(clusterId, Infinity)\n .map((leaf) => leaf.properties.object as ObjType) ?? []\n );\n }\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 abstract getAllObjects(): ObjType[];\n\n // Override to provide coordinates for each object of getAllObjects()\n abstract getObjectCoordinates(obj: ObjType): [number, number];\n\n // Get options object used when instantiating supercluster\n getClusterOptions(): Record<string, any> {\n return {\n maxZoom: 20\n };\n }\n\n // Override to return an HtmlOverlayItem\n abstract renderObject(\n coordinates: number[],\n obj: ObjType\n ): VNode<Record<string, any>> | null | undefined;\n\n // Override to return an HtmlOverlayItem\n // use getClusterObjects() to get cluster contents\n abstract renderCluster(\n coordinates: number[],\n clusterId: number,\n pointCount: number\n ): VNode<Record<string, any>> | null | undefined;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ComponentChildren, VNode} from 'preact';\nimport type {PickingInfo, WidgetProps, Viewport} from '@deck.gl/core';\nimport {HtmlOverlayItem} from './html-overlay-item';\nimport {HtmlOverlayWidget, type HtmlOverlayWidgetProps} from './html-overlay-widget';\n\nexport type HtmlTooltipWidgetProps = HtmlOverlayWidgetProps & {\n /** Delay before showing the tooltip (ms). */\n showDelay?: number;\n /** Extract a tooltip string or node from picking info. */\n getTooltip?: (pickingInfo: PickingInfo) => ComponentChildren;\n};\n\nconst TOOLTIP_STYLE = {\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;\n\nfunction defaultGetTooltip(pickingInfo: PickingInfo): ComponentChildren {\n return pickingInfo.object?.style?.tooltip;\n}\n\nexport class HtmlTooltipWidget extends HtmlOverlayWidget<HtmlTooltipWidgetProps> {\n static override defaultProps = {\n ...HtmlOverlayWidget.defaultProps,\n id: 'html-tooltip-overlay',\n showDelay: SHOW_TOOLTIP_TIMEOUT,\n getTooltip: defaultGetTooltip\n } satisfies Required<WidgetProps> &\n Required<Pick<HtmlTooltipWidgetProps, 'showDelay' | 'getTooltip'>> &\n HtmlTooltipWidgetProps;\n\n private timeoutID: ReturnType<typeof globalThis.setTimeout> | null = null;\n private pickingInfo: PickingInfo | null = null;\n private visible = false;\n\n override onRemove(): void {\n if (this.timeoutID !== null) {\n globalThis.clearTimeout(this.timeoutID);\n this.timeoutID = null;\n }\n this.visible = false;\n this.pickingInfo = null;\n }\n\n override onHover(pickingInfo: PickingInfo): void {\n if (this.timeoutID !== null) {\n globalThis.clearTimeout(this.timeoutID);\n this.timeoutID = null;\n }\n\n const tooltipContent = this.props.getTooltip?.(pickingInfo);\n\n if (pickingInfo && tooltipContent) {\n const delay = this.props.showDelay ?? SHOW_TOOLTIP_TIMEOUT;\n this.timeoutID = globalThis.setTimeout(() => {\n this.visible = true;\n this.pickingInfo = pickingInfo;\n this.updateHTML();\n }, delay);\n } else {\n this.visible = false;\n this.pickingInfo = null;\n this.updateHTML();\n }\n }\n\n protected override getOverlayItems(viewport: Viewport): VNode[] {\n if (!this.visible || !this.pickingInfo) {\n return [];\n }\n\n const tooltipContent = this.props.getTooltip?.(this.pickingInfo);\n const coordinates =\n this.pickingInfo.coordinate ??\n (this.pickingInfo as Partial<{lngLat: number[]}>).lngLat ??\n null;\n if (!tooltipContent || !coordinates) {\n return [];\n }\n\n return [\n <HtmlOverlayItem key=\"tooltip\" coordinates={coordinates} style={TOOLTIP_STYLE}>\n {tooltipContent}\n </HtmlOverlayItem>\n ];\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport {PanWidget} from './widgets/pan-widget';\nexport type {PanWidgetProps} from './widgets/pan-widget';\n\nexport {ZoomRangeWidget} from './widgets/zoom-range-widget';\nexport type {ZoomRangeWidgetProps} from './widgets/zoom-range-widget';\n\nexport {HtmlOverlayWidget} from './widgets/html-overlay-widget';\nexport type {HtmlOverlayWidgetProps} from './widgets/html-overlay-widget';\nexport {HtmlOverlayItem} from './widgets/html-overlay-item';\nexport type {HtmlOverlayItemProps} from './widgets/html-overlay-item';\nexport {HtmlClusterWidget} from './widgets/html-cluster-widget';\nexport type {HtmlClusterWidgetProps} from './widgets/html-cluster-widget';\nexport {HtmlTooltipWidget} from './widgets/html-tooltip-widget';\nexport type {HtmlTooltipWidgetProps} from './widgets/html-tooltip-widget';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {render} from 'preact';\nimport type {JSX} from 'preact';\nimport {LongPressButton} from './long-press-button';\nimport {cloneViewState, hasViewManager} from './view-manager-utils';\nimport {\n Widget,\n type Deck,\n type Viewport,\n type WidgetPlacement,\n type WidgetProps\n} from '@deck.gl/core';\n\nexport type PanWidgetProps = WidgetProps & {\n viewId?: string | null;\n placement?: WidgetPlacement;\n /** Amount in screen pixels to pan by when a button is pressed. */\n step?: number;\n};\n\nconst WRAPPER_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'absolute',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n zIndex: '99',\n userSelect: 'none'\n};\n\nconst NAVIGATION_CONTAINER_STYLE: JSX.CSSProperties = {\n position: 'relative',\n background: '#f7f7f7',\n borderRadius: '23px',\n border: '0.5px solid #eaeaea',\n boxShadow: 'inset 11px 11px 5px -7px rgba(230, 230, 230, 0.49)',\n height: '46px',\n width: '46px'\n};\n\nconst NAVIGATION_BUTTON_STYLE: JSX.CSSProperties = {\n color: '#848484',\n cursor: 'pointer',\n position: 'absolute',\n pointerEvents: 'auto'\n};\n\nexport class PanWidget extends Widget<PanWidgetProps> {\n static override defaultProps = {\n id: 'pan',\n viewId: null,\n _container: null,\n placement: 'top-left',\n step: 48,\n style: {},\n className: ''\n } satisfies Required<WidgetProps> & Required<Pick<PanWidgetProps, 'step'>> & PanWidgetProps;\n\n placement: WidgetPlacement = 'top-left';\n className = 'deck-widget-pan';\n deck?: Deck | null = null;\n step: number;\n\n constructor(props: PanWidgetProps = {}) {\n super({...PanWidget.defaultProps, ...props});\n this.viewId = props.viewId ?? null;\n this.placement = props.placement ?? 'top-left';\n this.step = props.step ?? PanWidget.defaultProps.step;\n }\n\n override setProps(props: Partial<PanWidgetProps>): void {\n if (props.viewId !== undefined) {\n this.viewId = props.viewId;\n }\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.step !== undefined) {\n this.step = props.step;\n }\n super.setProps(props);\n }\n\n override onAdd({deck, viewId}: {deck: Deck; viewId: string | null}): void {\n this.deck = deck;\n if (this.viewId === undefined) {\n this.viewId = viewId;\n }\n }\n\n override onRemove(): void {\n this.deck = null;\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n const style = {...WRAPPER_STYLE, ...this.props.style};\n Object.assign(rootElement.style, style);\n\n const buttons = [\n {top: -2, left: 14, onClick: () => this.handlePan(0, this.step), label: '\u25B2', key: 'up'},\n {top: 12, left: 0, onClick: () => this.handlePan(this.step, 0), label: '\u25C0', key: 'left'},\n {top: 12, left: 28, onClick: () => this.handlePan(-this.step, 0), label: '\u25B6', key: 'right'},\n {top: 25, left: 14, onClick: () => this.handlePan(0, -this.step), label: '\u25BC', key: 'down'}\n ] as const;\n\n const ui = (\n <div style={NAVIGATION_CONTAINER_STYLE}>\n {buttons.map((button) => {\n const buttonStyle: JSX.CSSProperties = {\n ...NAVIGATION_BUTTON_STYLE,\n top: `${button.top}px`,\n left: `${button.left}px`\n };\n\n return (\n <div key={button.key} style={buttonStyle}>\n <LongPressButton onClick={button.onClick}>{button.label}</LongPressButton>\n </div>\n );\n })}\n </div>\n );\n\n render(ui, rootElement);\n }\n\n private getTargetViewports(): Viewport[] {\n const deck = this.deck;\n if (!deck) {\n return [];\n }\n\n if (this.viewId) {\n if (hasViewManager(deck)) {\n const viewport = deck.viewManager?.getViewport(this.viewId);\n return viewport ? [viewport] : [];\n }\n return [];\n }\n return deck.getViewports();\n }\n\n private getViewState(viewport: Viewport): any {\n const deck = this.deck;\n const viewManager = hasViewManager(deck) ? deck.viewManager : null;\n const viewId = this.viewId || viewport.id;\n if (viewManager) {\n try {\n return {...viewManager.getViewState(viewId)};\n } catch (err) {\n return cloneViewState(viewManager.viewState);\n }\n }\n return cloneViewState(viewport);\n }\n\n private handlePan(deltaX: number, deltaY: number) {\n if (!this.deck) {\n return;\n }\n\n const viewports = this.getTargetViewports();\n for (const viewport of viewports) {\n const center = viewport.unproject([viewport.width / 2, viewport.height / 2]);\n if (center) {\n const nextPixel: [number, number] = [\n viewport.width / 2 + deltaX,\n viewport.height / 2 + deltaY\n ];\n\n const viewState = this.getViewState(viewport);\n const panUpdate = viewport.panByPosition(center, nextPixel);\n const nextViewState = {...viewState, ...panUpdate};\n const viewId = this.viewId || viewport.id || 'default-view';\n\n // @ts-ignore Using private method until a public alternative is available\n this.deck._onViewStateChange({viewId, viewState: nextViewState, interactionState: {}});\n }\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Component, type ComponentChildren} from 'preact';\n\nconst REPEAT_DELAY_MS = 300;\nconst REPEAT_INTERVAL_MS = 100;\n\nexport type LongPressButtonProps = {\n onClick: () => void;\n children: ComponentChildren;\n};\n\nexport class LongPressButton extends Component<LongPressButtonProps> {\n buttonPressTimer: ReturnType<typeof setTimeout> | null = null;\n usingPointerEvents = false;\n\n private stopEvent(event: Event) {\n event.stopPropagation();\n if (typeof (event as any).stopImmediatePropagation === 'function') {\n (event as any).stopImmediatePropagation();\n }\n if (typeof (event as any).preventDefault === 'function') {\n (event as any).preventDefault();\n }\n }\n\n private repeat = () => {\n if (this.buttonPressTimer) {\n this.props.onClick();\n this.buttonPressTimer = setTimeout(this.repeat, REPEAT_INTERVAL_MS);\n }\n };\n\n private startPress(event: Event) {\n this.stopEvent(event);\n this.props.onClick();\n this.buttonPressTimer = setTimeout(this.repeat, REPEAT_DELAY_MS);\n }\n\n private endPress(event?: Event) {\n if (event) {\n this.stopEvent(event);\n }\n if (this.buttonPressTimer) {\n clearTimeout(this.buttonPressTimer);\n }\n this.buttonPressTimer = null;\n }\n\n private handlePointerDown = (event: PointerEvent) => {\n this.usingPointerEvents = true;\n (event.currentTarget as HTMLElement | null)?.setPointerCapture?.(event.pointerId);\n this.startPress(event);\n };\n\n private handlePointerUp = (event: PointerEvent) => {\n (event.currentTarget as HTMLElement | null)?.releasePointerCapture?.(event.pointerId);\n this.endPress(event);\n };\n\n private handlePointerCancel = (event: PointerEvent) => {\n (event.currentTarget as HTMLElement | null)?.releasePointerCapture?.(event.pointerId);\n this.endPress(event);\n };\n\n private handleMouseDown = (event: MouseEvent) => {\n if (this.usingPointerEvents) {\n return;\n }\n this.startPress(event);\n document.addEventListener('mouseup', this.handleMouseUp, {once: true});\n };\n\n private handleMouseUp = (event: MouseEvent) => {\n if (this.usingPointerEvents) {\n return;\n }\n this.endPress(event);\n };\n\n private handleTouchStart = (event: TouchEvent) => {\n if (this.usingPointerEvents) {\n return;\n }\n this.startPress(event);\n document.addEventListener('touchend', this.handleTouchEnd, {once: true});\n document.addEventListener('touchcancel', this.handleTouchEnd, {once: true});\n };\n\n private handleTouchEnd = (event: TouchEvent) => {\n if (this.usingPointerEvents) {\n return;\n }\n this.endPress(event);\n };\n\n render() {\n return (\n <div className=\"deck-widget-button\">\n <div\n style={{pointerEvents: 'auto'}}\n onPointerDown={this.handlePointerDown}\n onPointerUp={this.handlePointerUp}\n onPointerCancel={this.handlePointerCancel}\n onPointerMove={(event) => this.stopEvent(event)}\n onPointerLeave={this.handlePointerCancel}\n onPointerOut={this.handlePointerCancel}\n onMouseDown={this.handleMouseDown}\n onMouseUp={this.handleMouseUp}\n onMouseMove={(event) => this.stopEvent(event)}\n onTouchStart={this.handleTouchStart}\n onTouchEnd={this.handleTouchEnd}\n onTouchMove={(event) => this.stopEvent(event)}\n onContextMenu={(event) => event.preventDefault()}\n onWheel={(event) => this.stopEvent(event)}\n onClick={(event) => this.stopEvent(event)}\n >\n {this.props.children}\n </div>\n </div>\n );\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Deck, Viewport} from '@deck.gl/core';\n\nexport type DeckWithViewManager = Deck & {\n viewManager?: {\n getViewport: (id: string) => Viewport | null;\n getViewState: (id: string) => any;\n viewState?: any;\n };\n};\n\nexport function hasViewManager(deck: Deck | null): deck is DeckWithViewManager {\n return Boolean(deck && typeof deck === 'object' && 'viewManager' in deck);\n}\n\nexport function cloneViewState(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object') {\n return {...(value as Record<string, unknown>)};\n }\n return {};\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {render} from 'preact';\nimport type {JSX} from 'preact';\nimport {LongPressButton} from './long-press-button';\nimport {cloneViewState, hasViewManager} from './view-manager-utils';\nimport {\n Widget,\n type Deck,\n type Viewport,\n type WidgetPlacement,\n type WidgetProps\n} from '@deck.gl/core';\n\nexport type ZoomRangeWidgetProps = WidgetProps & {\n viewId?: string | null;\n placement?: WidgetPlacement;\n minZoom?: number;\n maxZoom?: number;\n step?: number;\n};\n\nconst WRAPPER_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'absolute',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n background: '#f7f7f7',\n border: '0.5px solid #eaeaea',\n marginTop: '6px',\n padding: '2px 0',\n width: '18px',\n userSelect: 'none',\n pointerEvents: 'auto'\n};\n\nconst ZOOM_BUTTON_STYLE: JSX.CSSProperties = {\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: '500',\n margin: '-4px'\n};\n\nconst SLIDER_CONTAINER_STYLE: JSX.CSSProperties = {\n display: 'inline-block',\n height: '100px',\n padding: '0',\n width: '10px'\n};\n\nconst VERTICAL_SLIDER_STYLE: JSX.CSSProperties = {\n writingMode: 'vertical-lr',\n height: '100px',\n padding: '0',\n margin: '0',\n width: '10px'\n};\n\nexport class ZoomRangeWidget extends Widget<ZoomRangeWidgetProps> {\n static override defaultProps = {\n id: 'zoom-range',\n viewId: null,\n _container: null,\n placement: 'top-left',\n minZoom: undefined,\n maxZoom: undefined,\n step: 0.1,\n style: {},\n className: ''\n } satisfies Required<WidgetProps> &\n Required<Pick<ZoomRangeWidgetProps, 'step'>> &\n ZoomRangeWidgetProps;\n\n placement: WidgetPlacement = 'top-left';\n className = 'deck-widget-zoom-range';\n deck?: Deck | null = null;\n step: number;\n currentZoom = 0;\n inferredMinZoom: number | null = null;\n inferredMaxZoom: number | null = null;\n\n constructor(props: ZoomRangeWidgetProps = {}) {\n super({...ZoomRangeWidget.defaultProps, ...props});\n this.viewId = props.viewId ?? null;\n this.placement = props.placement ?? 'top-left';\n this.step = props.step ?? ZoomRangeWidget.defaultProps.step;\n }\n\n override setProps(props: Partial<ZoomRangeWidgetProps>): void {\n if (props.viewId !== undefined) {\n this.viewId = props.viewId;\n }\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.step !== undefined) {\n this.step = props.step;\n }\n super.setProps(props);\n }\n\n override onAdd({deck, viewId}: {deck: Deck; viewId: string | null}): void {\n this.deck = deck;\n if (this.viewId === undefined) {\n this.viewId = viewId;\n }\n }\n\n override onRemove(): void {\n this.deck = null;\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n const style = {...WRAPPER_STYLE, ...this.props.style};\n Object.assign(rootElement.style, style);\n\n const {minZoom, maxZoom} = this.getZoomBounds();\n const clampedZoom = Math.max(minZoom, Math.min(maxZoom, this.currentZoom));\n\n const stopEventPropagation = (event: Event) => {\n event.stopPropagation();\n if (typeof (event as any).stopImmediatePropagation === 'function') {\n (event as any).stopImmediatePropagation();\n }\n };\n\n const ui = (\n <>\n <div style={ZOOM_BUTTON_STYLE}>\n <LongPressButton onClick={() => this.handleZoomDelta(this.step)}>{'+'}</LongPressButton>\n </div>\n <div\n style={SLIDER_CONTAINER_STYLE}\n onPointerDown={stopEventPropagation}\n onPointerMove={stopEventPropagation}\n onPointerUp={stopEventPropagation}\n onMouseDown={stopEventPropagation}\n onMouseMove={stopEventPropagation}\n onMouseUp={stopEventPropagation}\n onClick={stopEventPropagation}\n onWheel={stopEventPropagation}\n onTouchStart={stopEventPropagation}\n onTouchMove={stopEventPropagation}\n onTouchEnd={stopEventPropagation}\n >\n <input\n type=\"range\"\n value={clampedZoom}\n min={minZoom}\n max={maxZoom}\n step={this.step}\n onInput={(event) => this.handleZoomTo(Number((event.target as HTMLInputElement).value))}\n onChange={(event) =>\n this.handleZoomTo(Number((event.target as HTMLInputElement).value))\n }\n onPointerDown={stopEventPropagation}\n onPointerMove={stopEventPropagation}\n onPointerUp={stopEventPropagation}\n onMouseDown={stopEventPropagation}\n onMouseMove={stopEventPropagation}\n onMouseUp={stopEventPropagation}\n onClick={stopEventPropagation}\n onWheel={stopEventPropagation}\n onTouchStart={stopEventPropagation}\n onTouchMove={stopEventPropagation}\n onTouchEnd={stopEventPropagation}\n /* @ts-expect-error - non-standard attribute for vertical sliders */\n orient=\"vertical\"\n style={VERTICAL_SLIDER_STYLE}\n />\n </div>\n <div style={ZOOM_BUTTON_STYLE}>\n <LongPressButton onClick={() => this.handleZoomDelta(-this.step)}>{'-'}</LongPressButton>\n </div>\n </>\n );\n\n render(ui, rootElement);\n }\n\n override onViewportChange(viewport: Viewport): void {\n const viewState = this.getViewState(viewport);\n const zoom = Number(viewState?.zoom);\n if (Number.isFinite(zoom)) {\n this.currentZoom = zoom;\n }\n\n if (this.props.minZoom === undefined) {\n const minZoom = Number(viewState?.minZoom);\n if (Number.isFinite(minZoom)) {\n this.inferredMinZoom = minZoom;\n }\n }\n\n if (this.props.maxZoom === undefined) {\n const maxZoom = Number(viewState?.maxZoom);\n if (Number.isFinite(maxZoom)) {\n this.inferredMaxZoom = maxZoom;\n }\n }\n\n this.updateHTML();\n }\n\n private getZoomBounds(): {minZoom: number; maxZoom: number} {\n const minZoom = this.props.minZoom ?? this.inferredMinZoom ?? Number.NEGATIVE_INFINITY;\n const maxZoom = this.props.maxZoom ?? this.inferredMaxZoom ?? Number.POSITIVE_INFINITY;\n\n if (minZoom > maxZoom) {\n return {minZoom: maxZoom, maxZoom: minZoom};\n }\n return {\n minZoom: Number.isFinite(minZoom) ? minZoom : -20,\n maxZoom: Number.isFinite(maxZoom) ? maxZoom : 20\n };\n }\n\n private getTargetViewports(): Viewport[] {\n const deck = this.deck;\n if (!deck) {\n return [];\n }\n if (this.viewId) {\n if (hasViewManager(deck)) {\n const viewport = deck.viewManager?.getViewport(this.viewId);\n return viewport ? [viewport] : [];\n }\n return [];\n }\n return deck.getViewports();\n }\n\n private getViewState(viewport: Viewport): any {\n const deck = this.deck;\n const viewManager = hasViewManager(deck) ? deck.viewManager : null;\n const viewId = this.viewId || viewport.id;\n if (viewManager) {\n try {\n return {...viewManager.getViewState(viewId)};\n } catch (err) {\n return cloneViewState(viewManager.viewState);\n }\n }\n return cloneViewState(viewport);\n }\n\n private handleZoomDelta(delta: number) {\n const {minZoom, maxZoom} = this.getZoomBounds();\n\n for (const viewport of this.getTargetViewports()) {\n const viewState = this.getViewState(viewport);\n const baseZoom = Number(viewState.zoom);\n const current = Number.isFinite(baseZoom) ? baseZoom : this.currentZoom;\n const nextZoom = Math.max(minZoom, Math.min(maxZoom, current + delta));\n this.updateViewState(viewport, {...viewState, zoom: nextZoom});\n }\n }\n\n private handleZoomTo(zoom: number) {\n const {minZoom, maxZoom} = this.getZoomBounds();\n const nextZoom = Math.max(minZoom, Math.min(maxZoom, zoom));\n\n for (const viewport of this.getTargetViewports()) {\n const viewState = this.getViewState(viewport);\n this.updateViewState(viewport, {...viewState, zoom: nextZoom});\n }\n }\n\n private updateViewState(viewport: Viewport, viewState: any) {\n if (!this.deck) {\n return;\n }\n\n const viewId = this.viewId || viewport.id || 'default-view';\n this.currentZoom = Number(viewState.zoom) || this.currentZoom;\n this.updateHTML();\n\n // @ts-ignore Using private method until a public alternative is available\n this.deck._onViewStateChange({viewId, viewState, interactionState: {}});\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n cloneElement,\n render,\n toChildArray,\n Fragment,\n type ComponentChildren,\n type VNode,\n type JSX\n} from 'preact';\nimport type {Deck, Viewport, WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport {Widget} from '@deck.gl/core';\n\nexport type HtmlOverlayWidgetProps = WidgetProps & {\n /** View id to attach the overlay to. Defaults to the containing view. */\n viewId?: string | null;\n /** Margin beyond the viewport before hiding overlay items. */\n overflowMargin?: number;\n /** z-index for the overlay container. */\n zIndex?: number;\n /** Items to render; defaults to the supplied children. */\n items?: ComponentChildren;\n /** Create an overlay root for custom rendering. */\n onCreateOverlay?: (container: HTMLElement) => unknown;\n /** Render into a previously created overlay root. */\n onRenderOverlay?: (\n overlayRoot: unknown,\n element: JSX.Element | null,\n container: HTMLElement\n ) => void;\n};\n\nconst ROOT_STYLE: Partial<CSSStyleDeclaration> = {\n width: '100%',\n height: '100%',\n position: 'absolute',\n pointerEvents: 'none',\n overflow: 'hidden'\n};\n\nexport class HtmlOverlayWidget<\n PropsT extends HtmlOverlayWidgetProps = HtmlOverlayWidgetProps\n> extends Widget<PropsT> {\n static override defaultProps = {\n id: 'html-overlay',\n viewId: null,\n _container: null,\n overflowMargin: 0,\n zIndex: 1,\n style: {},\n className: ''\n } satisfies Required<WidgetProps> &\n Required<Pick<HtmlOverlayWidgetProps, 'overflowMargin' | 'zIndex'>> &\n HtmlOverlayWidgetProps;\n\n placement: WidgetPlacement = 'fill';\n className = 'deck-widget-html-overlay';\n deck?: Deck | null = null;\n protected viewport: Viewport | null = null;\n protected overlayRoot: unknown = null;\n protected overlayRootInitialized = false;\n\n constructor(props: PropsT = {} as PropsT) {\n super({...HtmlOverlayWidget.defaultProps, ...props});\n this.viewId = props.viewId ?? null;\n }\n\n override setProps(props: Partial<PropsT>): void {\n if (props.viewId !== undefined) {\n this.viewId = props.viewId;\n }\n super.setProps(props);\n }\n\n override onAdd({deck, viewId}: {deck: Deck; viewId: string | null}): void {\n this.deck = deck;\n if (this.viewId === undefined) {\n this.viewId = viewId;\n }\n }\n\n override onRemove(): void {\n this.deck = null;\n this.viewport = null;\n this.overlayRoot = null;\n this.overlayRootInitialized = false;\n }\n\n override onViewportChange(viewport: Viewport): void {\n if (!this.viewId || this.viewId === viewport.id) {\n this.viewport = viewport;\n this.updateHTML();\n }\n }\n\n protected getViewport(): Viewport | null {\n return this.viewport;\n }\n\n protected getZoom(): number {\n return this.viewport?.zoom ?? 0;\n }\n\n protected scaleWithZoom(n: number): number {\n return n / Math.pow(2, 20 - this.getZoom());\n }\n\n protected breakpointWithZoom<T>(threshold: number, a: T, b: T): T {\n return this.getZoom() > threshold ? a : b;\n }\n\n protected getCoords(viewport: Viewport, coordinates: number[]): [number, number] {\n const pos = viewport.project(coordinates);\n if (!pos) return [-1, -1];\n return pos as [number, number];\n }\n\n protected inView(viewport: Viewport, [x, y]: number[]): boolean {\n const overflowMargin = this.props.overflowMargin ?? 0;\n const {width, height} = viewport;\n return !(\n x < -overflowMargin ||\n y < -overflowMargin ||\n x > width + overflowMargin ||\n y > height + overflowMargin\n );\n }\n\n protected getOverlayItems(viewport: Viewport): VNode[] {\n const {items} = this.props;\n return (items ? toChildArray(items) : []) as VNode[];\n }\n\n protected projectItems(items: VNode[], viewport: Viewport): VNode[] {\n const renderItems: VNode[] = [];\n items.filter(Boolean).forEach((item, index) => {\n const coordinates = (item.props as any)?.coordinates;\n if (!coordinates) {\n return;\n }\n const [x, y] = this.getCoords(viewport, coordinates);\n if (this.inView(viewport, [x, y])) {\n const key = item.key === null || item.key === undefined ? index : item.key;\n renderItems.push(cloneElement(item, {x, y, key}));\n }\n });\n\n return renderItems;\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n Object.assign(rootElement.style, ROOT_STYLE, {zIndex: `${this.props.zIndex ?? 1}`});\n\n const viewport = this.getViewport();\n const element = viewport\n ? (() => {\n const overlayItems = this.getOverlayItems(viewport);\n const renderedItems = this.projectItems(overlayItems, viewport);\n return <Fragment>{renderedItems}</Fragment>;\n })()\n : null;\n\n const {onRenderOverlay, onCreateOverlay} = this.props;\n if (onRenderOverlay) {\n if (!this.overlayRootInitialized) {\n this.overlayRoot = onCreateOverlay?.(rootElement) ?? null;\n this.overlayRootInitialized = true;\n }\n onRenderOverlay(this.overlayRoot, element, rootElement);\n return;\n }\n\n render(element, rootElement);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ComponentChildren, JSX} from 'preact';\n\nexport type HtmlOverlayItemProps = {\n /** Injected by HtmlOverlayWidget */\n x?: number;\n /** Injected by HtmlOverlayWidget */\n y?: number;\n\n /** Coordinates of this overlay in [lng, lat] (and optional z). */\n coordinates: number[];\n children?: ComponentChildren;\n style?: JSX.CSSProperties;\n};\n\nexport function HtmlOverlayItem({x = 0, y = 0, children, style, ...props}: HtmlOverlayItemProps) {\n const {zIndex = 'auto', ...remainingStyle} = style || {};\n\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 <div\n style={{transform: `translate(${x}px, ${y}px)`, position: 'absolute', zIndex: `${zIndex}`}}\n >\n <div style={{userSelect: 'none', ...remainingStyle}} {...props}>\n {children}\n </div>\n </div>\n );\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {point} from '@turf/helpers';\nimport Supercluster from 'supercluster';\nimport type {VNode} from 'preact';\n\nimport type {WidgetProps, Viewport} from '@deck.gl/core';\nimport {HtmlOverlayWidget, type HtmlOverlayWidgetProps} from './html-overlay-widget';\n\nexport type HtmlClusterWidgetProps = HtmlOverlayWidgetProps & WidgetProps;\n\nexport abstract class HtmlClusterWidget<ObjType> extends HtmlOverlayWidget<HtmlClusterWidgetProps> {\n static override defaultProps = {\n ...HtmlOverlayWidget.defaultProps,\n id: 'html-cluster-overlay'\n } satisfies Required<WidgetProps> & HtmlClusterWidgetProps;\n\n protected superCluster: Supercluster | null = null;\n protected lastObjects: ObjType[] | null = null;\n\n protected override getOverlayItems(viewport: Viewport): VNode[] {\n const newObjects = this.getAllObjects();\n if (newObjects !== this.lastObjects) {\n this.superCluster = new Supercluster(this.getClusterOptions());\n this.superCluster.load(\n newObjects.map((object) => point(this.getObjectCoordinates(object), {object}))\n );\n this.lastObjects = newObjects;\n }\n\n const clusters =\n this.superCluster?.getClusters([-180, -90, 180, 90], Math.round(this.getZoom())) ?? [];\n\n const overlayItems = clusters.map(\n ({\n geometry: {coordinates},\n properties: {cluster, point_count: pointCount, cluster_id: clusterId, object}\n }) =>\n cluster\n ? this.renderCluster(coordinates, clusterId, pointCount)\n : this.renderObject(coordinates, object)\n );\n\n return overlayItems.filter(Boolean) as VNode[];\n }\n\n getClusterObjects(clusterId: number): ObjType[] {\n return (\n this.superCluster\n ?.getLeaves(clusterId, Infinity)\n .map((leaf) => leaf.properties.object as ObjType) ?? []\n );\n }\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 abstract getAllObjects(): ObjType[];\n\n // Override to provide coordinates for each object of getAllObjects()\n abstract getObjectCoordinates(obj: ObjType): [number, number];\n\n // Get options object used when instantiating supercluster\n getClusterOptions(): Record<string, any> {\n return {\n maxZoom: 20\n };\n }\n\n // Override to return an HtmlOverlayItem\n abstract renderObject(\n coordinates: number[],\n obj: ObjType\n ): VNode<Record<string, any>> | null | undefined;\n\n // Override to return an HtmlOverlayItem\n // use getClusterObjects() to get cluster contents\n abstract renderCluster(\n coordinates: number[],\n clusterId: number,\n pointCount: number\n ): VNode<Record<string, any>> | null | undefined;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ComponentChildren, VNode} from 'preact';\nimport type {PickingInfo, WidgetProps, Viewport} from '@deck.gl/core';\nimport {HtmlOverlayItem} from './html-overlay-item';\nimport {HtmlOverlayWidget, type HtmlOverlayWidgetProps} from './html-overlay-widget';\n\nexport type HtmlTooltipWidgetProps = HtmlOverlayWidgetProps & {\n /** Delay before showing the tooltip (ms). */\n showDelay?: number;\n /** Extract a tooltip string or node from picking info. */\n getTooltip?: (pickingInfo: PickingInfo) => ComponentChildren;\n};\n\nconst TOOLTIP_STYLE = {\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;\n\nfunction defaultGetTooltip(pickingInfo: PickingInfo): ComponentChildren {\n return pickingInfo.object?.style?.tooltip;\n}\n\nexport class HtmlTooltipWidget extends HtmlOverlayWidget<HtmlTooltipWidgetProps> {\n static override defaultProps = {\n ...HtmlOverlayWidget.defaultProps,\n id: 'html-tooltip-overlay',\n showDelay: SHOW_TOOLTIP_TIMEOUT,\n getTooltip: defaultGetTooltip\n } satisfies Required<WidgetProps> &\n Required<Pick<HtmlTooltipWidgetProps, 'showDelay' | 'getTooltip'>> &\n HtmlTooltipWidgetProps;\n\n private timeoutID: ReturnType<typeof globalThis.setTimeout> | null = null;\n private pickingInfo: PickingInfo | null = null;\n private visible = false;\n\n override onRemove(): void {\n if (this.timeoutID !== null) {\n globalThis.clearTimeout(this.timeoutID);\n this.timeoutID = null;\n }\n this.visible = false;\n this.pickingInfo = null;\n }\n\n override onHover(pickingInfo: PickingInfo): void {\n if (this.timeoutID !== null) {\n globalThis.clearTimeout(this.timeoutID);\n this.timeoutID = null;\n }\n\n const tooltipContent = this.props.getTooltip?.(pickingInfo);\n\n if (pickingInfo && tooltipContent) {\n const delay = this.props.showDelay ?? SHOW_TOOLTIP_TIMEOUT;\n this.timeoutID = globalThis.setTimeout(() => {\n this.visible = true;\n this.pickingInfo = pickingInfo;\n this.updateHTML();\n }, delay);\n } else {\n this.visible = false;\n this.pickingInfo = null;\n this.updateHTML();\n }\n }\n\n protected override getOverlayItems(viewport: Viewport): VNode[] {\n if (!this.visible || !this.pickingInfo) {\n return [];\n }\n\n const tooltipContent = this.props.getTooltip?.(this.pickingInfo);\n const coordinates =\n this.pickingInfo.coordinate ??\n (this.pickingInfo as Partial<{lngLat: number[]}>).lngLat ??\n null;\n if (!tooltipContent || !coordinates) {\n return [];\n }\n\n return [\n <HtmlOverlayItem key=\"tooltip\" coordinates={coordinates} style={TOOLTIP_STYLE}>\n {tooltipContent}\n </HtmlOverlayItem>\n ];\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_preact", "_jsx", "_jsx", "import_preact", "import_core", "WRAPPER_STYLE", "_jsxs", "_Fragment", "_jsx", "import_preact", "import_core", "_jsx", "_jsx", "Supercluster", "_jsx"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ComponentChildren, type VNode } from 'preact';
|
|
1
|
+
import { type ComponentChildren, type VNode, type JSX } from 'preact';
|
|
2
2
|
import type { Deck, Viewport, WidgetPlacement, WidgetProps } from '@deck.gl/core';
|
|
3
3
|
import { Widget } from '@deck.gl/core';
|
|
4
4
|
export type HtmlOverlayWidgetProps = WidgetProps & {
|
|
@@ -10,6 +10,10 @@ export type HtmlOverlayWidgetProps = WidgetProps & {
|
|
|
10
10
|
zIndex?: number;
|
|
11
11
|
/** Items to render; defaults to the supplied children. */
|
|
12
12
|
items?: ComponentChildren;
|
|
13
|
+
/** Create an overlay root for custom rendering. */
|
|
14
|
+
onCreateOverlay?: (container: HTMLElement) => unknown;
|
|
15
|
+
/** Render into a previously created overlay root. */
|
|
16
|
+
onRenderOverlay?: (overlayRoot: unknown, element: JSX.Element | null, container: HTMLElement) => void;
|
|
13
17
|
};
|
|
14
18
|
export declare class HtmlOverlayWidget<PropsT extends HtmlOverlayWidgetProps = HtmlOverlayWidgetProps> extends Widget<PropsT> {
|
|
15
19
|
static defaultProps: {
|
|
@@ -25,6 +29,8 @@ export declare class HtmlOverlayWidget<PropsT extends HtmlOverlayWidgetProps = H
|
|
|
25
29
|
className: string;
|
|
26
30
|
deck?: Deck | null;
|
|
27
31
|
protected viewport: Viewport | null;
|
|
32
|
+
protected overlayRoot: unknown;
|
|
33
|
+
protected overlayRootInitialized: boolean;
|
|
28
34
|
constructor(props?: PropsT);
|
|
29
35
|
setProps(props: Partial<PropsT>): void;
|
|
30
36
|
onAdd({ deck, viewId }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-overlay-widget.d.ts","sourceRoot":"","sources":["../../src/widgets/html-overlay-widget.tsx"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"html-overlay-widget.d.ts","sourceRoot":"","sources":["../../src/widgets/html-overlay-widget.tsx"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,KAAK,EACV,KAAK,GAAG,EACT,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;AAChF,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAErC,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG;IACjD,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,mDAAmD;IACnD,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,OAAO,CAAC;IACtD,qDAAqD;IACrD,eAAe,CAAC,EAAE,CAChB,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,EAC3B,SAAS,EAAE,WAAW,KACnB,IAAI,CAAC;CACX,CAAC;AAUF,qBAAa,iBAAiB,CAC5B,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,CAC9D,SAAQ,MAAM,CAAC,MAAM,CAAC;IACtB,OAAgB,YAAY;;;;;;;;MAUH;IAEzB,SAAS,EAAE,eAAe,CAAU;IACpC,SAAS,SAA8B;IACvC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAQ;IAC1B,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAC3C,SAAS,CAAC,WAAW,EAAE,OAAO,CAAQ;IACtC,SAAS,CAAC,sBAAsB,UAAS;gBAE7B,KAAK,GAAE,MAAqB;IAK/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IAOtC,KAAK,CAAC,EAAC,IAAI,EAAE,MAAM,EAAC,EAAE;QAAC,IAAI,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,GAAG,IAAI;IAOhE,QAAQ,IAAI,IAAI;IAOhB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAOnD,SAAS,CAAC,WAAW,IAAI,QAAQ,GAAG,IAAI;IAIxC,SAAS,CAAC,OAAO,IAAI,MAAM;IAI3B,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAI1C,SAAS,CAAC,kBAAkB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC;IAIjE,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAMhF,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO;IAW/D,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE;IAKtD,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE;IAiB1D,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;CAwBtD"}
|
|
@@ -25,6 +25,8 @@ export class HtmlOverlayWidget extends Widget {
|
|
|
25
25
|
className = 'deck-widget-html-overlay';
|
|
26
26
|
deck = null;
|
|
27
27
|
viewport = null;
|
|
28
|
+
overlayRoot = null;
|
|
29
|
+
overlayRootInitialized = false;
|
|
28
30
|
constructor(props = {}) {
|
|
29
31
|
super({ ...HtmlOverlayWidget.defaultProps, ...props });
|
|
30
32
|
this.viewId = props.viewId ?? null;
|
|
@@ -44,6 +46,8 @@ export class HtmlOverlayWidget extends Widget {
|
|
|
44
46
|
onRemove() {
|
|
45
47
|
this.deck = null;
|
|
46
48
|
this.viewport = null;
|
|
49
|
+
this.overlayRoot = null;
|
|
50
|
+
this.overlayRootInitialized = false;
|
|
47
51
|
}
|
|
48
52
|
onViewportChange(viewport) {
|
|
49
53
|
if (!this.viewId || this.viewId === viewport.id) {
|
|
@@ -99,13 +103,23 @@ export class HtmlOverlayWidget extends Widget {
|
|
|
99
103
|
onRenderHTML(rootElement) {
|
|
100
104
|
Object.assign(rootElement.style, ROOT_STYLE, { zIndex: `${this.props.zIndex ?? 1}` });
|
|
101
105
|
const viewport = this.getViewport();
|
|
102
|
-
|
|
103
|
-
|
|
106
|
+
const element = viewport
|
|
107
|
+
? (() => {
|
|
108
|
+
const overlayItems = this.getOverlayItems(viewport);
|
|
109
|
+
const renderedItems = this.projectItems(overlayItems, viewport);
|
|
110
|
+
return _jsx(Fragment, { children: renderedItems });
|
|
111
|
+
})()
|
|
112
|
+
: null;
|
|
113
|
+
const { onRenderOverlay, onCreateOverlay } = this.props;
|
|
114
|
+
if (onRenderOverlay) {
|
|
115
|
+
if (!this.overlayRootInitialized) {
|
|
116
|
+
this.overlayRoot = onCreateOverlay?.(rootElement) ?? null;
|
|
117
|
+
this.overlayRootInitialized = true;
|
|
118
|
+
}
|
|
119
|
+
onRenderOverlay(this.overlayRoot, element, rootElement);
|
|
104
120
|
return;
|
|
105
121
|
}
|
|
106
|
-
|
|
107
|
-
const renderedItems = this.projectItems(overlayItems, viewport);
|
|
108
|
-
render(_jsx(Fragment, { children: renderedItems }), rootElement);
|
|
122
|
+
render(element, rootElement);
|
|
109
123
|
}
|
|
110
124
|
}
|
|
111
125
|
//# sourceMappingURL=html-overlay-widget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-overlay-widget.js","sourceRoot":"","sources":["../../src/widgets/html-overlay-widget.tsx"],"names":[],"mappings":";AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EACL,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,QAAQ,
|
|
1
|
+
{"version":3,"file":"html-overlay-widget.js","sourceRoot":"","sources":["../../src/widgets/html-overlay-widget.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deck.gl-community/widgets",
|
|
3
|
-
"version": "9.2.
|
|
3
|
+
"version": "9.2.8",
|
|
4
4
|
"description": "UI widgets for deck.gl",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -37,5 +37,5 @@
|
|
|
37
37
|
"preact": "^10.17.0",
|
|
38
38
|
"supercluster": "^8.0.1"
|
|
39
39
|
},
|
|
40
|
-
"gitHead": "
|
|
40
|
+
"gitHead": "9cb179aa3d1707f32116034150ab7130ce88b18c"
|
|
41
41
|
}
|
|
@@ -8,7 +8,8 @@ import {
|
|
|
8
8
|
toChildArray,
|
|
9
9
|
Fragment,
|
|
10
10
|
type ComponentChildren,
|
|
11
|
-
type VNode
|
|
11
|
+
type VNode,
|
|
12
|
+
type JSX
|
|
12
13
|
} from 'preact';
|
|
13
14
|
import type {Deck, Viewport, WidgetPlacement, WidgetProps} from '@deck.gl/core';
|
|
14
15
|
import {Widget} from '@deck.gl/core';
|
|
@@ -22,6 +23,14 @@ export type HtmlOverlayWidgetProps = WidgetProps & {
|
|
|
22
23
|
zIndex?: number;
|
|
23
24
|
/** Items to render; defaults to the supplied children. */
|
|
24
25
|
items?: ComponentChildren;
|
|
26
|
+
/** Create an overlay root for custom rendering. */
|
|
27
|
+
onCreateOverlay?: (container: HTMLElement) => unknown;
|
|
28
|
+
/** Render into a previously created overlay root. */
|
|
29
|
+
onRenderOverlay?: (
|
|
30
|
+
overlayRoot: unknown,
|
|
31
|
+
element: JSX.Element | null,
|
|
32
|
+
container: HTMLElement
|
|
33
|
+
) => void;
|
|
25
34
|
};
|
|
26
35
|
|
|
27
36
|
const ROOT_STYLE: Partial<CSSStyleDeclaration> = {
|
|
@@ -51,6 +60,8 @@ export class HtmlOverlayWidget<
|
|
|
51
60
|
className = 'deck-widget-html-overlay';
|
|
52
61
|
deck?: Deck | null = null;
|
|
53
62
|
protected viewport: Viewport | null = null;
|
|
63
|
+
protected overlayRoot: unknown = null;
|
|
64
|
+
protected overlayRootInitialized = false;
|
|
54
65
|
|
|
55
66
|
constructor(props: PropsT = {} as PropsT) {
|
|
56
67
|
super({...HtmlOverlayWidget.defaultProps, ...props});
|
|
@@ -74,6 +85,8 @@ export class HtmlOverlayWidget<
|
|
|
74
85
|
override onRemove(): void {
|
|
75
86
|
this.deck = null;
|
|
76
87
|
this.viewport = null;
|
|
88
|
+
this.overlayRoot = null;
|
|
89
|
+
this.overlayRootInitialized = false;
|
|
77
90
|
}
|
|
78
91
|
|
|
79
92
|
override onViewportChange(viewport: Viewport): void {
|
|
@@ -142,14 +155,24 @@ export class HtmlOverlayWidget<
|
|
|
142
155
|
Object.assign(rootElement.style, ROOT_STYLE, {zIndex: `${this.props.zIndex ?? 1}`});
|
|
143
156
|
|
|
144
157
|
const viewport = this.getViewport();
|
|
145
|
-
|
|
146
|
-
|
|
158
|
+
const element = viewport
|
|
159
|
+
? (() => {
|
|
160
|
+
const overlayItems = this.getOverlayItems(viewport);
|
|
161
|
+
const renderedItems = this.projectItems(overlayItems, viewport);
|
|
162
|
+
return <Fragment>{renderedItems}</Fragment>;
|
|
163
|
+
})()
|
|
164
|
+
: null;
|
|
165
|
+
|
|
166
|
+
const {onRenderOverlay, onCreateOverlay} = this.props;
|
|
167
|
+
if (onRenderOverlay) {
|
|
168
|
+
if (!this.overlayRootInitialized) {
|
|
169
|
+
this.overlayRoot = onCreateOverlay?.(rootElement) ?? null;
|
|
170
|
+
this.overlayRootInitialized = true;
|
|
171
|
+
}
|
|
172
|
+
onRenderOverlay(this.overlayRoot, element, rootElement);
|
|
147
173
|
return;
|
|
148
174
|
}
|
|
149
175
|
|
|
150
|
-
|
|
151
|
-
const renderedItems = this.projectItems(overlayItems, viewport);
|
|
152
|
-
|
|
153
|
-
render(<Fragment>{renderedItems}</Fragment>, rootElement);
|
|
176
|
+
render(element, rootElement);
|
|
154
177
|
}
|
|
155
178
|
}
|