@panoramax/web-viewer 3.2.2 → 3.2.3-develop-557df57a

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.
@@ -0,0 +1,182 @@
1
+ {
2
+ "gvs": {
3
+ "metadata_general_picid": "画像識別子",
4
+ "loading_labels_fun": [
5
+ "🦌 鹿の横断標識の検出",
6
+ "🚘 Panoramax Car ©を検索",
7
+ "☕ カフェインの注入",
8
+ "😀 笑ってください、あなたは地図に載っています!",
9
+ "🐈 猫の写真を共有する",
10
+ "😴 先延ばしを減らす",
11
+ "🫖 お茶を淹れる",
12
+ "🐧 ソースコードを公開",
13
+ "🚇 地下鉄駅の索引",
14
+ "🧹 メタデータのクリーンアップ",
15
+ "🚒 消防署の写真を送信",
16
+ "🚲 グリーンウェイズの更新",
17
+ "🚉 駅のホームのウォークスルー",
18
+ "🛰️ 衛星の探索",
19
+ "👥 ペルソナを書く",
20
+ "🐟 チップショップの場所",
21
+ "🧑‍💻 デバッグインターフェース",
22
+ "📈 統計の増加"
23
+ ],
24
+ "share_embed_docs": "埋め込み設定の詳細を読む",
25
+ "filter_zoom_in": "このフィルターを表示するには拡大してください",
26
+ "metadata_camera_type": "タイプ",
27
+ "minimize": "このウィジェットを非表示にするには、左下のボタンを使用して再度表示します",
28
+ "error_psv": "Photo Sphere Viewer が正しく読み込まれませんでした",
29
+ "error_josm": "JOSM が応答しません。実行されていて、リモートが有効になっていますか?",
30
+ "filter_user": "ユーザー",
31
+ "qualityscore_doc_3": "これは GPS の精度と画像の解像度に基づいて計算されます。プロ仕様のシステムは A 評価、360° アクション カメラは B 評価、スマートフォンは C/D/E 評価になります。",
32
+ "report_nature": {
33
+ "inappropriate": "写真が不適切です(無関係、ヌードなど)",
34
+ "": "問題の性質を選択してください…",
35
+ "blur_missing": "人の顔や車のナンバープレートが見える",
36
+ "blur_excess": "ぼかす必要のないオブジェクトがぼやけている",
37
+ "privacy": "プライベートパスまたはプロパティが表示されます",
38
+ "picture_low_quality": "画像の品質が悪い",
39
+ "mislocated": "地図上の写真の位置が適切ではありません",
40
+ "copyright": "画像は著作権を侵害しています",
41
+ "other": "その他の問題"
42
+ },
43
+ "sequence_next": "次の画像",
44
+ "sequence_play": "このシーケンスに沿ってプレイしてください",
45
+ "sequence_pause": "一時停止シーケンス",
46
+ "sequence_prev": "前の画像",
47
+ "sequence_more": "より多くのプレイオプション",
48
+ "sequence_speed": "プレイヤーのスピード",
49
+ "legend_license": "ライセンス: {l}",
50
+ "legend_title": "写真の詳細を表示",
51
+ "edit_osm": "OSMに貢献する",
52
+ "josm_live": "画像読み込み時にJOSM自動同期を有効にする",
53
+ "loading_labels_serious": [
54
+ "🗺️ マップデータの読み込み",
55
+ "🖥️ クエリAPI",
56
+ "🖼️ サムネイルを読み込んでいます",
57
+ "🔍 EXIFメタデータの分析",
58
+ "🏘️ 3Dレンダリング",
59
+ "📷 360°写真を初期化しています",
60
+ "🟠 色のバランス",
61
+ "💯 コンピューティング品質スコア ©"
62
+ ],
63
+ "error_pic": "要求された写真が見つかりませんでした",
64
+ "error_nopic": "指定された位置には画像がありません",
65
+ "error_api": "写真サーバーが利用できません",
66
+ "error_webgl": "WebGLはブラウザでサポートされていません",
67
+ "error_api_compatibility": "画像サーバーはこのビューアのバージョンと互換性がありません",
68
+ "filter_date": "日付",
69
+ "filter_date_1month": "1ヶ月",
70
+ "filter_date_1year": "1年",
71
+ "filter_user_mypics": "私の写真",
72
+ "filter_picture": "画像タイプ",
73
+ "picture_flat": "クラシック",
74
+ "picture_360": "360°",
75
+ "filter_qualityscore": "品質スコア",
76
+ "filter_qualityscore_help": "クリックして有効または無効にします",
77
+ "qualityscore_title": "品質スコアについて",
78
+ "qualityscore_doc_1": "Panoramax は、各写真に品質スコアを提供します。これにより、地図フィルタリングが簡単になり、高品質の写真の可用性を包括的に表示できます。",
79
+ "qualityscore_doc_2": "評価は A/B/C/D/E スコア (A が最高、E が最低) としてユーザーに表示され、次のスケールでグラフ表示されます。",
80
+ "qualityscore_doc_link": "品質スコアの計算の詳細については、ドキュメントをご覧ください。",
81
+ "map_background": "地図の背景",
82
+ "map_background_aerial": "航空写真",
83
+ "map_background_streets": "通り",
84
+ "map_theme": "マップテーマ",
85
+ "map_theme_default": "クラシック",
86
+ "map_theme_age": "撮影日",
87
+ "map_theme_age_1": "2歳以上",
88
+ "map_theme_age_2": "2歳未満",
89
+ "map_theme_age_3": "1歳未満",
90
+ "map_theme_age_4": "1か月未満",
91
+ "map_theme_type": "カメラタイプ",
92
+ "map_theme_score": "品質スコア",
93
+ "contrast": "より高い画像コントラストを有効にする",
94
+ "metadata": "画像メタデータ",
95
+ "metadata_general_seqid": "シーケンス識別子",
96
+ "metadata_general_picid_link": "画像のJSON説明へ移動",
97
+ "metadata_general_seqid_link": "シーケンスのJSON記述へ移動",
98
+ "metadata_general_author": "著者",
99
+ "metadata_general_license": "ライセンス",
100
+ "metadata_general_license_link": "ライセンスの完全な説明を見る",
101
+ "metadata_general_date": "撮影日",
102
+ "metadata_camera": "カメラ",
103
+ "metadata_camera_make": "メーカー",
104
+ "metadata_camera_model": "モデル",
105
+ "metadata_camera_resolution": "解像度",
106
+ "metadata_camera_focal_length": "焦点距離",
107
+ "metadata_location": "位置",
108
+ "metadata_location_longitude": "経度",
109
+ "metadata_location_latitude": "緯度",
110
+ "metadata_location_orientation": "撮影方向",
111
+ "metadata_location_precision": "位置決め精度",
112
+ "metadata_quality": "品質スコア",
113
+ "metadata_quality_help": "品質スコアについて詳しく知る",
114
+ "metadata_quality_score": "グローバルスコア",
115
+ "metadata_quality_gps_score": "ポジショニングスコア",
116
+ "metadata_quality_resolution_score": "解決スコア",
117
+ "metadata_quality_missing": "画像に値が設定されていません",
118
+ "metadata_exif": "EXIF / XMP",
119
+ "metadata_exif_name": "タグ",
120
+ "metadata_exif_value": "価値",
121
+ "report": "写真を報告する",
122
+ "report_auth": "このレポートはあなたのアカウント「{a}」を使用して送信されます",
123
+ "report_nature_label": "問題の性質",
124
+ "report_whole_sequence": "これはシーケンス全体に関係する",
125
+ "report_details": "追加の詳細",
126
+ "report_details_placeholder": "オプションとして、問題の詳細とそれがどのように関係しているかを追加できます",
127
+ "report_email": "あなたのメール",
128
+ "report_email_placeholder": "オプション",
129
+ "report_submit": "送信",
130
+ "report_wait": "レポートを送信しています…",
131
+ "report_success": "レポートは正常に送信されました。できるだけ早く確認されます。",
132
+ "report_failure": "レポートの作成中にエラーが発生しました: {e}。しばらくしてからもう一度お試しください。",
133
+ "zoom": "ズーム",
134
+ "zoomOut": "ズームアウト",
135
+ "zoomIn": "ズームイン",
136
+ "moveUp": "上に移動",
137
+ "moveDown": "下に移動",
138
+ "moveLeft": "左に移動",
139
+ "moveRight": "右に移動",
140
+ "moveMiddle": "ビューを中央に配置する",
141
+ "expand": "拡大する",
142
+ "expand_info": "ウィジェットを全ページに表示する",
143
+ "show_psv": "画像ビューアを表示する",
144
+ "show_map": "地図を表示",
145
+ "minimize_short": "隠れる",
146
+ "options": "オプション",
147
+ "filters": "フィルター",
148
+ "layers": "レイヤー",
149
+ "search": "検索",
150
+ "search_empty": "結果なし",
151
+ "search_address": "住所、市区町村などを検索",
152
+ "search_user": "ユーザー名を検索…",
153
+ "share": "共有",
154
+ "share_links": "リンク",
155
+ "share_page": "このページへのリンク",
156
+ "share_image": "HD画像",
157
+ "share_rss": "RSSフィード",
158
+ "share_rss_title": "現在表示されているマップエリア内の新しいシーケンスの RSS フィード",
159
+ "share_embed": "ウェブサイトに埋め込む",
160
+ "share_print": "印刷",
161
+ "copy": "コピー",
162
+ "copied": "コピーしました",
163
+ "error": "問題が発生しました…",
164
+ "error_click": "続く",
165
+ "error_retry": "後でもう一度お試しください"
166
+ },
167
+ "map": {
168
+ "loading": "読み込み中…",
169
+ "thumbnail": "ホバーした画像のサムネイル",
170
+ "not_public": "公開されない",
171
+ "slow_loading": "マップの読み込みが遅く、壊れているように見える場合があります"
172
+ },
173
+ "psv": {
174
+ "twoFingers": "2本の指で移動します",
175
+ "ctrlZoom": "Ctrl + スクロールで画像を拡大します",
176
+ "loadError": "画像を読み込めません"
177
+ },
178
+ "maplibre": {
179
+ "GeolocateControl.FindMyLocation": "自分の位置を表示",
180
+ "GeolocateControl.LocationNotAvailable": "GPSは利用できません"
181
+ }
182
+ }
@@ -137,7 +137,7 @@
137
137
  },
138
138
  "share_embed_docs": "深入了解嵌入設定值",
139
139
  "error_retry": "請稍後再試",
140
- "error_click": "點擊以繼續",
140
+ "error_click": "繼續",
141
141
  "legend_title": "顯示相片的詳細資料",
142
142
  "report_email_placeholder": "選填",
143
143
  "report_whole_sequence": "這個問題影響整個序列",
@@ -165,7 +165,8 @@
165
165
  "qualityscore_doc_link": "關於品質分數的計算方式,請參閱我們的文件。",
166
166
  "qualityscore_title": "關於品質分數",
167
167
  "qualityscore_doc_1": "Panoramax 為每張相片提供品質分數,這能幫助我們輕鬆地在地圖上篩選和顯示高品質相片。",
168
- "qualityscore_doc_3": "它根據 GPS 精確度和相片解析度計算得出,專業設備的等級為 A、360° 運動相機的等級為 B、智慧型手機的等級為 C/D/E。"
168
+ "qualityscore_doc_3": "它根據 GPS 精確度和相片解析度計算得出,專業設備的等級為 A、360° 運動相機的等級為 B、智慧型手機的等級為 C/D/E。",
169
+ "minimize_short": "隱藏"
169
170
  },
170
171
  "map": {
171
172
  "loading": "正在載入…",
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
@@ -336,13 +337,29 @@ export default class API {
336
337
  * Get sequence GeoJSON representation
337
338
  *
338
339
  * @param {string} seqId The sequence ID
340
+ * @param {string} [next] The next link URL (only for internals)
341
+ * @param {object} [data] The previous dataset (only for internals)
339
342
  * @returns {Promise} Resolves on sequence GeoJSON
340
343
  */
341
- async getSequenceItems(seqId) {
344
+ async getSequenceItems(seqId, next = null, data = null) {
342
345
  if(!this.isReady()) { throw new Error("API is not ready to use"); }
343
346
  try {
344
347
  API.isIdValid(seqId);
345
- return fetch(`${this._endpoints.collections}/${seqId}/items`, this._getFetchOptions()).then(res => res.json());
348
+ return fetch(
349
+ next || `${this._endpoints.collections}/${seqId}/items`,
350
+ this._getFetchOptions()
351
+ )
352
+ .then(res => res.json())
353
+ .then(res => {
354
+ // Merge previous data with current page
355
+ let nextData = res;
356
+ if(data) { nextData.features = data.features.concat(nextData.features); }
357
+
358
+ // Handle pagination for next link
359
+ const nextLink = res.links.find(l => l.rel === "next");
360
+ if(nextLink) { return this.getSequenceItems(seqId, nextLink.href, nextData); }
361
+ else { return nextData; }
362
+ });
346
363
  }
347
364
  catch(e) {
348
365
  return Promise.reject(e);
@@ -722,7 +739,7 @@ export default class API {
722
739
  * @throws {Error} If not valid
723
740
  */
724
741
  static isIdValid(id) {
725
- if(!id || typeof id !== "string" || id.length === 0) {
742
+ if(!id || typeof id !== "string" || id.length === 0 || id === BASE_PANORAMA_ID) {
726
743
  throw new Error("id should be a valid picture unique identifier");
727
744
  }
728
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,9 +274,13 @@ 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)) {
283
+ this._viewer.setPopup(false);
280
284
  this._viewer.setFocus(vals.focus);
281
285
  }
282
286
  if(vals.focus && vals.focus == "meta") {
@@ -434,11 +438,18 @@ export default class URLHash extends EventTarget {
434
438
  const prevPic = this._getCurrentHash().pic || "";
435
439
  const nextPic = this._viewer?.psv?.getPictureMetadata()?.id || "";
436
440
 
441
+ const prevFocus = this._getCurrentHash().focus || "";
442
+ const nextFocus = nextUrl.hash.includes("focus=meta") ? "meta" : (nextUrl.hash.includes("focus=map") ? "map" : "pic");
443
+
437
444
  try {
438
445
  // If different pic, add entry in browser history
439
446
  if(prevPic != nextPic) {
440
447
  window.history.pushState(window.history.state, null, nextUrl.href);
441
448
  }
449
+ // If metadata popup is open, come back to pic/map
450
+ else if(prevFocus != nextFocus && nextFocus == "meta") {
451
+ window.history.pushState(window.history.state, null, nextUrl.href);
452
+ }
442
453
  // If same pic, just update viewer params
443
454
  else {
444
455
  window.history.replaceState(window.history.state, null, nextUrl.href);
@@ -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
 
@@ -143,13 +143,13 @@ describe("setBackground", () => {
143
143
  });
144
144
 
145
145
  describe("getVisibleUsers", () => {
146
- it("works", () => {
146
+ it("works", async () => {
147
147
  const p = createParent();
148
148
  const c = document.createElement("div");
149
149
  const m = new Map(p, c);
150
150
  m.getSource = () => true;
151
151
  m.setPaintProperty = jest.fn();
152
- m._fire("load");
152
+ await m._postLoad();
153
153
  m.getLayoutProperty = () => "visible";
154
154
  expect(m.getVisibleUsers()).toStrictEqual(["geovisio"]);
155
155
  });
@@ -177,14 +177,14 @@ describe("setVisibleUsers", () => {
177
177
  m.getLayer = () => true;
178
178
  let cptlCount = 0;
179
179
  let deCalls = [];
180
- return new Promise(resolve => {
180
+ return new Promise(async (resolve) => {
181
181
  p.dispatchEvent = (e) => {
182
182
  deCalls.push(e);
183
183
  if(e.type == "map:users-changed") {
184
184
  resolve();
185
185
  }
186
186
  };
187
- m._fire("load");
187
+ await m._postLoad();
188
188
  }).then(() => {
189
189
  m.setLayoutProperty = jest.fn();
190
190
  m._createPicturesTilesLayer = () => { cptlCount++; return Promise.resolve(); };
@@ -199,7 +199,7 @@ describe("setVisibleUsers", () => {
199
199
  });
200
200
 
201
201
  describe("filterUserLayersContent", () => {
202
- it("works", () => {
202
+ it("works", async () => {
203
203
  const p = createParent();
204
204
  p._options.users = ["blabla", "geovisio"];
205
205
  const c = document.createElement("div");
@@ -207,7 +207,7 @@ describe("filterUserLayersContent", () => {
207
207
  m.getSource = () => true;
208
208
  m.setPaintProperty = jest.fn();
209
209
  m.getLayer = () => true;
210
- m._fire("load");
210
+ await m._postLoad();
211
211
  m.setFilter = jest.fn();
212
212
  m.filterUserLayersContent("pictures", [["test", "true"]]);
213
213
  expect(m.setFilter.mock.calls).toMatchSnapshot();
@@ -215,14 +215,14 @@ describe("filterUserLayersContent", () => {
215
215
  });
216
216
 
217
217
  describe("reloadLayersStyles", () => {
218
- it("works", () => {
218
+ it("works", async () => {
219
219
  const p = createParent();
220
220
  p._options.users = ["blabla", "geovisio"];
221
221
  const c = document.createElement("div");
222
222
  const m = new Map(p, c);
223
223
  m.getSource = () => true;
224
224
  m.setPaintProperty = jest.fn();
225
- m._fire("load");
225
+ await m._postLoad();
226
226
  m.setLayoutProperty = jest.fn();
227
227
  m.setPaintProperty = jest.fn();
228
228
  m.reloadLayersStyles();
@@ -319,6 +319,7 @@ describe("_onHashChange", () => {
319
319
  select: jest.fn(),
320
320
  setFocus: jest.fn(),
321
321
  setFilters: jest.fn(),
322
+ setPopup: jest.fn(),
322
323
  };
323
324
  const uh = new URLHash(v);
324
325
  uh._getCurrentHash = () => ({
@@ -383,6 +384,7 @@ describe("_onHashChange", () => {
383
384
  select: jest.fn(),
384
385
  setFocus: jest.fn(),
385
386
  setFilters: jest.fn(),
387
+ setPopup: jest.fn(),
386
388
  };
387
389
  const uh = new URLHash(v);
388
390
  uh._getCurrentHash = () => ({
@@ -391,7 +393,7 @@ describe("_onHashChange", () => {
391
393
  });
392
394
  uh._onHashChange();
393
395
 
394
- expect(v.select.mock.calls.length).toEqual(0);
396
+ expect(v.select.mock.calls).toEqual([[]]);
395
397
  expect(v.setFocus.mock.calls).toEqual([["map"]]);
396
398
  expect(v.map.jumpTo.mock.calls).toEqual([[{ center: [-12.5, 48.7], zoom: 15, pitch: 0 }]]);
397
399
  expect(v.psv.setXYZ.mock.calls.length).toEqual(0);
@@ -414,6 +416,7 @@ describe("_onHashChange", () => {
414
416
  select: jest.fn(),
415
417
  setFocus: jest.fn(),
416
418
  setFilters: jest.fn(),
419
+ setPopup: jest.fn(),
417
420
  };
418
421
  const uh = new URLHash(v);
419
422
  uh._getCurrentHash = () => ({
@@ -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>