@deck.gl/widgets 9.2.11 → 9.3.0-alpha.2

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 (152) hide show
  1. package/dist/compass-widget.js +5 -5
  2. package/dist/compass-widget.js.map +1 -1
  3. package/dist/context-menu-widget.d.ts +27 -20
  4. package/dist/context-menu-widget.d.ts.map +1 -1
  5. package/dist/context-menu-widget.js +45 -48
  6. package/dist/context-menu-widget.js.map +1 -1
  7. package/dist/dist.dev.js +3114 -869
  8. package/dist/fullscreen-widget.js +1 -1
  9. package/dist/fullscreen-widget.js.map +1 -1
  10. package/dist/geocoder-widget.d.ts +2 -4
  11. package/dist/geocoder-widget.d.ts.map +1 -1
  12. package/dist/geocoder-widget.js +16 -20
  13. package/dist/geocoder-widget.js.map +1 -1
  14. package/dist/gimbal-widget.d.ts +0 -3
  15. package/dist/gimbal-widget.d.ts.map +1 -1
  16. package/dist/gimbal-widget.js +4 -22
  17. package/dist/gimbal-widget.js.map +1 -1
  18. package/dist/icon-widget.d.ts +28 -0
  19. package/dist/icon-widget.d.ts.map +1 -0
  20. package/dist/icon-widget.js +35 -0
  21. package/dist/icon-widget.js.map +1 -0
  22. package/dist/index.cjs +1271 -561
  23. package/dist/index.cjs.map +4 -4
  24. package/dist/index.d.ts +16 -12
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +11 -10
  27. package/dist/index.js.map +1 -1
  28. package/dist/info-widget.d.ts +39 -17
  29. package/dist/info-widget.d.ts.map +1 -1
  30. package/dist/info-widget.js +46 -130
  31. package/dist/info-widget.js.map +1 -1
  32. package/dist/lib/components/dropdown-menu.d.ts +12 -5
  33. package/dist/lib/components/dropdown-menu.d.ts.map +1 -1
  34. package/dist/lib/components/dropdown-menu.js +20 -11
  35. package/dist/lib/components/dropdown-menu.js.map +1 -1
  36. package/dist/lib/components/icon-button.d.ts +3 -0
  37. package/dist/lib/components/icon-button.d.ts.map +1 -1
  38. package/dist/lib/components/icon-button.js +10 -2
  39. package/dist/lib/components/icon-button.js.map +1 -1
  40. package/dist/lib/components/popover.d.ts +30 -0
  41. package/dist/lib/components/popover.d.ts.map +1 -0
  42. package/dist/lib/components/popover.js +93 -0
  43. package/dist/lib/components/popover.js.map +1 -0
  44. package/dist/lib/components/range-input.d.ts +26 -0
  45. package/dist/lib/components/range-input.d.ts.map +1 -0
  46. package/dist/lib/components/range-input.js +261 -0
  47. package/dist/lib/components/range-input.js.map +1 -0
  48. package/dist/lib/components/user-content.d.ts +8 -0
  49. package/dist/lib/components/user-content.d.ts.map +1 -0
  50. package/dist/lib/components/user-content.js +15 -0
  51. package/dist/lib/components/user-content.js.map +1 -0
  52. package/dist/lib/data-url.d.ts +5 -0
  53. package/dist/lib/data-url.d.ts.map +1 -0
  54. package/dist/lib/data-url.js +7 -0
  55. package/dist/lib/data-url.js.map +1 -0
  56. package/dist/popup-widget.d.ts +64 -0
  57. package/dist/popup-widget.d.ts.map +1 -0
  58. package/dist/popup-widget.js +76 -0
  59. package/dist/popup-widget.js.map +1 -0
  60. package/dist/reset-view-widget.d.ts +1 -1
  61. package/dist/reset-view-widget.d.ts.map +1 -1
  62. package/dist/reset-view-widget.js +12 -11
  63. package/dist/reset-view-widget.js.map +1 -1
  64. package/dist/scrollbar-widget.d.ts +68 -0
  65. package/dist/scrollbar-widget.d.ts.map +1 -0
  66. package/dist/scrollbar-widget.js +181 -0
  67. package/dist/scrollbar-widget.js.map +1 -0
  68. package/dist/selector-widget.d.ts +44 -0
  69. package/dist/selector-widget.d.ts.map +1 -0
  70. package/dist/selector-widget.js +64 -0
  71. package/dist/selector-widget.js.map +1 -0
  72. package/dist/splitter-widget.d.ts +52 -11
  73. package/dist/splitter-widget.d.ts.map +1 -1
  74. package/dist/splitter-widget.js +177 -76
  75. package/dist/splitter-widget.js.map +1 -1
  76. package/dist/stats-widget.d.ts +6 -1
  77. package/dist/stats-widget.d.ts.map +1 -1
  78. package/dist/stats-widget.js +39 -10
  79. package/dist/stats-widget.js.map +1 -1
  80. package/dist/stylesheet.css +291 -39
  81. package/dist/theme-widget.d.ts.map +1 -1
  82. package/dist/theme-widget.js +7 -5
  83. package/dist/theme-widget.js.map +1 -1
  84. package/dist/themes.d.ts +30 -0
  85. package/dist/themes.d.ts.map +1 -1
  86. package/dist/themes.js +28 -4
  87. package/dist/themes.js.map +1 -1
  88. package/dist/timeline-widget.d.ts +25 -6
  89. package/dist/timeline-widget.d.ts.map +1 -1
  90. package/dist/timeline-widget.js +51 -18
  91. package/dist/timeline-widget.js.map +1 -1
  92. package/dist/toggle-widget.d.ts +38 -0
  93. package/dist/toggle-widget.d.ts.map +1 -0
  94. package/dist/toggle-widget.js +47 -0
  95. package/dist/toggle-widget.js.map +1 -0
  96. package/dist/zoom-widget.d.ts +2 -8
  97. package/dist/zoom-widget.d.ts.map +1 -1
  98. package/dist/zoom-widget.js +23 -18
  99. package/dist/zoom-widget.js.map +1 -1
  100. package/dist.min.js +2 -2
  101. package/package.json +4 -3
  102. package/src/compass-widget.tsx +5 -5
  103. package/src/context-menu-widget.tsx +88 -78
  104. package/src/fullscreen-widget.tsx +1 -1
  105. package/src/geocoder-widget.tsx +17 -24
  106. package/src/gimbal-widget.tsx +4 -26
  107. package/src/icon-widget.tsx +69 -0
  108. package/src/index.ts +22 -15
  109. package/src/info-widget.tsx +100 -157
  110. package/src/lib/components/dropdown-menu.tsx +58 -29
  111. package/src/lib/components/icon-button.tsx +15 -3
  112. package/src/lib/components/popover.tsx +167 -0
  113. package/src/lib/components/range-input.tsx +432 -0
  114. package/src/lib/components/user-content.tsx +30 -0
  115. package/src/lib/data-url.ts +5 -0
  116. package/src/popup-widget.tsx +170 -0
  117. package/src/reset-view-widget.tsx +12 -11
  118. package/src/scrollbar-widget.tsx +288 -0
  119. package/src/selector-widget.tsx +111 -0
  120. package/src/splitter-widget.tsx +281 -96
  121. package/src/stats-widget.tsx +59 -12
  122. package/src/stylesheet.css +291 -39
  123. package/src/theme-widget.tsx +7 -5
  124. package/src/themes.ts +35 -4
  125. package/src/timeline-widget.tsx +103 -33
  126. package/src/toggle-widget.tsx +101 -0
  127. package/src/zoom-widget.tsx +25 -21
  128. package/dist/fps-widget.d.ts +0 -28
  129. package/dist/fps-widget.d.ts.map +0 -1
  130. package/dist/fps-widget.js +0 -51
  131. package/dist/fps-widget.js.map +0 -1
  132. package/dist/lib/components/grouped-icon-button.d.ts +0 -10
  133. package/dist/lib/components/grouped-icon-button.d.ts.map +0 -1
  134. package/dist/lib/components/grouped-icon-button.js +0 -7
  135. package/dist/lib/components/grouped-icon-button.js.map +0 -1
  136. package/dist/lib/components/icon-menu.d.ts +0 -16
  137. package/dist/lib/components/icon-menu.d.ts.map +0 -1
  138. package/dist/lib/components/icon-menu.js +0 -34
  139. package/dist/lib/components/icon-menu.js.map +0 -1
  140. package/dist/lib/components/simple-menu.d.ts +0 -16
  141. package/dist/lib/components/simple-menu.d.ts.map +0 -1
  142. package/dist/lib/components/simple-menu.js +0 -30
  143. package/dist/lib/components/simple-menu.js.map +0 -1
  144. package/dist/view-selector-widget.d.ts +0 -35
  145. package/dist/view-selector-widget.d.ts.map +0 -1
  146. package/dist/view-selector-widget.js +0 -63
  147. package/dist/view-selector-widget.js.map +0 -1
  148. package/src/fps-widget.tsx +0 -77
  149. package/src/lib/components/grouped-icon-button.tsx +0 -27
  150. package/src/lib/components/icon-menu.tsx +0 -71
  151. package/src/lib/components/simple-menu.tsx +0 -52
  152. package/src/view-selector-widget.tsx +0 -151
@@ -5,32 +5,32 @@
5
5
  /* global document */
6
6
  import {Widget} from '@deck.gl/core';
7
7
  import type {Deck, PickingInfo, WidgetProps} from '@deck.gl/core';
8
- import {render} from 'preact';
9
- import {SimpleMenu} from './lib/components/simple-menu';
10
-
11
- /** The standard, modern way is to use event.button === 2, where button is the standardized property (0 = left, 1 = middle, 2 = right). */
12
- const MOUSE_BUTTON_RIGHT = 2;
13
- /** A name for the legacy MouseEvent.which value that corresponds to the right-mouse button. In older browsers, the check is: if (event.which === 3) */
14
- const MOUSE_WHICH_RIGHT = 3;
15
-
16
- export type ContextWidgetMenuItem = {
17
- label: string;
18
- key: string;
19
- };
8
+ import {render, type JSX} from 'preact';
9
+ import {SimpleMenu, type MenuItem} from './lib/components/dropdown-menu';
10
+ import {Popover, type PopoverProps} from './lib/components/popover';
20
11
 
21
12
  export type ContextMenuWidgetProps = WidgetProps & {
22
13
  /** View to attach to and interact with. Required when using multiple views. */
23
14
  viewId?: string | null;
24
- /** Controls visibility of the context menu */
25
- visible?: boolean;
26
- /** Screen position at which to place the menu */
27
- position: {x: number; y: number};
28
- /** Items to render */
29
- menuItems: ContextWidgetMenuItem[];
30
- /** Provide menu items for the menu given the picked object */
31
- getMenuItems: (info: PickingInfo, widget: ContextMenuWidget) => ContextWidgetMenuItem[] | null;
32
- /** Callback with the selected item */
33
- onMenuItemSelected?: (key: string, pickInfo: PickingInfo | null) => void;
15
+ /** Menu items for the menu. */
16
+ menuItems?: MenuItem[];
17
+ /** Callback to provide menu items for the menu given the picked object. Overrides `menuItems` */
18
+ getMenuItems?: (info: PickingInfo, widget: ContextMenuWidget) => MenuItem[] | null;
19
+ /** Callback when a menu item is selected */
20
+ onMenuItemSelected?: (value: string, pickInfo: PickingInfo | null) => void;
21
+ /** Position menu relative to the anchor.
22
+ * @default 'bottom-start'
23
+ */
24
+ placement?: PopoverProps['placement'];
25
+ /** Pixel offset
26
+ * @default 10
27
+ */
28
+ offset?: PopoverProps['offset'];
29
+ /**
30
+ * Show an arrow pointing at the anchor. Optionally accepts a pixel size.
31
+ * @default false
32
+ */
33
+ arrow?: PopoverProps['arrow'];
34
34
  };
35
35
 
36
36
  export class ContextMenuWidget extends Widget<ContextMenuWidgetProps> {
@@ -38,83 +38,93 @@ export class ContextMenuWidget extends Widget<ContextMenuWidgetProps> {
38
38
  ...Widget.defaultProps,
39
39
  id: 'context',
40
40
  viewId: null,
41
- visible: false,
42
- position: {x: 0, y: 0},
43
- getMenuItems: undefined!,
44
41
  menuItems: [],
45
- // eslint-disable-next-line no-console
46
- onMenuItemSelected: (key, pickInfo) => console.log('Context menu item selected:', key, pickInfo)
42
+ getMenuItems: undefined!,
43
+ onMenuItemSelected: () => {},
44
+ placement: 'bottom-start',
45
+ offset: 10,
46
+ arrow: false
47
47
  };
48
48
 
49
49
  className = 'deck-widget-context-menu';
50
50
  placement = 'fill' as const;
51
51
 
52
- pickInfo: PickingInfo | null = null;
52
+ menu: {
53
+ items: MenuItem[];
54
+ pickInfo: PickingInfo;
55
+ } | null = null;
53
56
 
54
57
  constructor(props: ContextMenuWidgetProps) {
55
58
  super(props);
56
- this.pickInfo = null;
57
59
  this.setProps(this.props);
58
60
  }
59
61
 
60
- onAdd({deck}: {deck: Deck<any>}): HTMLDivElement {
61
- const element = document.createElement('div');
62
- element.classList.add('deck-widget', 'deck-widget-context-menu');
63
- const style = {
64
- margin: '0px',
65
- top: '0px',
66
- left: '0px',
67
- position: 'absolute',
68
- pointerEvents: 'auto'
69
- };
70
- Object.entries(style).forEach(([key, value]) => element.style.setProperty(key, value));
71
-
72
- deck.getCanvas()?.addEventListener('click', () => this.hide());
62
+ onAdd({deck}: {deck: Deck<any>}) {
73
63
  deck.getCanvas()?.addEventListener('contextmenu', event => this.handleContextMenu(event));
74
- return element;
75
64
  }
76
65
 
77
- onRenderHTML(rootElement: HTMLElement): void {
78
- const {visible, position, menuItems} = this.props;
66
+ handleContextMenu(srcEvent: MouseEvent) {
67
+ const targetRect = (srcEvent.target as HTMLElement).getBoundingClientRect();
68
+ const x = srcEvent.clientX - targetRect.x;
69
+ const y = srcEvent.clientY - targetRect.y;
79
70
 
80
- const ui =
81
- visible && menuItems.length ? (
82
- <SimpleMenu
83
- menuItems={menuItems}
84
- onItemSelected={key => this.props.onMenuItemSelected(key, this.pickInfo)}
85
- position={position}
86
- style={{pointerEvents: 'auto'}}
87
- />
88
- ) : null;
89
- render(ui, rootElement);
71
+ const pickInfo = this.deck?.pickObject({x, y}) || {
72
+ x,
73
+ y,
74
+ picked: false,
75
+ layer: null,
76
+ color: null,
77
+ index: -1,
78
+ pixelRatio: 1
79
+ };
80
+ const menuItems = this.props.getMenuItems?.(pickInfo, this) || this.props.menuItems;
81
+ this.menu =
82
+ menuItems.length > 0
83
+ ? {
84
+ items: menuItems,
85
+ pickInfo
86
+ }
87
+ : null;
88
+ srcEvent.preventDefault();
89
+ this.updateHTML();
90
90
  }
91
91
 
92
- handleContextMenu(srcEvent: MouseEvent): boolean {
93
- if (
94
- srcEvent &&
95
- (srcEvent.button === MOUSE_BUTTON_RIGHT || srcEvent.which === MOUSE_WHICH_RIGHT)
96
- ) {
97
- this.pickInfo =
98
- this.deck?.pickObject({
99
- x: srcEvent.clientX,
100
- y: srcEvent.clientY
101
- }) || null;
102
- const menuItems = (this.pickInfo && this.props.getMenuItems?.(this.pickInfo, this)) || [];
103
- const visible = menuItems.length > 0;
104
- this.setProps({
105
- visible,
106
- position: {x: srcEvent.clientX, y: srcEvent.clientY},
107
- menuItems
108
- });
109
- this.updateHTML();
110
- srcEvent.preventDefault();
111
- return visible;
92
+ onRenderHTML(rootElement: HTMLElement): void {
93
+ if (!this.menu) {
94
+ render(null, rootElement);
95
+ return;
112
96
  }
97
+ const {items, pickInfo} = this.menu;
98
+
99
+ const style = {
100
+ pointerEvents: 'auto',
101
+ position: 'static',
102
+ ...this.props.style
103
+ };
113
104
 
114
- return false;
105
+ const ui = (
106
+ <Popover
107
+ x={pickInfo.x}
108
+ y={pickInfo.y}
109
+ placement={this.props.placement}
110
+ arrow={this.props.arrow}
111
+ arrowColor="var(--menu-background, #fff)"
112
+ offset={this.props.offset}
113
+ >
114
+ <SimpleMenu
115
+ menuItems={items}
116
+ onSelect={value => this.props.onMenuItemSelected(value, pickInfo)}
117
+ style={style}
118
+ isOpen
119
+ onClose={() => this.hide()}
120
+ />
121
+ </Popover>
122
+ );
123
+ render(ui, rootElement);
115
124
  }
116
125
 
117
- hide(): void {
118
- this.setProps({visible: false});
126
+ hide() {
127
+ this.menu = null;
128
+ this.updateHTML();
119
129
  }
120
130
  }
@@ -74,7 +74,7 @@ export class FullscreenWidget extends Widget<FullscreenWidgetProps> {
74
74
  }
75
75
 
76
76
  getContainer() {
77
- return this.props.container || this.deck?.getCanvas()?.parentElement;
77
+ return this.props.container || this.deck?.props.parent || this.deck?.getCanvas()?.parentElement;
78
78
  }
79
79
 
80
80
  onFullscreenChange() {
@@ -3,7 +3,7 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import {Widget} from '@deck.gl/core';
6
- import type {WidgetPlacement, Viewport, WidgetProps} from '@deck.gl/core';
6
+ import type {WidgetPlacement, WidgetProps} from '@deck.gl/core';
7
7
  import {FlyToInterpolator, LinearInterpolator} from '@deck.gl/core';
8
8
  import {render} from 'preact';
9
9
  import {DropdownMenu, type MenuItem} from './lib/components/dropdown-menu';
@@ -157,7 +157,7 @@ export class GeocoderWidget extends Widget<GeocoderWidgetProps> {
157
157
  try {
158
158
  const coordinates = await CurrentLocationGeocoder.geocode();
159
159
  if (coordinates) {
160
- this.setViewState(coordinates);
160
+ this.flyTo(coordinates);
161
161
  }
162
162
  } catch (error) {
163
163
  this.geocodeHistory.errorText = error instanceof Error ? error.message : 'Location error';
@@ -181,33 +181,26 @@ export class GeocoderWidget extends Widget<GeocoderWidgetProps> {
181
181
  this.updateHTML();
182
182
  }
183
183
  if (coordinates) {
184
- this.setViewState(coordinates);
184
+ this.flyTo(coordinates);
185
185
  }
186
186
  };
187
187
 
188
- // TODO - MOVE TO WIDGETIMPL?
189
- setViewState(viewState: ViewState) {
190
- const viewId = this.props.viewId || (viewState?.id as string) || 'default-view';
191
- const viewport = this.viewports[viewId] || {};
192
- const nextViewState: ViewState = {
193
- ...viewport,
194
- ...viewState
195
- };
196
- if (this.props.transitionDuration > 0) {
197
- nextViewState.transitionDuration = this.props.transitionDuration;
198
- nextViewState.transitionInterpolator =
199
- 'latitude' in nextViewState ? new FlyToInterpolator() : new LinearInterpolator();
188
+ flyTo(viewState: ViewState) {
189
+ const viewIds = this.viewId ? [this.viewId] : (this.deck?.getViews().map(v => v.id) ?? []);
190
+ for (const viewId of viewIds) {
191
+ const currentViewState = this.getViewState(viewId);
192
+ const nextViewState: ViewState = {
193
+ ...currentViewState,
194
+ ...viewState
195
+ };
196
+ if (this.props.transitionDuration > 0) {
197
+ nextViewState.transitionDuration = this.props.transitionDuration;
198
+ nextViewState.transitionInterpolator =
199
+ 'latitude' in nextViewState ? new FlyToInterpolator() : new LinearInterpolator();
200
+ }
201
+ this.setViewState(viewId, nextViewState);
200
202
  }
201
-
202
- // @ts-ignore Using private method temporary until there's a public one
203
- this.deck._onViewStateChange({viewId, viewState: nextViewState, interactionState: {}});
204
203
  }
205
-
206
- onViewportChange(viewport: Viewport) {
207
- this.viewports[viewport.id] = viewport;
208
- }
209
-
210
- viewports: Record<string, Viewport> = {};
211
204
  }
212
205
 
213
206
  function getGeocoder(props: {geocoder?: string; customGeocoder?: Geocoder}): Geocoder {
@@ -119,7 +119,7 @@ export class GimbalWidget extends Widget<GimbalWidgetProps> {
119
119
  }
120
120
 
121
121
  resetOrbitView(viewport?: Viewport) {
122
- const viewId = this.getViewId(viewport);
122
+ const viewId = this.viewId || viewport?.id || 'OrbitView';
123
123
  const viewState = this.getViewState(viewId);
124
124
  if ('rotationOrbit' in viewState || 'rotationX' in viewState) {
125
125
  const nextViewState = {
@@ -131,13 +131,13 @@ export class GimbalWidget extends Widget<GimbalWidgetProps> {
131
131
  transitionProps: ['rotationOrbit', 'rotationX']
132
132
  })
133
133
  };
134
- // @ts-ignore Using private method temporary until there's a public one
135
- this.deck._onViewStateChange({viewId, viewState: nextViewState, interactionState: {}});
134
+ this.setViewState(viewId, nextViewState);
136
135
  }
137
136
  }
138
137
 
139
138
  getNormalizedRotation(viewport?: Viewport): {rotationOrbit: number; rotationX: number} {
140
- const viewState = this.getViewState(this.getViewId(viewport));
139
+ const viewId = this.viewId || viewport?.id || 'OrbitView';
140
+ const viewState = this.getViewState(viewId);
141
141
  const [rz, rx] = this.getRotation(viewState);
142
142
  const rotationOrbit = normalizeAndClampAngle(rz);
143
143
  const rotationX = normalizeAndClampAngle(rx);
@@ -150,28 +150,6 @@ export class GimbalWidget extends Widget<GimbalWidgetProps> {
150
150
  }
151
151
  return [0, 0];
152
152
  }
153
-
154
- // Move to Widget/WidgetManager?
155
-
156
- getViewId(viewport?: Viewport) {
157
- const viewId = this.viewId || viewport?.id || 'OrbitView';
158
- return viewId;
159
- }
160
-
161
- getViewState(viewId: string) {
162
- const viewManager = this.getViewManager();
163
- const viewState = (viewId && viewManager.getViewState(viewId)) || viewManager.viewState;
164
- return viewState;
165
- }
166
-
167
- getViewManager() {
168
- // @ts-expect-error protected
169
- const viewManager = this.deck?.viewManager;
170
- if (!viewManager) {
171
- throw new Error('wigdet must be added to a deck instance');
172
- }
173
- return viewManager;
174
- }
175
153
  }
176
154
 
177
155
  function normalizeAndClampAngle(angle: number): number {
@@ -0,0 +1,69 @@
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 IconWidgetProps = 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
+ /** Data url to display as icon */
16
+ icon: string;
17
+ /** Tooltip label */
18
+ label?: string;
19
+ /** Icon color, a CSS Color string */
20
+ color?: string;
21
+ /** Callback when the widget is clicked */
22
+ onClick?: () => void;
23
+ };
24
+
25
+ /**
26
+ * A generic widget that displays a button with icon or text content.
27
+ */
28
+ export class IconWidget extends Widget<IconWidgetProps> {
29
+ static defaultProps: Required<IconWidgetProps> = {
30
+ ...Widget.defaultProps,
31
+ id: 'icon',
32
+ placement: 'top-left',
33
+ viewId: null,
34
+ icon: '',
35
+ label: '',
36
+ color: '',
37
+ onClick: undefined!
38
+ };
39
+
40
+ className = '';
41
+ placement: WidgetPlacement = 'top-left';
42
+
43
+ constructor(props: IconWidgetProps) {
44
+ super(props);
45
+ this.setProps(this.props);
46
+ }
47
+
48
+ setProps(props: Partial<IconWidgetProps>) {
49
+ this.placement = props.placement ?? this.placement;
50
+ this.viewId = props.viewId;
51
+ super.setProps(props);
52
+ }
53
+
54
+ onRenderHTML(rootElement: HTMLElement): void {
55
+ const {className, style, icon, color, label, onClick} = this.props;
56
+
57
+ render(
58
+ <IconButton
59
+ className={className}
60
+ style={style as JSX.CSSProperties}
61
+ color={color}
62
+ icon={icon}
63
+ label={label}
64
+ onClick={onClick}
65
+ />,
66
+ rootElement
67
+ );
68
+ }
69
+ }
package/src/index.ts CHANGED
@@ -15,20 +15,23 @@ export {GeocoderWidget as _GeocoderWidget} from './geocoder-widget';
15
15
  // View widgets
16
16
  export {FullscreenWidget} from './fullscreen-widget';
17
17
  export {SplitterWidget as _SplitterWidget} from './splitter-widget';
18
- export {ViewSelectorWidget as _ViewSelectorWidget} from './view-selector-widget';
19
18
 
20
19
  // Information widgets
21
- export {InfoWidget as _InfoWidget} from './info-widget';
22
- export {ContextMenuWidget as _ContextMenuWidget} from './context-menu-widget';
20
+ export {InfoWidget} from './info-widget';
21
+ export {PopupWidget} from './popup-widget';
22
+ export {ContextMenuWidget} from './context-menu-widget';
23
+ export {ScrollbarWidget} from './scrollbar-widget';
23
24
 
24
25
  // Control widgets
26
+ export {IconWidget} from './icon-widget';
27
+ export {ToggleWidget} from './toggle-widget';
28
+ export {SelectorWidget} from './selector-widget';
25
29
  export {TimelineWidget as _TimelineWidget} from './timeline-widget';
26
30
 
27
31
  // Utility widgets
28
32
  export {ScreenshotWidget} from './screenshot-widget';
29
- export {ThemeWidget as _ThemeWidget} from './theme-widget';
30
- export {LoadingWidget as _LoadingWidget} from './loading-widget';
31
- export {FpsWidget as _FpsWidget} from './fps-widget';
33
+ export {ThemeWidget} from './theme-widget';
34
+ export {LoadingWidget} from './loading-widget';
32
35
  export {StatsWidget as _StatsWidget} from './stats-widget';
33
36
 
34
37
  export type {FullscreenWidgetProps} from './fullscreen-widget';
@@ -38,16 +41,19 @@ export type {ScreenshotWidgetProps} from './screenshot-widget';
38
41
  export type {ResetViewWidgetProps} from './reset-view-widget';
39
42
  export type {GeocoderWidgetProps} from './geocoder-widget';
40
43
  export type {LoadingWidgetProps} from './loading-widget';
41
- export type {FpsWidgetProps} from './fps-widget';
44
+ export type {IconWidgetProps} from './icon-widget';
45
+ export type {ToggleWidgetProps} from './toggle-widget';
42
46
  export type {ScaleWidgetProps} from './scale-widget';
43
47
  export type {ThemeWidgetProps} from './theme-widget';
44
48
  export type {InfoWidgetProps} from './info-widget';
49
+ export type {PopupWidgetProps} from './popup-widget';
45
50
  export type {StatsWidgetProps} from './stats-widget';
46
51
  export type {ContextMenuWidgetProps} from './context-menu-widget';
47
52
  export type {SplitterWidgetProps} from './splitter-widget';
48
53
  export type {TimelineWidgetProps} from './timeline-widget';
49
- export type {ViewSelectorWidgetProps} from './view-selector-widget';
54
+ export type {SelectorWidgetProps} from './selector-widget';
50
55
  export type {GimbalWidgetProps} from './gimbal-widget';
56
+ export type {ContentBounds, ScrollbarWidgetProps, ScrollbarDecoration} from './scrollbar-widget';
51
57
 
52
58
  export {LightTheme, DarkTheme, LightGlassTheme, DarkGlassTheme} from './themes';
53
59
  export type {DeckWidgetTheme} from './themes';
@@ -55,16 +61,17 @@ export type {DeckWidgetTheme} from './themes';
55
61
  // Experimental preact components
56
62
  export {ButtonGroup as _ButtonGroup, type ButtonGroupProps} from './lib/components/button-group';
57
63
  export {IconButton as _IconButton, type IconButtonProps} from './lib/components/icon-button';
58
- export {
59
- GroupedIconButton as _GroupedIconButton,
60
- type GroupedIconButtonProps
61
- } from './lib/components/grouped-icon-button';
62
64
  export {
63
65
  DropdownMenu as _DropdownMenu,
64
- type DropdownMenuProps
66
+ type DropdownMenuProps,
67
+ SimpleMenu as _SimpleMenu,
68
+ type SimpleMenuProps
65
69
  } from './lib/components/dropdown-menu';
66
- export {SimpleMenu as _SimpleMenu, type SimpleMenuProps} from './lib/components/simple-menu';
67
- export {IconMenu as _IconMenu, type IconMenuProps} from './lib/components/icon-menu';
70
+ export {
71
+ RangeInput as _RangeInput,
72
+ type RangeInputProps,
73
+ type RangeInputDecoration
74
+ } from './lib/components/range-input';
68
75
 
69
76
  // Experimental geocoders. May be removed, use at your own risk!
70
77
  export {type Geocoder} from './lib/geocode/geocoder';