@panoramax/web-viewer 3.2.3-develop-d7e5a16d → 3.2.3-develop-6257391e

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.
Files changed (221) hide show
  1. package/.gitlab-ci.yml +3 -0
  2. package/CHANGELOG.md +19 -0
  3. package/CODE_OF_CONDUCT.md +1 -1
  4. package/README.md +1 -1
  5. package/build/editor.html +10 -1
  6. package/build/index.css +2 -2
  7. package/build/index.css.map +1 -1
  8. package/build/index.html +1 -1
  9. package/build/index.js +1682 -5
  10. package/build/index.js.map +1 -1
  11. package/build/map.html +1 -1
  12. package/build/viewer.html +10 -1
  13. package/build/widgets.html +1 -0
  14. package/config/jest/mocks.js +172 -0
  15. package/config/paths.js +1 -0
  16. package/config/webpack.config.js +26 -0
  17. package/docs/03_URL_settings.md +3 -11
  18. package/docs/05_Compatibility.md +59 -76
  19. package/docs/09_Develop.md +30 -11
  20. package/docs/90_Releases.md +2 -2
  21. package/docs/images/class_diagram.drawio +28 -28
  22. package/docs/images/class_diagram.jpg +0 -0
  23. package/docs/index.md +112 -0
  24. package/docs/reference/components/core/Basic.md +153 -0
  25. package/docs/reference/components/core/CoverageMap.md +160 -0
  26. package/docs/reference/components/core/Editor.md +172 -0
  27. package/docs/reference/components/core/Viewer.md +288 -0
  28. package/docs/reference/components/layout/CorneredGrid.md +29 -0
  29. package/docs/reference/components/layout/Mini.md +45 -0
  30. package/docs/reference/components/menus/MapBackground.md +32 -0
  31. package/docs/reference/components/menus/MapFilters.md +15 -0
  32. package/docs/reference/components/menus/MapLayers.md +15 -0
  33. package/docs/reference/components/menus/MapLegend.md +15 -0
  34. package/docs/reference/components/menus/PictureLegend.md +15 -0
  35. package/docs/reference/components/menus/PictureMetadata.md +15 -0
  36. package/docs/reference/components/menus/PlayerOptions.md +15 -0
  37. package/docs/reference/components/menus/QualityScoreDoc.md +15 -0
  38. package/docs/reference/components/menus/ReportForm.md +15 -0
  39. package/docs/reference/components/menus/ShareMenu.md +15 -0
  40. package/docs/reference/components/ui/Button.md +39 -0
  41. package/docs/reference/components/ui/ButtonGroup.md +36 -0
  42. package/docs/reference/components/ui/CopyButton.md +35 -0
  43. package/docs/reference/components/ui/Grade.md +32 -0
  44. package/docs/reference/components/ui/LinkButton.md +44 -0
  45. package/docs/reference/components/ui/Loader.md +54 -0
  46. package/docs/reference/components/ui/Map.md +214 -0
  47. package/docs/reference/components/ui/MapMore.md +233 -0
  48. package/docs/reference/components/ui/Photo.md +369 -0
  49. package/docs/reference/components/ui/Popup.md +56 -0
  50. package/docs/reference/components/ui/QualityScore.md +45 -0
  51. package/docs/reference/components/ui/SearchBar.md +63 -0
  52. package/docs/reference/components/ui/TogglableGroup.md +39 -0
  53. package/docs/reference/components/ui/widgets/GeoSearch.md +32 -0
  54. package/docs/reference/components/ui/widgets/Legend.md +32 -0
  55. package/docs/reference/components/ui/widgets/MapFiltersButton.md +33 -0
  56. package/docs/reference/components/ui/widgets/MapLayersButton.md +15 -0
  57. package/docs/reference/components/ui/widgets/Player.md +32 -0
  58. package/docs/reference/components/ui/widgets/Share.md +15 -0
  59. package/docs/reference/components/ui/widgets/Zoom.md +15 -0
  60. package/docs/reference/utils/API.md +311 -0
  61. package/docs/reference/utils/InitParameters.md +67 -0
  62. package/docs/reference/utils/URLHandler.md +102 -0
  63. package/docs/reference.md +73 -0
  64. package/docs/shortcuts.md +11 -0
  65. package/docs/tutorials/aerial_imagery.md +19 -0
  66. package/docs/tutorials/authentication.md +10 -0
  67. package/docs/tutorials/custom_widgets.md +64 -0
  68. package/docs/tutorials/map_style.md +27 -0
  69. package/docs/tutorials/migrate_v4.md +122 -0
  70. package/docs/tutorials/synced_coverage.md +42 -0
  71. package/mkdocs.yml +60 -5
  72. package/package.json +10 -7
  73. package/public/editor.html +21 -29
  74. package/public/index.html +3 -3
  75. package/public/map.html +19 -18
  76. package/public/viewer.html +18 -24
  77. package/public/widgets.html +265 -0
  78. package/scripts/doc.js +77 -0
  79. package/src/components/core/Basic.css +44 -0
  80. package/src/components/core/Basic.js +258 -0
  81. package/src/components/core/CoverageMap.css +9 -0
  82. package/src/components/core/CoverageMap.js +105 -0
  83. package/src/components/core/Editor.css +23 -0
  84. package/src/components/core/Editor.js +354 -0
  85. package/src/components/core/Viewer.css +109 -0
  86. package/src/components/core/Viewer.js +707 -0
  87. package/src/components/core/index.js +11 -0
  88. package/src/components/index.js +13 -0
  89. package/src/components/layout/CorneredGrid.js +109 -0
  90. package/src/components/layout/Mini.js +117 -0
  91. package/src/components/layout/index.js +7 -0
  92. package/src/components/menus/MapBackground.js +106 -0
  93. package/src/components/menus/MapFilters.js +386 -0
  94. package/src/components/menus/MapLayers.js +143 -0
  95. package/src/components/menus/MapLegend.js +54 -0
  96. package/src/components/menus/PictureLegend.js +103 -0
  97. package/src/components/menus/PictureMetadata.js +188 -0
  98. package/src/components/menus/PlayerOptions.js +96 -0
  99. package/src/components/menus/QualityScoreDoc.js +36 -0
  100. package/src/components/menus/ReportForm.js +133 -0
  101. package/src/components/menus/Share.js +228 -0
  102. package/src/components/menus/index.js +15 -0
  103. package/src/components/styles.js +365 -0
  104. package/src/components/ui/Button.js +75 -0
  105. package/src/components/ui/ButtonGroup.css +49 -0
  106. package/src/components/ui/ButtonGroup.js +68 -0
  107. package/src/components/ui/CopyButton.js +71 -0
  108. package/src/components/ui/Grade.js +54 -0
  109. package/src/components/ui/LinkButton.js +68 -0
  110. package/src/components/ui/Loader.js +188 -0
  111. package/src/components/{Map.css → ui/Map.css} +5 -17
  112. package/src/components/{Map.js → ui/Map.js} +114 -138
  113. package/src/components/ui/MapMore.js +324 -0
  114. package/src/components/{Photo.css → ui/Photo.css} +6 -6
  115. package/src/components/{Photo.js → ui/Photo.js} +279 -90
  116. package/src/components/ui/Popup.js +145 -0
  117. package/src/components/ui/QualityScore.js +152 -0
  118. package/src/components/ui/SearchBar.js +363 -0
  119. package/src/components/ui/TogglableGroup.js +162 -0
  120. package/src/components/ui/index.js +20 -0
  121. package/src/components/ui/widgets/GeoSearch.css +21 -0
  122. package/src/components/ui/widgets/GeoSearch.js +139 -0
  123. package/src/components/ui/widgets/Legend.js +51 -0
  124. package/src/components/ui/widgets/MapFiltersButton.js +104 -0
  125. package/src/components/ui/widgets/MapLayersButton.js +79 -0
  126. package/src/components/ui/widgets/Player.css +7 -0
  127. package/src/components/ui/widgets/Player.js +148 -0
  128. package/src/components/ui/widgets/Share.js +30 -0
  129. package/src/components/ui/widgets/Zoom.js +82 -0
  130. package/src/components/ui/widgets/index.js +12 -0
  131. package/src/img/panoramax.svg +13 -0
  132. package/src/img/switch_big.svg +20 -10
  133. package/src/index.js +6 -9
  134. package/src/translations/da.json +1 -1
  135. package/src/translations/de.json +1 -1
  136. package/src/translations/en.json +5 -3
  137. package/src/translations/eo.json +1 -1
  138. package/src/translations/es.json +1 -1
  139. package/src/translations/fr.json +5 -3
  140. package/src/translations/hu.json +1 -1
  141. package/src/translations/it.json +1 -1
  142. package/src/translations/ja.json +1 -1
  143. package/src/translations/nl.json +1 -1
  144. package/src/translations/pl.json +1 -1
  145. package/src/translations/sv.json +1 -1
  146. package/src/translations/zh_Hant.json +1 -1
  147. package/src/utils/API.js +74 -42
  148. package/src/utils/InitParameters.js +354 -0
  149. package/src/utils/URLHandler.js +364 -0
  150. package/src/utils/geocoder.js +116 -0
  151. package/src/utils/{I18n.js → i18n.js} +3 -1
  152. package/src/utils/index.js +11 -0
  153. package/src/utils/{Map.js → map.js} +216 -80
  154. package/src/utils/picture.js +433 -0
  155. package/src/utils/utils.js +315 -0
  156. package/src/utils/widgets.js +93 -0
  157. package/tests/components/ui/CopyButton.test.js +52 -0
  158. package/tests/components/ui/Loader.test.js +54 -0
  159. package/tests/components/{Map.test.js → ui/Map.test.js} +19 -61
  160. package/tests/components/{Photo.test.js → ui/Photo.test.js} +89 -57
  161. package/tests/components/ui/Popup.test.js +24 -0
  162. package/tests/components/ui/QualityScore.test.js +17 -0
  163. package/tests/components/ui/SearchBar.test.js +107 -0
  164. package/tests/components/ui/__snapshots__/CopyButton.test.js.snap +34 -0
  165. package/tests/components/ui/__snapshots__/Loader.test.js.snap +56 -0
  166. package/tests/components/{__snapshots__ → ui/__snapshots__}/Map.test.js.snap +11 -38
  167. package/tests/components/{__snapshots__ → ui/__snapshots__}/Photo.test.js.snap +57 -4
  168. package/tests/components/ui/__snapshots__/Popup.test.js.snap +29 -0
  169. package/tests/components/ui/__snapshots__/QualityScore.test.js.snap +11 -0
  170. package/tests/components/ui/__snapshots__/SearchBar.test.js.snap +65 -0
  171. package/tests/utils/API.test.js +1 -14
  172. package/tests/utils/InitParameters.test.js +485 -0
  173. package/tests/utils/URLHandler.test.js +350 -0
  174. package/tests/utils/__snapshots__/URLHandler.test.js.snap +21 -0
  175. package/tests/utils/__snapshots__/picture.test.js.snap +315 -0
  176. package/tests/utils/__snapshots__/widgets.test.js.snap +19 -0
  177. package/tests/utils/geocoder.test.js +37 -0
  178. package/tests/utils/{I18n.test.js → i18n.test.js} +1 -1
  179. package/tests/utils/map.test.js +67 -0
  180. package/tests/utils/picture.test.js +745 -0
  181. package/tests/utils/utils.test.js +288 -0
  182. package/tests/utils/widgets.test.js +90 -0
  183. package/docs/01_Start.md +0 -149
  184. package/docs/02_Usage.md +0 -831
  185. package/docs/04_Advanced_examples.md +0 -216
  186. package/src/Editor.css +0 -37
  187. package/src/Editor.js +0 -361
  188. package/src/StandaloneMap.js +0 -114
  189. package/src/Viewer.css +0 -203
  190. package/src/Viewer.js +0 -1246
  191. package/src/components/CoreView.css +0 -70
  192. package/src/components/CoreView.js +0 -175
  193. package/src/components/Loader.css +0 -74
  194. package/src/components/Loader.js +0 -120
  195. package/src/utils/Exif.js +0 -193
  196. package/src/utils/Utils.js +0 -631
  197. package/src/utils/Widgets.js +0 -562
  198. package/src/viewer/URLHash.js +0 -469
  199. package/src/viewer/Widgets.css +0 -880
  200. package/src/viewer/Widgets.js +0 -1470
  201. package/tests/Editor.test.js +0 -126
  202. package/tests/StandaloneMap.test.js +0 -45
  203. package/tests/Viewer.test.js +0 -366
  204. package/tests/__snapshots__/Editor.test.js.snap +0 -298
  205. package/tests/__snapshots__/StandaloneMap.test.js.snap +0 -30
  206. package/tests/__snapshots__/Viewer.test.js.snap +0 -195
  207. package/tests/components/CoreView.test.js +0 -92
  208. package/tests/components/Loader.test.js +0 -38
  209. package/tests/components/__snapshots__/Loader.test.js.snap +0 -15
  210. package/tests/utils/Exif.test.js +0 -124
  211. package/tests/utils/Map.test.js +0 -113
  212. package/tests/utils/Utils.test.js +0 -300
  213. package/tests/utils/Widgets.test.js +0 -107
  214. package/tests/utils/__snapshots__/Exif.test.js.snap +0 -43
  215. package/tests/utils/__snapshots__/Utils.test.js.snap +0 -41
  216. package/tests/utils/__snapshots__/Widgets.test.js.snap +0 -44
  217. package/tests/viewer/URLHash.test.js +0 -559
  218. package/tests/viewer/Widgets.test.js +0 -127
  219. package/tests/viewer/__snapshots__/URLHash.test.js.snap +0 -108
  220. package/tests/viewer/__snapshots__/Widgets.test.js.snap +0 -403
  221. /package/tests/utils/__snapshots__/{Map.test.js.snap → geocoder.test.js.snap} +0 -0
@@ -0,0 +1,172 @@
1
+ <a name="Panoramax.components.core.Editor"></a>
2
+
3
+ ## Panoramax.components.core.Editor ⇐ [<code>Basic</code>](Basic.md/#Panoramax.components.core.Basic)
4
+ **Kind**: static class of <code>Panoramax.components.core</code>
5
+ **Extends**: [<code>Basic</code>](Basic.md/#Panoramax.components.core.Basic)
6
+ **Emits**: [<code>select</code>](Basic.md/#Panoramax.components.core.Basic+event_select), [<code>ready</code>](Basic.md/#Panoramax.components.core.Basic+event_ready), [<code>broken</code>](Basic.md/#Panoramax.components.core.Basic+event_broken)
7
+ **Element**: pnx-editor
8
+ **Properties**
9
+
10
+ | Name | Type | Description |
11
+ | --- | --- | --- |
12
+ | loader | [<code>Loader</code>](../ui/Loader.md/#Panoramax.components.ui.Loader) | The loader screen |
13
+ | api | [<code>API</code>](../../utils/API.md/#Panoramax.utils.API) | The API manager |
14
+ | map | [<code>Map</code>](../ui/Map.md/#Panoramax.components.ui.Map) | The MapLibre GL map itself |
15
+ | psv | [<code>Photo</code>](../ui/Photo.md/#Panoramax.components.ui.Photo) | The Photo Sphere Viewer component itself |
16
+
17
+
18
+ * [.Editor](#Panoramax.components.core.Editor) ⇐ [<code>Basic</code>](Basic.md/#Panoramax.components.core.Basic)
19
+ * [new Editor()](#new_Panoramax.components.core.Editor_new)
20
+ * [.properties](#Panoramax.components.core.Editor+properties) : <code>Object</code>
21
+ * [.previewSequenceHeadingChange([relHeading])](#Panoramax.components.core.Editor+previewSequenceHeadingChange)
22
+ * [.onceReady()](Basic.md/#Panoramax.components.core.Basic+onceReady) ⇒ <code>Promise</code>
23
+ * [.onceAPIReady()](Basic.md/#Panoramax.components.core.Basic+onceAPIReady) ⇒ <code>Promise</code>
24
+ * [.getClassName()](Basic.md/#Panoramax.components.core.Basic+getClassName) ⇒ <code>string</code>
25
+ * [.select([seqId], [picId], [force])](#Panoramax.components.core.Basic+select)
26
+ * [.isWidthSmall()](Basic.md/#Panoramax.components.core.Basic+isWidthSmall) ⇒ <code>boolean</code>
27
+ * [.isHeightSmall()](Basic.md/#Panoramax.components.core.Basic+isHeightSmall) ⇒ <code>boolean</code>
28
+ * ["menu-opened"](Basic.md/#Panoramax.components.core.Basic+event_menu-opened)
29
+ * ["select"](Basic.md/#Panoramax.components.core.Basic+event_select)
30
+ * ["ready"](Basic.md/#Panoramax.components.core.Basic+event_ready)
31
+ * ["broken"](Basic.md/#Panoramax.components.core.Basic+event_broken)
32
+
33
+ <a name="new_Panoramax.components.core.Editor_new"></a>
34
+
35
+ ### new Editor()
36
+ Editor allows to focus on a single sequence, and preview what you edits would look like.
37
+ It shows both picture and map.
38
+
39
+ **Example**
40
+ ```html
41
+ <pnx-editor
42
+ endpoint="https://panoramax.openstreetmap.fr/"
43
+ />
44
+ ```
45
+ <a name="Panoramax.components.core.Editor+properties"></a>
46
+
47
+ ### editor.properties : <code>Object</code>
48
+ Component properties. All of [Basic properties](Basic.md/#Panoramax.components.core.Basic+properties) are available as well.
49
+
50
+ **Kind**: instance property of [<code>Editor</code>](#Panoramax.components.core.Editor)
51
+ **Mixes**: [<code>properties</code>](Basic.md/#Panoramax.components.core.Basic+properties)
52
+ **Overrides**: [<code>properties</code>](Basic.md/#Panoramax.components.core.Basic+properties)
53
+ **Properties**
54
+
55
+ | Name | Type | Default | Description |
56
+ | --- | --- | --- | --- |
57
+ | [raster] | <code>object</code> | | The MapLibre raster source for aerial background. This must be a JSON object following [MapLibre raster source definition](https://maplibre.org/maplibre-style-spec/sources/#raster). |
58
+ | [background] | <code>string</code> | <code>&quot;streets&quot;</code> | Choose default map background to display (streets or aerial, if raster aerial background available). Defaults to street. |
59
+
60
+ <a name="Panoramax.components.core.Editor+previewSequenceHeadingChange"></a>
61
+
62
+ ### editor.previewSequenceHeadingChange([relHeading])
63
+ Preview on map how the new relative heading would reflect on all pictures.
64
+ This doesn't change anything on API-side, it's just a preview.
65
+
66
+ **Kind**: instance method of [<code>Editor</code>](#Panoramax.components.core.Editor)
67
+
68
+ | Param | Type | Description |
69
+ | --- | --- | --- |
70
+ | [relHeading] | <code>number</code> | The new relative heading compared to sequence path. In degrees, between -180 and 180 (0 = front, -90 = left, 90 = right). Set to null to remove preview. |
71
+
72
+ <a name="Panoramax.components.core.Basic+onceReady"></a>
73
+
74
+ ### editor.onceReady() ⇒ <code>Promise</code>
75
+ Waits for component to have its first loading done.
76
+
77
+ Each inheriting class must override this method.
78
+
79
+ **Kind**: instance method of [<code>Editor</code>](#Panoramax.components.core.Editor)
80
+ **Fulfil**: <code>null</code> When initialization is complete.
81
+ **Reject**: <code>string</code> Error message
82
+ <a name="Panoramax.components.core.Basic+onceAPIReady"></a>
83
+
84
+ ### editor.onceAPIReady() ⇒ <code>Promise</code>
85
+ Waits for initial API setup.
86
+
87
+ **Kind**: instance method of [<code>Editor</code>](#Panoramax.components.core.Editor)
88
+ **Fulfil**: <code>null</code> When API is ready.
89
+ **Reject**: <code>string</code> Error message
90
+ <a name="Panoramax.components.core.Basic+getClassName"></a>
91
+
92
+ ### editor.getClassName() ⇒ <code>string</code>
93
+ This allows to retrieve an always correct class name.
94
+ This is crap, but avoids issues with Webpack & so on.
95
+
96
+ Each inheriting class must override this method.
97
+
98
+ **Kind**: instance method of [<code>Editor</code>](#Panoramax.components.core.Editor)
99
+ **Returns**: <code>string</code> - The class name (for example "Basic")
100
+ <a name="Panoramax.components.core.Basic+select"></a>
101
+
102
+ ### editor.select([seqId], [picId], [force])
103
+ Change the currently picture and/or sequence.
104
+ Calling the method without parameters unselects.
105
+
106
+ **Kind**: instance method of [<code>Editor</code>](#Panoramax.components.core.Editor)
107
+
108
+ | Param | Type | Default | Description |
109
+ | --- | --- | --- | --- |
110
+ | [seqId] | <code>string</code> | <code>null</code> | The sequence UUID |
111
+ | [picId] | <code>string</code> | <code>null</code> | The picture UUID |
112
+ | [force] | <code>boolean</code> | <code>false</code> | Force select even if already selected |
113
+
114
+ <a name="Panoramax.components.core.Basic+isWidthSmall"></a>
115
+
116
+ ### editor.isWidthSmall() ⇒ <code>boolean</code>
117
+ Is the view running in a small container (small embed or smartphone)
118
+
119
+ **Kind**: instance method of [<code>Editor</code>](#Panoramax.components.core.Editor)
120
+ **Returns**: <code>boolean</code> - True if container is small
121
+ <a name="Panoramax.components.core.Basic+isHeightSmall"></a>
122
+
123
+ ### editor.isHeightSmall() ⇒ <code>boolean</code>
124
+ Is the view running in a small-height container (small embed or smartphone)
125
+
126
+ **Kind**: instance method of [<code>Editor</code>](#Panoramax.components.core.Editor)
127
+ **Returns**: <code>boolean</code> - True if container height is small
128
+ <a name="Panoramax.components.core.Basic+event_menu-opened"></a>
129
+
130
+ ### "menu-opened"
131
+ Event for overlaying menu opening
132
+
133
+ **Kind**: event emitted by [<code>Editor</code>](#Panoramax.components.core.Editor)
134
+ **Properties**
135
+
136
+ | Name | Type | Description |
137
+ | --- | --- | --- |
138
+ | detail.menu | <code>Element</code> | The opened menu |
139
+
140
+ <a name="Panoramax.components.core.Basic+event_select"></a>
141
+
142
+ ### "select"
143
+ Event for sequence/picture selection
144
+
145
+ **Kind**: event emitted by [<code>Editor</code>](#Panoramax.components.core.Editor)
146
+ **Properties**
147
+
148
+ | Name | Type | Description |
149
+ | --- | --- | --- |
150
+ | detail.seqId | <code>string</code> | The selected sequence ID |
151
+ | detail.picId | <code>string</code> | The selected picture ID (or null if not a precise picture clicked) |
152
+ | [detail.prevSeqId] | <code>string</code> | The previously selected sequence ID (or null if none) |
153
+ | [detail.prevPicId] | <code>string</code> | The previously selected picture ID (or null if none) |
154
+
155
+ <a name="Panoramax.components.core.Basic+event_ready"></a>
156
+
157
+ ### "ready"
158
+ Event for component being ready to use (API loaded)
159
+
160
+ **Kind**: event emitted by [<code>Editor</code>](#Panoramax.components.core.Editor)
161
+ <a name="Panoramax.components.core.Basic+event_broken"></a>
162
+
163
+ ### "broken"
164
+ Event for viewer failing to initially load
165
+
166
+ **Kind**: event emitted by [<code>Editor</code>](#Panoramax.components.core.Editor)
167
+ **Properties**
168
+
169
+ | Name | Type | Description |
170
+ | --- | --- | --- |
171
+ | detail.error | <code>string</code> | The user-friendly error message to display |
172
+
@@ -0,0 +1,288 @@
1
+ <a name="Panoramax.components.core.Viewer"></a>
2
+
3
+ ## Panoramax.components.core.Viewer ⇐ [<code>Basic</code>](Basic.md/#Panoramax.components.core.Basic)
4
+ **Kind**: static class of <code>Panoramax.components.core</code>
5
+ **Extends**: [<code>Basic</code>](Basic.md/#Panoramax.components.core.Basic)
6
+ **Emits**: [<code>select</code>](Basic.md/#Panoramax.components.core.Basic+event_select), [<code>ready</code>](Basic.md/#Panoramax.components.core.Basic+event_ready), [<code>broken</code>](Basic.md/#Panoramax.components.core.Basic+event_broken), [<code>focus-changed</code>](#Panoramax.components.core.Viewer+event_focus-changed)
7
+ **Element**: pnx-viewer
8
+ **Slot**: `top-left` The top-left corner
9
+ **Slot**: `top` The top middle corner
10
+ **Slot**: `top-right` The top-right corner
11
+ **Slot**: `bottom-left` The bottom-left corner
12
+ **Slot**: `bottom` The bottom middle corner
13
+ **Slot**: `bottom-right` The bottom-right corner
14
+ **Properties**
15
+
16
+ | Name | Type | Description |
17
+ | --- | --- | --- |
18
+ | loader | [<code>Loader</code>](../ui/Loader.md/#Panoramax.components.ui.Loader) | The loader screen |
19
+ | api | [<code>API</code>](../../utils/API.md/#Panoramax.utils.API) | The API manager |
20
+ | [map] | [<code>MapMore</code>](../ui/MapMore.md/#Panoramax.components.ui.MapMore) | The MapLibre GL map itself (if map is enabled) |
21
+ | psv | [<code>Photo</code>](../ui/Photo.md/#Panoramax.components.ui.Photo) | The Photo Sphere Viewer component itself |
22
+ | grid | [<code>CorneredGrid</code>](../layout/CorneredGrid.md/#Panoramax.components.layout.CorneredGrid) | The grid layout manager |
23
+ | [mini] | [<code>Mini</code>](../layout/Mini.md/#Panoramax.components.layout.Mini) | The reduced/collapsed map/photo component (if map is enabled) |
24
+ | popup | [<code>Popup</code>](../ui/Popup.md/#Panoramax.components.ui.Popup) | The popup container |
25
+ | urlHandler | [<code>URLHandler</code>](../../utils/URLHandler.md/#Panoramax.utils.URLHandler) | The URL query parameters manager |
26
+
27
+
28
+ * [.Viewer](#Panoramax.components.core.Viewer) ⇐ [<code>Basic</code>](Basic.md/#Panoramax.components.core.Basic)
29
+ * [new Viewer()](#new_Panoramax.components.core.Viewer_new)
30
+ * [.properties](#Panoramax.components.core.Viewer+properties) : <code>Object</code>
31
+ * [.onceReady()](#Panoramax.components.core.Viewer+onceReady) ⇒ <code>Promise</code>
32
+ * [.oncePSVReady()](#Panoramax.components.core.Viewer+oncePSVReady) ⇒ <code>Promise</code>
33
+ * [.onceMapReady()](#Panoramax.components.core.Viewer+onceMapReady) ⇒ <code>Promise</code>
34
+ * [.onceFirstPicLoaded()](#Panoramax.components.core.Viewer+onceFirstPicLoaded) ⇒ <code>Promise</code>
35
+ * [.setPopup(visible, [content])](#Panoramax.components.core.Viewer+setPopup)
36
+ * [.moveCenter()](#Panoramax.components.core.Viewer+moveCenter)
37
+ * [.moveLeft()](#Panoramax.components.core.Viewer+moveLeft)
38
+ * [.moveRight()](#Panoramax.components.core.Viewer+moveRight)
39
+ * [.moveUp()](#Panoramax.components.core.Viewer+moveUp)
40
+ * [.moveDown()](#Panoramax.components.core.Viewer+moveDown)
41
+ * [.isMapWide()](#Panoramax.components.core.Viewer+isMapWide) ⇒ <code>boolean</code>
42
+ * [.onceAPIReady()](Basic.md/#Panoramax.components.core.Basic+onceAPIReady) ⇒ <code>Promise</code>
43
+ * [.getClassName()](Basic.md/#Panoramax.components.core.Basic+getClassName) ⇒ <code>string</code>
44
+ * [.select([seqId], [picId], [force])](#Panoramax.components.core.Basic+select)
45
+ * [.isWidthSmall()](Basic.md/#Panoramax.components.core.Basic+isWidthSmall) ⇒ <code>boolean</code>
46
+ * [.isHeightSmall()](Basic.md/#Panoramax.components.core.Basic+isHeightSmall) ⇒ <code>boolean</code>
47
+ * ["focus-changed"](#Panoramax.components.core.Viewer+event_focus-changed)
48
+ * ["menu-opened"](Basic.md/#Panoramax.components.core.Basic+event_menu-opened)
49
+ * ["select"](Basic.md/#Panoramax.components.core.Basic+event_select)
50
+ * ["ready"](Basic.md/#Panoramax.components.core.Basic+event_ready)
51
+ * ["broken"](Basic.md/#Panoramax.components.core.Basic+event_broken)
52
+
53
+ <a name="new_Panoramax.components.core.Viewer_new"></a>
54
+
55
+ ### new Viewer()
56
+ Viewer is the main component of Panoramax JS library, showing pictures and map.
57
+
58
+ This component has a [CorneredGrid](../layout/CorneredGrid.md/#Panoramax.components.layout.CorneredGrid) layout, you can use directly any slot element to pass custom widgets.
59
+
60
+ **Example**
61
+ ```html
62
+ <!-- Basic example -->
63
+ <pnx-viewer
64
+ endpoint="https://panoramax.openstreetmap.fr/"
65
+ />
66
+
67
+ <!-- With slotted widgets -->
68
+ <pnx-viewer
69
+ endpoint="https://panoramax.openstreetmap.fr/"
70
+ >
71
+ <p slot="top-right">My custom text</p>
72
+ </pnx-viewer>
73
+
74
+ <!-- With only your custom widgets -->
75
+ <pnx-viewer
76
+ endpoint="https://panoramax.openstreetmap.fr/"
77
+ widgets="false"
78
+ map="false"
79
+ >
80
+ <p slot="top-right">My custom text</p>
81
+ </pnx-viewer>
82
+ ```
83
+ <a name="Panoramax.components.core.Viewer+properties"></a>
84
+
85
+ ### viewer.properties : <code>Object</code>
86
+ Component properties. All of [Basic properties](Basic.md/#Panoramax.components.core.Basic+properties) are available as well.
87
+
88
+ **Kind**: instance property of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
89
+ **Mixes**: [<code>properties</code>](Basic.md/#Panoramax.components.core.Basic+properties)
90
+ **Overrides**: [<code>properties</code>](Basic.md/#Panoramax.components.core.Basic+properties)
91
+ **Properties**
92
+
93
+ | Name | Type | Default | Description |
94
+ | --- | --- | --- | --- |
95
+ | [map] | <code>boolean</code> \| <code>object</code> | <code>true</code> | Should map be used (true/false), or an object with [any map option available in Map class](../ui/MapMore.md/#Panoramax.components.ui.MapMore) |
96
+ | [psv] | <code>object</code> | | [Any option to pass to Photo component](../ui/Photo.md/#Panoramax.components.ui.Photo) as an object |
97
+ | [url-parameters] | <code>string</code> | <code>true</code> | Should the component add and update URL query parameters to save viewer state ? |
98
+ | [focus] | <code>string</code> | <code>&quot;pic&quot;</code> | The component showing up as main component (pic, map) |
99
+ | [geocoder] | <code>string</code> | <code>&quot;nominatim&quot;</code> | The geocoder engine to use (nominatim, ban) |
100
+ | [widgets] | <code>string</code> | <code>true</code> | Use default set of widgets ? Set to false to avoid any widget to show up, and use slots to populate as you like. |
101
+
102
+ <a name="Panoramax.components.core.Viewer+onceReady"></a>
103
+
104
+ ### viewer.onceReady() ⇒ <code>Promise</code>
105
+ Waits for Viewer to be completely ready (map & PSV loaded, first picture also if one is wanted)
106
+
107
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
108
+ **Overrides**: [<code>onceReady</code>](Basic.md/#Panoramax.components.core.Basic+onceReady)
109
+ **Returns**: <code>Promise</code> - When viewer is ready
110
+ <a name="Panoramax.components.core.Viewer+oncePSVReady"></a>
111
+
112
+ ### viewer.oncePSVReady() ⇒ <code>Promise</code>
113
+ Waiting for Photo Sphere Viewer to be available.
114
+
115
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
116
+ **Returns**: <code>Promise</code> - When PSV is ready to use
117
+ <a name="Panoramax.components.core.Viewer+onceMapReady"></a>
118
+
119
+ ### viewer.onceMapReady() ⇒ <code>Promise</code>
120
+ Waiting for map to be available.
121
+
122
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
123
+ **Returns**: <code>Promise</code> - When map is ready to use
124
+ <a name="Panoramax.components.core.Viewer+onceFirstPicLoaded"></a>
125
+
126
+ ### viewer.onceFirstPicLoaded() ⇒ <code>Promise</code>
127
+ Waits for first picture to display on PSV.
128
+
129
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
130
+ **Fulfil**: <code>undefined</code> When picture is shown
131
+ <a name="Panoramax.components.core.Viewer+setPopup"></a>
132
+
133
+ ### viewer.setPopup(visible, [content])
134
+ Change full-page popup visibility and content
135
+
136
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
137
+
138
+ | Param | Type | Default | Description |
139
+ | --- | --- | --- | --- |
140
+ | visible | <code>boolean</code> | | True to make it appear |
141
+ | [content] | <code>string</code> \| <code>Array.&lt;Element&gt;</code> | <code>null</code> | The new popup content |
142
+
143
+ <a name="Panoramax.components.core.Viewer+moveCenter"></a>
144
+
145
+ ### viewer.moveCenter()
146
+ Move the view of main component to its center.
147
+ For map, center view on selected picture.
148
+ For picture, center view on image center.
149
+
150
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
151
+ <a name="Panoramax.components.core.Viewer+moveLeft"></a>
152
+
153
+ ### viewer.moveLeft()
154
+ Moves the view of main component slightly to the left.
155
+
156
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
157
+ <a name="Panoramax.components.core.Viewer+moveRight"></a>
158
+
159
+ ### viewer.moveRight()
160
+ Moves the view of main component slightly to the right.
161
+
162
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
163
+ <a name="Panoramax.components.core.Viewer+moveUp"></a>
164
+
165
+ ### viewer.moveUp()
166
+ Moves the view of main component slightly to the top.
167
+
168
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
169
+ <a name="Panoramax.components.core.Viewer+moveDown"></a>
170
+
171
+ ### viewer.moveDown()
172
+ Moves the view of main component slightly to the bottom.
173
+
174
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
175
+ <a name="Panoramax.components.core.Viewer+isMapWide"></a>
176
+
177
+ ### viewer.isMapWide() ⇒ <code>boolean</code>
178
+ Is the map shown as main element instead of viewer (wide map mode) ?
179
+
180
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
181
+ **Returns**: <code>boolean</code> - True if map is wider than viewer
182
+ **Throws**:
183
+
184
+ - <code>Error</code> If map is not enabled
185
+
186
+ <a name="Panoramax.components.core.Basic+onceAPIReady"></a>
187
+
188
+ ### viewer.onceAPIReady() ⇒ <code>Promise</code>
189
+ Waits for initial API setup.
190
+
191
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
192
+ **Fulfil**: <code>null</code> When API is ready.
193
+ **Reject**: <code>string</code> Error message
194
+ <a name="Panoramax.components.core.Basic+getClassName"></a>
195
+
196
+ ### viewer.getClassName() ⇒ <code>string</code>
197
+ This allows to retrieve an always correct class name.
198
+ This is crap, but avoids issues with Webpack & so on.
199
+
200
+ Each inheriting class must override this method.
201
+
202
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
203
+ **Returns**: <code>string</code> - The class name (for example "Basic")
204
+ <a name="Panoramax.components.core.Basic+select"></a>
205
+
206
+ ### viewer.select([seqId], [picId], [force])
207
+ Change the currently picture and/or sequence.
208
+ Calling the method without parameters unselects.
209
+
210
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
211
+
212
+ | Param | Type | Default | Description |
213
+ | --- | --- | --- | --- |
214
+ | [seqId] | <code>string</code> | <code>null</code> | The sequence UUID |
215
+ | [picId] | <code>string</code> | <code>null</code> | The picture UUID |
216
+ | [force] | <code>boolean</code> | <code>false</code> | Force select even if already selected |
217
+
218
+ <a name="Panoramax.components.core.Basic+isWidthSmall"></a>
219
+
220
+ ### viewer.isWidthSmall() ⇒ <code>boolean</code>
221
+ Is the view running in a small container (small embed or smartphone)
222
+
223
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
224
+ **Returns**: <code>boolean</code> - True if container is small
225
+ <a name="Panoramax.components.core.Basic+isHeightSmall"></a>
226
+
227
+ ### viewer.isHeightSmall() ⇒ <code>boolean</code>
228
+ Is the view running in a small-height container (small embed or smartphone)
229
+
230
+ **Kind**: instance method of [<code>Viewer</code>](#Panoramax.components.core.Viewer)
231
+ **Returns**: <code>boolean</code> - True if container height is small
232
+ <a name="Panoramax.components.core.Viewer+event_focus-changed"></a>
233
+
234
+ ### "focus-changed"
235
+ Event for focus change (either map or picture is shown wide)
236
+
237
+ **Kind**: event emitted by [<code>Viewer</code>](#Panoramax.components.core.Viewer)
238
+ **Properties**
239
+
240
+ | Name | Type | Description |
241
+ | --- | --- | --- |
242
+ | detail.focus | <code>string</code> | Component now focused on (map, pic) |
243
+
244
+ <a name="Panoramax.components.core.Basic+event_menu-opened"></a>
245
+
246
+ ### "menu-opened"
247
+ Event for overlaying menu opening
248
+
249
+ **Kind**: event emitted by [<code>Viewer</code>](#Panoramax.components.core.Viewer)
250
+ **Properties**
251
+
252
+ | Name | Type | Description |
253
+ | --- | --- | --- |
254
+ | detail.menu | <code>Element</code> | The opened menu |
255
+
256
+ <a name="Panoramax.components.core.Basic+event_select"></a>
257
+
258
+ ### "select"
259
+ Event for sequence/picture selection
260
+
261
+ **Kind**: event emitted by [<code>Viewer</code>](#Panoramax.components.core.Viewer)
262
+ **Properties**
263
+
264
+ | Name | Type | Description |
265
+ | --- | --- | --- |
266
+ | detail.seqId | <code>string</code> | The selected sequence ID |
267
+ | detail.picId | <code>string</code> | The selected picture ID (or null if not a precise picture clicked) |
268
+ | [detail.prevSeqId] | <code>string</code> | The previously selected sequence ID (or null if none) |
269
+ | [detail.prevPicId] | <code>string</code> | The previously selected picture ID (or null if none) |
270
+
271
+ <a name="Panoramax.components.core.Basic+event_ready"></a>
272
+
273
+ ### "ready"
274
+ Event for component being ready to use (API loaded)
275
+
276
+ **Kind**: event emitted by [<code>Viewer</code>](#Panoramax.components.core.Viewer)
277
+ <a name="Panoramax.components.core.Basic+event_broken"></a>
278
+
279
+ ### "broken"
280
+ Event for viewer failing to initially load
281
+
282
+ **Kind**: event emitted by [<code>Viewer</code>](#Panoramax.components.core.Viewer)
283
+ **Properties**
284
+
285
+ | Name | Type | Description |
286
+ | --- | --- | --- |
287
+ | detail.error | <code>string</code> | The user-friendly error message to display |
288
+
@@ -0,0 +1,29 @@
1
+ <a name="Panoramax.components.layout.CorneredGrid"></a>
2
+
3
+ ## Panoramax.components.layout.CorneredGrid ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
4
+ **Kind**: static class of <code>Panoramax.components.layout</code>
5
+ **Extends**: <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
6
+ **Element**: pnx-cornered-grid
7
+ **Slot**: `bg` The full size background component
8
+ **Slot**: `top-left` The top-left corner
9
+ **Slot**: `top` The top middle corner
10
+ **Slot**: `top-right` The top-right corner
11
+ **Slot**: `bottom-left` The bottom-left corner
12
+ **Slot**: `bottom` The bottom middle corner
13
+ **Slot**: `bottom-right` The bottom-right corner
14
+ <a name="new_Panoramax.components.layout.CorneredGrid_new"></a>
15
+
16
+ ### new CorneredGrid()
17
+ CorneredGrid layout offers a convenient way to display overlay widgets on top of a background component.
18
+ This is useful for showing buttons in corners over a map or picture display.
19
+ Grid layout is organised through many slots (background and corners) : two rows (top, bottom) and three columns (right, middle, left).
20
+
21
+ **Example**
22
+ ```html
23
+ <pnx-cornered-grid>
24
+ <pnx-map slot="bg" />
25
+ <pnx-button slot="top-left" />
26
+ <pnx-button slot="top-left" />
27
+ <pnx-legend slot="bottom" />
28
+ </pnx-cornered-grid>
29
+ ```
@@ -0,0 +1,45 @@
1
+ <a name="Panoramax.components.layout.Mini"></a>
2
+
3
+ ## Panoramax.components.layout.Mini ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
4
+ **Kind**: static class of <code>Panoramax.components.layout</code>
5
+ **Extends**: <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
6
+ **Emits**: [<code>expand</code>](#Panoramax.components.layout.Mini+event_expand)
7
+ **Element**: pnx-mini
8
+ **Slot**: `default` The component to display.
9
+
10
+ * [.Mini](#Panoramax.components.layout.Mini) ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
11
+ * [new Mini()](#new_Panoramax.components.layout.Mini_new)
12
+ * [.properties](#Panoramax.components.layout.Mini+properties) : <code>Object</code>
13
+ * ["expand"](#Panoramax.components.layout.Mini+event_expand)
14
+
15
+ <a name="new_Panoramax.components.layout.Mini_new"></a>
16
+
17
+ ### new Mini()
18
+ Mini layout allows to show a reduced or collapsed component in a corner of a main component.
19
+ For example, show a reduced map on top of a photo display.
20
+
21
+ **Example**
22
+ ```html
23
+ <pnx-mini icon=${fa(faMap)} ._parent=${viewer}>
24
+ <pnx-map />
25
+ </pnx-mini>
26
+ ```
27
+ <a name="Panoramax.components.layout.Mini+properties"></a>
28
+
29
+ ### mini.properties : <code>Object</code>
30
+ Component properties.
31
+
32
+ **Kind**: instance property of [<code>Mini</code>](#Panoramax.components.layout.Mini)
33
+ **Properties**
34
+
35
+ | Name | Type | Default | Description |
36
+ | --- | --- | --- | --- |
37
+ | [icon] | <code>string</code> | | The icon to use in collapsed button. |
38
+ | [collapsed] | <code>boolean</code> | <code>false</code> | Collapsed displays only a simple button. |
39
+
40
+ <a name="Panoramax.components.layout.Mini+event_expand"></a>
41
+
42
+ ### "expand"
43
+ Event when user ask for component expand
44
+
45
+ **Kind**: event emitted by [<code>Mini</code>](#Panoramax.components.layout.Mini)
@@ -0,0 +1,32 @@
1
+ <a name="Panoramax.components.menus.MapBackground"></a>
2
+
3
+ ## Panoramax.components.menus.MapBackground ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
4
+ **Kind**: static class of <code>Panoramax.components.menus</code>
5
+ **Extends**: <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
6
+ **Element**: pnx-map-background
7
+
8
+ * [.MapBackground](#Panoramax.components.menus.MapBackground) ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
9
+ * [new MapBackground()](#new_Panoramax.components.menus.MapBackground_new)
10
+ * [.properties](#Panoramax.components.menus.MapBackground+properties) : <code>Object</code>
11
+
12
+ <a name="new_Panoramax.components.menus.MapBackground_new"></a>
13
+
14
+ ### new MapBackground()
15
+ Map Background menu allows user to select background.
16
+
17
+ **Example**
18
+ ```html
19
+ <pnx-map-background size="sm" _parent=${viewer} />
20
+ ```
21
+ <a name="Panoramax.components.menus.MapBackground+properties"></a>
22
+
23
+ ### mapBackground.properties : <code>Object</code>
24
+ Component properties.
25
+
26
+ **Kind**: instance property of [<code>MapBackground</code>](#Panoramax.components.menus.MapBackground)
27
+ **Properties**
28
+
29
+ | Name | Type | Default | Description |
30
+ | --- | --- | --- | --- |
31
+ | [size] | <code>string</code> | <code>&quot;md&quot;</code> | The size of the button (sm, md) |
32
+
@@ -0,0 +1,15 @@
1
+ <a name="Panoramax.components.menus.MapFilters"></a>
2
+
3
+ ## Panoramax.components.menus.MapFilters ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
4
+ **Kind**: static class of <code>Panoramax.components.menus</code>
5
+ **Extends**: <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
6
+ **Element**: pnx-map-filters-menu
7
+ <a name="new_Panoramax.components.menus.MapFilters_new"></a>
8
+
9
+ ### new MapFilters()
10
+ Map Filters menu allows user to select map data they want displayed.
11
+
12
+ **Example**
13
+ ```html
14
+ <pnx-map-filters-menu user-search="" _parent=${viewer} />
15
+ ```
@@ -0,0 +1,15 @@
1
+ <a name="Panoramax.components.menus.MapLayers"></a>
2
+
3
+ ## Panoramax.components.menus.MapLayers ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
4
+ **Kind**: static class of <code>Panoramax.components.menus</code>
5
+ **Extends**: <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
6
+ **Element**: pnx-map-layers-menu
7
+ <a name="new_Panoramax.components.menus.MapLayers_new"></a>
8
+
9
+ ### new MapLayers()
10
+ Map Layers menu allows user to select background and map theme.
11
+
12
+ **Example**
13
+ ```html
14
+ <pnx-map-layers-menu _parent=${viewer} />
15
+ ```
@@ -0,0 +1,15 @@
1
+ <a name="Panoramax.components.menus.MapLegend"></a>
2
+
3
+ ## Panoramax.components.menus.MapLegend ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
4
+ **Kind**: static class of <code>Panoramax.components.menus</code>
5
+ **Extends**: <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
6
+ **Element**: pnx-map-legend
7
+ <a name="new_Panoramax.components.menus.MapLegend_new"></a>
8
+
9
+ ### new MapLegend()
10
+ Map legend displays information about map sources and Panoramax.
11
+
12
+ **Example**
13
+ ```html
14
+ <pnx-map-legend ._parent=${viewer} />
15
+ ```
@@ -0,0 +1,15 @@
1
+ <a name="Panoramax.components.menus.PictureLegend"></a>
2
+
3
+ ## Panoramax.components.menus.PictureLegend ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
4
+ **Kind**: static class of <code>Panoramax.components.menus</code>
5
+ **Extends**: <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
6
+ **Element**: pnx-picture-legend
7
+ <a name="new_Panoramax.components.menus.PictureLegend_new"></a>
8
+
9
+ ### new PictureLegend()
10
+ Picture legend shows info about picture author, capture date, address, and access to metadata popup.
11
+
12
+ **Example**
13
+ ```html
14
+ <pnx-picture-legend ._parent=${viewer} />
15
+ ```
@@ -0,0 +1,15 @@
1
+ <a name="Panoramax.components.menus.PictureMetadata"></a>
2
+
3
+ ## Panoramax.components.menus.PictureMetadata ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
4
+ **Kind**: static class of <code>Panoramax.components.menus</code>
5
+ **Extends**: <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
6
+ **Element**: pnx-picture-metadata
7
+ <a name="new_Panoramax.components.menus.PictureMetadata_new"></a>
8
+
9
+ ### new PictureMetadata()
10
+ Picture metadata displays detailed info about a single picture (ID, capture context, EXIF attributes...).
11
+
12
+ **Example**
13
+ ```html
14
+ <pnx-picture-metadata ._parent=${viewer} />
15
+ ```