@panoramax/web-viewer 3.2.2-develop-28ebe482 → 3.2.2-develop-ecfae3f0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panoramax/web-viewer",
3
- "version": "3.2.2-develop-28ebe482",
3
+ "version": "3.2.2-develop-ecfae3f0",
4
4
  "description": "Panoramax web viewer for geolocated pictures",
5
5
  "main": "build/index.js",
6
6
  "author": "Panoramax team",
package/src/Viewer.js CHANGED
@@ -192,8 +192,8 @@ class Viewer extends CoreView {
192
192
  const onceStuffReady = () => {
193
193
  this._widgets = new Widgets(this, this._options.widgets);
194
194
 
195
- // Hide mini component if small width
196
- if(this.map && this.isWidthSmall()) {
195
+ // Hide mini component if no selected picture
196
+ if(this.map && !this._options.selectedPicture) {
197
197
  this.setUnfocusedVisible(false);
198
198
  }
199
199
 
@@ -347,8 +347,11 @@ class Viewer extends CoreView {
347
347
  this.map._getLayerSortStyle = this._getLayerSortStyle.bind(this);
348
348
  this.addEventListener("map:users-changed", resolve, { once: true });
349
349
  this.container.classList.add("gvs-has-mini");
350
+
351
+ // Map double-click: unselect if focused, toggle focus if unfocused
350
352
  this.map.on("dblclick", () => {
351
353
  if(!this.isMapWide()) { this.setFocus("map"); }
354
+ else { this.select(); }
352
355
  });
353
356
 
354
357
  if (typeof this._options.map === "object" && this._options.map.startWide) {
@@ -1003,8 +1006,8 @@ class Viewer extends CoreView {
1003
1006
  this.dispatchEvent(event);
1004
1007
 
1005
1008
  if(this._josmListener) {
1006
- this.removeEventListener("picture-loading", this._josmListener);
1007
- this.removeEventListener("picture-loaded", this._josmListener);
1009
+ this.removeEventListener("psv:picture-loading", this._josmListener);
1010
+ this.removeEventListener("psv:picture-loaded", this._josmListener);
1008
1011
  delete this._josmListener;
1009
1012
  }
1010
1013
  return Promise.resolve();
@@ -2,7 +2,7 @@ import "./CoreView.css";
2
2
  import API from "../utils/API";
3
3
  import { getTranslations } from "../utils/I18n";
4
4
  import { DEFAULT_TILES } from "../utils/Map";
5
- import { isInIframe, isInternetFast } from "../utils/Utils";
5
+ import { BASE_PANORAMA_ID, isInIframe, isInternetFast } from "../utils/Utils";
6
6
  import PACKAGE_JSON from "../../package.json";
7
7
  import Loader from "./Loader";
8
8
 
@@ -143,6 +143,7 @@ export default class CoreView extends EventTarget {
143
143
  * @param {boolean} [force=false] Force select even if already selected
144
144
  */
145
145
  select(seqId = null, picId = null, force = false) {
146
+ if(picId === BASE_PANORAMA_ID) { picId = null; }
146
147
  const prevSeqId = this._selectedSeqId || null;
147
148
  const prevPicId = this._selectedPicId || null;
148
149
  if(!force && prevPicId == picId && prevSeqId == seqId) { return; } // Avoid running if already selected
@@ -397,20 +397,27 @@ export default class Map extends maplibregl.Map {
397
397
  this._picMarkerPreview.remove();
398
398
 
399
399
  // Show marker corresponding to selection
400
- this._picMarker
401
- .setLngLat([lon, lat])
402
- .setRotation(heading)
403
- .addTo(this);
400
+ if(lon !== undefined && lat !== undefined) {
401
+ this._picMarker
402
+ .setLngLat([lon, lat])
403
+ .setRotation(heading)
404
+ .addTo(this);
405
+ }
406
+ else {
407
+ this._picMarker.remove();
408
+ }
404
409
 
405
410
  // Update map style to see selected sequence
406
411
  this.reloadLayersStyles();
407
412
 
408
413
  // Move map to picture coordinates
409
- this.flyTo({
410
- center: [lon, lat],
411
- zoom: this.getZoom() < TILES_PICTURES_ZOOM+2 ? TILES_PICTURES_ZOOM+2 : this.getZoom(),
412
- maxDuration: 2000
413
- });
414
+ if(lon !== undefined && lat !== undefined) {
415
+ this.flyTo({
416
+ center: [lon, lat],
417
+ zoom: this.getZoom() < TILES_PICTURES_ZOOM+2 ? TILES_PICTURES_ZOOM+2 : this.getZoom(),
418
+ maxDuration: 2000
419
+ });
420
+ }
414
421
  }
415
422
 
416
423
  /**
@@ -3,7 +3,7 @@ import LoaderImgBase from "../img/loader_base.jpg";
3
3
  import LogoDead from "../img/logo_dead.svg";
4
4
  import {
5
5
  getDistance, positionToXYZ, xyzToPosition,
6
- apiFeatureToPSVNode, getRelativeHeading,
6
+ apiFeatureToPSVNode, getRelativeHeading, BASE_PANORAMA_ID,
7
7
  } from "../utils/Utils";
8
8
 
9
9
  // Photo Sphere Viewer imports
@@ -24,6 +24,17 @@ const BASE_PANORAMA = {
24
24
  rows: 1,
25
25
  tileUrl: () => null,
26
26
  };
27
+ const BASE_PANORAMA_NODE = {
28
+ id: BASE_PANORAMA_ID,
29
+ caption: "",
30
+ panorama: BASE_PANORAMA,
31
+ links: [],
32
+ gps: [0,0],
33
+ sequence: {},
34
+ sphereCorrection: {},
35
+ horizontalFov: 360,
36
+ properties: {},
37
+ };
27
38
 
28
39
  export const PSV_DEFAULT_ZOOM = 30;
29
40
  export const PSV_ANIM_DURATION = 250;
@@ -118,7 +129,7 @@ export default class Photo extends PSViewer {
118
129
  * @returns {Promise} Resolves on PSV node metadata
119
130
  */
120
131
  async _getNodeFromAPI(picId) {
121
- if(!picId) { return; }
132
+ if(!picId || picId === BASE_PANORAMA_ID) { return BASE_PANORAMA_NODE; }
122
133
 
123
134
  const picApiResponse = await fetch(
124
135
  this._parent._api.getPictureMetadataUrl(picId, this._picturesSequences[picId]),
@@ -364,7 +375,7 @@ export default class Photo extends PSViewer {
364
375
 
365
376
  /**
366
377
  * Event handler for node change in PSV.
367
- * Allows to send a custom "picture-loaded" event.
378
+ * Allows to send a custom "psv:picture-loaded" event.
368
379
  * @private
369
380
  */
370
381
  _onNodeChanged(e) {
@@ -376,7 +387,10 @@ export default class Photo extends PSViewer {
376
387
  if(e.node.id) {
377
388
  this._parent.select(e.node?.sequence?.id, e.node.id);
378
389
  const picMeta = this.getPictureMetadata();
379
- if(!picMeta) { return; }
390
+ if(!picMeta) {
391
+ this._parent.dispatchEvent(new CustomEvent("psv:picture-loaded", {detail: {}}));
392
+ return;
393
+ }
380
394
  this._prevSequence = picMeta.sequence.id;
381
395
 
382
396
  /**
@@ -453,6 +467,7 @@ export default class Photo extends PSViewer {
453
467
  * @returns {object} Picture metadata
454
468
  */
455
469
  getPictureMetadata() {
470
+ if(this._myVTour?.state?.currentNode?.id === BASE_PANORAMA_ID) { return null; }
456
471
  return this._myVTour.state.currentNode ? Object.assign({}, this._myVTour.state.currentNode) : null;
457
472
  }
458
473
 
package/src/utils/API.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { TILES_PICTURES_ZOOM } from "./Map";
2
+ import { BASE_PANORAMA_ID } from "./Utils";
2
3
 
3
4
  /**
4
5
  * API contains various utility functions to communicate with the backend
@@ -738,7 +739,7 @@ export default class API {
738
739
  * @throws {Error} If not valid
739
740
  */
740
741
  static isIdValid(id) {
741
- if(!id || typeof id !== "string" || id.length === 0) {
742
+ if(!id || typeof id !== "string" || id.length === 0 || id === BASE_PANORAMA_ID) {
742
743
  throw new Error("id should be a valid picture unique identifier");
743
744
  }
744
745
  return true;
@@ -3,6 +3,8 @@ import { getSphereCorrection, getCroppedPanoData } from "./Exif";
3
3
  import ArrowTriangleSVG from "../img/arrow_triangle.svg";
4
4
  import ArrowTurnSVG from "../img/arrow_turn.svg";
5
5
 
6
+ export const BASE_PANORAMA_ID = "geovisio-fake-id-0";
7
+
6
8
  export const COLORS = {
7
9
  BASE: "#FF6F00",
8
10
  SELECTED: "#1E88E5",
@@ -294,7 +296,20 @@ export function getNodeCaption(metadata, t) {
294
296
  */
295
297
  export function linkMapAndPhoto(parent) {
296
298
  // Switched picture
297
- const onPicLoad = e => parent.map.displayPictureMarker(e.detail.lon, e.detail.lat, parent.psv.getXY().x);
299
+ const onPicLoad = e => {
300
+ if(!e.detail.picId || e.detail.picId === BASE_PANORAMA_ID) {
301
+ parent.map.displayPictureMarker();
302
+ if(parent?.isMapWide()) {
303
+ parent?.setUnfocusedVisible(false);
304
+ }
305
+ }
306
+ else {
307
+ parent.map.displayPictureMarker(e.detail.lon, e.detail.lat, parent.psv.getXY().x);
308
+ if(parent?.isMapWide()) {
309
+ parent?.setUnfocusedVisible(true);
310
+ }
311
+ }
312
+ };
298
313
  parent.addEventListener("psv:picture-loading", onPicLoad);
299
314
  parent.addEventListener("psv:picture-loaded", onPicLoad);
300
315
 
@@ -274,6 +274,9 @@ export default class URLHash extends EventTarget {
274
274
  }
275
275
  this._viewer.select(null, picIds[0]);
276
276
  }
277
+ else {
278
+ this._viewer.select();
279
+ }
277
280
 
278
281
  // Change focus
279
282
  if(vals.focus && ["map", "pic"].includes(vals.focus)) {
@@ -1336,12 +1336,12 @@ export default class Widgets {
1336
1336
  const btnShare = createButton("gvs-share", fa(faShareNodes), this._t.gvs.share, ["gvs-btn-large"]);
1337
1337
  const pnlShare = createPanel(this, btnShare, []);
1338
1338
  pnlShare.innerHTML = `
1339
- <div class="gvs-hidden">
1339
+ <div class="gvs-hidden gvs-needs-picture">
1340
1340
  <p id="gvs-share-license" style="margin: 0 0 10px 0;"></p>
1341
1341
  </div>
1342
1342
  <h4 style="margin-top: 0">${fat(faLink)} ${this._t.gvs.share_links}</h4>
1343
1343
  <div id="gvs-share-links" class="gvs-input-btn">
1344
- <a id="gvs-share-image" class="gvs-link-btn gvs-hidden" download target="_blank">${fat(faCloudArrowDown)} ${this._t.gvs.share_image}</a>
1344
+ <a id="gvs-share-image" class="gvs-link-btn gvs-hidden gvs-needs-picture" download target="_blank">${fat(faCloudArrowDown)} ${this._t.gvs.share_image}</a>
1345
1345
  <button id="gvs-share-url" data-copy="true" style="flex-basis: 100%; flex-grow: 2; flex-shrink: 2;">${fat(faCopy)} ${this._t.gvs.share_page}</button>
1346
1346
  <button id="gvs-share-print" style="flex-basis: 100%; flex-grow: 2; flex-shrink: 2;">${fat(faPrint)} ${this._t.gvs.share_print}</button>
1347
1347
  </div>
@@ -1358,8 +1358,8 @@ export default class Widgets {
1358
1358
  <textarea id="gvs-share-iframe" readonly></textarea>
1359
1359
  <button data-input="gvs-share-iframe">${fat(faCopy)} ${this._t.gvs.copy}</button>
1360
1360
  </div>
1361
- <h4 class="gvs-hidden">${fat(faPen)} ${this._t.gvs.edit_osm}</h4>
1362
- <div class="gvs-input-btn gvs-hidden" style="justify-content: center">
1361
+ <h4 class="gvs-hidden gvs-needs-picture">${fat(faPen)} ${this._t.gvs.edit_osm}</h4>
1362
+ <div class="gvs-input-btn gvs-hidden gvs-needs-picture" style="justify-content: center">
1363
1363
  <a id="gvs-edit-id" class="gvs-link-btn" target="_blank">${fat(faLocationDot)} ${this._t.gvs.id}</a>
1364
1364
  <button id="gvs-edit-josm" title="${this._t.gvs.josm_live}">${fat(faSatelliteDish)} ${this._t.gvs.josm}</button>
1365
1365
  </div>
@@ -1391,14 +1391,20 @@ export default class Widgets {
1391
1391
  // Update picture download links
1392
1392
  this._viewer.addEventListener("psv:picture-loaded", () => {
1393
1393
  const picMeta = this._viewer.psv.getPictureMetadata();
1394
- hdLink.href = picMeta.panorama.hdUrl;
1394
+ hdLink.href = picMeta?.panorama?.hdUrl;
1395
1395
 
1396
1396
  const lblLicense = document.getElementById("gvs-share-license");
1397
1397
  lblLicense.innerHTML = picMeta?.caption?.license ? this._t.gvs.legend_license.replace("{l}", picMeta.caption.license) : "";
1398
1398
 
1399
- while(pnlShare.getElementsByClassName("gvs-hidden").length > 0) {
1400
- const h = pnlShare.getElementsByClassName("gvs-hidden")[0];
1401
- h.classList.remove("gvs-hidden");
1399
+ const picElems = pnlShare.getElementsByClassName("gvs-needs-picture");
1400
+ for(let i=0; i < picElems.length; i++) {
1401
+ const h = picElems[i];
1402
+ if(picMeta) {
1403
+ h.classList.remove("gvs-hidden");
1404
+ }
1405
+ else {
1406
+ h.classList.add("gvs-hidden");
1407
+ }
1402
1408
  }
1403
1409
  });
1404
1410
 
@@ -393,7 +393,7 @@ describe("_onHashChange", () => {
393
393
  });
394
394
  uh._onHashChange();
395
395
 
396
- expect(v.select.mock.calls.length).toEqual(0);
396
+ expect(v.select.mock.calls).toEqual([[]]);
397
397
  expect(v.setFocus.mock.calls).toEqual([["map"]]);
398
398
  expect(v.map.jumpTo.mock.calls).toEqual([[{ center: [-12.5, 48.7], zoom: 15, pitch: 0 }]]);
399
399
  expect(v.psv.setXYZ.mock.calls.length).toEqual(0);
@@ -335,12 +335,12 @@ exports[`constructor works 1`] = `
335
335
  <svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"lightbulb\\" class=\\"svg-inline--fa fa-lightbulb\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 384 512\\"><path fill=\\"currentColor\\" d=\\"M272 384c9.6-31.9 29.5-59.1 49.2-86.2c0 0 0 0 0 0c5.2-7.1 10.4-14.2 15.4-21.4c19.8-28.5 31.4-63 31.4-100.3C368 78.8 289.2 0 192 0S16 78.8 16 176c0 37.3 11.6 71.9 31.4 100.3c5 7.2 10.2 14.3 15.4 21.4c0 0 0 0 0 0c19.8 27.1 39.7 54.4 49.2 86.2l160 0zM192 512c44.2 0 80-35.8 80-80l0-16-160 0 0 16c0 44.2 35.8 80 80 80zM112 176c0 8.8-7.2 16-16 16s-16-7.2-16-16c0-61.9 50.1-112 112-112c8.8 0 16 7.2 16 16s-7.2 16-16 16c-44.2 0-80 35.8-80 80z\\"></path></svg>
336
336
  </button>
337
337
  </div><button id=\\"gvs-player-more\\" class=\\"gvs-btn gvs-widget-bg gvs-xs-hidden\\" title=\\"Plus d'options de lecture\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"ellipsis-vertical\\" class=\\"svg-inline--fa fa-ellipsis-vertical\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 128 512\\"><path fill=\\"currentColor\\" d=\\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\\"></path></svg></button></div></div><div id=\\"gvs-corner-main-top-middle\\" class=\\"gvs-corner\\"></div><div id=\\"gvs-corner-main-top-right\\" class=\\"gvs-corner\\"></div></div><div id=\\"gvs-corner-main-bottom\\" class=\\"gvs-corner-space\\"><div id=\\"gvs-corner-main-bottom-left\\" class=\\"gvs-corner\\"><div id=\\"gvs-widget-legend\\" class=\\"gvs-group gvs-widget-bg\\" title=\\"\\"><a href=\\"https://panoramax.fr/\\" target=\\"_blank\\">Panoramax</a></div></div><div id=\\"gvs-corner-main-bottom-middle\\" class=\\"gvs-corner\\"></div><div id=\\"gvs-corner-main-bottom-right\\" class=\\"gvs-corner\\"><div id=\\"gvs-widget-share\\" class=\\"gvs-group gvs-group-large gvs-group-btnpanel gvs-mobile-hidden gvs-print-hidden\\"><button id=\\"gvs-share\\" class=\\"gvs-btn gvs-widget-bg gvs-btn-large\\" title=\\"Partager\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"share-nodes\\" class=\\"svg-inline--fa fa-share-nodes\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 448 512\\"><path fill=\\"currentColor\\" d=\\"M352 224c53 0 96-43 96-96s-43-96-96-96s-96 43-96 96c0 4 .2 8 .7 11.9l-94.1 47C145.4 170.2 121.9 160 96 160c-53 0-96 43-96 96s43 96 96 96c25.9 0 49.4-10.2 66.6-26.9l94.1 47c-.5 3.9-.7 7.8-.7 11.9c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-25.9 0-49.4 10.2-66.6 26.9l-94.1-47c.5-3.9 .7-7.8 .7-11.9s-.2-8-.7-11.9l94.1-47C302.6 213.8 326.1 224 352 224z\\"></path></svg></button><div id=\\"gvs-share-panel\\" class=\\"gvs-panel gvs-widget-bg gvs-hidden\\">
338
- <div class=\\"gvs-hidden\\">
338
+ <div class=\\"gvs-hidden gvs-needs-picture\\">
339
339
  <p id=\\"gvs-share-license\\" style=\\"margin: 0 0 10px 0;\\"></p>
340
340
  </div>
341
341
  <h4 style=\\"margin-top: 0\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"link\\" class=\\"svg-inline--fa fa-link\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 640 512\\"><path fill=\\"currentColor\\" d=\\"M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z\\"></path></svg> Liens utiles</h4>
342
342
  <div id=\\"gvs-share-links\\" class=\\"gvs-input-btn\\">
343
- <a id=\\"gvs-share-image\\" class=\\"gvs-link-btn gvs-hidden\\" download=\\"\\" target=\\"_blank\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"cloud-arrow-down\\" class=\\"svg-inline--fa fa-cloud-arrow-down\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 640 512\\"><path fill=\\"currentColor\\" d=\\"M144 480C64.5 480 0 415.5 0 336c0-62.8 40.2-116.2 96.2-135.9c-.1-2.7-.2-5.4-.2-8.1c0-88.4 71.6-160 160-160c59.3 0 111 32.2 138.7 80.2C409.9 102 428.3 96 448 96c53 0 96 43 96 96c0 12.2-2.3 23.8-6.4 34.6C596 238.4 640 290.1 640 352c0 70.7-57.3 128-128 128l-368 0zm79-167l80 80c9.4 9.4 24.6 9.4 33.9 0l80-80c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-39 39L344 184c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 134.1-39-39c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9z\\"></path></svg> Image HD</a>
343
+ <a id=\\"gvs-share-image\\" class=\\"gvs-link-btn gvs-hidden gvs-needs-picture\\" download=\\"\\" target=\\"_blank\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"cloud-arrow-down\\" class=\\"svg-inline--fa fa-cloud-arrow-down\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 640 512\\"><path fill=\\"currentColor\\" d=\\"M144 480C64.5 480 0 415.5 0 336c0-62.8 40.2-116.2 96.2-135.9c-.1-2.7-.2-5.4-.2-8.1c0-88.4 71.6-160 160-160c59.3 0 111 32.2 138.7 80.2C409.9 102 428.3 96 448 96c53 0 96 43 96 96c0 12.2-2.3 23.8-6.4 34.6C596 238.4 640 290.1 640 352c0 70.7-57.3 128-128 128l-368 0zm79-167l80 80c9.4 9.4 24.6 9.4 33.9 0l80-80c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-39 39L344 184c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 134.1-39-39c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9z\\"></path></svg> Image HD</a>
344
344
  <button id=\\"gvs-share-url\\" data-copy=\\"http://localhost\\" style=\\"flex-basis: 100%; flex-grow: 2; flex-shrink: 2;\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"copy\\" class=\\"svg-inline--fa fa-copy\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 448 512\\"><path fill=\\"currentColor\\" d=\\"M208 0L332.1 0c12.7 0 24.9 5.1 33.9 14.1l67.9 67.9c9 9 14.1 21.2 14.1 33.9L448 336c0 26.5-21.5 48-48 48l-192 0c-26.5 0-48-21.5-48-48l0-288c0-26.5 21.5-48 48-48zM48 128l80 0 0 64-64 0 0 256 192 0 0-32 64 0 0 48c0 26.5-21.5 48-48 48L48 512c-26.5 0-48-21.5-48-48L0 176c0-26.5 21.5-48 48-48z\\"></path></svg> Lien de la page</button>
345
345
  <button id=\\"gvs-share-print\\" style=\\"flex-basis: 100%; flex-grow: 2; flex-shrink: 2;\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"print\\" class=\\"svg-inline--fa fa-print\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 512 512\\"><path fill=\\"currentColor\\" d=\\"M128 0C92.7 0 64 28.7 64 64l0 96 64 0 0-96 226.7 0L384 93.3l0 66.7 64 0 0-66.7c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0L128 0zM384 352l0 32 0 64-256 0 0-64 0-16 0-16 256 0zm64 32l32 0c17.7 0 32-14.3 32-32l0-96c0-35.3-28.7-64-64-64L64 192c-35.3 0-64 28.7-64 64l0 96c0 17.7 14.3 32 32 32l32 0 0 64c0 35.3 28.7 64 64 64l256 0c35.3 0 64-28.7 64-64l0-64zM432 248a24 24 0 1 1 0 48 24 24 0 1 1 0-48z\\"></path></svg> Imprimer</button>
346
346
  </div>
@@ -354,8 +354,8 @@ exports[`constructor works 1`] = `
354
354
  <textarea id=\\"gvs-share-iframe\\" readonly=\\"\\"></textarea>
355
355
  <button data-input=\\"gvs-share-iframe\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"copy\\" class=\\"svg-inline--fa fa-copy\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 448 512\\"><path fill=\\"currentColor\\" d=\\"M208 0L332.1 0c12.7 0 24.9 5.1 33.9 14.1l67.9 67.9c9 9 14.1 21.2 14.1 33.9L448 336c0 26.5-21.5 48-48 48l-192 0c-26.5 0-48-21.5-48-48l0-288c0-26.5 21.5-48 48-48zM48 128l80 0 0 64-64 0 0 256 192 0 0-32 64 0 0 48c0 26.5-21.5 48-48 48L48 512c-26.5 0-48-21.5-48-48L0 176c0-26.5 21.5-48 48-48z\\"></path></svg> Copier</button>
356
356
  </div>
357
- <h4 class=\\"gvs-hidden\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"pen\\" class=\\"svg-inline--fa fa-pen\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 512 512\\"><path fill=\\"currentColor\\" d=\\"M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z\\"></path></svg> Contribuer sur OSM</h4>
358
- <div class=\\"gvs-input-btn gvs-hidden\\" style=\\"justify-content: center\\">
357
+ <h4 class=\\"gvs-hidden gvs-needs-picture\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"pen\\" class=\\"svg-inline--fa fa-pen\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 512 512\\"><path fill=\\"currentColor\\" d=\\"M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z\\"></path></svg> Contribuer sur OSM</h4>
358
+ <div class=\\"gvs-input-btn gvs-hidden gvs-needs-picture\\" style=\\"justify-content: center\\">
359
359
  <a id=\\"gvs-edit-id\\" class=\\"gvs-link-btn\\" target=\\"_blank\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"location-dot\\" class=\\"svg-inline--fa fa-location-dot\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 384 512\\"><path fill=\\"currentColor\\" d=\\"M215.7 499.2C267 435 384 279.4 384 192C384 86 298 0 192 0S0 86 0 192c0 87.4 117 243 168.3 307.2c12.3 15.3 35.1 15.3 47.4 0zM192 128a64 64 0 1 1 0 128 64 64 0 1 1 0-128z\\"></path></svg> iD</a>
360
360
  <button id=\\"gvs-edit-josm\\" title=\\"Active la synchronisation automatique de JOSM lors du chargement d'une photo\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"satellite-dish\\" class=\\"svg-inline--fa fa-satellite-dish\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 512 512\\"><path fill=\\"currentColor\\" d=\\"M192 32c0-17.7 14.3-32 32-32C383.1 0 512 128.9 512 288c0 17.7-14.3 32-32 32s-32-14.3-32-32C448 164.3 347.7 64 224 64c-17.7 0-32-14.3-32-32zM60.6 220.6L164.7 324.7l28.4-28.4c-.7-2.6-1.1-5.4-1.1-8.3c0-17.7 14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32c-2.9 0-5.6-.4-8.3-1.1l-28.4 28.4L291.4 451.4c14.5 14.5 11.8 38.8-7.3 46.3C260.5 506.9 234.9 512 208 512C93.1 512 0 418.9 0 304c0-26.9 5.1-52.5 14.4-76.1c7.5-19 31.8-21.8 46.3-7.3zM224 96c106 0 192 86 192 192c0 17.7-14.3 32-32 32s-32-14.3-32-32c0-70.7-57.3-128-128-128c-17.7 0-32-14.3-32-32s14.3-32 32-32z\\"></path></svg> JOSM</button>
361
361
  </div>
@@ -373,12 +373,12 @@ exports[`constructor works with iframeBaseURL option 1`] = `
373
373
  <svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"lightbulb\\" class=\\"svg-inline--fa fa-lightbulb\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 384 512\\"><path fill=\\"currentColor\\" d=\\"M272 384c9.6-31.9 29.5-59.1 49.2-86.2c0 0 0 0 0 0c5.2-7.1 10.4-14.2 15.4-21.4c19.8-28.5 31.4-63 31.4-100.3C368 78.8 289.2 0 192 0S16 78.8 16 176c0 37.3 11.6 71.9 31.4 100.3c5 7.2 10.2 14.3 15.4 21.4c0 0 0 0 0 0c19.8 27.1 39.7 54.4 49.2 86.2l160 0zM192 512c44.2 0 80-35.8 80-80l0-16-160 0 0 16c0 44.2 35.8 80 80 80zM112 176c0 8.8-7.2 16-16 16s-16-7.2-16-16c0-61.9 50.1-112 112-112c8.8 0 16 7.2 16 16s-7.2 16-16 16c-44.2 0-80 35.8-80 80z\\"></path></svg>
374
374
  </button>
375
375
  </div><button id=\\"gvs-player-more\\" class=\\"gvs-btn gvs-widget-bg gvs-xs-hidden\\" title=\\"Plus d'options de lecture\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"ellipsis-vertical\\" class=\\"svg-inline--fa fa-ellipsis-vertical\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 128 512\\"><path fill=\\"currentColor\\" d=\\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\\"></path></svg></button></div></div><div id=\\"gvs-corner-main-top-middle\\" class=\\"gvs-corner\\"></div><div id=\\"gvs-corner-main-top-right\\" class=\\"gvs-corner\\"></div></div><div id=\\"gvs-corner-main-bottom\\" class=\\"gvs-corner-space\\"><div id=\\"gvs-corner-main-bottom-left\\" class=\\"gvs-corner\\"><div id=\\"gvs-widget-legend\\" class=\\"gvs-group gvs-widget-bg\\" title=\\"\\"><a href=\\"https://panoramax.fr/\\" target=\\"_blank\\">Panoramax</a></div></div><div id=\\"gvs-corner-main-bottom-middle\\" class=\\"gvs-corner\\"></div><div id=\\"gvs-corner-main-bottom-right\\" class=\\"gvs-corner\\"><div id=\\"gvs-widget-share\\" class=\\"gvs-group gvs-group-large gvs-group-btnpanel gvs-mobile-hidden gvs-print-hidden\\"><button id=\\"gvs-share\\" class=\\"gvs-btn gvs-widget-bg gvs-btn-large\\" title=\\"Partager\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"share-nodes\\" class=\\"svg-inline--fa fa-share-nodes\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 448 512\\"><path fill=\\"currentColor\\" d=\\"M352 224c53 0 96-43 96-96s-43-96-96-96s-96 43-96 96c0 4 .2 8 .7 11.9l-94.1 47C145.4 170.2 121.9 160 96 160c-53 0-96 43-96 96s43 96 96 96c25.9 0 49.4-10.2 66.6-26.9l94.1 47c-.5 3.9-.7 7.8-.7 11.9c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-25.9 0-49.4 10.2-66.6 26.9l-94.1-47c.5-3.9 .7-7.8 .7-11.9s-.2-8-.7-11.9l94.1-47C302.6 213.8 326.1 224 352 224z\\"></path></svg></button><div id=\\"gvs-share-panel\\" class=\\"gvs-panel gvs-widget-bg gvs-hidden\\">
376
- <div class=\\"gvs-hidden\\">
376
+ <div class=\\"gvs-hidden gvs-needs-picture\\">
377
377
  <p id=\\"gvs-share-license\\" style=\\"margin: 0 0 10px 0;\\"></p>
378
378
  </div>
379
379
  <h4 style=\\"margin-top: 0\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"link\\" class=\\"svg-inline--fa fa-link\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 640 512\\"><path fill=\\"currentColor\\" d=\\"M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z\\"></path></svg> Liens utiles</h4>
380
380
  <div id=\\"gvs-share-links\\" class=\\"gvs-input-btn\\">
381
- <a id=\\"gvs-share-image\\" class=\\"gvs-link-btn gvs-hidden\\" download=\\"\\" target=\\"_blank\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"cloud-arrow-down\\" class=\\"svg-inline--fa fa-cloud-arrow-down\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 640 512\\"><path fill=\\"currentColor\\" d=\\"M144 480C64.5 480 0 415.5 0 336c0-62.8 40.2-116.2 96.2-135.9c-.1-2.7-.2-5.4-.2-8.1c0-88.4 71.6-160 160-160c59.3 0 111 32.2 138.7 80.2C409.9 102 428.3 96 448 96c53 0 96 43 96 96c0 12.2-2.3 23.8-6.4 34.6C596 238.4 640 290.1 640 352c0 70.7-57.3 128-128 128l-368 0zm79-167l80 80c9.4 9.4 24.6 9.4 33.9 0l80-80c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-39 39L344 184c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 134.1-39-39c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9z\\"></path></svg> Image HD</a>
381
+ <a id=\\"gvs-share-image\\" class=\\"gvs-link-btn gvs-hidden gvs-needs-picture\\" download=\\"\\" target=\\"_blank\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"cloud-arrow-down\\" class=\\"svg-inline--fa fa-cloud-arrow-down\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 640 512\\"><path fill=\\"currentColor\\" d=\\"M144 480C64.5 480 0 415.5 0 336c0-62.8 40.2-116.2 96.2-135.9c-.1-2.7-.2-5.4-.2-8.1c0-88.4 71.6-160 160-160c59.3 0 111 32.2 138.7 80.2C409.9 102 428.3 96 448 96c53 0 96 43 96 96c0 12.2-2.3 23.8-6.4 34.6C596 238.4 640 290.1 640 352c0 70.7-57.3 128-128 128l-368 0zm79-167l80 80c9.4 9.4 24.6 9.4 33.9 0l80-80c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-39 39L344 184c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 134.1-39-39c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9z\\"></path></svg> Image HD</a>
382
382
  <button id=\\"gvs-share-url\\" data-copy=\\"http://localhost\\" style=\\"flex-basis: 100%; flex-grow: 2; flex-shrink: 2;\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"copy\\" class=\\"svg-inline--fa fa-copy\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 448 512\\"><path fill=\\"currentColor\\" d=\\"M208 0L332.1 0c12.7 0 24.9 5.1 33.9 14.1l67.9 67.9c9 9 14.1 21.2 14.1 33.9L448 336c0 26.5-21.5 48-48 48l-192 0c-26.5 0-48-21.5-48-48l0-288c0-26.5 21.5-48 48-48zM48 128l80 0 0 64-64 0 0 256 192 0 0-32 64 0 0 48c0 26.5-21.5 48-48 48L48 512c-26.5 0-48-21.5-48-48L0 176c0-26.5 21.5-48 48-48z\\"></path></svg> Lien de la page</button>
383
383
  <button id=\\"gvs-share-print\\" style=\\"flex-basis: 100%; flex-grow: 2; flex-shrink: 2;\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"print\\" class=\\"svg-inline--fa fa-print\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 512 512\\"><path fill=\\"currentColor\\" d=\\"M128 0C92.7 0 64 28.7 64 64l0 96 64 0 0-96 226.7 0L384 93.3l0 66.7 64 0 0-66.7c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0L128 0zM384 352l0 32 0 64-256 0 0-64 0-16 0-16 256 0zm64 32l32 0c17.7 0 32-14.3 32-32l0-96c0-35.3-28.7-64-64-64L64 192c-35.3 0-64 28.7-64 64l0 96c0 17.7 14.3 32 32 32l32 0 0 64c0 35.3 28.7 64 64 64l256 0c35.3 0 64-28.7 64-64l0-64zM432 248a24 24 0 1 1 0 48 24 24 0 1 1 0-48z\\"></path></svg> Imprimer</button>
384
384
  </div>
@@ -392,8 +392,8 @@ exports[`constructor works with iframeBaseURL option 1`] = `
392
392
  <textarea id=\\"gvs-share-iframe\\" readonly=\\"\\"></textarea>
393
393
  <button data-input=\\"gvs-share-iframe\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"copy\\" class=\\"svg-inline--fa fa-copy\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 448 512\\"><path fill=\\"currentColor\\" d=\\"M208 0L332.1 0c12.7 0 24.9 5.1 33.9 14.1l67.9 67.9c9 9 14.1 21.2 14.1 33.9L448 336c0 26.5-21.5 48-48 48l-192 0c-26.5 0-48-21.5-48-48l0-288c0-26.5 21.5-48 48-48zM48 128l80 0 0 64-64 0 0 256 192 0 0-32 64 0 0 48c0 26.5-21.5 48-48 48L48 512c-26.5 0-48-21.5-48-48L0 176c0-26.5 21.5-48 48-48z\\"></path></svg> Copier</button>
394
394
  </div>
395
- <h4 class=\\"gvs-hidden\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"pen\\" class=\\"svg-inline--fa fa-pen\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 512 512\\"><path fill=\\"currentColor\\" d=\\"M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z\\"></path></svg> Contribuer sur OSM</h4>
396
- <div class=\\"gvs-input-btn gvs-hidden\\" style=\\"justify-content: center\\">
395
+ <h4 class=\\"gvs-hidden gvs-needs-picture\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"pen\\" class=\\"svg-inline--fa fa-pen\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 512 512\\"><path fill=\\"currentColor\\" d=\\"M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z\\"></path></svg> Contribuer sur OSM</h4>
396
+ <div class=\\"gvs-input-btn gvs-hidden gvs-needs-picture\\" style=\\"justify-content: center\\">
397
397
  <a id=\\"gvs-edit-id\\" class=\\"gvs-link-btn\\" target=\\"_blank\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"location-dot\\" class=\\"svg-inline--fa fa-location-dot\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 384 512\\"><path fill=\\"currentColor\\" d=\\"M215.7 499.2C267 435 384 279.4 384 192C384 86 298 0 192 0S0 86 0 192c0 87.4 117 243 168.3 307.2c12.3 15.3 35.1 15.3 47.4 0zM192 128a64 64 0 1 1 0 128 64 64 0 1 1 0-128z\\"></path></svg> iD</a>
398
398
  <button id=\\"gvs-edit-josm\\" title=\\"Active la synchronisation automatique de JOSM lors du chargement d'une photo\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"satellite-dish\\" class=\\"svg-inline--fa fa-satellite-dish\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 512 512\\"><path fill=\\"currentColor\\" d=\\"M192 32c0-17.7 14.3-32 32-32C383.1 0 512 128.9 512 288c0 17.7-14.3 32-32 32s-32-14.3-32-32C448 164.3 347.7 64 224 64c-17.7 0-32-14.3-32-32zM60.6 220.6L164.7 324.7l28.4-28.4c-.7-2.6-1.1-5.4-1.1-8.3c0-17.7 14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32c-2.9 0-5.6-.4-8.3-1.1l-28.4 28.4L291.4 451.4c14.5 14.5 11.8 38.8-7.3 46.3C260.5 506.9 234.9 512 208 512C93.1 512 0 418.9 0 304c0-26.9 5.1-52.5 14.4-76.1c7.5-19 31.8-21.8 46.3-7.3zM224 96c106 0 192 86 192 192c0 17.7-14.3 32-32 32s-32-14.3-32-32c0-70.7-57.3-128-128-128c-17.7 0-32-14.3-32-32s14.3-32 32-32z\\"></path></svg> JOSM</button>
399
399
  </div>