Skip to content

Commit b0084a6

Browse files
committed
feat(widgets): use themed tooltips on button widgets
1 parent 05d9114 commit b0084a6

18 files changed

Lines changed: 68 additions & 11 deletions

docs/api-reference/widgets/overview.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ new Deck({
134134

135135
Widgets with UI (e.g. a button or panel) can be positioned relative to the deck.gl view they are controlling, via the `viewId` and `placement` props. See [WidgetProps](../core/widget.md#widgetprops).
136136

137-
Custom widgets can opt into [themed text tooltips](./widget-tooltip.md) by calling `updateWidgetTooltip` from `@deck.gl/widgets` in `onAfterRenderHTML()`.
137+
Bundled button widgets use [themed text tooltips](./widget-tooltip.md). Custom widgets can call `updateWidgetTooltip` from `onAfterRenderHTML()` to use the same renderer.
138138

139139
The `viewId` controls which HTML container will mount to, and the `placement` prop will position it relative to the container it is in, like so:
140140

docs/api-reference/widgets/widget-tooltip.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Widget Tooltip
22

3-
`updateWidgetTooltip` adds delegated, theme-aware text tooltips to a custom widget.
3+
`updateWidgetTooltip` adds delegated, theme-aware text tooltips to a widget. Bundled button widgets use it by default.
44

55
```ts
66
import {Widget} from '@deck.gl/core';
@@ -11,7 +11,7 @@ import '@deck.gl/widgets/stylesheet.css';
1111

1212
## Usage
1313

14-
Call `updateWidgetTooltip` from `onAfterRenderHTML()`. Descendants with a `data-deck-widget-tooltip` attribute become tooltip anchors.
14+
Bundled button widgets expose tooltip metadata and call the helper after rendering. In custom widgets, call `updateWidgetTooltip` from `onAfterRenderHTML()`. Descendants with a `data-deck-widget-tooltip` attribute become tooltip anchors.
1515

1616
```tsx
1717
class ResetWidget extends Widget {

docs/whats-new.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Release date: TBD
4141

4242
A new experimental `ViewLayout` system with a helper function `buildViewsFromViewLayout()` allows advanced nested and relative view layouts to be specified using a declarative layout tree.
4343

44-
The new `updateWidgetTooltip` helper lets custom widgets opt into themed text tooltips.
44+
Bundled button widgets now use themed text tooltips. Custom widgets can use the same renderer through the new `updateWidgetTooltip` helper.
4545

4646
## deck.gl v9.3
4747

modules/widgets/src/compass-widget.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import {Widget, FlyToInterpolator, WebMercatorViewport, _GlobeViewport} from '@deck.gl/core';
66
import type {Viewport, WidgetPlacement, WidgetProps} from '@deck.gl/core';
77
import {render} from 'preact';
8+
import {updateWidgetTooltip} from './lib/widget-tooltip';
89

910
export type CompassWidgetProps = WidgetProps & {
1011
/** Widget positioning within the view. Default 'top-left'. */
@@ -42,6 +43,7 @@ export class CompassWidget extends Widget<CompassWidgetProps> {
4243

4344
className = 'deck-widget-compass';
4445
placement: WidgetPlacement = 'top-left';
46+
protected override onAfterRenderHTML = updateWidgetTooltip;
4547
viewports: {[id: string]: Viewport} = {};
4648

4749
constructor(props: CompassWidgetProps = {}) {
@@ -70,6 +72,8 @@ export class CompassWidget extends Widget<CompassWidgetProps> {
7072
}
7173
}}
7274
title={this.props.label}
75+
aria-label={this.props.label}
76+
data-deck-widget-tooltip={this.props.label}
7377
style={{transform: `rotateX(${rx}deg)`}}
7478
>
7579
<svg fill="none" width="100%" height="100%" viewBox="0 0 26 26">

modules/widgets/src/fullscreen-widget.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import {log, Widget, type WidgetProps, type WidgetPlacement} from '@deck.gl/core';
77
import {render} from 'preact';
88
import {IconButton} from './lib/components/icon-button';
9+
import {updateWidgetTooltip} from './lib/widget-tooltip';
910

1011
/* eslint-enable max-len */
1112

@@ -44,6 +45,7 @@ export class FullscreenWidget extends Widget<FullscreenWidgetProps> {
4445

4546
className = 'deck-widget-fullscreen';
4647
placement: WidgetPlacement = 'top-left';
48+
protected override onAfterRenderHTML = updateWidgetTooltip;
4749
fullscreen: boolean = false;
4850

4951
constructor(props: FullscreenWidgetProps = {}) {

modules/widgets/src/gimbal-widget.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import {Widget, LinearInterpolator} from '@deck.gl/core';
66
import type {Viewport, WidgetPlacement, WidgetProps} from '@deck.gl/core';
77
import {render} from 'preact';
8+
import {updateWidgetTooltip} from './lib/widget-tooltip';
89

910
export type GimbalWidgetProps = WidgetProps & {
1011
placement?: WidgetPlacement;
@@ -44,6 +45,7 @@ export class GimbalWidget extends Widget<GimbalWidgetProps> {
4445

4546
className = 'deck-widget-gimbal';
4647
placement: WidgetPlacement = 'top-left';
48+
protected override onAfterRenderHTML = updateWidgetTooltip;
4749
viewports: {[id: string]: Viewport} = {};
4850

4951
constructor(props: GimbalWidgetProps = {}) {
@@ -72,6 +74,8 @@ export class GimbalWidget extends Widget<GimbalWidgetProps> {
7274
}
7375
}}
7476
title={this.props.label}
77+
aria-label={this.props.label}
78+
data-deck-widget-tooltip={this.props.label}
7579
style={{position: 'relative', width: 26, height: 26}}
7680
>
7781
{/* Outer ring */}

modules/widgets/src/icon-widget.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {WidgetPlacement, WidgetProps} from '@deck.gl/core';
66
import {render, type JSX} from 'preact';
77
import {Widget} from '@deck.gl/core';
88
import {IconButton} from './lib/components/icon-button';
9+
import {updateWidgetTooltip} from './lib/widget-tooltip';
910

1011
export type IconWidgetProps = WidgetProps & {
1112
/** Widget positioning within the view. Default 'bottom-left'. */
@@ -39,6 +40,7 @@ export class IconWidget extends Widget<IconWidgetProps> {
3940

4041
className = '';
4142
placement: WidgetPlacement = 'top-left';
43+
protected override onAfterRenderHTML = updateWidgetTooltip;
4244

4345
constructor(props: IconWidgetProps) {
4446
super(props);

modules/widgets/src/lib/components/icon-button.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ export const IconButton = (props: IconButtonProps) => {
3333
type="button"
3434
onClick={onClick}
3535
title={label}
36+
aria-label={label}
37+
data-deck-widget-tooltip={label}
3638
>
3739
{children ? children : <div className="deck-widget-icon" style={iconStyle} />}
3840
</button>

modules/widgets/src/reset-view-widget.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {ViewStateMap, View} from '@deck.gl/core';
77
import {render} from 'preact';
88
import {Widget} from '@deck.gl/core';
99
import {IconButton} from './lib/components/icon-button';
10+
import {updateWidgetTooltip} from './lib/widget-tooltip';
1011

1112
/** @note Mirrors an internal calss in deck.gl/core. We can easily redefine it here */
1213
type ViewOrViews = View | View[] | null;
@@ -51,6 +52,7 @@ export class ResetViewWidget<ViewsT extends ViewOrViews = null> extends Widget<
5152

5253
className = 'deck-widget-reset-view';
5354
placement: WidgetPlacement = 'top-left';
55+
protected override onAfterRenderHTML = updateWidgetTooltip;
5456

5557
constructor(props: ResetViewWidgetProps<ViewsT> = {}) {
5658
super(props);

modules/widgets/src/screenshot-widget.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {WidgetPlacement, WidgetProps} from '@deck.gl/core';
77
import {render} from 'preact';
88
import {Widget} from '@deck.gl/core';
99
import {IconButton} from './lib/components/icon-button';
10+
import {updateWidgetTooltip} from './lib/widget-tooltip';
1011

1112
/** Properties for the ScreenshotWidget */
1213
export type ScreenshotWidgetProps = WidgetProps & {
@@ -42,6 +43,7 @@ export class ScreenshotWidget extends Widget<ScreenshotWidgetProps> {
4243

4344
className = 'deck-widget-screenshot';
4445
placement: WidgetPlacement = 'top-left';
46+
protected override onAfterRenderHTML = updateWidgetTooltip;
4547

4648
constructor(props: ScreenshotWidgetProps = {}) {
4749
super(props);

0 commit comments

Comments
 (0)