umap-project 2.9.2__py3-none-any.whl → 3.0.0__py3-none-any.whl

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.

Potentially problematic release.


This version of umap-project might be problematic. Click here for more details.

Files changed (222) hide show
  1. umap/__init__.py +1 -1
  2. umap/context_processors.py +1 -0
  3. umap/forms.py +1 -2
  4. umap/locale/de/LC_MESSAGES/django.mo +0 -0
  5. umap/locale/de/LC_MESSAGES/django.po +218 -96
  6. umap/locale/en/LC_MESSAGES/django.po +131 -55
  7. umap/locale/et/LC_MESSAGES/django.mo +0 -0
  8. umap/locale/et/LC_MESSAGES/django.po +175 -130
  9. umap/locale/eu/LC_MESSAGES/django.mo +0 -0
  10. umap/locale/eu/LC_MESSAGES/django.po +117 -72
  11. umap/locale/fr/LC_MESSAGES/django.mo +0 -0
  12. umap/locale/fr/LC_MESSAGES/django.po +132 -56
  13. umap/locale/hu/LC_MESSAGES/django.mo +0 -0
  14. umap/locale/hu/LC_MESSAGES/django.po +209 -88
  15. umap/locale/is/LC_MESSAGES/django.mo +0 -0
  16. umap/locale/is/LC_MESSAGES/django.po +296 -175
  17. umap/middleware.py +2 -1
  18. umap/migrations/0027_map_tags.py +23 -0
  19. umap/models.py +13 -2
  20. umap/settings/base.py +23 -5
  21. umap/static/umap/base.css +41 -8
  22. umap/static/umap/content.css +72 -37
  23. umap/static/umap/css/bar.css +43 -21
  24. umap/static/umap/css/dialog.css +4 -1
  25. umap/static/umap/css/form.css +40 -27
  26. umap/static/umap/css/icon.css +11 -1
  27. umap/static/umap/css/importers.css +7 -0
  28. umap/static/umap/img/16-white.svg +23 -2
  29. umap/static/umap/img/16.svg +1 -1
  30. umap/static/umap/img/24.svg +4 -4
  31. umap/static/umap/img/home.svg +7 -0
  32. umap/static/umap/img/importers/banfr.svg +1 -0
  33. umap/static/umap/img/marker.svg +2 -5
  34. umap/static/umap/img/source/16-white.svg +24 -3
  35. umap/static/umap/img/source/16.svg +1 -1
  36. umap/static/umap/img/source/24.svg +5 -5
  37. umap/static/umap/img/target.svg +1 -0
  38. umap/static/umap/js/components/alerts/alert.js +0 -1
  39. umap/static/umap/js/modules/browser.js +4 -4
  40. umap/static/umap/js/modules/caption.js +1 -1
  41. umap/static/umap/js/modules/data/features.js +25 -25
  42. umap/static/umap/js/modules/data/layer.js +91 -97
  43. umap/static/umap/js/modules/facets.js +9 -5
  44. umap/static/umap/js/modules/form/builder.js +21 -29
  45. umap/static/umap/js/modules/form/fields.js +40 -14
  46. umap/static/umap/js/modules/formatter.js +1 -1
  47. umap/static/umap/js/modules/global.js +9 -5
  48. umap/static/umap/js/modules/help.js +18 -5
  49. umap/static/umap/js/modules/importer.js +5 -2
  50. umap/static/umap/js/modules/importers/banfr.js +93 -0
  51. umap/static/umap/js/modules/importers/cadastrefr.js +2 -2
  52. umap/static/umap/js/modules/importers/communesfr.js +1 -1
  53. umap/static/umap/js/modules/permissions.js +20 -10
  54. umap/static/umap/js/modules/rendering/icon.js +15 -2
  55. umap/static/umap/js/modules/rendering/layers/classified.js +7 -7
  56. umap/static/umap/js/modules/rendering/layers/cluster.js +2 -2
  57. umap/static/umap/js/modules/rendering/layers/heat.js +4 -4
  58. umap/static/umap/js/modules/rendering/map.js +14 -6
  59. umap/static/umap/js/modules/rendering/popup.js +2 -2
  60. umap/static/umap/js/modules/rendering/template.js +3 -3
  61. umap/static/umap/js/modules/rendering/ui.js +17 -11
  62. umap/static/umap/js/modules/rules.js +13 -16
  63. umap/static/umap/js/modules/schema.js +23 -1
  64. umap/static/umap/js/modules/share.js +1 -1
  65. umap/static/umap/js/modules/slideshow.js +1 -0
  66. umap/static/umap/js/modules/sync/engine.js +141 -19
  67. umap/static/umap/js/modules/sync/undo.js +101 -0
  68. umap/static/umap/js/modules/sync/updaters.js +51 -28
  69. umap/static/umap/js/modules/tableeditor.js +1 -1
  70. umap/static/umap/js/modules/ui/bar.js +61 -21
  71. umap/static/umap/js/modules/ui/tooltip.js +1 -1
  72. umap/static/umap/js/modules/umap.js +190 -176
  73. umap/static/umap/js/modules/utils.js +30 -4
  74. umap/static/umap/js/umap.controls.js +82 -38
  75. umap/static/umap/locale/am_ET.js +13 -7
  76. umap/static/umap/locale/am_ET.json +13 -7
  77. umap/static/umap/locale/ar.js +13 -7
  78. umap/static/umap/locale/ar.json +13 -7
  79. umap/static/umap/locale/ast.js +13 -7
  80. umap/static/umap/locale/ast.json +13 -7
  81. umap/static/umap/locale/bg.js +13 -7
  82. umap/static/umap/locale/bg.json +13 -7
  83. umap/static/umap/locale/br.js +13 -8
  84. umap/static/umap/locale/br.json +13 -8
  85. umap/static/umap/locale/ca.js +13 -7
  86. umap/static/umap/locale/ca.json +13 -7
  87. umap/static/umap/locale/cs_CZ.js +26 -20
  88. umap/static/umap/locale/cs_CZ.json +26 -20
  89. umap/static/umap/locale/da.js +13 -7
  90. umap/static/umap/locale/da.json +13 -7
  91. umap/static/umap/locale/de.js +47 -41
  92. umap/static/umap/locale/de.json +47 -41
  93. umap/static/umap/locale/el.js +13 -7
  94. umap/static/umap/locale/el.json +13 -7
  95. umap/static/umap/locale/en.js +12 -7
  96. umap/static/umap/locale/en.json +12 -7
  97. umap/static/umap/locale/en_US.json +13 -7
  98. umap/static/umap/locale/es.js +19 -13
  99. umap/static/umap/locale/es.json +19 -13
  100. umap/static/umap/locale/et.js +13 -7
  101. umap/static/umap/locale/et.json +13 -7
  102. umap/static/umap/locale/eu.js +43 -37
  103. umap/static/umap/locale/eu.json +43 -37
  104. umap/static/umap/locale/fa_IR.js +13 -7
  105. umap/static/umap/locale/fa_IR.json +13 -7
  106. umap/static/umap/locale/fi.js +13 -7
  107. umap/static/umap/locale/fi.json +13 -7
  108. umap/static/umap/locale/fr.js +12 -7
  109. umap/static/umap/locale/fr.json +12 -7
  110. umap/static/umap/locale/gl.js +19 -13
  111. umap/static/umap/locale/gl.json +19 -13
  112. umap/static/umap/locale/he.js +13 -7
  113. umap/static/umap/locale/he.json +13 -7
  114. umap/static/umap/locale/hr.js +13 -7
  115. umap/static/umap/locale/hr.json +13 -7
  116. umap/static/umap/locale/hu.js +25 -19
  117. umap/static/umap/locale/hu.json +25 -19
  118. umap/static/umap/locale/id.js +13 -7
  119. umap/static/umap/locale/id.json +13 -7
  120. umap/static/umap/locale/is.js +151 -145
  121. umap/static/umap/locale/is.json +151 -145
  122. umap/static/umap/locale/it.js +13 -7
  123. umap/static/umap/locale/it.json +13 -7
  124. umap/static/umap/locale/ja.js +13 -7
  125. umap/static/umap/locale/ja.json +13 -7
  126. umap/static/umap/locale/ko.js +13 -7
  127. umap/static/umap/locale/ko.json +13 -7
  128. umap/static/umap/locale/lt.js +13 -7
  129. umap/static/umap/locale/lt.json +13 -7
  130. umap/static/umap/locale/ms.js +13 -7
  131. umap/static/umap/locale/ms.json +13 -7
  132. umap/static/umap/locale/nl.js +12 -7
  133. umap/static/umap/locale/nl.json +12 -7
  134. umap/static/umap/locale/no.js +13 -7
  135. umap/static/umap/locale/no.json +13 -7
  136. umap/static/umap/locale/pl.js +13 -7
  137. umap/static/umap/locale/pl.json +13 -7
  138. umap/static/umap/locale/pl_PL.json +13 -7
  139. umap/static/umap/locale/pt.js +12 -7
  140. umap/static/umap/locale/pt.json +12 -7
  141. umap/static/umap/locale/pt_BR.js +13 -7
  142. umap/static/umap/locale/pt_BR.json +13 -7
  143. umap/static/umap/locale/pt_PT.js +13 -7
  144. umap/static/umap/locale/pt_PT.json +13 -7
  145. umap/static/umap/locale/ro.js +13 -7
  146. umap/static/umap/locale/ro.json +13 -7
  147. umap/static/umap/locale/ru.js +13 -7
  148. umap/static/umap/locale/ru.json +13 -7
  149. umap/static/umap/locale/sk_SK.js +13 -7
  150. umap/static/umap/locale/sk_SK.json +13 -7
  151. umap/static/umap/locale/sl.js +13 -7
  152. umap/static/umap/locale/sl.json +13 -7
  153. umap/static/umap/locale/sr.js +13 -7
  154. umap/static/umap/locale/sr.json +13 -7
  155. umap/static/umap/locale/sv.js +13 -7
  156. umap/static/umap/locale/sv.json +13 -7
  157. umap/static/umap/locale/th_TH.js +13 -7
  158. umap/static/umap/locale/th_TH.json +13 -7
  159. umap/static/umap/locale/tr.js +13 -7
  160. umap/static/umap/locale/tr.json +13 -7
  161. umap/static/umap/locale/uk_UA.js +13 -7
  162. umap/static/umap/locale/uk_UA.json +13 -7
  163. umap/static/umap/locale/vi.js +13 -7
  164. umap/static/umap/locale/vi.json +13 -7
  165. umap/static/umap/locale/vi_VN.json +13 -7
  166. umap/static/umap/locale/zh.js +13 -7
  167. umap/static/umap/locale/zh.json +13 -7
  168. umap/static/umap/locale/zh_CN.json +13 -7
  169. umap/static/umap/locale/zh_TW.Big5.json +13 -7
  170. umap/static/umap/locale/zh_TW.js +19 -13
  171. umap/static/umap/locale/zh_TW.json +19 -13
  172. umap/static/umap/map.css +58 -28
  173. umap/static/umap/unittests/sync.js +0 -57
  174. umap/static/umap/unittests/utils.js +47 -0
  175. umap/static/umap/vars.css +5 -2
  176. umap/static/umap/vendors/photon/leaflet.photon.js +3 -0
  177. umap/sync/payloads.py +3 -2
  178. umap/templates/auth/user_detail.html +1 -1
  179. umap/templates/auth/user_stars.html +1 -1
  180. umap/templates/umap/content.html +17 -12
  181. umap/templates/umap/home.html +7 -5
  182. umap/templates/umap/map_fragment.html +1 -1
  183. umap/templates/umap/map_list.html +20 -13
  184. umap/templates/umap/search.html +7 -3
  185. umap/templates/umap/search_bar.html +13 -11
  186. umap/templates/umap/team_detail.html +1 -1
  187. umap/tests/base.py +2 -1
  188. umap/tests/fixtures/remote_data.umap +55 -0
  189. umap/tests/fixtures/test_upload_data_with_iconurl.umap +122 -0
  190. umap/tests/integration/test_browser.py +1 -3
  191. umap/tests/integration/test_conditional_rules.py +3 -0
  192. umap/tests/integration/test_edit_datalayer.py +2 -7
  193. umap/tests/integration/test_edit_map.py +15 -0
  194. umap/tests/integration/test_edit_polygon.py +1 -2
  195. umap/tests/integration/test_import.py +59 -2
  196. umap/tests/integration/test_optimistic_merge.py +4 -3
  197. umap/tests/integration/test_owned_map.py +0 -1
  198. umap/tests/integration/test_save.py +2 -4
  199. umap/tests/integration/test_undo_redo.py +267 -0
  200. umap/tests/integration/test_websocket_sync.py +78 -11
  201. umap/tests/settings.py +1 -3
  202. umap/tests/test_datalayer_s3.py +1 -0
  203. umap/tests/test_map_views.py +1 -0
  204. umap/tests/test_views.py +34 -0
  205. umap/utils.py +1 -1
  206. umap/views.py +23 -2
  207. {umap_project-2.9.2.dist-info → umap_project-3.0.0.dist-info}/METADATA +13 -12
  208. {umap_project-2.9.2.dist-info → umap_project-3.0.0.dist-info}/RECORD +211 -213
  209. umap/static/umap/js/modules/saving.js +0 -52
  210. umap/static/umap/test/.eslintrc +0 -21
  211. umap/static/umap/test/DataLayer.js +0 -463
  212. umap/static/umap/test/Feature.js +0 -131
  213. umap/static/umap/test/Map.js +0 -37
  214. umap/static/umap/test/Marker.js +0 -126
  215. umap/static/umap/test/Polygon.js +0 -111
  216. umap/static/umap/test/Polyline.js +0 -286
  217. umap/static/umap/test/Util.js +0 -28
  218. umap/static/umap/test/_pre.js +0 -455
  219. umap/static/umap/test/index.html +0 -139
  220. {umap_project-2.9.2.dist-info → umap_project-3.0.0.dist-info}/WHEEL +0 -0
  221. {umap_project-2.9.2.dist-info → umap_project-3.0.0.dist-info}/entry_points.txt +0 -0
  222. {umap_project-2.9.2.dist-info → umap_project-3.0.0.dist-info}/licenses/LICENSE +0 -0
umap/middleware.py CHANGED
@@ -34,7 +34,8 @@ def deprecated_auth_backend(get_response):
34
34
  "Using “%(name)s” to authenticate is deprecated and will be "
35
35
  "removed soon. "
36
36
  "Please configure another provider below before losing access "
37
- "to your account and maps."
37
+ "to your account and maps. Then, please logout and login "
38
+ "again with the new provider."
38
39
  )
39
40
  % {"name": name},
40
41
  )
@@ -0,0 +1,23 @@
1
+ # Generated by Django 5.1.6 on 2025-02-26 16:18
2
+
3
+ import django.contrib.postgres.fields
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("umap", "0026_datalayer_modified_at_datalayer_share_status"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="map",
15
+ name="tags",
16
+ field=django.contrib.postgres.fields.ArrayField(
17
+ base_field=models.CharField(max_length=200),
18
+ blank=True,
19
+ default=list,
20
+ size=None,
21
+ ),
22
+ ),
23
+ ]
umap/models.py CHANGED
@@ -4,6 +4,7 @@ import uuid
4
4
  from django.conf import settings
5
5
  from django.contrib.auth.models import User
6
6
  from django.contrib.gis.db import models
7
+ from django.contrib.postgres.fields import ArrayField
7
8
  from django.core.files.base import File
8
9
  from django.core.files.storage import storages
9
10
  from django.core.signing import Signer
@@ -236,6 +237,7 @@ class Map(NamedModel):
236
237
  settings = models.JSONField(
237
238
  blank=True, null=True, verbose_name=_("settings"), default=dict
238
239
  )
240
+ tags = ArrayField(models.CharField(max_length=200), blank=True, default=list)
239
241
 
240
242
  objects = models.Manager()
241
243
  public = PublicManager()
@@ -296,6 +298,7 @@ class Map(NamedModel):
296
298
  with datalayer.geojson.open("rb") as f:
297
299
  layer = json.loads(f.read())
298
300
  if datalayer.settings:
301
+ datalayer.settings.pop("id", None)
299
302
  layer["_umap_options"] = datalayer.settings
300
303
  datalayers.append(layer)
301
304
  umapjson["layers"] = datalayers
@@ -415,12 +418,17 @@ class Map(NamedModel):
415
418
  datalayer.clone(map_inst=new)
416
419
  return new
417
420
 
421
+ def get_tags_display(self):
422
+ labels = dict(settings.UMAP_TAGS)
423
+ return [(t, labels.get(t, t)) for t in self.tags]
424
+
418
425
  @classproperty
419
426
  def extra_schema(self):
420
427
  return {
421
428
  "iconUrl": {
422
429
  "default": "%sumap/img/marker.svg" % settings.STATIC_URL,
423
- }
430
+ },
431
+ "tags": {"choices": sorted(settings.UMAP_TAGS, key=lambda i: i[0])},
424
432
  }
425
433
 
426
434
 
@@ -526,7 +534,10 @@ class DataLayer(NamedModel):
526
534
  metadata = self.settings
527
535
  if not metadata:
528
536
  # Fallback to file for old datalayers.
529
- data = json.loads(self.geojson.read().decode())
537
+ try:
538
+ data = json.loads(self.geojson.read().decode())
539
+ except FileNotFoundError:
540
+ data = {}
530
541
  metadata = data.get("_umap_options")
531
542
  if not metadata:
532
543
  metadata = {
umap/settings/base.py CHANGED
@@ -6,6 +6,7 @@ from email.utils import parseaddr
6
6
 
7
7
  import environ
8
8
  from django.conf.locale import LANG_INFO
9
+ from django.utils.translation import gettext_lazy as _
9
10
 
10
11
  import umap as project_module
11
12
 
@@ -290,6 +291,25 @@ UMAP_HOME_FEED = "latest"
290
291
  UMAP_IMPORTERS = {}
291
292
  UMAP_HOST_INFOS = {}
292
293
  UMAP_LABEL_KEYS = ["name", "title"]
294
+ UMAP_TAGS = (
295
+ ("arts", _("Art and Culture")),
296
+ ("cycling", _("Cycling")),
297
+ ("business", _("Business")),
298
+ ("environment", _("Environment")),
299
+ ("education", _("Education")),
300
+ ("food", _("Food and Agriculture")),
301
+ ("geopolitics", _("Geopolitics")),
302
+ ("health", _("Health")),
303
+ ("hiking", _("Hiking")),
304
+ ("history", _("History")),
305
+ ("public", _("Public sector")),
306
+ ("science", _("Science")),
307
+ ("shopping", _("Shopping")),
308
+ ("sport", _("Sport and Leisure")),
309
+ ("travel", _("Travel")),
310
+ ("transports", _("Transports")),
311
+ ("tourism", _("Tourism")),
312
+ )
293
313
 
294
314
  UMAP_READONLY = env("UMAP_READONLY", default=False)
295
315
  UMAP_GZIP = True
@@ -340,10 +360,8 @@ LOGGING = {
340
360
  },
341
361
  }
342
362
 
343
- # WebSocket configuration
363
+ # Real-time editing configuration
344
364
 
345
- WEBSOCKET_ENABLED = env.bool("WEBSOCKET_ENABLED", default=False)
346
- WEBSOCKET_BACK_HOST = env("WEBSOCKET_BACK_HOST", default="localhost")
347
- WEBSOCKET_BACK_PORT = env.int("WEBSOCKET_BACK_PORT", default=8001)
365
+ REALTIME_ENABLED = env.bool("REALTIME_ENABLED", default=False)
348
366
 
349
- REDIS_URL = "redis://localhost:6379"
367
+ REDIS_URL = env("REDIS_URL", default="redis://localhost:6379")
umap/static/umap/base.css CHANGED
@@ -3,9 +3,7 @@
3
3
  */
4
4
  body, div, ul, ol, li, a, section, nav,
5
5
  h1, h2, h3, h4, h5, h6, label,
6
- hr, input, textarea {
7
- -moz-box-sizing:border-box;
8
- -webkit-box-sizing:border-box;
6
+ hr, input, textarea, select {
9
7
  box-sizing: border-box;
10
8
  margin: 0;
11
9
  padding: 0;
@@ -19,7 +17,11 @@ h1, h2, h3, h4, h5, h6, label, hr {
19
17
  }
20
18
  a {
21
19
  text-decoration: none;
22
- color: #1F5C39;
20
+ color: var(--link-color);
21
+ }
22
+ a.main {
23
+ font-weight: bold;
24
+ text-decoration: underline;
23
25
  }
24
26
  a[href^="http"]:not(nav.umap-nav a) {
25
27
  text-decoration: underline;
@@ -81,10 +83,12 @@ hgroup > * {
81
83
  hgroup {
82
84
  margin-bottom: var(--box-margin);
83
85
  }
84
- hgroup > :not(:first-child):last-child {
85
- font-weight: normal;
86
+ hgroup p,
87
+ hgroup button {
88
+ margin: 0;
86
89
  }
87
90
 
91
+
88
92
  /*
89
93
  * List
90
94
  */
@@ -158,10 +162,23 @@ dt {
158
162
  }
159
163
  .grid-container {
160
164
  display: grid;
161
- grid-template-columns: repeat(3, minmax(0, 1fr));
165
+ --grid-layout-gap: calc(var(--gutter) * 2);
166
+ --grid-column-count: 3;
167
+ --grid-item--min-width: 300px;
168
+
169
+ /**
170
+ * Calculated values.
171
+ */
172
+ --gap-count: calc(var(--grid-column-count) - 1);
173
+ --total-gap-width: calc(var(--gap-count) * var(--grid-layout-gap));
174
+ --grid-item--max-width: calc((100% - var(--total-gap-width)) / var(--grid-column-count));
175
+
176
+ grid-template-columns: repeat(auto-fill, minmax(max(var(--grid-item--min-width), var(--grid-item--max-width)), 1fr));
177
+ grid-gap: var(--grid-layout-gap);
162
178
  }
163
179
  .grid-container.by4 {
164
- grid-template-columns: repeat(4, minmax(0, 1fr));
180
+ --grid-column-count: 4;
181
+ --grid-item--min-width: 60px;
165
182
  }
166
183
  .grid-container > * {
167
184
  text-align: center;
@@ -184,6 +201,10 @@ dt {
184
201
  /* Various */
185
202
  /* *********** */
186
203
 
204
+ .nobr {
205
+ white-space: nowrap;
206
+ }
207
+
187
208
  .text {
188
209
  word-break: break-word;
189
210
  white-space: pre-line;
@@ -202,3 +223,15 @@ dt {
202
223
  height: 100vh;
203
224
  opacity: 0.5;
204
225
  }
226
+ .table-scrollable {
227
+ background-image: linear-gradient(to right, var(--background-color), var(--background-color)),
228
+ linear-gradient(to right, var(--background-color), var(--background-color)),
229
+ linear-gradient(to right, rgba(0, 0, 20, .50), rgba(255, 255, 255, 0)),
230
+ linear-gradient(to left, rgba(0, 0, 20, .50), rgba(255, 255, 255, 0));
231
+ background-position: left center, right center, left center, right center;
232
+ background-repeat: no-repeat;
233
+ background-size: 20px 100%, 20px 100%, 10px 100%, 10px 100%;
234
+ background-attachment: local, local, scroll, scroll;
235
+ display: block;
236
+ overflow-x: auto;
237
+ }
@@ -16,6 +16,21 @@ input::-webkit-input-placeholder, ::-webkit-input-placeholder {
16
16
  input:-moz-placeholder, :-moz-placeholder {
17
17
  color: #a5a5a5;
18
18
  }
19
+ .search-form {
20
+ display: flex;
21
+ align-items: baseline;
22
+ max-width: 800px;
23
+ margin: 0 auto;
24
+ }
25
+ .search-form select {
26
+ max-width: 200px;
27
+ }
28
+ .search-form input[type=submit] {
29
+ min-width: 200px;
30
+ }
31
+ .flex-break {
32
+ justify-content: center;
33
+ }
19
34
 
20
35
 
21
36
  /* **************** */
@@ -56,30 +71,12 @@ body.login header {
56
71
  .map_fragment {
57
72
  width: 100%;
58
73
  }
59
- .map_list .map_fragment,
74
+ .map_fragment,
60
75
  .demo_map .map_fragment {
61
- height: 210px;
62
- }
63
- .map_list .legend {
64
- padding-top: 7px;
65
- margin-bottom: 28px;
66
- text-align: center;
67
- font-size: 1.2em;
68
- }
69
- .map_list .legend a {
70
- color: #222;
71
- font-weight: bold;
72
- }
73
- .map_list .legend em,
74
- .map_list .legend em a {
75
- color: #444;
76
- font-weight: normal;
76
+ height: var(--map-fragment-height);
77
77
  }
78
- .map_list hr {
79
- display: none;
80
- }
81
- .map_list .wide + hr {
82
- display: block;
78
+ .grid-container hgroup {
79
+ text-align: left;
83
80
  }
84
81
  .umap-features-list ul {
85
82
  margin-top: 14px;
@@ -164,13 +161,59 @@ h2.tabs a:hover {
164
161
  color: #efefef;
165
162
  text-decoration: underline;
166
163
  }
167
-
164
+ .more_button {
165
+ min-height: var(--map-fragment-height);
166
+ }
167
+ .tag-list {
168
+ margin-top: var(--text-margin);
169
+ margin-bottom: var(--text-margin);
170
+ display: flex;
171
+ flex-wrap: wrap;
172
+ gap: calc(var(--gutter) / 2 );
173
+ }
174
+ .tag-list li {
175
+ border: 1px solid var(--color-darkBlue);
176
+ border-radius: 3vmin;
177
+ display: inline-block;
178
+ padding: var(--button-padding-small);
179
+ }
180
+ .tag-list li a {
181
+ color: var(--color-darkBlue);
182
+ max-width: 125px;
183
+ display: inline-block;
184
+ overflow: hidden;
185
+ white-space: nowrap;
186
+ text-overflow: ellipsis;
187
+ vertical-align: middle;
188
+ font-size: small;
189
+ padding: 0 3px;
190
+ }
191
+ .card {
192
+ border: 1px solid var(--color-lightGray);
193
+ border-radius: var(--border-radius);
194
+ padding: var(--box-padding);
195
+ display: flex;
196
+ flex-direction: column;
197
+ }
198
+ .card .button {
199
+ margin-bottom: 0;
200
+ }
201
+ .card hgroup {
202
+ display: flex;
203
+ flex-direction: column;
204
+ justify-content: space-between;
205
+ margin-bottom: 0;
206
+ flex-grow: 1;
207
+ gap: var(--gutter);
208
+ }
209
+ .card h3 {
210
+ margin-bottom: 0;
211
+ }
168
212
 
169
213
  /* **************************** */
170
214
  /* colors */
171
215
  /* **************************** */
172
216
 
173
- input[type="submit"],
174
217
  .button {
175
218
  background-color: var(--button-primary-background);
176
219
  color: var(--button-primary-color);
@@ -362,22 +405,9 @@ html[dir="rtl"] .content .icon-delete {
362
405
  align-items: center;
363
406
  }
364
407
  }
365
- .table-header form input {
366
- border: 2px solid var(--color-darkBlue);
367
- border-radius: 0;
368
- padding: .5rem 1rem;
369
- margin-bottom: 0;
370
- line-height: inherit;
371
- height: 40px;
372
- }
373
408
  .table-header form input[type="search"] {
374
409
  width: 30ch;
375
410
  }
376
- .table-header form input[type="submit"] {
377
- background-color: var(--color-darkBlue);
378
- color: white;
379
- font-weight: bold;
380
- }
381
411
 
382
412
  .table-header .button-download {
383
413
  width: inherit;
@@ -538,4 +568,9 @@ dialog::backdrop {
538
568
  .mhide {
539
569
  display: none;
540
570
  }
571
+ .flex-break {
572
+ flex-direction: column;
573
+ align-items: center;
574
+ }
575
+
541
576
  }
@@ -4,6 +4,7 @@
4
4
  background-color: var(--color-darkGray);
5
5
  width: auto;
6
6
  margin-bottom: 0;
7
+ min-height: initial;
7
8
  }
8
9
  .umap-main-edit-toolbox [type=button]:hover {
9
10
  text-decoration: underline;
@@ -13,12 +14,18 @@
13
14
  padding: 0 var(--text-margin);
14
15
  background-color: inherit;
15
16
  }
17
+ .leaflet-container .edit-undo {
18
+ margin-left: var(--box-margin);
19
+ }
20
+ .leaflet-container .edit-undo[disabled],
21
+ .leaflet-container .edit-redo[disabled] {
22
+ filter: invert(.5);
23
+ }
16
24
  .leaflet-container .edit-save,
17
- .leaflet-container .edit-cancel,
18
25
  .leaflet-container .edit-disable,
19
26
  .leaflet-container .connected-peers
20
27
  {
21
- display: block;
28
+ display: inline-block;
22
29
  height: 32px;
23
30
  line-height: 30px;
24
31
  padding: 0 20px;
@@ -39,7 +46,6 @@
39
46
  color: var(--color-darkGray);
40
47
  }
41
48
 
42
- .leaflet-container .edit-cancel:hover,
43
49
  .leaflet-container .edit-disable:hover {
44
50
  border: 0.5px solid rgba(153, 153, 153, 0.80);
45
51
  text-decoration: none;
@@ -76,19 +82,13 @@
76
82
  background: rgba(66, 236, 230, 0.10);
77
83
  }
78
84
  .leaflet-container .edit-save,
79
- .leaflet-container .edit-cancel,
80
- .leaflet-container .edit-disable,
81
85
  .umap-edit-enabled .edit-enable {
82
86
  display: none;
83
87
  }
84
88
  .umap-edit-enabled .edit-save,
85
- .umap-edit-enabled .edit-disable,
86
- .umap-edit-enabled.umap-is-dirty .edit-cancel {
89
+ .umap-edit-enabled .edit-disable {
87
90
  display: inline-block;
88
91
  }
89
- .umap-is-dirty .edit-disable {
90
- display: none;
91
- }
92
92
  .umap-caption-bar {
93
93
  display: none;
94
94
  }
@@ -115,8 +115,6 @@
115
115
  .umap-right-edit-toolbox {
116
116
  display: flex;
117
117
  column-gap: 10px;
118
- }
119
- .umap-right-edit-toolbox {
120
118
  align-items: center;
121
119
  }
122
120
 
@@ -135,17 +133,20 @@
135
133
  text-indent: -9999px;
136
134
  }
137
135
  .umap-main-edit-toolbox .map-name {
138
- display: inline-block;
136
+ font-weight: bold;
137
+ text-align: start;
138
+ }
139
+ .truncate {
140
+ display: inline-flex;
139
141
  overflow: hidden;
140
142
  white-space: nowrap;
141
143
  text-overflow: ellipsis;
142
- font-weight: bold;
143
- text-align: start;
144
+ }
145
+ .umap-main-edit-toolbox .username {
146
+ max-width: 100px;
144
147
  }
145
148
  .umap-main-edit-toolbox .share-status {
146
149
  font-style: italic;
147
- overflow: hidden;
148
- text-overflow: ellipsis;
149
150
  }
150
151
  .map-name:after {
151
152
  content: '\00a0';
@@ -163,11 +164,13 @@
163
164
  .umap-main-edit-toolbox h3 {
164
165
  display: inline;
165
166
  }
166
- .umap-caption-bar button {
167
- margin-inline-start: 10px;
167
+ .umap-caption-bar .umap-map-author {
168
+ margin-inline-end: 10px;
168
169
  }
169
- .umap-caption-bar button + button:before {
170
+ .umap-caption-bar > button + button:after,
171
+ .umap-caption-bar > button + button:before {
170
172
  content: '|';
173
+ padding-inline-start: 10px;
171
174
  padding-inline-end: 10px;
172
175
  }
173
176
  .umap-main-edit-toolbox .umap-user:hover {
@@ -196,7 +199,15 @@
196
199
  z-index: var(--zindex-panels);
197
200
  }
198
201
  .umap-caption-bar-enabled .umap-caption-bar {
199
- display: block;
202
+ display: flex;
203
+ align-items: baseline;
204
+ }
205
+ .umap-caption-bar select {
206
+ margin-top: 0;
207
+ line-height: initial;
208
+ height: initial;
209
+ width: auto;
210
+ padding: 0 var(--text-margin);
200
211
  }
201
212
  .umap-caption-bar-enabled {
202
213
  --current-footer-height: var(--footer-height);
@@ -233,3 +244,14 @@
233
244
  padding: 0;
234
245
  margin: 0;
235
246
  }
247
+ @media all and (max-width: 980px) {
248
+ .umap-main-edit-toolbox button span {
249
+ display: none;
250
+ }
251
+ }
252
+ @media all and (max-width: 770px) {
253
+ .umap-main-edit-toolbox .umap-help-link,
254
+ .umap-main-edit-toolbox .share-status {
255
+ display: none !important;
256
+ }
257
+ }
@@ -2,7 +2,7 @@
2
2
  z-index: var(--zindex-dialog);
3
3
  margin: auto;
4
4
  margin-top: 100px;
5
- width: 40vw;
5
+ width: var(--dialog-width);
6
6
  max-width: 100vw;
7
7
  max-height: 50vh;
8
8
  padding: 20px;
@@ -14,6 +14,9 @@
14
14
  height: fit-content;
15
15
  max-height: 90vh;
16
16
  }
17
+ .umap-dialog ul + h4 {
18
+ margin-top: var(--box-margin);
19
+ }
17
20
  :where([data-component="no-dialog"]:not([hidden])) {
18
21
  display: block;
19
22
  position: relative;
@@ -7,16 +7,15 @@ input[type="datetime-local"], input[type="email"], input[type="number"],
7
7
  input[type="search"], input[type="tel"], input[type="time"], input[type="file"],
8
8
  input[type="url"], textarea {
9
9
  background-color: white;
10
- border: 1px solid #CCCCCC;
11
- border-radius: 2px 2px 2px 2px;
12
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset;
13
- color: rgba(0, 0, 0, 0.75);
10
+ border: 2px solid var(--color-darkBlue);
11
+ color: var(--text-color);
14
12
  display: block;
15
13
  font-family: inherit;
16
14
  margin: 0;
17
- margin-bottom: var(--box-margin);
18
- padding: 7px;
15
+ padding: .5rem 1rem;
19
16
  width: 100%;
17
+ line-height: inherit;
18
+ min-height: 40px;
20
19
  }
21
20
  input[type="range"] {
22
21
  margin-top: 10px;
@@ -47,11 +46,15 @@ input[type=checkbox]:checked:after {
47
46
  content: '✓';
48
47
  color: var(--color-darkGray);
49
48
  }
50
-
51
49
  input[data-modified=true] {
52
50
  background-color: var(--color-lightCyan);
53
51
  border: 1px solid var(--color-darkGray);
54
52
  }
53
+ input + select,
54
+ select + input,
55
+ input + input {
56
+ border-left: none;
57
+ }
55
58
  textarea {
56
59
  height: inherit;
57
60
  padding: 7px;
@@ -59,16 +62,18 @@ textarea {
59
62
  min-height: 6rlh;
60
63
  }
61
64
  select {
62
- border: 1px solid #222;
65
+ border: 2px solid var(--color-darkBlue);
63
66
  width: 100%;
64
- height: 28px;
65
- line-height: 28px;
66
- margin-top: 5px;
67
- margin-bottom: var(--box-margin);
67
+ padding: var(--button-padding);
68
+ background-color: var(--background-color);
69
+ color: var(--text-color);
70
+ min-height: 40px;
68
71
  }
69
72
  .dark select {
70
- color: #efefef;
71
- background-color: #393F3F;
73
+ color: var(--text-color);
74
+ background-color: var(--color-darkGray);
75
+ border-color: var(--color-dark);
76
+ border-width: 1px;
72
77
  }
73
78
  select[multiple="multiple"] {
74
79
  height: auto;
@@ -78,16 +83,16 @@ select[multiple="multiple"] {
78
83
  input[type="submit"] {
79
84
  display: flex;
80
85
  align-items: center;
81
- margin-bottom: 14px;
82
86
  text-align: center;
83
- border-radius: 2px;
84
- font-weight: normal;
85
87
  cursor: pointer;
86
88
  padding: var(--button-padding);
87
89
  border: none;
88
90
  text-decoration: none;
89
- background-color: white;
90
91
  justify-content: center;
92
+ background-color: var(--color-darkBlue);
93
+ color: white;
94
+ font-weight: normal;
95
+ min-height: 40px;
91
96
  }
92
97
  .dark .button,
93
98
  .dark [type="button"] {
@@ -95,6 +100,9 @@ input[type="submit"] {
95
100
  color: var(--text-color);
96
101
  border: 1px solid #1b1f20;
97
102
  }
103
+ .button.primary {
104
+ font-weight: bold;
105
+ }
98
106
  .dark .button.primary:not([disabled]),
99
107
  .dark [type="button"].primary:not([disabled]) {
100
108
  background-color: var(--color-brightCyan);
@@ -163,6 +171,14 @@ input + .help-text {
163
171
  .formbox.with-switch {
164
172
  padding-top: 2px;
165
173
  }
174
+ .with-switch {
175
+ overflow: hidden;
176
+ }
177
+ .formbox select,
178
+ .formbox textarea,
179
+ .formbox input {
180
+ margin-bottom: var(--text-margin);
181
+ }
166
182
  fieldset.formbox {
167
183
  border: none;
168
184
  border-top: 1px solid var(--color-lightGray);
@@ -203,8 +219,9 @@ input[value]:invalid {
203
219
  background-color: darkred;
204
220
  }
205
221
  .dark input, .dark textarea {
206
- background-color: #232729;
207
- border-color: #1b1f20;
222
+ background-color: var(--color-darkerGray);
223
+ border-color: var(--color-dark);
224
+ border-width: 1px;
208
225
  color: #efefef;
209
226
  }
210
227
  details {
@@ -280,9 +297,6 @@ input.switch:empty ~ label {
280
297
  text-indent: 6em;
281
298
  margin: 0.2em 0;
282
299
  cursor: pointer;
283
- -webkit-user-select: none;
284
- -moz-user-select: none;
285
- -ms-user-select: none;
286
300
  user-select: none;
287
301
  text-shadow: 0 1px rgba(0, 0, 0, 0.1);
288
302
  width: 80px;
@@ -487,15 +501,12 @@ i.info {
487
501
  padding: 0 5px;
488
502
  }
489
503
  .flat-tabs {
490
- display: none;
504
+ display: flex;
491
505
  justify-content: space-around;
492
506
  font-size: 1.2em;
493
507
  margin-bottom: 20px;
494
508
  border-bottom: 1px solid #bebebe;
495
509
  }
496
- .flat-tabs:has(.flat) {
497
- display: flex;
498
- }
499
510
  .flat-tabs button {
500
511
  padding: 10px;
501
512
  text-decoration: none;
@@ -534,6 +545,7 @@ i.info {
534
545
  display: inline-block;
535
546
  color: black;
536
547
  font-weight: bold;
548
+ overflow: hidden;
537
549
  }
538
550
  .umap-pictogram-choice img {
539
551
  vertical-align: middle;
@@ -572,6 +584,7 @@ input.blur {
572
584
  vertical-align: middle;
573
585
  border-start-end-radius: 0;
574
586
  border-end-end-radius: 0;
587
+ margin-bottom: 0;
575
588
  }
576
589
  .blur + .button,
577
590
  .blur + [type="button"] {