@deck.gl/widgets 9.3.0-alpha.1 → 9.3.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/context-menu-widget.d.ts +7 -5
  2. package/dist/context-menu-widget.d.ts.map +1 -1
  3. package/dist/context-menu-widget.js +2 -1
  4. package/dist/context-menu-widget.js.map +1 -1
  5. package/dist/dist.dev.js +687 -555
  6. package/dist/icon-widget.d.ts +28 -0
  7. package/dist/icon-widget.d.ts.map +1 -0
  8. package/dist/icon-widget.js +35 -0
  9. package/dist/icon-widget.js.map +1 -0
  10. package/dist/index.cjs +468 -309
  11. package/dist/index.cjs.map +4 -4
  12. package/dist/index.d.ts +11 -9
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +7 -7
  15. package/dist/index.js.map +1 -1
  16. package/dist/info-widget.d.ts +1 -0
  17. package/dist/info-widget.d.ts.map +1 -1
  18. package/dist/info-widget.js +6 -0
  19. package/dist/info-widget.js.map +1 -1
  20. package/dist/lib/components/dropdown-menu.d.ts +3 -2
  21. package/dist/lib/components/dropdown-menu.d.ts.map +1 -1
  22. package/dist/lib/components/dropdown-menu.js +12 -8
  23. package/dist/lib/components/dropdown-menu.js.map +1 -1
  24. package/dist/lib/components/icon-button.d.ts +3 -0
  25. package/dist/lib/components/icon-button.d.ts.map +1 -1
  26. package/dist/lib/components/icon-button.js +10 -2
  27. package/dist/lib/components/icon-button.js.map +1 -1
  28. package/dist/lib/components/popover.js +1 -1
  29. package/dist/lib/components/popover.js.map +1 -1
  30. package/dist/lib/data-url.d.ts +5 -0
  31. package/dist/lib/data-url.d.ts.map +1 -0
  32. package/dist/lib/data-url.js +7 -0
  33. package/dist/lib/data-url.js.map +1 -0
  34. package/dist/popup-widget.d.ts +1 -0
  35. package/dist/popup-widget.d.ts.map +1 -1
  36. package/dist/popup-widget.js +6 -0
  37. package/dist/popup-widget.js.map +1 -1
  38. package/dist/selector-widget.d.ts +44 -0
  39. package/dist/selector-widget.d.ts.map +1 -0
  40. package/dist/selector-widget.js +64 -0
  41. package/dist/selector-widget.js.map +1 -0
  42. package/dist/splitter-widget.d.ts +52 -11
  43. package/dist/splitter-widget.d.ts.map +1 -1
  44. package/dist/splitter-widget.js +177 -76
  45. package/dist/splitter-widget.js.map +1 -1
  46. package/dist/stats-widget.d.ts +2 -1
  47. package/dist/stats-widget.d.ts.map +1 -1
  48. package/dist/stats-widget.js +37 -8
  49. package/dist/stats-widget.js.map +1 -1
  50. package/dist/stylesheet.css +50 -13
  51. package/dist/timeline-widget.d.ts.map +1 -1
  52. package/dist/timeline-widget.js +6 -1
  53. package/dist/timeline-widget.js.map +1 -1
  54. package/dist/toggle-widget.d.ts +38 -0
  55. package/dist/toggle-widget.d.ts.map +1 -0
  56. package/dist/toggle-widget.js +47 -0
  57. package/dist/toggle-widget.js.map +1 -0
  58. package/dist.min.js +2 -2
  59. package/package.json +3 -3
  60. package/src/context-menu-widget.tsx +9 -9
  61. package/src/icon-widget.tsx +69 -0
  62. package/src/index.ts +11 -9
  63. package/src/info-widget.tsx +7 -0
  64. package/src/lib/components/dropdown-menu.tsx +22 -15
  65. package/src/lib/components/icon-button.tsx +15 -3
  66. package/src/lib/components/popover.tsx +1 -1
  67. package/src/lib/data-url.ts +5 -0
  68. package/src/popup-widget.tsx +7 -0
  69. package/src/selector-widget.tsx +111 -0
  70. package/src/splitter-widget.tsx +281 -96
  71. package/src/stats-widget.tsx +50 -9
  72. package/src/stylesheet.css +50 -13
  73. package/src/timeline-widget.tsx +8 -1
  74. package/src/toggle-widget.tsx +101 -0
  75. package/dist/fps-widget.d.ts +0 -28
  76. package/dist/fps-widget.d.ts.map +0 -1
  77. package/dist/fps-widget.js +0 -51
  78. package/dist/fps-widget.js.map +0 -1
  79. package/dist/lib/components/icon-menu.d.ts +0 -16
  80. package/dist/lib/components/icon-menu.d.ts.map +0 -1
  81. package/dist/lib/components/icon-menu.js +0 -33
  82. package/dist/lib/components/icon-menu.js.map +0 -1
  83. package/dist/view-selector-widget.d.ts +0 -35
  84. package/dist/view-selector-widget.d.ts.map +0 -1
  85. package/dist/view-selector-widget.js +0 -63
  86. package/dist/view-selector-widget.js.map +0 -1
  87. package/src/fps-widget.tsx +0 -77
  88. package/src/lib/components/icon-menu.tsx +0 -70
  89. package/src/view-selector-widget.tsx +0 -151
@@ -0,0 +1,101 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {WidgetPlacement, WidgetProps} from '@deck.gl/core';
6
+ import {render, type JSX} from 'preact';
7
+ import {Widget} from '@deck.gl/core';
8
+ import {IconButton} from './lib/components/icon-button';
9
+
10
+ export type ToggleWidgetProps = WidgetProps & {
11
+ /** Widget positioning within the view. Default 'bottom-left'. */
12
+ placement?: WidgetPlacement;
13
+ /** View to attach to and interact with. Required when using multiple views. */
14
+ viewId?: string | null;
15
+ /** If the toggle is checked when first added */
16
+ initialChecked?: boolean;
17
+ /** Data url to display as icon */
18
+ icon: string;
19
+ /** Data url to display as icon when it is checked */
20
+ onIcon?: string;
21
+ /** Tooltip label */
22
+ label?: string;
23
+ /** Tooltip label when it is checked */
24
+ onLabel?: string;
25
+ /** Icon color, a CSS Color string */
26
+ color?: string;
27
+ /** Icon color when it is checked, a CSS Color string */
28
+ onColor?: string;
29
+ /** Callback when the widget is clicked */
30
+ onChange?: (checked: boolean) => void;
31
+ };
32
+
33
+ /**
34
+ * A generic widget that displays a button with icon or text content.
35
+ */
36
+ export class ToggleWidget extends Widget<ToggleWidgetProps> {
37
+ static defaultProps: Required<ToggleWidgetProps> = {
38
+ ...Widget.defaultProps,
39
+ id: 'icon',
40
+ placement: 'top-left',
41
+ viewId: null,
42
+ initialChecked: false,
43
+ icon: '',
44
+ onIcon: undefined!,
45
+ label: '',
46
+ onLabel: undefined!,
47
+ color: '',
48
+ onColor: undefined!,
49
+ onChange: undefined!
50
+ };
51
+
52
+ className = 'deck-widget-toggle';
53
+ placement: WidgetPlacement = 'top-left';
54
+ checked: boolean;
55
+
56
+ constructor(props: ToggleWidgetProps) {
57
+ super(props);
58
+ this.checked = this.props.initialChecked;
59
+ this.setProps(this.props);
60
+ }
61
+
62
+ setProps(props: Partial<ToggleWidgetProps>) {
63
+ this.placement = props.placement ?? this.placement;
64
+ this.viewId = props.viewId;
65
+ super.setProps(props);
66
+ }
67
+
68
+ onRenderHTML(rootElement: HTMLElement): void {
69
+ const {
70
+ className,
71
+ style,
72
+ icon,
73
+ label,
74
+ color,
75
+ onIcon = icon,
76
+ onLabel = label,
77
+ onColor = color
78
+ } = this.props;
79
+ const on = this.checked;
80
+
81
+ rootElement.dataset.checked = String(on);
82
+
83
+ render(
84
+ <IconButton
85
+ className={className}
86
+ style={style as JSX.CSSProperties}
87
+ icon={on ? onIcon : icon}
88
+ label={on ? onLabel : label}
89
+ color={on ? onColor : color}
90
+ onClick={this._toggle}
91
+ />,
92
+ rootElement
93
+ );
94
+ }
95
+
96
+ private _toggle = () => {
97
+ this.checked = !this.checked;
98
+ this.props.onChange?.(this.checked);
99
+ this.updateHTML();
100
+ };
101
+ }
@@ -1,28 +0,0 @@
1
- import { Widget } from '@deck.gl/core';
2
- import type { WidgetPlacement, Deck, WidgetProps } from '@deck.gl/core';
3
- /** Properties for the FpsWidget. */
4
- export type FpsWidgetProps = WidgetProps & {
5
- /** Widget positioning within the view. Default 'top-left'. */
6
- placement?: WidgetPlacement;
7
- /** View to attach to and interact with. Required when using multiple views. */
8
- viewId?: string | null;
9
- };
10
- /**
11
- * Displays the average frames per second reported by the Deck instance.
12
- */
13
- export declare class FpsWidget extends Widget<FpsWidgetProps> {
14
- static defaultProps: Required<FpsWidgetProps>;
15
- className: string;
16
- placement: WidgetPlacement;
17
- private _lastFps;
18
- constructor(props?: FpsWidgetProps);
19
- setProps(props: Partial<FpsWidgetProps>): void;
20
- onAdd({}: {
21
- deck: Deck<any>;
22
- viewId: string | null;
23
- }): void;
24
- onRenderHTML(rootElement: HTMLElement): void;
25
- _animate(): void;
26
- _getFps(): number;
27
- }
28
- //# sourceMappingURL=fps-widget.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fps-widget.d.ts","sourceRoot":"","sources":["../src/fps-widget.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAErC,OAAO,KAAK,EAAC,eAAe,EAAE,IAAI,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;AAGtE,oCAAoC;AACpC,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,qBAAa,SAAU,SAAQ,MAAM,CAAC,cAAc,CAAC;IACnD,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,CAK3C;IAEF,SAAS,SAAqB;IAC9B,SAAS,EAAE,eAAe,CAAc;IAExC,OAAO,CAAC,QAAQ,CAAc;gBAElB,KAAK,GAAE,cAAmB;IAKtC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAM9C,KAAK,CAAC,EAAE,EAAE;QAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,GAAG,IAAI;IAKzD,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAc5C,QAAQ,IAAI,IAAI;IAShB,OAAO,IAAI,MAAM;CAIlB"}
@@ -1,51 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
- // deck.gl
3
- // SPDX-License-Identifier: MIT
4
- // Copyright (c) vis.gl contributors
5
- import { Widget } from '@deck.gl/core';
6
- import { render } from 'preact';
7
- import { IconButton } from "./lib/components/icon-button.js";
8
- /**
9
- * Displays the average frames per second reported by the Deck instance.
10
- */
11
- export class FpsWidget extends Widget {
12
- constructor(props = {}) {
13
- super(props);
14
- this.className = 'deck-widget-fps';
15
- this.placement = 'top-left';
16
- this._lastFps = -1;
17
- this.setProps(this.props);
18
- }
19
- setProps(props) {
20
- this.placement = props.placement ?? this.placement;
21
- this.viewId = props.viewId ?? this.viewId;
22
- super.setProps(props);
23
- }
24
- onAdd({}) {
25
- this._lastFps = this._getFps();
26
- requestAnimationFrame(() => this._animate());
27
- }
28
- onRenderHTML(rootElement) {
29
- const fps = this._getFps();
30
- render(_jsx(IconButton, { children: _jsxs("div", { className: "text", children: ["FPS", _jsx("br", {}), fps] }) }), rootElement);
31
- }
32
- _animate() {
33
- const fps = this._getFps();
34
- if (this._lastFps !== fps) {
35
- this._lastFps = fps;
36
- this.updateHTML();
37
- }
38
- requestAnimationFrame(() => this._animate());
39
- }
40
- _getFps() {
41
- // @ts-expect-error protected
42
- return Math.round(this.deck?.metrics.fps ?? 0);
43
- }
44
- }
45
- FpsWidget.defaultProps = {
46
- ...Widget.defaultProps,
47
- id: 'fps',
48
- placement: 'top-left',
49
- viewId: null
50
- };
51
- //# sourceMappingURL=fps-widget.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fps-widget.js","sourceRoot":"","sources":["../src/fps-widget.tsx"],"names":[],"mappings":";AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAE9B,OAAO,EAAC,UAAU,EAAC,wCAAqC;AAUxD;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,MAAsB;IAanD,YAAY,QAAwB,EAAE;QACpC,KAAK,CAAC,KAAK,CAAC,CAAC;QANf,cAAS,GAAG,iBAAiB,CAAC;QAC9B,cAAS,GAAoB,UAAU,CAAC;QAEhC,aAAQ,GAAW,CAAC,CAAC,CAAC;QAI5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,QAAQ,CAAC,KAA8B;QACrC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QAC1C,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,EAA4C;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,qBAAqB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,YAAY,CAAC,WAAwB;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,CACJ,KAAC,UAAU,cACT,eAAK,SAAS,EAAC,MAAM,oBAEnB,cAAM,EACL,GAAG,IACA,GACK,EACb,WAAW,CACZ,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACpB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QACD,qBAAqB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,6BAA6B;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;;AAtDM,sBAAY,GAA6B;IAC9C,GAAG,MAAM,CAAC,YAAY;IACtB,EAAE,EAAE,KAAK;IACT,SAAS,EAAE,UAAU;IACrB,MAAM,EAAE,IAAI;CACb,AALkB,CAKjB"}
@@ -1,16 +0,0 @@
1
- import type { JSX } from 'preact';
2
- export type IconMenuProps<KeyType = string> = {
3
- className: string;
4
- icon?: JSX.Element;
5
- label?: string;
6
- menuItems: {
7
- value: KeyType;
8
- icon: JSX.Element;
9
- label: string;
10
- }[];
11
- initialItem: KeyType;
12
- onItemSelected: (item: KeyType) => void;
13
- };
14
- /** A component that renders an icon popup menu */
15
- export declare function IconMenu<KeyType extends string>(props: IconMenuProps<KeyType>): JSX.Element;
16
- //# sourceMappingURL=icon-menu.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"icon-menu.d.ts","sourceRoot":"","sources":["../../../src/lib/components/icon-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,QAAQ,CAAC;AAKhC,MAAM,MAAM,aAAa,CAAC,OAAO,GAAG,MAAM,IAAI;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAChE,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF,kDAAkD;AAClD,wBAAgB,QAAQ,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,eAsD7E"}
@@ -1,33 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
- import { useState, useRef, useEffect } from 'preact/hooks';
3
- import { ButtonGroup } from "./button-group.js";
4
- import { IconButton } from "./icon-button.js";
5
- /** A component that renders an icon popup menu */
6
- export function IconMenu(props) {
7
- const [menuOpen, setMenuOpen] = useState(false);
8
- const containerRef = useRef(null);
9
- // Close the menu when clicking outside.
10
- const handleClickOutside = (event) => {
11
- if (containerRef.current && !containerRef.current.contains(event.target)) {
12
- setMenuOpen(false);
13
- }
14
- };
15
- useEffect(() => {
16
- document.addEventListener('mousedown', handleClickOutside);
17
- return () => {
18
- document.removeEventListener('mousedown', handleClickOutside);
19
- };
20
- }, [containerRef]);
21
- const [selectedItem, setSelectedItem] = useState(props.initialItem);
22
- const handleSelectItem = (item) => {
23
- setSelectedItem(item);
24
- setMenuOpen(false);
25
- props.onItemSelected(item);
26
- };
27
- const handleButtonClick = () => setMenuOpen(!menuOpen);
28
- const selectedMenuItem = props.menuItems.find(item => item.value === selectedItem);
29
- const label = props.label || selectedMenuItem?.label || '';
30
- const icon = (props.icon || selectedMenuItem?.icon);
31
- return (_jsxs("div", { style: { position: 'relative', display: 'inline-block' }, ref: containerRef, children: [_jsx(IconButton, { className: props.className, label: label, onClick: handleButtonClick, children: icon }), menuOpen && (_jsx("div", { className: "deck-widget-icon-menu", children: _jsx(ButtonGroup, { orientation: "vertical", children: props.menuItems.map(item => (_jsx(IconButton, { label: item.label, onClick: () => handleSelectItem(item.value), children: item.icon }, item.value))) }) }))] }));
32
- }
33
- //# sourceMappingURL=icon-menu.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"icon-menu.js","sourceRoot":"","sources":["../../../src/lib/components/icon-menu.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAC,MAAM,cAAc,CAAC;AACzD,OAAO,EAAC,WAAW,EAAC,0BAAuB;AAC3C,OAAO,EAAC,UAAU,EAAC,yBAAsB;AAWzC,kDAAkD;AAClD,MAAM,UAAU,QAAQ,CAAyB,KAA6B;IAC5E,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAElD,wCAAwC;IACxC,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAE,EAAE;QAC/C,IAAI,YAAY,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAAE,CAAC;YACjF,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,WAAW,CAAC,CAAC;IAE7E,MAAM,gBAAgB,GAAG,CAAC,IAAa,EAAE,EAAE;QACzC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,gBAAgB,EAAE,IAAI,CAAE,CAAC;IAErD,OAAO,CACL,eAAK,KAAK,EAAE,EAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAC,EAAE,GAAG,EAAE,YAAY,aAC5E,KAAC,UAAU,IAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,YAC7E,IAAI,GACM,EACZ,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,uBAAuB,YACpC,KAAC,WAAW,IAAC,WAAW,EAAC,UAAU,YAChC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAC3B,KAAC,UAAU,IAET,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,YAE1C,IAAI,CAAC,IAAI,IAJL,IAAI,CAAC,KAAK,CAKJ,CACd,CAAC,GACU,GACV,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -1,35 +0,0 @@
1
- import { Widget, type WidgetProps, type WidgetPlacement } from '@deck.gl/core';
2
- /** The available view modes */
3
- export type ViewMode = 'single' | 'split-horizontal' | 'split-vertical';
4
- /** Properties for the ViewSelectorWidget */
5
- export type ViewSelectorWidgetProps = WidgetProps & {
6
- /** Widget positioning within the view. Default 'top-left'. */
7
- placement?: WidgetPlacement;
8
- /** View to attach to and interact with. Required when using multiple views. */
9
- viewId?: string | null;
10
- /** Tooltip label */
11
- label?: string;
12
- /** The initial view mode. Defaults to 'single'. */
13
- initialViewMode?: ViewMode;
14
- /** Callback invoked when the view mode changes */
15
- onViewModeChange?: (mode: ViewMode) => void;
16
- };
17
- /**
18
- * A widget that renders a popup menu for selecting a view mode.
19
- * It displays a button with the current view mode icon. Clicking the button
20
- * toggles a popup that shows three icons for:
21
- * - Single view
22
- * - Two views, split horizontally
23
- * - Two views, split vertically
24
- */
25
- export declare class ViewSelectorWidget extends Widget<ViewSelectorWidgetProps> {
26
- static defaultProps: Required<ViewSelectorWidgetProps>;
27
- className: string;
28
- placement: WidgetPlacement;
29
- viewMode: ViewMode;
30
- constructor(props?: ViewSelectorWidgetProps);
31
- setProps(props: Partial<ViewSelectorWidgetProps>): void;
32
- onRenderHTML(rootElement: HTMLElement): void;
33
- handleSelectMode: (viewMode: ViewMode) => void;
34
- }
35
- //# sourceMappingURL=view-selector-widget.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"view-selector-widget.d.ts","sourceRoot":"","sources":["../src/view-selector-widget.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAC,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAC,MAAM,eAAe,CAAC;AAG7E,+BAA+B;AAC/B,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAExE,4CAA4C;AAC5C,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG;IAClD,8DAA8D;IAC9D,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,MAAM,CAAC,uBAAuB,CAAC;IACrE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAQpD;IAEF,SAAS,SAA+B;IACxC,SAAS,EAAE,eAAe,CAAc;IACxC,QAAQ,EAAE,QAAQ,CAAC;gBAEP,KAAK,GAAE,uBAA4B;IAM/C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,uBAAuB,CAAC;IAMhD,YAAY,CAAC,WAAW,EAAE,WAAW;IAerC,gBAAgB,aAAc,QAAQ,UAIpC;CACH"}
@@ -1,63 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
- // deck.gl
3
- // SPDX-License-Identifier: MIT
4
- // Copyright (c) vis.gl contributors
5
- import { render } from 'preact';
6
- import { Widget } from '@deck.gl/core';
7
- import { IconMenu } from "./lib/components/icon-menu.js";
8
- /**
9
- * A widget that renders a popup menu for selecting a view mode.
10
- * It displays a button with the current view mode icon. Clicking the button
11
- * toggles a popup that shows three icons for:
12
- * - Single view
13
- * - Two views, split horizontally
14
- * - Two views, split vertically
15
- */
16
- export class ViewSelectorWidget extends Widget {
17
- constructor(props = {}) {
18
- super(props);
19
- this.className = 'deck-widget-view-selector';
20
- this.placement = 'top-left';
21
- this.handleSelectMode = (viewMode) => {
22
- this.viewMode = viewMode;
23
- this.updateHTML();
24
- this.props.onViewModeChange(viewMode);
25
- };
26
- this.viewMode = this.props.initialViewMode;
27
- this.setProps(this.props);
28
- }
29
- setProps(props) {
30
- this.placement = props.placement ?? this.placement;
31
- this.viewId = props.viewId ?? this.viewId;
32
- super.setProps(props);
33
- }
34
- onRenderHTML(rootElement) {
35
- render(_jsx(IconMenu, { className: "deck-widget-view-selector", menuItems: MENU_ITEMS.map(item => ({
36
- ...item,
37
- icon: item.icon()
38
- })), initialItem: this.props.initialViewMode, onItemSelected: this.handleSelectMode }), rootElement);
39
- }
40
- }
41
- ViewSelectorWidget.defaultProps = {
42
- ...Widget.defaultProps,
43
- id: 'view-selector',
44
- placement: 'top-left',
45
- viewId: null,
46
- label: 'Split View',
47
- initialViewMode: 'single',
48
- onViewModeChange: () => { }
49
- };
50
- const ICON_STYLE = { width: '24px', height: '24px' };
51
- // JSX wrapped in a function to fix deck's Node tests
52
- const ICONS = {
53
- single: () => (_jsx("svg", { width: "24", height: "24", style: ICON_STYLE, children: _jsx("rect", { x: "4", y: "4", width: "16", height: "16", stroke: "var(--button-icon-hover, rgb(24, 24, 26))", fill: "none", strokeWidth: "2" }) })),
54
- 'split-horizontal': () => (_jsxs("svg", { width: "24", height: "24", style: ICON_STYLE, children: [_jsx("rect", { x: "4", y: "4", width: "16", height: "7", stroke: "var(--button-icon-hover, rgb(24, 24, 26))", fill: "none", strokeWidth: "2" }), _jsx("rect", { x: "4", y: "13", width: "16", height: "7", stroke: "var(--button-icon-hover, rgb(24, 24, 26))", fill: "none", strokeWidth: "2" })] })),
55
- 'split-vertical': () => (_jsxs("svg", { width: "24", height: "24", style: ICON_STYLE, children: [_jsx("rect", { x: "4", y: "4", width: "7", height: "16", stroke: "var(--button-icon-hover, rgb(24, 24, 26))", fill: "none", strokeWidth: "2" }), _jsx("rect", { x: "13", y: "4", width: "7", height: "16", stroke: "var(--button-icon-hover, rgb(24, 24, 26))", fill: "none", strokeWidth: "2" })] }))
56
- };
57
- // Define menu items for the popup menu.
58
- const MENU_ITEMS = [
59
- { value: 'single', icon: ICONS.single, label: 'Single View' },
60
- { value: 'split-horizontal', icon: ICONS['split-horizontal'], label: 'Split Horizontal' },
61
- { value: 'split-vertical', icon: ICONS['split-vertical'], label: 'Split Vertical' }
62
- ];
63
- //# sourceMappingURL=view-selector-widget.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"view-selector-widget.js","sourceRoot":"","sources":["../src/view-selector-widget.tsx"],"names":[],"mappings":"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"}
@@ -1,77 +0,0 @@
1
- // deck.gl
2
- // SPDX-License-Identifier: MIT
3
- // Copyright (c) vis.gl contributors
4
-
5
- import {Widget} from '@deck.gl/core';
6
- import {render} from 'preact';
7
- import type {WidgetPlacement, Deck, WidgetProps} from '@deck.gl/core';
8
- import {IconButton} from './lib/components/icon-button';
9
-
10
- /** Properties for the FpsWidget. */
11
- export type FpsWidgetProps = WidgetProps & {
12
- /** Widget positioning within the view. Default 'top-left'. */
13
- placement?: WidgetPlacement;
14
- /** View to attach to and interact with. Required when using multiple views. */
15
- viewId?: string | null;
16
- };
17
-
18
- /**
19
- * Displays the average frames per second reported by the Deck instance.
20
- */
21
- export class FpsWidget extends Widget<FpsWidgetProps> {
22
- static defaultProps: Required<FpsWidgetProps> = {
23
- ...Widget.defaultProps,
24
- id: 'fps',
25
- placement: 'top-left',
26
- viewId: null
27
- };
28
-
29
- className = 'deck-widget-fps';
30
- placement: WidgetPlacement = 'top-left';
31
-
32
- private _lastFps: number = -1;
33
-
34
- constructor(props: FpsWidgetProps = {}) {
35
- super(props);
36
- this.setProps(this.props);
37
- }
38
-
39
- setProps(props: Partial<FpsWidgetProps>): void {
40
- this.placement = props.placement ?? this.placement;
41
- this.viewId = props.viewId ?? this.viewId;
42
- super.setProps(props);
43
- }
44
-
45
- onAdd({}: {deck: Deck<any>; viewId: string | null}): void {
46
- this._lastFps = this._getFps();
47
- requestAnimationFrame(() => this._animate());
48
- }
49
-
50
- onRenderHTML(rootElement: HTMLElement): void {
51
- const fps = this._getFps();
52
- render(
53
- <IconButton>
54
- <div className="text">
55
- FPS
56
- <br />
57
- {fps}
58
- </div>
59
- </IconButton>,
60
- rootElement
61
- );
62
- }
63
-
64
- _animate(): void {
65
- const fps = this._getFps();
66
- if (this._lastFps !== fps) {
67
- this._lastFps = fps;
68
- this.updateHTML();
69
- }
70
- requestAnimationFrame(() => this._animate());
71
- }
72
-
73
- _getFps(): number {
74
- // @ts-expect-error protected
75
- return Math.round(this.deck?.metrics.fps ?? 0);
76
- }
77
- }
@@ -1,70 +0,0 @@
1
- import type {JSX} from 'preact';
2
- import {useState, useRef, useEffect} from 'preact/hooks';
3
- import {ButtonGroup} from './button-group';
4
- import {IconButton} from './icon-button';
5
-
6
- export type IconMenuProps<KeyType = string> = {
7
- className: string;
8
- icon?: JSX.Element;
9
- label?: string;
10
- menuItems: {value: KeyType; icon: JSX.Element; label: string}[];
11
- initialItem: KeyType;
12
- onItemSelected: (item: KeyType) => void;
13
- };
14
-
15
- /** A component that renders an icon popup menu */
16
- export function IconMenu<KeyType extends string>(props: IconMenuProps<KeyType>) {
17
- const [menuOpen, setMenuOpen] = useState(false);
18
- const containerRef = useRef<HTMLDivElement>(null);
19
-
20
- // Close the menu when clicking outside.
21
- const handleClickOutside = (event: MouseEvent) => {
22
- if (containerRef.current && !containerRef.current.contains(event.target as Node)) {
23
- setMenuOpen(false);
24
- }
25
- };
26
-
27
- useEffect(() => {
28
- document.addEventListener('mousedown', handleClickOutside);
29
- return () => {
30
- document.removeEventListener('mousedown', handleClickOutside);
31
- };
32
- }, [containerRef]);
33
-
34
- const [selectedItem, setSelectedItem] = useState<KeyType>(props.initialItem);
35
-
36
- const handleSelectItem = (item: KeyType) => {
37
- setSelectedItem(item);
38
- setMenuOpen(false);
39
- props.onItemSelected(item);
40
- };
41
-
42
- const handleButtonClick = () => setMenuOpen(!menuOpen);
43
-
44
- const selectedMenuItem = props.menuItems.find(item => item.value === selectedItem);
45
- const label = props.label || selectedMenuItem?.label || '';
46
- const icon = (props.icon || selectedMenuItem?.icon)!;
47
-
48
- return (
49
- <div style={{position: 'relative', display: 'inline-block'}} ref={containerRef}>
50
- <IconButton className={props.className} label={label} onClick={handleButtonClick}>
51
- {icon}
52
- </IconButton>
53
- {menuOpen && (
54
- <div className="deck-widget-icon-menu">
55
- <ButtonGroup orientation="vertical">
56
- {props.menuItems.map(item => (
57
- <IconButton
58
- key={item.value}
59
- label={item.label}
60
- onClick={() => handleSelectItem(item.value)}
61
- >
62
- {item.icon}
63
- </IconButton>
64
- ))}
65
- </ButtonGroup>
66
- </div>
67
- )}
68
- </div>
69
- );
70
- }
@@ -1,151 +0,0 @@
1
- // deck.gl
2
- // SPDX-License-Identifier: MIT
3
- // Copyright (c) vis.gl contributors
4
-
5
- import {render, JSX} from 'preact';
6
- import {Widget, type WidgetProps, type WidgetPlacement} from '@deck.gl/core';
7
- import {IconMenu} from './lib/components/icon-menu';
8
-
9
- /** The available view modes */
10
- export type ViewMode = 'single' | 'split-horizontal' | 'split-vertical';
11
-
12
- /** Properties for the ViewSelectorWidget */
13
- export type ViewSelectorWidgetProps = WidgetProps & {
14
- /** Widget positioning within the view. Default 'top-left'. */
15
- placement?: WidgetPlacement;
16
- /** View to attach to and interact with. Required when using multiple views. */
17
- viewId?: string | null;
18
- /** Tooltip label */
19
- label?: string;
20
- /** The initial view mode. Defaults to 'single'. */
21
- initialViewMode?: ViewMode;
22
- /** Callback invoked when the view mode changes */
23
- onViewModeChange?: (mode: ViewMode) => void;
24
- };
25
-
26
- /**
27
- * A widget that renders a popup menu for selecting a view mode.
28
- * It displays a button with the current view mode icon. Clicking the button
29
- * toggles a popup that shows three icons for:
30
- * - Single view
31
- * - Two views, split horizontally
32
- * - Two views, split vertically
33
- */
34
- export class ViewSelectorWidget extends Widget<ViewSelectorWidgetProps> {
35
- static defaultProps: Required<ViewSelectorWidgetProps> = {
36
- ...Widget.defaultProps,
37
- id: 'view-selector',
38
- placement: 'top-left',
39
- viewId: null,
40
- label: 'Split View',
41
- initialViewMode: 'single',
42
- onViewModeChange: () => {}
43
- };
44
-
45
- className = 'deck-widget-view-selector';
46
- placement: WidgetPlacement = 'top-left';
47
- viewMode: ViewMode;
48
-
49
- constructor(props: ViewSelectorWidgetProps = {}) {
50
- super(props);
51
- this.viewMode = this.props.initialViewMode;
52
- this.setProps(this.props);
53
- }
54
-
55
- setProps(props: Partial<ViewSelectorWidgetProps>) {
56
- this.placement = props.placement ?? this.placement;
57
- this.viewId = props.viewId ?? this.viewId;
58
- super.setProps(props);
59
- }
60
-
61
- onRenderHTML(rootElement: HTMLElement) {
62
- render(
63
- <IconMenu<ViewMode>
64
- className="deck-widget-view-selector"
65
- menuItems={MENU_ITEMS.map(item => ({
66
- ...item,
67
- icon: item.icon()
68
- }))}
69
- initialItem={this.props.initialViewMode}
70
- onItemSelected={this.handleSelectMode}
71
- />,
72
- rootElement
73
- );
74
- }
75
-
76
- handleSelectMode = (viewMode: ViewMode) => {
77
- this.viewMode = viewMode;
78
- this.updateHTML();
79
- this.props.onViewModeChange(viewMode);
80
- };
81
- }
82
-
83
- const ICON_STYLE = {width: '24px', height: '24px'};
84
-
85
- // JSX wrapped in a function to fix deck's Node tests
86
- const ICONS: Record<ViewMode, () => JSX.Element> = {
87
- single: () => (
88
- <svg width="24" height="24" style={ICON_STYLE}>
89
- <rect
90
- x="4"
91
- y="4"
92
- width="16"
93
- height="16"
94
- stroke="var(--button-icon-hover, rgb(24, 24, 26))"
95
- fill="none"
96
- strokeWidth="2"
97
- />
98
- </svg>
99
- ),
100
- 'split-horizontal': () => (
101
- <svg width="24" height="24" style={ICON_STYLE}>
102
- <rect
103
- x="4"
104
- y="4"
105
- width="16"
106
- height="7"
107
- stroke="var(--button-icon-hover, rgb(24, 24, 26))"
108
- fill="none"
109
- strokeWidth="2"
110
- />
111
- <rect
112
- x="4"
113
- y="13"
114
- width="16"
115
- height="7"
116
- stroke="var(--button-icon-hover, rgb(24, 24, 26))"
117
- fill="none"
118
- strokeWidth="2"
119
- />
120
- </svg>
121
- ),
122
- 'split-vertical': () => (
123
- <svg width="24" height="24" style={ICON_STYLE}>
124
- <rect
125
- x="4"
126
- y="4"
127
- width="7"
128
- height="16"
129
- stroke="var(--button-icon-hover, rgb(24, 24, 26))"
130
- fill="none"
131
- strokeWidth="2"
132
- />
133
- <rect
134
- x="13"
135
- y="4"
136
- width="7"
137
- height="16"
138
- stroke="var(--button-icon-hover, rgb(24, 24, 26))"
139
- fill="none"
140
- strokeWidth="2"
141
- />
142
- </svg>
143
- )
144
- };
145
-
146
- // Define menu items for the popup menu.
147
- const MENU_ITEMS: Array<{value: ViewMode; icon: () => JSX.Element; label: string}> = [
148
- {value: 'single', icon: ICONS.single, label: 'Single View'},
149
- {value: 'split-horizontal', icon: ICONS['split-horizontal'], label: 'Split Horizontal'},
150
- {value: 'split-vertical', icon: ICONS['split-vertical'], label: 'Split Vertical'}
151
- ];