+
+
+
+
diff --git a/src/components/scale-control.js b/src/components/scale-control.js
new file mode 100644
index 00000000..be4c3ed5
--- /dev/null
+++ b/src/components/scale-control.js
@@ -0,0 +1,76 @@
+// @flow
+// Copyright (c) 2015 Uber Technologies, Inc.
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+import React from 'react';
+import PropTypes from 'prop-types';
+import BaseControl from './base-control';
+import mapboxgl from '../utils/mapboxgl';
+
+import type {BaseControlProps} from './base-control';
+
+const propTypes = Object.assign({}, BaseControl.propTypes, {
+ maxWidth: PropTypes.number,
+ unit: PropTypes.oneOf(['imperial', 'metric', 'nautical'])
+});
+
+const defaultProps = Object.assign({}, BaseControl.defaultProps, {
+ maxWidth: 100,
+ unit: 'metric'
+});
+
+export type ScaleControlProps = BaseControlProps & {
+ maxWidth: number,
+ unit: string
+};
+
+export default class ScaleControl extends BaseControl
{
+ static propTypes = propTypes;
+ static defaultProps = defaultProps;
+
+ componentDidMount() {
+ const mapboxScaleControl = new mapboxgl.ScaleControl();
+ mapboxScaleControl._map = this._context.map;
+ mapboxScaleControl._container = this._containerRef.current;
+ this._mapboxScaleControl = mapboxScaleControl;
+
+ this._update();
+ }
+
+ _control: any = null;
+ _mapboxScaleControl: any = null;
+
+ _update() {
+ const mapboxScaleControl = this._mapboxScaleControl;
+ if (mapboxScaleControl) {
+ mapboxScaleControl.options = this.props;
+ mapboxScaleControl._onMove();
+ }
+ }
+
+ _render() {
+ this._control = this._control || (
+
+ );
+ // Likely viewport has changed
+ this._update();
+
+ return this._control;
+ }
+}
diff --git a/src/index.js b/src/index.js
index 2018f0ba..1e3050ea 100644
--- a/src/index.js
+++ b/src/index.js
@@ -32,6 +32,7 @@ export {default as Popup} from './components/popup';
export {default as FullscreenControl} from './components/fullscreen-control';
export {default as GeolocateControl} from './components/geolocate-control';
export {default as NavigationControl} from './components/navigation-control';
+export {default as ScaleControl} from './components/scale-control';
// Overlays
export {default as CanvasOverlay} from './overlays/canvas-overlay';
diff --git a/website/src/constants/pages.js b/website/src/constants/pages.js
index 03553396..e93cf795 100644
--- a/website/src/constants/pages.js
+++ b/website/src/constants/pages.js
@@ -56,7 +56,7 @@ const docPages = {
content: getDocUrl('README.md')
},
{
- name: 'What\'s New',
+ name: "What's New",
content: getDocUrl('whats-new.md')
},
{
@@ -163,6 +163,10 @@ const docPages = {
name: 'Popup',
content: getDocUrl('components/popup.md')
},
+ {
+ name: 'ScaleControl',
+ content: getDocUrl('components/scale-control.md')
+ },
{
name: 'Source',
content: getDocUrl('components/source.md')