@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 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
+ [![NPM Version](https://img.shields.io/npm/v/@deck.gl-community/widgets.svg)](https://www.npmjs.com/package/@deck.gl-community/widgets)
8
+ [![NPM Downloads](https://img.shields.io/npm/dw/@deck.gl-community/widgets.svg)](https://www.npmjs.com/package/@deck.gl-community/widgets)
7
9
  ![deck.gl v9](https://img.shields.io/badge/deck.gl-v9-green.svg?style=flat-square")
8
10
  ![WebGPU not supported](https://img.shields.io/badge/webgpu-no-red.svg?style=flat-square")
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
- if (!viewport) {
579
- (0, import_preact4.render)(null, rootElement);
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
- const overlayItems = this.getOverlayItems(viewport);
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;
@@ -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,EACX,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;CAC3B,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;gBAE/B,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;IAKhB,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;CActD"}
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
- if (!viewport) {
103
- render(null, rootElement);
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
- const overlayItems = this.getOverlayItems(viewport);
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":"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"}
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,EAIT,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAqBrC,MAAM,UAAU,GAAiC;IAC/C,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,MAAM;IACrB,QAAQ,EAAE,QAAQ;CACnB,CAAC;AAEF,MAAM,OAAO,iBAEX,SAAQ,MAAc;IACtB,MAAM,CAAU,YAAY,GAAG;QAC7B,EAAE,EAAE,cAAc;QAClB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC;QACT,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,EAAE;KAGS,CAAC;IAEzB,SAAS,GAAoB,MAAM,CAAC;IACpC,SAAS,GAAG,0BAA0B,CAAC;IACvC,IAAI,GAAiB,IAAI,CAAC;IAChB,QAAQ,GAAoB,IAAI,CAAC;IACjC,WAAW,GAAY,IAAI,CAAC;IAC5B,sBAAsB,GAAG,KAAK,CAAC;IAEzC,YAAY,QAAgB,EAAY;QACtC,KAAK,CAAC,EAAC,GAAG,iBAAiB,CAAC,YAAY,EAAE,GAAG,KAAK,EAAC,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;IACrC,CAAC;IAEQ,QAAQ,CAAC,KAAsB;QACtC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAEQ,KAAK,CAAC,EAAC,IAAI,EAAE,MAAM,EAAsC;QAChE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC;IACH,CAAC;IAEQ,QAAQ;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACtC,CAAC;IAEQ,gBAAgB,CAAC,QAAkB;QAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACzB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAES,WAAW;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAES,OAAO;QACf,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;IAClC,CAAC;IAES,aAAa,CAAC,CAAS;QAC/B,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IAES,kBAAkB,CAAI,SAAiB,EAAE,CAAI,EAAE,CAAI;QAC3D,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAES,SAAS,CAAC,QAAkB,EAAE,WAAqB;QAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1B,OAAO,GAAuB,CAAC;IACjC,CAAC;IAES,MAAM,CAAC,QAAkB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAW;QACnD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;QACtD,MAAM,EAAC,KAAK,EAAE,MAAM,EAAC,GAAG,QAAQ,CAAC;QACjC,OAAO,CAAC,CACN,CAAC,GAAG,CAAC,cAAc;YACnB,CAAC,GAAG,CAAC,cAAc;YACnB,CAAC,GAAG,KAAK,GAAG,cAAc;YAC1B,CAAC,GAAG,MAAM,GAAG,cAAc,CAC5B,CAAC;IACJ,CAAC;IAES,eAAe,CAAC,QAAkB;QAC1C,MAAM,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAY,CAAC;IACvD,CAAC;IAES,YAAY,CAAC,KAAc,EAAE,QAAkB;QACvD,MAAM,WAAW,GAAY,EAAE,CAAC;QAChC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC5C,MAAM,WAAW,GAAI,IAAI,CAAC,KAAa,EAAE,WAAW,CAAC;YACrD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC3E,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAC,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC;IAEQ,YAAY,CAAC,WAAwB;QAC5C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,EAAC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,EAAC,CAAC,CAAC;QAEpF,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,QAAQ;YACtB,CAAC,CAAC,CAAC,GAAG,EAAE;gBACJ,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACpD,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;gBAChE,OAAO,KAAC,QAAQ,cAAE,aAAa,GAAY,CAAC;YAC9C,CAAC,CAAC,EAAE;YACN,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,EAAC,eAAe,EAAE,eAAe,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACtD,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,GAAG,eAAe,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;gBAC1D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACrC,CAAC;YACD,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC/B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deck.gl-community/widgets",
3
- "version": "9.2.5",
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": "c6b0f45b1e7f9916c1b79a43c39b839a8096c163"
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
- if (!viewport) {
146
- render(null, rootElement);
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
- const overlayItems = this.getOverlayItems(viewport);
151
- const renderedItems = this.projectItems(overlayItems, viewport);
152
-
153
- render(<Fragment>{renderedItems}</Fragment>, rootElement);
176
+ render(element, rootElement);
154
177
  }
155
178
  }