diff --git a/.stylelintrc b/.stylelintrc index a1c8ca89778..ed957aa8af0 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -5,6 +5,9 @@ "declaration-block-semicolon-newline-after": "always-multi-line", "block-opening-brace-space-before": "always-multi-line", "declaration-block-single-line-max-declarations": 3, - "selector-class-pattern": "mapboxgl-[a-z-]+" + "selector-class-pattern": "mapboxgl-[a-z-]+", + "at-rule-no-unknown": [true, { + "ignoreAtRules": ["svg-load"] + }] } } diff --git a/debug/debug.html b/debug/debug.html index 6e1da10f4fb..896332b3ca6 100644 --- a/debug/debug.html +++ b/debug/debug.html @@ -52,6 +52,7 @@ } })); map.addControl(new mapboxgl.ScaleControl()); +map.addControl(new mapboxgl.FullscreenControl()); map.on('load', function() { map.addSource('geojson', { diff --git a/postcss.config.js b/postcss.config.js index 33757c2ac37..bce0de8c729 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,16 @@ module.exports = { plugins: [ require('postcss-inline-svg'), - require('cssnano') + require('cssnano')({ + preset: ['default', { + svgo: { + plugins: [{ + removeViewBox: false + }, { + removeDimensions: false + }], + }, + }], + }), ] } diff --git a/src/css/mapbox-gl.css b/src/css/mapbox-gl.css index be30547d57f..8fd16c60fb0 100644 --- a/src/css/mapbox-gl.css +++ b/src/css/mapbox-gl.css @@ -16,7 +16,7 @@ } .mapboxgl-canvas-container.mapboxgl-interactive, -.mapboxgl-ctrl-group > button.mapboxgl-ctrl-compass { +.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass { cursor: -webkit-grab; cursor: -moz-grab; cursor: grab; @@ -31,7 +31,7 @@ } .mapboxgl-canvas-container.mapboxgl-interactive:active, -.mapboxgl-ctrl-group > button.mapboxgl-ctrl-compass:active { +.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active { cursor: -webkit-grabbing; cursor: -moz-grabbing; cursor: grabbing; @@ -84,9 +84,15 @@ box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1); } -.mapboxgl-ctrl-group > button { - width: 30px; - height: 30px; +@media (-ms-high-contrast: active) { + .mapboxgl-ctrl-group:not(:empty) { + box-shadow: 0 0 0 2px ButtonText; + } +} + +.mapboxgl-ctrl-group button { + width: 29px; + height: 29px; display: block; padding: 0; outline: none; @@ -96,97 +102,224 @@ cursor: pointer; } -.mapboxgl-ctrl-group > button + button { +.mapboxgl-ctrl-group button + button { border-top: 1px solid #ddd; } +.mapboxgl-ctrl button .mapboxgl-ctrl-icon { + display: block; + width: 100%; + height: 100%; + background-repeat: no-repeat; + background-position: center center; +} + +@media (-ms-high-contrast: active) { + .mapboxgl-ctrl-icon { + background-color: transparent; + } + + .mapboxgl-ctrl-group button + button { + border-top: 1px solid ButtonText; + } +} + /* https://bugzilla.mozilla.org/show_bug.cgi?id=140562 */ -.mapboxgl-ctrl > button::-moz-focus-inner { +.mapboxgl-ctrl button::-moz-focus-inner { border: 0; padding: 0; } -.mapboxgl-ctrl-group > button:focus { +.mapboxgl-ctrl-group button:focus { box-shadow: 0 0 2px 2px rgba(0, 150, 255, 1); } -.mapboxgl-ctrl > button:not(:disabled):hover { +.mapboxgl-ctrl button:disabled { + cursor: not-allowed; +} + +.mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon { + opacity: 0.25; +} + +.mapboxgl-ctrl button:not(:disabled):hover { background-color: rgba(0, 0, 0, 0.05); } -.mapboxgl-ctrl-group > button:focus:focus-visible { +.mapboxgl-ctrl-group button:focus:focus-visible { box-shadow: 0 0 2px 2px rgba(0, 150, 255, 1); } -.mapboxgl-ctrl-group > button:focus:not(:focus-visible) { +.mapboxgl-ctrl-group button:focus:not(:focus-visible) { box-shadow: none; } -.mapboxgl-ctrl-group > button:focus:first-child { +.mapboxgl-ctrl-group button:focus:first-child { border-radius: 4px 4px 0 0; } -.mapboxgl-ctrl-group > button:focus:last-child { +.mapboxgl-ctrl-group button:focus:last-child { border-radius: 0 0 4px 4px; } -.mapboxgl-ctrl-group > button:focus:only-child { +.mapboxgl-ctrl-group button:focus:only-child { border-radius: inherit; } -.mapboxgl-ctrl-icon, -.mapboxgl-ctrl-icon > .mapboxgl-ctrl-compass-arrow { - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; +.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-zoom-out.svg', fill: #333); } -.mapboxgl-ctrl-icon { - padding: 5px; +.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-zoom-in.svg', fill: #333); } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-icon-disabled { - opacity: 0.25; - border-color: #373737; +@media (-ms-high-contrast: active) { + .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-zoom-out.svg', fill: #fff); + } + + .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-zoom-in.svg', fill: #fff); + } } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-out { - background-image: svg-load('svg/mapboxgl-ctrl-zoom-out.svg'); +@media (-ms-high-contrast: black-on-white) { + .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-zoom-out.svg', fill: #000); + } + + .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-zoom-in.svg', fill: #000); + } } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-in { - background-image: svg-load('svg/mapboxgl-ctrl-zoom-in.svg'); +.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-fullscreen.svg', fill: #333); } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate::before { - background-image: svg-load('svg/mapboxgl-ctrl-geolocate.svg', fill=#333); - content: ""; - display: block; - width: 100%; - height: 100%; +.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-shrink); } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate:disabled::before { - background-image: svg-load('svg/mapboxgl-ctrl-geolocate-disabled.svg', fill=#aaa); +@media (-ms-high-contrast: active) { + .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-fullscreen.svg', fill: #fff); + } + + .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-shrink.svg', fill: #fff); + } +} + +@media (-ms-high-contrast: black-on-white) { + .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-fullscreen.svg', fill: #000); + } + + .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-shrink.svg', fill: #000); + } +} + +.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-compass.svg', fill: #333); +} + +@media (-ms-high-contrast: active) { + .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon { + @svg-load ctrl-compass-white url(svg/mapboxgl-ctrl-compass.svg) { + fill: #fff; + #south { fill: #999; } + } + + background-image: svg-inline(ctrl-compass-white); + } } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active::before { - background-image: svg-load('svg/mapboxgl-ctrl-geolocate.svg', fill=#33b5e5); +@media (-ms-high-contrast: black-on-white) { + .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon { + background-image: svg-load('svg/mapboxgl-ctrl-compass.svg', fill: #000); + } +} + +@svg-load ctrl-geolocate url(svg/mapboxgl-ctrl-geolocate.svg) { + fill: #333; + #stroke { display: none; } +} + +@svg-load ctrl-geolocate-white url(svg/mapboxgl-ctrl-geolocate.svg) { + fill: #fff; + #stroke { display: none; } +} + +@svg-load ctrl-geolocate-black url(svg/mapboxgl-ctrl-geolocate.svg) { + fill: #000; + #stroke { display: none; } } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error::before { - background-image: svg-load('svg/mapboxgl-ctrl-geolocate.svg', fill=#e58978); +@svg-load ctrl-geolocate-disabled url(svg/mapboxgl-ctrl-geolocate.svg) { + fill: #aaa; + #stroke { fill: #f00; } } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background::before { - background-image: svg-load('svg/mapboxgl-ctrl-geolocate-background.svg', fill=#33b5e5); +@svg-load ctrl-geolocate-disabled-white url(svg/mapboxgl-ctrl-geolocate.svg) { + fill: #999; + #stroke { fill: #f00; } } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error::before { - background-image: svg-load('svg/mapboxgl-ctrl-geolocate-background.svg', fill=#e54e33); +@svg-load ctrl-geolocate-disabled-black url(svg/mapboxgl-ctrl-geolocate.svg) { + fill: #666; + #stroke { fill: #f00; } } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting::before { +@svg-load ctrl-geolocate-active url(svg/mapboxgl-ctrl-geolocate.svg) { + fill: #33b5e5; + #stroke { display: none; } +} + +@svg-load ctrl-geolocate-active-error url(svg/mapboxgl-ctrl-geolocate.svg) { + fill: #e58978; + #stroke { display: none; } +} + +@svg-load ctrl-geolocate-background url(svg/mapboxgl-ctrl-geolocate.svg) { + fill: #33b5e5; + #stroke { display: none; } + #dot { display: none; } +} + +@svg-load ctrl-geolocate-background-error url(svg/mapboxgl-ctrl-geolocate.svg) { + fill: #e54e33; + #stroke { display: none; } + #dot { display: none; } +} + +.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate); +} + +.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-disabled); +} + +.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-active); +} + +.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-active-error); +} + +.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-background); +} + +.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-background-error); +} + +.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting .mapboxgl-ctrl-icon { -webkit-animation: mapboxgl-spin 2s infinite linear; -moz-animation: mapboxgl-spin 2s infinite linear; -o-animation: mapboxgl-spin 2s infinite linear; @@ -194,6 +327,42 @@ animation: mapboxgl-spin 2s infinite linear; } +@media (-ms-high-contrast: active) { + .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-white); + } + + .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-disabled-white); + } + + .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-active); + } + + .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-active-error); + } + + .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-background); + } + + .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-background-error); + } +} + +@media (-ms-high-contrast: black-on-white) { + .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-black); + } + + .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon { + background-image: svg-inline(ctrl-geolocate-disabled-black); + } +} + @-webkit-keyframes mapboxgl-spin { 0% { -webkit-transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); } @@ -219,37 +388,42 @@ 100% { transform: rotate(360deg); } } -.mapboxgl-ctrl-icon.mapboxgl-ctrl-fullscreen { - background-image: svg-load('svg/mapboxgl-ctrl-fullscreen.svg'); -} - -.mapboxgl-ctrl-icon.mapboxgl-ctrl-shrink { - background-image: svg-load('svg/mapboxgl-ctrl-shrink.svg'); -} - -.mapboxgl-ctrl-icon.mapboxgl-ctrl-compass > .mapboxgl-ctrl-compass-arrow { - width: 20px; - height: 20px; - margin: 5px; - background-image: svg-load('svg/mapboxgl-ctrl-compass.svg'); - background-repeat: no-repeat; - display: inline-block; -} - a.mapboxgl-ctrl-logo { - width: 85px; - height: 21px; - margin: 0 0 -3px -3px; + width: 88px; + height: 23px; + margin: 0 0 -4px -4px; display: block; background-repeat: no-repeat; cursor: pointer; + overflow: hidden; background-image: svg-load('svg/mapboxgl-ctrl-logo.svg'); } a.mapboxgl-ctrl-logo.mapboxgl-compact { - width: 21px; - height: 21px; - background-image: svg-load('svg/mapboxgl-ctrl-logo-compact.svg'); + width: 23px; +} + +@media (-ms-high-contrast: active) { + a.mapboxgl-ctrl-logo { + @svg-load ctrl-logo-white url(svg/mapboxgl-ctrl-logo.svg) { + #outline { opacity: 1; } + #fill { opacity: 1; } + } + + background-color: transparent; + background-image: svg-inline(ctrl-logo-white); + } +} + +@media (-ms-high-contrast: black-on-white) { + a.mapboxgl-ctrl-logo { + @svg-load ctrl-logo-black url(svg/mapboxgl-ctrl-logo.svg) { + #outline { opacity: 1; fill: #fff; stroke: #fff; } + #fill { opacity: 1; fill: #000; } + } + + background-image: svg-inline(ctrl-logo-black); + } } .mapboxgl-ctrl.mapboxgl-ctrl-attrib { @@ -321,6 +495,18 @@ a.mapboxgl-ctrl-logo.mapboxgl-compact { } } +@media screen and (-ms-high-contrast: active) { + .mapboxgl-ctrl-attrib.mapboxgl-compact::after { + background-image: svg-load('svg/mapboxgl-ctrl-attrib.svg', fill=#fff); + } +} + +@media screen and (-ms-high-contrast: black-on-white) { + .mapboxgl-ctrl-attrib.mapboxgl-compact::after { + background-image: svg-load('svg/mapboxgl-ctrl-attrib.svg'); + } +} + .mapboxgl-ctrl-attrib a { color: rgba(0, 0, 0, 0.75); text-decoration: none; diff --git a/src/css/svg/mapboxgl-ctrl-attrib.svg b/src/css/svg/mapboxgl-ctrl-attrib.svg index 3bedbb0ea6d..f96152c9d4f 100644 --- a/src/css/svg/mapboxgl-ctrl-attrib.svg +++ b/src/css/svg/mapboxgl-ctrl-attrib.svg @@ -1,3 +1,3 @@ - - + + diff --git a/src/css/svg/mapboxgl-ctrl-compass.svg b/src/css/svg/mapboxgl-ctrl-compass.svg index dd5e2a880ab..8df846a3fce 100644 --- a/src/css/svg/mapboxgl-ctrl-compass.svg +++ b/src/css/svg/mapboxgl-ctrl-compass.svg @@ -1,4 +1,4 @@ - - - - + + + + \ No newline at end of file diff --git a/src/css/svg/mapboxgl-ctrl-fullscreen.svg b/src/css/svg/mapboxgl-ctrl-fullscreen.svg index 523225231cd..724408d4ad1 100644 --- a/src/css/svg/mapboxgl-ctrl-fullscreen.svg +++ b/src/css/svg/mapboxgl-ctrl-fullscreen.svg @@ -1,3 +1,3 @@ - - + + diff --git a/src/css/svg/mapboxgl-ctrl-geolocate-background.svg b/src/css/svg/mapboxgl-ctrl-geolocate-background.svg deleted file mode 100644 index 5f25f83d86f..00000000000 --- a/src/css/svg/mapboxgl-ctrl-geolocate-background.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/css/svg/mapboxgl-ctrl-geolocate-disabled.svg b/src/css/svg/mapboxgl-ctrl-geolocate-disabled.svg deleted file mode 100644 index 697a298e039..00000000000 --- a/src/css/svg/mapboxgl-ctrl-geolocate-disabled.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/css/svg/mapboxgl-ctrl-geolocate.svg b/src/css/svg/mapboxgl-ctrl-geolocate.svg index cc907c33cc8..4b2986663dd 100644 --- a/src/css/svg/mapboxgl-ctrl-geolocate.svg +++ b/src/css/svg/mapboxgl-ctrl-geolocate.svg @@ -1,3 +1,5 @@ - - + + + + diff --git a/src/css/svg/mapboxgl-ctrl-logo-compact.svg b/src/css/svg/mapboxgl-ctrl-logo-compact.svg deleted file mode 100644 index 6a1c7e9f6d2..00000000000 --- a/src/css/svg/mapboxgl-ctrl-logo-compact.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/src/css/svg/mapboxgl-ctrl-logo.svg b/src/css/svg/mapboxgl-ctrl-logo.svg index 0be6b6fcb7c..3d24c610eb9 100644 --- a/src/css/svg/mapboxgl-ctrl-logo.svg +++ b/src/css/svg/mapboxgl-ctrl-logo.svg @@ -1 +1,20 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + diff --git a/src/css/svg/mapboxgl-ctrl-shrink.svg b/src/css/svg/mapboxgl-ctrl-shrink.svg index fd05bfdc1d7..fe6df0966ab 100644 --- a/src/css/svg/mapboxgl-ctrl-shrink.svg +++ b/src/css/svg/mapboxgl-ctrl-shrink.svg @@ -1,3 +1,3 @@ - - - + + + \ No newline at end of file diff --git a/src/css/svg/mapboxgl-ctrl-zoom-in.svg b/src/css/svg/mapboxgl-ctrl-zoom-in.svg index b26e3d16205..98fb23fab6a 100644 --- a/src/css/svg/mapboxgl-ctrl-zoom-in.svg +++ b/src/css/svg/mapboxgl-ctrl-zoom-in.svg @@ -1,3 +1,3 @@ - - + + diff --git a/src/css/svg/mapboxgl-ctrl-zoom-out.svg b/src/css/svg/mapboxgl-ctrl-zoom-out.svg index ab6e9ff222b..4af24deac52 100644 --- a/src/css/svg/mapboxgl-ctrl-zoom-out.svg +++ b/src/css/svg/mapboxgl-ctrl-zoom-out.svg @@ -1,3 +1,3 @@ - - - + + + \ No newline at end of file diff --git a/src/ui/control/fullscreen_control.js b/src/ui/control/fullscreen_control.js index f858ddc21af..a47a39c3171 100644 --- a/src/ui/control/fullscreen_control.js +++ b/src/ui/control/fullscreen_control.js @@ -29,7 +29,6 @@ class FullscreenControl { _fullscreen: boolean; _fullscreenchange: string; _fullscreenButton: HTMLElement; - _className: string; _container: HTMLElement; constructor(options: Options) { @@ -54,13 +53,12 @@ class FullscreenControl { } else if ('onmsfullscreenchange' in window.document) { this._fullscreenchange = 'MSFullscreenChange'; } - this._className = 'mapboxgl-ctrl'; } onAdd(map: Map) { this._map = map; if (!this._container) this._container = this._map.getContainer(); - this._controlContainer = DOM.create('div', `${this._className} mapboxgl-ctrl-group`); + this._controlContainer = DOM.create('div', `mapboxgl-ctrl mapboxgl-ctrl-group`); if (this._checkFullscreenSupport()) { this._setupUI(); } else { @@ -86,7 +84,8 @@ class FullscreenControl { } _setupUI() { - const button = this._fullscreenButton = DOM.create('button', (`${this._className}-icon ${this._className}-fullscreen`), this._controlContainer); + const button = this._fullscreenButton = DOM.create('button', (`mapboxgl-ctrl-fullscreen`), this._controlContainer); + DOM.create('span', `mapboxgl-ctrl-icon`, button).setAttribute('aria-hidden', true); button.type = 'button'; this._updateTitle(); this._fullscreenButton.addEventListener('click', this._onClickFullscreen); @@ -112,8 +111,8 @@ class FullscreenControl { if ((fullscreenElement === this._container) !== this._fullscreen) { this._fullscreen = !this._fullscreen; - this._fullscreenButton.classList.toggle(`${this._className}-shrink`); - this._fullscreenButton.classList.toggle(`${this._className}-fullscreen`); + this._fullscreenButton.classList.toggle(`mapboxgl-ctrl-shrink`); + this._fullscreenButton.classList.toggle(`mapboxgl-ctrl-fullscreen`); this._updateTitle(); } } diff --git a/src/ui/control/geolocate_control.js b/src/ui/control/geolocate_control.js index 7c2b59215e8..0291c6641ed 100644 --- a/src/ui/control/geolocate_control.js +++ b/src/ui/control/geolocate_control.js @@ -30,7 +30,6 @@ const defaultOptions: Options = { trackUserLocation: false, showUserLocation: true }; -const className = 'mapboxgl-ctrl'; let supportsGeolocation; @@ -116,7 +115,7 @@ class GeolocateControl extends Evented { onAdd(map: Map) { this._map = map; - this._container = DOM.create('div', `${className} ${className}-group`); + this._container = DOM.create('div', `mapboxgl-ctrl mapboxgl-ctrl-group`); checkGeolocationSupport(this._setupUI); return this._container; } @@ -291,9 +290,8 @@ class GeolocateControl extends Evented { _setupUI(supported: boolean) { this._container.addEventListener('contextmenu', (e: MouseEvent) => e.preventDefault()); - this._geolocateButton = DOM.create('button', - `${className}-icon ${className}-geolocate`, - this._container); + this._geolocateButton = DOM.create('button', `mapboxgl-ctrl-geolocate`, this._container); + DOM.create('span', `mapboxgl-ctrl-icon`, this._geolocateButton).setAttribute('aria-hidden', true); this._geolocateButton.type = 'button'; this._geolocateButton.title = 'Find my location'; this._geolocateButton.setAttribute('aria-label', 'Find my location'); diff --git a/src/ui/control/navigation_control.js b/src/ui/control/navigation_control.js index e97641715b7..8aa3a456b3c 100644 --- a/src/ui/control/navigation_control.js +++ b/src/ui/control/navigation_control.js @@ -36,10 +36,10 @@ class NavigationControl { _map: Map; options: Options; _container: HTMLElement; - _zoomInButton: HTMLElement; - _zoomOutButton: HTMLElement; + _zoomInButton: HTMLButtonElement; + _zoomOutButton: HTMLButtonElement; _compass: HTMLElement; - _compassArrow: HTMLElement; + _compassIcon: HTMLElement; _handler: DragRotateHandler; constructor(options: Options) { @@ -52,36 +52,31 @@ class NavigationControl { bindAll([ '_updateZoomButtons' ], this); - this._zoomInButton = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-in', 'Zoom in', (e) => this._map.zoomIn({}, {originalEvent: e})); - this._zoomOutButton = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-out', 'Zoom out', (e) => this._map.zoomOut({}, {originalEvent: e})); + this._zoomInButton = this._createButton('mapboxgl-ctrl-zoom-in', 'Zoom in', (e) => this._map.zoomIn({}, {originalEvent: e})); + DOM.create('span', `mapboxgl-ctrl-icon`, this._zoomInButton).setAttribute('aria-hidden', true); + this._zoomOutButton = this._createButton('mapboxgl-ctrl-zoom-out', 'Zoom out', (e) => this._map.zoomOut({}, {originalEvent: e})); + DOM.create('span', `mapboxgl-ctrl-icon`, this._zoomOutButton).setAttribute('aria-hidden', true); } if (this.options.showCompass) { bindAll([ '_rotateCompassArrow' ], this); - this._compass = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-compass', 'Reset bearing to north', (e) => { + this._compass = this._createButton('mapboxgl-ctrl-compass', 'Reset bearing to north', (e) => { if (this.options.visualizePitch) { this._map.resetNorthPitch({}, {originalEvent: e}); } else { this._map.resetNorth({}, {originalEvent: e}); } }); - this._compassArrow = DOM.create('span', 'mapboxgl-ctrl-compass-arrow', this._compass); + this._compassIcon = DOM.create('span', 'mapboxgl-ctrl-icon', this._compass); + this._compassIcon.setAttribute('aria-hidden', true); } } _updateZoomButtons() { const zoom = this._map.getZoom(); - if (zoom === this._map.getMaxZoom()) { - this._zoomInButton.classList.add('mapboxgl-ctrl-icon-disabled'); - } else { - this._zoomInButton.classList.remove('mapboxgl-ctrl-icon-disabled'); - } - if (zoom === this._map.getMinZoom()) { - this._zoomOutButton.classList.add('mapboxgl-ctrl-icon-disabled'); - } else { - this._zoomOutButton.classList.remove('mapboxgl-ctrl-icon-disabled'); - } + this._zoomInButton.disabled = zoom === this._map.getMaxZoom(); + this._zoomOutButton.disabled = zoom === this._map.getMinZoom(); } _rotateCompassArrow() { @@ -89,7 +84,7 @@ class NavigationControl { `scale(${1 / Math.pow(Math.cos(this._map.transform.pitch * (Math.PI / 180)), 0.5)}) rotateX(${this._map.transform.pitch}deg) rotateZ(${this._map.transform.angle * (180 / Math.PI)}deg)` : `rotate(${this._map.transform.angle * (180 / Math.PI)}deg)`; - this._compassArrow.style.transform = rotate; + this._compassIcon.style.transform = rotate; } onAdd(map: Map) {