Skip to main content

@deck.gl/widgets

Widgets are UI components around the WebGL2/WebGPU canvas to offer controls and information for a better user experience.

This module contains the following widgets:

Geospatial Widgets

Utility Widgets

Installation

Install from NPM

npm install deck.gl
# or
npm install @deck.gl/core @deck.gl/widgets
import {FullscreenWidget} from '@deck.gl/widgets';
import '@deck.gl/widgets/stylesheet.css';

new FullscreenWidget();

Include the Standalone Bundle

<script src="https://unpkg.com/deck.gl@^9.0.0/dist.min.js"></script>
<link href="https://unpkg.com/deck.gl@^9.0.0/dist/stylesheet.css" rel='stylesheet' />
<!-- or -->
<script src="https://unpkg.com/@deck.gl/core@^9.0.0/dist.min.js"></script>
<script src="https://unpkg.com/@deck.gl/widgets@^9.0.0/dist.min.js"></script>
<link href="https://unpkg.com/@deck.gl/widgets@^9.0.0/dist/stylesheet.css" rel='stylesheet' />

Using Widgets

import {Deck} from '@deck.gl/core';
import {
CompassWidget,
ZoomWidget,
FullscreenWidget,
ScreenshotWidget,
} from '@deck.gl/widgets';
import '@deck.gl/widgets/stylesheet.css';

new Deck({
initialViewState: INITIAL_VIEW_STATE,
controller: true,
layers: [
...
],
widgets: [
new ZoomWidget(),
new CompassWidget(),
new FullscreenWidget(),
new ScreenshotWidget()
]
});

The built-in widgets support both dark and light color scheme changes and can be wired up to dynamically respond to color scheme changes like so:

import {Deck} from '@deck.gl/core';
import {
CompassWidget,
ZoomWidget,
FullscreenWidget,
ScreenshotWidget,
DarkGlassTheme,
LightGlassTheme
} from '@deck.gl/widgets';
import '@deck.gl/widgets/stylesheet.css';

/* global window */
const prefersDarkScheme = window.matchMedia('(prefers-color-scheme: dark)');
const widgetTheme = prefersDarkScheme.matches ? DarkGlassTheme : LightGlassTheme;

new Deck({
initialViewState: INITIAL_VIEW_STATE,
controller: true,
layers: [ ... ],
widgets: [
new ZoomWidget({style: widgetTheme}),
new CompassWidget({style: widgetTheme}),
new FullscreenWidget({style: widgetTheme}),
new ScreenshotWidget({style: widgetTheme})
]
});

Writing new Widgets

A widget should inherit the Widget class. Here is a custom widget that shows a spinner while layers are loading:

import {Deck, Widget} from '@deck.gl/core';

class LoadingIndicator extends Widget {
element?: HTMLDivElement;
size: number;

constructor(options: {
size: number;
}) {
this.size = options.size;
}

onRenderHTML(el: HTMLElement) {
el.className = 'spinner';
el.style.width = `${this.size}px`;
// TODO - create animation for .spinner in the CSS stylesheet
}

onRedraw({layers}) {
const isVisible = layers.some(layer => !layer.isLoaded);
this.rootElement.style.display = isVisible ? 'block' : 'none';
}
}

new Deck({
widgets: [new LoadingIndicator({size: 48})]
});

Themes and Styling

deck.gl widget appearance can be customized using themes and CSS.