@deck.gl-community/widgets 9.2.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +43 -0
  3. package/dist/_deprecate/long-press-button.d.ts +13 -0
  4. package/dist/_deprecate/long-press-button.d.ts.map +1 -0
  5. package/dist/_deprecate/long-press-button.js +32 -0
  6. package/dist/_deprecate/long-press-button.js.map +1 -0
  7. package/dist/_deprecate/view-control-widget.d.ts +78 -0
  8. package/dist/_deprecate/view-control-widget.d.ts.map +1 -0
  9. package/dist/_deprecate/view-control-widget.js +198 -0
  10. package/dist/_deprecate/view-control-widget.js.map +1 -0
  11. package/dist/index.cjs +708 -0
  12. package/dist/index.cjs.map +7 -0
  13. package/dist/index.d.ts +13 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +10 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/widgets/html-cluster-widget.d.ts +25 -0
  18. package/dist/widgets/html-cluster-widget.d.ts.map +1 -0
  19. package/dist/widgets/html-cluster-widget.js +39 -0
  20. package/dist/widgets/html-cluster-widget.js.map +1 -0
  21. package/dist/widgets/html-overlay-item.d.ts +13 -0
  22. package/dist/widgets/html-overlay-item.d.ts.map +1 -0
  23. package/dist/widgets/html-overlay-item.js +10 -0
  24. package/dist/widgets/html-overlay-item.js.map +1 -0
  25. package/dist/widgets/html-overlay-widget.d.ts +45 -0
  26. package/dist/widgets/html-overlay-widget.d.ts.map +1 -0
  27. package/dist/widgets/html-overlay-widget.js +112 -0
  28. package/dist/widgets/html-overlay-widget.js.map +1 -0
  29. package/dist/widgets/html-tooltip-widget.d.ts +30 -0
  30. package/dist/widgets/html-tooltip-widget.d.ts.map +1 -0
  31. package/dist/widgets/html-tooltip-widget.js +67 -0
  32. package/dist/widgets/html-tooltip-widget.js.map +1 -0
  33. package/dist/widgets/long-press-button.d.ts +22 -0
  34. package/dist/widgets/long-press-button.d.ts.map +1 -0
  35. package/dist/widgets/long-press-button.js +84 -0
  36. package/dist/widgets/long-press-button.js.map +1 -0
  37. package/dist/widgets/long-press-controller.d.ts +27 -0
  38. package/dist/widgets/long-press-controller.d.ts.map +1 -0
  39. package/dist/widgets/long-press-controller.js +144 -0
  40. package/dist/widgets/long-press-controller.js.map +1 -0
  41. package/dist/widgets/pan-widget.d.ts +33 -0
  42. package/dist/widgets/pan-widget.d.ts.map +1 -0
  43. package/dist/widgets/pan-widget.js +141 -0
  44. package/dist/widgets/pan-widget.js.map +1 -0
  45. package/dist/widgets/view-manager-utils.d.ts +11 -0
  46. package/dist/widgets/view-manager-utils.d.ts.map +1 -0
  47. package/dist/widgets/view-manager-utils.js +13 -0
  48. package/dist/widgets/view-manager-utils.js.map +1 -0
  49. package/dist/widgets/zoom-range-widget.d.ts +43 -0
  50. package/dist/widgets/zoom-range-widget.d.ts.map +1 -0
  51. package/dist/widgets/zoom-range-widget.js +190 -0
  52. package/dist/widgets/zoom-range-widget.js.map +1 -0
  53. package/package.json +41 -0
  54. package/src/_deprecate/long-press-button.tsx +50 -0
  55. package/src/_deprecate/view-control-widget.tsx +339 -0
  56. package/src/index.ts +18 -0
  57. package/src/widgets/html-cluster-widget.ts +84 -0
  58. package/src/widgets/html-overlay-item.tsx +32 -0
  59. package/src/widgets/html-overlay-widget.tsx +147 -0
  60. package/src/widgets/html-tooltip-widget.tsx +93 -0
  61. package/src/widgets/long-press-button.tsx +125 -0
  62. package/src/widgets/long-press-controller.ts +159 -0
  63. package/src/widgets/pan-widget.tsx +182 -0
  64. package/src/widgets/view-manager-utils.ts +24 -0
  65. package/src/widgets/zoom-range-widget.tsx +284 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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 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 placement: 'top-left',\n minZoom: undefined,\n maxZoom: undefined,\n step: 0.1,\n style: {},\n className: ''\n } satisfies Required<WidgetProps> & Required<Pick<ZoomRangeWidgetProps, 'step'>> & 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) =>\n this.handleZoomTo(Number((event.target as HTMLInputElement).value))\n }\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 =\n this.props.minZoom ?? this.inferredMinZoom ?? Number.NEGATIVE_INFINITY;\n const maxZoom =\n 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 {cloneElement, render, toChildArray, Fragment, type ComponentChildren, type VNode} 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<PropsT extends HtmlOverlayWidgetProps = HtmlOverlayWidgetProps> extends Widget<PropsT> {\n static override defaultProps = {\n id: 'html-overlay',\n viewId: 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\n .filter(Boolean)\n .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 style={{transform: `translate(${x}px, ${y}px)`, position: 'absolute', zIndex: `${zIndex}`}}>\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 = 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> & 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 ?? (this.pickingInfo as Partial<{lngLat: number[]}>).lngLat ?? 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
+ "names": ["import_preact", "_jsx", "_jsx", "import_preact", "import_core", "WRAPPER_STYLE", "_jsxs", "_Fragment", "_jsx", "import_preact", "import_core", "_jsx", "_jsx", "Supercluster", "_jsx"]
7
+ }
@@ -0,0 +1,13 @@
1
+ export { PanWidget } from "./widgets/pan-widget.js";
2
+ export type { PanWidgetProps } from "./widgets/pan-widget.js";
3
+ export { ZoomRangeWidget } from "./widgets/zoom-range-widget.js";
4
+ export type { ZoomRangeWidgetProps } from "./widgets/zoom-range-widget.js";
5
+ export { HtmlOverlayWidget } from "./widgets/html-overlay-widget.js";
6
+ export type { HtmlOverlayWidgetProps } from "./widgets/html-overlay-widget.js";
7
+ export { HtmlOverlayItem } from "./widgets/html-overlay-item.js";
8
+ export type { HtmlOverlayItemProps } from "./widgets/html-overlay-item.js";
9
+ export { HtmlClusterWidget } from "./widgets/html-cluster-widget.js";
10
+ export type { HtmlClusterWidgetProps } from "./widgets/html-cluster-widget.js";
11
+ export { HtmlTooltipWidget } from "./widgets/html-tooltip-widget.js";
12
+ export type { HtmlTooltipWidgetProps } from "./widgets/html-tooltip-widget.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,SAAS,EAAC,gCAA6B;AAC/C,YAAY,EAAC,cAAc,EAAC,gCAA6B;AAEzD,OAAO,EAAC,eAAe,EAAC,uCAAoC;AAC5D,YAAY,EAAC,oBAAoB,EAAC,uCAAoC;AAEtE,OAAO,EAAC,iBAAiB,EAAC,yCAAsC;AAChE,YAAY,EAAC,sBAAsB,EAAC,yCAAsC;AAC1E,OAAO,EAAC,eAAe,EAAC,uCAAoC;AAC5D,YAAY,EAAC,oBAAoB,EAAC,uCAAoC;AACtE,OAAO,EAAC,iBAAiB,EAAC,yCAAsC;AAChE,YAAY,EAAC,sBAAsB,EAAC,yCAAsC;AAC1E,OAAO,EAAC,iBAAiB,EAAC,yCAAsC;AAChE,YAAY,EAAC,sBAAsB,EAAC,yCAAsC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ export { PanWidget } from "./widgets/pan-widget.js";
5
+ export { ZoomRangeWidget } from "./widgets/zoom-range-widget.js";
6
+ export { HtmlOverlayWidget } from "./widgets/html-overlay-widget.js";
7
+ export { HtmlOverlayItem } from "./widgets/html-overlay-item.js";
8
+ export { HtmlClusterWidget } from "./widgets/html-cluster-widget.js";
9
+ export { HtmlTooltipWidget } from "./widgets/html-tooltip-widget.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,SAAS,EAAC,gCAA6B;AAG/C,OAAO,EAAC,eAAe,EAAC,uCAAoC;AAG5D,OAAO,EAAC,iBAAiB,EAAC,yCAAsC;AAEhE,OAAO,EAAC,eAAe,EAAC,uCAAoC;AAE5D,OAAO,EAAC,iBAAiB,EAAC,yCAAsC;AAEhE,OAAO,EAAC,iBAAiB,EAAC,yCAAsC"}
@@ -0,0 +1,25 @@
1
+ import Supercluster from 'supercluster';
2
+ import type { VNode } from 'preact';
3
+ import type { WidgetProps, Viewport } from '@deck.gl/core';
4
+ import { HtmlOverlayWidget, type HtmlOverlayWidgetProps } from "./html-overlay-widget.js";
5
+ export type HtmlClusterWidgetProps = HtmlOverlayWidgetProps & WidgetProps;
6
+ export declare abstract class HtmlClusterWidget<ObjType> extends HtmlOverlayWidget<HtmlClusterWidgetProps> {
7
+ static defaultProps: {
8
+ id: string;
9
+ viewId: any;
10
+ overflowMargin: number;
11
+ zIndex: number;
12
+ style: {};
13
+ className: string;
14
+ };
15
+ protected superCluster: Supercluster | null;
16
+ protected lastObjects: ObjType[] | null;
17
+ protected getOverlayItems(viewport: Viewport): VNode[];
18
+ getClusterObjects(clusterId: number): ObjType[];
19
+ abstract getAllObjects(): ObjType[];
20
+ abstract getObjectCoordinates(obj: ObjType): [number, number];
21
+ getClusterOptions(): Record<string, any>;
22
+ abstract renderObject(coordinates: number[], obj: ObjType): VNode<Record<string, any>> | null | undefined;
23
+ abstract renderCluster(coordinates: number[], clusterId: number, pointCount: number): VNode<Record<string, any>> | null | undefined;
24
+ }
25
+ //# sourceMappingURL=html-cluster-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-cluster-widget.d.ts","sourceRoot":"","sources":["../../src/widgets/html-cluster-widget.ts"],"names":[],"mappings":"AAKA,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAC,WAAW,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AACzD,OAAO,EAAC,iBAAiB,EAAE,KAAK,sBAAsB,EAAC,iCAA8B;AAErF,MAAM,MAAM,sBAAsB,GAAG,sBAAsB,GAAG,WAAW,CAAC;AAE1E,8BAAsB,iBAAiB,CAAC,OAAO,CAAE,SAAQ,iBAAiB,CAAC,sBAAsB,CAAC;IAChG,OAAgB,YAAY;;;;;;;MAG+B;IAE3D,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IACnD,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,CAAQ;cAE5B,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE;IAyB/D,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAW/C,QAAQ,CAAC,aAAa,IAAI,OAAO,EAAE;IAGnC,QAAQ,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAG7D,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAOxC,QAAQ,CAAC,YAAY,CACnB,WAAW,EAAE,MAAM,EAAE,EACrB,GAAG,EAAE,OAAO,GACX,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS;IAIhD,QAAQ,CAAC,aAAa,CACpB,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS;CACjD"}
@@ -0,0 +1,39 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { point } from '@turf/helpers';
5
+ import Supercluster from 'supercluster';
6
+ import { HtmlOverlayWidget } from "./html-overlay-widget.js";
7
+ export class HtmlClusterWidget extends HtmlOverlayWidget {
8
+ static defaultProps = {
9
+ ...HtmlOverlayWidget.defaultProps,
10
+ id: 'html-cluster-overlay'
11
+ };
12
+ superCluster = null;
13
+ lastObjects = null;
14
+ getOverlayItems(viewport) {
15
+ const newObjects = this.getAllObjects();
16
+ if (newObjects !== this.lastObjects) {
17
+ this.superCluster = new Supercluster(this.getClusterOptions());
18
+ this.superCluster.load(newObjects.map((object) => point(this.getObjectCoordinates(object), { object })));
19
+ this.lastObjects = newObjects;
20
+ }
21
+ const clusters = this.superCluster?.getClusters([-180, -90, 180, 90], Math.round(this.getZoom())) ?? [];
22
+ const overlayItems = clusters.map(({ geometry: { coordinates }, properties: { cluster, point_count: pointCount, cluster_id: clusterId, object } }) => cluster
23
+ ? this.renderCluster(coordinates, clusterId, pointCount)
24
+ : this.renderObject(coordinates, object));
25
+ return overlayItems.filter(Boolean);
26
+ }
27
+ getClusterObjects(clusterId) {
28
+ return (this.superCluster
29
+ ?.getLeaves(clusterId, Infinity)
30
+ .map((leaf) => leaf.properties.object) ?? []);
31
+ }
32
+ // Get options object used when instantiating supercluster
33
+ getClusterOptions() {
34
+ return {
35
+ maxZoom: 20
36
+ };
37
+ }
38
+ }
39
+ //# sourceMappingURL=html-cluster-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-cluster-widget.js","sourceRoot":"","sources":["../../src/widgets/html-cluster-widget.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,KAAK,EAAC,MAAM,eAAe,CAAC;AACpC,OAAO,YAAY,MAAM,cAAc,CAAC;AAIxC,OAAO,EAAC,iBAAiB,EAA8B,iCAA8B;AAIrF,MAAM,OAAgB,iBAA2B,SAAQ,iBAAyC;IAChG,MAAM,CAAU,YAAY,GAAG;QAC7B,GAAG,iBAAiB,CAAC,YAAY;QACjC,EAAE,EAAE,sBAAsB;KAC8B,CAAC;IAEjD,YAAY,GAAwB,IAAI,CAAC;IACzC,WAAW,GAAqB,IAAI,CAAC;IAE5B,eAAe,CAAC,QAAkB;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,IAAI,UAAU,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAC,MAAM,EAAC,CAAC,CAAC,CAC/E,CAAC;YACF,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAChC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAExG,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAC/B,CAAC,EACC,QAAQ,EAAE,EAAC,WAAW,EAAC,EACvB,UAAU,EAAE,EAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAC,EAC9E,EAAE,EAAE,CACH,OAAO;YACL,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;YACxD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAC7C,CAAC;QAEF,OAAO,YAAY,CAAC,MAAM,CAAC,OAAO,CAAY,CAAC;IACjD,CAAC;IAED,iBAAiB,CAAC,SAAiB;QACjC,OAAO,CACL,IAAI,CAAC,YAAY;YACf,EAAE,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC;aAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAiB,CAAC,IAAI,EAAE,CAC1D,CAAC;IACJ,CAAC;IAUD,0DAA0D;IAC1D,iBAAiB;QACf,OAAO;YACL,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ComponentChildren, JSX } from 'preact';
2
+ export type HtmlOverlayItemProps = {
3
+ /** Injected by HtmlOverlayWidget */
4
+ x?: number;
5
+ /** Injected by HtmlOverlayWidget */
6
+ y?: number;
7
+ /** Coordinates of this overlay in [lng, lat] (and optional z). */
8
+ coordinates: number[];
9
+ children?: ComponentChildren;
10
+ style?: JSX.CSSProperties;
11
+ };
12
+ export declare function HtmlOverlayItem({ x, y, children, style, ...props }: HtmlOverlayItemProps): JSX.Element;
13
+ //# sourceMappingURL=html-overlay-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-overlay-item.d.ts","sourceRoot":"","sources":["../../src/widgets/html-overlay-item.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,iBAAiB,EAAE,GAAG,EAAC,MAAM,QAAQ,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAAG;IACjC,oCAAoC;IACpC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,CAAC,CAAC,EAAE,MAAM,CAAC;IAEX,kEAAkE;IAClE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAC,CAAK,EAAE,CAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAAC,EAAE,oBAAoB,eAa9F"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "preact/jsx-runtime";
2
+ export function HtmlOverlayItem({ x = 0, y = 0, children, style, ...props }) {
3
+ const { zIndex = 'auto', ...remainingStyle } = style || {};
4
+ return (
5
+ // Using transform translate to position overlay items will result in a smooth zooming
6
+ // effect, whereas using the top/left css properties will cause overlay items to
7
+ // jiggle when zooming
8
+ _jsx("div", { style: { transform: `translate(${x}px, ${y}px)`, position: 'absolute', zIndex: `${zIndex}` }, children: _jsx("div", { style: { userSelect: 'none', ...remainingStyle }, ...props, children: children }) }));
9
+ }
10
+ //# sourceMappingURL=html-overlay-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-overlay-item.js","sourceRoot":"","sources":["../../src/widgets/html-overlay-item.tsx"],"names":[],"mappings":";AAkBA,MAAM,UAAU,eAAe,CAAC,EAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAAuB;IAC7F,MAAM,EAAC,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAC,GAAG,KAAK,IAAI,EAAE,CAAC;IAEzD,OAAO;IACL,sFAAsF;IACtF,gFAAgF;IAChF,sBAAsB;IACtB,cAAK,KAAK,EAAE,EAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAC,YAC7F,cAAK,KAAK,EAAE,EAAC,UAAU,EAAE,MAAM,EAAE,GAAG,cAAc,EAAC,KAAM,KAAK,YAC3D,QAAQ,GACL,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type ComponentChildren, type VNode } from 'preact';
2
+ import type { Deck, Viewport, WidgetPlacement, WidgetProps } from '@deck.gl/core';
3
+ import { Widget } from '@deck.gl/core';
4
+ export type HtmlOverlayWidgetProps = WidgetProps & {
5
+ /** View id to attach the overlay to. Defaults to the containing view. */
6
+ viewId?: string | null;
7
+ /** Margin beyond the viewport before hiding overlay items. */
8
+ overflowMargin?: number;
9
+ /** z-index for the overlay container. */
10
+ zIndex?: number;
11
+ /** Items to render; defaults to the supplied children. */
12
+ items?: ComponentChildren;
13
+ };
14
+ export declare class HtmlOverlayWidget<PropsT extends HtmlOverlayWidgetProps = HtmlOverlayWidgetProps> extends Widget<PropsT> {
15
+ static defaultProps: {
16
+ id: string;
17
+ viewId: any;
18
+ overflowMargin: number;
19
+ zIndex: number;
20
+ style: {};
21
+ className: string;
22
+ };
23
+ placement: WidgetPlacement;
24
+ className: string;
25
+ deck?: Deck | null;
26
+ protected viewport: Viewport | null;
27
+ constructor(props?: PropsT);
28
+ setProps(props: Partial<PropsT>): void;
29
+ onAdd({ deck, viewId }: {
30
+ deck: Deck;
31
+ viewId: string | null;
32
+ }): void;
33
+ onRemove(): void;
34
+ onViewportChange(viewport: Viewport): void;
35
+ protected getViewport(): Viewport | null;
36
+ protected getZoom(): number;
37
+ protected scaleWithZoom(n: number): number;
38
+ protected breakpointWithZoom<T>(threshold: number, a: T, b: T): T;
39
+ protected getCoords(viewport: Viewport, coordinates: number[]): [number, number];
40
+ protected inView(viewport: Viewport, [x, y]: number[]): boolean;
41
+ protected getOverlayItems(viewport: Viewport): VNode[];
42
+ protected projectItems(items: VNode[], viewport: Viewport): VNode[];
43
+ onRenderHTML(rootElement: HTMLElement): void;
44
+ }
45
+ //# sourceMappingURL=html-overlay-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-overlay-widget.d.ts","sourceRoot":"","sources":["../../src/widgets/html-overlay-widget.tsx"],"names":[],"mappings":"AAIA,OAAO,EAA+C,KAAK,iBAAiB,EAAE,KAAK,KAAK,EAAC,MAAM,QAAQ,CAAC;AACxG,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,CAAC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,CAAE,SAAQ,MAAM,CAAC,MAAM,CAAC;IACnH,OAAgB,YAAY;;;;;;;MASH;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;IAmB1D,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;CActD"}
@@ -0,0 +1,112 @@
1
+ import { jsx as _jsx } from "preact/jsx-runtime";
2
+ // deck.gl-community
3
+ // SPDX-License-Identifier: MIT
4
+ // Copyright (c) vis.gl contributors
5
+ import { cloneElement, render, toChildArray, Fragment } from 'preact';
6
+ import { Widget } from '@deck.gl/core';
7
+ const ROOT_STYLE = {
8
+ width: '100%',
9
+ height: '100%',
10
+ position: 'absolute',
11
+ pointerEvents: 'none',
12
+ overflow: 'hidden'
13
+ };
14
+ export class HtmlOverlayWidget extends Widget {
15
+ static defaultProps = {
16
+ id: 'html-overlay',
17
+ viewId: null,
18
+ overflowMargin: 0,
19
+ zIndex: 1,
20
+ style: {},
21
+ className: ''
22
+ };
23
+ placement = 'fill';
24
+ className = 'deck-widget-html-overlay';
25
+ deck = null;
26
+ viewport = null;
27
+ constructor(props = {}) {
28
+ super({ ...HtmlOverlayWidget.defaultProps, ...props });
29
+ this.viewId = props.viewId ?? null;
30
+ }
31
+ setProps(props) {
32
+ if (props.viewId !== undefined) {
33
+ this.viewId = props.viewId;
34
+ }
35
+ super.setProps(props);
36
+ }
37
+ onAdd({ deck, viewId }) {
38
+ this.deck = deck;
39
+ if (this.viewId === undefined) {
40
+ this.viewId = viewId;
41
+ }
42
+ }
43
+ onRemove() {
44
+ this.deck = null;
45
+ this.viewport = null;
46
+ }
47
+ onViewportChange(viewport) {
48
+ if (!this.viewId || this.viewId === viewport.id) {
49
+ this.viewport = viewport;
50
+ this.updateHTML();
51
+ }
52
+ }
53
+ getViewport() {
54
+ return this.viewport;
55
+ }
56
+ getZoom() {
57
+ return this.viewport?.zoom ?? 0;
58
+ }
59
+ scaleWithZoom(n) {
60
+ return n / Math.pow(2, 20 - this.getZoom());
61
+ }
62
+ breakpointWithZoom(threshold, a, b) {
63
+ return this.getZoom() > threshold ? a : b;
64
+ }
65
+ getCoords(viewport, coordinates) {
66
+ const pos = viewport.project(coordinates);
67
+ if (!pos)
68
+ return [-1, -1];
69
+ return pos;
70
+ }
71
+ inView(viewport, [x, y]) {
72
+ const overflowMargin = this.props.overflowMargin ?? 0;
73
+ const { width, height } = viewport;
74
+ return !(x < -overflowMargin ||
75
+ y < -overflowMargin ||
76
+ x > width + overflowMargin ||
77
+ y > height + overflowMargin);
78
+ }
79
+ getOverlayItems(viewport) {
80
+ const { items } = this.props;
81
+ return (items ? toChildArray(items) : []);
82
+ }
83
+ projectItems(items, viewport) {
84
+ const renderItems = [];
85
+ items
86
+ .filter(Boolean)
87
+ .forEach((item, index) => {
88
+ const coordinates = item.props?.coordinates;
89
+ if (!coordinates) {
90
+ return;
91
+ }
92
+ const [x, y] = this.getCoords(viewport, coordinates);
93
+ if (this.inView(viewport, [x, y])) {
94
+ const key = item.key === null || item.key === undefined ? index : item.key;
95
+ renderItems.push(cloneElement(item, { x, y, key }));
96
+ }
97
+ });
98
+ return renderItems;
99
+ }
100
+ onRenderHTML(rootElement) {
101
+ Object.assign(rootElement.style, ROOT_STYLE, { zIndex: `${this.props.zIndex ?? 1}` });
102
+ const viewport = this.getViewport();
103
+ if (!viewport) {
104
+ render(null, rootElement);
105
+ return;
106
+ }
107
+ const overlayItems = this.getOverlayItems(viewport);
108
+ const renderedItems = this.projectItems(overlayItems, viewport);
109
+ render(_jsx(Fragment, { children: renderedItems }), rootElement);
110
+ }
111
+ }
112
+ //# sourceMappingURL=html-overlay-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-overlay-widget.js","sourceRoot":"","sources":["../../src/widgets/html-overlay-widget.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ComponentChildren, VNode } from 'preact';
2
+ import type { PickingInfo, Viewport } from '@deck.gl/core';
3
+ import { HtmlOverlayWidget, type HtmlOverlayWidgetProps } from "./html-overlay-widget.js";
4
+ export type HtmlTooltipWidgetProps = HtmlOverlayWidgetProps & {
5
+ /** Delay before showing the tooltip (ms). */
6
+ showDelay?: number;
7
+ /** Extract a tooltip string or node from picking info. */
8
+ getTooltip?: (pickingInfo: PickingInfo) => ComponentChildren;
9
+ };
10
+ declare function defaultGetTooltip(pickingInfo: PickingInfo): ComponentChildren;
11
+ export declare class HtmlTooltipWidget extends HtmlOverlayWidget<HtmlTooltipWidgetProps> {
12
+ static defaultProps: {
13
+ id: string;
14
+ showDelay: number;
15
+ getTooltip: typeof defaultGetTooltip;
16
+ viewId: any;
17
+ overflowMargin: number;
18
+ zIndex: number;
19
+ style: {};
20
+ className: string;
21
+ };
22
+ private timeoutID;
23
+ private pickingInfo;
24
+ private visible;
25
+ onRemove(): void;
26
+ onHover(pickingInfo: PickingInfo): void;
27
+ protected getOverlayItems(viewport: Viewport): VNode[];
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=html-tooltip-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-tooltip-widget.d.ts","sourceRoot":"","sources":["../../src/widgets/html-tooltip-widget.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,iBAAiB,EAAE,KAAK,EAAC,MAAM,QAAQ,CAAC;AACrD,OAAO,KAAK,EAAC,WAAW,EAAe,QAAQ,EAAC,MAAM,eAAe,CAAC;AAEtE,OAAO,EAAC,iBAAiB,EAAE,KAAK,sBAAsB,EAAC,iCAA8B;AAErF,MAAM,MAAM,sBAAsB,GAAG,sBAAsB,GAAG;IAC5D,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,iBAAiB,CAAC;CAC9D,CAAC;AAYF,iBAAS,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,iBAAiB,CAEtE;AAED,qBAAa,iBAAkB,SAAQ,iBAAiB,CAAC,sBAAsB,CAAC;IAC9E,OAAgB,YAAY;;;;;;;;;MAMH;IAEzB,OAAO,CAAC,SAAS,CAAyD;IAC1E,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,OAAO,CAAS;IAEf,QAAQ,IAAI,IAAI;IAShB,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;cAsB7B,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE;CAkBhE"}
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx } from "preact/jsx-runtime";
2
+ import { HtmlOverlayItem } from "./html-overlay-item.js";
3
+ import { HtmlOverlayWidget } from "./html-overlay-widget.js";
4
+ const TOOLTIP_STYLE = {
5
+ transform: 'translate(-50%,-100%)',
6
+ backgroundColor: 'rgba(0, 0, 0, 0.3)',
7
+ padding: '4px 8px',
8
+ borderRadius: 8,
9
+ color: 'white'
10
+ };
11
+ const SHOW_TOOLTIP_TIMEOUT = 250;
12
+ function defaultGetTooltip(pickingInfo) {
13
+ return pickingInfo.object?.style?.tooltip;
14
+ }
15
+ export class HtmlTooltipWidget extends HtmlOverlayWidget {
16
+ static defaultProps = {
17
+ ...HtmlOverlayWidget.defaultProps,
18
+ id: 'html-tooltip-overlay',
19
+ showDelay: SHOW_TOOLTIP_TIMEOUT,
20
+ getTooltip: defaultGetTooltip
21
+ };
22
+ timeoutID = null;
23
+ pickingInfo = null;
24
+ visible = false;
25
+ onRemove() {
26
+ if (this.timeoutID !== null) {
27
+ globalThis.clearTimeout(this.timeoutID);
28
+ this.timeoutID = null;
29
+ }
30
+ this.visible = false;
31
+ this.pickingInfo = null;
32
+ }
33
+ onHover(pickingInfo) {
34
+ if (this.timeoutID !== null) {
35
+ globalThis.clearTimeout(this.timeoutID);
36
+ this.timeoutID = null;
37
+ }
38
+ const tooltipContent = this.props.getTooltip?.(pickingInfo);
39
+ if (pickingInfo && tooltipContent) {
40
+ const delay = this.props.showDelay ?? SHOW_TOOLTIP_TIMEOUT;
41
+ this.timeoutID = globalThis.setTimeout(() => {
42
+ this.visible = true;
43
+ this.pickingInfo = pickingInfo;
44
+ this.updateHTML();
45
+ }, delay);
46
+ }
47
+ else {
48
+ this.visible = false;
49
+ this.pickingInfo = null;
50
+ this.updateHTML();
51
+ }
52
+ }
53
+ getOverlayItems(viewport) {
54
+ if (!this.visible || !this.pickingInfo) {
55
+ return [];
56
+ }
57
+ const tooltipContent = this.props.getTooltip?.(this.pickingInfo);
58
+ const coordinates = this.pickingInfo.coordinate ?? this.pickingInfo.lngLat ?? null;
59
+ if (!tooltipContent || !coordinates) {
60
+ return [];
61
+ }
62
+ return [
63
+ _jsx(HtmlOverlayItem, { coordinates: coordinates, style: TOOLTIP_STYLE, children: tooltipContent }, "tooltip")
64
+ ];
65
+ }
66
+ }
67
+ //# sourceMappingURL=html-tooltip-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-tooltip-widget.js","sourceRoot":"","sources":["../../src/widgets/html-tooltip-widget.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAC,eAAe,EAAC,+BAA4B;AACpD,OAAO,EAAC,iBAAiB,EAA8B,iCAA8B;AASrF,MAAM,aAAa,GAAG;IACpB,SAAS,EAAE,uBAAuB;IAClC,eAAe,EAAE,oBAAoB;IACrC,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,CAAC;IACf,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,SAAS,iBAAiB,CAAC,WAAwB;IACjD,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC;AAC5C,CAAC;AAED,MAAM,OAAO,iBAAkB,SAAQ,iBAAyC;IAC9E,MAAM,CAAU,YAAY,GAAG;QAC7B,GAAG,iBAAiB,CAAC,YAAY;QACjC,EAAE,EAAE,sBAAsB;QAC1B,SAAS,EAAE,oBAAoB;QAC/B,UAAU,EAAE,iBAAiB;KAEP,CAAC;IAEjB,SAAS,GAAoD,IAAI,CAAC;IAClE,WAAW,GAAuB,IAAI,CAAC;IACvC,OAAO,GAAG,KAAK,CAAC;IAEf,QAAQ;QACf,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAEQ,OAAO,CAAC,WAAwB;QACvC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC;QAE5D,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,oBAAoB,CAAC;YAC3D,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE;gBAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;gBAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC,EAAE,KAAK,CAAC,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEkB,eAAe,CAAC,QAAkB;QACnD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,WAAW,GACf,IAAI,CAAC,WAAW,CAAC,UAAU,IAAK,IAAI,CAAC,WAA2C,CAAC,MAAM,IAAI,IAAI,CAAC;QAClG,IAAI,CAAC,cAAc,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL,KAAC,eAAe,IAAe,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,YAC1E,cAAc,IADI,SAAS,CAEZ;SACnB,CAAC;IACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Component, type ComponentChildren } from 'preact';
2
+ export type LongPressButtonProps = {
3
+ onClick: () => void;
4
+ children: ComponentChildren;
5
+ };
6
+ export declare class LongPressButton extends Component<LongPressButtonProps> {
7
+ buttonPressTimer: ReturnType<typeof setTimeout> | null;
8
+ usingPointerEvents: boolean;
9
+ private stopEvent;
10
+ private repeat;
11
+ private startPress;
12
+ private endPress;
13
+ private handlePointerDown;
14
+ private handlePointerUp;
15
+ private handlePointerCancel;
16
+ private handleMouseDown;
17
+ private handleMouseUp;
18
+ private handleTouchStart;
19
+ private handleTouchEnd;
20
+ render(): import("preact").JSX.Element;
21
+ }
22
+ //# sourceMappingURL=long-press-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"long-press-button.d.ts","sourceRoot":"","sources":["../../src/widgets/long-press-button.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,SAAS,EAAE,KAAK,iBAAiB,EAAC,MAAM,QAAQ,CAAC;AAKzD,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AAEF,qBAAa,eAAgB,SAAQ,SAAS,CAAC,oBAAoB,CAAC;IAClE,gBAAgB,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAQ;IAC9D,kBAAkB,UAAS;IAE3B,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,MAAM,CAKZ;IAEF,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,iBAAiB,CAIvB;IAEF,OAAO,CAAC,eAAe,CAGrB;IAEF,OAAO,CAAC,mBAAmB,CAGzB;IAEF,OAAO,CAAC,eAAe,CAMrB;IAEF,OAAO,CAAC,aAAa,CAKnB;IAEF,OAAO,CAAC,gBAAgB,CAOtB;IAEF,OAAO,CAAC,cAAc,CAKpB;IAEF,MAAM;CA0BP"}