@deck.gl-community/widgets 9.2.5 → 9.3.1-alpha.0
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 +11 -1
- package/dist/graph-widgets/_deprecate/long-press-button.d.ts.map +1 -0
- package/dist/graph-widgets/_deprecate/long-press-button.js.map +1 -0
- package/dist/graph-widgets/_deprecate/view-control-widget.d.ts.map +1 -0
- package/dist/graph-widgets/_deprecate/view-control-widget.js.map +1 -0
- package/dist/{widgets → graph-widgets}/long-press-button.d.ts +1 -0
- package/dist/graph-widgets/long-press-button.d.ts.map +1 -0
- package/dist/{widgets → graph-widgets}/long-press-button.js +1 -0
- package/dist/graph-widgets/long-press-button.js.map +1 -0
- package/dist/graph-widgets/long-press-controller.d.ts.map +1 -0
- package/dist/graph-widgets/long-press-controller.js.map +1 -0
- package/dist/{widgets → graph-widgets}/pan-widget.d.ts +3 -2
- package/dist/graph-widgets/pan-widget.d.ts.map +1 -0
- package/dist/{widgets → graph-widgets}/pan-widget.js +19 -15
- package/dist/graph-widgets/pan-widget.js.map +1 -0
- package/dist/{widgets → graph-widgets}/zoom-range-widget.d.ts +3 -3
- package/dist/graph-widgets/zoom-range-widget.d.ts.map +1 -0
- package/dist/{widgets → graph-widgets}/zoom-range-widget.js +24 -23
- package/dist/graph-widgets/zoom-range-widget.js.map +1 -0
- package/dist/html-overlay-widgets/html-cluster-widget.d.ts.map +1 -0
- package/dist/html-overlay-widgets/html-cluster-widget.js.map +1 -0
- package/dist/{widgets → html-overlay-widgets}/html-overlay-item.d.ts +1 -0
- package/dist/html-overlay-widgets/html-overlay-item.d.ts.map +1 -0
- package/dist/html-overlay-widgets/html-overlay-item.js.map +1 -0
- package/dist/{widgets → html-overlay-widgets}/html-overlay-widget.d.ts +8 -2
- package/dist/html-overlay-widgets/html-overlay-widget.d.ts.map +1 -0
- package/dist/{widgets → html-overlay-widgets}/html-overlay-widget.js +21 -7
- package/dist/html-overlay-widgets/html-overlay-widget.js.map +1 -0
- package/dist/{widgets → html-overlay-widgets}/html-tooltip-widget.d.ts +1 -0
- package/dist/html-overlay-widgets/html-tooltip-widget.d.ts.map +1 -0
- package/dist/html-overlay-widgets/html-tooltip-widget.js.map +1 -0
- package/dist/index.cjs +5119 -87
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +33 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -6
- package/dist/index.js.map +1 -1
- package/dist/keyboard-shortcuts/keyboard-shortcuts-manager.d.ts +18 -0
- package/dist/keyboard-shortcuts/keyboard-shortcuts-manager.d.ts.map +1 -0
- package/dist/keyboard-shortcuts/keyboard-shortcuts-manager.js +47 -0
- package/dist/keyboard-shortcuts/keyboard-shortcuts-manager.js.map +1 -0
- package/dist/keyboard-shortcuts/keyboard-shortcuts.d.ts +22 -0
- package/dist/keyboard-shortcuts/keyboard-shortcuts.d.ts.map +1 -0
- package/dist/keyboard-shortcuts/keyboard-shortcuts.js +83 -0
- package/dist/keyboard-shortcuts/keyboard-shortcuts.js.map +1 -0
- package/dist/lib/settings/settings.d.ts +17 -0
- package/dist/lib/settings/settings.d.ts.map +1 -0
- package/dist/lib/settings/settings.js +140 -0
- package/dist/lib/settings/settings.js.map +1 -0
- package/dist/ready-to-upstream-widgets/reset-view-widget.d.ts +21 -0
- package/dist/ready-to-upstream-widgets/reset-view-widget.d.ts.map +1 -0
- package/dist/ready-to-upstream-widgets/reset-view-widget.js +29 -0
- package/dist/ready-to-upstream-widgets/reset-view-widget.js.map +1 -0
- package/dist/widget-components/icon-button.d.ts +12 -0
- package/dist/widget-components/icon-button.d.ts.map +1 -0
- package/dist/widget-components/icon-button.js +12 -0
- package/dist/widget-components/icon-button.js.map +1 -0
- package/dist/widget-components/select-widget-component.d.ts +15 -0
- package/dist/widget-components/select-widget-component.d.ts.map +1 -0
- package/dist/widget-components/select-widget-component.js +229 -0
- package/dist/widget-components/select-widget-component.js.map +1 -0
- package/dist/widget-panels/box-widget.d.ts +43 -0
- package/dist/widget-panels/box-widget.d.ts.map +1 -0
- package/dist/widget-panels/box-widget.js +191 -0
- package/dist/widget-panels/box-widget.js.map +1 -0
- package/dist/widget-panels/box-widget.test.d.ts +2 -0
- package/dist/widget-panels/box-widget.test.d.ts.map +1 -0
- package/dist/widget-panels/box-widget.test.js +41 -0
- package/dist/widget-panels/box-widget.test.js.map +1 -0
- package/dist/widget-panels/full-screen-panel-widget.d.ts +33 -0
- package/dist/widget-panels/full-screen-panel-widget.d.ts.map +1 -0
- package/dist/widget-panels/full-screen-panel-widget.js +153 -0
- package/dist/widget-panels/full-screen-panel-widget.js.map +1 -0
- package/dist/widget-panels/full-screen-panel-widget.test.d.ts +2 -0
- package/dist/widget-panels/full-screen-panel-widget.test.d.ts.map +1 -0
- package/dist/widget-panels/full-screen-panel-widget.test.js +40 -0
- package/dist/widget-panels/full-screen-panel-widget.test.js.map +1 -0
- package/dist/widget-panels/heap-memory-widget.d.ts +26 -0
- package/dist/widget-panels/heap-memory-widget.d.ts.map +1 -0
- package/dist/widget-panels/heap-memory-widget.js +156 -0
- package/dist/widget-panels/heap-memory-widget.js.map +1 -0
- package/dist/widget-panels/keyboard-shortcuts-widget.d.ts +46 -0
- package/dist/widget-panels/keyboard-shortcuts-widget.d.ts.map +1 -0
- package/dist/widget-panels/keyboard-shortcuts-widget.js +301 -0
- package/dist/widget-panels/keyboard-shortcuts-widget.js.map +1 -0
- package/dist/widget-panels/modal-widget.d.ts +62 -0
- package/dist/widget-panels/modal-widget.d.ts.map +1 -0
- package/dist/widget-panels/modal-widget.js +309 -0
- package/dist/widget-panels/modal-widget.js.map +1 -0
- package/dist/widget-panels/modal-widget.test.d.ts +2 -0
- package/dist/widget-panels/modal-widget.test.d.ts.map +1 -0
- package/dist/widget-panels/modal-widget.test.js +103 -0
- package/dist/widget-panels/modal-widget.test.js.map +1 -0
- package/dist/widget-panels/omni-box-widget.d.ts +59 -0
- package/dist/widget-panels/omni-box-widget.d.ts.map +1 -0
- package/dist/widget-panels/omni-box-widget.js +562 -0
- package/dist/widget-panels/omni-box-widget.js.map +1 -0
- package/dist/widget-panels/omni-box-widget.test.d.ts +2 -0
- package/dist/widget-panels/omni-box-widget.test.d.ts.map +1 -0
- package/dist/widget-panels/omni-box-widget.test.js +49 -0
- package/dist/widget-panels/omni-box-widget.test.js.map +1 -0
- package/dist/widget-panels/reset-view-widget.d.ts +20 -0
- package/dist/widget-panels/reset-view-widget.d.ts.map +1 -0
- package/dist/widget-panels/reset-view-widget.js +28 -0
- package/dist/widget-panels/reset-view-widget.js.map +1 -0
- package/dist/widget-panels/settings-panel.d.ts +49 -0
- package/dist/widget-panels/settings-panel.d.ts.map +1 -0
- package/dist/widget-panels/settings-panel.js +263 -0
- package/dist/widget-panels/settings-panel.js.map +1 -0
- package/dist/widget-panels/settings-panel.test.d.ts +2 -0
- package/dist/widget-panels/settings-panel.test.d.ts.map +1 -0
- package/dist/widget-panels/settings-panel.test.js +217 -0
- package/dist/widget-panels/settings-panel.test.js.map +1 -0
- package/dist/widget-panels/sidebar-widget.d.ts +65 -0
- package/dist/widget-panels/sidebar-widget.d.ts.map +1 -0
- package/dist/widget-panels/sidebar-widget.js +339 -0
- package/dist/widget-panels/sidebar-widget.js.map +1 -0
- package/dist/widget-panels/sidebar-widget.test.d.ts +2 -0
- package/dist/widget-panels/sidebar-widget.test.d.ts.map +1 -0
- package/dist/widget-panels/sidebar-widget.test.js +175 -0
- package/dist/widget-panels/sidebar-widget.test.js.map +1 -0
- package/dist/widget-panels/stats-panel.d.ts +34 -0
- package/dist/widget-panels/stats-panel.d.ts.map +1 -0
- package/dist/widget-panels/stats-panel.js +61 -0
- package/dist/widget-panels/stats-panel.js.map +1 -0
- package/dist/widget-panels/stats-panel.test.d.ts +2 -0
- package/dist/widget-panels/stats-panel.test.d.ts.map +1 -0
- package/dist/widget-panels/stats-panel.test.js +36 -0
- package/dist/widget-panels/stats-panel.test.js.map +1 -0
- package/dist/widget-panels/text-editor-panel-monaco-runtime.d.ts +17 -0
- package/dist/widget-panels/text-editor-panel-monaco-runtime.d.ts.map +1 -0
- package/dist/widget-panels/text-editor-panel-monaco-runtime.js +69 -0
- package/dist/widget-panels/text-editor-panel-monaco-runtime.js.map +1 -0
- package/dist/widget-panels/text-editor-panel.d.ts +42 -0
- package/dist/widget-panels/text-editor-panel.d.ts.map +1 -0
- package/dist/widget-panels/text-editor-panel.js +249 -0
- package/dist/widget-panels/text-editor-panel.js.map +1 -0
- package/dist/widget-panels/text-editor-panel.test.d.ts +2 -0
- package/dist/widget-panels/text-editor-panel.test.d.ts.map +1 -0
- package/dist/widget-panels/text-editor-panel.test.js +393 -0
- package/dist/widget-panels/text-editor-panel.test.js.map +1 -0
- package/dist/widget-panels/time-measure-widget.d.ts +49 -0
- package/dist/widget-panels/time-measure-widget.d.ts.map +1 -0
- package/dist/widget-panels/time-measure-widget.js +351 -0
- package/dist/widget-panels/time-measure-widget.js.map +1 -0
- package/dist/widget-panels/toast-manager.d.ts +24 -0
- package/dist/widget-panels/toast-manager.d.ts.map +1 -0
- package/dist/widget-panels/toast-manager.js +96 -0
- package/dist/widget-panels/toast-manager.js.map +1 -0
- package/dist/widget-panels/toast-manager.test.d.ts +2 -0
- package/dist/widget-panels/toast-manager.test.d.ts.map +1 -0
- package/dist/widget-panels/toast-manager.test.js +75 -0
- package/dist/widget-panels/toast-manager.test.js.map +1 -0
- package/dist/widget-panels/toast-widget.d.ts +20 -0
- package/dist/widget-panels/toast-widget.d.ts.map +1 -0
- package/dist/widget-panels/toast-widget.js +207 -0
- package/dist/widget-panels/toast-widget.js.map +1 -0
- package/dist/widget-panels/toast-widget.test.d.ts +2 -0
- package/dist/widget-panels/toast-widget.test.d.ts.map +1 -0
- package/dist/widget-panels/toast-widget.test.js +81 -0
- package/dist/widget-panels/toast-widget.test.js.map +1 -0
- package/dist/widget-panels/toggle-widget.d.ts +34 -0
- package/dist/widget-panels/toggle-widget.d.ts.map +1 -0
- package/dist/widget-panels/toggle-widget.js +46 -0
- package/dist/widget-panels/toggle-widget.js.map +1 -0
- package/dist/widget-panels/toolbar-widget.d.ts +53 -0
- package/dist/widget-panels/toolbar-widget.d.ts.map +1 -0
- package/dist/widget-panels/toolbar-widget.js +160 -0
- package/dist/widget-panels/toolbar-widget.js.map +1 -0
- package/dist/widget-panels/toolbar-widget.test.d.ts +2 -0
- package/dist/widget-panels/toolbar-widget.test.d.ts.map +1 -0
- package/dist/widget-panels/toolbar-widget.test.js +105 -0
- package/dist/widget-panels/toolbar-widget.test.js.map +1 -0
- package/dist/widget-panels/widget-containers.d.ts +275 -0
- package/dist/widget-panels/widget-containers.d.ts.map +1 -0
- package/dist/widget-panels/widget-containers.js +761 -0
- package/dist/widget-panels/widget-containers.js.map +1 -0
- package/dist/widget-panels/widget-containers.test.d.ts +2 -0
- package/dist/widget-panels/widget-containers.test.d.ts.map +1 -0
- package/dist/widget-panels/widget-containers.test.js +337 -0
- package/dist/widget-panels/widget-containers.test.js.map +1 -0
- package/dist/widget-panels/y-zoom-widget.d.ts +66 -0
- package/dist/widget-panels/y-zoom-widget.d.ts.map +1 -0
- package/dist/widget-panels/y-zoom-widget.js +264 -0
- package/dist/widget-panels/y-zoom-widget.js.map +1 -0
- package/dist/widget-panels/y-zoom-widget.test.d.ts +2 -0
- package/dist/widget-panels/y-zoom-widget.test.d.ts.map +1 -0
- package/dist/widget-panels/y-zoom-widget.test.js +71 -0
- package/dist/widget-panels/y-zoom-widget.test.js.map +1 -0
- package/dist/widgets/heap-memory-widget.d.ts +26 -0
- package/dist/widgets/heap-memory-widget.d.ts.map +1 -0
- package/dist/widgets/heap-memory-widget.js +158 -0
- package/dist/widgets/heap-memory-widget.js.map +1 -0
- package/dist/widgets/keyboard-shortcuts-widget.d.ts +28 -0
- package/dist/widgets/keyboard-shortcuts-widget.d.ts.map +1 -0
- package/dist/widgets/keyboard-shortcuts-widget.js +125 -0
- package/dist/widgets/keyboard-shortcuts-widget.js.map +1 -0
- package/dist/widgets/omni-box-widget.d.ts +59 -0
- package/dist/widgets/omni-box-widget.d.ts.map +1 -0
- package/dist/widgets/omni-box-widget.js +493 -0
- package/dist/widgets/omni-box-widget.js.map +1 -0
- package/dist/widgets/settings-widget.d.ts +64 -0
- package/dist/widgets/settings-widget.d.ts.map +1 -0
- package/dist/widgets/settings-widget.js +148 -0
- package/dist/widgets/settings-widget.js.map +1 -0
- package/dist/widgets/view-manager-utils.d.ts +1 -1
- package/dist/widgets/view-manager-utils.d.ts.map +1 -1
- package/dist/widgets/view-manager-utils.js.map +1 -1
- package/package.json +4 -3
- package/src/{widgets → graph-widgets}/long-press-button.tsx +1 -0
- package/src/{widgets → graph-widgets}/pan-widget.tsx +30 -23
- package/src/{widgets → graph-widgets}/zoom-range-widget.tsx +36 -34
- package/src/{widgets → html-overlay-widgets}/html-overlay-item.tsx +1 -0
- package/src/{widgets → html-overlay-widgets}/html-overlay-widget.tsx +32 -9
- package/src/{widgets → html-overlay-widgets}/html-tooltip-widget.tsx +1 -0
- package/src/index.ts +109 -12
- package/src/keyboard-shortcuts/keyboard-shortcuts-manager.ts +58 -0
- package/src/keyboard-shortcuts/keyboard-shortcuts.ts +113 -0
- package/src/keyboard-shortcuts/keyboard-shortcuts.ts.disabled +107 -0
- package/src/lib/settings/settings.ts +203 -0
- package/src/ready-to-upstream-widgets/reset-view-widget.tsx +57 -0
- package/src/widget-components/icon-button.tsx +38 -0
- package/src/widget-components/select-widget-component.tsx +354 -0
- package/src/widget-panels/box-widget.test.tsx +50 -0
- package/src/widget-panels/box-widget.tsx +284 -0
- package/src/widget-panels/full-screen-panel-widget.test.tsx +49 -0
- package/src/widget-panels/full-screen-panel-widget.tsx +223 -0
- package/src/widget-panels/heap-memory-widget.tsx +221 -0
- package/src/widget-panels/keyboard-shortcuts-widget.tsx +511 -0
- package/src/widget-panels/modal-widget.test.tsx +124 -0
- package/src/widget-panels/modal-widget.tsx +464 -0
- package/src/widget-panels/omni-box-widget.test.tsx +59 -0
- package/src/widget-panels/omni-box-widget.tsx +849 -0
- package/src/widget-panels/reset-view-widget.tsx +56 -0
- package/src/widget-panels/settings-panel.test.tsx +286 -0
- package/src/widget-panels/settings-panel.tsx +619 -0
- package/src/widget-panels/sidebar-widget.test.tsx +215 -0
- package/src/widget-panels/sidebar-widget.tsx +525 -0
- package/src/widget-panels/stats-panel.test.tsx +41 -0
- package/src/widget-panels/stats-panel.tsx +108 -0
- package/src/widget-panels/text-editor-panel-monaco-runtime.ts +97 -0
- package/src/widget-panels/text-editor-panel.test.tsx +618 -0
- package/src/widget-panels/text-editor-panel.tsx +375 -0
- package/src/widget-panels/time-measure-widget.tsx +445 -0
- package/src/widget-panels/toast-manager.test.ts +98 -0
- package/src/widget-panels/toast-manager.ts +134 -0
- package/src/widget-panels/toast-widget.test.tsx +105 -0
- package/src/widget-panels/toast-widget.tsx +293 -0
- package/src/widget-panels/toggle-widget.tsx +93 -0
- package/src/widget-panels/toolbar-widget.test.ts +129 -0
- package/src/widget-panels/toolbar-widget.tsx +293 -0
- package/src/widget-panels/widget-containers.test.tsx +453 -0
- package/src/widget-panels/widget-containers.tsx +1330 -0
- package/src/widget-panels/worker-modules.d.ts +7 -0
- package/src/widget-panels/y-zoom-widget.test.tsx +101 -0
- package/src/widget-panels/y-zoom-widget.tsx +376 -0
- package/src/widgets/heap-memory-widget.tsx +223 -0
- package/src/widgets/keyboard-shortcuts-widget.tsx +245 -0
- package/src/widgets/omni-box-widget.tsx +768 -0
- package/src/widgets/settings-widget.tsx +277 -0
- package/src/widgets/view-manager-utils.ts +1 -1
- package/dist/_deprecate/long-press-button.d.ts.map +0 -1
- package/dist/_deprecate/long-press-button.js.map +0 -1
- package/dist/_deprecate/view-control-widget.d.ts.map +0 -1
- package/dist/_deprecate/view-control-widget.js.map +0 -1
- package/dist/widgets/html-cluster-widget.d.ts.map +0 -1
- package/dist/widgets/html-cluster-widget.js.map +0 -1
- package/dist/widgets/html-overlay-item.d.ts.map +0 -1
- package/dist/widgets/html-overlay-item.js.map +0 -1
- package/dist/widgets/html-overlay-widget.d.ts.map +0 -1
- package/dist/widgets/html-overlay-widget.js.map +0 -1
- package/dist/widgets/html-tooltip-widget.d.ts.map +0 -1
- package/dist/widgets/html-tooltip-widget.js.map +0 -1
- package/dist/widgets/long-press-button.d.ts.map +0 -1
- package/dist/widgets/long-press-button.js.map +0 -1
- package/dist/widgets/long-press-controller.d.ts.map +0 -1
- package/dist/widgets/long-press-controller.js.map +0 -1
- package/dist/widgets/pan-widget.d.ts.map +0 -1
- package/dist/widgets/pan-widget.js.map +0 -1
- package/dist/widgets/zoom-range-widget.d.ts.map +0 -1
- package/dist/widgets/zoom-range-widget.js.map +0 -1
- /package/dist/{_deprecate → graph-widgets/_deprecate}/long-press-button.d.ts +0 -0
- /package/dist/{_deprecate → graph-widgets/_deprecate}/long-press-button.js +0 -0
- /package/dist/{_deprecate → graph-widgets/_deprecate}/view-control-widget.d.ts +0 -0
- /package/dist/{_deprecate → graph-widgets/_deprecate}/view-control-widget.js +0 -0
- /package/dist/{widgets → graph-widgets}/long-press-controller.d.ts +0 -0
- /package/dist/{widgets → graph-widgets}/long-press-controller.js +0 -0
- /package/dist/{widgets → html-overlay-widgets}/html-cluster-widget.d.ts +0 -0
- /package/dist/{widgets → html-overlay-widgets}/html-cluster-widget.js +0 -0
- /package/dist/{widgets → html-overlay-widgets}/html-overlay-item.js +0 -0
- /package/dist/{widgets → html-overlay-widgets}/html-tooltip-widget.js +0 -0
- /package/src/{_deprecate → graph-widgets/_deprecate}/long-press-button.tsx +0 -0
- /package/src/{_deprecate → graph-widgets/_deprecate}/view-control-widget.tsx +0 -0
- /package/src/{widgets → graph-widgets}/long-press-controller.ts +0 -0
- /package/src/{widgets → html-overlay-widgets}/html-cluster-widget.ts +0 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
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 _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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;ACIA,IAAAA,iBAAqB;;;;ACArB,oBAAgD;AAEhD,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAOrB,IAAO,kBAAP,cAA+B,wBAA+B;EAClE,mBAAyD;EACzD,qBAAqB;EAEb,UAAU,OAAY;AAC5B,UAAM,gBAAe;AACrB,QAAI,OAAQ,MAAc,6BAA6B,YAAY;AAChE,YAAc,yBAAwB;IACzC;AACA,QAAI,OAAQ,MAAc,mBAAmB,YAAY;AACtD,YAAc,eAAc;IAC/B;EACF;EAEQ,SAAS,MAAK;AACpB,QAAI,KAAK,kBAAkB;AACzB,WAAK,MAAM,QAAO;AAClB,WAAK,mBAAmB,WAAW,KAAK,QAAQ,kBAAkB;IACpE;EACF;EAEQ,WAAW,OAAY;AAC7B,SAAK,UAAU,KAAK;AACpB,SAAK,MAAM,QAAO;AAClB,SAAK,mBAAmB,WAAW,KAAK,QAAQ,eAAe;EACjE;EAEQ,SAAS,OAAa;AAC5B,QAAI,OAAO;AACT,WAAK,UAAU,KAAK;IACtB;AACA,QAAI,KAAK,kBAAkB;AACzB,mBAAa,KAAK,gBAAgB;IACpC;AACA,SAAK,mBAAmB;EAC1B;EAEQ,oBAAoB,CAAC,UAAuB;;AAClD,SAAK,qBAAqB;AACzB,sBAAM,kBAAN,mBAA4C,sBAA5C,4BAAgE,MAAM;AACvE,SAAK,WAAW,KAAK;EACvB;EAEQ,kBAAkB,CAAC,UAAuB;;AAC/C,sBAAM,kBAAN,mBAA4C,0BAA5C,4BAAoE,MAAM;AAC3E,SAAK,SAAS,KAAK;EACrB;EAEQ,sBAAsB,CAAC,UAAuB;;AACnD,sBAAM,kBAAN,mBAA4C,0BAA5C,4BAAoE,MAAM;AAC3E,SAAK,SAAS,KAAK;EACrB;EAEQ,kBAAkB,CAAC,UAAqB;AAC9C,QAAI,KAAK,oBAAoB;AAC3B;IACF;AACA,SAAK,WAAW,KAAK;AACrB,aAAS,iBAAiB,WAAW,KAAK,eAAe,EAAC,MAAM,KAAI,CAAC;EACvE;EAEQ,gBAAgB,CAAC,UAAqB;AAC5C,QAAI,KAAK,oBAAoB;AAC3B;IACF;AACA,SAAK,SAAS,KAAK;EACrB;EAEQ,mBAAmB,CAAC,UAAqB;AAC/C,QAAI,KAAK,oBAAoB;AAC3B;IACF;AACA,SAAK,WAAW,KAAK;AACrB,aAAS,iBAAiB,YAAY,KAAK,gBAAgB,EAAC,MAAM,KAAI,CAAC;AACvE,aAAS,iBAAiB,eAAe,KAAK,gBAAgB,EAAC,MAAM,KAAI,CAAC;EAC5E;EAEQ,iBAAiB,CAAC,UAAqB;AAC7C,QAAI,KAAK,oBAAoB;AAC3B;IACF;AACA,SAAK,SAAS,KAAK;EACrB;EAEA,SAAM;AACJ,eACE,mBAAAC,KAAA,OAAA,EAAK,WAAU,sBAAoB,cACjC,mBAAAA,KAAA,OAAA,EACE,OAAO,EAAC,eAAe,OAAM,GAC7B,eAAe,KAAK,mBACpB,aAAa,KAAK,iBAClB,iBAAiB,KAAK,qBACtB,eAAe,CAAC,UAAU,KAAK,UAAU,KAAK,GAC9C,gBAAgB,KAAK,qBACrB,cAAc,KAAK,qBACnB,aAAa,KAAK,iBAClB,WAAW,KAAK,eAChB,aAAa,CAAC,UAAU,KAAK,UAAU,KAAK,GAC5C,cAAc,KAAK,kBACnB,YAAY,KAAK,gBACjB,aAAa,CAAC,UAAU,KAAK,UAAU,KAAK,GAC5C,eAAe,CAAC,UAAU,MAAM,eAAc,GAC9C,SAAS,CAAC,UAAU,KAAK,UAAU,KAAK,GACxC,SAAS,CAAC,UAAU,KAAK,UAAU,KAAK,GAAC,UAExC,KAAK,MAAM,SAAQ,CAAA,EAChB,CAAA;EAGZ;;;;AC7GI,SAAU,eAAe,MAAiB;AAC9C,SAAO,QAAQ,QAAQ,OAAO,SAAS,YAAY,iBAAiB,IAAI;AAC1E;AAEM,SAAU,eAAe,OAAc;AAC3C,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,WAAO,EAAC,GAAI,MAAiC;EAC/C;AACA,SAAO,CAAA;AACT;;;AFfA,kBAMO;AASP,IAAM,gBAA8C;EAClD,UAAU;EACV,SAAS;EACT,eAAe;EACf,YAAY;EACZ,QAAQ;EACR,YAAY;;AAGd,IAAM,6BAAgD;EACpD,UAAU;EACV,YAAY;EACZ,cAAc;EACd,QAAQ;EACR,WAAW;EACX,QAAQ;EACR,OAAO;;AAGT,IAAM,0BAA6C;EACjD,OAAO;EACP,QAAQ;EACR,UAAU;EACV,eAAe;;AAGX,IAAO,aAAP,cAAyB,mBAAsB;EAWnD,YAA6B;EAC7B,YAAY;EACZ,OAAqB;EACrB;EAEA,YAAY,QAAwB,CAAA,GAAE;AACpC,UAAM,EAAC,GAAG,WAAU,cAAc,GAAG,MAAK,CAAC;AAC3C,SAAK,SAAS,MAAM,UAAU;AAC9B,SAAK,YAAY,MAAM,aAAa;AACpC,SAAK,OAAO,MAAM,QAAQ,WAAU,aAAa;EACnD;EAES,SAAS,OAA8B;AAC9C,QAAI,MAAM,WAAW,QAAW;AAC9B,WAAK,SAAS,MAAM;IACtB;AACA,QAAI,MAAM,cAAc,QAAW;AACjC,WAAK,YAAY,MAAM;IACzB;AACA,QAAI,MAAM,SAAS,QAAW;AAC5B,WAAK,OAAO,MAAM;IACpB;AACA,UAAM,SAAS,KAAK;EACtB;EAES,MAAM,EAAC,MAAM,OAAM,GAAsC;AAChE,SAAK,OAAO;AACZ,QAAI,KAAK,WAAW,QAAW;AAC7B,WAAK,SAAS;IAChB;EACF;EAES,WAAQ;AACf,SAAK,OAAO;EACd;EAES,aAAa,aAAwB;AAC5C,UAAM,QAAQ,EAAC,GAAG,eAAe,GAAG,KAAK,MAAM,MAAK;AACpD,WAAO,OAAO,YAAY,OAAO,KAAK;AAEtC,UAAM,UAAU;MACd,EAAC,KAAK,IAAI,MAAM,IAAI,SAAS,MAAM,KAAK,UAAU,GAAG,KAAK,IAAI,GAAG,OAAO,UAAK,KAAK,KAAI;MACtF,EAAC,KAAK,IAAI,MAAM,GAAG,SAAS,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,GAAG,OAAO,UAAK,KAAK,OAAM;MACvF,EAAC,KAAK,IAAI,MAAM,IAAI,SAAS,MAAM,KAAK,UAAU,CAAC,KAAK,MAAM,CAAC,GAAG,OAAO,UAAK,KAAK,QAAO;MAC1F,EAAC,KAAK,IAAI,MAAM,IAAI,SAAS,MAAM,KAAK,UAAU,GAAG,CAAC,KAAK,IAAI,GAAG,OAAO,UAAK,KAAK,OAAM;;AAG3F,UAAM,SACJ,oBAAAC,KAAA,OAAA,EAAK,OAAO,4BAA0B,UACnC,QAAQ,IAAI,CAAC,WAAU;AACtB,YAAM,cAAiC;QACrC,GAAG;QACH,KAAK,GAAG,OAAO;QACf,MAAM,GAAG,OAAO;;AAGlB,iBACE,oBAAAA,KAAA,OAAA,EAAsB,OAAO,aAAW,cACtC,oBAAAA,KAAC,iBAAe,EAAC,SAAS,OAAO,SAAO,UAAG,OAAO,MAAK,CAAA,EAAmB,GADlE,OAAO,GAAG;IAIxB,CAAC,EAAC,CAAA;AAIN,+BAAO,IAAI,WAAW;EACxB;EAEQ,qBAAkB;;AACxB,UAAM,OAAO,KAAK;AAClB,QAAI,CAAC,MAAM;AACT,aAAO,CAAA;IACT;AAEA,QAAI,KAAK,QAAQ;AACf,UAAI,eAAe,IAAI,GAAG;AACxB,cAAM,YAAW,UAAK,gBAAL,mBAAkB,YAAY,KAAK;AACpD,eAAO,WAAW,CAAC,QAAQ,IAAI,CAAA;MACjC;AACA,aAAO,CAAA;IACT;AACA,WAAO,KAAK,aAAY;EAC1B;EAEQ,aAAa,UAAkB;AACrC,UAAM,OAAO,KAAK;AAClB,UAAM,cAAc,eAAe,IAAI,IAAI,KAAK,cAAc;AAC9D,UAAM,SAAS,KAAK,UAAU,SAAS;AACvC,QAAI,aAAa;AACf,UAAI;AACF,eAAO,EAAC,GAAG,YAAY,aAAa,MAAM,EAAC;MAC7C,SAAS,KAAP;AACA,eAAO,eAAe,YAAY,SAAS;MAC7C;IACF;AACA,WAAO,eAAe,QAAQ;EAChC;EAEQ,UAAU,QAAgB,QAAc;AAC9C,QAAI,CAAC,KAAK,MAAM;AACd;IACF;AAEA,UAAM,YAAY,KAAK,mBAAkB;AACzC,eAAW,YAAY,WAAW;AAChC,YAAM,SAAS,SAAS,UAAU,CAAC,SAAS,QAAQ,GAAG,SAAS,SAAS,CAAC,CAAC;AAC3E,UAAI,QAAQ;AACV,cAAM,YAA8B;UAClC,SAAS,QAAQ,IAAI;UACrB,SAAS,SAAS,IAAI;;AAGxB,cAAM,YAAY,KAAK,aAAa,QAAQ;AAC5C,cAAM,YAAY,SAAS,cAAc,QAAQ,SAAS;AAC1D,cAAM,gBAAgB,EAAC,GAAG,WAAW,GAAG,UAAS;AACjD,cAAM,SAAS,KAAK,UAAU,SAAS,MAAM;AAG7C,aAAK,KAAK,mBAAmB,EAAC,QAAQ,WAAW,eAAe,kBAAkB,CAAA,EAAE,CAAC;MACvF;IACF;EACF;;AApII,IAAO,YAAP;AACJ,cADW,WACK,gBAAe;EAC7B,IAAI;EACJ,QAAQ;EACR,YAAY;EACZ,WAAW;EACX,MAAM;EACN,OAAO,CAAA;EACP,WAAW;;;;;AGrDf,IAAAC,iBAAqB;AAIrB,IAAAC,eAMO;AAUP,IAAMC,iBAA8C;EAClD,UAAU;EACV,SAAS;EACT,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,QAAQ;EACR,WAAW;EACX,SAAS;EACT,OAAO;EACP,YAAY;EACZ,eAAe;;AAGjB,IAAM,oBAAuC;EAC3C,QAAQ;EACR,UAAU;EACV,YAAY;EACZ,QAAQ;;AAGV,IAAM,yBAA4C;EAChD,SAAS;EACT,QAAQ;EACR,SAAS;EACT,OAAO;;AAGT,IAAM,wBAA2C;EAC/C,aAAa;EACb,QAAQ;EACR,SAAS;EACT,QAAQ;EACR,OAAO;;AAGH,IAAO,mBAAP,cAA+B,oBAA4B;EAe/D,YAA6B;EAC7B,YAAY;EACZ,OAAqB;EACrB;EACA,cAAc;EACd,kBAAiC;EACjC,kBAAiC;EAEjC,YAAY,QAA8B,CAAA,GAAE;AAC1C,UAAM,EAAC,GAAG,iBAAgB,cAAc,GAAG,MAAK,CAAC;AACjD,SAAK,SAAS,MAAM,UAAU;AAC9B,SAAK,YAAY,MAAM,aAAa;AACpC,SAAK,OAAO,MAAM,QAAQ,iBAAgB,aAAa;EACzD;EAES,SAAS,OAAoC;AACpD,QAAI,MAAM,WAAW,QAAW;AAC9B,WAAK,SAAS,MAAM;IACtB;AACA,QAAI,MAAM,cAAc,QAAW;AACjC,WAAK,YAAY,MAAM;IACzB;AACA,QAAI,MAAM,SAAS,QAAW;AAC5B,WAAK,OAAO,MAAM;IACpB;AACA,UAAM,SAAS,KAAK;EACtB;EAES,MAAM,EAAC,MAAM,OAAM,GAAsC;AAChE,SAAK,OAAO;AACZ,QAAI,KAAK,WAAW,QAAW;AAC7B,WAAK,SAAS;IAChB;EACF;EAES,WAAQ;AACf,SAAK,OAAO;EACd;EAES,aAAa,aAAwB;AAC5C,UAAM,QAAQ,EAAC,GAAGA,gBAAe,GAAG,KAAK,MAAM,MAAK;AACpD,WAAO,OAAO,YAAY,OAAO,KAAK;AAEtC,UAAM,EAAC,SAAS,QAAO,IAAI,KAAK,cAAa;AAC7C,UAAM,cAAc,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,KAAK,WAAW,CAAC;AAEzE,UAAM,uBAAuB,CAAC,UAAgB;AAC5C,YAAM,gBAAe;AACrB,UAAI,OAAQ,MAAc,6BAA6B,YAAY;AAChE,cAAc,yBAAwB;MACzC;IACF;AAEA,UAAM,SACJ,oBAAAC,MAAA,oBAAAC,UAAA,EAAA,UAAA,KACE,oBAAAC,KAAA,OAAA,EAAK,OAAO,mBAAiB,cAC3B,oBAAAA,KAAC,iBAAe,EAAC,SAAS,MAAM,KAAK,gBAAgB,KAAK,IAAI,GAAC,UAAG,IAAG,CAAA,EAAmB,CAAA,OAE1F,oBAAAA,KAAA,OAAA,EACE,OAAO,wBACP,eAAe,sBACf,eAAe,sBACf,aAAa,sBACb,aAAa,sBACb,aAAa,sBACb,WAAW,sBACX,SAAS,sBACT,SAAS,sBACT,cAAc,sBACd,aAAa,sBACb,YAAY,sBAAoB,cAEhC,oBAAAA,KAAA,SAAA;MACE,MAAK;MACL,OAAO;MACP,KAAK;MACL,KAAK;MACL,MAAM,KAAK;MACX,SAAS,CAAC,UAAU,KAAK,aAAa,OAAQ,MAAM,OAA4B,KAAK,CAAC;MACtF,UAAU,CAAC,UACT,KAAK,aAAa,OAAQ,MAAM,OAA4B,KAAK,CAAC;MAEpE,eAAe;MACf,eAAe;MACf,aAAa;MACb,aAAa;MACb,aAAa;MACb,WAAW;MACX,SAAS;MACT,SAAS;MACT,cAAc;MACd,aAAa;MACb,YAAY;;MAEZ,QAAO;MACP,OAAO;IAAqB,CAAA,EAC5B,CAAA,OAEJ,oBAAAA,KAAA,OAAA,EAAK,OAAO,mBAAiB,cAC3B,oBAAAA,KAAC,iBAAe,EAAC,SAAS,MAAM,KAAK,gBAAgB,CAAC,KAAK,IAAI,GAAC,UAAG,IAAG,CAAA,EAAmB,CAAA,CACrF,EAAA,CAAA;AAIV,+BAAO,IAAI,WAAW;EACxB;EAES,iBAAiB,UAAkB;AAC1C,UAAM,YAAY,KAAK,aAAa,QAAQ;AAC5C,UAAM,OAAO,OAAO,uCAAW,IAAI;AACnC,QAAI,OAAO,SAAS,IAAI,GAAG;AACzB,WAAK,cAAc;IACrB;AAEA,QAAI,KAAK,MAAM,YAAY,QAAW;AACpC,YAAM,UAAU,OAAO,uCAAW,OAAO;AACzC,UAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,aAAK,kBAAkB;MACzB;IACF;AAEA,QAAI,KAAK,MAAM,YAAY,QAAW;AACpC,YAAM,UAAU,OAAO,uCAAW,OAAO;AACzC,UAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,aAAK,kBAAkB;MACzB;IACF;AAEA,SAAK,WAAU;EACjB;EAEQ,gBAAa;AACnB,UAAM,UAAU,KAAK,MAAM,WAAW,KAAK,mBAAmB,OAAO;AACrE,UAAM,UAAU,KAAK,MAAM,WAAW,KAAK,mBAAmB,OAAO;AAErE,QAAI,UAAU,SAAS;AACrB,aAAO,EAAC,SAAS,SAAS,SAAS,QAAO;IAC5C;AACA,WAAO;MACL,SAAS,OAAO,SAAS,OAAO,IAAI,UAAU;MAC9C,SAAS,OAAO,SAAS,OAAO,IAAI,UAAU;;EAElD;EAEQ,qBAAkB;;AACxB,UAAM,OAAO,KAAK;AAClB,QAAI,CAAC,MAAM;AACT,aAAO,CAAA;IACT;AACA,QAAI,KAAK,QAAQ;AACf,UAAI,eAAe,IAAI,GAAG;AACxB,cAAM,YAAW,UAAK,gBAAL,mBAAkB,YAAY,KAAK;AACpD,eAAO,WAAW,CAAC,QAAQ,IAAI,CAAA;MACjC;AACA,aAAO,CAAA;IACT;AACA,WAAO,KAAK,aAAY;EAC1B;EAEQ,aAAa,UAAkB;AACrC,UAAM,OAAO,KAAK;AAClB,UAAM,cAAc,eAAe,IAAI,IAAI,KAAK,cAAc;AAC9D,UAAM,SAAS,KAAK,UAAU,SAAS;AACvC,QAAI,aAAa;AACf,UAAI;AACF,eAAO,EAAC,GAAG,YAAY,aAAa,MAAM,EAAC;MAC7C,SAAS,KAAP;AACA,eAAO,eAAe,YAAY,SAAS;MAC7C;IACF;AACA,WAAO,eAAe,QAAQ;EAChC;EAEQ,gBAAgB,OAAa;AACnC,UAAM,EAAC,SAAS,QAAO,IAAI,KAAK,cAAa;AAE7C,eAAW,YAAY,KAAK,mBAAkB,GAAI;AAChD,YAAM,YAAY,KAAK,aAAa,QAAQ;AAC5C,YAAM,WAAW,OAAO,UAAU,IAAI;AACtC,YAAM,UAAU,OAAO,SAAS,QAAQ,IAAI,WAAW,KAAK;AAC5D,YAAM,WAAW,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,UAAU,KAAK,CAAC;AACrE,WAAK,gBAAgB,UAAU,EAAC,GAAG,WAAW,MAAM,SAAQ,CAAC;IAC/D;EACF;EAEQ,aAAa,MAAY;AAC/B,UAAM,EAAC,SAAS,QAAO,IAAI,KAAK,cAAa;AAC7C,UAAM,WAAW,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,IAAI,CAAC;AAE1D,eAAW,YAAY,KAAK,mBAAkB,GAAI;AAChD,YAAM,YAAY,KAAK,aAAa,QAAQ;AAC5C,WAAK,gBAAgB,UAAU,EAAC,GAAG,WAAW,MAAM,SAAQ,CAAC;IAC/D;EACF;EAEQ,gBAAgB,UAAoB,WAAc;AACxD,QAAI,CAAC,KAAK,MAAM;AACd;IACF;AAEA,UAAM,SAAS,KAAK,UAAU,SAAS,MAAM;AAC7C,SAAK,cAAc,OAAO,UAAU,IAAI,KAAK,KAAK;AAClD,SAAK,WAAU;AAGf,SAAK,KAAK,mBAAmB,EAAC,QAAQ,WAAW,kBAAkB,CAAA,EAAE,CAAC;EACxE;;AA7NI,IAAO,kBAAP;AACJ,cADW,iBACK,gBAAe;EAC7B,IAAI;EACJ,QAAQ;EACR,YAAY;EACZ,WAAW;EACX,SAAS;EACT,SAAS;EACT,MAAM;EACN,OAAO,CAAA;EACP,WAAW;;;;;AClEf,IAAAC,iBAOO;AAEP,IAAAC,eAAqB;AAarB,IAAM,aAA2C;EAC/C,OAAO;EACP,QAAQ;EACR,UAAU;EACV,eAAe;EACf,UAAU;;AAGN,IAAO,qBAAP,cAEI,oBAAc;EAatB,YAA6B;EAC7B,YAAY;EACZ,OAAqB;EACX,WAA4B;EAEtC,YAAY,QAAgB,CAAA,GAAY;AACtC,UAAM,EAAC,GAAG,mBAAkB,cAAc,GAAG,MAAK,CAAC;AACnD,SAAK,SAAS,MAAM,UAAU;EAChC;EAES,SAAS,OAAsB;AACtC,QAAI,MAAM,WAAW,QAAW;AAC9B,WAAK,SAAS,MAAM;IACtB;AACA,UAAM,SAAS,KAAK;EACtB;EAES,MAAM,EAAC,MAAM,OAAM,GAAsC;AAChE,SAAK,OAAO;AACZ,QAAI,KAAK,WAAW,QAAW;AAC7B,WAAK,SAAS;IAChB;EACF;EAES,WAAQ;AACf,SAAK,OAAO;AACZ,SAAK,WAAW;EAClB;EAES,iBAAiB,UAAkB;AAC1C,QAAI,CAAC,KAAK,UAAU,KAAK,WAAW,SAAS,IAAI;AAC/C,WAAK,WAAW;AAChB,WAAK,WAAU;IACjB;EACF;EAEU,cAAW;AACnB,WAAO,KAAK;EACd;EAEU,UAAO;;AACf,aAAO,UAAK,aAAL,mBAAe,SAAQ;EAChC;EAEU,cAAc,GAAS;AAC/B,WAAO,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,QAAO,CAAE;EAC5C;EAEU,mBAAsB,WAAmB,GAAM,GAAI;AAC3D,WAAO,KAAK,QAAO,IAAK,YAAY,IAAI;EAC1C;EAEU,UAAU,UAAoB,aAAqB;AAC3D,UAAM,MAAM,SAAS,QAAQ,WAAW;AACxC,QAAI,CAAC;AAAK,aAAO,CAAC,IAAI,EAAE;AACxB,WAAO;EACT;EAEU,OAAO,UAAoB,CAAC,GAAG,CAAC,GAAW;AACnD,UAAM,iBAAiB,KAAK,MAAM,kBAAkB;AACpD,UAAM,EAAC,OAAO,OAAM,IAAI;AACxB,WAAO,EACL,IAAI,CAAC,kBACL,IAAI,CAAC,kBACL,IAAI,QAAQ,kBACZ,IAAI,SAAS;EAEjB;EAEU,gBAAgB,UAAkB;AAC1C,UAAM,EAAC,MAAK,IAAI,KAAK;AACrB,WAAQ,YAAQ,6BAAa,KAAK,IAAI,CAAA;EACxC;EAEU,aAAa,OAAgB,UAAkB;AACvD,UAAM,cAAuB,CAAA;AAC7B,UAAM,OAAO,OAAO,EAAE,QAAQ,CAAC,MAAM,UAAS;;AAC5C,YAAM,eAAe,UAAK,UAAL,mBAAoB;AACzC,UAAI,CAAC,aAAa;AAChB;MACF;AACA,YAAM,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,UAAU,WAAW;AACnD,UAAI,KAAK,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG;AACjC,cAAM,MAAM,KAAK,QAAQ,QAAQ,KAAK,QAAQ,SAAY,QAAQ,KAAK;AACvE,oBAAY,SAAK,6BAAa,MAAM,EAAC,GAAG,GAAG,IAAG,CAAC,CAAC;MAClD;IACF,CAAC;AAED,WAAO;EACT;EAES,aAAa,aAAwB;AAC5C,WAAO,OAAO,YAAY,OAAO,YAAY,EAAC,QAAQ,GAAG,KAAK,MAAM,UAAU,IAAG,CAAC;AAElF,UAAM,WAAW,KAAK,YAAW;AACjC,QAAI,CAAC,UAAU;AACb,iCAAO,MAAM,WAAW;AACxB;IACF;AAEA,UAAM,eAAe,KAAK,gBAAgB,QAAQ;AAClD,UAAM,gBAAgB,KAAK,aAAa,cAAc,QAAQ;AAE9D,mCAAO,oBAAAC,KAAC,yBAAQ,EAAA,UAAE,cAAa,CAAA,GAAc,WAAW;EAC1D;;AAvHI,IAAO,oBAAP;AAGJ,cAHW,mBAGK,gBAAe;EAC7B,IAAI;EACJ,QAAQ;EACR,YAAY;EACZ,gBAAgB;EAChB,QAAQ;EACR,OAAO,CAAA;EACP,WAAW;;;;;AC1BT,SAAU,gBAAgB,EAAC,IAAI,GAAG,IAAI,GAAG,UAAU,OAAO,GAAG,MAAK,GAAuB;AAC7F,QAAM,EAAC,SAAS,QAAQ,GAAG,eAAc,IAAI,SAAS,CAAA;AAEtD;;;;QAIE,oBAAAC,KAAA,OAAA,EACE,OAAO,EAAC,WAAW,aAAa,QAAQ,QAAQ,UAAU,YAAY,QAAQ,GAAG,SAAQ,GAAC,cAE1F,oBAAAA,KAAA,OAAA,EAAK,OAAO,EAAC,YAAY,QAAQ,GAAG,eAAc,GAAC,GAAM,OAAK,SACnD,CAAA,EACL,CAAA;;AAGZ;;;AC7BA,qBAAoB;AACpB,0BAAyB;AAQnB,IAAgB,oBAAhB,cAAmD,kBAAyC;EAMtF,eAAoC;EACpC,cAAgC;EAEvB,gBAAgB,UAAkB;AAtBvD;AAuBI,UAAM,aAAa,KAAK,cAAa;AACrC,QAAI,eAAe,KAAK,aAAa;AACnC,WAAK,eAAe,IAAI,oBAAAC,QAAa,KAAK,kBAAiB,CAAE;AAC7D,WAAK,aAAa,KAChB,WAAW,IAAI,CAAC,eAAW,sBAAM,KAAK,qBAAqB,MAAM,GAAG,EAAC,OAAM,CAAC,CAAC,CAAC;AAEhF,WAAK,cAAc;IACrB;AAEA,UAAM,aACJ,UAAK,iBAAL,mBAAmB,YAAY,CAAC,MAAM,KAAK,KAAK,EAAE,GAAG,KAAK,MAAM,KAAK,QAAO,CAAE,OAAM,CAAA;AAEtF,UAAM,eAAe,SAAS,IAC5B,CAAC,EACC,UAAU,EAAC,YAAW,GACtB,YAAY,EAAC,SAAS,aAAa,YAAY,YAAY,WAAW,OAAM,EAAC,MAE7E,UACI,KAAK,cAAc,aAAa,WAAW,UAAU,IACrD,KAAK,aAAa,aAAa,MAAM,CAAC;AAG9C,WAAO,aAAa,OAAO,OAAO;EACpC;EAEA,kBAAkB,WAAiB;AAhDrC;AAiDI,aACE,UAAK,iBAAL,mBACI,UAAU,WAAW,UACtB,IAAI,CAAC,SAAS,KAAK,WAAW,YAAsB,CAAA;EAE3D;;EAWA,oBAAiB;AACf,WAAO;MACL,SAAS;;EAEb;;AAvDA,cADoB,mBACJ,gBAAe;EAC7B,GAAG,kBAAkB;EACrB,IAAI;;;;;ACAR,IAAM,gBAAgB;EACpB,WAAW;EACX,iBAAiB;EACjB,SAAS;EACT,cAAc;EACd,OAAO;;AAGT,IAAM,uBAAuB;AAE7B,SAAS,kBAAkB,aAAwB;;AACjD,UAAO,uBAAY,WAAZ,mBAAoB,UAApB,mBAA2B;AACpC;AAEM,IAAO,oBAAP,cAAiC,kBAAyC;EAUtE,YAA6D;EAC7D,cAAkC;EAClC,UAAU;EAET,WAAQ;AACf,QAAI,KAAK,cAAc,MAAM;AAC3B,iBAAW,aAAa,KAAK,SAAS;AACtC,WAAK,YAAY;IACnB;AACA,SAAK,UAAU;AACf,SAAK,cAAc;EACrB;EAES,QAAQ,aAAwB;;AACvC,QAAI,KAAK,cAAc,MAAM;AAC3B,iBAAW,aAAa,KAAK,SAAS;AACtC,WAAK,YAAY;IACnB;AAEA,UAAM,kBAAiB,gBAAK,OAAM,eAAX,4BAAwB;AAE/C,QAAI,eAAe,gBAAgB;AACjC,YAAM,QAAQ,KAAK,MAAM,aAAa;AACtC,WAAK,YAAY,WAAW,WAAW,MAAK;AAC1C,aAAK,UAAU;AACf,aAAK,cAAc;AACnB,aAAK,WAAU;MACjB,GAAG,KAAK;IACV,OAAO;AACL,WAAK,UAAU;AACf,WAAK,cAAc;AACnB,WAAK,WAAU;IACjB;EACF;EAEmB,gBAAgB,UAAkB;;AACnD,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,aAAa;AACtC,aAAO,CAAA;IACT;AAEA,UAAM,kBAAiB,gBAAK,OAAM,eAAX,4BAAwB,KAAK;AACpD,UAAM,cACJ,KAAK,YAAY,cAChB,KAAK,YAA4C,UAClD;AACF,QAAI,CAAC,kBAAkB,CAAC,aAAa;AACnC,aAAO,CAAA;IACT;AAEA,WAAO;UACL,oBAAAC,KAAC,iBAAe,EAAe,aAA0B,OAAO,eAAa,UAC1E,eAAc,GADI,SAAS;;EAIlC;;AA/DA,cADW,mBACK,gBAAe;EAC7B,GAAG,kBAAkB;EACrB,IAAI;EACJ,WAAW;EACX,YAAY;;",
|
|
6
|
-
"names": ["import_preact", "_jsx", "_jsx", "import_preact", "import_core", "WRAPPER_STYLE", "_jsxs", "_Fragment", "_jsx", "import_preact", "import_core", "_jsx", "_jsx", "Supercluster", "_jsx"]
|
|
3
|
+
"sources": ["../src/index.ts", "../src/graph-widgets/pan-widget.tsx", "../src/graph-widgets/long-press-button.tsx", "../src/widgets/view-manager-utils.ts", "../src/graph-widgets/zoom-range-widget.tsx", "../src/html-overlay-widgets/html-overlay-widget.tsx", "../src/html-overlay-widgets/html-overlay-item.tsx", "../src/html-overlay-widgets/html-cluster-widget.ts", "../src/html-overlay-widgets/html-tooltip-widget.tsx", "../src/widgets/heap-memory-widget.tsx", "../src/widgets/settings-widget.tsx", "../src/widget-panels/settings-panel.tsx", "../src/lib/settings/settings.ts", "../src/widget-components/select-widget-component.tsx", "../src/widget-components/icon-button.tsx", "../src/widgets/omni-box-widget.tsx", "../src/widget-panels/reset-view-widget.tsx", "../src/widget-panels/time-measure-widget.tsx", "../src/widget-panels/toast-widget.tsx", "../src/widget-panels/toast-manager.ts", "../src/widget-panels/y-zoom-widget.tsx", "../src/widget-panels/widget-containers.tsx", "../src/widget-panels/box-widget.tsx", "../src/widget-panels/full-screen-panel-widget.tsx", "../src/widget-panels/keyboard-shortcuts-widget.tsx", "../src/keyboard-shortcuts/keyboard-shortcuts.ts", "../src/keyboard-shortcuts/keyboard-shortcuts-manager.ts", "../src/widget-panels/modal-widget.tsx", "../src/widget-panels/stats-panel.tsx", "../src/widget-panels/sidebar-widget.tsx", "../src/widget-panels/toolbar-widget.tsx", "../src/widget-panels/text-editor-panel.tsx", "../src/widget-panels/text-editor-panel-monaco-runtime.ts"],
|
|
4
|
+
"sourcesContent": ["// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport {PanWidget} from './graph-widgets/pan-widget';\nexport type {PanWidgetProps} from './graph-widgets/pan-widget';\n\nexport {ZoomRangeWidget} from './graph-widgets/zoom-range-widget';\nexport type {ZoomRangeWidgetProps} from './graph-widgets/zoom-range-widget';\n\nexport {HtmlOverlayWidget} from './html-overlay-widgets/html-overlay-widget';\nexport type {HtmlOverlayWidgetProps} from './html-overlay-widgets/html-overlay-widget';\nexport {HtmlOverlayItem} from './html-overlay-widgets/html-overlay-item';\nexport type {HtmlOverlayItemProps} from './html-overlay-widgets/html-overlay-item';\nexport {HtmlClusterWidget} from './html-overlay-widgets/html-cluster-widget';\nexport type {HtmlClusterWidgetProps} from './html-overlay-widgets/html-cluster-widget';\nexport {HtmlTooltipWidget} from './html-overlay-widgets/html-tooltip-widget';\nexport type {HtmlTooltipWidgetProps} from './html-overlay-widgets/html-tooltip-widget';\n\nexport {HeapMemoryWidget} from './widgets/heap-memory-widget';\nexport {\n SettingsWidget,\n type SettingsWidgetProps,\n type SettingsWidgetSchema,\n type SettingsWidgetSectionDescriptor,\n type SettingsWidgetSettingDescriptor,\n type SettingsWidgetState\n} from './widgets/settings-widget';\nexport {\n OmniBoxWidget,\n type OmniBoxOption,\n type OmniBoxOptionProvider,\n type OmniBoxRenderOptionArgs,\n type OmniBoxWidgetProps\n} from './widgets/omni-box-widget';\nexport {ResetViewWidget, type ResetViewWidgetProps} from './widget-panels/reset-view-widget';\nexport {\n TimeMeasureWidget,\n type TimeMeasureRange,\n type TimeMeasureSelectionState\n} from './widget-panels/time-measure-widget';\nexport {ToastWidget, type ToastWidgetProps} from './widget-panels/toast-widget';\nexport {\n toastManager,\n type ToastEntry,\n type ToastKind,\n type ToastRequest\n} from './widget-panels/toast-manager';\nexport {YZoomWidget, type YZoomWidgetProps} from './widget-panels/y-zoom-widget';\nexport {\n AccordeonPanel,\n AccordeonWidgetContainer,\n ColumnWidgetContainer,\n ColumnPanel,\n CustomPanel,\n MarkdownPanel,\n TabbedPanel,\n TabbedWidgetContainer,\n WidgetContainerRenderer,\n asPanelContainer,\n type AccordeonWidgetContainerProps,\n type AccordeonPanelProps,\n type ColumnWidgetContainerProps,\n type ColumnPanelProps,\n type CustomPanelProps,\n type MarkdownPanelProps,\n type TabbedWidgetContainerProps,\n type TabbedPanelProps,\n type WidgetContainer,\n type WidgetContainerPanelBase,\n type WidgetPanel,\n type WidgetPanelContainer,\n type WidgetPanelContainerProps,\n type WidgetPanelRecord,\n type WidgetPanelTheme,\n type WidgetPanelThemeMode\n} from './widget-panels/widget-containers';\nexport {BoxWidget, type BoxWidgetProps} from './widget-panels/box-widget';\nexport {\n FullScreenPanelWidget,\n type FullScreenPanelWidgetProps\n} from './widget-panels/full-screen-panel-widget';\nexport {\n KeyboardShortcutsWidget,\n KeyboardShortcutsPanel,\n type KeyboardShortcutsPanelProps\n} from './widget-panels/keyboard-shortcuts-widget';\nexport {ModalWidget, type ModalWidgetProps} from './widget-panels/modal-widget';\nexport {SettingsPanel, type SettingsPanelProps} from './widget-panels/settings-panel';\nexport {\n SelectWidgetComponent,\n type SelectWidgetComponentOption,\n type SelectWidgetComponentProps\n} from './widget-components/select-widget-component';\nexport {IconButton, makeTextIcon} from './widget-components/icon-button';\nexport {StatsPanel, type StatsPanelProps} from './widget-panels/stats-panel';\nexport {SidebarWidget, type SidebarWidgetProps} from './widget-panels/sidebar-widget';\nexport {\n ToolbarWidget,\n type ToolbarWidgetActionItem,\n type ToolbarWidgetBadgeItem,\n type ToolbarWidgetItem,\n type ToolbarWidgetProps,\n type ToolbarWidgetToggleGroupItem,\n type ToolbarWidgetToggleOption\n} from './widget-panels/toolbar-widget';\nexport {TextEditorPanel, type TextEditorPanelProps} from './widget-panels/text-editor-panel';\n\nexport {\n type KeyboardShortcut,\n isShortcutMatchingKeyEvent,\n findShortcutMatchingKeyEvent,\n DEFAULT_SHORTCUTS,\n formatKey\n} from './keyboard-shortcuts/keyboard-shortcuts';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/** @jsxImportSource preact */\n\nimport {render} from 'preact';\nimport type {JSX} from 'preact';\nimport {LongPressButton} from './long-press-button';\nimport {cloneViewState, hasViewManager} from '../widgets/view-manager-utils';\nimport {\n Widget,\n type Deck,\n type Viewport,\n type WidgetPlacement,\n type WidgetProps\n} from '@deck.gl/core';\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 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\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\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 = undefined;\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 getViewportViewState(viewport: Viewport): Record<string, unknown> {\n const deck = this.deck;\n if (deck && hasViewManager(deck)) {\n const viewId = this.viewId || viewport.id;\n try {\n return cloneViewState(deck.viewManager?.getViewState(viewId));\n } catch {\n return cloneViewState(deck.viewManager?.viewState);\n }\n }\n\n return cloneViewState(viewport);\n }\n\n private updateViewState(viewport: Viewport, nextViewState: Record<string, unknown>): void {\n if (!this.deck) {\n return;\n }\n\n const viewId = this.viewId || viewport.id || 'default-view';\n // @ts-expect-error Using private method until a public alternative is available\n this.deck._onViewStateChange({viewId, viewState: nextViewState, interactionState: {}});\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.getViewportViewState(viewport);\n const panUpdate = viewport.panByPosition(center, nextPixel);\n this.updateViewState(viewport, {...viewState, ...panUpdate});\n }\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/** @jsxImportSource preact */\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 | undefined): 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/** @jsxImportSource preact */\n\nimport {render} from 'preact';\nimport type {JSX} from 'preact';\nimport {LongPressButton} from './long-press-button';\nimport {cloneViewState, hasViewManager} from '../widgets/view-manager-utils';\nimport {\n Widget,\n type Deck,\n type Viewport,\n type WidgetPlacement,\n type WidgetProps\n} from '@deck.gl/core';\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 type ZoomRangeWidgetProps = WidgetProps & {\n viewId?: string | null;\n placement?: WidgetPlacement;\n minZoom?: number;\n maxZoom?: number;\n step?: number;\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\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 = undefined;\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.getViewportViewState(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 getViewportViewState(viewport: Viewport): Record<string, unknown> {\n const deck = this.deck;\n if (deck && hasViewManager(deck)) {\n const viewId = this.viewId || viewport.id;\n try {\n return cloneViewState(deck.viewManager?.getViewState(viewId));\n } catch {\n return cloneViewState(deck.viewManager?.viewState);\n }\n }\n\n return cloneViewState(viewport);\n }\n\n private updateViewState(viewport: Viewport, nextViewState: Record<string, unknown>): void {\n if (!this.deck) {\n return;\n }\n\n const viewId = this.viewId || viewport.id || 'default-view';\n // @ts-expect-error Using private method until a public alternative is available\n this.deck._onViewStateChange({viewId, viewState: nextViewState, interactionState: {}});\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.getViewportViewState(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.currentZoom = nextZoom;\n this.updateHTML();\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.getViewportViewState(viewport);\n this.currentZoom = nextZoom;\n this.updateHTML();\n this.updateViewState(viewport, {...viewState, zoom: nextZoom});\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/** @jsxImportSource preact */\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 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 = undefined;\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/** @jsxImportSource preact */\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/** @jsxImportSource preact */\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", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\nimport {useEffect, useMemo, useState} from 'preact/hooks';\n\nimport type {WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {JSX} from 'preact';\n\ntype HeapMemoryInfo = {\n jsHeapSizeLimit: number;\n totalJSHeapSize: number;\n usedJSHeapSize: number;\n};\n\nexport type HeapMemoryWidgetProps = WidgetProps & {\n placement?: WidgetPlacement;\n /** How frequently to poll the heap usage, in milliseconds. */\n pollIntervalMs?: number;\n};\n\nconst DEFAULT_MEMORY_INFO: HeapMemoryInfo = {\n jsHeapSizeLimit: 0,\n totalJSHeapSize: 0,\n usedJSHeapSize: 0\n};\n\nfunction clampRatio(value: number): number {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n if (value >= 1) {\n return 1;\n }\n return value;\n}\n\nfunction formatGigabytesValue(bytes: number): string {\n if (!Number.isFinite(bytes)) {\n return '0.00';\n }\n const gigabytes = bytes / 1024 / 1024 / 1024;\n return gigabytes.toFixed(2);\n}\n\ntype HeapMemoryWidgetViewProps = {\n pollIntervalMs: number;\n};\n\nfunction HeapMemoryWidgetView({pollIntervalMs}: HeapMemoryWidgetViewProps) {\n const [memoryInfo, setMemoryInfo] = useState<HeapMemoryInfo>(DEFAULT_MEMORY_INFO);\n\n useEffect(() => {\n let isMounted = true;\n\n const updateMemory = () => {\n if (!isMounted || typeof window === 'undefined') {\n return;\n }\n const memory = (window.performance as Performance & {memory?: HeapMemoryInfo}).memory;\n if (!memory) {\n return;\n }\n\n setMemoryInfo({\n jsHeapSizeLimit: memory.jsHeapSizeLimit ?? 0,\n totalJSHeapSize: memory.totalJSHeapSize ?? 0,\n usedJSHeapSize: memory.usedJSHeapSize ?? 0\n });\n };\n\n updateMemory();\n const interval = window.setInterval(updateMemory, Math.max(500, pollIntervalMs));\n return () => {\n isMounted = false;\n window.clearInterval(interval);\n };\n }, [pollIntervalMs]);\n\n const {jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize} = memoryInfo;\n\n const {usedRatio, reservedRatio} = useMemo(() => {\n const limit = jsHeapSizeLimit || 0;\n if (!limit) {\n return {usedRatio: 0, reservedRatio: 0} as const;\n }\n const used = clampRatio(usedJSHeapSize / limit);\n const total = clampRatio(totalJSHeapSize / limit);\n\n return {\n usedRatio: used,\n reservedRatio: Math.max(0, total - used)\n } as const;\n }, [jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize]);\n\n const gradient = useMemo(() => {\n const usedColor =\n usedRatio < 0.5\n ? 'rgba(107, 114, 128, 0.55)'\n : usedRatio < 0.8\n ? 'rgba(234, 179, 8, 0.6)'\n : 'rgba(239, 68, 68, 0.7)';\n const reservedColor = 'rgba(148, 163, 184, 0.35)';\n const remainingColor = 'rgba(226, 232, 240, 0.35)';\n\n const usedPercent = (usedRatio * 100).toFixed(2);\n const reservedEnd = ((usedRatio + reservedRatio) * 100).toFixed(2);\n\n return `linear-gradient(90deg, ${usedColor} 0%, ${usedColor} ${usedPercent}%, ${reservedColor} ${usedPercent}%, ${reservedColor} ${reservedEnd}%, ${remainingColor} ${reservedEnd}%, ${remainingColor} 100%)`;\n }, [reservedRatio, usedRatio]);\n\n const hasMemoryInfo = jsHeapSizeLimit > 0;\n const valueText = hasMemoryInfo ? formatGigabytesValue(usedJSHeapSize) : 'N/A';\n const title = hasMemoryInfo ? `Heap Size: ${valueText}GB` : 'Heap Size unavailable';\n\n const buttonStyle: JSX.CSSProperties = {\n position: 'relative',\n padding: 0,\n borderRadius: 'var(--button-corner-radius)',\n backgroundImage: gradient,\n backgroundColor: 'var(--button-background)',\n color: 'var(--deck-widget-text-color, #111827)',\n border: '1px solid var(--button-stroke)',\n boxShadow: 'var(--button-shadow)',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n gap: '0px',\n fontSize: '10px',\n fontWeight: 700,\n userSelect: 'none',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '100% 100%',\n width: '100%',\n height: '100%'\n };\n\n return (\n <div className=\"deck-widget-button\">\n <button\n className=\"deck-widget-icon-button deck-widget-heap-memory\"\n type=\"button\"\n title={title}\n aria-label=\"Heap size\"\n style={buttonStyle}\n >\n <span\n style={{\n lineHeight: 1.05,\n fontSize: '10px',\n textShadow: '0 1px 1px rgba(255, 255, 255, 0.35)'\n }}\n >\n {valueText}\n </span>\n <span\n style={{\n lineHeight: 1,\n fontSize: '9px',\n textShadow: '0 1px 1px rgba(255, 255, 255, 0.35)'\n }}\n >\n GB\n </span>\n </button>\n </div>\n );\n}\n\nexport class HeapMemoryWidget extends Widget<HeapMemoryWidgetProps> {\n static override defaultProps = {\n ...Widget.defaultProps,\n id: 'heap-memory',\n placement: 'top-right',\n pollIntervalMs: 2000\n } satisfies Required<WidgetProps> &\n Required<Pick<HeapMemoryWidgetProps, 'placement' | 'pollIntervalMs'>> &\n HeapMemoryWidgetProps;\n\n placement: WidgetPlacement = HeapMemoryWidget.defaultProps.placement;\n className = 'deck-widget-heap-memory';\n\n #pollIntervalMs = HeapMemoryWidget.defaultProps.pollIntervalMs;\n #rootElement: HTMLElement | null = null;\n\n constructor(props: HeapMemoryWidgetProps = {}) {\n super({...HeapMemoryWidget.defaultProps, ...props});\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.pollIntervalMs !== undefined) {\n this.#pollIntervalMs = props.pollIntervalMs;\n }\n }\n\n override setProps(props: Partial<HeapMemoryWidgetProps>): void {\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.pollIntervalMs !== undefined) {\n this.#pollIntervalMs = props.pollIntervalMs;\n }\n super.setProps(props);\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n this.#rootElement = rootElement;\n const className = ['deck-widget', this.className, this.props.className]\n .filter(Boolean)\n .join(' ');\n\n rootElement.className = className;\n\n render(<HeapMemoryWidgetView pollIntervalMs={this.#pollIntervalMs} />, rootElement);\n }\n\n override onRemove(): void {\n if (this.#rootElement) {\n render(null, this.#rootElement);\n }\n }\n}\n", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\nimport {useEffect, useRef, useState} from 'preact/hooks';\n\nimport {SettingsPanelContent} from '../widget-panels/settings-panel';\nimport {IconButton, makeTextIcon} from '../widget-components/icon-button';\n\nimport type {WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {JSX} from 'preact';\n\nexport type SettingsWidgetValue = boolean | number | string;\n\nexport type SettingsWidgetSettingType = 'boolean' | 'number' | 'string' | 'select';\n\nexport type SettingsWidgetOption =\n | SettingsWidgetValue\n | {\n label: string;\n value: SettingsWidgetValue;\n };\n\nexport type SettingsWidgetSettingDescriptor = {\n /** Path in the settings object (dot notation supported). */\n name: string;\n /** Human-friendly label shown in the control list. Defaults to `name`. */\n label?: string;\n description?: string;\n type: SettingsWidgetSettingType;\n min?: number;\n max?: number;\n step?: number;\n options?: SettingsWidgetOption[];\n defaultValue?: SettingsWidgetValue;\n};\n\nexport type SettingsWidgetSectionDescriptor = {\n /** Optional stable id for preserving collapse state across re-renders. */\n id?: string;\n name: string;\n description?: string;\n /** Whether this section starts collapsed when first seen. Defaults to true. */\n initiallyCollapsed?: boolean;\n settings: SettingsWidgetSettingDescriptor[];\n};\n\nexport type SettingsWidgetSchema = {\n title?: string;\n sections: SettingsWidgetSectionDescriptor[];\n};\n\nexport type SettingsWidgetState = Record<string, unknown>;\n\nexport type SettingsWidgetProps = WidgetProps & {\n placement?: WidgetPlacement;\n label?: string;\n schema?: SettingsWidgetSchema;\n settings?: SettingsWidgetState;\n onSettingsChange?: (settings: SettingsWidgetState) => void;\n};\n\nconst PANE_STYLE: JSX.CSSProperties & Record<string, string | number> = {\n position: 'absolute',\n top: 'calc(100% + 8px)',\n left: 0,\n width: '380px',\n maxHeight: 'min(460px, calc(100vh - 60px))',\n borderRadius: '8px',\n border: '1px solid rgba(71, 85, 105, 0.55)',\n background: 'rgba(15, 23, 42, 0.94)',\n color: 'rgba(241, 245, 249, 0.98)',\n boxShadow: '0 12px 32px rgba(2, 6, 23, 0.55)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n pointerEvents: 'auto',\n zIndex: 20,\n '--button-background': 'rgba(30, 41, 59, 0.92)',\n '--button-background-hover': 'rgba(15, 23, 42, 0.9)',\n '--button-inner-stroke': '1px solid rgba(100, 116, 139, 0.72)',\n '--button-corner-radius': '8px',\n '--button-text': 'rgba(241, 245, 249, 0.98)',\n '--button-icon-idle': 'rgba(203, 213, 225, 0.92)',\n '--button-icon-hover': 'rgba(125, 211, 252, 0.98)',\n '--button-backdrop-filter': 'blur(10px)',\n '--container-background': 'rgba(15, 23, 42, 0.98)',\n '--menu-item-hover': 'rgba(51, 65, 85, 0.82)'\n};\n\nconst HEADER_STYLE: JSX.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n borderBottom: '1px solid rgba(100, 116, 139, 0.45)',\n padding: '10px 12px'\n};\n\nconst SETTINGS_BUTTON_ICON = makeTextIcon('\u2699', 24, 36);\n\nfunction stopPropagation(event: Event) {\n event.stopPropagation();\n}\n\ntype SettingsWidgetViewProps = {\n label: string;\n schema: SettingsWidgetSchema;\n settings: SettingsWidgetState;\n onSettingsChange?: (settings: SettingsWidgetState) => void;\n};\n\nconst DEFAULT_SETTINGS_WIDGET_SCHEMA: SettingsWidgetSchema = {sections: []};\nconst DEFAULT_SETTINGS_WIDGET_STATE: SettingsWidgetState = {};\n\nfunction SettingsWidgetView({label, schema, settings, onSettingsChange}: SettingsWidgetViewProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [isPaneOpen, setIsPaneOpen] = useState(false);\n\n useEffect(() => {\n if (isPaneOpen && typeof document !== 'undefined') {\n const handleDocumentPointerDown = (event: PointerEvent) => {\n if (!containerRef.current || !event.target) {\n return;\n }\n if (!containerRef.current.contains(event.target as Node)) {\n setIsPaneOpen(false);\n }\n };\n\n document.addEventListener('pointerdown', handleDocumentPointerDown);\n return () => {\n document.removeEventListener('pointerdown', handleDocumentPointerDown);\n };\n }\n\n return undefined;\n }, [isPaneOpen]);\n\n return (\n <div ref={containerRef} style={{position: 'relative', pointerEvents: 'auto'}}>\n <IconButton\n icon={SETTINGS_BUTTON_ICON}\n title={label}\n className={isPaneOpen ? 'deck-widget-button-active' : ''}\n onClick={() => setIsPaneOpen((previous) => !previous)}\n />\n\n {isPaneOpen && (\n <div\n role=\"dialog\"\n aria-label={schema.title ?? label}\n style={PANE_STYLE}\n onPointerDown={(event) => stopPropagation(event as unknown as Event)}\n onMouseDown={(event) => stopPropagation(event as unknown as Event)}\n onWheel={(event) => stopPropagation(event as unknown as Event)}\n onClick={(event) => stopPropagation(event as unknown as Event)}\n >\n <div style={HEADER_STYLE}>\n <div style={{fontSize: '13px', fontWeight: 700}}>{schema.title ?? label}</div>\n <button\n type=\"button\"\n onClick={() => setIsPaneOpen(false)}\n style={{\n border: 0,\n borderRadius: '4px',\n padding: '2px 6px',\n background: 'rgba(51, 65, 85, 0.8)',\n color: 'inherit',\n cursor: 'pointer',\n fontSize: '14px',\n lineHeight: 1\n }}\n title=\"Close settings\"\n aria-label=\"Close settings\"\n >\n \u00D7\n </button>\n </div>\n\n <SettingsPanelContent\n schema={schema}\n settings={settings}\n onSettingsChange={onSettingsChange}\n />\n </div>\n )}\n </div>\n );\n}\n\nexport class SettingsWidget extends Widget<SettingsWidgetProps> {\n static override defaultProps = {\n ...Widget.defaultProps,\n id: 'settings',\n placement: 'top-left',\n label: 'Settings',\n schema: DEFAULT_SETTINGS_WIDGET_SCHEMA,\n settings: DEFAULT_SETTINGS_WIDGET_STATE,\n onSettingsChange: undefined\n } satisfies Required<WidgetProps> &\n Required<Pick<SettingsWidgetProps, 'placement' | 'label' | 'schema' | 'settings'>> &\n SettingsWidgetProps;\n\n className = 'deck-widget-settings';\n placement: WidgetPlacement = SettingsWidget.defaultProps.placement;\n\n #label = SettingsWidget.defaultProps.label;\n #schema = SettingsWidget.defaultProps.schema;\n #settings = SettingsWidget.defaultProps.settings;\n #onSettingsChange: SettingsWidgetProps['onSettingsChange'] =\n SettingsWidget.defaultProps.onSettingsChange;\n #rootElement: HTMLElement | null = null;\n\n constructor(props: SettingsWidgetProps = {}) {\n super({...SettingsWidget.defaultProps, ...props});\n\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.label !== undefined) {\n this.#label = props.label;\n }\n if (props.schema !== undefined) {\n this.#schema = props.schema;\n }\n if (props.settings !== undefined) {\n this.#settings = props.settings;\n }\n if (props.onSettingsChange !== undefined) {\n this.#onSettingsChange = props.onSettingsChange;\n }\n }\n\n override setProps(props: Partial<SettingsWidgetProps>): void {\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.label !== undefined) {\n this.#label = props.label;\n }\n if (props.schema !== undefined) {\n this.#schema = props.schema;\n }\n if (props.settings !== undefined) {\n this.#settings = props.settings;\n }\n if (props.onSettingsChange !== undefined) {\n this.#onSettingsChange = props.onSettingsChange;\n }\n super.setProps(props);\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n this.#rootElement = rootElement;\n\n const className = ['deck-widget', this.className, this.props.className]\n .filter(Boolean)\n .join(' ');\n\n rootElement.className = className;\n\n render(\n <SettingsWidgetView\n label={this.#label}\n schema={this.#schema}\n settings={this.#settings}\n onSettingsChange={this.#onSettingsChange}\n />,\n rootElement\n );\n }\n\n override onRemove(): void {\n if (this.#rootElement) {\n render(null, this.#rootElement);\n }\n }\n}\n", "/** @jsxImportSource preact */\nimport {useEffect, useMemo, useState} from 'preact/hooks';\n\nimport {\n buildInitialCollapsedState,\n clamp,\n getSectionKey,\n mergeCollapsedState,\n normalizeOption,\n resolveSettingValue,\n setValueAtPath\n} from '../lib/settings/settings';\nimport {SelectWidgetComponent} from '../widget-components/select-widget-component';\n\nimport type {\n SettingDescriptor,\n SettingsSchema,\n SettingsSectionDescriptor,\n SettingsState,\n SettingValue\n} from '../lib/settings/settings';\nimport type {WidgetPanel, WidgetPanelTheme} from './widget-containers';\nimport type {JSX} from 'preact';\n\ntype SettingsPanelChangeHandler = (\n settings: SettingsState,\n changedSettings?: Array<{\n name: string;\n previousValue: unknown;\n nextValue: unknown;\n descriptor?: SettingDescriptor;\n }>\n) => void;\n\n/** Settings panel configuration for sidebar/modal container composition. */\nexport type SettingsPanelProps = {\n /** Stable panel id used by parent containers. */\n id?: string;\n /** Fallback title used when the schema does not provide one. */\n label?: string;\n /** Descriptor schema rendered by the settings panel. */\n schema?: SettingsSchema;\n /** Current settings values shown and edited by the panel. */\n settings?: SettingsState;\n /** Called when a setting value changes. */\n onSettingsChange?: SettingsPanelChangeHandler;\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n};\n\nconst SECTION_TOGGLE_STYLE: JSX.CSSProperties = {\n width: '100%',\n border: 0,\n margin: 0,\n padding: '8px 12px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n fontSize: '12px'\n};\n\nconst SECTION_CONTENT_STYLE: JSX.CSSProperties = {\n display: 'grid',\n gap: '8px',\n padding: '8px 12px 12px 18px'\n};\n\nconst SECTION_PANEL_CONTENT_STYLE: JSX.CSSProperties = {\n display: 'grid',\n gap: '8px',\n padding: '10px 12px 12px'\n};\n\nconst SETTING_ROW_STYLE: JSX.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'minmax(120px, 1fr) minmax(200px, 1.4fr)',\n alignItems: 'center',\n gap: '8px'\n};\n\nconst SETTING_LABEL_STYLE: JSX.CSSProperties = {\n fontSize: '12px',\n fontWeight: 600,\n color: 'var(--button-text, currentColor)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n};\n\nconst SETTING_CONTROL_STYLE: JSX.CSSProperties = {\n minWidth: 0,\n display: 'flex',\n alignItems: 'center'\n};\n\nconst INPUT_STYLE: JSX.CSSProperties = {\n width: '100%',\n border: 'var(--button-inner-stroke, 1px solid rgba(128, 128, 128, 0.35))',\n borderRadius: 'calc(var(--button-corner-radius, 8px) - 2px)',\n backgroundColor: 'var(--button-background, #fff)',\n backdropFilter: 'var(--button-backdrop-filter, unset)',\n color: 'var(--button-text, currentColor)',\n fontSize: '12px',\n padding: '4px 6px',\n boxSizing: 'border-box'\n};\n\nconst STRING_CONTROL_STYLE: JSX.CSSProperties = {\n ...INPUT_STYLE,\n flex: 1\n};\n\nconst STRING_APPLY_BUTTON_STYLE: JSX.CSSProperties = {\n border: 'var(--button-inner-stroke, 1px solid rgba(128, 128, 128, 0.35))',\n borderRadius: 'calc(var(--button-corner-radius, 8px) - 2px)',\n backgroundColor: 'var(--button-background, #fff)',\n color: 'var(--button-text, currentColor)',\n fontSize: '11px',\n padding: '4px 8px',\n cursor: 'pointer',\n whiteSpace: 'nowrap'\n};\n\nconst RANGE_INPUT_STYLE: JSX.CSSProperties = {\n width: '100%',\n minWidth: '120px',\n margin: 0\n};\n\nconst NUMBER_INPUT_STYLE: JSX.CSSProperties = {\n ...INPUT_STYLE,\n width: '84px',\n flexShrink: 0\n};\n\nconst CHECKBOX_STYLE: JSX.CSSProperties = {\n width: '14px',\n height: '14px',\n margin: 0,\n accentColor: 'var(--button-icon-hover, currentColor)'\n};\n\nfunction stopPropagation(event: Event) {\n event.stopPropagation();\n}\n\nfunction stopPropagationForInput(event: Event) {\n event.stopPropagation();\n if (\n typeof (event as {stopImmediatePropagation?: () => void}).stopImmediatePropagation ===\n 'function'\n ) {\n (event as {stopImmediatePropagation?: () => void}).stopImmediatePropagation?.();\n }\n}\n\ntype SettingsControlProps = {\n setting: SettingDescriptor;\n value: SettingValue;\n onValueChange: (nextValue: SettingValue) => void;\n};\n\ntype StringSettingControlProps = {\n inputId: string;\n label: string;\n value: string;\n onApply: (nextValue: string) => void;\n};\n\nfunction StringSettingControl({inputId, label, value, onApply}: StringSettingControlProps) {\n const [pendingValue, setPendingValue] = useState(value);\n const [recentValues, setRecentValues] = useState<string[]>(() => (value ? [value] : []));\n\n const isDirty = pendingValue !== value;\n\n useEffect(() => {\n setPendingValue(value);\n }, [value]);\n\n useEffect(() => {\n if (!value) {\n return;\n }\n setRecentValues((previous) =>\n previous.includes(value) ? previous : [value, ...previous].slice(0, 8)\n );\n }, [value]);\n\n const handlePendingTextChange: JSX.GenericEventHandler<HTMLInputElement> = (event) => {\n setPendingValue(event.currentTarget.value);\n };\n\n const applyPendingText = () => {\n if (pendingValue === value) {\n return;\n }\n onApply(pendingValue);\n setRecentValues((previous) =>\n [pendingValue, ...previous.filter((entry) => entry !== pendingValue)].slice(0, 8)\n );\n };\n\n const handleTextCommit = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n applyPendingText();\n }\n stopPropagationForInput(event);\n };\n\n return (\n <div style={SETTING_CONTROL_STYLE}>\n <input\n id={inputId}\n type=\"text\"\n value={pendingValue}\n onInput={handlePendingTextChange}\n list={`${inputId}-recent-values`}\n onKeyDown={handleTextCommit}\n onKeyUp={stopPropagationForInput}\n onPointerDown={stopPropagationForInput}\n aria-label={label}\n style={STRING_CONTROL_STYLE}\n />\n {recentValues.length > 0 && (\n <datalist id={`${inputId}-recent-values`}>\n {recentValues.map((recentValue) => (\n <option key={`${inputId}-${recentValue}`} value={recentValue} />\n ))}\n </datalist>\n )}\n <button\n type=\"button\"\n disabled={!isDirty}\n style={{\n ...STRING_APPLY_BUTTON_STYLE,\n opacity: isDirty ? 1 : 0.55,\n cursor: isDirty ? 'pointer' : 'default',\n marginLeft: '6px'\n }}\n onClick={applyPendingText}\n onPointerDown={stopPropagationForInput}\n onKeyDown={stopPropagationForInput}\n onKeyUp={stopPropagationForInput}\n >\n {isDirty ? '\u2713' : '\u2705'}\n </button>\n </div>\n );\n}\n\n// eslint-disable-next-line complexity\nfunction SettingsControl({setting, value, onValueChange}: SettingsControlProps) {\n const label = setting.label ?? setting.name;\n const tooltip = setting.description?.trim();\n const inputId = `settings-widget-input-${setting.name.replace(/[^a-zA-Z0-9_-]/g, '-')}`;\n\n const handleBooleanChange: JSX.GenericEventHandler<HTMLInputElement> = (event) => {\n onValueChange(event.currentTarget.checked);\n };\n\n const handleNumberChange = (nextValue: number) => {\n if (!Number.isFinite(nextValue)) {\n return;\n }\n onValueChange(clamp(nextValue, setting.min, setting.max));\n };\n\n let control: JSX.Element;\n\n if (setting.type === 'boolean') {\n control = (\n <input\n id={inputId}\n type=\"checkbox\"\n checked={Boolean(value)}\n onInput={handleBooleanChange}\n onChange={handleBooleanChange}\n aria-label={label}\n style={CHECKBOX_STYLE}\n />\n );\n } else if (setting.type === 'number') {\n const numericValue = Number(value);\n const showRange = Number.isFinite(setting.min) && Number.isFinite(setting.max);\n\n control = showRange ? (\n <div style={{display: 'flex', alignItems: 'center', gap: '8px', minWidth: 0, width: '100%'}}>\n <input\n id={inputId}\n type=\"range\"\n min={String(setting.min)}\n max={String(setting.max)}\n step={String(setting.step ?? 1)}\n value={String(numericValue)}\n onInput={(event) => handleNumberChange(Number(event.currentTarget.value))}\n onChange={(event) => handleNumberChange(Number(event.currentTarget.value))}\n aria-label={label}\n style={RANGE_INPUT_STYLE}\n />\n <input\n type=\"number\"\n min={Number.isFinite(setting.min) ? String(setting.min) : undefined}\n max={Number.isFinite(setting.max) ? String(setting.max) : undefined}\n step={String(setting.step ?? 1)}\n value={String(numericValue)}\n onInput={(event) => handleNumberChange(Number(event.currentTarget.value))}\n onChange={(event) => handleNumberChange(Number(event.currentTarget.value))}\n aria-label={`${label} numeric value`}\n style={NUMBER_INPUT_STYLE}\n />\n </div>\n ) : (\n <input\n id={inputId}\n type=\"number\"\n step={String(setting.step ?? 1)}\n value={String(numericValue)}\n onInput={(event) => handleNumberChange(Number(event.currentTarget.value))}\n onChange={(event) => handleNumberChange(Number(event.currentTarget.value))}\n aria-label={label}\n style={INPUT_STYLE}\n />\n );\n } else if (setting.type === 'select') {\n const normalizedOptions = (setting.options ?? []).map(normalizeOption);\n\n control = (\n <SelectWidgetComponent\n id={inputId}\n value={value}\n label={label}\n options={normalizedOptions}\n onValueChange={onValueChange}\n />\n );\n } else {\n control = (\n <StringSettingControl\n inputId={inputId}\n label={label}\n value={String(value)}\n onApply={onValueChange}\n />\n );\n }\n\n return (\n <div data-setting-row-for={setting.name} style={SETTING_ROW_STYLE} title={tooltip}>\n <label htmlFor={inputId} style={SETTING_LABEL_STYLE}>\n {label}\n </label>\n <div style={SETTING_CONTROL_STYLE}>{control}</div>\n </div>\n );\n}\n\ntype SettingsPanelContentProps = {\n schema: SettingsSchema;\n settings: SettingsState;\n onSettingsChange?: SettingsPanelChangeHandler;\n};\n\ntype SettingsSectionBodyProps = {\n contentStyle: JSX.CSSProperties;\n onValueChange: (path: string, nextValue: SettingValue) => void;\n section: SettingsSectionDescriptor;\n settings: SettingsState;\n};\n\ntype SettingsSectionPanelContentProps = {\n onSettingsChange?: SettingsPanelChangeHandler;\n section: SettingsSectionDescriptor;\n settings: SettingsState;\n};\n\n/**\n * Renders the controls for one settings schema section without section heading chrome.\n */\nfunction SettingsSectionBody({\n contentStyle,\n onValueChange,\n section,\n settings\n}: SettingsSectionBodyProps) {\n return (\n <div style={contentStyle}>\n {section.settings.map((setting) => (\n <SettingsControl\n key={setting.name}\n setting={setting}\n value={resolveSettingValue(setting, settings)}\n onValueChange={(nextValue) => onValueChange(setting.name, nextValue)}\n />\n ))}\n </div>\n );\n}\n\n/**\n * Renders one settings schema section as direct panel content for generic widget containers.\n */\nfunction SettingsSectionPanelContent({\n onSettingsChange,\n section,\n settings\n}: SettingsSectionPanelContentProps) {\n const [localSettings, setLocalSettings] = useState<SettingsState>(settings);\n\n useEffect(() => {\n setLocalSettings(settings);\n }, [settings]);\n\n const updateSetting = (path: string, nextValue: SettingValue) => {\n setLocalSettings((previous) => {\n const nextSettings = setValueAtPath(previous, path, nextValue);\n onSettingsChange?.(nextSettings);\n return nextSettings;\n });\n };\n\n return (\n <div\n style={{overflowY: 'auto', paddingBottom: '8px'}}\n onPointerMove={(event) => stopPropagation(event as unknown as Event)}\n onMouseMove={(event) => stopPropagation(event as unknown as Event)}\n onPointerDown={(event) => stopPropagation(event as unknown as Event)}\n onMouseDown={(event) => stopPropagation(event as unknown as Event)}\n onWheel={(event) => stopPropagation(event as unknown as Event)}\n onClick={(event) => stopPropagation(event as unknown as Event)}\n >\n <SettingsSectionBody\n contentStyle={SECTION_PANEL_CONTENT_STYLE}\n onValueChange={updateSetting}\n section={section}\n settings={localSettings}\n />\n </div>\n );\n}\n\nconst DEFAULT_SETTINGS_PANEL_SCHEMA: SettingsSchema = {sections: []};\nconst DEFAULT_SETTINGS_PANEL_STATE: SettingsState = {};\n\n/**\n * Shared settings body used by both the legacy popover widget and panel-based containers.\n */\nexport function SettingsPanelContent({\n schema,\n settings,\n onSettingsChange\n}: SettingsPanelContentProps) {\n const [localSettings, setLocalSettings] = useState<SettingsState>(settings);\n const [collapsedState, setCollapsedState] = useState<Record<string, boolean>>(() =>\n buildInitialCollapsedState(schema.sections)\n );\n\n useEffect(() => {\n setLocalSettings(settings);\n }, [settings]);\n\n useEffect(() => {\n setCollapsedState((previous) => mergeCollapsedState(previous, schema.sections));\n }, [schema.sections]);\n\n const sectionEntries = useMemo(\n () =>\n schema.sections.map((section, index) => ({\n key: getSectionKey(section, index),\n section\n })),\n [schema.sections]\n );\n const renderInlineSingleSection =\n sectionEntries.length === 1 &&\n !sectionEntries[0].section.name &&\n !sectionEntries[0].section.description;\n\n const updateSetting = (path: string, nextValue: SettingValue) => {\n setLocalSettings((previous) => {\n const nextSettings = setValueAtPath(previous, path, nextValue);\n onSettingsChange?.(nextSettings);\n return nextSettings;\n });\n };\n\n return (\n <div\n style={{overflowY: 'auto', paddingBottom: '8px'}}\n onPointerMove={(event) => stopPropagation(event as unknown as Event)}\n onMouseMove={(event) => stopPropagation(event as unknown as Event)}\n onPointerDown={(event) => stopPropagation(event as unknown as Event)}\n onMouseDown={(event) => stopPropagation(event as unknown as Event)}\n onWheel={(event) => stopPropagation(event as unknown as Event)}\n onClick={(event) => stopPropagation(event as unknown as Event)}\n >\n {renderInlineSingleSection ? (\n <SettingsSectionBody\n contentStyle={SECTION_CONTENT_STYLE}\n onValueChange={updateSetting}\n section={sectionEntries[0].section}\n settings={localSettings}\n />\n ) : (\n sectionEntries.map(({key, section}) => {\n const isCollapsed = collapsedState[key] ?? false;\n return (\n <div\n key={key}\n style={{\n borderBottom: '1px solid var(--menu-item-hover, rgba(128, 128, 128, 0.22))'\n }}\n >\n <button\n type=\"button\"\n style={SECTION_TOGGLE_STYLE}\n onClick={() =>\n setCollapsedState((previous) => ({\n ...previous,\n [key]: !isCollapsed\n }))\n }\n aria-expanded={!isCollapsed}\n >\n <span style={{display: 'grid', gap: '2px', textAlign: 'left'}}>\n <span style={{fontWeight: 700, fontSize: '12px'}}>{section.name}</span>\n {section.description && (\n <span\n style={{\n fontSize: '11px',\n color: 'var(--button-icon-idle, currentColor)'\n }}\n >\n {section.description}\n </span>\n )}\n </span>\n <span aria-hidden>{isCollapsed ? '\u25B8' : '\u25BE'}</span>\n </button>\n\n {!isCollapsed && (\n <SettingsSectionBody\n contentStyle={SECTION_CONTENT_STYLE}\n onValueChange={updateSetting}\n section={section}\n settings={localSettings}\n />\n )}\n </div>\n );\n })\n )}\n </div>\n );\n}\n\n/**\n * A reusable settings panel that can be mounted inside modal and sidebar widget containers.\n */\nexport class SettingsPanel implements WidgetPanel {\n id: string;\n title: string;\n theme?: WidgetPanelTheme;\n content: JSX.Element;\n\n /**\n * Creates one widget panel per top-level settings schema section for generic composition.\n */\n static createSectionPanels({\n label = 'Settings',\n schema = DEFAULT_SETTINGS_PANEL_SCHEMA,\n settings = DEFAULT_SETTINGS_PANEL_STATE,\n onSettingsChange,\n theme = 'inherit'\n }: Omit<SettingsPanelProps, 'id'>): Record<string, WidgetPanel> {\n return schema.sections.reduce<Record<string, WidgetPanel>>((panels, section, index) => {\n const panelId = getSectionKey(section, index);\n\n panels[panelId] = {\n id: panelId,\n title: section.name || label,\n theme,\n content: (\n <SettingsSectionPanelContent\n onSettingsChange={onSettingsChange}\n section={section}\n settings={settings}\n />\n )\n };\n\n return panels;\n }, {});\n }\n\n constructor({\n id = 'settings-panel',\n label = 'Settings',\n schema = DEFAULT_SETTINGS_PANEL_SCHEMA,\n settings = DEFAULT_SETTINGS_PANEL_STATE,\n onSettingsChange,\n theme = 'inherit'\n }: SettingsPanelProps = {}) {\n this.id = id;\n this.title = schema.title ?? label;\n this.theme = theme;\n this.content = (\n <SettingsPanelContent\n schema={schema}\n settings={settings}\n onSettingsChange={onSettingsChange}\n />\n );\n }\n}\n", "import type {\n SettingsWidgetOption,\n SettingsWidgetSchema,\n SettingsWidgetSectionDescriptor,\n SettingsWidgetSettingDescriptor,\n SettingsWidgetState,\n SettingsWidgetValue\n} from '../../widgets/settings-widget';\n\nexport type SettingValue = SettingsWidgetValue;\nexport type SettingDescriptor = SettingsWidgetSettingDescriptor;\nexport type SettingsSectionDescriptor = SettingsWidgetSectionDescriptor;\nexport type SettingsSchema = SettingsWidgetSchema;\nexport type SettingsState = SettingsWidgetState;\n\nexport function clamp(value: number, min?: number, max?: number): number {\n let clamped = value;\n if (Number.isFinite(min)) {\n clamped = Math.max(min, clamped);\n }\n if (Number.isFinite(max)) {\n clamped = Math.min(max, clamped);\n }\n return clamped;\n}\n\nexport function setValueAtPath(\n settings: SettingsState,\n path: string,\n value: SettingValue\n): SettingsState {\n const segments = parsePath(path);\n if (!segments.length) {\n return settings;\n }\n\n const nextSettings: SettingsState = {...settings};\n let writeCursor: Record<string, unknown> = nextSettings;\n let readCursor: Record<string, unknown> = settings;\n\n segments.forEach((segment, index) => {\n const isLeaf = index === segments.length - 1;\n\n if (isLeaf) {\n writeCursor[segment] = value;\n return;\n }\n\n const existingChild = readCursor[segment];\n const nextChild = isRecord(existingChild) ? {...existingChild} : {};\n writeCursor[segment] = nextChild;\n\n writeCursor = nextChild;\n readCursor = isRecord(existingChild) ? existingChild : {};\n });\n\n return nextSettings;\n}\n\nexport function getSectionKey(section: SettingsSectionDescriptor, index: number): string {\n return section.id ?? section.name ?? `section-${index}`;\n}\n\nexport function buildInitialCollapsedState(\n sections: SettingsSectionDescriptor[]\n): Record<string, boolean> {\n return sections.reduce<Record<string, boolean>>((result, section, index) => {\n result[getSectionKey(section, index)] = getInitialCollapsedState(section);\n return result;\n }, {});\n}\n\nexport function normalizeOption(option: SettingsWidgetOption): {\n label: string;\n value: SettingValue;\n} {\n if (isRecord(option) && 'label' in option && 'value' in option) {\n return {\n label: String(option.label),\n value: option.value\n };\n }\n\n return {\n label: String(option),\n value: option\n };\n}\n\n// eslint-disable-next-line complexity\nexport function resolveSettingValue(\n setting: SettingDescriptor,\n settings: SettingsState\n): SettingValue {\n const currentValue = getValueAtPath(settings, setting.name);\n\n if (setting.type === 'boolean') {\n return typeof currentValue === 'boolean' ? currentValue : (getDefaultValue(setting) as boolean);\n }\n\n if (setting.type === 'number') {\n const numericValue =\n typeof currentValue === 'number'\n ? currentValue\n : Number.isFinite(Number(currentValue))\n ? Number(currentValue)\n : (getDefaultValue(setting) as number);\n return clamp(numericValue, setting.min, setting.max);\n }\n\n if (setting.type === 'select') {\n const normalizedOptions = (setting.options ?? []).map(normalizeOption);\n const defaultValue = getDefaultValue(setting);\n const candidateValue =\n typeof currentValue === 'string' ||\n typeof currentValue === 'number' ||\n typeof currentValue === 'boolean'\n ? currentValue\n : defaultValue;\n\n if (!normalizedOptions.length) {\n return String(candidateValue);\n }\n\n const match = normalizedOptions.find((option) => option.value === candidateValue);\n return match ? match.value : normalizedOptions[0].value;\n }\n\n if (typeof currentValue === 'string') {\n return currentValue;\n }\n\n const defaultValue = getDefaultValue(setting);\n return typeof defaultValue === 'string' ? defaultValue : String(defaultValue);\n}\n\nexport function mergeCollapsedState(\n previous: Record<string, boolean>,\n sections: SettingsSectionDescriptor[]\n): Record<string, boolean> {\n const nextState: Record<string, boolean> = {};\n\n sections.forEach((section, index) => {\n const key = getSectionKey(section, index);\n nextState[key] = previous[key] ?? getInitialCollapsedState(section);\n });\n\n return nextState;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction parsePath(path: string): string[] {\n return path\n .split('.')\n .map((segment) => segment.trim())\n .filter(Boolean);\n}\n\nfunction getValueAtPath(settings: SettingsState, path: string): unknown {\n const segments = parsePath(path);\n if (!segments.length) {\n return undefined;\n }\n\n let current: unknown = settings;\n for (const segment of segments) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction getInitialCollapsedState(section: SettingsSectionDescriptor): boolean {\n return section.initiallyCollapsed ?? true;\n}\n\nfunction getDefaultValue(setting: SettingDescriptor): SettingValue {\n if (setting.defaultValue !== undefined) {\n return setting.defaultValue;\n }\n\n if (setting.type === 'boolean') {\n return false;\n }\n\n if (setting.type === 'number') {\n return Number.isFinite(setting.min) ? setting.min : 0;\n }\n\n if (setting.type === 'select') {\n if (setting.options?.length) {\n return normalizeOption(setting.options[0]).value;\n }\n return '';\n }\n\n return '';\n}\n", "/** @jsxImportSource preact */\nimport {createPortal} from 'preact/compat';\nimport {useEffect, useLayoutEffect, useMemo, useRef, useState} from 'preact/hooks';\n\nimport type {SettingValue} from '../lib/settings/settings';\nimport type {JSX} from 'preact';\n\nexport type SelectWidgetComponentOption = {\n label: string;\n value: SettingValue;\n};\n\nexport type SelectWidgetComponentProps = {\n id: string;\n label: string;\n value: SettingValue;\n options: SelectWidgetComponentOption[];\n onValueChange: (nextValue: SettingValue) => void;\n};\n\nconst SELECT_ROOT_STYLE: JSX.CSSProperties = {\n position: 'relative',\n width: '100%',\n minWidth: 0\n};\n\nconst SELECT_BUTTON_STYLE: JSX.CSSProperties = {\n width: '100%',\n minHeight: '32px',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) auto',\n alignItems: 'center',\n gap: '8px',\n border: 'var(--button-inner-stroke, 1px solid rgba(148, 163, 184, 0.48))',\n borderRadius: 'var(--button-corner-radius, 8px)',\n background: 'var(--button-background, rgba(255, 255, 255, 0.94))',\n color: 'var(--button-text, currentColor)',\n boxSizing: 'border-box',\n padding: '6px 8px 6px 10px',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer',\n boxShadow: 'none',\n outline: 'none'\n};\n\nconst SELECT_BUTTON_OPEN_STYLE: JSX.CSSProperties = {\n borderColor: 'var(--button-icon-hover, rgba(59, 130, 246, 0.82))',\n boxShadow: '0 0 0 2px rgba(59, 130, 246, 0.16)'\n};\n\nconst SELECT_VALUE_STYLE: JSX.CSSProperties = {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n textAlign: 'left'\n};\n\nconst SELECT_CARET_STYLE: JSX.CSSProperties = {\n width: '16px',\n height: '16px',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--button-icon-idle, currentColor)',\n fontSize: '10px',\n lineHeight: 1,\n transition: 'transform 120ms ease'\n};\n\nconst SELECT_LIST_STYLE: JSX.CSSProperties = {\n position: 'fixed',\n zIndex: 10000,\n maxHeight: '192px',\n overflowY: 'auto',\n padding: '4px',\n border: 'var(--button-inner-stroke, 1px solid rgba(148, 163, 184, 0.48))',\n borderRadius: 'var(--button-corner-radius, 8px)',\n background: 'var(--container-background, var(--button-background, rgba(255, 255, 255, 0.98)))',\n color: 'var(--button-text, currentColor)',\n boxShadow: '0 12px 28px rgba(15, 23, 42, 0.18)',\n boxSizing: 'border-box'\n};\n\nconst SELECT_OPTION_STYLE: JSX.CSSProperties = {\n width: '100%',\n minHeight: '28px',\n border: 0,\n borderRadius: 'calc(var(--button-corner-radius, 8px) - 1px)',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) auto',\n alignItems: 'center',\n gap: '8px',\n margin: 0,\n padding: '5px 8px',\n background: 'transparent',\n color: 'var(--button-text, currentColor)',\n cursor: 'pointer',\n fontSize: '12px',\n textAlign: 'left'\n};\n\nconst SELECT_OPTION_ACTIVE_STYLE: JSX.CSSProperties = {\n background: 'var(--menu-item-hover, rgba(148, 163, 184, 0.16))'\n};\n\nconst SELECT_OPTION_SELECTED_STYLE: JSX.CSSProperties = {\n color: 'var(--button-icon-hover, currentColor)',\n fontWeight: 700\n};\n\nfunction stopEventPropagation(event: Event): void {\n event.stopPropagation();\n if (\n typeof (event as {stopImmediatePropagation?: () => void}).stopImmediatePropagation ===\n 'function'\n ) {\n (event as {stopImmediatePropagation: () => void}).stopImmediatePropagation();\n }\n}\n\nfunction findSelectedOptionIndex(\n options: SelectWidgetComponentOption[],\n value: SettingValue\n): number {\n return options.findIndex((option) => option.value === value);\n}\n\nfunction getNextOptionIndex(currentIndex: number, delta: -1 | 1, optionCount: number): number {\n if (optionCount === 0) {\n return -1;\n }\n const resolvedIndex = currentIndex >= 0 ? currentIndex : delta > 0 ? -1 : 0;\n return (resolvedIndex + delta + optionCount) % optionCount;\n}\n\nexport function SelectWidgetComponent({\n id,\n label,\n value,\n options,\n onValueChange\n}: SelectWidgetComponentProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [activeOptionIndex, setActiveOptionIndex] = useState(() =>\n findSelectedOptionIndex(options, value)\n );\n const [listStyle, setListStyle] = useState<JSX.CSSProperties>(SELECT_LIST_STYLE);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const listboxRef = useRef<HTMLDivElement | null>(null);\n const optionRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const listboxId = `${id}-listbox`;\n\n const selectedOptionIndex = useMemo(\n () => findSelectedOptionIndex(options, value),\n [options, value]\n );\n const selectedOption = selectedOptionIndex >= 0 ? options[selectedOptionIndex] : undefined;\n const selectedLabel = selectedOption?.label ?? String(value);\n\n useEffect(() => {\n optionRefs.current = optionRefs.current.slice(0, options.length);\n }, [options.length]);\n\n useEffect(() => {\n if (!isOpen) {\n setActiveOptionIndex(selectedOptionIndex);\n }\n }, [isOpen, selectedOptionIndex]);\n\n useEffect(() => {\n const ownerDocument = rootRef.current?.ownerDocument;\n if (!isOpen || !ownerDocument) {\n return undefined;\n }\n\n const handleDocumentPointerDown = (event: PointerEvent) => {\n if (!rootRef.current || !event.target) {\n return;\n }\n const target = event.target as Node;\n if (!rootRef.current.contains(target) && !listboxRef.current?.contains(target)) {\n setIsOpen(false);\n }\n };\n\n ownerDocument.addEventListener('pointerdown', handleDocumentPointerDown);\n return () => {\n ownerDocument.removeEventListener('pointerdown', handleDocumentPointerDown);\n };\n }, [isOpen]);\n\n useLayoutEffect(() => {\n const ownerDocument = rootRef.current?.ownerDocument;\n const ownerWindow = ownerDocument?.defaultView;\n if (!isOpen || !rootRef.current || !ownerWindow) {\n return undefined;\n }\n\n const updateListStyle = () => {\n if (!rootRef.current) {\n return;\n }\n const rect = rootRef.current.getBoundingClientRect();\n setListStyle({\n ...SELECT_LIST_STYLE,\n top: `${rect.bottom + 4}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`\n });\n };\n\n updateListStyle();\n ownerWindow.addEventListener('resize', updateListStyle);\n ownerWindow.addEventListener('scroll', updateListStyle, true);\n return () => {\n ownerWindow.removeEventListener('resize', updateListStyle);\n ownerWindow.removeEventListener('scroll', updateListStyle, true);\n };\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen || activeOptionIndex < 0) {\n return;\n }\n optionRefs.current[activeOptionIndex]?.scrollIntoView?.({block: 'nearest'});\n }, [activeOptionIndex, isOpen]);\n\n const selectOption = (option: SelectWidgetComponentOption) => {\n onValueChange(option.value);\n setIsOpen(false);\n };\n\n const handleButtonKeyDown: JSX.KeyboardEventHandler<HTMLButtonElement> = (event) => {\n stopEventPropagation(event as unknown as Event);\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setIsOpen(true);\n setActiveOptionIndex((previous) =>\n getNextOptionIndex(previous, event.key === 'ArrowDown' ? 1 : -1, options.length)\n );\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (isOpen && activeOptionIndex >= 0) {\n const activeOption = options[activeOptionIndex];\n if (activeOption) {\n selectOption(activeOption);\n }\n return;\n }\n setIsOpen(true);\n setActiveOptionIndex(selectedOptionIndex);\n return;\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n setIsOpen(false);\n }\n };\n\n return (\n <div\n ref={rootRef}\n style={SELECT_ROOT_STYLE}\n onPointerDown={(event) => stopEventPropagation(event as unknown as Event)}\n onMouseDown={(event) => stopEventPropagation(event as unknown as Event)}\n onWheel={(event) => stopEventPropagation(event as unknown as Event)}\n onClick={(event) => stopEventPropagation(event as unknown as Event)}\n >\n <button\n id={id}\n type=\"button\"\n aria-label={label}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n style={{\n ...SELECT_BUTTON_STYLE,\n ...(isOpen ? SELECT_BUTTON_OPEN_STYLE : {}),\n opacity: options.length ? 1 : 0.58,\n cursor: options.length ? 'pointer' : 'default'\n }}\n disabled={!options.length}\n onClick={() => setIsOpen((previous) => !previous)}\n onKeyDown={handleButtonKeyDown}\n onKeyUp={(event) => stopEventPropagation(event as unknown as Event)}\n >\n <span style={SELECT_VALUE_STYLE}>{selectedLabel}</span>\n <span\n aria-hidden\n style={{\n ...SELECT_CARET_STYLE,\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)'\n }}\n >\n \u25BE\n </span>\n </button>\n\n {isOpen &&\n rootRef.current?.ownerDocument.body &&\n createPortal(\n <div\n ref={listboxRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={label}\n style={listStyle}\n onPointerDown={(event) => stopEventPropagation(event as unknown as Event)}\n onMouseDown={(event) => stopEventPropagation(event as unknown as Event)}\n onWheel={(event) => stopEventPropagation(event as unknown as Event)}\n onClick={(event) => stopEventPropagation(event as unknown as Event)}\n >\n {options.map((option, index) => {\n const isSelected = index === selectedOptionIndex;\n const isActive = index === activeOptionIndex;\n\n return (\n <button\n key={`${id}-${index}-${String(option.value)}`}\n ref={(element) => {\n optionRefs.current[index] = element;\n }}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n style={{\n ...SELECT_OPTION_STYLE,\n ...(isActive ? SELECT_OPTION_ACTIVE_STYLE : {}),\n ...(isSelected ? SELECT_OPTION_SELECTED_STYLE : {})\n }}\n onPointerEnter={() => setActiveOptionIndex(index)}\n onMouseDown={(event) => {\n event.preventDefault();\n stopEventPropagation(event as unknown as Event);\n }}\n onClick={() => selectOption(option)}\n >\n <span style={SELECT_VALUE_STYLE}>{option.label}</span>\n {isSelected && <span aria-hidden>\u2713</span>}\n </button>\n );\n })}\n </div>,\n rootRef.current.ownerDocument.body\n )}\n </div>\n );\n}\n", "/** @jsxImportSource preact */\nimport type {JSX} from 'preact';\n\nexport function makeTextIcon(content: string, fontSize = 16, viewBoxSize = 24): string {\n const halfViewBoxSize = viewBoxSize / 2;\n\n return `data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-${halfViewBoxSize} -${halfViewBoxSize} ${viewBoxSize} ${viewBoxSize}\" ><text text-anchor=\"middle\" alignment-baseline=\"middle\" font-family=\"sans-serif\" font-size=\"${fontSize}\">${content}</text></svg>`;\n}\n\nexport function IconButton({\n icon,\n color,\n style,\n className = '',\n title,\n onClick\n}: {\n icon: string;\n color?: string;\n className?: string;\n style?: JSX.CSSProperties;\n title?: string;\n onClick?: () => void;\n}) {\n return (\n <div className={`deck-widget-button ${className}`} style={style}>\n <button className=\"deck-widget-icon-button\" type=\"button\" title={title} onClick={onClick}>\n <div\n className=\"deck-widget-icon\"\n style={{\n backgroundColor: color,\n maskImage: `url('${icon}')`\n }}\n />\n </button>\n </div>\n );\n}\n", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\nimport {useCallback, useEffect, useRef, useState} from 'preact/hooks';\n\nimport type {Deck, Viewport, WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {ComponentChildren, JSX} from 'preact';\n\nconst OPTION_ROW_HEIGHT_PX = 32;\nconst MAX_VISIBLE_OPTION_COUNT = 4;\nconst BLUR_CLOSE_DELAY_MS = 100;\nconst OMNIBOX_MAX_WIDTH_PX = 520;\nconst OMNIBOX_HORIZONTAL_MARGIN_PX = 12;\nconst FALLBACK_WIDGET_MARGIN_PX = 8;\n\nconst ROOT_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'fixed',\n transform: 'translateX(-50%)',\n margin: '0',\n zIndex: '2',\n pointerEvents: 'auto'\n};\n\nconst WRAPPER_STYLE: JSX.CSSProperties = {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: '4px'\n};\n\nconst INPUT_ROW_STYLE: JSX.CSSProperties = {\n width: '100%',\n display: 'grid',\n gridTemplateColumns: '1fr auto auto auto',\n gap: '4px'\n};\n\nconst INPUT_STYLE: JSX.CSSProperties = {\n width: '100%',\n minHeight: '38px',\n maxHeight: '38px',\n borderRadius: '8px',\n border: '1px solid rgba(148, 163, 184, 0.9)',\n backgroundColor: 'rgba(255, 255, 255, 0.96)',\n color: 'rgba(15, 23, 42, 1)',\n boxSizing: 'border-box',\n padding: '0 12px',\n fontSize: '13px',\n lineHeight: 1.2,\n outline: 'none',\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.15)'\n};\n\nconst NAV_BUTTON_STYLE: JSX.CSSProperties = {\n minWidth: '34px',\n height: '38px',\n borderRadius: '8px',\n border: '1px solid rgba(148, 163, 184, 0.9)',\n backgroundColor: 'rgba(255, 255, 255, 0.96)',\n color: 'rgba(15, 23, 42, 1)',\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.15)',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer',\n userSelect: 'none'\n};\n\nconst NAV_BUTTON_DISABLED_STYLE: JSX.CSSProperties = {\n opacity: 0.45,\n cursor: 'not-allowed'\n};\n\nconst DROPDOWN_STYLE: JSX.CSSProperties = {\n borderRadius: '8px',\n border: '1px solid rgba(148, 163, 184, 0.9)',\n backgroundColor: 'rgba(255, 255, 255, 0.98)',\n boxShadow: '0 12px 28px rgba(15, 23, 42, 0.18)',\n overflowY: 'auto',\n maxHeight: `${OPTION_ROW_HEIGHT_PX * MAX_VISIBLE_OPTION_COUNT}px`\n};\n\nconst DEFAULT_OPTION_CONTENT_STYLE: JSX.CSSProperties = {\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '10px'\n};\n\nexport type OmniBoxOption = {\n id: string;\n label: string;\n value?: string;\n description?: string;\n data?: unknown;\n};\n\nexport type OmniBoxOptionProvider =\n | ((query: string) => Promise<ReadonlyArray<OmniBoxOption>>)\n | ((query: string) => ReadonlyArray<OmniBoxOption>);\n\nexport type OmniBoxRenderOptionArgs = {\n option: OmniBoxOption;\n index: number;\n isActive: boolean;\n query: string;\n};\n\nexport type OmniBoxWidgetProps = WidgetProps & {\n placement?: WidgetPlacement;\n placeholder?: string;\n minQueryLength?: number;\n defaultOpen?: boolean;\n topOffsetPx?: number;\n getOptions?: OmniBoxOptionProvider;\n renderOption?: (args: OmniBoxRenderOptionArgs) => ComponentChildren;\n onSelectOption?: (option: OmniBoxOption) => void;\n onActiveOptionChange?: (option: OmniBoxOption | null) => void;\n onNavigateOption?: (option: OmniBoxOption) => void;\n onQueryChange?: (query: string) => void;\n};\n\nexport class OmniBoxWidget extends Widget<OmniBoxWidgetProps> {\n static override defaultProps = {\n ...Widget.defaultProps,\n id: 'omni-box',\n placement: 'top-left',\n placeholder: 'Search trace blocks\u2026',\n minQueryLength: 1,\n defaultOpen: false,\n topOffsetPx: undefined,\n getOptions: (() => []) as OmniBoxOptionProvider,\n renderOption: undefined,\n onSelectOption: undefined,\n onActiveOptionChange: undefined,\n onNavigateOption: undefined,\n onQueryChange: undefined\n } satisfies Required<WidgetProps> &\n Required<Pick<OmniBoxWidgetProps, 'placeholder' | 'minQueryLength' | 'placement'>> &\n OmniBoxWidgetProps;\n\n placement: WidgetPlacement = OmniBoxWidget.defaultProps.placement;\n className = 'deck-widget-omni-box';\n\n #rootElement: HTMLElement | null = null;\n #hasLayoutListeners = false;\n\n #handleWindowLayoutChange = () => {\n this.#updateRootLayout();\n };\n\n constructor(props: OmniBoxWidgetProps = {}) {\n super({...OmniBoxWidget.defaultProps, ...props});\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n }\n\n override setProps(props: Partial<OmniBoxWidgetProps>): void {\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n super.setProps(props);\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n this.#rootElement = rootElement;\n\n rootElement.className = ['deck-widget', this.className, this.props.className]\n .filter(Boolean)\n .join(' ');\n\n Object.assign(rootElement.style, ROOT_STYLE);\n this.#attachLayoutListeners();\n this.#updateRootLayout();\n\n render(\n <OmniBoxWidgetView\n placeholder={this.props.placeholder ?? OmniBoxWidget.defaultProps.placeholder}\n minQueryLength={this.props.minQueryLength ?? OmniBoxWidget.defaultProps.minQueryLength}\n defaultOpen={this.props.defaultOpen ?? OmniBoxWidget.defaultProps.defaultOpen}\n getOptions={this.props.getOptions ?? OmniBoxWidget.defaultProps.getOptions}\n renderOption={this.props.renderOption}\n onSelectOption={this.props.onSelectOption}\n onActiveOptionChange={this.props.onActiveOptionChange}\n onNavigateOption={this.props.onNavigateOption}\n onQueryChange={this.props.onQueryChange}\n />,\n rootElement\n );\n }\n\n override onViewportChange(_viewport: Viewport): void {\n this.#updateRootLayout();\n }\n\n override onRemove(): void {\n this.#detachLayoutListeners();\n if (this.#rootElement) {\n render(null, this.#rootElement);\n }\n }\n\n #attachLayoutListeners(): void {\n if (this.#hasLayoutListeners || typeof window === 'undefined') {\n return;\n }\n\n window.addEventListener('resize', this.#handleWindowLayoutChange);\n window.addEventListener('scroll', this.#handleWindowLayoutChange, true);\n this.#hasLayoutListeners = true;\n }\n\n #detachLayoutListeners(): void {\n if (!this.#hasLayoutListeners || typeof window === 'undefined') {\n return;\n }\n\n window.removeEventListener('resize', this.#handleWindowLayoutChange);\n window.removeEventListener('scroll', this.#handleWindowLayoutChange, true);\n this.#hasLayoutListeners = false;\n }\n\n #updateRootLayout(): void {\n if (!this.#rootElement || typeof window === 'undefined') {\n return;\n }\n\n const fallbackTopOffsetPx = getWidgetMarginPx(this.#rootElement);\n const configuredTopOffsetPx = this.props.topOffsetPx;\n const topOffsetPx =\n configuredTopOffsetPx !== undefined && Number.isFinite(configuredTopOffsetPx)\n ? configuredTopOffsetPx\n : fallbackTopOffsetPx;\n const canvasRect = getDeckCanvasRect(this.deck);\n\n if (canvasRect) {\n const availableWidthPx = Math.max(0, canvasRect.width - OMNIBOX_HORIZONTAL_MARGIN_PX * 2);\n const resolvedWidthPx =\n availableWidthPx > 0\n ? Math.min(OMNIBOX_MAX_WIDTH_PX, availableWidthPx)\n : OMNIBOX_MAX_WIDTH_PX;\n\n this.#rootElement.style.left = `${canvasRect.left + canvasRect.width / 2}px`;\n this.#rootElement.style.top = `${canvasRect.top + topOffsetPx}px`;\n this.#rootElement.style.width = `${resolvedWidthPx}px`;\n return;\n }\n\n this.#rootElement.style.left = '50%';\n this.#rootElement.style.top = `${topOffsetPx}px`;\n this.#rootElement.style.width = `min(${OMNIBOX_MAX_WIDTH_PX}px, calc(100vw - ${OMNIBOX_HORIZONTAL_MARGIN_PX * 2}px))`;\n }\n}\n\ntype OmniBoxWidgetViewProps = {\n placeholder: string;\n minQueryLength: number;\n defaultOpen: boolean;\n getOptions: OmniBoxOptionProvider;\n renderOption?: (args: OmniBoxRenderOptionArgs) => ComponentChildren;\n onSelectOption?: (option: OmniBoxOption) => void;\n onActiveOptionChange?: (option: OmniBoxOption | null) => void;\n onNavigateOption?: (option: OmniBoxOption) => void;\n onQueryChange?: (query: string) => void;\n};\n\nfunction DefaultOptionContent({option}: {option: OmniBoxOption}) {\n return (\n <div style={DEFAULT_OPTION_CONTENT_STYLE}>\n <span\n style={{\n fontSize: '12px',\n color: 'rgba(15, 23, 42, 1)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n }}\n >\n {option.label}\n </span>\n {option.description && (\n <span\n style={{\n fontSize: '11px',\n color: 'rgba(100, 116, 139, 1)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n }}\n >\n {option.description}\n </span>\n )}\n </div>\n );\n}\n\n// eslint-disable-next-line max-statements\nfunction OmniBoxWidgetView({\n placeholder,\n minQueryLength,\n defaultOpen,\n getOptions,\n renderOption,\n onSelectOption,\n onActiveOptionChange,\n onNavigateOption,\n onQueryChange\n}: OmniBoxWidgetViewProps) {\n const [query, setQuery] = useState('');\n const [options, setOptions] = useState<ReadonlyArray<OmniBoxOption>>([]);\n const [activeOptionIndex, setActiveOptionIndex] = useState<number>(-1);\n const [isLoading, setIsLoading] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [isHidden, setIsHidden] = useState(() => !defaultOpen);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const dropdownRef = useRef<HTMLDivElement | null>(null);\n const optionElementRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const requestVersionRef = useRef(0);\n const blurTimeoutRef = useRef<number | null>(null);\n\n const clearBlurTimeout = useCallback(() => {\n if (blurTimeoutRef.current !== null) {\n window.clearTimeout(blurTimeoutRef.current);\n blurTimeoutRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n return () => {\n clearBlurTimeout();\n };\n }, [clearBlurTimeout]);\n\n useEffect(() => {\n const handleWindowKeyDown = (event: KeyboardEvent) => {\n if (event.key !== '/' || event.altKey || event.ctrlKey || event.metaKey) {\n return;\n }\n\n if (isEditableTarget(event.target)) {\n return;\n }\n\n event.preventDefault();\n stopEventPropagation(event);\n clearBlurTimeout();\n setIsHidden(false);\n setIsFocused(true);\n\n window.requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n };\n\n window.addEventListener('keydown', handleWindowKeyDown, true);\n return () => {\n window.removeEventListener('keydown', handleWindowKeyDown, true);\n };\n }, [clearBlurTimeout]);\n\n useEffect(() => {\n setIsHidden(!defaultOpen);\n }, [defaultOpen]);\n\n useEffect(() => {\n onQueryChange?.(query);\n\n const normalizedQuery = query.trim();\n if (normalizedQuery.length < minQueryLength) {\n setOptions([]);\n setActiveOptionIndex(-1);\n setIsLoading(false);\n return;\n }\n\n const requestVersion = requestVersionRef.current + 1;\n requestVersionRef.current = requestVersion;\n setIsLoading(true);\n\n Promise.resolve(getOptions(normalizedQuery))\n .then((nextOptions) => {\n if (requestVersionRef.current !== requestVersion) {\n return;\n }\n setOptions(nextOptions);\n setActiveOptionIndex(nextOptions.length > 0 ? 0 : -1);\n })\n .catch(() => {\n if (requestVersionRef.current !== requestVersion) {\n return;\n }\n setOptions([]);\n setActiveOptionIndex(-1);\n })\n .finally(() => {\n if (requestVersionRef.current === requestVersion) {\n setIsLoading(false);\n }\n });\n }, [getOptions, minQueryLength, onQueryChange, query]);\n\n useEffect(() => {\n if (activeOptionIndex < 0 || activeOptionIndex >= options.length) {\n onActiveOptionChange?.(null);\n return;\n }\n onActiveOptionChange?.(options[activeOptionIndex] ?? null);\n }, [activeOptionIndex, onActiveOptionChange, options]);\n\n useEffect(() => {\n optionElementRefs.current = optionElementRefs.current.slice(0, options.length);\n }, [options.length]);\n\n useEffect(() => {\n if (!isFocused || activeOptionIndex < 0 || activeOptionIndex >= options.length) {\n return;\n }\n\n const dropdownElement = dropdownRef.current;\n const optionElement = optionElementRefs.current[activeOptionIndex];\n if (!dropdownElement || !optionElement) {\n return;\n }\n\n const optionTop = optionElement.offsetTop;\n const optionBottom = optionTop + optionElement.offsetHeight;\n const viewportTop = dropdownElement.scrollTop;\n const viewportBottom = viewportTop + dropdownElement.clientHeight;\n\n if (optionTop < viewportTop) {\n dropdownElement.scrollTop = optionTop;\n return;\n }\n\n if (optionBottom > viewportBottom) {\n dropdownElement.scrollTop = optionBottom - dropdownElement.clientHeight;\n }\n }, [activeOptionIndex, isFocused, options.length]);\n\n const selectOption = useCallback(\n (option: OmniBoxOption) => {\n setQuery(option.value ?? option.label);\n setIsFocused(false);\n setOptions([]);\n setActiveOptionIndex(-1);\n onSelectOption?.(option);\n },\n [onSelectOption]\n );\n\n const moveActiveOptionBy = useCallback(\n (delta: -1 | 1, {navigate = false}: {navigate?: boolean} = {}) => {\n if (!options.length) {\n return;\n }\n const currentIndex = activeOptionIndex >= 0 ? activeOptionIndex : 0;\n const nextIndex = (currentIndex + delta + options.length) % options.length;\n const nextOption = options[nextIndex];\n if (!nextOption) {\n return;\n }\n setActiveOptionIndex(nextIndex);\n setIsFocused(true);\n if (navigate) {\n onNavigateOption?.(nextOption);\n }\n },\n [activeOptionIndex, onNavigateOption, options]\n );\n\n const handleHide = useCallback(\n (event?: Event) => {\n if (event) {\n stopEventPropagation(event);\n }\n\n clearBlurTimeout();\n requestVersionRef.current += 1;\n setQuery('');\n setOptions([]);\n setActiveOptionIndex(-1);\n setIsLoading(false);\n setIsFocused(false);\n setIsHidden(true);\n },\n [clearBlurTimeout]\n );\n\n const handleInput: JSX.GenericEventHandler<HTMLInputElement> = useCallback((event) => {\n stopEventPropagation(event as unknown as Event);\n setQuery(event.currentTarget.value);\n setIsFocused(true);\n }, []);\n\n const handleFocus: JSX.FocusEventHandler<HTMLInputElement> = useCallback(() => {\n clearBlurTimeout();\n setIsFocused(true);\n }, [clearBlurTimeout]);\n\n const handleBlur: JSX.FocusEventHandler<HTMLInputElement> = useCallback(() => {\n clearBlurTimeout();\n blurTimeoutRef.current = window.setTimeout(() => {\n setIsFocused(false);\n setActiveOptionIndex(-1);\n }, BLUR_CLOSE_DELAY_MS);\n }, [clearBlurTimeout]);\n\n const handleKeyDown: JSX.KeyboardEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n stopEventPropagation(event as unknown as Event);\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveActiveOptionBy(1);\n return;\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveActiveOptionBy(-1);\n return;\n }\n\n if (event.key === 'Enter') {\n if (activeOptionIndex >= 0 && activeOptionIndex < options.length) {\n event.preventDefault();\n const option = options[activeOptionIndex];\n if (option) {\n selectOption(option);\n }\n }\n return;\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n handleHide(event as unknown as Event);\n }\n },\n [activeOptionIndex, handleHide, moveActiveOptionBy, options, selectOption]\n );\n\n const handlePointerEvent: JSX.PointerEventHandler<HTMLElement> = useCallback((event) => {\n stopEventPropagation(event as unknown as Event);\n }, []);\n\n const handleMouseEvent: JSX.MouseEventHandler<HTMLElement> = useCallback((event) => {\n stopEventPropagation(event as unknown as Event);\n }, []);\n\n const handleWheelEvent: JSX.WheelEventHandler<HTMLElement> = useCallback((event) => {\n stopEventPropagation(event as unknown as Event);\n }, []);\n\n const hasMatches = options.length > 0;\n const normalizedQuery = query.trim();\n const shouldShowDropdown =\n !isHidden &&\n isFocused &&\n normalizedQuery.length >= minQueryLength &&\n (isLoading || options.length > 0);\n\n if (isHidden) {\n return null;\n }\n\n return (\n <div\n style={WRAPPER_STYLE}\n onPointerDown={handlePointerEvent}\n onPointerMove={handlePointerEvent}\n onPointerUp={handlePointerEvent}\n onMouseDown={handleMouseEvent}\n onMouseMove={handleMouseEvent}\n onMouseUp={handleMouseEvent}\n onWheel={handleWheelEvent}\n >\n <div style={INPUT_ROW_STYLE}>\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n placeholder={placeholder}\n style={INPUT_STYLE}\n onInput={handleInput}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n aria-label=\"OmniBox\"\n />\n\n <button\n type=\"button\"\n title=\"Previous match\"\n aria-label=\"Previous match\"\n disabled={!hasMatches}\n style={{\n ...NAV_BUTTON_STYLE,\n ...(hasMatches ? {} : NAV_BUTTON_DISABLED_STYLE)\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n stopEventPropagation(event as unknown as Event);\n }}\n onClick={(event) => {\n stopEventPropagation(event as unknown as Event);\n moveActiveOptionBy(-1, {navigate: true});\n }}\n >\n {'<'}\n </button>\n\n <button\n type=\"button\"\n title=\"Next match\"\n aria-label=\"Next match\"\n disabled={!hasMatches}\n style={{\n ...NAV_BUTTON_STYLE,\n ...(hasMatches ? {} : NAV_BUTTON_DISABLED_STYLE)\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n stopEventPropagation(event as unknown as Event);\n }}\n onClick={(event) => {\n stopEventPropagation(event as unknown as Event);\n moveActiveOptionBy(1, {navigate: true});\n }}\n >\n {'>'}\n </button>\n\n <button\n type=\"button\"\n title=\"Hide OmniBox\"\n aria-label=\"Hide OmniBox\"\n style={NAV_BUTTON_STYLE}\n onMouseDown={(event) => {\n event.preventDefault();\n stopEventPropagation(event as unknown as Event);\n }}\n onClick={(event) => {\n handleHide(event as unknown as Event);\n }}\n >\n \u00D7\n </button>\n </div>\n\n {shouldShowDropdown && (\n <div\n ref={dropdownRef}\n role=\"listbox\"\n style={DROPDOWN_STYLE}\n aria-label=\"OmniBox suggestions\"\n >\n {isLoading && (\n <div\n style={{\n height: `${OPTION_ROW_HEIGHT_PX}px`,\n display: 'flex',\n alignItems: 'center',\n padding: '0 12px',\n fontSize: '12px',\n color: 'rgba(71, 85, 105, 1)'\n }}\n >\n Searching\u2026\n </div>\n )}\n\n {!isLoading &&\n options.map((option, index) => {\n const isActive = index === activeOptionIndex;\n const content = renderOption?.({\n option,\n index,\n isActive,\n query\n }) ?? <DefaultOptionContent option={option} />;\n\n return (\n <button\n key={option.id}\n ref={(element) => {\n optionElementRefs.current[index] = element;\n }}\n type=\"button\"\n role=\"option\"\n aria-selected={isActive}\n onMouseDown={(event) => {\n event.preventDefault();\n stopEventPropagation(event as unknown as Event);\n }}\n onClick={(event) => {\n stopEventPropagation(event as unknown as Event);\n selectOption(option);\n }}\n style={{\n width: '100%',\n border: 0,\n height: `${OPTION_ROW_HEIGHT_PX}px`,\n display: 'flex',\n alignItems: 'stretch',\n textAlign: 'left',\n padding: '0 12px',\n cursor: 'pointer',\n backgroundColor: isActive\n ? 'rgba(226, 232, 240, 0.95)'\n : 'rgba(255, 255, 255, 1)',\n borderBottom:\n index < options.length - 1 ? '1px solid rgba(226, 232, 240, 1)' : 'none'\n }}\n >\n {content}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nfunction stopEventPropagation(event: Event): void {\n event.stopPropagation();\n if (\n typeof (event as {stopImmediatePropagation?: () => void}).stopImmediatePropagation ===\n 'function'\n ) {\n (event as {stopImmediatePropagation: () => void}).stopImmediatePropagation();\n }\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) {\n return false;\n }\n\n if (target instanceof HTMLInputElement) {\n return target.type !== 'button' && target.type !== 'checkbox' && target.type !== 'radio';\n }\n\n if (target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) {\n return true;\n }\n\n return target instanceof HTMLElement ? target.isContentEditable : false;\n}\n\nfunction getWidgetMarginPx(element: HTMLElement): number {\n const value = window.getComputedStyle(element).getPropertyValue('--widget-margin').trim();\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : FALLBACK_WIDGET_MARGIN_PX;\n}\n\nfunction getDeckCanvasRect(deck: Deck | undefined): DOMRect | null {\n const canvas = (deck as (Deck & {canvas?: HTMLCanvasElement | null}) | undefined)?.canvas;\n if (!canvas) {\n return null;\n }\n return canvas.getBoundingClientRect();\n}\n", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\n\nimport type {WidgetPlacement, WidgetProps} from '@deck.gl/core';\n\nexport type ResetViewWidgetProps = WidgetProps & {\n /** Widget positioning within the view. Default 'top-left'. */\n placement?: WidgetPlacement;\n /** Tooltip message */\n label?: string;\n /** Callback invoked when the widget button is clicked */\n onResetView?: () => void;\n};\n\nexport class ResetViewWidget extends Widget<ResetViewWidgetProps> {\n static defaultProps: Required<ResetViewWidgetProps> = {\n ...Widget.defaultProps,\n id: 'reset-view',\n placement: 'top-left',\n label: 'Resize to fit',\n onResetView: undefined!\n };\n\n className = 'deck-widget-reset-view';\n placement: WidgetPlacement = 'top-left';\n\n constructor(props: ResetViewWidgetProps = {}) {\n super(props);\n this.setProps(this.props);\n }\n\n setProps(props: Partial<ResetViewWidgetProps>): void {\n this.placement = props.placement ?? this.placement;\n super.setProps(props);\n }\n\n onRenderHTML(rootElement: HTMLElement): void {\n const label = this.props.label ?? 'Resize to fit';\n\n render(\n <div className=\"deck-widget-button\">\n <button\n className=\"deck-widget-icon-button deck-widget-reset-focus\"\n type=\"button\"\n title={label}\n aria-label={label}\n onClick={() => this.props.onResetView?.()}\n >\n <div className=\"deck-widget-icon\" />\n </button>\n </div>,\n rootElement\n );\n }\n}\n", "/** @jsxImportSource preact */\nimport {Deck, Widget} from '@deck.gl/core';\nimport {render} from 'preact';\n\nimport {IconButton, makeTextIcon} from '../widget-components/icon-button';\n\nimport type {PickingInfo, Viewport, WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {\n EventManager,\n MjolnirGestureEvent,\n MjolnirKeyEvent,\n MjolnirPointerEvent\n} from 'mjolnir.js';\n\nexport type TimeMeasureRange = {startTimeMs: number; endTimeMs: number};\n\ntype TimeMeasureWidgetProps = WidgetProps & {\n placement?: WidgetPlacement;\n viewId?: string | null;\n /** View to listen to for interactions. Defaults to 'main'. */\n eventViewId?: string | string[] | null;\n /** View to use for projecting pointer -> time. Defaults to event view. */\n projectionViewId?: string | null;\n label?: string;\n activeLabel?: string;\n onActivate?: () => void;\n onDeactivate?: () => void;\n onRangeChange?: (range: TimeMeasureRange | null) => void;\n onSelectionChange?: (selection: TimeMeasureSelectionState) => void;\n};\n\nexport type TimeMeasureSelectionState = {\n phase: 'idle' | 'selecting-start' | 'selecting-end' | 'selected';\n cursorTimeMs: number | null;\n draftStartTimeMs: number | null;\n range: TimeMeasureRange | null;\n};\n\nexport class TimeMeasureWidget extends Widget<TimeMeasureWidgetProps, null> {\n static defaultProps: Required<TimeMeasureWidgetProps> = {\n ...Widget.defaultProps,\n id: 'time-measure',\n placement: 'top-left',\n viewId: null,\n eventViewId: 'main',\n projectionViewId: 'main',\n label: 'Measure time',\n activeLabel: 'Time range selected',\n onActivate: undefined!,\n onDeactivate: undefined!,\n onRangeChange: undefined!,\n onSelectionChange: undefined!\n };\n\n className = 'deck-widget-time-measure';\n placement: WidgetPlacement = 'top-left';\n\n /** Current selection phase. */\n #phase: TimeMeasureSelectionState['phase'] = 'idle';\n /** Track the latest measured range. */\n #timeMeasureRange: TimeMeasureRange | null = null;\n /** Provisional start anchor while selecting. */\n #draftStartTimeMs: number | null = null;\n /** Cursor-projected time while selecting. */\n #cursorTimeMs: number | null = null;\n /** Viewport to listen to for interactions. */\n #eventViewId: string | string[] | null = 'main';\n /** Viewport to use for coordinate projection. */\n #projectionViewId: string | null = null;\n #eventManager?: EventManager | null;\n #dragSelecting = false;\n\n constructor(props: TimeMeasureWidgetProps = {}) {\n super(props);\n this.setProps(this.props);\n }\n\n setProps(props: Partial<TimeMeasureWidgetProps>): void {\n this.placement = props.placement ?? this.placement;\n this.viewId = props.viewId ?? this.viewId;\n this.#eventViewId = props.eventViewId ?? this.#eventViewId;\n this.#projectionViewId = props.projectionViewId ?? this.#projectionViewId;\n super.setProps(props);\n }\n\n onAdd({deck, viewId}: {deck: Deck; viewId: string | null}): HTMLDivElement | void {\n if (viewId && !this.viewId) {\n this.viewId = viewId;\n }\n // @ts-expect-error accessing protected member\n // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n const eventManager = deck?.eventManager;\n this.#attachEventListeners(eventManager);\n return this.onCreateRootElement();\n }\n\n onRemove(): void {\n this.#detachEventListeners();\n }\n\n onRenderHTML(rootElement: HTMLElement): void {\n const appearance = this.#getAppearance();\n render(\n <IconButton\n icon={appearance.icon}\n color={appearance.color}\n title={appearance.title}\n className={appearance.isActive ? 'deck-widget-button-active' : ''}\n onClick={() => this.#handleWidgetClick()}\n />,\n rootElement\n );\n }\n\n onHover(info: PickingInfo, event: MjolnirPointerEvent | MjolnirGestureEvent): void {\n if (!this.#isSelecting() || !this.#shouldHandleEvent(info)) {\n return;\n }\n const timeMs = this.#eventToTimeMs(info, event);\n if (timeMs === null) {\n return;\n }\n this.#cursorTimeMs = timeMs;\n this.#emitSelectionChange();\n }\n\n // eslint-disable-next-line complexity\n onClick(info: PickingInfo, event: MjolnirGestureEvent): void {\n if (this.#dragSelecting) {\n return;\n }\n if (!this.#isSelecting() || !this.#shouldHandleEvent(info)) {\n return;\n }\n\n if (event.srcEvent?.button === 2 || event.rightButton) {\n this.#cancelSelection();\n return;\n }\n\n const timeMs = this.#eventToTimeMs(info, event);\n if (timeMs === null || event.srcEvent?.button !== 0) {\n return;\n }\n\n if (this.#phase === 'selecting-start') {\n this.#draftStartTimeMs = timeMs;\n this.#phase = 'selecting-end';\n this.#cursorTimeMs = timeMs;\n this.#emitSelectionChange();\n this.updateHTML();\n return;\n }\n\n if (this.#phase === 'selecting-end' && this.#draftStartTimeMs !== null) {\n const [startTimeMs, endTimeMs] =\n this.#draftStartTimeMs <= timeMs\n ? [this.#draftStartTimeMs, timeMs]\n : [timeMs, this.#draftStartTimeMs];\n this.#finalizeRange({startTimeMs, endTimeMs});\n }\n }\n\n onDragStart(info: PickingInfo, event: MjolnirGestureEvent): void {\n if (!this.#matchesEventView(info)) {\n return;\n }\n if (this.#dragSelecting || this.#isSelecting()) {\n return;\n }\n const srcEvent = event?.srcEvent as MouseEvent | PointerEvent | undefined;\n if (!srcEvent?.shiftKey) {\n return;\n }\n if (srcEvent.button === 2 || event.rightButton) {\n return;\n }\n const timeMs = this.#eventToTimeMs(info, event);\n if (timeMs === null) {\n return;\n }\n srcEvent.preventDefault?.();\n srcEvent.stopPropagation?.();\n this.#dragSelecting = true;\n this.#beginDragSelection(timeMs);\n }\n\n onDrag(info: PickingInfo, event: MjolnirGestureEvent): void {\n if (!this.#dragSelecting || !this.#matchesEventView(info)) {\n return;\n }\n const timeMs = this.#eventToTimeMs(info, event);\n if (timeMs === null) {\n return;\n }\n this.#cursorTimeMs = timeMs;\n this.#emitSelectionChange();\n }\n\n onDragEnd(info: PickingInfo, event: MjolnirGestureEvent): void {\n if (!this.#dragSelecting) {\n return;\n }\n this.#dragSelecting = false;\n if (!this.#matchesEventView(info)) {\n this.#cancelSelection();\n return;\n }\n const timeMs = this.#eventToTimeMs(info, event);\n if (timeMs === null || this.#draftStartTimeMs === null) {\n this.#cancelSelection();\n return;\n }\n const [startTimeMs, endTimeMs] =\n this.#draftStartTimeMs <= timeMs\n ? [this.#draftStartTimeMs, timeMs]\n : [timeMs, this.#draftStartTimeMs];\n this.#finalizeRange({startTimeMs, endTimeMs});\n }\n\n #handleKeyDown = (event: MjolnirKeyEvent) => {\n if (event.srcEvent.key === 'Shift' && this.#phase === 'selected' && this.#timeMeasureRange) {\n this.#cancelSelection();\n return;\n }\n if (event.srcEvent.key === 'Escape' && this.#isSelecting()) {\n this.#cancelSelection();\n }\n };\n\n #handleKeyUp = (event: MjolnirKeyEvent) => {\n if (event.srcEvent.key === 'Escape' && this.#isSelecting()) {\n this.#cancelSelection();\n }\n };\n\n #attachEventListeners(eventManager?: EventManager | null) {\n if (!eventManager) {\n return;\n }\n this.#detachEventListeners();\n this.#eventManager = eventManager;\n eventManager.on('keydown', this.#handleKeyDown);\n eventManager.on('keyup', this.#handleKeyUp);\n }\n\n #detachEventListeners() {\n if (!this.#eventManager) {\n return;\n }\n this.#eventManager.off('keydown', this.#handleKeyDown);\n this.#eventManager.off('keyup', this.#handleKeyUp);\n this.#eventManager = null;\n }\n\n #toggleActive() {\n if (this.#isSelecting()) {\n this.#cancelSelection();\n return;\n }\n\n if (this.#phase === 'selected') {\n this.#beginSelection({resetRange: true});\n return;\n }\n\n this.#beginSelection({resetRange: true});\n }\n\n #beginSelection({resetRange}: {resetRange: boolean}) {\n if (resetRange) {\n this.#updateRange(null, {suppressEmit: false});\n }\n this.#phase = 'selecting-start';\n this.#draftStartTimeMs = null;\n this.#cursorTimeMs = null;\n this.#dragSelecting = false;\n this.props.onActivate?.();\n this.#emitSelectionChange();\n this.updateHTML();\n }\n\n #beginDragSelection(startTimeMs: number) {\n this.#updateRange(null, {suppressEmit: false});\n this.#phase = 'selecting-end';\n this.#draftStartTimeMs = startTimeMs;\n this.#cursorTimeMs = startTimeMs;\n this.props.onActivate?.();\n this.#emitSelectionChange();\n this.updateHTML();\n }\n\n #shouldHandleEvent(info: PickingInfo): boolean {\n if (!this.#isSelecting()) {\n return false;\n }\n return this.#matchesEventView(info);\n }\n\n #matchesEventView(info: PickingInfo): boolean {\n const eventViewId = this.#eventViewId;\n if (!eventViewId) {\n return true;\n }\n const viewportId = info.viewport?.id;\n if (!viewportId) {\n return false;\n }\n if (Array.isArray(eventViewId)) {\n return eventViewId.includes(viewportId);\n }\n return viewportId === eventViewId;\n }\n\n // eslint-disable-next-line complexity\n #eventToTimeMs(\n info: PickingInfo,\n event: MjolnirGestureEvent | MjolnirPointerEvent\n ): number | null {\n const projectionViewport = this.#getProjectionViewport(info);\n if (!projectionViewport) {\n return null;\n }\n if (info.coordinate && Number.isFinite(info.coordinate[0])) {\n if (!projectionViewport.id || info.viewport?.id === projectionViewport.id) {\n return info.coordinate[0];\n }\n }\n const center = (event as any).offsetCenter ?? (event as any).center;\n if (!center) {\n return null;\n }\n const x = 'x' in center ? center.x : Array.isArray(center) ? center[0] : null;\n if (typeof x !== 'number') {\n return null;\n }\n const offsetX: number = x - projectionViewport.x;\n const [timeMs] = projectionViewport.unproject([offsetX, 0]);\n return timeMs ?? null;\n }\n\n #getProjectionViewport(info: PickingInfo): Viewport | null {\n const projectionViewId =\n this.#projectionViewId ??\n (Array.isArray(this.#eventViewId) ? this.#eventViewId[0] : this.#eventViewId);\n if (!projectionViewId) {\n return info.viewport ?? null;\n }\n if (info.viewport?.id === projectionViewId) {\n return info.viewport ?? null;\n }\n const deck = this.deck;\n if (!deck?.isInitialized) {\n return info.viewport ?? null;\n }\n return deck.getViewports().find((viewport) => viewport.id === projectionViewId) ?? null;\n }\n\n #finalizeRange(range: TimeMeasureRange) {\n this.#updateRange(range, {suppressEmit: false});\n this.#phase = 'selected';\n this.#draftStartTimeMs = null;\n this.#cursorTimeMs = null;\n this.#dragSelecting = false;\n this.props.onDeactivate?.();\n this.#emitSelectionChange();\n this.updateHTML();\n }\n\n #updateRange(\n range: TimeMeasureRange | null,\n {suppressEmit = false}: {suppressEmit?: boolean} = {}\n ) {\n this.#timeMeasureRange = range ? {...range} : null;\n if (!suppressEmit) {\n this.props.onRangeChange?.(this.#timeMeasureRange);\n }\n }\n\n #cancelSelection() {\n this.#updateRange(null);\n this.#phase = 'idle';\n this.#draftStartTimeMs = null;\n this.#cursorTimeMs = null;\n this.#dragSelecting = false;\n this.props.onDeactivate?.();\n this.#emitSelectionChange();\n this.updateHTML();\n }\n\n #isSelecting(): boolean {\n return this.#phase === 'selecting-start' || this.#phase === 'selecting-end';\n }\n\n #handleWidgetClick() {\n if (this.#isSelecting()) {\n this.#cancelSelection();\n return;\n }\n this.#toggleActive();\n }\n\n #emitSelectionChange() {\n this.props.onSelectionChange?.({\n phase: this.#phase,\n cursorTimeMs: this.#cursorTimeMs,\n draftStartTimeMs: this.#draftStartTimeMs,\n range: this.#timeMeasureRange\n });\n }\n\n #getAppearance(): {\n color?: string;\n icon: string;\n isActive: boolean;\n title: string;\n } {\n const focusColor = '#10374b';\n const activeColor = '#1a95d3';\n\n if (this.#phase === 'selecting-start' || this.#phase === 'selecting-end') {\n return {\n color: activeColor,\n icon: makeTextIcon(this.#phase === 'selecting-start' ? '\u2502' : '\u2502\u2502'),\n isActive: true,\n title: 'Select time range\u2026'\n };\n }\n\n if (this.#phase === 'selected' && this.#timeMeasureRange) {\n return {\n color: focusColor,\n icon: makeTextIcon('\u0394t'),\n isActive: true,\n title: this.props.activeLabel\n };\n }\n\n return {\n icon: makeTextIcon('\u0394t'),\n isActive: false,\n title: this.props.label\n };\n }\n}\n", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\n\nimport {toastManager} from './toast-manager';\n\nimport type {ToastEntry, ToastKind} from './toast-manager';\nimport type {WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {JSX} from 'preact';\n\nexport type ToastWidgetProps = WidgetProps & {\n placement?: WidgetPlacement;\n showBorder?: boolean;\n};\n\ntype ToastWidgetViewProps = {\n toasts: ReadonlyArray<ToastEntry>;\n showBorder: boolean;\n};\n\nconst TOAST_KIND_STYLES: Record<ToastKind, {accent: string; background: string; icon: string}> = {\n error: {\n accent: 'var(--deck-widget-error-color, var(--button-icon-idle, currentColor))',\n background: 'var(--button-background)',\n icon: '\u26A0'\n },\n info: {\n accent: 'var(--deck-widget-info-color, var(--button-icon-idle, currentColor))',\n background: 'var(--button-background)',\n icon: '\u24D8'\n },\n warning: {\n accent: 'var(--deck-widget-warning-color, var(--button-icon-idle, currentColor))',\n background: 'var(--button-background)',\n icon: '\u26A0'\n }\n};\n\nconst TOAST_KIND_ICON_COLOR: Record<ToastKind, string> = {\n error: 'var(--deck-widget-error-color, var(--button-icon-idle, currentColor))',\n info: 'var(--deck-widget-info-color, var(--button-icon-idle, currentColor))',\n warning: 'var(--deck-widget-warning-color, var(--button-icon-idle, currentColor))'\n};\n\nconst TOAST_CONTAINER_STYLE: JSX.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--widget-margin, 8px)',\n alignItems: 'stretch',\n pointerEvents: 'auto',\n width: '100%',\n maxWidth: 'calc(100vw - 24px)',\n maxHeight: 'calc(100vh - 24px)',\n overflow: 'auto',\n boxSizing: 'border-box'\n};\n\nconst TOAST_CARD_STYLE: JSX.CSSProperties = {\n position: 'relative',\n borderRadius: 'var(--button-corner-radius, 8px)',\n border: '1px solid transparent',\n borderLeft: '4px solid transparent',\n boxShadow: 'var(--button-shadow)',\n backgroundColor: 'var(--button-background)',\n color: 'var(--button-text)',\n padding: '10px 10px 10px 12px',\n width: '100%',\n minWidth: 0,\n animation: 'deck-toast-enter 160ms ease-out',\n transformOrigin: 'top right',\n backdropFilter: 'var(--button-backdrop-filter)',\n WebkitBackdropFilter: 'var(--button-backdrop-filter)'\n};\n\nconst CLOSE_BUTTON_STYLE: JSX.CSSProperties = {\n border: 0,\n borderRadius: 'var(--button-corner-radius, 4px)',\n color: 'var(--button-text)',\n background: 'transparent',\n width: '22px',\n height: '22px',\n fontSize: '12px',\n fontWeight: 700,\n lineHeight: 1,\n cursor: 'pointer',\n padding: 0,\n minWidth: 'unset',\n minHeight: 'unset'\n};\n\nconst TOAST_WIDGET_CLASS = 'deck-widget-toast';\nconst TOAST_WIDGET_STACK_CLASS = 'deck-widget-toast-stack';\n\nfunction ToastWidgetStyles() {\n return (\n <style>{`\n @keyframes deck-toast-enter {\n from {\n opacity: 0;\n transform: translateY(4px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n .${TOAST_WIDGET_CLASS} {\n color: var(--button-text);\n pointer-events: auto;\n position: relative;\n z-index: 3;\n }\n\n .${TOAST_WIDGET_STACK_CLASS} {\n margin: 0;\n }\n\n .${TOAST_WIDGET_CLASS} .deck-widget-icon-button {\n border: 0;\n box-shadow: none;\n }\n `}</style>\n );\n}\n\nfunction ToastWidgetView({toasts, showBorder}: ToastWidgetViewProps) {\n return (\n <div\n className={TOAST_WIDGET_STACK_CLASS}\n style={TOAST_CONTAINER_STYLE}\n role=\"status\"\n aria-live=\"polite\"\n >\n <ToastWidgetStyles />\n {toasts.map((toast) => {\n const palette = TOAST_KIND_STYLES[toast.type];\n const iconColor = TOAST_KIND_ICON_COLOR[toast.type];\n\n return (\n <div\n key={toast.id}\n style={{\n ...TOAST_CARD_STYLE,\n backgroundColor: palette.background,\n borderLeftColor: palette.accent,\n boxShadow: showBorder\n ? 'inset 0 0 0 0.5px var(--deck-widget-toast-border, rgba(148, 163, 184, 0.35)), var(--button-shadow)'\n : 'var(--button-shadow)'\n }}\n data-toast-id={toast.id}\n >\n <div\n style={{\n position: 'relative',\n display: 'grid',\n gridTemplateColumns: 'auto 1fr auto',\n alignItems: 'start',\n gap: '8px'\n }}\n >\n <div style={{fontSize: '16px', lineHeight: 1, color: iconColor}} aria-hidden=\"true\">\n {palette.icon}\n </div>\n <div style={{minWidth: 0}}>\n {toast.title && (\n <div\n style={{\n fontSize: '13px',\n fontWeight: 700,\n color: 'var(--button-text)',\n marginBottom: '2px'\n }}\n >\n {toast.title}\n </div>\n )}\n <div\n style={{\n fontSize: '12px',\n lineHeight: 1.35,\n color: 'var(--button-text)',\n opacity: '0.8'\n }}\n >\n {toast.message}\n </div>\n </div>\n <button\n className=\"deck-widget-icon-button\"\n type=\"button\"\n title=\"Dismiss\"\n aria-label=\"Dismiss toast\"\n style={CLOSE_BUTTON_STYLE}\n onClick={() => toastManager.dismiss(toast.id)}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n data-toast-close={toast.id}\n >\n \u00D7\n </button>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport class ToastWidget extends Widget<ToastWidgetProps> {\n static defaultProps: Required<ToastWidgetProps> = {\n ...Widget.defaultProps,\n id: 'toast',\n placement: 'bottom-right',\n showBorder: false\n };\n\n className = TOAST_WIDGET_CLASS;\n placement: WidgetPlacement = 'bottom-right';\n showBorder = false;\n #unsubscriber: () => void = () => {};\n #toasts: ReadonlyArray<ToastEntry> = [];\n #rootElement: HTMLElement | null = null;\n\n constructor(props: ToastWidgetProps = {}) {\n super(props);\n this.setProps(this.props);\n }\n\n setProps(props: Partial<ToastWidgetProps>): void {\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.showBorder !== undefined) {\n this.showBorder = props.showBorder;\n }\n\n super.setProps(props);\n }\n\n onAdd() {\n this.#unsubscriber();\n this.#unsubscriber = toastManager.subscribe((toasts) => {\n this.#toasts = toasts;\n if (this.#rootElement) {\n render(\n <ToastWidgetView toasts={this.#toasts} showBorder={this.showBorder} />,\n this.#rootElement\n );\n }\n });\n }\n\n onRemove(): void {\n this.#unsubscriber();\n this.#unsubscriber = () => {};\n if (this.#rootElement) {\n render(null, this.#rootElement);\n }\n }\n\n onRenderHTML(rootElement: HTMLElement): void {\n this.#rootElement = rootElement;\n const className = ['deck-widget', this.className, this.props.className]\n .filter(Boolean)\n .join(' ');\n rootElement.className = className;\n rootElement.style.pointerEvents = 'auto';\n rootElement.style.position = 'absolute';\n rootElement.style.width = '360px';\n rootElement.style.maxWidth = 'calc(100vw - 24px)';\n rootElement.style.top = '';\n rootElement.style.right = '';\n rootElement.style.bottom = '';\n rootElement.style.left = '';\n\n if (this.placement.includes('top')) {\n rootElement.style.top = '0px';\n } else {\n rootElement.style.bottom = '0px';\n }\n\n if (this.placement.includes('right')) {\n rootElement.style.right = '0px';\n } else {\n rootElement.style.left = '0px';\n }\n\n this.#toasts = toastManager.getToasts();\n render(<ToastWidgetView toasts={this.#toasts} showBorder={this.showBorder} />, rootElement);\n }\n}\n", "export type ToastKind = 'info' | 'warning' | 'error';\n\nexport type ToastRequest = {\n type: ToastKind;\n title?: string;\n message: string;\n key?: string;\n};\n\nexport type ToastEntry = ToastRequest & {\n id: string;\n createdAtMs: number;\n};\n\ntype ToastListener = (toasts: ReadonlyArray<ToastEntry>) => void;\n\ntype ToastTimer = ReturnType<typeof setTimeout>;\n\nconst DEFAULT_MAX_VISIBLE_TOASTS = 3;\nconst AUTO_DISMISS_BY_TYPE: Record<ToastKind, number> = {\n error: 8_000,\n info: 4_000,\n warning: 6_000\n};\n\nfunction createToastId(prefix = 'toast'): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n}\n\nexport class ToastManager {\n #toasts: ToastEntry[] = [];\n #listeners = new Set<ToastListener>();\n #timers = new Map<string, ToastTimer>();\n #maxVisibleToasts: number;\n\n constructor(maxVisibleToasts = DEFAULT_MAX_VISIBLE_TOASTS) {\n this.#maxVisibleToasts = maxVisibleToasts;\n }\n\n toast(request: ToastRequest): string {\n const now = Date.now();\n const toast: ToastEntry = {\n id: createToastId(),\n createdAtMs: now,\n ...request\n };\n\n if (toast.key) {\n const duplicateKeyIndex = this.#toasts.findIndex((nextToast) => nextToast.key === toast.key);\n if (duplicateKeyIndex !== -1) {\n const existingToast = this.#toasts[duplicateKeyIndex];\n toast.id = existingToast.id;\n this.#toasts.splice(duplicateKeyIndex, 1);\n }\n }\n\n this.#toasts.unshift(toast);\n this.#enforceCap();\n this.#scheduleAutoDismiss(toast.id, toast.type);\n this.#notify();\n\n return toast.id;\n }\n\n dismiss(toastId: string): void {\n const toastIndex = this.#toasts.findIndex((toast) => toast.id === toastId);\n if (toastIndex === -1) {\n return;\n }\n\n this.#toasts.splice(toastIndex, 1);\n this.#clearAutoDismissTimer(toastId);\n this.#notify();\n }\n\n clear(): void {\n for (const toastId of this.#toasts.map((toast) => toast.id)) {\n this.#clearAutoDismissTimer(toastId);\n }\n\n this.#toasts = [];\n this.#notify();\n }\n\n getToasts(): ReadonlyArray<ToastEntry> {\n return this.#toasts.slice();\n }\n\n subscribe(listener: ToastListener): () => void {\n this.#listeners.add(listener);\n listener(this.getToasts());\n\n return () => {\n this.#listeners.delete(listener);\n };\n }\n\n #notify(): void {\n const snapshots = this.getToasts();\n for (const listener of this.#listeners) {\n listener(snapshots);\n }\n }\n\n #scheduleAutoDismiss(toastId: string, toastType: ToastKind): void {\n const autoDismissMs = AUTO_DISMISS_BY_TYPE[toastType];\n this.#clearAutoDismissTimer(toastId);\n\n const timer = setTimeout(() => {\n this.dismiss(toastId);\n }, autoDismissMs);\n this.#timers.set(toastId, timer);\n }\n\n #clearAutoDismissTimer(toastId: string): void {\n const timer = this.#timers.get(toastId);\n if (!timer) {\n return;\n }\n\n clearTimeout(timer);\n this.#timers.delete(toastId);\n }\n\n #enforceCap(): void {\n const toastsToRemove = this.#toasts.slice(this.#maxVisibleToasts);\n this.#toasts = this.#toasts.slice(0, this.#maxVisibleToasts);\n for (const toast of toastsToRemove) {\n this.#clearAutoDismissTimer(toast.id);\n }\n }\n}\n\nexport const toastManager = new ToastManager();\n", "/** @jsxImportSource preact */\nimport {OrthographicViewport, Widget} from '@deck.gl/core';\nimport {render} from 'preact';\n\nimport {IconButton, makeTextIcon} from '../widget-components/icon-button';\n\nimport type {Deck, OrthographicViewState, WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {JSX} from 'preact';\n\nexport type YZoomWidgetProps = WidgetProps & {\n contentBounds?: [[number, number], [number, number]];\n viewId?: string | null;\n targetViewId?: string | null;\n placement?: WidgetPlacement;\n minZoom?: number;\n maxZoom?: number;\n step?: number;\n};\n\nconst DEFAULT_ZOOM_LIMITS = {min: -20, max: 20} as const;\n\ntype RenderedZoomState = {\n clampedZoom: number;\n minZoom: number;\n maxZoom: number;\n};\n\nconst WRAPPER_STYLE: JSX.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '4px',\n background: 'var(--button-background)',\n border: '1px solid var(--button-stroke)',\n boxShadow: 'var(--button-shadow)',\n borderRadius: 'var(--button-corner-radius)',\n margin: 'var(--widget-margin) 0',\n padding: '4px 2px',\n width: 'var(--button-size)',\n boxSizing: 'border-box',\n userSelect: 'none',\n pointerEvents: 'auto'\n};\n\nconst ZOOM_BUTTON_STYLE: JSX.CSSProperties = {\n boxShadow: 'none'\n};\n\nconst SLIDER_CONTAINER_STYLE: JSX.CSSProperties = {\n display: 'flex',\n alignItems: 'stretch',\n height: '120px',\n padding: '2px 0'\n};\n\nconst VERTICAL_SLIDER_STYLE: JSX.CSSProperties = {\n writingMode: 'vertical-lr',\n height: '120px',\n width: '14px',\n margin: 0,\n padding: 0\n};\n\nfunction cloneViewState(viewState: unknown): Record<string, unknown> {\n return viewState && typeof viewState === 'object'\n ? {...(viewState as Record<string, unknown>)}\n : {};\n}\n\nfunction hasViewManager(deck: Deck): boolean {\n return Boolean((deck as Deck & {viewManager?: unknown}).viewManager);\n}\n\nfunction stopEventPropagation(event: Event) {\n event.stopPropagation();\n if (\n typeof (event as {stopImmediatePropagation?: () => void}).stopImmediatePropagation ===\n 'function'\n ) {\n event.stopImmediatePropagation();\n }\n}\n\nfunction getZoomLimitForAxis(\n limit: OrthographicViewState['minZoom' | 'maxZoom'] | undefined,\n axisIndex: 0 | 1\n): number | undefined {\n if (Array.isArray(limit)) {\n const [x, y] = limit;\n return axisIndex === 0 ? x : (y ?? x);\n }\n return typeof limit === 'number' && Number.isFinite(limit) ? limit : undefined;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n if (value < min) return min;\n if (value > max) return max;\n return value;\n}\n\nexport class YZoomWidget extends Widget<YZoomWidgetProps> {\n static override defaultProps = {\n ...Widget.defaultProps,\n id: 'y-zoom',\n viewId: null,\n targetViewId: null,\n placement: 'top-left',\n minZoom: undefined,\n maxZoom: undefined,\n step: 0.1\n } satisfies Required<WidgetProps> & Required<Pick<YZoomWidgetProps, 'step'>> & YZoomWidgetProps;\n\n placement: WidgetPlacement = 'top-left';\n className = 'deck-widget-y-zoom';\n step: number;\n currentZoom = 0;\n inferredMinZoom: number | null = null;\n inferredMaxZoom: number | null = null;\n lastRenderedZoomState: RenderedZoomState | null = null;\n\n constructor(props: YZoomWidgetProps = {}) {\n super({...YZoomWidget.defaultProps, ...props});\n this.viewId = props.viewId ?? null;\n this.placement = props.placement ?? 'top-left';\n this.step = props.step ?? YZoomWidget.defaultProps.step;\n }\n\n override setProps(props: Partial<YZoomWidgetProps>): 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 = undefined;\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n const {minZoom, maxZoom, clampedZoom} = this.getRenderedZoomState();\n this.lastRenderedZoomState = {minZoom, maxZoom, clampedZoom};\n\n const handleInput = (event: Event) => {\n stopEventPropagation(event);\n this.handleZoomTo(Number((event.target as HTMLInputElement).value));\n };\n\n const addVerticalOrient = (element: HTMLInputElement | null) => {\n element?.setAttribute('orient', 'vertical');\n };\n\n const stopPointerPropagation: JSX.PointerEventHandler<HTMLElement> = (event) => {\n stopEventPropagation(event as unknown as Event);\n };\n\n const stopWheelPropagation: JSX.WheelEventHandler<HTMLElement> = (event) => {\n stopEventPropagation(event as unknown as Event);\n };\n\n const stopMousePropagation: JSX.MouseEventHandler<HTMLElement> = (event) => {\n stopEventPropagation(event as unknown as Event);\n };\n\n render(\n <div className=\"deck-widget-button-group\" style={WRAPPER_STYLE}>\n <IconButton\n icon={makeTextIcon('\u2014')}\n style={ZOOM_BUTTON_STYLE}\n title=\"zoom out\"\n onClick={() => this.handleZoomDelta(-this.step)}\n />\n <div\n style={SLIDER_CONTAINER_STYLE}\n onPointerDown={stopPointerPropagation}\n onPointerMove={stopPointerPropagation}\n onPointerUp={stopPointerPropagation}\n onWheel={stopWheelPropagation}\n onMouseDown={stopMousePropagation}\n onMouseMove={stopMousePropagation}\n onMouseUp={stopMousePropagation}\n >\n <input\n ref={addVerticalOrient}\n type=\"range\"\n min={String(minZoom)}\n max={String(maxZoom)}\n step={String(this.step)}\n value={String(clampedZoom)}\n aria-label=\"Adjust Y-axis zoom\"\n style={VERTICAL_SLIDER_STYLE}\n onInput={handleInput}\n onChange={handleInput}\n onPointerDown={stopPointerPropagation}\n onPointerMove={stopPointerPropagation}\n onPointerUp={stopPointerPropagation}\n onWheel={stopWheelPropagation}\n onMouseDown={stopMousePropagation}\n onMouseMove={stopMousePropagation}\n onMouseUp={stopMousePropagation}\n />\n </div>\n <IconButton\n icon={makeTextIcon('\uFF0B')}\n style={ZOOM_BUTTON_STYLE}\n title=\"zoom in\"\n onClick={() => this.handleZoomDelta(this.step)}\n />\n </div>,\n rootElement\n );\n }\n\n override onViewportChange(viewport: OrthographicViewport): void {\n const targetViewId = this.props.targetViewId ?? this.viewId;\n if (targetViewId && targetViewId !== viewport.id) return;\n\n const viewState = this.getViewportViewState(viewport);\n const zoomY = viewport.zoomY;\n this.currentZoom = zoomY;\n\n if (this.props.minZoom === undefined) {\n const minZoom = getZoomLimitForAxis(viewState.minZoom, 1);\n if (Number.isFinite(minZoom)) {\n this.inferredMinZoom = minZoom;\n }\n }\n\n if (this.props.maxZoom === undefined) {\n const maxZoom = getZoomLimitForAxis(viewState.maxZoom, 1);\n if (Number.isFinite(maxZoom)) {\n this.inferredMaxZoom = maxZoom;\n }\n }\n\n this.updateHTMLIfRenderedStateChanged();\n }\n\n /**\n * Returns the effective min/max bounds and the clamped zoom value currently shown in the slider.\n */\n private getRenderedZoomState(): RenderedZoomState {\n const {minZoom, maxZoom} = this.getZoomBounds();\n return {\n minZoom,\n maxZoom,\n clampedZoom: clamp(this.currentZoom, minZoom, maxZoom)\n };\n }\n\n /**\n * Re-renders the widget only when the displayed slider state changed.\n */\n private updateHTMLIfRenderedStateChanged(): void {\n const nextState = this.getRenderedZoomState();\n const previousState = this.lastRenderedZoomState;\n if (\n previousState &&\n previousState.clampedZoom === nextState.clampedZoom &&\n previousState.minZoom === nextState.minZoom &&\n previousState.maxZoom === nextState.maxZoom\n ) {\n return;\n }\n this.lastRenderedZoomState = nextState;\n this.updateHTML();\n }\n\n /**\n * Resolves the slider min/max bounds from explicit props or inferred viewport limits.\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 : DEFAULT_ZOOM_LIMITS.min,\n maxZoom: Number.isFinite(maxZoom) ? maxZoom : DEFAULT_ZOOM_LIMITS.max\n };\n }\n\n private getTargetViewports(): OrthographicViewport[] {\n const deck = this.deck;\n if (!deck) {\n return [];\n }\n if (this.viewId) {\n if (hasViewManager(deck)) {\n const viewport = (deck as Deck & {viewManager?: any}).viewManager?.getViewport(\n this.props.targetViewId ?? this.viewId\n );\n return viewport ? [viewport] : [];\n }\n return [];\n }\n return deck.getViewports() as OrthographicViewport[];\n }\n\n private getViewportViewState(viewport: OrthographicViewport): OrthographicViewState {\n const deck = this.deck;\n const viewManager =\n deck && hasViewManager(deck) ? (deck as Deck & {viewManager?: any}).viewManager : null;\n const viewId = this.viewId || viewport.id;\n if (viewManager) {\n try {\n return {...viewManager.getViewState(viewId)} as OrthographicViewState;\n } catch (err) {\n return cloneViewState(viewManager.viewState) as OrthographicViewState;\n }\n }\n return cloneViewState(viewport) as OrthographicViewState;\n }\n\n private handleZoomDelta(delta: number) {\n const {minZoom, maxZoom} = this.getZoomBounds();\n\n for (const viewport of this.getTargetViewports()) {\n const zoomY = viewport.zoomY;\n const nextZoom = clamp(zoomY + delta, minZoom, maxZoom);\n this.updateViewState(viewport, nextZoom);\n }\n }\n\n private handleZoomTo(zoom: number) {\n const {minZoom, maxZoom} = this.getZoomBounds();\n const nextZoom = clamp(zoom, minZoom, maxZoom);\n\n for (const viewport of this.getTargetViewports()) {\n this.updateViewState(viewport, nextZoom);\n }\n }\n\n private updateViewState(viewport: OrthographicViewport, nextZoomY: number) {\n if (!this.deck) {\n return;\n }\n\n const {contentBounds} = this.props;\n const viewState = this.getViewportViewState(viewport);\n const zoomX = viewport.zoomX;\n const newViewState = {...viewState, zoom: [zoomX, nextZoomY]};\n if (contentBounds) {\n const targetY = viewport.target?.[1] ?? 0;\n const minY = contentBounds[0][1];\n const maxY = contentBounds[1][1];\n if (targetY < minY || targetY > maxY) {\n const nextViewport = new OrthographicViewport({...viewport, zoomY: nextZoomY});\n const anchor = [contentBounds[0][0], Math.max(minY, Math.min(maxY, targetY))];\n const anchorPixels = viewport.project(anchor);\n newViewState.target = nextViewport.panByPosition(anchor, anchorPixels).target;\n }\n }\n\n const viewId = this.viewId || viewport.id || 'default-view';\n this.currentZoom = nextZoomY;\n this.updateHTMLIfRenderedStateChanged();\n\n // @ts-expect-error Using private method until a public alternative is available\n this.deck._onViewStateChange({viewId, viewState: newViewState, interactionState: {}});\n }\n}\n", "/** @jsxImportSource preact */\nimport {createContext} from 'preact';\nimport {\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState\n} from 'preact/hooks';\n\nimport {DarkTheme, LightTheme} from '@deck.gl/widgets';\n\nimport type {ComponentChildren, JSX} from 'preact';\n\n/**\n * Internal panel identifier used by both accordion and tab containers.\n */\ntype WidgetPanelId = string;\n\n/** Light/dark theme modes used for panel-scoped overrides. */\nexport type WidgetPanelThemeMode = 'light' | 'dark';\n\n/** Public theme override options for widget panels. */\nexport type WidgetPanelTheme = 'inherit' | 'light' | 'dark' | 'invert';\n\n/**\n * Describes one entry in an accordion or tabbed container.\n */\nexport type WidgetPanel = {\n /** Stable id used for expansion/selection bookkeeping. */\n id: WidgetPanelId;\n /** Visible heading text for the panel. */\n title: string;\n /** Renderable panel body. */\n content: JSX.Element;\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n /**\n * If true, the panel can not be interacted with and will not switch/expand.\n */\n disabled?: boolean;\n /**\n * If true, keep the panel mounted when collapsed (for preserving internal state).\n */\n keepMounted?: boolean;\n};\n\nexport type WidgetPanelRecord = Record<string, WidgetPanel>;\n\nexport type AccordeonPanelProps = {\n /**\n * Map of panel IDs to panel definitions.\n */\n panels: WidgetPanelRecord;\n /** Optional identifier for the wrapper panel when embedded in another container. */\n id?: string;\n /** Optional heading used by outer overlays when this is rendered as a direct child panel. */\n title?: string;\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n};\n\nexport type TabbedPanelProps = {\n /**\n * Map of panel IDs to panel definitions.\n */\n panels: WidgetPanelRecord;\n /** Optional identifier for the wrapper panel when embedded in another container. */\n id?: string;\n /** Optional heading used by outer overlays when this is rendered as a direct child panel. */\n title?: string;\n /** Controls whether the tab list wraps onto multiple rows or scrolls horizontally. */\n tabListLayout?: 'wrap' | 'scroll';\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n};\n\nexport type ColumnPanelProps = {\n /**\n * Map of panel IDs to panel definitions.\n */\n panels: WidgetPanelRecord;\n /** Optional identifier for the wrapper panel when embedded in another container. */\n id?: string;\n /** Optional heading used by outer overlays when this is rendered as a direct child panel. */\n title?: string;\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n};\n\nexport type CustomPanelProps = {\n /** Stable id used for expansion/selection bookkeeping. */\n id: string;\n /** Visible heading text for the panel. */\n title: string;\n /**\n * Called after the host element mounts.\n * Return a cleanup callback to dispose any manual DOM work on unmount.\n */\n onRenderHTML: (rootElement: HTMLElement) => void | (() => void);\n /**\n * If true, the panel can not be interacted with and will not switch/expand.\n */\n disabled?: boolean;\n /**\n * If true, keep the panel mounted when collapsed (for preserving internal state).\n */\n keepMounted?: boolean;\n /** Optional class name applied to the host element. */\n className?: string;\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n};\n\nexport type MarkdownPanelProps = {\n /** Stable id used for expansion/selection bookkeeping. */\n id: string;\n /** Visible heading text for the panel. */\n title: string;\n /** Markdown source rendered into a small built-in safe subset. */\n markdown: string;\n /**\n * If true, the panel can not be interacted with and will not switch/expand.\n */\n disabled?: boolean;\n /**\n * If true, keep the panel mounted when collapsed (for preserving internal state).\n */\n keepMounted?: boolean;\n /** Optional class name applied to the markdown content host. */\n className?: string;\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n};\n\n/**\n * Normalizes an object map of panels into an array in insertion order.\n */\nfunction normalizePanelRecordPanels(panels: WidgetPanelRecord): WidgetPanel[] {\n return Object.keys(panels).map((panelId) => {\n const panel = panels[panelId];\n return {\n ...panel,\n id: panelId\n };\n });\n}\n\n/**\n * Mounts an imperative HTML host for custom widget panels.\n */\nfunction CustomPanelContent({\n className,\n onRenderHTML\n}: Pick<CustomPanelProps, 'className' | 'onRenderHTML'>) {\n const rootElementRef = useRef<HTMLDivElement | null>(null);\n\n useLayoutEffect(() => {\n const rootElement = rootElementRef.current;\n if (!rootElement) {\n return undefined;\n }\n\n const cleanup = onRenderHTML(rootElement);\n return () => {\n if (typeof cleanup === 'function') {\n cleanup();\n }\n };\n }, [onRenderHTML]);\n\n return <div ref={rootElementRef} className={className} />;\n}\n\n/**\n * A wrapper panel that renders child panels in an accordion layout.\n */\nexport class AccordeonPanel implements WidgetPanel {\n id: string;\n title: string;\n content: JSX.Element;\n theme?: WidgetPanelTheme;\n\n constructor({\n panels,\n id = 'accordeon-widgets',\n title = 'Panels',\n theme = 'inherit'\n }: AccordeonPanelProps) {\n this.id = id;\n this.title = title;\n this.theme = theme;\n this.content = <AccordeonWidgetContainer panels={normalizePanelRecordPanels(panels)} />;\n }\n}\n\n/**\n * A wrapper panel that renders child panels in a tabbed layout.\n */\nexport class TabbedPanel implements WidgetPanel {\n id: string;\n title: string;\n content: JSX.Element;\n theme?: WidgetPanelTheme;\n\n constructor({\n panels,\n id = 'tabbed-widgets',\n title = 'Panels',\n tabListLayout = 'wrap',\n theme = 'inherit'\n }: TabbedPanelProps) {\n this.id = id;\n this.title = title;\n this.theme = theme;\n this.content = (\n <TabbedWidgetContainer\n panels={normalizePanelRecordPanels(panels)}\n tabListLayout={tabListLayout}\n />\n );\n }\n}\n\n/**\n * A wrapper panel that renders child panels in a vertical column.\n */\nexport class ColumnPanel implements WidgetPanel {\n id: string;\n title: string;\n content: JSX.Element;\n theme?: WidgetPanelTheme;\n\n constructor({\n panels,\n id = 'column-widgets',\n title = 'Panels',\n theme = 'inherit'\n }: ColumnPanelProps) {\n this.id = id;\n this.title = title;\n this.theme = theme;\n this.content = <ColumnWidgetContainer panels={normalizePanelRecordPanels(panels)} />;\n }\n}\n\n/**\n * A wrapper panel that renders imperative HTML content into a managed host element.\n */\nexport class CustomPanel implements WidgetPanel {\n id: string;\n title: string;\n content: JSX.Element;\n theme?: WidgetPanelTheme;\n disabled?: boolean;\n keepMounted?: boolean;\n\n constructor({\n id,\n title,\n onRenderHTML,\n disabled,\n keepMounted,\n className,\n theme = 'inherit'\n }: CustomPanelProps) {\n this.id = id;\n this.title = title;\n this.theme = theme;\n this.disabled = disabled;\n this.keepMounted = keepMounted;\n this.content = <CustomPanelContent className={className} onRenderHTML={onRenderHTML} />;\n }\n}\n\n/**\n * A wrapper panel that renders a minimal built-in Markdown subset without external parsers.\n */\nexport class MarkdownPanel implements WidgetPanel {\n id: string;\n title: string;\n content: JSX.Element;\n theme?: WidgetPanelTheme;\n disabled?: boolean;\n keepMounted?: boolean;\n\n constructor({\n id,\n title,\n markdown,\n disabled,\n keepMounted,\n className,\n theme = 'inherit'\n }: MarkdownPanelProps) {\n this.id = id;\n this.title = title;\n this.theme = theme;\n this.disabled = disabled;\n this.keepMounted = keepMounted;\n this.content = (\n <div className={className} style={MARKDOWN_PANEL_STYLE}>\n {renderMarkdownBlocks(markdown)}\n </div>\n );\n }\n}\n\n/**\n * Shared props for both container implementations.\n */\nexport type WidgetContainerPanelBase = {\n /** Optional class name applied to the outer container. */\n className?: string;\n /** Optional set of panels to render. */\n panels: ReadonlyArray<WidgetPanel>;\n};\n\n/**\n * Single-panel container props for direct modal/sidebar content rendering.\n */\nexport type WidgetPanelContainerProps = {\n /** Optional class name applied to the outer container. */\n className?: string;\n /** The panel to render as raw content. */\n panel: WidgetPanel;\n};\n\n/**\n * Accordion container properties.\n */\nexport type AccordeonWidgetContainerProps = WidgetContainerPanelBase & {\n /** Optional uncontrolled default expanded panel ids. */\n defaultExpandedPanelIds?: ReadonlyArray<WidgetPanelId>;\n /**\n * Controlled expanded panel ids. If supplied, callers manage expand/collapse state.\n */\n expandedPanelIds?: ReadonlyArray<WidgetPanelId>;\n /**\n * Called when user intent changes expanded panel ids.\n */\n onExpandedPanelIdsChange?: (expandedPanelIds: ReadonlyArray<WidgetPanelId>) => void;\n /**\n * If false, opening one panel closes all others. Defaults to true.\n */\n allowMultipleExpanded?: boolean;\n};\n\n/**\n * Tabs container properties.\n */\nexport type TabbedWidgetContainerProps = WidgetContainerPanelBase & {\n /** Optional uncontrolled default active tab id. */\n defaultActivePanelId?: WidgetPanelId;\n /**\n * Controlled active tab id. If supplied, callers manage active tab state.\n */\n activePanelId?: WidgetPanelId;\n /**\n * Called when user intent changes active tab id.\n */\n onActivePanelIdChange?: (activePanelId: WidgetPanelId | undefined) => void;\n /** Controls whether the tab list wraps onto multiple rows or scrolls horizontally. */\n tabListLayout?: 'wrap' | 'scroll';\n};\n\n/**\n * Column container properties.\n */\nexport type ColumnWidgetContainerProps = WidgetContainerPanelBase;\n\n/** A serialized form describing an accordion widget container. */\nexport type WidgetAccordeonContainer = {\n /** Container variant discriminator. */\n kind: 'accordeon';\n /** Accordion container props. */\n props: AccordeonWidgetContainerProps;\n};\n\n/** A serialized form describing a tabbed widget container. */\nexport type WidgetTabbedContainer = {\n /** Container variant discriminator. */\n kind: 'tabs';\n /** Tabs container props. */\n props: TabbedWidgetContainerProps;\n};\n\n/** A serialized form describing a single panel widget container. */\nexport type WidgetPanelContainer = {\n /** Container variant discriminator. */\n kind: 'panel';\n /** Single-panel props. */\n props: WidgetPanelContainerProps;\n};\n\n/** A serialized widget-container description consumed by modal and sidebar widgets. */\nexport type WidgetContainer =\n | WidgetAccordeonContainer\n | WidgetTabbedContainer\n | WidgetPanelContainer;\n\n/**\n * Builds a direct-content container for modal-style and sidebar panel shorthands.\n */\nexport function asPanelContainer(panel: WidgetPanel): WidgetPanelContainer {\n return {\n kind: 'panel',\n props: {\n panel\n }\n };\n}\n\n/**\n * Renders an accordion-style widget panel stack.\n */\nexport function AccordeonWidgetContainer({\n panels,\n className,\n defaultExpandedPanelIds = [],\n expandedPanelIds,\n onExpandedPanelIdsChange,\n allowMultipleExpanded = true\n}: AccordeonWidgetContainerProps) {\n const [currentExpandedPanelIds, setCurrentExpandedPanelIds] = useControlledStringListState(\n expandedPanelIds,\n defaultExpandedPanelIds\n );\n\n const expandedPanelIdSet = useMemo(\n () => new Set(currentExpandedPanelIds),\n [currentExpandedPanelIds]\n );\n\n const effectivePanels = useMemo(() => [...panels], [panels]);\n\n const handleTogglePanel = useCallback(\n (panelId: WidgetPanelId) => {\n const nextPanelIds = new Set(allowMultipleExpanded ? currentExpandedPanelIds : []);\n if (nextPanelIds.has(panelId)) {\n nextPanelIds.delete(panelId);\n } else {\n if (!allowMultipleExpanded) {\n nextPanelIds.clear();\n }\n nextPanelIds.add(panelId);\n }\n\n const next = [...nextPanelIds];\n setCurrentExpandedPanelIds(next);\n onExpandedPanelIdsChange?.(next);\n },\n [allowMultipleExpanded, currentExpandedPanelIds, onExpandedPanelIdsChange]\n );\n\n return (\n <div className={className} style={ACCORDEON_CONTAINER_STYLE}>\n {effectivePanels.map((panel) => {\n const isExpanded = expandedPanelIdSet.has(panel.id);\n const shouldRenderContent = panel.keepMounted || isExpanded;\n\n return (\n <section key={panel.id} style={ACCORDION_PANEL_STYLE}>\n <button\n type=\"button\"\n style={{\n ...ACCORDION_HEADING_STYLE,\n cursor: panel.disabled ? 'not-allowed' : 'pointer',\n opacity: panel.disabled ? 0.55 : 1\n }}\n disabled={panel.disabled}\n onPointerDown={(event) => {\n if (panel.disabled) {\n event.stopPropagation();\n return;\n }\n event.preventDefault();\n handleTogglePanel(panel.id);\n }}\n >\n <span>{panel.title}</span>\n <span\n style={{\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n transition: 'transform 160ms ease'\n }}\n >\n \u25B8\n </span>\n </button>\n <div\n style={{\n ...ACCORDION_CONTENT_STYLE,\n display: isExpanded ? 'block' : 'none'\n }}\n >\n {shouldRenderContent ? (\n <WidgetPanelThemeScope panel={panel}>{panel.content}</WidgetPanelThemeScope>\n ) : null}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n\n/**\n * Renders a tabbed widget panel switcher.\n */\nexport function TabbedWidgetContainer({\n panels,\n className,\n defaultActivePanelId,\n activePanelId,\n onActivePanelIdChange,\n tabListLayout = 'wrap'\n}: TabbedWidgetContainerProps) {\n const [currentActivePanelId, setCurrentActivePanelId] = useControlledStringState(\n activePanelId,\n defaultActivePanelId\n );\n\n const enabledPanels = useMemo(() => panels.filter((panel) => !panel.disabled), [panels]);\n const initialActivePanelId = useMemo(() => {\n const isActivePanelEnabled = currentActivePanelId\n ? enabledPanels.some((panel) => panel.id === currentActivePanelId)\n : false;\n return isActivePanelEnabled ? currentActivePanelId : enabledPanels[0]?.id;\n }, [currentActivePanelId, enabledPanels]);\n\n useEffect(() => {\n const shouldSyncActivePanel = currentActivePanelId !== initialActivePanelId;\n if (!shouldSyncActivePanel || !initialActivePanelId) {\n return;\n }\n\n setCurrentActivePanelId(initialActivePanelId);\n onActivePanelIdChange?.(initialActivePanelId);\n }, [currentActivePanelId, initialActivePanelId, onActivePanelIdChange, setCurrentActivePanelId]);\n return (\n <div className={className} style={TABBED_CONTAINER_STYLE}>\n <div data-widget-tabs=\"\" style={getTabListStyle(tabListLayout)}>\n {panels.map((panel) => {\n const isActive = panel.id === initialActivePanelId;\n return (\n <button\n key={panel.id}\n type=\"button\"\n style={{\n ...TAB_BUTTON_STYLE,\n opacity: panel.disabled ? 0.55 : 1,\n backgroundColor: isActive\n ? 'var(--button-background, rgba(255, 255, 255, 0.96))'\n : 'transparent',\n borderColor: isActive\n ? 'var(--menu-border, rgba(148, 163, 184, 0.35))'\n : 'transparent',\n color: isActive\n ? 'var(--button-text, rgb(24, 24, 26))'\n : 'var(--button-icon-idle, rgb(71, 85, 105))',\n boxShadow: isActive ? '0 1px 2px rgba(15, 23, 42, 0.08)' : 'none'\n }}\n disabled={panel.disabled}\n onPointerDown={(event) => {\n if (panel.disabled) {\n event.stopPropagation();\n return;\n }\n event.preventDefault();\n setCurrentActivePanelId(panel.id);\n onActivePanelIdChange?.(panel.id);\n }}\n >\n {panel.title}\n </button>\n );\n })}\n </div>\n <div style={TAB_PANEL_STYLE}>\n {panels.map((panel) => {\n const isActive = panel.id === initialActivePanelId;\n\n return (\n <div\n key={panel.id}\n aria-hidden={!isActive}\n style={{\n ...TAB_PANEL_CONTENT_STYLE,\n visibility: isActive ? 'visible' : 'hidden',\n pointerEvents: isActive ? 'auto' : 'none'\n }}\n >\n <WidgetPanelThemeScope panel={panel}>{panel.content}</WidgetPanelThemeScope>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n/**\n * Renders child panels in a simple vertical column.\n */\nexport function ColumnWidgetContainer({panels, className}: ColumnWidgetContainerProps) {\n const effectivePanels = useMemo(() => [...panels], [panels]);\n\n return (\n <div className={className} style={COLUMN_CONTAINER_STYLE}>\n {effectivePanels.map((panel, panelIndex) => (\n <section\n key={panel.id}\n style={{\n ...COLUMN_PANEL_STYLE,\n borderTop:\n panelIndex > 0 ? '1px solid var(--menu-border, rgba(148, 163, 184, 0.25))' : 'none',\n opacity: panel.disabled ? 0.55 : 1\n }}\n >\n {panel.title ? <header style={COLUMN_PANEL_HEADER_STYLE}>{panel.title}</header> : null}\n <div style={COLUMN_PANEL_CONTENT_STYLE}>\n <WidgetPanelThemeScope panel={panel}>{panel.content}</WidgetPanelThemeScope>\n </div>\n </section>\n ))}\n </div>\n );\n}\n\n/**\n * Renders the requested container based on descriptor kind.\n */\nexport function WidgetContainerRenderer({container}: {container: WidgetContainer}) {\n if (container.kind === 'accordeon') {\n return <AccordeonWidgetContainer {...container.props} />;\n }\n if (container.kind === 'panel') {\n return (\n <div className={container.props.className}>\n <WidgetPanelThemeScope panel={container.props.panel}>\n {container.props.panel.content}\n </WidgetPanelThemeScope>\n </div>\n );\n }\n return <TabbedWidgetContainer {...container.props} />;\n}\n\nconst PanelThemeModeContext = createContext<WidgetPanelThemeMode | undefined>(undefined);\n\n/**\n * Returns the effective light/dark theme mode for the current panel subtree.\n */\nexport function useEffectiveWidgetPanelThemeMode(): WidgetPanelThemeMode {\n return useContext(PanelThemeModeContext) ?? 'light';\n}\n\n/**\n * Applies a panel-level theme override and exposes the resolved mode to descendants.\n */\nfunction WidgetPanelThemeScope({\n panel,\n children\n}: {\n panel: WidgetPanel;\n children: ComponentChildren;\n}) {\n const inheritedMode = useContext(PanelThemeModeContext);\n const hostElementRef = useRef<HTMLDivElement | null>(null);\n const [rootMode, setRootMode] = useState<WidgetPanelThemeMode>('light');\n const parentMode = inheritedMode ?? rootMode;\n const resolvedMode = resolveWidgetPanelThemeMode(parentMode, panel.theme);\n\n useLayoutEffect(() => {\n if (!inheritedMode) {\n const hostElement = hostElementRef.current;\n if (!hostElement) {\n return undefined;\n }\n const parentHostElement =\n hostElement.parentElement instanceof HTMLElement ? hostElement.parentElement : hostElement;\n\n const updateRootMode = () => {\n const inferredMode = inferWidgetPanelThemeMode(parentHostElement);\n setRootMode((previousMode) =>\n previousMode === inferredMode ? previousMode : inferredMode\n );\n };\n\n updateRootMode();\n\n const themedContainer = parentHostElement.closest('.deck-widget-container');\n const mutationObserver = new MutationObserver(() => {\n updateRootMode();\n });\n\n mutationObserver.observe(parentHostElement, {\n attributes: true,\n attributeFilter: ['style', 'class']\n });\n\n if (themedContainer && themedContainer !== parentHostElement) {\n mutationObserver.observe(themedContainer, {\n attributes: true,\n attributeFilter: ['style', 'class']\n });\n }\n\n return () => {\n mutationObserver.disconnect();\n };\n }\n\n return undefined;\n }, [inheritedMode]);\n\n return (\n <PanelThemeModeContext.Provider value={resolvedMode}>\n <div\n ref={hostElementRef}\n data-panel-theme-mode={resolvedMode}\n style={getWidgetPanelThemeScopeStyle(resolvedMode)}\n >\n {children}\n </div>\n </PanelThemeModeContext.Provider>\n );\n}\n\n/**\n * Resolves one local panel theme override against its parent effective mode.\n */\nfunction resolveWidgetPanelThemeMode(\n parentMode: WidgetPanelThemeMode,\n theme: WidgetPanelTheme | undefined\n): WidgetPanelThemeMode {\n if (theme === 'dark') {\n return 'dark';\n }\n if (theme === 'light') {\n return 'light';\n }\n if (theme === 'invert') {\n return parentMode === 'dark' ? 'light' : 'dark';\n }\n\n return parentMode;\n}\n\n/**\n * Builds the inline CSS variable scope for one resolved panel theme mode.\n */\nfunction getWidgetPanelThemeScopeStyle(mode: WidgetPanelThemeMode): JSX.CSSProperties {\n const themeVariables = mode === 'dark' ? DarkTheme : LightTheme;\n return {...themeVariables} as JSX.CSSProperties;\n}\n\n/**\n * Infers the surrounding widget theme mode from resolved CSS variables.\n */\nfunction inferWidgetPanelThemeMode(hostElement: HTMLElement): WidgetPanelThemeMode {\n const ownerWindow = hostElement.ownerDocument.defaultView;\n if (!ownerWindow) {\n return 'light';\n }\n\n const computedStyle = ownerWindow.getComputedStyle(hostElement);\n const menuBackground = computedStyle.getPropertyValue('--menu-background').trim();\n const parsedColor = parseThemeColor(menuBackground);\n if (!parsedColor) {\n return 'light';\n }\n\n return getRelativeLuminance(parsedColor) < 0.5 ? 'dark' : 'light';\n}\n\n/**\n * Parses a CSS rgb/rgba/hex color string into numeric channels.\n */\nfunction parseThemeColor(value: string): [number, number, number] | null {\n if (!value) {\n return null;\n }\n\n if (value.startsWith('#')) {\n const hex = value.slice(1);\n if (hex.length === 3) {\n return [\n parseInt(hex[0] + hex[0], 16),\n parseInt(hex[1] + hex[1], 16),\n parseInt(hex[2] + hex[2], 16)\n ];\n }\n if (hex.length >= 6) {\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16)\n ];\n }\n return null;\n }\n\n const channelMatches = value.match(/[\\d.]+/g);\n if (!channelMatches || channelMatches.length < 3) {\n return null;\n }\n\n return [Number(channelMatches[0]), Number(channelMatches[1]), Number(channelMatches[2])];\n}\n\n/**\n * Computes relative luminance for an RGB color.\n */\nfunction getRelativeLuminance([red, green, blue]: [number, number, number]): number {\n return (0.2126 * red + 0.7152 * green + 0.0722 * blue) / 255;\n}\n\n/**\n * Keeps local string-state in sync with controlled/uncontrolled props.\n */\nfunction useControlledStringState(\n controlledValue?: WidgetPanelId,\n defaultValue?: WidgetPanelId\n): [WidgetPanelId | undefined, (next: WidgetPanelId | undefined) => void] {\n const [internalValue, setInternalValue] = useState<WidgetPanelId | undefined>(defaultValue);\n const isControlled = controlledValue !== undefined;\n const resolvedValue = isControlled ? controlledValue : internalValue;\n\n useEffect(() => {\n if (!isControlled) {\n return;\n }\n setInternalValue(controlledValue);\n }, [isControlled, controlledValue]);\n\n const setValue = useCallback(\n (next: WidgetPanelId | undefined) => {\n if (!isControlled) {\n setInternalValue(next);\n }\n },\n [isControlled]\n );\n\n return [resolvedValue, setValue];\n}\n\n/**\n * Renders a Markdown document into a safe built-in subset of block elements.\n */\n/* eslint-disable max-statements, no-continue */\nfunction renderMarkdownBlocks(markdown: string): JSX.Element[] {\n const normalizedMarkdown = markdown.replace(/\\r\\n?/g, '\\n');\n const lines = normalizedMarkdown.split('\\n');\n const blocks: JSX.Element[] = [];\n const paragraphLines: string[] = [];\n const unorderedListItems: string[] = [];\n const orderedListItems: string[] = [];\n let fencedCodeLines: string[] | undefined;\n let blockIndex = 0;\n\n const flushParagraph = () => {\n if (paragraphLines.length === 0) {\n return;\n }\n\n const paragraphText = paragraphLines.join(' ');\n const currentBlockKey = `paragraph-${blockIndex++}`;\n blocks.push(\n <p key={currentBlockKey} style={MARKDOWN_PARAGRAPH_STYLE}>\n {renderInlineMarkdown(paragraphText, currentBlockKey)}\n </p>\n );\n paragraphLines.length = 0;\n };\n\n const flushUnorderedList = () => {\n if (unorderedListItems.length === 0) {\n return;\n }\n\n const currentBlockIndex = blockIndex++;\n blocks.push(\n <ul key={`unordered-list-${currentBlockIndex}`} style={MARKDOWN_LIST_STYLE}>\n {unorderedListItems.map((item, itemIndex) => (\n <li\n key={`unordered-item-${currentBlockIndex}-${itemIndex}`}\n style={MARKDOWN_LIST_ITEM_STYLE}\n >\n {renderInlineMarkdown(item, `unordered-item-${currentBlockIndex}-${itemIndex}`)}\n </li>\n ))}\n </ul>\n );\n unorderedListItems.length = 0;\n };\n\n const flushOrderedList = () => {\n if (orderedListItems.length === 0) {\n return;\n }\n\n const currentBlockIndex = blockIndex++;\n blocks.push(\n <ol key={`ordered-list-${currentBlockIndex}`} style={MARKDOWN_LIST_STYLE}>\n {orderedListItems.map((item, itemIndex) => (\n <li\n key={`ordered-item-${currentBlockIndex}-${itemIndex}`}\n style={MARKDOWN_LIST_ITEM_STYLE}\n >\n {renderInlineMarkdown(item, `ordered-item-${currentBlockIndex}-${itemIndex}`)}\n </li>\n ))}\n </ol>\n );\n orderedListItems.length = 0;\n };\n\n const flushFencedCodeBlock = () => {\n if (fencedCodeLines === undefined) {\n return;\n }\n\n blocks.push(\n <pre key={`code-${blockIndex++}`} style={MARKDOWN_CODE_BLOCK_STYLE}>\n <code>{fencedCodeLines.join('\\n')}</code>\n </pre>\n );\n fencedCodeLines = undefined;\n };\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n if (fencedCodeLines !== undefined) {\n if (trimmedLine.startsWith('```')) {\n flushFencedCodeBlock();\n } else {\n fencedCodeLines.push(line);\n }\n continue;\n }\n\n if (trimmedLine.startsWith('```')) {\n flushParagraph();\n flushUnorderedList();\n flushOrderedList();\n fencedCodeLines = [];\n continue;\n }\n\n if (trimmedLine.length === 0) {\n flushParagraph();\n flushUnorderedList();\n flushOrderedList();\n continue;\n }\n\n const headingMatch = trimmedLine.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n flushParagraph();\n flushUnorderedList();\n flushOrderedList();\n\n const headingLevel = headingMatch[1].length;\n const headingText = headingMatch[2];\n const HeadingTag = `h${headingLevel}` as keyof JSX.IntrinsicElements;\n const currentBlockKey = `heading-${blockIndex++}`;\n blocks.push(\n <HeadingTag key={currentBlockKey} style={getMarkdownHeadingStyle(headingLevel)}>\n {renderInlineMarkdown(headingText, currentBlockKey)}\n </HeadingTag>\n );\n continue;\n }\n\n const unorderedListMatch = trimmedLine.match(/^[-*]\\s+(.+)$/);\n if (unorderedListMatch) {\n flushParagraph();\n flushOrderedList();\n unorderedListItems.push(unorderedListMatch[1]);\n continue;\n }\n\n const orderedListMatch = trimmedLine.match(/^\\d+\\.\\s+(.+)$/);\n if (orderedListMatch) {\n flushParagraph();\n flushUnorderedList();\n orderedListItems.push(orderedListMatch[1]);\n continue;\n }\n\n paragraphLines.push(trimmedLine);\n }\n\n flushParagraph();\n flushUnorderedList();\n flushOrderedList();\n flushFencedCodeBlock();\n\n return blocks;\n}\n\n/**\n * Renders a minimal inline Markdown subset into safe text and inline elements.\n */\n// eslint-disable-next-line complexity\nfunction renderInlineMarkdown(source: string, keyPrefix: string): ComponentChildren[] {\n const inlineTokenPattern =\n /(\\[([^\\]]+)\\]\\(([^)\\s]+)\\)|`([^`]+)`|\\*\\*([^*]+)\\*\\*|__([^_]+)__|\\*([^*]+)\\*|_([^_]+)_)/g;\n const children: ComponentChildren[] = [];\n let match: RegExpExecArray | null;\n let previousIndex = 0;\n let tokenIndex = 0;\n\n for (match = inlineTokenPattern.exec(source); match; match = inlineTokenPattern.exec(source)) {\n if (match.index > previousIndex) {\n children.push(source.slice(previousIndex, match.index));\n }\n\n if (match[2] !== undefined && match[3] !== undefined) {\n children.push(\n <a\n key={`${keyPrefix}-link-${tokenIndex}`}\n href={match[3]}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={MARKDOWN_LINK_STYLE}\n >\n {match[2]}\n </a>\n );\n } else if (match[4] !== undefined) {\n children.push(\n <code key={`${keyPrefix}-code-${tokenIndex}`} style={MARKDOWN_INLINE_CODE_STYLE}>\n {match[4]}\n </code>\n );\n } else if (match[5] !== undefined || match[6] !== undefined) {\n children.push(\n <strong key={`${keyPrefix}-strong-${tokenIndex}`}>{match[5] ?? match[6]}</strong>\n );\n } else if (match[7] !== undefined || match[8] !== undefined) {\n children.push(<em key={`${keyPrefix}-em-${tokenIndex}`}>{match[7] ?? match[8]}</em>);\n }\n\n previousIndex = match.index + match[0].length;\n tokenIndex += 1;\n }\n\n if (previousIndex < source.length) {\n children.push(source.slice(previousIndex));\n }\n\n if (children.length === 0) {\n return [source];\n }\n\n return children;\n}\n/* eslint-enable max-statements, no-continue */\n\n/**\n * Returns the heading style for one Markdown heading level.\n */\nfunction getMarkdownHeadingStyle(level: number): JSX.CSSProperties {\n if (level === 1) {\n return MARKDOWN_HEADING_1_STYLE;\n }\n if (level === 2) {\n return MARKDOWN_HEADING_2_STYLE;\n }\n if (level === 3) {\n return MARKDOWN_HEADING_3_STYLE;\n }\n\n return MARKDOWN_HEADING_4_TO_6_STYLE;\n}\n\n/**\n * Normalizes panel id collections for deterministic membership checks and stable state.\n */\nfunction normalizePanelIds(\n values: ReadonlyArray<WidgetPanelId> | undefined\n): ReadonlyArray<WidgetPanelId> {\n if (!values || values.length === 0) {\n return [];\n }\n const deduped: WidgetPanelId[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const trimmed = String(value);\n if (!seen.has(trimmed)) {\n seen.add(trimmed);\n deduped.push(trimmed);\n }\n }\n return deduped;\n}\n\n/**\n * Keeps local list state in sync with controlled/uncontrolled props.\n */\nfunction useControlledStringListState(\n controlledValue?: ReadonlyArray<WidgetPanelId>,\n defaultValue?: ReadonlyArray<WidgetPanelId>\n): [ReadonlyArray<WidgetPanelId>, (next: ReadonlyArray<WidgetPanelId>) => void] {\n const [internalValue, setInternalValue] = useState<ReadonlyArray<WidgetPanelId>>(() =>\n normalizePanelIds(controlledValue ?? defaultValue)\n );\n const isControlled = controlledValue !== undefined;\n const resolvedValue = isControlled ? normalizePanelIds(controlledValue) : internalValue;\n\n useEffect(() => {\n if (!isControlled) {\n return;\n }\n setInternalValue(normalizePanelIds(controlledValue));\n }, [isControlled, controlledValue]);\n\n const setValue = useCallback(\n (next: ReadonlyArray<WidgetPanelId>) => {\n if (!isControlled) {\n setInternalValue(normalizePanelIds(next));\n }\n },\n [isControlled]\n );\n\n return [resolvedValue, setValue];\n}\n\n/**\n * Shared accordion/tab layout styles.\n */\nconst ACCORDEON_CONTAINER_STYLE: JSX.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n};\n\nconst ACCORDION_PANEL_STYLE: JSX.CSSProperties = {\n border: 'var(--menu-border, 1px solid rgba(148, 163, 184, 0.35))',\n borderRadius: 'var(--button-corner-radius, 8px)',\n overflow: 'hidden'\n};\n\nconst ACCORDION_HEADING_STYLE: JSX.CSSProperties = {\n width: '100%',\n border: '0',\n margin: '0',\n padding: '10px 12px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n backgroundColor: 'var(--menu-background, #fff)',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n fontSize: '12px',\n lineHeight: 1.2,\n fontWeight: 700\n};\n\nconst ACCORDION_CONTENT_STYLE: JSX.CSSProperties = {\n padding: '8px 10px 10px 12px',\n borderTop: 'var(--menu-divider, var(--menu-border, 1px solid rgba(148, 163, 184, 0.25)))',\n backgroundColor: 'var(--menu-background, #fff)',\n color: 'var(--menu-text, rgb(24, 24, 26))'\n};\n\nconst TABBED_CONTAINER_STYLE: JSX.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n minWidth: '220px',\n border: 'var(--menu-border, 1px solid rgba(148, 163, 184, 0.35))',\n borderRadius: 'var(--button-corner-radius, 8px)',\n overflow: 'hidden',\n backgroundColor: 'var(--menu-background, #fff)',\n color: 'var(--menu-text, rgb(24, 24, 26))'\n};\n\nfunction getTabListStyle(tabListLayout: 'wrap' | 'scroll'): JSX.CSSProperties {\n return {\n display: 'flex',\n alignItems: 'flex-start',\n flexWrap: tabListLayout === 'wrap' ? 'wrap' : 'nowrap',\n gap: '4px',\n overflowX: tabListLayout === 'scroll' ? 'auto' : 'hidden',\n overflowY: 'hidden',\n background:\n 'var(--menu-weak-background, var(--button-background, var(--menu-background, #fff)))',\n padding: '4px 6px',\n borderBottom: 'var(--menu-divider, var(--menu-border, 1px solid rgba(148, 163, 184, 0.2)))',\n position: 'sticky',\n top: 0,\n zIndex: 1\n };\n}\n\nconst TAB_BUTTON_STYLE: JSX.CSSProperties = {\n flex: '0 0 auto',\n border: '1px solid transparent',\n borderRadius: '4px',\n margin: 0,\n padding: '4px 8px',\n fontSize: '12px',\n fontWeight: 600,\n lineHeight: 1.25,\n cursor: 'pointer',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n backgroundColor: 'rgba(255, 255, 255, 0.35)',\n whiteSpace: 'nowrap',\n transition: 'background-color 120ms ease, border-color 120ms ease, color 120ms ease'\n};\n\nconst TAB_PANEL_STYLE: JSX.CSSProperties = {\n display: 'grid',\n alignItems: 'start',\n padding: '10px',\n overflow: 'auto'\n};\n\nconst TAB_PANEL_CONTENT_STYLE: JSX.CSSProperties = {\n gridArea: '1 / 1',\n minWidth: 0\n};\n\nconst COLUMN_CONTAINER_STYLE: JSX.CSSProperties = {\n display: 'grid',\n gap: '0'\n};\n\nconst COLUMN_PANEL_STYLE: JSX.CSSProperties = {\n display: 'grid',\n gap: '10px',\n padding: '12px 0'\n};\n\nconst COLUMN_PANEL_HEADER_STYLE: JSX.CSSProperties = {\n fontSize: '12px',\n fontWeight: 700,\n color: 'var(--button-text, currentColor)',\n padding: '0 2px'\n};\n\nconst COLUMN_PANEL_CONTENT_STYLE: JSX.CSSProperties = {\n minWidth: 0\n};\n\nconst MARKDOWN_PANEL_STYLE: JSX.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n fontSize: '13px',\n lineHeight: '1.5'\n};\n\nconst MARKDOWN_PARAGRAPH_STYLE: JSX.CSSProperties = {\n margin: '0'\n};\n\nconst MARKDOWN_LIST_STYLE: JSX.CSSProperties = {\n margin: '0',\n paddingLeft: '18px',\n display: 'flex',\n flexDirection: 'column',\n gap: '6px'\n};\n\nconst MARKDOWN_LIST_ITEM_STYLE: JSX.CSSProperties = {\n margin: '0'\n};\n\nconst MARKDOWN_CODE_BLOCK_STYLE: JSX.CSSProperties = {\n margin: '0',\n padding: '10px 12px',\n borderRadius: '8px',\n overflowX: 'auto',\n background: 'var(--menu-weak-background, var(--button-background, var(--menu-background, #fff)))',\n border: '1px solid var(--menu-border, rgba(148, 163, 184, 0.2))',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n fontSize: '12px',\n lineHeight: '1.45'\n};\n\nconst MARKDOWN_INLINE_CODE_STYLE: JSX.CSSProperties = {\n padding: '1px 5px',\n borderRadius: '4px',\n background: 'var(--menu-weak-background, var(--button-background, var(--menu-background, #fff)))',\n border: '1px solid var(--menu-border, rgba(148, 163, 184, 0.2))',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n fontSize: '12px'\n};\n\nconst MARKDOWN_LINK_STYLE: JSX.CSSProperties = {\n color: 'var(--button-text, rgb(29, 78, 216))'\n};\n\nconst MARKDOWN_HEADING_1_STYLE: JSX.CSSProperties = {\n margin: '0',\n fontSize: '20px',\n fontWeight: 700,\n lineHeight: '1.25'\n};\n\nconst MARKDOWN_HEADING_2_STYLE: JSX.CSSProperties = {\n margin: '0',\n fontSize: '17px',\n fontWeight: 700,\n lineHeight: '1.3'\n};\n\nconst MARKDOWN_HEADING_3_STYLE: JSX.CSSProperties = {\n margin: '0',\n fontSize: '15px',\n fontWeight: 700,\n lineHeight: '1.35'\n};\n\nconst MARKDOWN_HEADING_4_TO_6_STYLE: JSX.CSSProperties = {\n margin: '0',\n fontSize: '13px',\n fontWeight: 700,\n lineHeight: '1.4'\n};\n", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\n\nimport {asPanelContainer, WidgetContainerRenderer} from './widget-containers';\n\nimport type {WidgetContainer, WidgetPanel} from './widget-containers';\nimport type {WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {JSX} from 'preact';\n\n/** Static card widget properties. */\nexport type BoxWidgetProps = WidgetProps & {\n /** The content container to show inside the box. */\n container?: WidgetContainer;\n /** Optional shorthand panel. When supplied, shown directly inside the box. */\n panel?: WidgetPanel;\n /** Placement anchor for the box. */\n placement?: WidgetPlacement;\n /** Optional box header title. */\n title?: string;\n /** Box width in pixels. */\n widthPx?: number;\n /** Whether the header toggles the box body open and closed. */\n collapsible?: boolean;\n /** Uncontrolled default open state. */\n defaultOpen?: boolean;\n /** Controlled open state for the box body. */\n open?: boolean;\n /** Called when user intent changes open/closed state. */\n onOpenChange?: (open: boolean) => void;\n};\n\nconst BOX_WIDGET_CLASS = 'deck-widget-box';\n\n/**\n * Normalizes box width configuration into a practical render value.\n */\nfunction normalizeBoxWidthPx(widthPx: number): number {\n const clamped = Math.max(220, Math.floor(widthPx));\n return Number.isFinite(clamped) ? clamped : 360;\n}\n\n/**\n * Normalizes widget-container/panel inputs into a concrete widget container.\n */\nfunction asContainer(container?: WidgetContainer, panel?: WidgetPanel): WidgetContainer {\n if (container !== undefined) {\n return container;\n }\n\n if (panel !== undefined) {\n return asPanelContainer(panel);\n }\n\n return {\n kind: 'panel',\n props: {\n panel: {\n id: 'empty-box-panel',\n title: '',\n content: <div />\n }\n }\n };\n}\n\nfunction BoxWidgetView({\n container,\n title,\n widthPx,\n open,\n collapsible,\n onOpenChange\n}: {\n container: WidgetContainer;\n title?: string;\n widthPx: number;\n open: boolean;\n collapsible: boolean;\n onOpenChange: (next: boolean) => void;\n}) {\n return (\n <section style={BOX_WIDGET_STYLE(widthPx)} aria-label={title ?? 'Box widget'}>\n {title ? (\n <header style={BOX_HEADER_STYLE}>\n {collapsible ? (\n <button\n type=\"button\"\n aria-expanded={open}\n style={BOX_HEADER_BUTTON_STYLE}\n onClick={() => onOpenChange(!open)}\n >\n <span>{title}</span>\n <span aria-hidden=\"true\" style={BOX_HEADER_CHEVRON_STYLE(open)}>\n {open ? '\u25BE' : '\u25B8'}\n </span>\n </button>\n ) : (\n <span>{title}</span>\n )}\n </header>\n ) : null}\n <div style={BOX_CONTENT_STYLE(open)}>\n <WidgetContainerRenderer container={container} />\n </div>\n </section>\n );\n}\n\n/**\n * A reusable deck widget that renders a static themed card assembled from widget containers.\n */\nexport class BoxWidget extends Widget<BoxWidgetProps> {\n static defaultProps: Required<BoxWidgetProps> = {\n ...Widget.defaultProps,\n id: 'box-widget',\n placement: 'bottom-left',\n title: undefined!,\n widthPx: 360,\n collapsible: true,\n defaultOpen: true,\n open: undefined!,\n onOpenChange: undefined!,\n panel: undefined!,\n container: {\n kind: 'panel',\n props: {\n panel: {\n id: 'empty-box-panel',\n title: '',\n content: <div />\n }\n }\n }\n };\n\n className = BOX_WIDGET_CLASS;\n placement: WidgetPlacement = BoxWidget.defaultProps.placement;\n title: string | undefined = BoxWidget.defaultProps.title;\n widthPx = BoxWidget.defaultProps.widthPx;\n collapsible = BoxWidget.defaultProps.collapsible;\n isOpen = BoxWidget.defaultProps.defaultOpen;\n #container: WidgetContainer = BoxWidget.defaultProps.container;\n #rootElement: HTMLElement | null = null;\n #hasOpenStateInitialized = false;\n #isControlled = false;\n #openChange: ((open: boolean) => void) | undefined = undefined;\n\n constructor(props: Partial<BoxWidgetProps> = {}) {\n super({\n ...BoxWidget.defaultProps,\n ...props,\n container: asContainer(props.container, props.panel)\n } as BoxWidgetProps);\n this.setProps(this.props);\n }\n\n setProps(props: Partial<BoxWidgetProps>): void {\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if ('title' in props) {\n this.title = props.title;\n }\n if (props.widthPx !== undefined) {\n this.widthPx = normalizeBoxWidthPx(props.widthPx);\n }\n if (props.collapsible !== undefined) {\n this.collapsible = props.collapsible;\n }\n this.#setOpenProps(props);\n if (props.container !== undefined) {\n this.#container = props.container;\n } else if (props.panel !== undefined) {\n this.#container = asContainer(undefined, props.panel);\n }\n\n this.#render();\n super.setProps(props);\n }\n\n onRemove(): void {\n if (this.#rootElement) {\n render(null, this.#rootElement);\n }\n }\n\n onRenderHTML(rootElement: HTMLElement): void {\n this.#rootElement = rootElement;\n rootElement.style.margin = '0';\n this.#render();\n }\n\n #handleOpenChange = (nextOpen: boolean) => {\n if (!this.#isControlled) {\n this.isOpen = nextOpen;\n }\n this.#openChange?.(nextOpen);\n this.#render();\n };\n\n #render = () => {\n if (!this.#rootElement) {\n return;\n }\n\n render(\n <BoxWidgetView\n container={this.#container}\n title={this.title}\n widthPx={this.widthPx}\n open={this.isOpen}\n collapsible={this.collapsible}\n onOpenChange={this.#handleOpenChange}\n />,\n this.#rootElement\n );\n };\n\n #setOpenProps(props: Partial<BoxWidgetProps>): void {\n this.#isControlled = props.open !== undefined;\n if (props.onOpenChange !== undefined) {\n this.#openChange = props.onOpenChange;\n }\n if (props.open !== undefined) {\n this.isOpen = props.open;\n this.#hasOpenStateInitialized = true;\n return;\n }\n if (!this.#hasOpenStateInitialized && props.defaultOpen !== undefined) {\n this.isOpen = props.defaultOpen;\n this.#hasOpenStateInitialized = true;\n }\n }\n}\n\nconst BOX_WIDGET_STYLE = (widthPx: number): JSX.CSSProperties => ({\n margin: 'var(--widget-margin, 12px)',\n width: `${widthPx}px`,\n maxWidth: `min(84vw, ${widthPx}px)`,\n pointerEvents: 'auto',\n border: 'var(--menu-border, 1px solid rgba(148, 163, 184, 0.35))',\n borderRadius: '12px',\n background: 'var(--menu-background, rgba(255, 255, 255, 0.96))',\n backdropFilter: 'var(--menu-backdrop-filter, unset)',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n boxShadow: 'var(--menu-shadow, 0 18px 40px rgba(15, 23, 42, 0.16))',\n overflow: 'hidden'\n});\n\nconst BOX_HEADER_STYLE: JSX.CSSProperties = {\n padding: '14px 16px 10px',\n fontSize: '18px',\n fontWeight: 700,\n lineHeight: 1.2,\n color: 'var(--button-text, currentColor)'\n};\n\nconst BOX_HEADER_BUTTON_STYLE: JSX.CSSProperties = {\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '10px',\n padding: '0',\n border: '0',\n background: 'transparent',\n color: 'inherit',\n font: 'inherit',\n textAlign: 'left',\n cursor: 'pointer'\n};\n\nconst BOX_HEADER_CHEVRON_STYLE = (open: boolean): JSX.CSSProperties => ({\n display: 'block',\n fontSize: '16px',\n lineHeight: 1,\n transform: open ? 'translateY(1px)' : 'translateY(0)'\n});\n\nconst BOX_CONTENT_STYLE = (open: boolean): JSX.CSSProperties => ({\n padding: '0 16px 14px',\n display: open ? 'block' : 'none'\n});\n", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\n\nimport {asPanelContainer, WidgetContainerRenderer} from './widget-containers';\n\nimport type {WidgetContainer, WidgetPanel} from './widget-containers';\nimport type {WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {JSX} from 'preact';\n\n/** Full-screen panel widget properties. */\nexport type FullScreenPanelWidgetProps = WidgetProps & {\n /** The content container to show inside the full-screen panel. */\n container?: WidgetContainer;\n /** Optional shorthand panel. When supplied, shown directly inside the full-screen panel. */\n panel?: WidgetPanel;\n /** Placement anchor for the full-screen panel. Defaults to deck.gl's fill placement. */\n placement?: WidgetPlacement;\n /** Optional panel header title. */\n title?: string;\n /** Inset from the deck overlay edge in pixels. */\n marginPx?: number;\n};\n\nconst FULL_SCREEN_PANEL_WIDGET_CLASS = 'deck-widget-full-screen-panel';\n\n/**\n * Normalizes inset margin into a practical render value.\n */\nfunction normalizeMarginPx(marginPx: number): number {\n const clamped = Math.max(0, Math.floor(marginPx));\n return Number.isFinite(clamped) ? clamped : 24;\n}\n\n/**\n * Normalizes widget-container/panel inputs into a concrete widget container.\n */\nfunction asContainer(container?: WidgetContainer, panel?: WidgetPanel): WidgetContainer {\n if (container !== undefined) {\n return container;\n }\n\n if (panel !== undefined) {\n return asPanelContainer(panel);\n }\n\n return {\n kind: 'panel',\n props: {\n panel: {\n id: 'empty-full-screen-panel',\n title: '',\n content: <div />\n }\n }\n };\n}\n\nfunction FullScreenPanelWidgetView({\n container,\n title,\n marginPx\n}: {\n container: WidgetContainer;\n title?: string;\n marginPx: number;\n}) {\n return (\n <section\n style={FULL_SCREEN_PANEL_WIDGET_STYLE(marginPx)}\n aria-label={title ?? 'Full-screen panel widget'}\n onPointerDown={stopFullScreenPanelEventPropagation}\n onPointerMove={stopFullScreenPanelEventPropagation}\n onPointerUp={stopFullScreenPanelEventPropagation}\n onMouseDown={stopFullScreenPanelEventPropagation}\n onMouseMove={stopFullScreenPanelEventPropagation}\n onMouseUp={stopFullScreenPanelEventPropagation}\n onTouchStart={stopFullScreenPanelEventPropagation}\n onTouchMove={stopFullScreenPanelEventPropagation}\n onTouchEnd={stopFullScreenPanelEventPropagation}\n onClick={stopFullScreenPanelEventPropagation}\n onContextMenu={stopFullScreenPanelEventPropagation}\n onWheel={stopFullScreenPanelEventPropagation}\n >\n {title ? <header style={FULL_SCREEN_PANEL_HEADER_STYLE}>{title}</header> : null}\n <div style={FULL_SCREEN_PANEL_CONTENT_STYLE}>\n <WidgetContainerRenderer container={container} />\n </div>\n </section>\n );\n}\n\n/**\n * Prevents full-screen panel interactions from leaking into the underlying deck canvas.\n */\nfunction stopFullScreenPanelEventPropagation(event: Event): void {\n event.stopPropagation();\n}\n\n/**\n * A reusable deck widget that renders one container inside a large inset panel.\n */\nexport class FullScreenPanelWidget extends Widget<FullScreenPanelWidgetProps> {\n static defaultProps: Required<FullScreenPanelWidgetProps> = {\n ...Widget.defaultProps,\n id: 'full-screen-panel-widget',\n placement: 'fill',\n title: undefined!,\n marginPx: 24,\n panel: undefined!,\n container: {\n kind: 'panel',\n props: {\n panel: {\n id: 'empty-full-screen-panel',\n title: '',\n content: <div />\n }\n }\n }\n };\n\n className = FULL_SCREEN_PANEL_WIDGET_CLASS;\n placement: WidgetPlacement = FullScreenPanelWidget.defaultProps.placement;\n title: string | undefined = FullScreenPanelWidget.defaultProps.title;\n marginPx = FullScreenPanelWidget.defaultProps.marginPx;\n #container: WidgetContainer = FullScreenPanelWidget.defaultProps.container;\n #rootElement: HTMLElement | null = null;\n\n constructor(props: Partial<FullScreenPanelWidgetProps> = {}) {\n super({\n ...FullScreenPanelWidget.defaultProps,\n ...props,\n container: asContainer(props.container, props.panel)\n } as FullScreenPanelWidgetProps);\n this.setProps(this.props);\n }\n\n setProps(props: Partial<FullScreenPanelWidgetProps>): void {\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if ('title' in props) {\n this.title = props.title;\n }\n if (props.marginPx !== undefined) {\n this.marginPx = normalizeMarginPx(props.marginPx);\n }\n if (props.container !== undefined) {\n this.#container = props.container;\n } else if (props.panel !== undefined) {\n this.#container = asContainer(undefined, props.panel);\n }\n\n this.#render();\n super.setProps(props);\n }\n\n onRemove(): void {\n if (this.#rootElement) {\n render(null, this.#rootElement);\n }\n }\n\n onRenderHTML(rootElement: HTMLElement): void {\n this.#rootElement = rootElement;\n const className = ['deck-widget', this.className, this.props.className]\n .filter(Boolean)\n .join(' ');\n rootElement.className = className;\n rootElement.style.position = 'absolute';\n rootElement.style.inset = '0';\n rootElement.style.margin = '0';\n rootElement.style.pointerEvents = 'none';\n rootElement.style.zIndex = '30';\n this.#render();\n }\n\n #render = () => {\n if (!this.#rootElement) {\n return;\n }\n\n render(\n <FullScreenPanelWidgetView\n container={this.#container}\n title={this.title}\n marginPx={this.marginPx}\n />,\n this.#rootElement\n );\n };\n}\n\nconst FULL_SCREEN_PANEL_WIDGET_STYLE = (marginPx: number): JSX.CSSProperties => ({\n position: 'absolute',\n inset: `${marginPx}px`,\n pointerEvents: 'auto',\n display: 'grid',\n gridTemplateRows: 'auto minmax(0, 1fr)',\n border: 'var(--menu-border, 1px solid rgba(148, 163, 184, 0.42))',\n borderRadius: '18px',\n background: 'var(--menu-background, rgba(255, 255, 255, 0.94))',\n backdropFilter: 'var(--menu-backdrop-filter, blur(18px))',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n boxShadow: 'var(--menu-shadow, 0 28px 80px rgba(15, 23, 42, 0.24))',\n overflow: 'hidden'\n});\n\nconst FULL_SCREEN_PANEL_HEADER_STYLE: JSX.CSSProperties = {\n padding: '18px 22px 12px',\n fontSize: '24px',\n fontWeight: 800,\n lineHeight: 1.1,\n letterSpacing: '-0.03em',\n color: 'var(--button-text, currentColor)'\n};\n\nconst FULL_SCREEN_PANEL_CONTENT_STYLE: JSX.CSSProperties = {\n minHeight: 0,\n overflow: 'auto',\n padding: '0 22px 22px'\n};\n", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\n\nimport {DEFAULT_SHORTCUTS, formatKey} from '../keyboard-shortcuts/keyboard-shortcuts';\nimport {KeyboardShortcutsManager} from '../keyboard-shortcuts/keyboard-shortcuts-manager';\n\nimport type {KeyboardShortcut} from '../keyboard-shortcuts/keyboard-shortcuts';\nimport type {WidgetPanel, WidgetPanelTheme} from './widget-containers';\nimport type {WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {JSX} from 'preact';\n\nexport type KeyboardShortcutsWidgetProps = WidgetProps & {\n placement?: WidgetPlacement;\n keyboardShortcuts: KeyboardShortcut[];\n installShortcuts?: boolean;\n};\n\nexport type KeyboardShortcutsPanelProps = {\n /** Optional list of keyboard shortcuts to render in the panel. */\n keyboardShortcuts?: KeyboardShortcut[];\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n};\n\n/**\n * A panel definition representing keyboard shortcut details for a modal/tab container.\n */\nexport class KeyboardShortcutsPanel implements WidgetPanel {\n id = 'keyboard-shortcuts';\n title = 'Keyboard Shortcuts';\n theme?: WidgetPanelTheme;\n content: JSX.Element;\n\n constructor({keyboardShortcuts = [], theme = 'inherit'}: KeyboardShortcutsPanelProps = {}) {\n this.theme = theme;\n this.content = <KeyboardSettingsPanelContent keyboardShortcuts={keyboardShortcuts} />;\n }\n}\n\nexport class KeyboardShortcutsWidget extends Widget<KeyboardShortcutsWidgetProps> {\n static override defaultProps = {\n ...Widget.defaultProps,\n id: 'keyboard-bindings',\n placement: 'top-left',\n keyboardShortcuts: []\n } satisfies Required<WidgetProps> &\n Required<Pick<KeyboardShortcutsWidgetProps, 'placement' | 'keyboardShortcuts'>> &\n KeyboardShortcutsWidgetProps;\n\n className = 'deck-widget-keyboard-bindings';\n placement: WidgetPlacement = KeyboardShortcutsWidget.defaultProps.placement;\n\n #isOpen = false;\n #rootElement: HTMLElement | null = null;\n #keyboardShortcuts: KeyboardShortcut[] = KeyboardShortcutsWidget.defaultProps.keyboardShortcuts;\n #keyboardShortcutsManager: KeyboardShortcutsManager | null = null;\n\n constructor(props: KeyboardShortcutsWidgetProps) {\n super({...KeyboardShortcutsWidget.defaultProps, ...props});\n this.#keyboardShortcuts = props.keyboardShortcuts;\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n }\n\n override setProps(props: Partial<KeyboardShortcutsWidgetProps>): void {\n if (props.keyboardShortcuts !== undefined) {\n this.#keyboardShortcuts = props.keyboardShortcuts;\n this.#restartKeyboardShortcutsManager();\n this.#renderRootElement();\n }\n if (props.installShortcuts !== undefined) {\n this.#restartKeyboardShortcutsManager();\n }\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n super.setProps(props);\n }\n\n override onAdd(): void {\n this.#restartKeyboardShortcutsManager();\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n this.#rootElement = rootElement;\n\n const className = ['deck-widget', this.className, this.props.className]\n .filter(Boolean)\n .join(' ');\n rootElement.className = className;\n\n this.#renderRootElement();\n }\n\n override onRemove(): void {\n if (this.#rootElement) {\n render(null, this.#rootElement);\n }\n if (this.#keyboardShortcutsManager) {\n this.#keyboardShortcutsManager.stop();\n this.#keyboardShortcutsManager = null;\n }\n }\n\n #restartKeyboardShortcutsManager(): void {\n if (this.#keyboardShortcutsManager) {\n this.#keyboardShortcutsManager.stop();\n this.#keyboardShortcutsManager = null;\n }\n // @ts-expect-error Accessing protected member 'eventManager'.\n const eventManager = this.deck?.eventManager;\n if (eventManager && this.props.installShortcuts) {\n this.#keyboardShortcutsManager = new KeyboardShortcutsManager(\n eventManager,\n this.#getEffectiveKeyboardShortcuts()\n );\n this.#keyboardShortcutsManager.start();\n }\n }\n\n #renderRootElement(): void {\n if (!this.#rootElement) {\n return;\n }\n\n render(\n <KeyboardShortcutsWidgetView\n isOpen={this.#isOpen}\n keyboardShortcuts={this.#getEffectiveKeyboardShortcuts()}\n onClose={this.#handleClose}\n onOpen={this.#handleOpen}\n />,\n this.#rootElement\n );\n }\n\n #getEffectiveKeyboardShortcuts(): KeyboardShortcut[] {\n return [\n ...DEFAULT_SHORTCUTS.map((shortcut) => ({\n ...shortcut,\n onKeyPress: this.#handleOpen\n })),\n ...this.#keyboardShortcuts\n ];\n }\n\n #handleOpen = (): void => {\n if (this.#isOpen) {\n return;\n }\n\n this.#isOpen = true;\n this.#renderRootElement();\n };\n\n #handleClose = (): void => {\n if (!this.#isOpen) {\n return;\n }\n\n this.#isOpen = false;\n this.#renderRootElement();\n };\n}\n\nconst MODAL_BACKDROP_STYLE: JSX.CSSProperties = {\n position: 'fixed',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(15, 23, 42, 0.28)',\n pointerEvents: 'auto',\n zIndex: 1000\n};\n\nconst MODAL_STYLE: JSX.CSSProperties = {\n width: 'min(640px, calc(100vw - 24px))',\n maxHeight: 'min(520px, calc(100vh - 24px))',\n borderRadius: '14px',\n border: '1px solid rgba(148, 163, 184, 0.75)',\n backgroundColor: 'rgba(255, 255, 255, 0.98)',\n boxShadow: '0 14px 40px rgba(15, 23, 42, 0.28)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden'\n};\n\nconst KEY_STYLE: JSX.CSSProperties = {\n borderRadius: '6px',\n border: '1px solid rgba(148, 163, 184, 0.85)',\n backgroundColor: 'rgba(248, 250, 252, 1)',\n padding: '2px 8px',\n fontSize: '11px',\n color: 'var(--button-text, #0f172a)',\n whiteSpace: 'nowrap'\n};\nconst ICON_COLOR = 'var(--button-icon-idle, var(--button-text, currentColor))';\nconst SHORTCUT_BADGE_STYLE: JSX.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n borderRadius: '999px',\n border: '1px solid rgba(148, 163, 184, 0.75)',\n backgroundColor: 'rgba(248, 250, 252, 1)',\n padding: '1px 6px',\n fontSize: '10px',\n lineHeight: '12px',\n color: 'rgb(71, 85, 105)',\n whiteSpace: 'nowrap'\n};\nconst SHORTCUT_ROW_STYLE: JSX.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'minmax(104px, 148px) minmax(0, 1fr) auto',\n gap: '10px 14px',\n alignItems: 'start',\n padding: '10px 0',\n borderBottom: '1px solid rgba(226, 232, 240, 0.8)'\n};\nconst SHORTCUT_KEYS_STYLE: JSX.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n flexWrap: 'wrap',\n gap: '10px',\n minWidth: 0\n};\nconst SHORTCUT_DESCRIPTION_STYLE: JSX.CSSProperties = {\n fontSize: '13px',\n lineHeight: '18px',\n fontWeight: 500,\n color: 'rgb(71, 85, 105)',\n textAlign: 'left',\n minWidth: 0,\n width: '100%'\n};\nconst SHORTCUT_BADGES_STYLE: JSX.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '6px',\n flexWrap: 'wrap',\n justifySelf: 'end'\n};\nconst SHORTCUT_CHORD_STYLE: JSX.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '2px',\n color: 'rgb(51, 65, 85)',\n fontSize: '11px',\n whiteSpace: 'nowrap'\n};\n\nfunction KeyboardShortcutsWidgetView({\n isOpen,\n keyboardShortcuts,\n onClose,\n onOpen\n}: {\n isOpen: boolean;\n keyboardShortcuts: KeyboardShortcut[];\n onClose: () => void;\n onOpen: () => void;\n}) {\n return (\n <>\n <div className=\"deck-widget-button\">\n <button\n className=\"deck-widget-icon-button\"\n style={{color: 'var(--button-text, currentColor)'}}\n type=\"button\"\n title=\"Keyboard shortcuts\"\n aria-label=\"Keyboard shortcuts\"\n onClick={onOpen}\n >\n <span\n style={{\n fontSize: '12px',\n fontWeight: 700,\n color: ICON_COLOR\n }}\n >\n <kbd\n style={{\n color: ICON_COLOR\n }}\n >\n ?\n </kbd>\n </span>\n </button>\n </div>\n\n {isOpen && (\n <div style={MODAL_BACKDROP_STYLE} onClick={onClose}>\n <div\n style={MODAL_STYLE}\n role=\"dialog\"\n aria-label=\"Keyboard Shortcuts\"\n onClick={(event) => event.stopPropagation()}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n borderBottom: '1px solid rgba(226, 232, 240, 1)',\n padding: '10px 12px'\n }}\n >\n <div style={{fontSize: '14px', fontWeight: 700, color: 'rgb(30, 41, 59)'}}>\n Keyboard Shortcuts\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n border: 0,\n background: 'transparent',\n color: 'rgb(71, 85, 105)',\n cursor: 'pointer',\n fontSize: '18px',\n lineHeight: '18px'\n }}\n aria-label=\"Close keyboard shortcuts\"\n title=\"Close\"\n >\n \u00D7\n </button>\n </div>\n <KeyboardSettingsPanelContent keyboardShortcuts={keyboardShortcuts} />\n </div>\n </div>\n )}\n </>\n );\n}\n\nfunction KeyboardSettingsPanelContent({\n keyboardShortcuts\n}: {\n keyboardShortcuts: KeyboardShortcut[];\n}) {\n const shortcutRows = buildKeyboardShortcutRows(keyboardShortcuts);\n\n return (\n <div style={{overflowY: 'auto', padding: '10px 12px', flex: 1, minHeight: 0}}>\n <div style={{display: 'flex', flexDirection: 'column'}}>\n {shortcutRows.map((row) => (\n <div key={row.key} style={SHORTCUT_ROW_STYLE}>\n <div\n data-shortcut-row-kind={row.shortcuts.length === 2 ? 'pair' : 'single'}\n style={SHORTCUT_KEYS_STYLE}\n >\n {row.shortcuts.map((shortcut, index) => (\n <div\n key={`${row.key}-${index}`}\n style={{display: 'inline-flex', alignItems: 'center'}}\n >\n <div data-shortcut-key-group=\"true\" key={`${row.key}-${index}`}>\n <ShortcutKey shortcut={shortcut} />\n </div>\n </div>\n ))}\n </div>\n <span data-shortcut-description=\"true\" style={SHORTCUT_DESCRIPTION_STYLE}>\n {row.description}\n </span>\n {row.badges.length > 0 ? (\n <span data-shortcut-badges=\"true\" style={SHORTCUT_BADGES_STYLE}>\n {row.badges.map((badge) => (\n <span key={`${row.key}-${badge}`} style={SHORTCUT_BADGE_STYLE}>\n {badge}\n </span>\n ))}\n </span>\n ) : null}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction ShortcutKey({shortcut}: {shortcut: KeyboardShortcut}) {\n const parts: JSX.Element[] = [];\n\n if (shortcut.commandKey) {\n parts.push(\n <kbd key=\"command\" style={KEY_STYLE}>\n \u2318\n </kbd>\n );\n }\n if (shortcut.ctrlKey) {\n parts.push(\n <kbd key=\"ctrl\" style={KEY_STYLE}>\n ^\n </kbd>\n );\n }\n if (shortcut.shiftKey) {\n parts.push(\n <kbd key=\"shift\" style={KEY_STYLE}>\n Shift\n </kbd>\n );\n }\n if (shortcut.key) {\n parts.push(\n <kbd key=\"key\" style={KEY_STYLE}>\n {formatKey(shortcut.key)}\n </kbd>\n );\n }\n if (shortcut.dragMouse) {\n parts.push(\n <span key=\"drag\" style={{whiteSpace: 'nowrap'}}>\n drag mouse\n </span>\n );\n }\n\n return (\n <div style={SHORTCUT_CHORD_STYLE}>\n {parts.map((part, index) => (\n <span key={`shortcut-part-${index}`} style={{display: 'inline-flex', alignItems: 'center'}}>\n {part}\n </span>\n ))}\n </div>\n );\n}\n\ntype KeyboardShortcutRow = {\n badges: string[];\n description: string;\n key: string;\n shortcuts: KeyboardShortcut[];\n};\n\nfunction buildKeyboardShortcutRows(shortcuts: KeyboardShortcut[]): KeyboardShortcutRow[] {\n const rows: KeyboardShortcutRow[] = [];\n\n for (let index = 0; index < shortcuts.length; index += 1) {\n const shortcut = shortcuts[index];\n const nextShortcut = shortcuts[index + 1];\n const shortcutDisplayPair = shortcut?.displayPair;\n\n if (\n shortcut &&\n shortcutDisplayPair &&\n nextShortcut &&\n canPairShortcuts(shortcut, nextShortcut)\n ) {\n rows.push({\n badges: mergeShortcutBadges(shortcut, nextShortcut),\n description: shortcutDisplayPair.description,\n key: `${shortcutDisplayPair.id}-${index}`,\n shortcuts: [shortcut, nextShortcut]\n });\n index += 1;\n } else if (shortcut) {\n rows.push({\n badges: [...(shortcut.badges ?? [])],\n description: shortcut.description,\n key: `${shortcut.name}-${shortcut.key}-${index}`,\n shortcuts: [shortcut]\n });\n }\n }\n\n return rows;\n}\n\nfunction canPairShortcuts(\n shortcut: KeyboardShortcut,\n nextShortcut: KeyboardShortcut | undefined\n): nextShortcut is KeyboardShortcut {\n if (!nextShortcut) {\n return false;\n }\n\n const shortcutPair = shortcut.displayPair;\n const nextShortcutPair = nextShortcut.displayPair;\n if (!shortcutPair || !nextShortcutPair) {\n return false;\n }\n\n return (\n shortcutPair.position === 'primary' &&\n nextShortcutPair.position === 'secondary' &&\n shortcutPair.id === nextShortcutPair.id &&\n shortcutPair.description === nextShortcutPair.description\n );\n}\n\nfunction mergeShortcutBadges(...shortcuts: KeyboardShortcut[]): string[] {\n const seenBadges = new Set<string>();\n const mergedBadges: string[] = [];\n\n for (const shortcut of shortcuts) {\n for (const badge of shortcut.badges ?? []) {\n if (!seenBadges.has(badge)) {\n seenBadges.add(badge);\n mergedBadges.push(badge);\n }\n }\n }\n\n return mergedBadges;\n}\n", "export type KeyboardShortcut = {\n key: string;\n commandKey?: boolean;\n shiftKey?: boolean;\n ctrlKey?: boolean;\n dragMouse?: boolean;\n badges?: string[];\n displayPair?: {\n id: string;\n position: 'primary' | 'secondary';\n description: string;\n };\n\n name: string;\n description: string;\n onKeyPress?: () => void;\n};\n\nexport const DEFAULT_SHORTCUTS: KeyboardShortcut[] = [\n {\n key: '/',\n commandKey: true,\n name: 'Show Shortcuts',\n description: 'Show keyboard shortcuts'\n }\n];\n\nconst navigator = typeof window !== 'undefined' ? globalThis.navigator : {platform: ''};\nconst isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n\nexport const isShortcutMatchingKeyEvent = (e: KeyboardEvent, shortcut: KeyboardShortcut) => {\n const isCmd = isMac ? e.metaKey : e.ctrlKey;\n return (\n shortcut.key.toLowerCase() === e.key.toLowerCase() &&\n (shortcut.commandKey ? isCmd : true) &&\n (shortcut.shiftKey ? e.shiftKey : true) &&\n (shortcut.ctrlKey ? e.ctrlKey : true)\n );\n};\n\nexport const findShortcutMatchingKeyEvent = (e: KeyboardEvent, shortcuts: KeyboardShortcut[]) => {\n return shortcuts.find((shortcut) => isShortcutMatchingKeyEvent(e, shortcut));\n};\n\n// Pretty \u201Ckeycap\u201D glyphs for KeyboardEvent.key (browser KeyEvent)\nexport const keyCharacter: Record<string, string> = {\n // Arrows\n ArrowLeft: '\u2190',\n ArrowRight: '\u2192',\n ArrowUp: '\u2191',\n ArrowDown: '\u2193',\n\n // Navigation\n Home: '\u2912',\n End: '\u2913',\n PageUp: '\u21DE',\n PageDown: '\u21DF',\n\n // Editing\n Backspace: '\u232B',\n Delete: '\u2326',\n Insert: 'Ins',\n\n // Whitespace / confirm / escape\n Enter: '\u23CE',\n Escape: '\u238B',\n Tab: '\u21E5',\n ' ': '\u2420', // KeyboardEvent.key for Space is literally \" \"\n Spacebar: '\u2420', // legacy (some older browsers)\n\n // Modifiers\n Shift: 'Shift', // '\u21E7',\n Control: '\u2303',\n Alt: '\u2325',\n Meta: '\u2318', // Windows key on Win; Command on macOS\n CapsLock: '\u21EA',\n\n // System / toggles\n ContextMenu: '\u2263',\n PrintScreen: '\u2399',\n ScrollLock: '\u21F3',\n Pause: '\u23F8',\n NumLock: '\u21ED',\n\n // Media keys (common)\n MediaPlayPause: '\u23EF',\n MediaStop: '\u23F9',\n MediaTrackNext: '\u23ED',\n MediaTrackPrevious: '\u23EE',\n AudioVolumeMute: '\uD83D\uDD07',\n AudioVolumeDown: '\uD83D\uDD09',\n AudioVolumeUp: '\uD83D\uDD0A'\n};\n\n// Optional: normalize a KeyboardEvent into a human-friendly label\nexport function formatKey(key: string): string {\n // Prefer mapping for special keys, otherwise use the raw key (letters, digits, punctuation).\n // Make single characters uppercase for nicer display.\n const mapped = keyCharacter[key];\n if (mapped) return mapped;\n\n // Function keys: \"F1\"...\"F24\"\n if (/^F\\d{1,2}$/.test(key)) return key;\n\n // Numpad keys often come as \"Numpad1\", etc.\n if (key.startsWith('Numpad')) return key.replace('Numpad', 'Num ');\n\n // For plain characters: show as-is, but uppercase letters.\n if (key.length === 1) return key.toUpperCase();\n\n // Fallback for less common named keys\n return key.toUpperCase();\n}\n", "import {findShortcutMatchingKeyEvent} from './keyboard-shortcuts';\n\nimport type {KeyboardShortcut} from './keyboard-shortcuts';\nimport type {EventManager, MjolnirKeyEvent} from 'mjolnir.js';\n\nexport class KeyboardShortcutsManager {\n private shortcuts: KeyboardShortcut[] = [];\n eventManager: EventManager;\n\n constructor(eventManager: EventManager, shortcuts: KeyboardShortcut[]) {\n this.eventManager = eventManager;\n this.shortcuts = shortcuts;\n }\n\n start() {\n // console.log('Installing keyboard shortcuts:', this.shortcuts);\n this.eventManager.on('keydown', this._handleKeyDown);\n }\n\n stop() {\n this.eventManager.off('keydown', this._handleKeyDown);\n // console.log('Uninstalling keyboard shortcuts:', this.shortcuts);\n }\n\n private _handleKeyDown = (e: MjolnirKeyEvent) => {\n // console.log('Mjolnir key event:', e);\n const shortcut = findShortcutMatchingKeyEvent(e.srcEvent, this.shortcuts);\n if (shortcut) {\n shortcut?.onKeyPress?.();\n // e.preventDefault();\n }\n // console.log('Key pressed:', e.srcEvent.key, 'Matching shortcut:', shortcut?.name);\n };\n}\n\nexport class KeyboardShortcutsManagerDocument {\n private shortcuts: KeyboardShortcut[] = [];\n private _handleKeyDown = (e: KeyboardEvent) => {\n const shortcut = findShortcutMatchingKeyEvent(e, this.shortcuts);\n if (shortcut) {\n shortcut?.onKeyPress?.();\n // e.preventDefault();\n }\n // console.log('Key pressed:', e.key, 'Matching shortcut:', shortcut?.name);\n };\n\n constructor(shortcuts: KeyboardShortcut[]) {\n this.shortcuts = shortcuts;\n }\n\n start() {\n document.addEventListener('keydown', this._handleKeyDown);\n }\n\n stop() {\n document.removeEventListener('keydown', this._handleKeyDown);\n }\n}\n", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\n\nimport {asPanelContainer, WidgetContainerRenderer} from './widget-containers';\nimport {IconButton, makeTextIcon} from '../widget-components/icon-button';\n\nimport type {WidgetContainer, WidgetPanel} from './widget-containers';\nimport type {WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {JSX} from 'preact';\n\n/** Trigger and panel configuration for a modal-style widget. */\nexport type ModalWidgetProps = WidgetProps & {\n /** Trigger icon alias for legacy compatibility. */\n icon?: string;\n /** The content container to show when the modal is open. */\n container?: WidgetContainer;\n /** Optional shorthand panel. When supplied, shown directly in the modal body. */\n panel?: WidgetPanel;\n /** Button and panel placement anchor. */\n placement?: WidgetPlacement;\n /** Optional modal title shown in the header. */\n title?: string;\n /** Optional trigger button label visible in the UI. */\n triggerLabel?: string;\n /** Optional trigger icon. Defaults to a menu-like glyph. */\n triggerIcon?: string;\n /**\n * Hides the trigger. Useful when trigger is implemented externally.\n */\n hideTrigger?: boolean;\n /**\n * Whether to render the built-in trigger button.\n * If false, no built-in trigger is rendered.\n */\n button?: boolean;\n /**\n * Uncontrolled default open state.\n */\n defaultOpen?: boolean;\n /**\n * Controlled open state. If supplied, callers own open/closed state.\n */\n open?: boolean;\n /**\n * Called when user intent changes open/closed state.\n */\n onOpenChange?: (open: boolean) => void;\n};\n\nconst MODAL_WIDGET_CLASS = 'deck-widget-modal';\nconst MODAL_TRIGGER_ICON = makeTextIcon('\u25A6', 18, 24);\nconst DIALOG_MAX_WIDTH = 'min(88vw, 620px)';\nconst MODAL_OPEN_CONTAINER_Z_INDEX = '40';\n\n/**\n * Normalizes widget-container/panel inputs into a concrete widget container.\n */\nfunction asContainer(container?: WidgetContainer, panel?: WidgetPanel): WidgetContainer {\n if (container !== undefined) {\n return container;\n }\n\n if (panel !== undefined) {\n return asPanelContainer(panel);\n }\n\n return {\n kind: 'accordeon',\n props: {\n panels: []\n }\n };\n}\n\n/**\n * Resolves the trigger icon from legacy and new prop names.\n */\nfunction resolveTriggerIcon({icon, triggerIcon}: {icon?: string; triggerIcon?: string}): string {\n if (icon !== undefined) {\n return icon;\n }\n\n if (triggerIcon !== undefined) {\n return triggerIcon;\n }\n\n return MODAL_TRIGGER_ICON;\n}\n\n/**\n * Resolves final trigger visibility from explicit and legacy hide props.\n */\nfunction resolveHideTrigger({\n hideTrigger,\n button\n}: {\n hideTrigger?: boolean;\n button?: boolean;\n}): boolean {\n if (button !== undefined) {\n return !button;\n }\n\n return hideTrigger ?? false;\n}\n\n/**\n * Stops bubbling from inner modal controls so parent listeners do not receive the interaction.\n */\nfunction stopPropagation(event: Event): void {\n event.stopPropagation();\n}\n\nfunction ModalWidgetView({\n container,\n title,\n hideTrigger,\n triggerLabel,\n triggerIcon,\n open,\n onOpenChange\n}: {\n container: WidgetContainer;\n title: string;\n hideTrigger: boolean;\n triggerIcon: string;\n triggerLabel: string;\n open: boolean;\n onOpenChange: (next: boolean) => void;\n}) {\n return (\n <div>\n {!hideTrigger && (\n <IconButton\n icon={triggerIcon}\n title={open ? `Close ${triggerLabel}` : `Open ${triggerLabel}`}\n onClick={() => onOpenChange(!open)}\n />\n )}\n\n {!open && <div />}\n {open && (\n <>\n <button\n type=\"button\"\n style={OVERLAY_BACKDROP_STYLE}\n onPointerDown={() => onOpenChange(false)}\n />\n <div style={MODAL_DIALOG_WRAPPER_STYLE}>\n <div style={MODAL_DIALOG_PANEL_STYLE}>\n <div style={MODAL_HEADER_STYLE}>\n <span style={MODAL_HEADER_TITLE_STYLE}>{title}</span>\n <button\n type=\"button\"\n aria-label=\"Close\"\n style={MODAL_CLOSE_BUTTON_STYLE}\n onPointerDown={stopPropagation}\n onPointerUp={() => onOpenChange(false)}\n >\n \u00D7\n </button>\n </div>\n <div style={MODAL_CONTENT_STYLE}>\n <WidgetContainerRenderer container={container} />\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n\n/**\n * A reusable deck widget that renders a trigger + modal panel assembled from widget containers.\n */\nexport class ModalWidget extends Widget<ModalWidgetProps> {\n static defaultProps: Required<ModalWidgetProps> = {\n ...Widget.defaultProps,\n id: 'modal-widget',\n placement: 'top-right',\n title: 'Panel',\n triggerLabel: 'Open panel',\n triggerIcon: MODAL_TRIGGER_ICON,\n icon: undefined!,\n panel: undefined!,\n hideTrigger: false,\n button: undefined!,\n defaultOpen: false,\n onOpenChange: undefined!,\n open: undefined!,\n container: {\n kind: 'panel',\n props: {\n panel: {\n id: 'empty-modal-panel',\n title: 'Empty',\n content: <div />\n }\n }\n }\n };\n\n className = MODAL_WIDGET_CLASS;\n placement: WidgetPlacement = ModalWidget.defaultProps.placement;\n triggerLabel: string = ModalWidget.defaultProps.triggerLabel;\n triggerIcon: string = ModalWidget.defaultProps.triggerIcon;\n hideTrigger = ModalWidget.defaultProps.hideTrigger;\n title = ModalWidget.defaultProps.title;\n isOpen = false;\n #hasOpenStateInitialized = false;\n #container: WidgetContainer = ModalWidget.defaultProps.container;\n #isControlled = false;\n #openChange: ((open: boolean) => void) | undefined = undefined;\n #rootElement: HTMLElement | null = null;\n #placementContainer: HTMLElement | null = null;\n #placementContainerZIndex = '';\n #isDocumentKeyListenerAttached = false;\n\n constructor(props: Partial<ModalWidgetProps> = {}) {\n super({\n ...ModalWidget.defaultProps,\n ...props,\n container: asContainer(props.container, props.panel),\n triggerIcon: resolveTriggerIcon(props)\n } as ModalWidgetProps);\n this.setProps(this.props);\n }\n\n setProps(props: Partial<ModalWidgetProps>): void {\n this.#setDisplayProps(props);\n this.#setContainerProps(props);\n this.#setOpenProps(props);\n this.#render();\n super.setProps(props);\n }\n\n onAdd(): void {\n this.#render();\n }\n\n onRemove(): void {\n this.#detachDocumentKeyListener();\n this.#syncPlacementContainerZIndex();\n if (this.#rootElement) {\n render(null, this.#rootElement);\n }\n }\n\n onRenderHTML(rootElement: HTMLElement): void {\n this.#rootElement = rootElement;\n this.#placementContainer ??= rootElement.parentElement;\n if (this.#placementContainer && !this.#placementContainerZIndex) {\n this.#placementContainerZIndex = this.#placementContainer.style.zIndex;\n }\n const className = ['deck-widget', this.className, this.props.className]\n .filter(Boolean)\n .join(' ');\n rootElement.className = className;\n this.#render();\n }\n\n #handleOpenChange = (nextOpen: boolean) => {\n if (!this.#isControlled) {\n this.isOpen = nextOpen;\n }\n this.#openChange?.(nextOpen);\n this.#render();\n };\n\n #setDisplayProps(props: Partial<ModalWidgetProps>): void {\n if (props.icon !== undefined) {\n this.triggerIcon = props.icon;\n }\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.triggerLabel !== undefined) {\n this.triggerLabel = props.triggerLabel;\n }\n if (props.triggerIcon !== undefined) {\n this.triggerIcon = props.triggerIcon;\n }\n if (props.hideTrigger !== undefined || props.button !== undefined) {\n this.hideTrigger = resolveHideTrigger({\n hideTrigger: props.hideTrigger,\n button: props.button\n });\n }\n if (props.title !== undefined) {\n this.title = props.title;\n }\n }\n\n #setContainerProps(props: Partial<ModalWidgetProps>): void {\n if (props.container !== undefined) {\n this.#container = props.container;\n } else if (props.panel !== undefined) {\n this.#container = asContainer(undefined, props.panel);\n }\n\n if (props.onOpenChange !== undefined) {\n this.#openChange = props.onOpenChange;\n }\n }\n\n #setOpenProps(props: Partial<ModalWidgetProps>): void {\n this.#isControlled = props.open !== undefined;\n if (props.open !== undefined) {\n this.isOpen = props.open;\n this.#hasOpenStateInitialized = true;\n return;\n }\n\n if (!this.#hasOpenStateInitialized && props.defaultOpen !== undefined) {\n this.isOpen = props.defaultOpen;\n this.#hasOpenStateInitialized = true;\n }\n }\n\n /**\n * Closes the modal when the user presses Escape while it is open.\n */\n #handleDocumentKeyDown = (event: KeyboardEvent) => {\n if (!this.isOpen || event.key !== 'Escape') {\n return;\n }\n\n event.preventDefault();\n this.#handleOpenChange(false);\n };\n\n /**\n * Keeps the document Escape handler attached only while the modal is open.\n */\n #syncDocumentKeyListener(): void {\n if (this.isOpen) {\n if (!this.#isDocumentKeyListenerAttached) {\n document.addEventListener('keydown', this.#handleDocumentKeyDown);\n this.#isDocumentKeyListenerAttached = true;\n }\n return;\n }\n\n this.#detachDocumentKeyListener();\n }\n\n /**\n * Removes the document Escape handler when the modal is closed or unmounted.\n */\n #detachDocumentKeyListener(): void {\n if (!this.#isDocumentKeyListenerAttached) {\n return;\n }\n\n document.removeEventListener('keydown', this.#handleDocumentKeyDown);\n this.#isDocumentKeyListenerAttached = false;\n }\n\n /**\n * Keeps the modal's placement container above sibling widget containers while the modal is open.\n */\n #syncPlacementContainerZIndex(): void {\n if (!this.#placementContainer) {\n return;\n }\n\n this.#placementContainer.style.zIndex = this.isOpen\n ? MODAL_OPEN_CONTAINER_Z_INDEX\n : this.#placementContainerZIndex;\n }\n\n #render = () => {\n if (!this.#rootElement) {\n return;\n }\n\n this.#syncDocumentKeyListener();\n this.#syncPlacementContainerZIndex();\n\n render(\n <ModalWidgetView\n container={this.#container}\n title={this.title}\n hideTrigger={this.hideTrigger}\n triggerLabel={this.triggerLabel}\n triggerIcon={this.triggerIcon}\n open={this.isOpen}\n onOpenChange={this.#handleOpenChange}\n />,\n this.#rootElement\n );\n };\n}\n\nconst OVERLAY_BACKDROP_STYLE: JSX.CSSProperties = {\n position: 'fixed',\n inset: '0',\n backgroundColor: 'rgba(17, 24, 39, 0.28)',\n border: 'none',\n padding: '0',\n margin: '0',\n zIndex: 30\n};\n\nconst MODAL_DIALOG_WRAPPER_STYLE: JSX.CSSProperties = {\n position: 'fixed',\n inset: '0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n zIndex: 31\n};\n\nconst MODAL_DIALOG_PANEL_STYLE: JSX.CSSProperties = {\n pointerEvents: 'auto',\n width: 'min(90vw, 760px)',\n maxWidth: DIALOG_MAX_WIDTH,\n maxHeight: 'min(84vh, 84dvh)',\n borderRadius: 'var(--menu-corner-radius, 10px)',\n border: 'var(--menu-border, 1px solid rgba(148, 163, 184, 0.35))',\n background: 'var(--menu-background, #fff)',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n boxShadow: 'var(--menu-shadow, 0px 12px 30px rgba(0,0,0,0.25))',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column'\n};\n\nconst MODAL_HEADER_STYLE: JSX.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '10px',\n padding: '10px 12px',\n borderBottom: 'var(--menu-divider, var(--menu-border, 1px solid rgba(148, 163, 184, 0.25)))',\n backgroundColor:\n 'var(--menu-weak-background, var(--button-background, var(--menu-background, #fff)))',\n color: 'var(--menu-text, rgb(24, 24, 26))'\n};\n\nconst MODAL_HEADER_TITLE_STYLE: JSX.CSSProperties = {\n margin: 0,\n fontSize: '13px',\n fontWeight: 700\n};\n\nconst MODAL_CLOSE_BUTTON_STYLE: JSX.CSSProperties = {\n width: '24px',\n height: '24px',\n borderRadius: '999px',\n border: 'var(--menu-inner-border, 1px solid rgba(148, 163, 184, 0.35))',\n backgroundColor: 'transparent',\n color: 'var(--button-text, rgb(24, 24, 26))',\n cursor: 'pointer'\n};\n\nconst MODAL_CONTENT_STYLE: JSX.CSSProperties = {\n flex: 1,\n overflow: 'auto',\n padding: '10px'\n};\n", "/** @jsxImportSource preact */\nimport {useMemo} from 'preact/hooks';\n\nimport {useEffectiveWidgetPanelThemeMode} from './widget-containers';\n\nimport type {WidgetPanel, WidgetPanelTheme} from './widget-containers';\nimport type {JSX} from 'preact';\nimport type {Stats} from '@probe.gl/stats';\n\n/** Props for {@link StatsPanel}. */\nexport type StatsPanelProps = {\n /** Stable panel id used by parent containers. */\n id: string;\n /** Visible heading text for the panel. */\n title: string;\n /** Probe.gl stats bag rendered by this panel. */\n stats: Stats;\n /** Optional stat names to render and their order. Defaults to all stats in insertion order. */\n statNames?: string[];\n /** Optional label mapping for displayed stat names. */\n labels?: Partial<Record<string, string>>;\n /** Optional class name applied to the outer panel content wrapper. */\n className?: string;\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n};\n\n/** Widget panel that renders a compact table of probe.gl stats. */\nexport class StatsPanel implements WidgetPanel {\n /** Stable panel id used by parent containers. */\n id: string;\n /** Visible heading text for the panel. */\n title: string;\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n /** Rendered Preact content for this panel. */\n content: JSX.Element;\n\n /** Creates a stats panel for one probe.gl {@link Stats} bag. */\n constructor(props: StatsPanelProps) {\n this.id = props.id;\n this.title = props.title;\n this.theme = props.theme ?? 'inherit';\n this.content = <StatsPanelContent {...props} />;\n }\n}\n\n/** Renders the stats rows used by {@link StatsPanel}. */\nfunction StatsPanelContent({stats, statNames, labels, className}: StatsPanelProps): JSX.Element {\n const themeMode = useEffectiveWidgetPanelThemeMode();\n const rows = useMemo(() => {\n const table = stats.getTable();\n const names = statNames ?? Object.keys(table);\n return names\n .filter((name) => table[name])\n .map((name) => ({\n name,\n label: labels?.[name] ?? name,\n value: table[name].count\n }));\n }, [labels, statNames, stats]);\n\n /** Theme-aware colors used by the stats table. */\n const colors =\n themeMode === 'dark'\n ? {\n text: '#f8fafc',\n muted: 'rgba(226, 232, 240, 0.78)',\n divider: 'rgba(148, 163, 184, 0.22)'\n }\n : {\n text: '#0f172a',\n muted: 'rgba(15, 23, 42, 0.72)',\n divider: 'rgba(15, 23, 42, 0.12)'\n };\n\n return (\n <div className={className} style={{display: 'grid', gap: '8px'}}>\n {rows.map((row, index) => (\n <div\n key={row.name}\n style={{\n display: 'grid',\n gridTemplateColumns: '1fr auto',\n gap: '12px',\n alignItems: 'baseline',\n paddingTop: index === 0 ? '0' : '8px',\n borderTop: index === 0 ? 'none' : `1px solid ${colors.divider}`\n }}\n >\n <span\n style={{color: colors.muted, font: '600 12px/1.4 ui-sans-serif,system-ui,sans-serif'}}\n >\n {row.label}\n </span>\n <span\n style={{\n color: colors.text,\n font: '700 12px/1.4 ui-monospace,SFMono-Regular,Menlo,monospace'\n }}\n >\n {row.value}\n </span>\n </div>\n ))}\n </div>\n );\n}\n", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\n\nimport {asPanelContainer, WidgetContainerRenderer} from './widget-containers';\nimport {makeTextIcon} from '../widget-components/icon-button';\n\nimport type {WidgetContainer, WidgetPanel} from './widget-containers';\nimport type {WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {JSX} from 'preact';\n\n/** Sidebar widget properties. */\nexport type SidebarWidgetProps = WidgetProps & {\n /** Trigger icon alias for legacy compatibility. */\n icon?: string;\n /** The content container to show in the sidebar. */\n container?: WidgetContainer;\n /** Optional shorthand panel. When supplied, shown directly inside the sidebar. */\n panel?: WidgetPanel;\n /** Preferred sidebar edge. */\n side?: 'left' | 'right';\n /** Sidebar width in pixels. */\n widthPx?: number;\n /** Container placement inside the selected widget container. */\n placement?: WidgetPlacement;\n /** Sidebar header title. */\n title?: string;\n /** Uncontrolled default open state. */\n defaultOpen?: boolean;\n /**\n * Controlled open state. If supplied, callers own open/closed state.\n */\n open?: boolean;\n /** Called when user intent changes open/closed state. */\n onOpenChange?: (open: boolean) => void;\n /** Optional trigger label. */\n triggerLabel?: string;\n /** Optional trigger icon. Defaults to a panel-like glyph. */\n triggerIcon?: string;\n /**\n * Hides the trigger. Useful when trigger is implemented externally.\n */\n hideTrigger?: boolean;\n /**\n * Whether to render the built-in icon trigger button.\n * If false, a text trigger button is used unless hidden.\n */\n button?: boolean;\n};\n\nconst SIDEBAR_WIDGET_CLASS = 'deck-widget-sidebar';\nconst SIDEBAR_TRIGGER_ICON = makeTextIcon('\u2630', 16, 24);\nconst SIDEBAR_HANDLE_WIDTH_PX = 36;\nconst SIDEBAR_HANDLE_GAP_PX = 8;\nconst SIDEBAR_TRANSITION_MS = 320;\nconst SIDEBAR_OVERLAY_Z_INDEX = '35';\n\n/**\n * Resolves the trigger icon from legacy and new prop names.\n */\nfunction resolveTriggerIcon({icon, triggerIcon}: {icon?: string; triggerIcon?: string}): string {\n if (icon !== undefined) {\n return icon;\n }\n\n if (triggerIcon !== undefined) {\n return triggerIcon;\n }\n\n return SIDEBAR_TRIGGER_ICON;\n}\n\n/**\n * Renders a sidebar container with an edge-mounted trigger and animated slide-over panel.\n */\nfunction SidebarWidgetView({\n container,\n side,\n title,\n triggerLabel,\n open,\n button,\n hideTrigger,\n panelWidthPx,\n onOpenChange\n}: {\n container: WidgetContainer;\n side: 'left' | 'right';\n title?: string;\n triggerLabel: string;\n open: boolean;\n button: boolean;\n hideTrigger: boolean;\n panelWidthPx: number;\n onOpenChange: (next: boolean) => void;\n}) {\n const shouldRenderShell = open || !hideTrigger;\n const panelWidthWithHandlePx = hideTrigger\n ? panelWidthPx\n : panelWidthPx + SIDEBAR_HANDLE_WIDTH_PX + SIDEBAR_HANDLE_GAP_PX;\n const handleChevron = getSidebarHandleChevron(side, open);\n const handleLabel = open ? `Close ${triggerLabel}` : triggerLabel;\n\n return (\n <div>\n {!shouldRenderShell ? null : (\n <aside style={SIDEBAR_PANEL_WRAPPER_STYLE} aria-label={title ?? triggerLabel}>\n <div\n data-sidebar-shell=\"\"\n style={SIDEBAR_SHELL_STYLE(side, panelWidthPx, panelWidthWithHandlePx, open)}\n onPointerDown={stopSidebarEventPropagation}\n onPointerMove={stopSidebarEventPropagation}\n onPointerUp={stopSidebarEventPropagation}\n onMouseDown={stopSidebarEventPropagation}\n onMouseMove={stopSidebarEventPropagation}\n onMouseUp={stopSidebarEventPropagation}\n onTouchStart={stopSidebarEventPropagation}\n onTouchMove={stopSidebarEventPropagation}\n onTouchEnd={stopSidebarEventPropagation}\n onClick={stopSidebarEventPropagation}\n onDblClick={stopSidebarEventPropagation}\n onContextMenu={stopSidebarEventPropagation}\n onWheel={stopSidebarEventPropagation}\n >\n {!hideTrigger && (\n <div data-sidebar-handle=\"\" style={SIDEBAR_HANDLE_WRAPPER_STYLE}>\n {button ? (\n <button\n type=\"button\"\n data-sidebar-handle-button=\"\"\n aria-label={handleLabel}\n title={handleLabel}\n style={SIDEBAR_HANDLE_BUTTON_STYLE}\n onClick={() => onOpenChange(!open)}\n >\n <span aria-hidden=\"true\" style={SIDEBAR_HANDLE_CHEVRON_STYLE}>\n {handleChevron}\n </span>\n </button>\n ) : (\n <div className=\"deck-widget-button\" style={SIDEBAR_HANDLE_BUTTON_WRAPPER_STYLE}>\n <button\n type=\"button\"\n aria-label={open ? `Close ${triggerLabel}` : triggerLabel}\n style={SIDEBAR_TRIGGER_STYLE}\n onPointerUp={() => onOpenChange(!open)}\n >\n {triggerLabel}\n </button>\n </div>\n )}\n </div>\n )}\n <div\n style={SIDEBAR_PANEL_STYLE(side, panelWidthPx, open)}\n role=\"dialog\"\n aria-hidden={!open}\n >\n {title ? (\n <header style={SIDEBAR_HEADER_STYLE}>\n <span>{title}</span>\n </header>\n ) : null}\n <div style={SIDEBAR_CONTENT_STYLE}>\n <WidgetContainerRenderer container={container} />\n </div>\n </div>\n </div>\n </aside>\n )}\n </div>\n );\n}\n\n/**\n * Prevents pointer and wheel events from reaching the underlying deck canvas.\n */\nfunction stopSidebarEventPropagation(event: Event): void {\n event.stopPropagation();\n}\n\n/**\n * Normalizes sidebar width configuration into a practical render value.\n */\nfunction normalizeSidebarWidthPx(widthPx: number): number {\n const clamped = Math.max(220, Math.floor(widthPx));\n return Number.isFinite(clamped) ? clamped : 360;\n}\n\n/**\n * A reusable deck widget that renders a side-anchored panel with configurable container content.\n */\nexport class SidebarWidget extends Widget<SidebarWidgetProps> {\n static defaultProps: Required<SidebarWidgetProps> = {\n ...Widget.defaultProps,\n id: 'sidebar-widget',\n panel: undefined!,\n container: {\n kind: 'accordeon',\n props: {\n panels: []\n }\n },\n side: 'right',\n widthPx: 360,\n placement: 'top-right',\n title: undefined!,\n defaultOpen: true,\n open: undefined!,\n onOpenChange: undefined!,\n icon: undefined!,\n hideTrigger: false,\n triggerLabel: 'Open sidebar',\n triggerIcon: SIDEBAR_TRIGGER_ICON,\n button: false\n };\n\n className = SIDEBAR_WIDGET_CLASS;\n placement: WidgetPlacement = SidebarWidget.defaultProps.placement;\n side: 'left' | 'right' = SidebarWidget.defaultProps.side;\n widthPx = SidebarWidget.defaultProps.widthPx;\n title: string | undefined = SidebarWidget.defaultProps.title;\n triggerLabel = SidebarWidget.defaultProps.triggerLabel;\n hideTrigger = SidebarWidget.defaultProps.hideTrigger;\n triggerIcon = SidebarWidget.defaultProps.triggerIcon;\n button = SidebarWidget.defaultProps.button;\n isOpen = false;\n #hasOpenStateInitialized = false;\n #container: WidgetContainer = SidebarWidget.defaultProps.container;\n #isControlled = false;\n #openChange: ((open: boolean) => void) | undefined = undefined;\n #rootElement: HTMLElement | null = null;\n #overlayParent: HTMLElement | null = null;\n\n constructor(props: Partial<SidebarWidgetProps> = {}) {\n super({\n ...SidebarWidget.defaultProps,\n ...props,\n container: props.container ?? asContainer(props.panel),\n triggerIcon: resolveTriggerIcon(props)\n } as SidebarWidgetProps);\n this.setProps(this.props);\n }\n\n setProps(props: Partial<SidebarWidgetProps>): void {\n this.#setDisplayProps(props);\n this.#setContainerProps(props);\n this.#setOpenProps(props);\n this.#render();\n super.setProps(props);\n }\n\n onAdd(): void {\n this.#render();\n }\n\n onRemove(): void {\n if (this.#rootElement) {\n render(null, this.#rootElement);\n }\n }\n\n onRenderHTML(rootElement: HTMLElement): void {\n this.#rootElement = rootElement;\n this.#overlayParent ??= this.#resolveOverlayParent(rootElement);\n if (this.#overlayParent && rootElement.parentElement !== this.#overlayParent) {\n this.#overlayParent.append(rootElement);\n }\n const className = ['deck-widget', this.className, this.props.className]\n .filter(Boolean)\n .join(' ');\n rootElement.className = className;\n rootElement.style.position = 'absolute';\n rootElement.style.top = 'var(--widget-margin, 12px)';\n rootElement.style.bottom = 'var(--widget-margin, 12px)';\n rootElement.style.left = this.side === 'left' ? '-1px' : 'var(--widget-margin, 12px)';\n rootElement.style.right = this.side === 'right' ? '-1px' : 'var(--widget-margin, 12px)';\n rootElement.style.width = 'auto';\n rootElement.style.height = 'auto';\n rootElement.style.margin = '0';\n rootElement.style.overflow = 'hidden';\n rootElement.style.pointerEvents = 'none';\n rootElement.style.zIndex = SIDEBAR_OVERLAY_Z_INDEX;\n (this.props as {_widgetContainer?: 'overlay'})._widgetContainer = 'overlay';\n this.#render();\n }\n\n #handleOpenChange = (nextOpen: boolean) => {\n if (!this.#isControlled) {\n this.isOpen = nextOpen;\n }\n this.#openChange?.(nextOpen);\n this.#render();\n };\n\n #render = () => {\n if (!this.#rootElement) {\n return;\n }\n\n render(\n <SidebarWidgetView\n container={this.#container}\n side={this.side}\n title={this.title}\n triggerLabel={this.triggerLabel}\n open={this.isOpen}\n button={this.button}\n hideTrigger={this.hideTrigger}\n panelWidthPx={this.widthPx}\n onOpenChange={this.#handleOpenChange}\n />,\n this.#rootElement\n );\n };\n\n #setDisplayProps(props: Partial<SidebarWidgetProps>): void {\n if (props.icon !== undefined) {\n this.triggerIcon = props.icon;\n }\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if ('title' in props) {\n this.title = props.title;\n }\n if (props.side !== undefined) {\n this.side = props.side;\n }\n if (props.widthPx !== undefined) {\n this.widthPx = normalizeSidebarWidthPx(props.widthPx);\n }\n if (props.triggerLabel !== undefined) {\n this.triggerLabel = props.triggerLabel;\n }\n if (props.triggerIcon !== undefined) {\n this.triggerIcon = props.triggerIcon;\n }\n if (props.hideTrigger !== undefined) {\n this.hideTrigger = props.hideTrigger;\n }\n if (props.button !== undefined) {\n this.button = props.button;\n }\n }\n\n #setContainerProps(props: Partial<SidebarWidgetProps>): void {\n if (props.container !== undefined) {\n this.#container = props.container;\n } else if (props.panel !== undefined) {\n this.#container = asContainer(props.panel);\n }\n if (props.onOpenChange !== undefined) {\n this.#openChange = props.onOpenChange;\n }\n }\n\n #setOpenProps(props: Partial<SidebarWidgetProps>): void {\n this.#isControlled = props.open !== undefined;\n if (props.open !== undefined) {\n this.isOpen = props.open;\n this.#hasOpenStateInitialized = true;\n return;\n }\n if (!this.#hasOpenStateInitialized && props.defaultOpen !== undefined) {\n this.isOpen = props.defaultOpen;\n this.#hasOpenStateInitialized = true;\n }\n }\n\n #resolveOverlayParent(rootElement: HTMLElement): HTMLElement | null {\n const explicitContainer = this.props._container;\n if (explicitContainer && typeof explicitContainer !== 'string') {\n return explicitContainer;\n }\n return rootElement.parentElement?.parentElement;\n }\n}\n\nfunction asContainer(panel?: WidgetPanel): WidgetContainer {\n if (panel === undefined) {\n return {\n kind: 'accordeon',\n props: {\n panels: []\n }\n };\n }\n return asPanelContainer(panel);\n}\n\n/**\n * Returns the directional chevron shown in the built-in sidebar handle.\n */\nfunction getSidebarHandleChevron(side: 'left' | 'right', open: boolean): string {\n if (side === 'left') {\n return open ? '\u2039' : '\u203A';\n }\n\n return open ? '\u203A' : '\u2039';\n}\n\nconst SIDEBAR_TRIGGER_STYLE: JSX.CSSProperties = {\n border: '1px solid var(--menu-border, rgba(148, 163, 184, 0.35))',\n borderRadius: '6px',\n background: 'var(--menu-background, #fff)',\n color: 'var(--button-text, rgb(24, 24, 26))',\n fontSize: '12px',\n lineHeight: '1.1',\n padding: '8px 10px',\n cursor: 'pointer'\n};\n\nconst SIDEBAR_PANEL_WRAPPER_STYLE: JSX.CSSProperties = {\n position: 'absolute',\n inset: '0',\n pointerEvents: 'none',\n zIndex: 31\n};\n\nconst SIDEBAR_SHELL_STYLE = (\n side: 'left' | 'right',\n panelWidthPx: number,\n panelWidthWithHandlePx: number,\n open: boolean\n): JSX.CSSProperties => ({\n position: 'absolute',\n top: '0',\n bottom: '0',\n [side]: '0',\n width: `${panelWidthWithHandlePx}px`,\n display: 'flex',\n flexDirection: side === 'left' ? 'row-reverse' : 'row',\n alignItems: 'flex-start',\n pointerEvents: 'auto',\n transform: open\n ? 'translateX(0px)'\n : `translateX(${side === 'left' ? -panelWidthPx : panelWidthPx}px)`,\n transition: `transform ${SIDEBAR_TRANSITION_MS}ms cubic-bezier(0.22, 1, 0.36, 1)`,\n willChange: 'transform',\n gap: `${SIDEBAR_HANDLE_GAP_PX}px`\n});\n\nconst SIDEBAR_HANDLE_WRAPPER_STYLE: JSX.CSSProperties = {\n width: `${SIDEBAR_HANDLE_WIDTH_PX}px`,\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'center',\n pointerEvents: 'auto'\n};\n\nconst SIDEBAR_HANDLE_BUTTON_WRAPPER_STYLE: JSX.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n};\n\nconst SIDEBAR_HANDLE_BUTTON_STYLE: JSX.CSSProperties = {\n width: `${SIDEBAR_HANDLE_WIDTH_PX}px`,\n minWidth: `${SIDEBAR_HANDLE_WIDTH_PX}px`,\n height: '40px',\n border: 'var(--button-inner-stroke, 1px solid rgba(148, 163, 184, 0.35))',\n borderRadius: '2px',\n background: 'var(--button-background, #fff)',\n backdropFilter: 'var(--button-backdrop-filter, unset)',\n color: 'var(--button-text, rgb(24, 24, 26))',\n boxShadow: 'var(--button-shadow, 0px 0px 8px 0px rgba(0, 0, 0, 0.25))',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n pointerEvents: 'auto',\n padding: '0'\n};\n\nconst SIDEBAR_HANDLE_CHEVRON_STYLE: JSX.CSSProperties = {\n display: 'block',\n fontSize: '22px',\n fontWeight: 700,\n lineHeight: '1',\n transform: 'translateY(-1px)',\n color: 'var(--button-icon-idle, #616166)',\n transition: `transform ${SIDEBAR_TRANSITION_MS}ms cubic-bezier(0.22, 1, 0.36, 1)`\n};\n\nconst SIDEBAR_PANEL_STYLE = (\n side: 'left' | 'right',\n panelWidthPx: number,\n open: boolean\n): JSX.CSSProperties => ({\n pointerEvents: 'auto',\n width: `${panelWidthPx}px`,\n maxWidth: `min(84vw, ${panelWidthPx}px)`,\n minWidth: `${Math.min(panelWidthPx, 260)}px`,\n height: '100%',\n borderLeft:\n side === 'right' ? '1px solid var(--menu-border, rgba(148, 163, 184, 0.35))' : undefined,\n borderRight:\n side === 'left' ? '1px solid var(--menu-border, rgba(148, 163, 184, 0.35))' : undefined,\n background: 'var(--menu-background, #fff)',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n boxShadow: 'var(--menu-shadow, -8px 0 25px rgba(0, 0, 0, 0.22))',\n display: 'flex',\n flexDirection: 'column',\n opacity: open ? 1 : 0.98\n});\n\nconst SIDEBAR_HEADER_STYLE: JSX.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n gap: '10px',\n padding: '10px 12px',\n borderBottom: 'var(--menu-divider, var(--menu-border, 1px solid rgba(148, 163, 184, 0.25)))',\n background: 'var(--menu-weak-background, var(--button-background, var(--menu-background, #fff)))',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n fontSize: '13px',\n fontWeight: 700\n};\n\nconst SIDEBAR_CONTENT_STYLE: JSX.CSSProperties = {\n flex: 1,\n overflow: 'auto',\n padding: '10px'\n};\n", "/** @jsxImportSource preact */\nimport {Widget} from '@deck.gl/core';\nimport {render} from 'preact';\n\nimport type {WidgetPlacement, WidgetProps} from '@deck.gl/core';\nimport type {ComponentChild, JSX} from 'preact';\n\nexport type ToolbarWidgetActionItem = {\n kind: 'action';\n id: string;\n label: string;\n icon?: ComponentChild;\n title?: string;\n disabled?: boolean;\n active?: boolean;\n onClick?: () => void;\n};\n\nexport type ToolbarWidgetToggleOption = {\n id: string;\n label: string;\n icon?: ComponentChild;\n title?: string;\n disabled?: boolean;\n};\n\nexport type ToolbarWidgetToggleGroupItem = {\n kind: 'toggle-group';\n id: string;\n label?: string;\n title?: string;\n disabled?: boolean;\n selectedId?: string | null;\n options: ToolbarWidgetToggleOption[];\n onSelect?: (optionId: string) => void;\n};\n\nexport type ToolbarWidgetBadgeItem = {\n kind: 'badge';\n id: string;\n label: string;\n title?: string;\n};\n\nexport type ToolbarWidgetItem =\n | ToolbarWidgetActionItem\n | ToolbarWidgetToggleGroupItem\n | ToolbarWidgetBadgeItem;\n\nexport type ToolbarWidgetProps = WidgetProps & {\n placement?: WidgetPlacement;\n items?: ToolbarWidgetItem[];\n};\n\nconst ROOT_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'absolute',\n display: 'flex',\n pointerEvents: 'auto',\n userSelect: 'none',\n zIndex: '99'\n};\n\nconst TOOLBAR_STYLE: JSX.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n flexWrap: 'wrap',\n padding: '8px 10px',\n borderRadius: '999px',\n background: 'rgba(36, 40, 41, 0.88)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.25)'\n};\n\nconst ITEM_GROUP_STYLE: JSX.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n minWidth: '0'\n};\n\nconst BUTTON_STYLE: JSX.CSSProperties = {\n appearance: 'none',\n border: 'none',\n borderRadius: '999px',\n background: 'transparent',\n color: '#f0f0f0',\n minHeight: '30px',\n padding: '0 10px',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n cursor: 'pointer',\n fontSize: '11px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontWeight: '500',\n transition: 'background 0.15s ease, color 0.15s ease, box-shadow 0.15s ease',\n whiteSpace: 'nowrap'\n};\n\nconst ACTIVE_BUTTON_STYLE: JSX.CSSProperties = {\n background: '#0071e3',\n color: '#ffffff',\n boxShadow: '0 0 0 2px rgba(255, 255, 255, 0.35)'\n};\n\nconst DISABLED_BUTTON_STYLE: JSX.CSSProperties = {\n opacity: 0.45,\n cursor: 'default'\n};\n\nconst GROUP_LABEL_STYLE: JSX.CSSProperties = {\n color: 'rgba(255, 255, 255, 0.65)',\n fontSize: '11px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n whiteSpace: 'nowrap'\n};\n\nconst BADGE_STYLE: JSX.CSSProperties = {\n padding: '0 8px',\n minHeight: '28px',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '999px',\n background: 'rgba(255, 255, 255, 0.12)',\n color: 'rgba(255, 255, 255, 0.88)',\n fontSize: '11px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n whiteSpace: 'nowrap'\n};\n\nfunction stopToolbarEventPropagation(event: Event) {\n event.stopPropagation();\n if (\n typeof (event as {stopImmediatePropagation?: () => void}).stopImmediatePropagation ===\n 'function'\n ) {\n (event as {stopImmediatePropagation?: () => void}).stopImmediatePropagation?.();\n }\n}\n\nfunction ToolbarWidgetView({items}: {items: ToolbarWidgetItem[]}) {\n return (\n <div\n style={TOOLBAR_STYLE}\n onPointerDown={stopToolbarEventPropagation}\n onPointerMove={stopToolbarEventPropagation}\n onPointerUp={stopToolbarEventPropagation}\n onMouseDown={stopToolbarEventPropagation}\n onMouseMove={stopToolbarEventPropagation}\n onMouseUp={stopToolbarEventPropagation}\n onTouchStart={stopToolbarEventPropagation}\n onTouchMove={stopToolbarEventPropagation}\n onTouchEnd={stopToolbarEventPropagation}\n onClick={stopToolbarEventPropagation}\n onDblClick={stopToolbarEventPropagation}\n onContextMenu={stopToolbarEventPropagation}\n onWheel={stopToolbarEventPropagation}\n >\n {items.map((item) => renderToolbarItem(item))}\n </div>\n );\n}\n\nfunction renderToolbarItem(item: ToolbarWidgetItem): JSX.Element {\n if (item.kind === 'badge') {\n return (\n <div key={item.id} title={item.title} style={BADGE_STYLE} data-toolbar-item-kind=\"badge\">\n {item.label}\n </div>\n );\n }\n\n if (item.kind === 'action') {\n const disabled = item.disabled ?? false;\n const buttonStyle: JSX.CSSProperties = {\n ...BUTTON_STYLE,\n ...(item.active ? ACTIVE_BUTTON_STYLE : {}),\n ...(disabled ? DISABLED_BUTTON_STYLE : {})\n };\n\n return (\n <button\n key={item.id}\n type=\"button\"\n title={item.title ?? item.label}\n aria-label={item.title ?? item.label}\n aria-pressed={item.active ? 'true' : 'false'}\n disabled={disabled}\n style={buttonStyle}\n data-toolbar-item-kind=\"action\"\n data-toolbar-item-id={item.id}\n onClick={() => {\n if (!disabled) {\n item.onClick?.();\n }\n }}\n >\n {item.icon}\n <span>{item.label}</span>\n </button>\n );\n }\n\n const groupDisabled = item.disabled ?? false;\n return (\n <div key={item.id} style={ITEM_GROUP_STYLE} data-toolbar-item-kind=\"toggle-group\">\n {item.label ? <span style={GROUP_LABEL_STYLE}>{item.label}</span> : null}\n {item.options.map((option) => {\n const disabled = groupDisabled || option.disabled;\n const active = item.selectedId === option.id;\n const buttonStyle: JSX.CSSProperties = {\n ...BUTTON_STYLE,\n ...(active ? ACTIVE_BUTTON_STYLE : {}),\n ...(disabled ? DISABLED_BUTTON_STYLE : {})\n };\n\n return (\n <button\n key={option.id}\n type=\"button\"\n title={option.title ?? option.label ?? item.title}\n aria-label={option.title ?? option.label ?? item.title}\n aria-pressed={active ? 'true' : 'false'}\n disabled={disabled}\n style={buttonStyle}\n data-toolbar-group-id={item.id}\n data-toolbar-option-id={option.id}\n onClick={() => {\n if (!disabled) {\n item.onSelect?.(option.id);\n }\n }}\n >\n {option.icon}\n <span>{option.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\nexport class ToolbarWidget extends Widget<ToolbarWidgetProps> {\n static defaultProps: Required<ToolbarWidgetProps> = {\n ...Widget.defaultProps,\n id: 'toolbar-widget',\n placement: 'top-right',\n items: []\n };\n\n className = 'deck-widget-toolbar';\n placement: WidgetPlacement = ToolbarWidget.defaultProps.placement;\n #rootElement: HTMLElement | null = null;\n\n constructor(props: ToolbarWidgetProps = {}) {\n super({...ToolbarWidget.defaultProps, ...props});\n this.setProps(this.props);\n }\n\n override setProps(props: Partial<ToolbarWidgetProps>): void {\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n super.setProps(props);\n this.#render();\n }\n\n override onRemove(): void {\n if (this.#rootElement) {\n render(null, this.#rootElement);\n }\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n this.#rootElement = rootElement;\n const className = ['deck-widget', this.className, this.props.className]\n .filter(Boolean)\n .join(' ');\n rootElement.className = className;\n Object.assign(rootElement.style, ROOT_STYLE, this.props.style ?? {});\n this.#render();\n }\n\n #render() {\n if (!this.#rootElement) {\n return;\n }\n\n render(<ToolbarWidgetView items={this.props.items ?? []} />, this.#rootElement);\n }\n}\n", "/** @jsxImportSource preact */\nimport {useEffect, useRef, useState} from 'preact/hooks';\n\nimport {loadTextEditorMonacoRuntime} from './text-editor-panel-monaco-runtime';\nimport {useEffectiveWidgetPanelThemeMode} from './widget-containers';\n\nimport type {WidgetPanel, WidgetPanelTheme} from './widget-containers';\nimport type {editor as EditorNamespace, IDisposable} from 'monaco-editor';\nimport type {JSX} from 'preact';\n\n/** Text-editor widget panel configuration. */\nexport type TextEditorPanelProps = {\n /** Stable panel id used by parent containers. */\n id: string;\n /** Visible heading text for the panel. */\n title: string;\n /** Controlled editor text. If supplied, callers own the current value. */\n value?: string;\n /** Uncontrolled initial editor text used when `value` is not supplied. */\n defaultValue?: string;\n /** Called when user edits the current document text. */\n onValueChange?: (nextValue: string) => void;\n /** Monaco language mode used by the document model. */\n language?: 'json' | 'plaintext';\n /** JSON schema used to drive diagnostics and completion in JSON mode. */\n jsonSchema?: Record<string, unknown>;\n /** If true, prevent editing while still showing Monaco viewer chrome. */\n readOnly?: boolean;\n /** Optional placeholder shown while the document is empty. */\n placeholder?: string;\n /** Optional class name applied to the outer panel content wrapper. */\n className?: string;\n /** Optional theme override applied to this panel subtree. */\n theme?: WidgetPanelTheme;\n /** Monaco theme id used when the effective panel theme resolves to light mode. */\n lightMonacoTheme?: string;\n /** Monaco theme id used when the effective panel theme resolves to dark mode. */\n darkMonacoTheme?: string;\n};\n\n/**\n * A widget panel that lazily loads Monaco and edits one text document.\n */\nexport class TextEditorPanel implements WidgetPanel {\n id: string;\n title: string;\n theme?: WidgetPanelTheme;\n content: JSX.Element;\n\n constructor(props: TextEditorPanelProps) {\n this.id = props.id;\n this.title = props.title;\n this.theme = props.theme ?? 'inherit';\n this.content = <TextEditorPanelContent {...props} />;\n }\n}\n\n/**\n * Internal runtime state for the asynchronous Monaco loader.\n */\ntype TextEditorLoadState =\n | {status: 'loading'}\n | {status: 'ready'; runtime: Awaited<ReturnType<typeof loadTextEditorMonacoRuntime>>}\n | {status: 'error'; error: Error};\n\n/**\n * Renders the Monaco-backed editor body used by the widget panel.\n */\nfunction TextEditorPanelContent({\n id,\n value,\n defaultValue = '',\n onValueChange,\n language = 'json',\n jsonSchema,\n readOnly = false,\n placeholder,\n className,\n lightMonacoTheme = 'vs',\n darkMonacoTheme = 'vs-dark'\n}: TextEditorPanelProps) {\n const hostElementRef = useRef<HTMLDivElement | null>(null);\n const editorRef = useRef<EditorNamespace.IStandaloneCodeEditor | null>(null);\n const modelRef = useRef<EditorNamespace.ITextModel | null>(null);\n const modelChangeSubscriptionRef = useRef<IDisposable | null>(null);\n const isApplyingExternalValueRef = useRef(false);\n const isControlledRef = useRef(value !== undefined);\n const resolvedValueRef = useRef(resolveInitialEditorValue(value, defaultValue));\n const languageRef = useRef<TextEditorPanelProps['language']>(language);\n const onValueChangeRef = useRef(onValueChange);\n const [loadState, setLoadState] = useState<TextEditorLoadState>({status: 'loading'});\n const [displayValue, setDisplayValue] = useState(() =>\n resolveInitialEditorValue(value, defaultValue)\n );\n const isControlled = value !== undefined;\n const resolvedValue = isControlled ? value : displayValue;\n const runtime = loadState.status === 'ready' ? loadState.runtime : undefined;\n const themeMode = useEffectiveWidgetPanelThemeMode();\n\n useEffect(() => {\n isControlledRef.current = isControlled;\n resolvedValueRef.current = resolvedValue;\n languageRef.current = language;\n onValueChangeRef.current = onValueChange;\n }, [isControlled, language, onValueChange, resolvedValue]);\n\n useEffect(() => {\n let isDisposed = false;\n\n loadTextEditorMonacoRuntime()\n .then((loadedRuntime) => {\n if (isDisposed) {\n return;\n }\n setLoadState({status: 'ready', runtime: loadedRuntime});\n })\n .catch((error) => {\n if (isDisposed) {\n return;\n }\n setLoadState({\n status: 'error',\n error: error instanceof Error ? error : new Error(String(error))\n });\n });\n\n return () => {\n isDisposed = true;\n };\n }, []);\n\n useEffect(() => {\n if (!runtime || !hostElementRef.current || editorRef.current) {\n return undefined;\n }\n\n const {monaco} = runtime;\n const modelUri = monaco.Uri.parse(getTextEditorModelUri(id));\n const existingModel = monaco.editor.getModel(modelUri);\n const model =\n existingModel ??\n monaco.editor.createModel(\n resolvedValueRef.current,\n getTextEditorLanguageId(languageRef.current),\n modelUri\n );\n\n if (existingModel && existingModel.getValue() !== resolvedValueRef.current) {\n model.setValue(resolvedValueRef.current);\n }\n\n modelRef.current = model;\n monaco.editor.setTheme(getMonacoThemeId(themeMode, lightMonacoTheme, darkMonacoTheme));\n editorRef.current = monaco.editor.create(hostElementRef.current, {\n ...TEXT_EDITOR_MONACO_OPTIONS,\n model,\n readOnly\n });\n setDisplayValue(model.getValue());\n\n modelChangeSubscriptionRef.current = model.onDidChangeContent(() => {\n if (isApplyingExternalValueRef.current) {\n return;\n }\n\n const nextValue = model.getValue();\n setDisplayValue(nextValue);\n onValueChangeRef.current?.(nextValue);\n if (isControlledRef.current) {\n return;\n }\n });\n\n return () => {\n modelChangeSubscriptionRef.current?.dispose();\n modelChangeSubscriptionRef.current = null;\n editorRef.current?.dispose();\n editorRef.current = null;\n runtime.clearJsonSchema(model.uri.toString());\n model.dispose();\n modelRef.current = null;\n };\n }, [darkMonacoTheme, id, lightMonacoTheme, runtime, themeMode]);\n\n useEffect(() => {\n if (!runtime) {\n return;\n }\n\n runtime.monaco.editor.setTheme(getMonacoThemeId(themeMode, lightMonacoTheme, darkMonacoTheme));\n }, [darkMonacoTheme, lightMonacoTheme, runtime, themeMode]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) {\n return;\n }\n\n editor.updateOptions({\n ...TEXT_EDITOR_MONACO_OPTIONS,\n readOnly\n });\n }, [readOnly]);\n\n useEffect(() => {\n const model = modelRef.current;\n if (!model || !runtime) {\n return undefined;\n }\n\n runtime.monaco.editor.setModelLanguage(model, getTextEditorLanguageId(language));\n return undefined;\n }, [language, runtime]);\n\n useEffect(() => {\n const model = modelRef.current;\n if (!model || !runtime) {\n return () => {};\n }\n\n const modelUri = model.uri.toString();\n if (language === 'json') {\n runtime.configureJsonSchema(modelUri, jsonSchema);\n return () => {\n runtime.clearJsonSchema(modelUri);\n };\n }\n\n runtime.clearJsonSchema(modelUri);\n return () => {};\n }, [jsonSchema, language, runtime]);\n\n useEffect(() => {\n const model = modelRef.current;\n if (!model) {\n return;\n }\n\n if (model.getValue() === resolvedValue) {\n setDisplayValue(resolvedValue);\n return;\n }\n\n isApplyingExternalValueRef.current = true;\n model.setValue(resolvedValue);\n isApplyingExternalValueRef.current = false;\n setDisplayValue(resolvedValue);\n }, [resolvedValue]);\n\n return (\n <div className={className} style={TEXT_EDITOR_PANEL_STYLE} data-text-editor-root=\"\">\n {loadState.status === 'loading' ? (\n <div style={TEXT_EDITOR_STATUS_STYLE} data-text-editor-loading=\"\">\n Loading editor\u2026\n </div>\n ) : null}\n {loadState.status === 'error' ? (\n <div style={TEXT_EDITOR_ERROR_STYLE} data-text-editor-error=\"\">\n Failed to load editor: {loadState.error.message}\n </div>\n ) : null}\n {loadState.status === 'ready' ? (\n <div style={TEXT_EDITOR_SURFACE_STYLE}>\n <div ref={hostElementRef} style={TEXT_EDITOR_HOST_STYLE} data-text-editor-host=\"\" />\n {placeholder && displayValue.length === 0 ? (\n <div style={TEXT_EDITOR_PLACEHOLDER_STYLE} data-text-editor-placeholder=\"\">\n {placeholder}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\n/**\n * Returns the initial editor value based on controlled or uncontrolled props.\n */\nfunction resolveInitialEditorValue(value: string | undefined, defaultValue: string): string {\n return value ?? defaultValue;\n}\n\n/**\n * Returns the stable in-memory Monaco model URI for one panel id.\n */\nfunction getTextEditorModelUri(id: string): string {\n return `inmemory://deck-gl-community/widgets/${encodeURIComponent(id)}`;\n}\n\n/**\n * Maps public panel language names onto Monaco language ids.\n */\nfunction getTextEditorLanguageId(language: TextEditorPanelProps['language']): string {\n if (language === 'plaintext') {\n return 'plaintext';\n }\n\n return 'json';\n}\n\n/**\n * Maps the effective widget panel theme mode onto a Monaco editor theme id.\n */\nfunction getMonacoThemeId(\n themeMode: 'light' | 'dark',\n lightMonacoTheme: string,\n darkMonacoTheme: string\n): string {\n return themeMode === 'dark' ? darkMonacoTheme : lightMonacoTheme;\n}\n\nconst TEXT_EDITOR_MONACO_OPTIONS: EditorNamespace.IStandaloneEditorConstructionOptions = {\n automaticLayout: true,\n minimap: {enabled: false},\n scrollbar: {\n verticalScrollbarSize: 10,\n horizontalScrollbarSize: 10\n },\n fontSize: 12,\n lineHeight: 18,\n wordWrap: 'on',\n lineNumbers: 'on',\n glyphMargin: false,\n folding: false,\n scrollBeyondLastLine: false,\n tabSize: 2\n};\n\nconst TEXT_EDITOR_PANEL_STYLE: JSX.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n minHeight: '280px'\n};\n\nconst TEXT_EDITOR_SURFACE_STYLE: JSX.CSSProperties = {\n position: 'relative',\n minHeight: '280px',\n border: '1px solid var(--menu-border, rgba(148, 163, 184, 0.35))',\n borderRadius: 'var(--button-corner-radius, 8px)',\n overflow: 'hidden',\n background: 'var(--menu-background, #fff)'\n};\n\nconst TEXT_EDITOR_HOST_STYLE: JSX.CSSProperties = {\n width: '100%',\n minHeight: '280px'\n};\n\nconst TEXT_EDITOR_STATUS_STYLE: JSX.CSSProperties = {\n ...TEXT_EDITOR_SURFACE_STYLE,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--menu-text, rgb(24, 24, 26))',\n fontSize: '12px',\n padding: '16px'\n};\n\nconst TEXT_EDITOR_ERROR_STYLE: JSX.CSSProperties = {\n ...TEXT_EDITOR_STATUS_STYLE,\n color: 'rgb(185, 28, 28)'\n};\n\nconst TEXT_EDITOR_PLACEHOLDER_STYLE: JSX.CSSProperties = {\n position: 'absolute',\n top: '12px',\n left: '14px',\n right: '14px',\n color: 'var(--button-icon-idle, rgb(100, 116, 139))',\n fontSize: '12px',\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n};\n", "import type * as MonacoNamespace from 'monaco-editor';\n\n/**\n * Shared Monaco runtime services used by the text-editor widget panel.\n */\nexport type TextEditorMonacoRuntime = {\n /** Monaco module namespace used for model and editor creation. */\n monaco: typeof MonacoNamespace;\n /** Registers or replaces the JSON schema associated with one model URI. */\n configureJsonSchema: (modelUri: string, schema?: Record<string, unknown>) => void;\n /** Removes the JSON schema associated with one model URI. */\n clearJsonSchema: (modelUri: string) => void;\n};\n\nlet monacoRuntimePromise: Promise<TextEditorMonacoRuntime> | undefined;\nconst jsonSchemasByModelUri = new Map<string, Record<string, unknown>>();\n\n/**\n * Lazily loads the Monaco runtime and returns the shared editor services singleton.\n */\nexport async function loadTextEditorMonacoRuntime(): Promise<TextEditorMonacoRuntime> {\n monacoRuntimePromise ??= createTextEditorMonacoRuntime();\n return monacoRuntimePromise;\n}\n\n/**\n * Creates the Monaco runtime singleton used by text-editor widget panels.\n */\nasync function createTextEditorMonacoRuntime(): Promise<TextEditorMonacoRuntime> {\n configureMonacoEnvironment();\n\n const [monaco] = await Promise.all([\n import('monaco-editor'),\n import('monaco-editor/esm/vs/language/json/monaco.contribution')\n ]);\n\n return {\n monaco,\n configureJsonSchema: (modelUri, schema) => {\n if (schema === undefined) {\n jsonSchemasByModelUri.delete(modelUri);\n } else {\n jsonSchemasByModelUri.set(modelUri, schema);\n }\n\n applyJsonDiagnostics(monaco);\n },\n clearJsonSchema: (modelUri) => {\n jsonSchemasByModelUri.delete(modelUri);\n applyJsonDiagnostics(monaco);\n }\n };\n}\n\n/**\n * Installs Monaco worker resolution into the current browser-like runtime once.\n */\nfunction configureMonacoEnvironment(): void {\n const runtimeTarget = globalThis as typeof globalThis & {\n MonacoEnvironment?: {\n getWorker: (_workerId: string, label: string) => Worker;\n };\n };\n\n if (runtimeTarget.MonacoEnvironment) {\n return;\n }\n\n runtimeTarget.MonacoEnvironment = {\n getWorker: (_workerId, label) => {\n if (label === 'json') {\n return new Worker(\n new URL('monaco-editor/esm/vs/language/json/json.worker.js', import.meta.url),\n {type: 'module'}\n );\n }\n return new Worker(new URL('monaco-editor/esm/vs/editor/editor.worker.js', import.meta.url), {\n type: 'module'\n });\n }\n };\n}\n\n/**\n * Recomputes Monaco JSON diagnostics from the active schema registry.\n */\nfunction applyJsonDiagnostics(monaco: typeof MonacoNamespace): void {\n monaco.languages.json.jsonDefaults.setDiagnosticsOptions({\n validate: true,\n enableSchemaRequest: false,\n schemas: [...jsonSchemasByModelUri.entries()].map(([modelUri, schema]) => ({\n uri: `${modelUri}#schema`,\n fileMatch: [modelUri],\n schema\n }))\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_preact", "_a", "_jsx", "_jsx", "_a", "import_preact", "import_core", "WRAPPER_STYLE", "stopEventPropagation", "_jsxs", "_Fragment", "_jsx", "_a", "import_preact", "import_core", "_a", "_jsx", "_jsx", "_a", "Supercluster", "_a", "_jsx", "import_core", "import_preact", "_jsx", "_jsxs", "import_core", "import_preact", "import_hooks", "import_hooks", "defaultValue", "_a", "import_hooks", "_a", "_jsxs", "_jsx", "_a", "_jsxs", "_jsx", "_jsx", "stopPropagation", "_jsxs", "_jsx", "_a", "_rootElement", "import_core", "import_preact", "import_hooks", "ROOT_STYLE", "WRAPPER_STYLE", "INPUT_STYLE", "_rootElement", "_jsx", "_jsxs", "stopEventPropagation", "_a", "normalizedQuery", "import_core", "import_preact", "_jsx", "_a", "import_core", "import_preact", "_jsx", "_a", "import_core", "import_preact", "_jsx", "_jsxs", "_rootElement", "import_core", "import_preact", "WRAPPER_STYLE", "ZOOM_BUTTON_STYLE", "SLIDER_CONTAINER_STYLE", "VERTICAL_SLIDER_STYLE", "cloneViewState", "hasViewManager", "stopEventPropagation", "clamp", "_jsxs", "_jsx", "_a", "import_preact", "import_hooks", "_jsx", "_jsxs", "_a", "import_core", "import_preact", "_jsx", "_jsxs", "_a", "_rootElement", "import_core", "import_preact", "asContainer", "_jsx", "_jsxs", "_a", "_container", "_rootElement", "_render", "import_core", "import_preact", "_a", "_jsx", "_a", "_rootElement", "_jsxs", "_Fragment", "import_core", "import_preact", "asContainer", "stopPropagation", "_jsxs", "_jsx", "_Fragment", "_a", "_setOpenProps", "_hasOpenStateInitialized", "_container", "_isControlled", "_openChange", "_rootElement", "_handleOpenChange", "_render", "setOpenProps_fn", "import_hooks", "_jsx", "_jsxs", "import_core", "import_preact", "resolveTriggerIcon", "_jsx", "_jsxs", "_a", "asContainer", "_setDisplayProps", "_setContainerProps", "_setOpenProps", "_hasOpenStateInitialized", "_container", "_isControlled", "_openChange", "_rootElement", "_handleOpenChange", "_render", "setDisplayProps_fn", "setContainerProps_fn", "setOpenProps_fn", "import_core", "import_preact", "ROOT_STYLE", "_a", "_jsx", "_jsxs", "_render", "_rootElement", "import_hooks", "_jsx", "_a", "_jsxs"]
|
|
7
7
|
}
|