@deck.gl-community/widgets 9.2.5 → 9.3.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/src/index.ts
CHANGED
|
@@ -2,17 +2,114 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
-
export {PanWidget} from './widgets/pan-widget';
|
|
6
|
-
export type {PanWidgetProps} from './widgets/pan-widget';
|
|
5
|
+
export {PanWidget} from './graph-widgets/pan-widget';
|
|
6
|
+
export type {PanWidgetProps} from './graph-widgets/pan-widget';
|
|
7
7
|
|
|
8
|
-
export {ZoomRangeWidget} from './widgets/zoom-range-widget';
|
|
9
|
-
export type {ZoomRangeWidgetProps} from './widgets/zoom-range-widget';
|
|
8
|
+
export {ZoomRangeWidget} from './graph-widgets/zoom-range-widget';
|
|
9
|
+
export type {ZoomRangeWidgetProps} from './graph-widgets/zoom-range-widget';
|
|
10
10
|
|
|
11
|
-
export {HtmlOverlayWidget} from './widgets/html-overlay-widget';
|
|
12
|
-
export type {HtmlOverlayWidgetProps} from './widgets/html-overlay-widget';
|
|
13
|
-
export {HtmlOverlayItem} from './widgets/html-overlay-item';
|
|
14
|
-
export type {HtmlOverlayItemProps} from './widgets/html-overlay-item';
|
|
15
|
-
export {HtmlClusterWidget} from './widgets/html-cluster-widget';
|
|
16
|
-
export type {HtmlClusterWidgetProps} from './widgets/html-cluster-widget';
|
|
17
|
-
export {HtmlTooltipWidget} from './widgets/html-tooltip-widget';
|
|
18
|
-
export type {HtmlTooltipWidgetProps} from './widgets/html-tooltip-widget';
|
|
11
|
+
export {HtmlOverlayWidget} from './html-overlay-widgets/html-overlay-widget';
|
|
12
|
+
export type {HtmlOverlayWidgetProps} from './html-overlay-widgets/html-overlay-widget';
|
|
13
|
+
export {HtmlOverlayItem} from './html-overlay-widgets/html-overlay-item';
|
|
14
|
+
export type {HtmlOverlayItemProps} from './html-overlay-widgets/html-overlay-item';
|
|
15
|
+
export {HtmlClusterWidget} from './html-overlay-widgets/html-cluster-widget';
|
|
16
|
+
export type {HtmlClusterWidgetProps} from './html-overlay-widgets/html-cluster-widget';
|
|
17
|
+
export {HtmlTooltipWidget} from './html-overlay-widgets/html-tooltip-widget';
|
|
18
|
+
export type {HtmlTooltipWidgetProps} from './html-overlay-widgets/html-tooltip-widget';
|
|
19
|
+
|
|
20
|
+
export {HeapMemoryWidget} from './widgets/heap-memory-widget';
|
|
21
|
+
export {
|
|
22
|
+
SettingsWidget,
|
|
23
|
+
type SettingsWidgetProps,
|
|
24
|
+
type SettingsWidgetSchema,
|
|
25
|
+
type SettingsWidgetSectionDescriptor,
|
|
26
|
+
type SettingsWidgetSettingDescriptor,
|
|
27
|
+
type SettingsWidgetState
|
|
28
|
+
} from './widgets/settings-widget';
|
|
29
|
+
export {
|
|
30
|
+
OmniBoxWidget,
|
|
31
|
+
type OmniBoxOption,
|
|
32
|
+
type OmniBoxOptionProvider,
|
|
33
|
+
type OmniBoxRenderOptionArgs,
|
|
34
|
+
type OmniBoxWidgetProps
|
|
35
|
+
} from './widgets/omni-box-widget';
|
|
36
|
+
export {ResetViewWidget, type ResetViewWidgetProps} from './widget-panels/reset-view-widget';
|
|
37
|
+
export {
|
|
38
|
+
TimeMeasureWidget,
|
|
39
|
+
type TimeMeasureRange,
|
|
40
|
+
type TimeMeasureSelectionState
|
|
41
|
+
} from './widget-panels/time-measure-widget';
|
|
42
|
+
export {ToastWidget, type ToastWidgetProps} from './widget-panels/toast-widget';
|
|
43
|
+
export {
|
|
44
|
+
toastManager,
|
|
45
|
+
type ToastEntry,
|
|
46
|
+
type ToastKind,
|
|
47
|
+
type ToastRequest
|
|
48
|
+
} from './widget-panels/toast-manager';
|
|
49
|
+
export {YZoomWidget, type YZoomWidgetProps} from './widget-panels/y-zoom-widget';
|
|
50
|
+
export {
|
|
51
|
+
AccordeonPanel,
|
|
52
|
+
AccordeonWidgetContainer,
|
|
53
|
+
ColumnWidgetContainer,
|
|
54
|
+
ColumnPanel,
|
|
55
|
+
CustomPanel,
|
|
56
|
+
MarkdownPanel,
|
|
57
|
+
TabbedPanel,
|
|
58
|
+
TabbedWidgetContainer,
|
|
59
|
+
WidgetContainerRenderer,
|
|
60
|
+
asPanelContainer,
|
|
61
|
+
type AccordeonWidgetContainerProps,
|
|
62
|
+
type AccordeonPanelProps,
|
|
63
|
+
type ColumnWidgetContainerProps,
|
|
64
|
+
type ColumnPanelProps,
|
|
65
|
+
type CustomPanelProps,
|
|
66
|
+
type MarkdownPanelProps,
|
|
67
|
+
type TabbedWidgetContainerProps,
|
|
68
|
+
type TabbedPanelProps,
|
|
69
|
+
type WidgetContainer,
|
|
70
|
+
type WidgetContainerPanelBase,
|
|
71
|
+
type WidgetPanel,
|
|
72
|
+
type WidgetPanelContainer,
|
|
73
|
+
type WidgetPanelContainerProps,
|
|
74
|
+
type WidgetPanelRecord,
|
|
75
|
+
type WidgetPanelTheme,
|
|
76
|
+
type WidgetPanelThemeMode
|
|
77
|
+
} from './widget-panels/widget-containers';
|
|
78
|
+
export {BoxWidget, type BoxWidgetProps} from './widget-panels/box-widget';
|
|
79
|
+
export {
|
|
80
|
+
FullScreenPanelWidget,
|
|
81
|
+
type FullScreenPanelWidgetProps
|
|
82
|
+
} from './widget-panels/full-screen-panel-widget';
|
|
83
|
+
export {
|
|
84
|
+
KeyboardShortcutsWidget,
|
|
85
|
+
KeyboardShortcutsPanel,
|
|
86
|
+
type KeyboardShortcutsPanelProps
|
|
87
|
+
} from './widget-panels/keyboard-shortcuts-widget';
|
|
88
|
+
export {ModalWidget, type ModalWidgetProps} from './widget-panels/modal-widget';
|
|
89
|
+
export {SettingsPanel, type SettingsPanelProps} from './widget-panels/settings-panel';
|
|
90
|
+
export {
|
|
91
|
+
SelectWidgetComponent,
|
|
92
|
+
type SelectWidgetComponentOption,
|
|
93
|
+
type SelectWidgetComponentProps
|
|
94
|
+
} from './widget-components/select-widget-component';
|
|
95
|
+
export {IconButton, makeTextIcon} from './widget-components/icon-button';
|
|
96
|
+
export {StatsPanel, type StatsPanelProps} from './widget-panels/stats-panel';
|
|
97
|
+
export {SidebarWidget, type SidebarWidgetProps} from './widget-panels/sidebar-widget';
|
|
98
|
+
export {
|
|
99
|
+
ToolbarWidget,
|
|
100
|
+
type ToolbarWidgetActionItem,
|
|
101
|
+
type ToolbarWidgetBadgeItem,
|
|
102
|
+
type ToolbarWidgetItem,
|
|
103
|
+
type ToolbarWidgetProps,
|
|
104
|
+
type ToolbarWidgetToggleGroupItem,
|
|
105
|
+
type ToolbarWidgetToggleOption
|
|
106
|
+
} from './widget-panels/toolbar-widget';
|
|
107
|
+
export {TextEditorPanel, type TextEditorPanelProps} from './widget-panels/text-editor-panel';
|
|
108
|
+
|
|
109
|
+
export {
|
|
110
|
+
type KeyboardShortcut,
|
|
111
|
+
isShortcutMatchingKeyEvent,
|
|
112
|
+
findShortcutMatchingKeyEvent,
|
|
113
|
+
DEFAULT_SHORTCUTS,
|
|
114
|
+
formatKey
|
|
115
|
+
} from './keyboard-shortcuts/keyboard-shortcuts';
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {findShortcutMatchingKeyEvent} from './keyboard-shortcuts';
|
|
2
|
+
|
|
3
|
+
import type {KeyboardShortcut} from './keyboard-shortcuts';
|
|
4
|
+
import type {EventManager, MjolnirKeyEvent} from 'mjolnir.js';
|
|
5
|
+
|
|
6
|
+
export class KeyboardShortcutsManager {
|
|
7
|
+
private shortcuts: KeyboardShortcut[] = [];
|
|
8
|
+
eventManager: EventManager;
|
|
9
|
+
|
|
10
|
+
constructor(eventManager: EventManager, shortcuts: KeyboardShortcut[]) {
|
|
11
|
+
this.eventManager = eventManager;
|
|
12
|
+
this.shortcuts = shortcuts;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
start() {
|
|
16
|
+
// console.log('Installing keyboard shortcuts:', this.shortcuts);
|
|
17
|
+
this.eventManager.on('keydown', this._handleKeyDown);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
stop() {
|
|
21
|
+
this.eventManager.off('keydown', this._handleKeyDown);
|
|
22
|
+
// console.log('Uninstalling keyboard shortcuts:', this.shortcuts);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
private _handleKeyDown = (e: MjolnirKeyEvent) => {
|
|
26
|
+
// console.log('Mjolnir key event:', e);
|
|
27
|
+
const shortcut = findShortcutMatchingKeyEvent(e.srcEvent, this.shortcuts);
|
|
28
|
+
if (shortcut) {
|
|
29
|
+
shortcut?.onKeyPress?.();
|
|
30
|
+
// e.preventDefault();
|
|
31
|
+
}
|
|
32
|
+
// console.log('Key pressed:', e.srcEvent.key, 'Matching shortcut:', shortcut?.name);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export class KeyboardShortcutsManagerDocument {
|
|
37
|
+
private shortcuts: KeyboardShortcut[] = [];
|
|
38
|
+
private _handleKeyDown = (e: KeyboardEvent) => {
|
|
39
|
+
const shortcut = findShortcutMatchingKeyEvent(e, this.shortcuts);
|
|
40
|
+
if (shortcut) {
|
|
41
|
+
shortcut?.onKeyPress?.();
|
|
42
|
+
// e.preventDefault();
|
|
43
|
+
}
|
|
44
|
+
// console.log('Key pressed:', e.key, 'Matching shortcut:', shortcut?.name);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
constructor(shortcuts: KeyboardShortcut[]) {
|
|
48
|
+
this.shortcuts = shortcuts;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
start() {
|
|
52
|
+
document.addEventListener('keydown', this._handleKeyDown);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
stop() {
|
|
56
|
+
document.removeEventListener('keydown', this._handleKeyDown);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
export type KeyboardShortcut = {
|
|
2
|
+
key: string;
|
|
3
|
+
commandKey?: boolean;
|
|
4
|
+
shiftKey?: boolean;
|
|
5
|
+
ctrlKey?: boolean;
|
|
6
|
+
dragMouse?: boolean;
|
|
7
|
+
badges?: string[];
|
|
8
|
+
displayPair?: {
|
|
9
|
+
id: string;
|
|
10
|
+
position: 'primary' | 'secondary';
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
onKeyPress?: () => void;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const DEFAULT_SHORTCUTS: KeyboardShortcut[] = [
|
|
20
|
+
{
|
|
21
|
+
key: '/',
|
|
22
|
+
commandKey: true,
|
|
23
|
+
name: 'Show Shortcuts',
|
|
24
|
+
description: 'Show keyboard shortcuts'
|
|
25
|
+
}
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const navigator = typeof window !== 'undefined' ? globalThis.navigator : {platform: ''};
|
|
29
|
+
const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
|
|
30
|
+
|
|
31
|
+
export const isShortcutMatchingKeyEvent = (e: KeyboardEvent, shortcut: KeyboardShortcut) => {
|
|
32
|
+
const isCmd = isMac ? e.metaKey : e.ctrlKey;
|
|
33
|
+
return (
|
|
34
|
+
shortcut.key.toLowerCase() === e.key.toLowerCase() &&
|
|
35
|
+
(shortcut.commandKey ? isCmd : true) &&
|
|
36
|
+
(shortcut.shiftKey ? e.shiftKey : true) &&
|
|
37
|
+
(shortcut.ctrlKey ? e.ctrlKey : true)
|
|
38
|
+
);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const findShortcutMatchingKeyEvent = (e: KeyboardEvent, shortcuts: KeyboardShortcut[]) => {
|
|
42
|
+
return shortcuts.find((shortcut) => isShortcutMatchingKeyEvent(e, shortcut));
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Pretty “keycap” glyphs for KeyboardEvent.key (browser KeyEvent)
|
|
46
|
+
export const keyCharacter: Record<string, string> = {
|
|
47
|
+
// Arrows
|
|
48
|
+
ArrowLeft: '←',
|
|
49
|
+
ArrowRight: '→',
|
|
50
|
+
ArrowUp: '↑',
|
|
51
|
+
ArrowDown: '↓',
|
|
52
|
+
|
|
53
|
+
// Navigation
|
|
54
|
+
Home: '⤒',
|
|
55
|
+
End: '⤓',
|
|
56
|
+
PageUp: '⇞',
|
|
57
|
+
PageDown: '⇟',
|
|
58
|
+
|
|
59
|
+
// Editing
|
|
60
|
+
Backspace: '⌫',
|
|
61
|
+
Delete: '⌦',
|
|
62
|
+
Insert: 'Ins',
|
|
63
|
+
|
|
64
|
+
// Whitespace / confirm / escape
|
|
65
|
+
Enter: '⏎',
|
|
66
|
+
Escape: '⎋',
|
|
67
|
+
Tab: '⇥',
|
|
68
|
+
' ': '␠', // KeyboardEvent.key for Space is literally " "
|
|
69
|
+
Spacebar: '␠', // legacy (some older browsers)
|
|
70
|
+
|
|
71
|
+
// Modifiers
|
|
72
|
+
Shift: 'Shift', // '⇧',
|
|
73
|
+
Control: '⌃',
|
|
74
|
+
Alt: '⌥',
|
|
75
|
+
Meta: '⌘', // Windows key on Win; Command on macOS
|
|
76
|
+
CapsLock: '⇪',
|
|
77
|
+
|
|
78
|
+
// System / toggles
|
|
79
|
+
ContextMenu: '≣',
|
|
80
|
+
PrintScreen: '⎙',
|
|
81
|
+
ScrollLock: '⇳',
|
|
82
|
+
Pause: '⏸',
|
|
83
|
+
NumLock: '⇭',
|
|
84
|
+
|
|
85
|
+
// Media keys (common)
|
|
86
|
+
MediaPlayPause: '⏯',
|
|
87
|
+
MediaStop: '⏹',
|
|
88
|
+
MediaTrackNext: '⏭',
|
|
89
|
+
MediaTrackPrevious: '⏮',
|
|
90
|
+
AudioVolumeMute: '🔇',
|
|
91
|
+
AudioVolumeDown: '🔉',
|
|
92
|
+
AudioVolumeUp: '🔊'
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Optional: normalize a KeyboardEvent into a human-friendly label
|
|
96
|
+
export function formatKey(key: string): string {
|
|
97
|
+
// Prefer mapping for special keys, otherwise use the raw key (letters, digits, punctuation).
|
|
98
|
+
// Make single characters uppercase for nicer display.
|
|
99
|
+
const mapped = keyCharacter[key];
|
|
100
|
+
if (mapped) return mapped;
|
|
101
|
+
|
|
102
|
+
// Function keys: "F1"..."F24"
|
|
103
|
+
if (/^F\d{1,2}$/.test(key)) return key;
|
|
104
|
+
|
|
105
|
+
// Numpad keys often come as "Numpad1", etc.
|
|
106
|
+
if (key.startsWith('Numpad')) return key.replace('Numpad', 'Num ');
|
|
107
|
+
|
|
108
|
+
// For plain characters: show as-is, but uppercase letters.
|
|
109
|
+
if (key.length === 1) return key.toUpperCase();
|
|
110
|
+
|
|
111
|
+
// Fallback for less common named keys
|
|
112
|
+
return key.toUpperCase();
|
|
113
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export type KeyboardShortcut = {
|
|
2
|
+
key: string;
|
|
3
|
+
commandKey?: boolean;
|
|
4
|
+
shiftKey?: boolean;
|
|
5
|
+
ctrlKey?: boolean;
|
|
6
|
+
dragMouse?: boolean;
|
|
7
|
+
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
onKeyPress?: () => void;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const DEFAULT_SHORTCUTS: KeyboardShortcut[] = [
|
|
14
|
+
{
|
|
15
|
+
key: '/',
|
|
16
|
+
commandKey: true,
|
|
17
|
+
name: 'Show Shortcuts',
|
|
18
|
+
description: 'Show keyboard shortcuts',
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
const navigator = typeof window !== 'undefined' ? globalThis.navigator : { platform: '' };
|
|
23
|
+
const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
|
|
24
|
+
|
|
25
|
+
export const isShortcutMatchingKeyEvent = (e: KeyboardEvent, shortcut: KeyboardShortcut) => {
|
|
26
|
+
const isCmd = isMac ? e.metaKey : e.ctrlKey;
|
|
27
|
+
return (
|
|
28
|
+
shortcut.key.toLowerCase() === e.key.toLowerCase() &&
|
|
29
|
+
(shortcut.commandKey ? isCmd : true) &&
|
|
30
|
+
(shortcut.shiftKey ? e.shiftKey : true) &&
|
|
31
|
+
(shortcut.ctrlKey ? e.ctrlKey : true)
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const findShortcutMatchingKeyEvent = (e: KeyboardEvent, shortcuts: KeyboardShortcut[]) => {
|
|
36
|
+
return shortcuts.find((shortcut) => isShortcutMatchingKeyEvent(e, shortcut));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// Pretty “keycap” glyphs for KeyboardEvent.key (browser KeyEvent)
|
|
40
|
+
export const keyCharacter: Record<string, string> = {
|
|
41
|
+
// Arrows
|
|
42
|
+
'ArrowLeft': '←',
|
|
43
|
+
'ArrowRight': '→',
|
|
44
|
+
'ArrowUp': '↑',
|
|
45
|
+
'ArrowDown': '↓',
|
|
46
|
+
|
|
47
|
+
// Navigation
|
|
48
|
+
'Home': '⤒',
|
|
49
|
+
'End': '⤓',
|
|
50
|
+
'PageUp': '⇞',
|
|
51
|
+
'PageDown': '⇟',
|
|
52
|
+
|
|
53
|
+
// Editing
|
|
54
|
+
'Backspace': '⌫',
|
|
55
|
+
'Delete': '⌦',
|
|
56
|
+
'Insert': 'Ins',
|
|
57
|
+
|
|
58
|
+
// Whitespace / confirm / escape
|
|
59
|
+
'Enter': '⏎',
|
|
60
|
+
'Escape': '⎋',
|
|
61
|
+
'Tab': '⇥',
|
|
62
|
+
' ': '␠', // KeyboardEvent.key for Space is literally " "
|
|
63
|
+
'Spacebar': '␠', // legacy (some older browsers)
|
|
64
|
+
|
|
65
|
+
// Modifiers
|
|
66
|
+
'Shift': '⇧',
|
|
67
|
+
'Control': '⌃',
|
|
68
|
+
'Alt': '⌥',
|
|
69
|
+
'Meta': '⌘', // Windows key on Win; Command on macOS
|
|
70
|
+
'CapsLock': '⇪',
|
|
71
|
+
|
|
72
|
+
// System / toggles
|
|
73
|
+
'ContextMenu': '≣',
|
|
74
|
+
'PrintScreen': '⎙',
|
|
75
|
+
'ScrollLock': '⇳',
|
|
76
|
+
'Pause': '⏸',
|
|
77
|
+
'NumLock': '⇭',
|
|
78
|
+
|
|
79
|
+
// Media keys (common)
|
|
80
|
+
'MediaPlayPause': '⏯',
|
|
81
|
+
'MediaStop': '⏹',
|
|
82
|
+
'MediaTrackNext': '⏭',
|
|
83
|
+
'MediaTrackPrevious': '⏮',
|
|
84
|
+
'AudioVolumeMute': '🔇',
|
|
85
|
+
'AudioVolumeDown': '🔉',
|
|
86
|
+
'AudioVolumeUp': '🔊',
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// Optional: normalize a KeyboardEvent into a human-friendly label
|
|
90
|
+
export function formatKey(key: string): string {
|
|
91
|
+
// Prefer mapping for special keys, otherwise use the raw key (letters, digits, punctuation).
|
|
92
|
+
// Make single characters uppercase for nicer display.
|
|
93
|
+
const mapped = keyCharacter[key];
|
|
94
|
+
if (mapped) return mapped;
|
|
95
|
+
|
|
96
|
+
// Function keys: "F1"..."F24"
|
|
97
|
+
if (/^F\d{1,2}$/.test(key)) return key;
|
|
98
|
+
|
|
99
|
+
// Numpad keys often come as "Numpad1", etc.
|
|
100
|
+
if (key.startsWith('Numpad')) return key.replace('Numpad', 'Num ');
|
|
101
|
+
|
|
102
|
+
// For plain characters: show as-is, but uppercase letters.
|
|
103
|
+
if (key.length === 1) return key.toUpperCase();
|
|
104
|
+
|
|
105
|
+
// Fallback for less common named keys
|
|
106
|
+
return key.toUpperCase();
|
|
107
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
SettingsWidgetOption,
|
|
3
|
+
SettingsWidgetSchema,
|
|
4
|
+
SettingsWidgetSectionDescriptor,
|
|
5
|
+
SettingsWidgetSettingDescriptor,
|
|
6
|
+
SettingsWidgetState,
|
|
7
|
+
SettingsWidgetValue
|
|
8
|
+
} from '../../widgets/settings-widget';
|
|
9
|
+
|
|
10
|
+
export type SettingValue = SettingsWidgetValue;
|
|
11
|
+
export type SettingDescriptor = SettingsWidgetSettingDescriptor;
|
|
12
|
+
export type SettingsSectionDescriptor = SettingsWidgetSectionDescriptor;
|
|
13
|
+
export type SettingsSchema = SettingsWidgetSchema;
|
|
14
|
+
export type SettingsState = SettingsWidgetState;
|
|
15
|
+
|
|
16
|
+
export function clamp(value: number, min?: number, max?: number): number {
|
|
17
|
+
let clamped = value;
|
|
18
|
+
if (Number.isFinite(min)) {
|
|
19
|
+
clamped = Math.max(min, clamped);
|
|
20
|
+
}
|
|
21
|
+
if (Number.isFinite(max)) {
|
|
22
|
+
clamped = Math.min(max, clamped);
|
|
23
|
+
}
|
|
24
|
+
return clamped;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function setValueAtPath(
|
|
28
|
+
settings: SettingsState,
|
|
29
|
+
path: string,
|
|
30
|
+
value: SettingValue
|
|
31
|
+
): SettingsState {
|
|
32
|
+
const segments = parsePath(path);
|
|
33
|
+
if (!segments.length) {
|
|
34
|
+
return settings;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const nextSettings: SettingsState = {...settings};
|
|
38
|
+
let writeCursor: Record<string, unknown> = nextSettings;
|
|
39
|
+
let readCursor: Record<string, unknown> = settings;
|
|
40
|
+
|
|
41
|
+
segments.forEach((segment, index) => {
|
|
42
|
+
const isLeaf = index === segments.length - 1;
|
|
43
|
+
|
|
44
|
+
if (isLeaf) {
|
|
45
|
+
writeCursor[segment] = value;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const existingChild = readCursor[segment];
|
|
50
|
+
const nextChild = isRecord(existingChild) ? {...existingChild} : {};
|
|
51
|
+
writeCursor[segment] = nextChild;
|
|
52
|
+
|
|
53
|
+
writeCursor = nextChild;
|
|
54
|
+
readCursor = isRecord(existingChild) ? existingChild : {};
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
return nextSettings;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function getSectionKey(section: SettingsSectionDescriptor, index: number): string {
|
|
61
|
+
return section.id ?? section.name ?? `section-${index}`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function buildInitialCollapsedState(
|
|
65
|
+
sections: SettingsSectionDescriptor[]
|
|
66
|
+
): Record<string, boolean> {
|
|
67
|
+
return sections.reduce<Record<string, boolean>>((result, section, index) => {
|
|
68
|
+
result[getSectionKey(section, index)] = getInitialCollapsedState(section);
|
|
69
|
+
return result;
|
|
70
|
+
}, {});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function normalizeOption(option: SettingsWidgetOption): {
|
|
74
|
+
label: string;
|
|
75
|
+
value: SettingValue;
|
|
76
|
+
} {
|
|
77
|
+
if (isRecord(option) && 'label' in option && 'value' in option) {
|
|
78
|
+
return {
|
|
79
|
+
label: String(option.label),
|
|
80
|
+
value: option.value
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
label: String(option),
|
|
86
|
+
value: option
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// eslint-disable-next-line complexity
|
|
91
|
+
export function resolveSettingValue(
|
|
92
|
+
setting: SettingDescriptor,
|
|
93
|
+
settings: SettingsState
|
|
94
|
+
): SettingValue {
|
|
95
|
+
const currentValue = getValueAtPath(settings, setting.name);
|
|
96
|
+
|
|
97
|
+
if (setting.type === 'boolean') {
|
|
98
|
+
return typeof currentValue === 'boolean' ? currentValue : (getDefaultValue(setting) as boolean);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (setting.type === 'number') {
|
|
102
|
+
const numericValue =
|
|
103
|
+
typeof currentValue === 'number'
|
|
104
|
+
? currentValue
|
|
105
|
+
: Number.isFinite(Number(currentValue))
|
|
106
|
+
? Number(currentValue)
|
|
107
|
+
: (getDefaultValue(setting) as number);
|
|
108
|
+
return clamp(numericValue, setting.min, setting.max);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (setting.type === 'select') {
|
|
112
|
+
const normalizedOptions = (setting.options ?? []).map(normalizeOption);
|
|
113
|
+
const defaultValue = getDefaultValue(setting);
|
|
114
|
+
const candidateValue =
|
|
115
|
+
typeof currentValue === 'string' ||
|
|
116
|
+
typeof currentValue === 'number' ||
|
|
117
|
+
typeof currentValue === 'boolean'
|
|
118
|
+
? currentValue
|
|
119
|
+
: defaultValue;
|
|
120
|
+
|
|
121
|
+
if (!normalizedOptions.length) {
|
|
122
|
+
return String(candidateValue);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const match = normalizedOptions.find((option) => option.value === candidateValue);
|
|
126
|
+
return match ? match.value : normalizedOptions[0].value;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (typeof currentValue === 'string') {
|
|
130
|
+
return currentValue;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const defaultValue = getDefaultValue(setting);
|
|
134
|
+
return typeof defaultValue === 'string' ? defaultValue : String(defaultValue);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function mergeCollapsedState(
|
|
138
|
+
previous: Record<string, boolean>,
|
|
139
|
+
sections: SettingsSectionDescriptor[]
|
|
140
|
+
): Record<string, boolean> {
|
|
141
|
+
const nextState: Record<string, boolean> = {};
|
|
142
|
+
|
|
143
|
+
sections.forEach((section, index) => {
|
|
144
|
+
const key = getSectionKey(section, index);
|
|
145
|
+
nextState[key] = previous[key] ?? getInitialCollapsedState(section);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
return nextState;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
152
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function parsePath(path: string): string[] {
|
|
156
|
+
return path
|
|
157
|
+
.split('.')
|
|
158
|
+
.map((segment) => segment.trim())
|
|
159
|
+
.filter(Boolean);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function getValueAtPath(settings: SettingsState, path: string): unknown {
|
|
163
|
+
const segments = parsePath(path);
|
|
164
|
+
if (!segments.length) {
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
let current: unknown = settings;
|
|
169
|
+
for (const segment of segments) {
|
|
170
|
+
if (!isRecord(current)) {
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
current = current[segment];
|
|
174
|
+
}
|
|
175
|
+
return current;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function getInitialCollapsedState(section: SettingsSectionDescriptor): boolean {
|
|
179
|
+
return section.initiallyCollapsed ?? true;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function getDefaultValue(setting: SettingDescriptor): SettingValue {
|
|
183
|
+
if (setting.defaultValue !== undefined) {
|
|
184
|
+
return setting.defaultValue;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (setting.type === 'boolean') {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (setting.type === 'number') {
|
|
192
|
+
return Number.isFinite(setting.min) ? setting.min : 0;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (setting.type === 'select') {
|
|
196
|
+
if (setting.options?.length) {
|
|
197
|
+
return normalizeOption(setting.options[0]).value;
|
|
198
|
+
}
|
|
199
|
+
return '';
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return '';
|
|
203
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** @jsxImportSource preact */
|
|
2
|
+
import {Widget} from '@deck.gl/core';
|
|
3
|
+
import {render} from 'preact';
|
|
4
|
+
|
|
5
|
+
import type {WidgetPlacement, WidgetProps} from '@deck.gl/core';
|
|
6
|
+
|
|
7
|
+
export type ResetViewWidgetProps = WidgetProps & {
|
|
8
|
+
/** Widget positioning within the view. Default 'top-left'. */
|
|
9
|
+
placement?: WidgetPlacement;
|
|
10
|
+
/** Tooltip message */
|
|
11
|
+
label?: string;
|
|
12
|
+
/** Callback invoked when the widget button is clicked */
|
|
13
|
+
onResetView?: () => void;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/** @todo We can likely just add the onResetView callback to the official ResetViewWidget in deck.g; */
|
|
17
|
+
export class ResetViewWidget extends Widget<ResetViewWidgetProps> {
|
|
18
|
+
static defaultProps: Required<ResetViewWidgetProps> = {
|
|
19
|
+
...Widget.defaultProps,
|
|
20
|
+
id: 'reset-view',
|
|
21
|
+
placement: 'top-left',
|
|
22
|
+
label: 'Resize to fit',
|
|
23
|
+
onResetView: undefined!
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
className = 'deck-widget-reset-view';
|
|
27
|
+
placement: WidgetPlacement = 'top-left';
|
|
28
|
+
|
|
29
|
+
constructor(props: ResetViewWidgetProps = {}) {
|
|
30
|
+
super(props);
|
|
31
|
+
this.setProps(this.props);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
setProps(props: Partial<ResetViewWidgetProps>): void {
|
|
35
|
+
this.placement = props.placement ?? this.placement;
|
|
36
|
+
super.setProps(props);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
onRenderHTML(rootElement: HTMLElement): void {
|
|
40
|
+
const label = this.props.label ?? 'Resize to fit';
|
|
41
|
+
|
|
42
|
+
render(
|
|
43
|
+
<div className="deck-widget-button">
|
|
44
|
+
<button
|
|
45
|
+
className="deck-widget-icon-button deck-widget-reset-focus"
|
|
46
|
+
type="button"
|
|
47
|
+
title={label}
|
|
48
|
+
aria-label={label}
|
|
49
|
+
onClick={() => this.props.onResetView?.()}
|
|
50
|
+
>
|
|
51
|
+
<div className="deck-widget-icon" />
|
|
52
|
+
</button>
|
|
53
|
+
</div>,
|
|
54
|
+
rootElement
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|