diff --git a/.github/workflows/deploy_pietervdvn.yml b/.github/workflows/deploy_pietervdvn.yml
index 3a7295b8df..284f948901 100644
--- a/.github/workflows/deploy_pietervdvn.yml
+++ b/.github/workflows/deploy_pietervdvn.yml
@@ -32,7 +32,7 @@ jobs:
shell: bash
- name: create dependencies
- run: npm run generate:licenses; npm run generate:images; npm run generate:charging-stations; npm run generate:service-worker; npm run generate:editor-layer-index
+ run: npm run generate:licenses; npm run generate:images; npm run generate:charging-stations; npm run generate:service-worker; npm run download:editor-layer-index
shell: bash
- name: sync translations
diff --git a/assets/layers/address/address.json b/assets/layers/address/address.json
index c44d9d6725..d1f48c6f5f 100644
--- a/assets/layers/address/address.json
+++ b/assets/layers/address/address.json
@@ -341,5 +341,9 @@
}
]
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/aerialway/aerialway.json b/assets/layers/aerialway/aerialway.json
index 224da3c323..a0e69bbf67 100644
--- a/assets/layers/aerialway/aerialway.json
+++ b/assets/layers/aerialway/aerialway.json
@@ -249,5 +249,6 @@
"fr": "Cette voie aérienne fait {_length:km} kilomètre de long"
}
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/ambulancestation/ambulancestation.json b/assets/layers/ambulancestation/ambulancestation.json
index 430810e6a5..1dda37f169 100644
--- a/assets/layers/ambulancestation/ambulancestation.json
+++ b/assets/layers/ambulancestation/ambulancestation.json
@@ -460,5 +460,6 @@
]
},
"images"
- ]
+ ],
+ "allowMove": true
}
diff --git a/assets/layers/bank/bank.json b/assets/layers/bank/bank.json
index 8369bb6871..191b7a7901 100644
--- a/assets/layers/bank/bank.json
+++ b/assets/layers/bank/bank.json
@@ -147,5 +147,6 @@
],
"deletion": {
"softDeletionTags": "amenity="
- }
+ },
+ "allowMove": true
}
diff --git a/assets/layers/barrier/barrier.json b/assets/layers/barrier/barrier.json
index 37979ccf93..6202f62041 100644
--- a/assets/layers/barrier/barrier.json
+++ b/assets/layers/barrier/barrier.json
@@ -686,5 +686,9 @@
"fixme="
]
}
+ },
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
}
}
diff --git a/assets/layers/bench_at_pt/bench_at_pt.json b/assets/layers/bench_at_pt/bench_at_pt.json
index 054574b169..b8153e73b5 100644
--- a/assets/layers/bench_at_pt/bench_at_pt.json
+++ b/assets/layers/bench_at_pt/bench_at_pt.json
@@ -290,5 +290,6 @@
"bench=no"
]
}
- }
+ },
+ "allowMove": false
}
diff --git a/assets/layers/bike_cafe/bike_cafe.json b/assets/layers/bike_cafe/bike_cafe.json
index 34a43ea118..c3eb4693cd 100644
--- a/assets/layers/bike_cafe/bike_cafe.json
+++ b/assets/layers/bike_cafe/bike_cafe.json
@@ -382,5 +382,6 @@
}
}
],
- "deletion": true
+ "deletion": true,
+ "allowMove": true
}
diff --git a/assets/layers/bike_themed_object/bike_themed_object.json b/assets/layers/bike_themed_object/bike_themed_object.json
index 963a5232f2..680b7b2a6c 100644
--- a/assets/layers/bike_themed_object/bike_themed_object.json
+++ b/assets/layers/bike_themed_object/bike_themed_object.json
@@ -102,5 +102,6 @@
"email",
"phone",
"opening_hours"
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/caravansites/caravansites.json b/assets/layers/caravansites/caravansites.json
index 88ca53ee21..8964f35964 100644
--- a/assets/layers/caravansites/caravansites.json
+++ b/assets/layers/caravansites/caravansites.json
@@ -930,5 +930,6 @@
"color": "#00f",
"width": "8"
}
- ]
-}
\ No newline at end of file
+ ],
+ "allowMove": true
+}
diff --git a/assets/layers/cinema/cinema.json b/assets/layers/cinema/cinema.json
index 144e1e672e..3fdebc365f 100644
--- a/assets/layers/cinema/cinema.json
+++ b/assets/layers/cinema/cinema.json
@@ -72,5 +72,6 @@
}
]
}
- ]
+ ],
+ "allowMove": true
}
diff --git a/assets/layers/climbing/climbing.json b/assets/layers/climbing/climbing.json
index 1f7d1bed93..730074f3ae 100644
--- a/assets/layers/climbing/climbing.json
+++ b/assets/layers/climbing/climbing.json
@@ -444,5 +444,9 @@
}
]
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/climbing_area/climbing_area.json b/assets/layers/climbing_area/climbing_area.json
index 6e54aaee86..c8e08740fa 100644
--- a/assets/layers/climbing_area/climbing_area.json
+++ b/assets/layers/climbing_area/climbing_area.json
@@ -352,5 +352,6 @@
"climbing.bouldering"
]
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/climbing_club/climbing_club.json b/assets/layers/climbing_club/climbing_club.json
index 2a8ce131f1..4ef258d4d5 100644
--- a/assets/layers/climbing_club/climbing_club.json
+++ b/assets/layers/climbing_club/climbing_club.json
@@ -202,5 +202,6 @@
"email",
"phone",
"opening_hours"
- ]
+ ],
+ "allowMove": true
}
diff --git a/assets/layers/climbing_gym/climbing_gym.json b/assets/layers/climbing_gym/climbing_gym.json
index 5c2271a9c7..2a7d5f0917 100644
--- a/assets/layers/climbing_gym/climbing_gym.json
+++ b/assets/layers/climbing_gym/climbing_gym.json
@@ -544,5 +544,6 @@
"internet",
"internet-fee",
"internet-ssid"
- ]
+ ],
+ "allowMove": true
}
diff --git a/assets/layers/climbing_opportunity/climbing_opportunity.json b/assets/layers/climbing_opportunity/climbing_opportunity.json
index a524cadb66..3718973258 100644
--- a/assets/layers/climbing_opportunity/climbing_opportunity.json
+++ b/assets/layers/climbing_opportunity/climbing_opportunity.json
@@ -148,5 +148,6 @@
]
}
],
+ "allowMove": false,
"doCount": false
}
diff --git a/assets/layers/climbing_route/climbing_route.json b/assets/layers/climbing_route/climbing_route.json
index 10116eb1dd..746ff682c0 100644
--- a/assets/layers/climbing_route/climbing_route.json
+++ b/assets/layers/climbing_route/climbing_route.json
@@ -282,5 +282,9 @@
"key": "_embedding_features_with_rock:rock"
}
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/conflation/conflation.json b/assets/layers/conflation/conflation.json
index 4718cb4759..f85801dd44 100644
--- a/assets/layers/conflation/conflation.json
+++ b/assets/layers/conflation/conflation.json
@@ -133,5 +133,6 @@
},
"color": "#00f"
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/crab_address/crab_address.json b/assets/layers/crab_address/crab_address.json
index 9b364003e7..a71edc2ccf 100644
--- a/assets/layers/crab_address/crab_address.json
+++ b/assets/layers/crab_address/crab_address.json
@@ -33,5 +33,6 @@
"id": "render_crab",
"render": "Volgens het CRAB ligt hier {STRAATNM} {HUISNR} (label: {HNRLABEL})"
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/crossings/crossings.json b/assets/layers/crossings/crossings.json
index efe9304baf..fd5fe6e662 100644
--- a/assets/layers/crossings/crossings.json
+++ b/assets/layers/crossings/crossings.json
@@ -726,5 +726,9 @@
],
"filter": [
"tactile_paving_advanced"
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/current_view/current_view.json b/assets/layers/current_view/current_view.json
index 70b0b5e835..0d57a35f15 100644
--- a/assets/layers/current_view/current_view.json
+++ b/assets/layers/current_view/current_view.json
@@ -11,5 +11,6 @@
"color": "#cccc0088"
}
],
- "tagRenderings": []
+ "tagRenderings": [],
+ "allowMove": false
}
diff --git a/assets/layers/cycle_highways/cycle_highways.json b/assets/layers/cycle_highways/cycle_highways.json
index aed62fb409..f19a6605ef 100644
--- a/assets/layers/cycle_highways/cycle_highways.json
+++ b/assets/layers/cycle_highways/cycle_highways.json
@@ -212,5 +212,6 @@
}
]
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
index 8c19071bfd..bb126a08bf 100644
--- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json
+++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
@@ -1912,5 +1912,6 @@
]
}
],
+ "allowMove": false,
"allowSplit": true
}
diff --git a/assets/layers/direction/direction.json b/assets/layers/direction/direction.json
index ae6138c446..0dc32332f2 100644
--- a/assets/layers/direction/direction.json
+++ b/assets/layers/direction/direction.json
@@ -56,5 +56,6 @@
"doNotDownload": true,
"presets": [],
"tagRenderings": [],
+ "allowMove": false,
"stroke": "0"
}
diff --git a/assets/layers/disaster_response/disaster_response.json b/assets/layers/disaster_response/disaster_response.json
index 22fac818ea..d7df3a1af7 100644
--- a/assets/layers/disaster_response/disaster_response.json
+++ b/assets/layers/disaster_response/disaster_response.json
@@ -77,5 +77,6 @@
}
}
],
+ "allowMove": true,
"docs": "https://wiki.openstreetmap.org/wiki/Tag:emergency%3Ddisaster_response"
}
diff --git a/assets/layers/dogpark/dogpark.json b/assets/layers/dogpark/dogpark.json
index badca45873..4aa9304894 100644
--- a/assets/layers/dogpark/dogpark.json
+++ b/assets/layers/dogpark/dogpark.json
@@ -214,5 +214,9 @@
},
"condition": "_surface:ha!=0"
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/dumpstations/dumpstations.json b/assets/layers/dumpstations/dumpstations.json
index dc1c6cbabd..66003ad53b 100644
--- a/assets/layers/dumpstations/dumpstations.json
+++ b/assets/layers/dumpstations/dumpstations.json
@@ -628,5 +628,9 @@
"color": "#00f",
"width": "8"
}
- ]
-}
\ No newline at end of file
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
+}
diff --git a/assets/layers/elevator/elevator.json b/assets/layers/elevator/elevator.json
index 143a159fb5..14aabb108a 100644
--- a/assets/layers/elevator/elevator.json
+++ b/assets/layers/elevator/elevator.json
@@ -411,6 +411,10 @@
}
}
],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ },
"units": [
{
"door:width": {
diff --git a/assets/layers/entrance/entrance.json b/assets/layers/entrance/entrance.json
index b26e76932f..7cb41e36cd 100644
--- a/assets/layers/entrance/entrance.json
+++ b/assets/layers/entrance/entrance.json
@@ -566,6 +566,10 @@
]
}
],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ },
"units": [
{
"kerb:height": {
diff --git a/assets/layers/etymology/etymology.json b/assets/layers/etymology/etymology.json
index 3c0eb2e1d0..cb249989c1 100644
--- a/assets/layers/etymology/etymology.json
+++ b/assets/layers/etymology/etymology.json
@@ -367,5 +367,6 @@
"condition": "wikidata~*"
}
],
+ "allowMove": false,
"#": "A layer showing all objects having etymology info (either via `name:etymology:wikidata` or `name:etymology`. The intention is that this layer is reused for a certain category to also _ask_ for information"
}
diff --git a/assets/layers/extinguisher/extinguisher.json b/assets/layers/extinguisher/extinguisher.json
index 8c872c1465..7bb41078c0 100644
--- a/assets/layers/extinguisher/extinguisher.json
+++ b/assets/layers/extinguisher/extinguisher.json
@@ -186,5 +186,9 @@
}
},
"images"
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/filters/filters.json b/assets/layers/filters/filters.json
index fafcd6dba9..c615bc16cc 100644
--- a/assets/layers/filters/filters.json
+++ b/assets/layers/filters/filters.json
@@ -384,5 +384,6 @@
}
]
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/fire_station/fire_station.json b/assets/layers/fire_station/fire_station.json
index 399841191c..324538279c 100644
--- a/assets/layers/fire_station/fire_station.json
+++ b/assets/layers/fire_station/fire_station.json
@@ -335,5 +335,6 @@
]
},
"images"
- ]
+ ],
+ "allowMove": true
}
diff --git a/assets/layers/fitness_centre/fitness_centre.json b/assets/layers/fitness_centre/fitness_centre.json
index 9a49bfd6ca..8b7232ef95 100644
--- a/assets/layers/fitness_centre/fitness_centre.json
+++ b/assets/layers/fitness_centre/fitness_centre.json
@@ -127,5 +127,6 @@
],
"filter": [
"open_now"
- ]
+ ],
+ "allowMove": true
}
diff --git a/assets/layers/fixme/fixme.json b/assets/layers/fixme/fixme.json
index c02eafbe62..94e9dc7651 100644
--- a/assets/layers/fixme/fixme.json
+++ b/assets/layers/fixme/fixme.json
@@ -99,5 +99,6 @@
},
"all_tags"
],
+ "allowMove": false,
"syncSelection": "theme-only"
}
diff --git a/assets/layers/food_courts/food_courts.json b/assets/layers/food_courts/food_courts.json
index db8c2e4e96..b0f21dbc17 100644
--- a/assets/layers/food_courts/food_courts.json
+++ b/assets/layers/food_courts/food_courts.json
@@ -78,5 +78,9 @@
"website",
"phone",
"smoking"
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/governments/governments.json b/assets/layers/governments/governments.json
index 376da38025..b3228b0702 100644
--- a/assets/layers/governments/governments.json
+++ b/assets/layers/governments/governments.json
@@ -91,5 +91,6 @@
},
"id": "name"
}
- ]
+ ],
+ "allowMove": true
}
diff --git a/assets/layers/gps_location/gps_location.json b/assets/layers/gps_location/gps_location.json
index e11ec1d518..86e04b693d 100644
--- a/assets/layers/gps_location/gps_location.json
+++ b/assets/layers/gps_location/gps_location.json
@@ -66,5 +66,6 @@
"anchor": "center"
}
],
- "lineRendering": []
+ "lineRendering": [],
+ "allowMove": false
}
diff --git a/assets/layers/gps_location_history/gps_location_history.json b/assets/layers/gps_location_history/gps_location_history.json
index 686b17d9b5..f42be5b03e 100644
--- a/assets/layers/gps_location_history/gps_location_history.json
+++ b/assets/layers/gps_location_history/gps_location_history.json
@@ -21,5 +21,6 @@
]
}
],
- "lineRendering": []
+ "lineRendering": [],
+ "allowMove": false
}
diff --git a/assets/layers/gps_track/gps_track.json b/assets/layers/gps_track/gps_track.json
index 6a934d223a..3f7f771a28 100644
--- a/assets/layers/gps_track/gps_track.json
+++ b/assets/layers/gps_track/gps_track.json
@@ -69,5 +69,6 @@
"render": "{clear_location_history()}"
}
],
+ "allowMove": false,
"syncSelection": "global"
}
diff --git a/assets/layers/grave/grave.json b/assets/layers/grave/grave.json
index 0e04a30faf..b24307fc07 100644
--- a/assets/layers/grave/grave.json
+++ b/assets/layers/grave/grave.json
@@ -109,5 +109,9 @@
]
}
],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ },
"credits": "Built for Wegspotter on the meetup"
}
diff --git a/assets/layers/home_location/home_location.json b/assets/layers/home_location/home_location.json
index 8b7d23b566..eeb0f52b6f 100644
--- a/assets/layers/home_location/home_location.json
+++ b/assets/layers/home_location/home_location.json
@@ -21,5 +21,6 @@
]
}
],
- "lineRendering": []
+ "lineRendering": [],
+ "allowMove": false
}
diff --git a/assets/layers/hospital/hospital.json b/assets/layers/hospital/hospital.json
index 2cb686c6fe..34038d41d7 100644
--- a/assets/layers/hospital/hospital.json
+++ b/assets/layers/hospital/hospital.json
@@ -154,5 +154,6 @@
"cs": "
Otevírací doba pro návštěvníky Běžným návštěvníkům je vstup povolen v následujících časech: {opening_hours_table(opening_hours:visitors)}Některá oddělení mohou mít jinou otevírací dobu. Mnohé nemocnice povolují návštěvy i v době pohotovosti.
"
}
}
- ]
+ ],
+ "allowMove": true
}
diff --git a/assets/layers/ice_cream/ice_cream.json b/assets/layers/ice_cream/ice_cream.json
index 4e159812d2..d788d62bfa 100644
--- a/assets/layers/ice_cream/ice_cream.json
+++ b/assets/layers/ice_cream/ice_cream.json
@@ -98,6 +98,7 @@
"payment-options",
"wheelchair-access"
],
+ "allowMove": true,
"credits": [
"Pieter Vander Vennet"
]
diff --git a/assets/layers/icons/icons.json b/assets/layers/icons/icons.json
index a5fb70601d..d5a5623d45 100644
--- a/assets/layers/icons/icons.json
+++ b/assets/layers/icons/icons.json
@@ -382,5 +382,6 @@
],
"render": "{direction_indicator()}"
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/id_presets/id_presets.json b/assets/layers/id_presets/id_presets.json
index a5b3f8b8e3..f447cc69a2 100644
--- a/assets/layers/id_presets/id_presets.json
+++ b/assets/layers/id_presets/id_presets.json
@@ -23684,5 +23684,6 @@
]
}
],
+ "allowMove": false,
"#dont-translate": "*"
}
diff --git a/assets/layers/import_candidate/import_candidate.json b/assets/layers/import_candidate/import_candidate.json
index b315f20f1d..21bf25f862 100644
--- a/assets/layers/import_candidate/import_candidate.json
+++ b/assets/layers/import_candidate/import_candidate.json
@@ -25,5 +25,6 @@
"id": "all_tags",
"render": "{all_tags()}"
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/indoors/indoors.json b/assets/layers/indoors/indoors.json
index ba56637635..7eea280372 100644
--- a/assets/layers/indoors/indoors.json
+++ b/assets/layers/indoors/indoors.json
@@ -607,5 +607,9 @@
}
}
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/item_with_image/item_with_image.json b/assets/layers/item_with_image/item_with_image.json
index 3009a35a90..5d52bfc634 100644
--- a/assets/layers/item_with_image/item_with_image.json
+++ b/assets/layers/item_with_image/item_with_image.json
@@ -54,5 +54,6 @@
"lineRendering": [],
"tagRenderings": [
"images"
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/kerbs/kerbs.json b/assets/layers/kerbs/kerbs.json
index 59bae3a703..2b5c4aa19c 100644
--- a/assets/layers/kerbs/kerbs.json
+++ b/assets/layers/kerbs/kerbs.json
@@ -392,6 +392,10 @@
},
"tactile_paving_advanced"
],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ },
"units": [
{
"kerb:height": {
diff --git a/assets/layers/last_click/last_click.json b/assets/layers/last_click/last_click.json
index b9cb5311be..6b92391c4f 100644
--- a/assets/layers/last_click/last_click.json
+++ b/assets/layers/last_click/last_click.json
@@ -218,5 +218,6 @@
}
]
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/lighthouse/lighthouse.json b/assets/layers/lighthouse/lighthouse.json
index 89ca98db53..f5917195a5 100644
--- a/assets/layers/lighthouse/lighthouse.json
+++ b/assets/layers/lighthouse/lighthouse.json
@@ -68,6 +68,10 @@
"id": "lighthouse-height"
}
],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ },
"units": [
{
"height": {
diff --git a/assets/layers/love_hotel/love_hotel.json b/assets/layers/love_hotel/love_hotel.json
index 83bd392861..935010a036 100644
--- a/assets/layers/love_hotel/love_hotel.json
+++ b/assets/layers/love_hotel/love_hotel.json
@@ -83,6 +83,7 @@
},
"contact"
],
+ "allowMove": true,
"enableMorePrivacy": true,
"credits": "Asteliks"
}
diff --git a/assets/layers/maproulette/maproulette.json b/assets/layers/maproulette/maproulette.json
index 260d95f26f..607cef4d0b 100644
--- a/assets/layers/maproulette/maproulette.json
+++ b/assets/layers/maproulette/maproulette.json
@@ -395,5 +395,6 @@
}
]
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/maproulette_challenge/maproulette_challenge.json b/assets/layers/maproulette_challenge/maproulette_challenge.json
index b9faf91920..06db90cc1e 100644
--- a/assets/layers/maproulette_challenge/maproulette_challenge.json
+++ b/assets/layers/maproulette_challenge/maproulette_challenge.json
@@ -292,5 +292,6 @@
}
]
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/maxspeed/maxspeed.json b/assets/layers/maxspeed/maxspeed.json
index 364a05be54..46e54b11d8 100644
--- a/assets/layers/maxspeed/maxspeed.json
+++ b/assets/layers/maxspeed/maxspeed.json
@@ -163,6 +163,7 @@
"id": "maxspeed-maxspeed"
}
],
+ "allowMove": false,
"allowSplit": true,
"units": [
{
diff --git a/assets/layers/named_streets/named_streets.json b/assets/layers/named_streets/named_streets.json
index 4041e8b55d..8b1cf63eef 100644
--- a/assets/layers/named_streets/named_streets.json
+++ b/assets/layers/named_streets/named_streets.json
@@ -17,5 +17,6 @@
"color": "#ccc",
"width": "3"
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/nature_reserve/nature_reserve.json b/assets/layers/nature_reserve/nature_reserve.json
index bac0f6c024..4dae74e078 100644
--- a/assets/layers/nature_reserve/nature_reserve.json
+++ b/assets/layers/nature_reserve/nature_reserve.json
@@ -612,5 +612,9 @@
}
]
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/note/note.json b/assets/layers/note/note.json
index 05e5d942d6..146bbc17fc 100644
--- a/assets/layers/note/note.json
+++ b/assets/layers/note/note.json
@@ -407,5 +407,6 @@
}
]
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/osm_community_index/osm_community_index.json b/assets/layers/osm_community_index/osm_community_index.json
index 54b074cc31..05b2c783ba 100644
--- a/assets/layers/osm_community_index/osm_community_index.json
+++ b/assets/layers/osm_community_index/osm_community_index.json
@@ -184,5 +184,6 @@
}
]
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/outdoor_seating/outdoor_seating.json b/assets/layers/outdoor_seating/outdoor_seating.json
index ca9ab00659..23d508c195 100644
--- a/assets/layers/outdoor_seating/outdoor_seating.json
+++ b/assets/layers/outdoor_seating/outdoor_seating.json
@@ -190,5 +190,9 @@
]
}
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/parking_spaces/parking_spaces.json b/assets/layers/parking_spaces/parking_spaces.json
index 732b5a3b4a..29b3d71141 100644
--- a/assets/layers/parking_spaces/parking_spaces.json
+++ b/assets/layers/parking_spaces/parking_spaces.json
@@ -272,5 +272,9 @@
}
]
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/parking_ticket_machine/parking_ticket_machine.json b/assets/layers/parking_ticket_machine/parking_ticket_machine.json
index bc28714ab8..2715cb370e 100644
--- a/assets/layers/parking_ticket_machine/parking_ticket_machine.json
+++ b/assets/layers/parking_ticket_machine/parking_ticket_machine.json
@@ -113,5 +113,9 @@
}
]
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/pedestrian_path/pedestrian_path.json b/assets/layers/pedestrian_path/pedestrian_path.json
index 87c84cf43e..e1bac0a66d 100644
--- a/assets/layers/pedestrian_path/pedestrian_path.json
+++ b/assets/layers/pedestrian_path/pedestrian_path.json
@@ -45,5 +45,6 @@
"width": 4,
"dashArray": "12 6"
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/picnic_table/picnic_table.json b/assets/layers/picnic_table/picnic_table.json
index 6485bbe14a..077bbe95b7 100644
--- a/assets/layers/picnic_table/picnic_table.json
+++ b/assets/layers/picnic_table/picnic_table.json
@@ -146,6 +146,13 @@
"ca": "Açò és una taula de pícnic feta de plàstic reciclat",
"cs": "Tento piknikový stůl je vyroben z plastu (recyklované)"
}
+ },
+ {
+ "if": "material=metal",
+ "then": {
+ "en": "This picnic table is made from metal",
+ "nl": "Deze picnictafel is gemaakt uit metaal"
+ }
}
],
"id": "picnic_table-material"
diff --git a/assets/layers/play_forest/play_forest.json b/assets/layers/play_forest/play_forest.json
index 5a81c3feb1..89013b42c7 100644
--- a/assets/layers/play_forest/play_forest.json
+++ b/assets/layers/play_forest/play_forest.json
@@ -126,5 +126,9 @@
"render": "{reviews(name, play_forest)}"
}
],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ },
"hideFromOverview": false
}
diff --git a/assets/layers/playground/playground.json b/assets/layers/playground/playground.json
index 0e3950630c..3189cb6130 100644
--- a/assets/layers/playground/playground.json
+++ b/assets/layers/playground/playground.json
@@ -136,6 +136,31 @@
"tagRenderings": [
"images",
"reviews",
+ {
+ "question": {
+ "en": "Does one have to pay to use this playground?",
+ "nl": "Moet men betalen om deze speeltuin te gebruiken?"
+ },
+ "id": "fee",
+ "mappings": [
+ {
+ "if": "fee=no",
+ "alsoShowIf": "fee=",
+ "then": {
+ "en": "Free to use",
+ "nl": "Gratis te gebruiken"
+ }
+ },
+ {
+ "if": "fee=yes",
+ "then": {
+ "en": "Paid playground",
+ "nl": "Betalend"
+ }
+ }
+ ],
+ "filter": true
+ },
{
"question": {
"nl": "Wat is de ondergrond van deze speeltuin?",
@@ -740,5 +765,9 @@
"leisure="
]
}
+ },
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
}
}
diff --git a/assets/layers/postboxes/postboxes.json b/assets/layers/postboxes/postboxes.json
index dcbdfff0fe..e3fbab4d0f 100644
--- a/assets/layers/postboxes/postboxes.json
+++ b/assets/layers/postboxes/postboxes.json
@@ -103,5 +103,9 @@
"razed:amenity=post_box"
]
}
+ },
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
}
}
diff --git a/assets/layers/postoffices/postoffices.json b/assets/layers/postoffices/postoffices.json
index cb4bb7c409..80aa3366b9 100644
--- a/assets/layers/postoffices/postoffices.json
+++ b/assets/layers/postoffices/postoffices.json
@@ -665,5 +665,6 @@
}
]
}
- ]
+ ],
+ "allowMove": true
}
diff --git a/assets/layers/questions/questions.json b/assets/layers/questions/questions.json
index d5d4551f7e..4197464905 100644
--- a/assets/layers/questions/questions.json
+++ b/assets/layers/questions/questions.json
@@ -175,13 +175,23 @@
"cs": "Jaké je telefonní číslo {title()}?"
},
"render": {
- "*": "{phone} "
+ "special": {
+ "type": "link",
+ "href": "tel:{phone}",
+ "text": "{phone}"
+ }
},
"icon": "./assets/layers/questions/phone.svg",
"mappings": [
{
"if": "contact:phone~*",
- "then": "{contact:phone} ",
+ "then": {
+ "special": {
+ "type": "link",
+ "href": "tel:{contact:phone}",
+ "text": "{contact:phone}"
+ }
+ },
"hideInAnswer": true,
"icon": "./assets/layers/questions/phone.svg"
}
@@ -2933,5 +2943,6 @@
}
]
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/railway_platforms/railway_platforms.json b/assets/layers/railway_platforms/railway_platforms.json
index 1e1295f5ca..d51e89e258 100644
--- a/assets/layers/railway_platforms/railway_platforms.json
+++ b/assets/layers/railway_platforms/railway_platforms.json
@@ -111,5 +111,6 @@
}
},
"level"
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/rainbow_crossings/rainbow_crossings.json b/assets/layers/rainbow_crossings/rainbow_crossings.json
index ab2ea66984..894b667c8e 100644
--- a/assets/layers/rainbow_crossings/rainbow_crossings.json
+++ b/assets/layers/rainbow_crossings/rainbow_crossings.json
@@ -153,5 +153,9 @@
}
]
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/range/range.json b/assets/layers/range/range.json
index ae92cb0215..4224185f99 100644
--- a/assets/layers/range/range.json
+++ b/assets/layers/range/range.json
@@ -12,5 +12,9 @@
"fill": "no",
"color": "#cc00cc"
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/reception_desk/reception_desk.json b/assets/layers/reception_desk/reception_desk.json
index 70c89f2304..897a60a9d7 100644
--- a/assets/layers/reception_desk/reception_desk.json
+++ b/assets/layers/reception_desk/reception_desk.json
@@ -96,6 +96,10 @@
},
"induction-loop"
],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ },
"units": [
{
"desk:height": {
diff --git a/assets/layers/selected_element/selected_element.json b/assets/layers/selected_element/selected_element.json
index 4b58dea067..de494e96a8 100644
--- a/assets/layers/selected_element/selected_element.json
+++ b/assets/layers/selected_element/selected_element.json
@@ -27,5 +27,6 @@
]
}
],
- "lineRendering": []
+ "lineRendering": [],
+ "allowMove": false
}
diff --git a/assets/layers/ski_piste/ski_piste.json b/assets/layers/ski_piste/ski_piste.json
index cce3cc8cc3..963a6e5f5c 100644
--- a/assets/layers/ski_piste/ski_piste.json
+++ b/assets/layers/ski_piste/ski_piste.json
@@ -147,5 +147,9 @@
"fr": "Ce tronçon de piste de ski mesure {_length:km} kilomètres de long"
}
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/slow_roads/slow_roads.json b/assets/layers/slow_roads/slow_roads.json
index 53c18d383d..7978280ed1 100644
--- a/assets/layers/slow_roads/slow_roads.json
+++ b/assets/layers/slow_roads/slow_roads.json
@@ -331,5 +331,6 @@
}
]
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/speed_display/speed_display.json b/assets/layers/speed_display/speed_display.json
index 0688c33001..6d8dc7afe1 100644
--- a/assets/layers/speed_display/speed_display.json
+++ b/assets/layers/speed_display/speed_display.json
@@ -113,6 +113,10 @@
}
}
],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ },
"units": [
{
"maxspeed": {
diff --git a/assets/layers/split_point/split_point.json b/assets/layers/split_point/split_point.json
index c43c0921d1..5f4e3fe5a9 100644
--- a/assets/layers/split_point/split_point.json
+++ b/assets/layers/split_point/split_point.json
@@ -24,5 +24,6 @@
]
}
],
- "lineRendering": []
+ "lineRendering": [],
+ "allowMove": false
}
diff --git a/assets/layers/split_road/split_road.json b/assets/layers/split_road/split_road.json
index 13a6d3cfc1..44a6e315fa 100644
--- a/assets/layers/split_road/split_road.json
+++ b/assets/layers/split_road/split_road.json
@@ -24,5 +24,6 @@
"width": "8",
"color": "black"
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/sport_pitch/sport_pitch.json b/assets/layers/sport_pitch/sport_pitch.json
index 2e5539fa62..dd616ecf49 100644
--- a/assets/layers/sport_pitch/sport_pitch.json
+++ b/assets/layers/sport_pitch/sport_pitch.json
@@ -821,5 +821,9 @@
]
},
"open_now"
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/stairs/stairs.json b/assets/layers/stairs/stairs.json
index 4e81a02bb8..4e5df49349 100644
--- a/assets/layers/stairs/stairs.json
+++ b/assets/layers/stairs/stairs.json
@@ -339,5 +339,9 @@
}
]
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/stripclub/stripclub.json b/assets/layers/stripclub/stripclub.json
index 1fdfad8816..d560736784 100644
--- a/assets/layers/stripclub/stripclub.json
+++ b/assets/layers/stripclub/stripclub.json
@@ -88,5 +88,6 @@
"opening_hours",
"contact"
],
+ "allowMove": true,
"enableMorePrivacy": true
}
diff --git a/assets/layers/summary/summary.json b/assets/layers/summary/summary.json
index 31dfcab044..3300de733e 100644
--- a/assets/layers/summary/summary.json
+++ b/assets/layers/summary/summary.json
@@ -30,5 +30,6 @@
],
"tagRenderings": [
"all_tags"
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/surveillance_camera/surveillance_camera.json b/assets/layers/surveillance_camera/surveillance_camera.json
index f8ca5d8894..5e68a48035 100644
--- a/assets/layers/surveillance_camera/surveillance_camera.json
+++ b/assets/layers/surveillance_camera/surveillance_camera.json
@@ -858,5 +858,9 @@
}
],
"deletion": true,
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ },
"enableMorePrivacy": true
}
diff --git a/assets/layers/toilet/toilet.json b/assets/layers/toilet/toilet.json
index 3e386b0525..743e495f1a 100644
--- a/assets/layers/toilet/toilet.json
+++ b/assets/layers/toilet/toilet.json
@@ -206,6 +206,7 @@
},
{
"if": "access=customers",
+ "icon": "key",
"then": {
"en": "Only access to customers",
"de": "Der Zugang ist nur für Kunden",
@@ -220,6 +221,7 @@
},
{
"if": "access=no",
+ "icon": "lock",
"alsoShowIf": "access=private",
"then": {
"en": "Not accessible",
@@ -236,6 +238,7 @@
},
{
"if": "access=key",
+ "icon": "key",
"then": {
"en": "Accessible, but one has to ask a key to enter",
"de": "Der Zugang ist möglich, aber man muss nach einen Schlüssel fragen",
diff --git a/assets/layers/toilet_at_amenity/toilet_at_amenity.json b/assets/layers/toilet_at_amenity/toilet_at_amenity.json
index 6e3e589fdf..1fe207835e 100644
--- a/assets/layers/toilet_at_amenity/toilet_at_amenity.json
+++ b/assets/layers/toilet_at_amenity/toilet_at_amenity.json
@@ -502,6 +502,7 @@
},
"neededChangesets": 1
},
+ "allowMove": false,
"units": [
{
"toilets:door:width": {
diff --git a/assets/layers/tourism_accomodation/tourism_accomodation.json b/assets/layers/tourism_accomodation/tourism_accomodation.json
index 37348a586c..fea55196a5 100644
--- a/assets/layers/tourism_accomodation/tourism_accomodation.json
+++ b/assets/layers/tourism_accomodation/tourism_accomodation.json
@@ -227,6 +227,15 @@
"en": "a small-scale lodging facility, typically operated by the owner",
"de": "eine kleine Beherbergungseinrichtung, die in der Regel vom Eigentümer betrieben wird"
}
+ },
+ {
+ "tags": [
+ "tourism=camp_site"
+ ],
+ "title": {
+ "en": "a camp site or camp ground",
+ "de": "een kempeerterrein"
+ }
}
],
"tagRenderings": [
diff --git a/assets/layers/trail/trail.json b/assets/layers/trail/trail.json
index 6c1af2d91a..76ea393731 100644
--- a/assets/layers/trail/trail.json
+++ b/assets/layers/trail/trail.json
@@ -295,5 +295,6 @@
],
"id": "pushchair access"
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/transit_routes/transit_routes.json b/assets/layers/transit_routes/transit_routes.json
index 9efcb28216..963fd131e4 100644
--- a/assets/layers/transit_routes/transit_routes.json
+++ b/assets/layers/transit_routes/transit_routes.json
@@ -237,6 +237,7 @@
}
}
],
+ "allowMove": false,
"cs": {
"0": {
"color": {
diff --git a/assets/layers/unit/unit.json b/assets/layers/unit/unit.json
index 03659bc667..584086c8a4 100644
--- a/assets/layers/unit/unit.json
+++ b/assets/layers/unit/unit.json
@@ -7,6 +7,7 @@
"source": "special:library",
"pointRendering": null,
"lineRendering": null,
+ "allowMove": false,
"units": [
{
"quantity": "power",
diff --git a/assets/layers/usersettings/usersettings.json b/assets/layers/usersettings/usersettings.json
index 45bcf9de71..51573c0af2 100644
--- a/assets/layers/usersettings/usersettings.json
+++ b/assets/layers/usersettings/usersettings.json
@@ -1108,5 +1108,6 @@
"condition": "mapcomplete-show_debug=yes",
"render": "{all_tags()}"
}
- ]
+ ],
+ "allowMove": false
}
diff --git a/assets/layers/veterinary/veterinary.json b/assets/layers/veterinary/veterinary.json
index fb6c6a2c5f..e6b04bd084 100644
--- a/assets/layers/veterinary/veterinary.json
+++ b/assets/layers/veterinary/veterinary.json
@@ -133,5 +133,6 @@
},
"id": "vetName"
}
- ]
+ ],
+ "allowMove": true
}
diff --git a/assets/layers/viewpoint/viewpoint.json b/assets/layers/viewpoint/viewpoint.json
index 40e2dce632..44e7c47296 100644
--- a/assets/layers/viewpoint/viewpoint.json
+++ b/assets/layers/viewpoint/viewpoint.json
@@ -104,5 +104,9 @@
"id": "viewpoint-description"
}
],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ },
"wayhandling": 2
}
diff --git a/assets/layers/village_green/village_green.json b/assets/layers/village_green/village_green.json
index 4b79bd6a0c..d804a5cd90 100644
--- a/assets/layers/village_green/village_green.json
+++ b/assets/layers/village_green/village_green.json
@@ -58,5 +58,9 @@
"id": "village_green-reviews",
"render": "{reviews(name, landuse=village_green )}"
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
diff --git a/assets/layers/visitor_information_centre/visitor_information_centre.json b/assets/layers/visitor_information_centre/visitor_information_centre.json
index 3d02ab61d0..7ce0e55596 100644
--- a/assets/layers/visitor_information_centre/visitor_information_centre.json
+++ b/assets/layers/visitor_information_centre/visitor_information_centre.json
@@ -97,5 +97,6 @@
],
"lineRendering": [],
"presets": [],
- "tagRenderings": []
+ "tagRenderings": [],
+ "allowMove": true
}
diff --git a/assets/layers/walls_and_buildings/walls_and_buildings.json b/assets/layers/walls_and_buildings/walls_and_buildings.json
index 8d4cc36251..5cfca96fae 100644
--- a/assets/layers/walls_and_buildings/walls_and_buildings.json
+++ b/assets/layers/walls_and_buildings/walls_and_buildings.json
@@ -122,6 +122,7 @@
"condition": "_biggest_width_id~*"
}
],
+ "allowMove": false,
"units": [
{
"width": {
diff --git a/assets/layers/windturbine/windturbine.json b/assets/layers/windturbine/windturbine.json
index 9d4144743f..56abda36f8 100644
--- a/assets/layers/windturbine/windturbine.json
+++ b/assets/layers/windturbine/windturbine.json
@@ -301,6 +301,7 @@
},
"images"
],
+ "allowMove": false,
"units": [
{
"generator:output:electricity": "power",
diff --git a/assets/themes/bag/bag.json b/assets/themes/bag/bag.json
index eb526b2232..31d9afaf12 100644
--- a/assets/themes/bag/bag.json
+++ b/assets/themes/bag/bag.json
@@ -149,7 +149,8 @@
]
}
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "osm_adresses",
@@ -187,7 +188,8 @@
"render": 1
}
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "bag_pand",
@@ -394,7 +396,8 @@
"render": 1
}
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "bag_verblijfsobject",
@@ -452,7 +455,8 @@
"render": 1
}
}
- ]
+ ],
+ "allowMove": false
}
]
}
diff --git a/assets/themes/buurtnatuur/buurtnatuur.json b/assets/themes/buurtnatuur/buurtnatuur.json
index 841f843901..c4fc208d4d 100644
--- a/assets/themes/buurtnatuur/buurtnatuur.json
+++ b/assets/themes/buurtnatuur/buurtnatuur.json
@@ -137,7 +137,8 @@
},
"width": "5"
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "parks",
@@ -241,7 +242,8 @@
},
"width": "5"
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "forest",
@@ -364,7 +366,8 @@
},
"width": "5"
}
- ]
+ ],
+ "allowMove": false
},
"viewpoint"
],
diff --git a/assets/themes/circular_economy/circular_economy.json b/assets/themes/circular_economy/circular_economy.json
index 70780d77e5..9538f3ccb1 100644
--- a/assets/themes/circular_economy/circular_economy.json
+++ b/assets/themes/circular_economy/circular_economy.json
@@ -32,7 +32,7 @@
{
"builtin": "shops",
"override": {
- "minzoom": 10,
+ "minzoom": 6,
"id": "shops_second_hand",
"=name": {
"en": "Second hand shops",
diff --git a/assets/themes/climbing/climbing.json b/assets/themes/climbing/climbing.json
index e724cf91a6..03fed5b816 100644
--- a/assets/themes/climbing/climbing.json
+++ b/assets/themes/climbing/climbing.json
@@ -63,10 +63,6 @@
"climbing_opportunity"
],
"override": {
- "allowMove": {
- "enableRelocation": false,
- "enableImproveAccuracy": true
- },
"+titleIcons": [
{
"id": "climbing_length",
diff --git a/assets/themes/cyclenodes/cyclenodes.json b/assets/themes/cyclenodes/cyclenodes.json
index 7b0eb66363..c8b5be2ac1 100644
--- a/assets/themes/cyclenodes/cyclenodes.json
+++ b/assets/themes/cyclenodes/cyclenodes.json
@@ -123,7 +123,8 @@
}
}
],
- "pointRendering": null
+ "pointRendering": null,
+ "allowMove": false
},
{
"id": "node_bicycle",
@@ -324,7 +325,8 @@
"cycleways_and_roads"
]
}
- ]
+ ],
+ "allowMove": false
},
{
"builtin": [
@@ -407,4 +409,4 @@
}
}
]
-}
\ No newline at end of file
+}
diff --git a/assets/themes/cyclestreets/cyclestreets.json b/assets/themes/cyclestreets/cyclestreets.json
index ef774802f0..7bf579ea63 100644
--- a/assets/themes/cyclestreets/cyclestreets.json
+++ b/assets/themes/cyclestreets/cyclestreets.json
@@ -172,7 +172,8 @@
"color": "#0000ff",
"width": "10"
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "toekomstige_fietsstraat",
@@ -290,7 +291,8 @@
"color": "#09f9dd",
"width": "5"
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "not_cyclestreets",
@@ -410,7 +412,8 @@
"width": "5"
}
],
- "isCounted": false
+ "isCounted": false,
+ "allowMove": false
}
],
"overrideAll": {
diff --git a/assets/themes/cyclofix/cyclofix.json b/assets/themes/cyclofix/cyclofix.json
index bcd7541cbe..7b1c1ff374 100644
--- a/assets/themes/cyclofix/cyclofix.json
+++ b/assets/themes/cyclofix/cyclofix.json
@@ -40,6 +40,26 @@
"Originally created during Open Summer of Code by Pieter Fiers, Thibault Declercq, Pierre Barban, Joost Schouppe and Pieter Vander Vennet"
],
"layers": [
+ {
+ "builtin": "assisted_repair",
+ "override": {
+ "presets=": [],
+ "id": "bicycle_assisted_repair_workshop",
+ "minzoom": 11,
+ "source": {
+ "osmTags": {
+ "and+": [
+ {
+ "or": [
+ "service:bicycle:repair=yes",
+ "bicycle:repair=yes"
+ ]
+ }
+ ]
+ }
+ }
+ }
+ },
{
"builtin": [
"bike_cafe",
diff --git a/assets/themes/ghostsigns/ghostsigns.json b/assets/themes/ghostsigns/ghostsigns.json
index 91969aff7c..adfdb89c2e 100644
--- a/assets/themes/ghostsigns/ghostsigns.json
+++ b/assets/themes/ghostsigns/ghostsigns.json
@@ -92,7 +92,7 @@
},
"freeform": {
"key": "inscription",
- "type": "string",
+ "type": "text",
"placeholder": {
"en": "Text on the sign",
"de": "Text auf dem Schild",
diff --git a/assets/themes/grb/grb.json b/assets/themes/grb/grb.json
index 20a85d8093..7795edc206 100644
--- a/assets/themes/grb/grb.json
+++ b/assets/themes/grb/grb.json
@@ -274,7 +274,8 @@
]
}
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "grb",
@@ -539,7 +540,8 @@
]
}
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "service_ways",
@@ -556,7 +558,8 @@
"width": 4,
"color": "#888888"
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "generic_osm_object",
@@ -602,7 +605,8 @@
"width": "1",
"fill": "no"
}
- ]
+ ],
+ "allowMove": false
},
"address",
{
diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json
index 2a9da63b20..ac8e738f66 100644
--- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json
+++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json
@@ -14,6 +14,9 @@
},
"icon": "./assets/svg/logo.svg",
"hideFromOverview": true,
+ "startLat": 0,
+ "startLon": 0,
+ "startZoom": 1,
"layers": [
{
"id": "mapcomplete-changes",
@@ -727,4 +730,4 @@
}
}
]
-}
\ No newline at end of file
+}
diff --git a/assets/themes/postal_codes/postal_codes.json b/assets/themes/postal_codes/postal_codes.json
index f3368867fa..2cfbeda0ff 100644
--- a/assets/themes/postal_codes/postal_codes.json
+++ b/assets/themes/postal_codes/postal_codes.json
@@ -144,7 +144,8 @@
"fill": "no",
"dashArray": "8 8"
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "wrong_postal_code",
@@ -163,7 +164,9 @@
"color": "#f00",
"width": 1
}
- ]
+ ],
+ "allowMove": false
+
},
{
"id": "town_hall",
@@ -233,7 +236,8 @@
],
"anchor": "center"
}
- ]
+ ],
+ "allowMove": false
}
],
"overpassTimeout": 180,
diff --git a/assets/themes/speelplekken/speelplekken.json b/assets/themes/speelplekken/speelplekken.json
index ab70632013..9e2bcda94c 100644
--- a/assets/themes/speelplekken/speelplekken.json
+++ b/assets/themes/speelplekken/speelplekken.json
@@ -196,7 +196,8 @@
},
"width": "9"
}
- ]
+ ],
+ "allowMove": false
}
],
"overrideAll": {
diff --git a/assets/themes/stations/stations.json b/assets/themes/stations/stations.json
index 34814f8823..83a9cfd307 100644
--- a/assets/themes/stations/stations.json
+++ b/assets/themes/stations/stations.json
@@ -115,7 +115,8 @@
{
"color": "green"
}
- ]
+ ],
+ "allowMove": false
},
{
"builtin": [
@@ -454,7 +455,11 @@
],
"lineRendering": [
{}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
}
]
}
diff --git a/assets/themes/street_lighting/street_lighting.json b/assets/themes/street_lighting/street_lighting.json
index b4ace4e2d1..970246e677 100644
--- a/assets/themes/street_lighting/street_lighting.json
+++ b/assets/themes/street_lighting/street_lighting.json
@@ -196,7 +196,8 @@
{
"color": "#ff0"
}
- ]
+ ],
+ "allowMove": false
},
{
"id": "all_streets",
@@ -367,7 +368,9 @@
]
}
}
- ]
+ ],
+ "allowMove": false
+
}
]
}
diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json
index f86ae5f9d2..52ea313136 100644
--- a/assets/themes/uk_addresses/uk_addresses.json
+++ b/assets/themes/uk_addresses/uk_addresses.json
@@ -681,7 +681,12 @@
},
"width": "3"
}
- ]
+ ],
+ "allowMove": {
+ "enableImproveAccuraccy": true,
+ "enableRelocation": false
+ }
+
},
"named_streets"
],
diff --git a/assets/themes/walkingnodes/walkingnodes.json b/assets/themes/walkingnodes/walkingnodes.json
index c6a3ada634..4dc29796ee 100644
--- a/assets/themes/walkingnodes/walkingnodes.json
+++ b/assets/themes/walkingnodes/walkingnodes.json
@@ -91,6 +91,7 @@
}
],
"pointRendering": null,
+ "allowMove": false,
"tagRenderings": [
{
"builtin": "survey_date",
@@ -195,6 +196,7 @@
}
]
},
+ "allowMove": false,
"tagRenderings": [
{
"id": "node-rwn_ref",
@@ -370,4 +372,4 @@
}
}
]
-}
\ No newline at end of file
+}
diff --git a/assets/themes/width/width.json b/assets/themes/width/width.json
index e68bcce7c3..59a07a5dbb 100644
--- a/assets/themes/width/width.json
+++ b/assets/themes/width/width.json
@@ -200,6 +200,7 @@
"anchor": "center"
}
],
+ "allowMove": false,
"lineRendering": [
{
"width": "4",
diff --git a/langs/ca.json b/langs/ca.json
index 385bbe09c0..99d23e4cc5 100644
--- a/langs/ca.json
+++ b/langs/ca.json
@@ -234,7 +234,6 @@
"createYourOwnTheme": "Crea la teva pròpia petició completa de MapComplete des de zero",
"enterToOpen": "Premeu Intro per obrir el tema",
"hiddenExplanation": "Aquestes peticions només funcionen amb l'enllaç. Has descobert {hidden_discovered} de {total_hidden} peticions amagades.",
- "intro": "Més mapes temàtics? T'agrada captar dades? Hi ha més temes disponibles.",
"noMatchingThemes": "Cap tema coincideix amb els teus criteris de cerca",
"noSearch": "Mostra tots els temes",
"previouslyHiddenTitle": "Peticions visitades i amagades",
diff --git a/langs/cs.json b/langs/cs.json
index ebd18924d0..d38abdca46 100644
--- a/langs/cs.json
+++ b/langs/cs.json
@@ -306,7 +306,6 @@
"createYourOwnTheme": "Vytvořte si vlastní téma MapComplete",
"enterToOpen": "Stisknutím klávesy Enter otevřete objekt",
"hiddenExplanation": "Tato témata jsou přístupná pouze těm, kteří mají odkaz. Objevili jste {hidden_discovered} ze {total_hidden} skrytých témat.",
- "intro": "Více tematických map? Baví vás sbírat geodata? K dispozici jsou další tematické mapy.",
"noMatchingThemes": "Vašim vyhledávacím kritériím neodpovídají žádná témata",
"noSearch": "Zobrazit všechna témata",
"previouslyHiddenTitle": "Dříve navštívená skrytá témata",
diff --git a/langs/da.json b/langs/da.json
index f781cb6274..a5e17c221a 100644
--- a/langs/da.json
+++ b/langs/da.json
@@ -222,7 +222,6 @@
"morescreen": {
"createYourOwnTheme": "Lave dit eget MapComplete tema fra bunden af",
"hiddenExplanation": "Disse temaer er kun tilgængelige med linket. Du har opdaget {hidden_discovered} af {total_hidden} skjulte temaer.",
- "intro": "Flere tematiske kort? Nød du at indsamle geodata? Der er flere temaer til rådighed.",
"noMatchingThemes": "Ingen temaer matchede dine søgekriterier",
"noSearch": "Vis alle temaer",
"previouslyHiddenTitle": "Tidligere besøgte skjulte temaer",
diff --git a/langs/de.json b/langs/de.json
index 3cafbe61fd..f0b76e258b 100644
--- a/langs/de.json
+++ b/langs/de.json
@@ -306,7 +306,6 @@
"createYourOwnTheme": "Ein eigenes MapComplete-Thema von Grund auf neu erstellen",
"enterToOpen": "Drücke Enter um Theme zu öffnen",
"hiddenExplanation": "Diese Themen sind nur für Personen zugänglich, die einen Link erhalten haben. Sie haben {hidden_discovered} von {total_hidden} versteckten Themen entdeckt.",
- "intro": "Mehr thematische Karten? Sammeln Sie gerne Geodaten? Es sind weitere Themen verfügbar.",
"noMatchingThemes": "Keine Themen, die Ihren Suchkriterien entsprechen",
"noSearch": "Alle Themen anzeigen",
"previouslyHiddenTitle": "Zuvor besuchte versteckte Themen",
diff --git a/langs/en.json b/langs/en.json
index cee17c922f..12d3fe147f 100644
--- a/langs/en.json
+++ b/langs/en.json
@@ -193,6 +193,7 @@
},
"josmNotOpened": "JOSM could not be reached. Make sure it is opened and remote control is enabled",
"josmOpened": "JOSM is opened",
+ "madeBy": "Mady by {author} ",
"mapContributionsBy": "The current visible data has edits made by {contributors}",
"mapContributionsByAndHidden": "The current visible data has edits made by {contributors} and {hiddenCount} more contributors",
"mapDataByOsm": "Map data: OpenStreetMap",
@@ -241,6 +242,7 @@
"downloadGeojson": "Download visible data as GeoJSON",
"downloadGpx": "Download as GPX-file",
"downloadGpxHelper": "A GPX-file can be used with most navigation devices and applications",
+ "downloadImage": "Download image",
"exporting": "Exporting…",
"includeMetaData": "Include metadata (last editor, calculated values, …)",
"licenseInfo": "Copyright notice The provided data is available under ODbL. Reusing it is gratis for any purpose, but the attribution © OpenStreetMap contributors must be shown Any change must be published under the same license Please read the full copyright notice for details.",
@@ -299,14 +301,17 @@
"logout": "Log out",
"mappingsAreHidden": "Some options are hidden. Use search to show more options.",
"menu": {
+ "aboutCurrentThemeTitle": "About this map",
"aboutMapComplete": "About MapComplete",
- "filter": "Filter data"
+ "filter": "Filter data",
+ "moreUtilsTitle": "Discover more",
+ "showIntroduction": "Show introduction",
+ "title": "Menu"
},
"morescreen": {
"createYourOwnTheme": "Create your own MapComplete theme from scratch",
"enterToOpen": "Press enter to open theme",
"hiddenExplanation": "These themes are only accessible to those with the link. You have discovered {hidden_discovered} of {total_hidden} hidden themes.",
- "intro": "More thematic maps? Do you enjoy collecting geodata? There are more themes available.",
"noMatchingThemes": "No themes matched your search criteria",
"noSearch": "Show all themes",
"previouslyHiddenTitle": "Previously visited hidden themes",
@@ -410,6 +415,7 @@
"fsUserbadge": "Enable the login button and thus the possibility to make changes",
"fsWelcomeMessage": "Show the welcome message popup and associated tabs",
"intro": "Share this map Share this map by copying the link below and sending it to friends and family:",
+ "openInOtherApplications": "Open the current location with another map application",
"openLayers": "Open the layers and filters menu",
"options": "Sharing options",
"stateIsIncluded": "The current state of the layers and filters is included in the shared link and iframe.",
diff --git a/langs/es.json b/langs/es.json
index e05a0fc90b..91bd244315 100644
--- a/langs/es.json
+++ b/langs/es.json
@@ -238,7 +238,6 @@
"morescreen": {
"createYourOwnTheme": "Crea tu propia petición completa de MapComplete desde cero",
"hiddenExplanation": "Estos temas solo son visibles para aquellos con el enlace. Has descubierto {hidden_discovered} de {total_hidden} temas ocultos.",
- "intro": "Más peticiones Te gusta captar datos? Hay más capas disponibles.",
"noMatchingThemes": "Ningún tema coincide con tus criterios de búsqueda",
"noSearch": "Mostrar todos los temas",
"previouslyHiddenTitle": "Temas ocultos previamente visitados",
diff --git a/langs/fi.json b/langs/fi.json
index 9caa4c6c2b..ad4194fb59 100644
--- a/langs/fi.json
+++ b/langs/fi.json
@@ -271,7 +271,6 @@
"createYourOwnTheme": "Luo oma MapComplete-teema alusta asti",
"enterToOpen": "Avaa teema painamalla enter",
"hiddenExplanation": "Näitä teemoja voi käyttää vain linkin haltijat. Olet löytänyt {hidden_discovered}/{total_hidden} piilotettua teemaa.",
- "intro": "Lisää teemakarttoja? Nautitko paikkatiedon keräämisestä? Teemoja on lisää.",
"noMatchingThemes": "Teemaa ei löytynyt hakuehdollasi",
"noSearch": "Näytä kaikki teemat",
"previouslyHiddenTitle": "Aiemmin katsotut piilotetut teemat",
diff --git a/langs/fr.json b/langs/fr.json
index 1d809c143e..e3d6e3b193 100644
--- a/langs/fr.json
+++ b/langs/fr.json
@@ -214,7 +214,6 @@
"createYourOwnTheme": "Créez votre propre thème MapComplete à partir de zéro",
"enterToOpen": "Appuyez sur Entrée pour ouvrir le thème",
"hiddenExplanation": "Ces thèmes sont seulement accessibles par lien. Vous avez découvert {hidden_discovered} des {total_hidden} thèmes cachés.",
- "intro": "Plus de thèmes ? Vous aimez collecter des données géographiques ? Il y a plus de thèmes disponibles.",
"noMatchingThemes": "Aucun thème ne correspond à vos critères de recherche",
"noSearch": "Afficher tous les thèmes",
"previouslyHiddenTitle": "Thèmes précédemment utilisés",
diff --git a/langs/gl.json b/langs/gl.json
index e744966b90..cdcb7bd7df 100644
--- a/langs/gl.json
+++ b/langs/gl.json
@@ -49,7 +49,6 @@
"loginWithOpenStreetMap": "Inicia a sesión no OpenStreetMap",
"morescreen": {
"createYourOwnTheme": "Crea o teu propio tema completo do MapComplete dende cero.",
- "intro": "Máis tarefas Góstache captar datos? Hai máis capas dispoñíbeis.",
"requestATheme": "Se queres unha tarefa personalizada, solicítaa no seguimento de problemas.",
"streetcomplete": "Outra aplicación semellante é StreetComplete ."
},
diff --git a/langs/hu.json b/langs/hu.json
index 7b781e54f3..94287046ce 100644
--- a/langs/hu.json
+++ b/langs/hu.json
@@ -138,7 +138,6 @@
"morescreen": {
"createYourOwnTheme": "Készítsd el saját MapComplete témád a semmiből",
"hiddenExplanation": "Ezeket a témákat csak az érheti el, akik ismeri a linket. {total_hidden} rejtett téma közül {hidden_discovered} témát ismersz.",
- "intro": "Kíváncsi vagy más tematikus térképekre is? Szeretsz földrajzi adatokat gyűjteni? További témák is elérhetők.",
"noMatchingThemes": "Nincs olyan téma, amely megfelelt volna a keresési feltételeknek",
"noSearch": "Minden téma megjelenítése",
"previouslyHiddenTitle": "Korábban megnézett rejtett témák",
diff --git a/langs/it.json b/langs/it.json
index 6252ae6cd0..fecd93e449 100644
--- a/langs/it.json
+++ b/langs/it.json
@@ -253,7 +253,6 @@
"morescreen": {
"createYourOwnTheme": "Crea il tuo tema di MapComplete personalizzato da zero",
"hiddenExplanation": "Questi temi sono solo accessibili se si dispone del collegamento. Hai scoperto {hidden_discovered} su {total_hidden} temi nascosti.",
- "intro": "Altre mappe tematiche? Ti diverti a raccogliere dati geografici? Sono disponibili altri temi.",
"noMatchingThemes": "Nessun argomento corrisponde ai tuoi criteri di ricerca",
"noSearch": "Mostra tutti gli argomenti",
"previouslyHiddenTitle": "Temi nascosti precedentemente visitati",
diff --git a/langs/ja.json b/langs/ja.json
index 5b40347e35..0823819fef 100644
--- a/langs/ja.json
+++ b/langs/ja.json
@@ -49,7 +49,6 @@
"loginWithOpenStreetMap": "OpenStreetMapからログインする",
"morescreen": {
"createYourOwnTheme": "独自のMapCompleteテーマを最初から作成する",
- "intro": "より多くの主題図 ジオデータの収集は楽しいですか? 他にも使用可能なテーマがあります。",
"requestATheme": "カスタムビルドのクエストが必要な場合は、問題追跡ツールで要請してください",
"streetcomplete": "別に、同様のアプリケーションには、StreetComplete があります。"
},
diff --git a/langs/layers/de.json b/langs/layers/de.json
index b6a112ba11..0e5ba37bed 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -10783,6 +10783,9 @@
},
"6": {
"title": "eine kleine Beherbergungseinrichtung, die in der Regel vom Eigentümer betrieben wird"
+ },
+ "7": {
+ "title": "een kempeerterrein"
}
},
"tagRenderings": {
diff --git a/langs/layers/en.json b/langs/layers/en.json
index e85fe72f52..20fb21f132 100644
--- a/langs/layers/en.json
+++ b/langs/layers/en.json
@@ -7388,6 +7388,9 @@
},
"2": {
"then": "This picnic table is made from (recycled) plastic"
+ },
+ "3": {
+ "then": "This picnic table is made from metal"
}
},
"question": "What material is this picnic table made of?",
@@ -7428,6 +7431,17 @@
},
"question": "Is this playground accessible to wheelchair users?"
},
+ "fee": {
+ "mappings": {
+ "0": {
+ "then": "Free to use"
+ },
+ "1": {
+ "then": "Paid playground"
+ }
+ },
+ "question": "Does one have to pay to use this playground?"
+ },
"playground-access": {
"mappings": {
"0": {
@@ -10783,6 +10797,9 @@
},
"6": {
"title": "a small-scale lodging facility, typically operated by the owner"
+ },
+ "7": {
+ "title": "a camp site or camp ground"
}
},
"tagRenderings": {
diff --git a/langs/layers/nl.json b/langs/layers/nl.json
index eaae409246..b7534c17a4 100644
--- a/langs/layers/nl.json
+++ b/langs/layers/nl.json
@@ -6049,6 +6049,9 @@
},
"2": {
"then": "Deze picknictafel is gemaakt uit (gerecycleerd) plastiek"
+ },
+ "3": {
+ "then": "Deze picnictafel is gemaakt uit metaal"
}
},
"question": "Van welk materiaal is deze picknicktafel gemaakt?",
@@ -6104,6 +6107,17 @@
},
"question": "Is deze speeltuin toegankelijk voor rolstoelgebruikers?"
},
+ "fee": {
+ "mappings": {
+ "0": {
+ "then": "Gratis te gebruiken"
+ },
+ "1": {
+ "then": "Betalend"
+ }
+ },
+ "question": "Moet men betalen om deze speeltuin te gebruiken?"
+ },
"playground-access": {
"mappings": {
"0": {
diff --git a/langs/nb_NO.json b/langs/nb_NO.json
index 57faddea04..1b8b9c9143 100644
--- a/langs/nb_NO.json
+++ b/langs/nb_NO.json
@@ -175,7 +175,6 @@
"morescreen": {
"createYourOwnTheme": "Opprett ditt eget MapComplete-tema fra grunnen av",
"hiddenExplanation": "Disse temaene er kun tilgjengelige hvis du kjenner lenken. Du har oppdaget {hidden_discovered} av {total_hidden} hidden tema.",
- "intro": "Flere temakart? Liker du å samle inn geodata? Det er flere tilgjengelige temaer.",
"noSearch": "Vis alle temaer",
"previouslyHiddenTitle": "Tidligere besøkte skjulte tema",
"requestATheme": "Hvis du ønsker et brukerdefinert tema kan du forespørre det i feilsporeren",
diff --git a/langs/nl.json b/langs/nl.json
index 143477fa85..ac351ae6dc 100644
--- a/langs/nl.json
+++ b/langs/nl.json
@@ -251,7 +251,6 @@
"createYourOwnTheme": "Maak je eigen MapComplete-kaart",
"enterToOpen": "Druk op enter om thema te openen",
"hiddenExplanation": "Deze thema's zijn enkel zichtbaar indien je de link kent. Je hebt {hidden_discovered} van {total_hidden} verborgen thema's ontdekt.",
- "intro": "Meer thematische kaarten? Vind je het leuk om geodata te verzamelen? Hier vind je meer kaartthema's.",
"noMatchingThemes": "Geen enkel thema beantwoordt je zoekopdracht",
"noSearch": "Toon alle thema's",
"previouslyHiddenTitle": "Eerder bezochte verborgen themas",
diff --git a/langs/pl.json b/langs/pl.json
index 375fb5b330..eaabe52bfb 100644
--- a/langs/pl.json
+++ b/langs/pl.json
@@ -226,7 +226,6 @@
"createYourOwnTheme": "Utwórz od podstaw własny temat MapComplete",
"enterToOpen": "Naciśnij Enter, aby otworzyć temat",
"hiddenExplanation": "Te tematy są dostępne tylko dla osób mających odnośnik. Odkryłeś {hidden_discovered} z {total_hidden} ukrytych tematów.",
- "intro": "Więcej map tematycznych? Czy lubisz zbierać dane geograficzne? Dostępnych jest więcej tematów.",
"noMatchingThemes": "Żaden temat nie spełnia kryteriów wyszukiwania",
"noSearch": "Pokaż wszystkie tematy",
"previouslyHiddenTitle": "Wcześniej odwiedzane ukryte tematy",
diff --git a/langs/pt.json b/langs/pt.json
index 425578f87b..01d2beba7b 100644
--- a/langs/pt.json
+++ b/langs/pt.json
@@ -299,7 +299,6 @@
"createYourOwnTheme": "Crie o seu próprio tema MapComplete a partir do zero",
"enterToOpen": "Pressione Enter para abrir o tema",
"hiddenExplanation": "Estes temas só estão acessíveis a quem tiver a hiperligação. Descobriu {hidden_discovered} de {total_hidden} temas ocultos.",
- "intro": "Mais mapas temáticos? Gosta de colecionar dados geográficos? Tem mais temas disponíveis.",
"noMatchingThemes": "Nenhum tema corresponde aos seus critérios de pesquisa",
"noSearch": "Mostrar todos os temas",
"previouslyHiddenTitle": "Temas ocultos visitados anteriormente",
diff --git a/langs/ru.json b/langs/ru.json
index 1ec1c3046e..5084c19593 100644
--- a/langs/ru.json
+++ b/langs/ru.json
@@ -72,7 +72,6 @@
"loginWithOpenStreetMap": "Войти с помощью OpenStreetMap",
"morescreen": {
"createYourOwnTheme": "Создать собственную тему MapComplete с чистого листа",
- "intro": "Больше тематических карт? Нравится собирать геоданные? Можете посмотреть другие темы.",
"requestATheme": "Если вам нужен особенный квест, запросите его в issue-трекере",
"streetcomplete": "Другое, похожее приложение — StreetComplete ."
},
diff --git a/langs/zh_Hant.json b/langs/zh_Hant.json
index b419571928..2027183fcc 100644
--- a/langs/zh_Hant.json
+++ b/langs/zh_Hant.json
@@ -304,7 +304,6 @@
"createYourOwnTheme": "從零開始建立你的 MapComplete 主題",
"enterToOpen": "請按輸入來開啟主題",
"hiddenExplanation": "這些主題只能透過連結來打開,你已經發現 {total_hidden} 當中 {hidden_discovered} 的隱藏主題。",
- "intro": "看更多主題地圖? 您喜歡蒐集地理資料嗎? 還有更多主題。",
"noMatchingThemes": "沒有找到符合的主題",
"noSearch": "顯示所有主題",
"previouslyHiddenTitle": "先前看過隱藏的主題",
diff --git a/package.json b/package.json
index cd35618034..4df0280d46 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "mapcomplete",
- "version": "0.45.7",
+ "version": "0.46.0",
"repository": "https://github.com/pietervdvn/MapComplete",
"description": "A small website to edit OSM easily",
"bugs": "https://github.com/pietervdvn/MapComplete/issues",
diff --git a/public/css/index-tailwind-output.css b/public/css/index-tailwind-output.css
index 320d427ce1..0d22a82190 100644
--- a/public/css/index-tailwind-output.css
+++ b/public/css/index-tailwind-output.css
@@ -25,7 +25,7 @@
/* 2 */
border-style: solid;
/* 2 */
- border-color: #e5e7eb;
+ border-color: #E5E7EB;
/* 2 */
}
@@ -362,7 +362,7 @@ input::placeholder,
textarea::placeholder {
opacity: 1;
/* 1 */
- color: #9ca3af;
+ color: #9CA3AF;
/* 2 */
}
@@ -419,6 +419,471 @@ video {
display: none;
}
+[data-tooltip-style^='light'] + .tooltip > .tooltip-arrow:before {
+ border-style: solid;
+ border-color: #e5e7eb;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='top'] > .tooltip-arrow:before {
+ border-bottom-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='right'] > .tooltip-arrow:before {
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='bottom'] > .tooltip-arrow:before {
+ border-top-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='left'] > .tooltip-arrow:before {
+ border-top-width: 1px;
+ border-right-width: 1px;
+}
+
+.tooltip[data-popper-placement^='top'] > .tooltip-arrow {
+ bottom: -4px;
+}
+
+.tooltip[data-popper-placement^='bottom'] > .tooltip-arrow {
+ top: -4px;
+}
+
+.tooltip[data-popper-placement^='left'] > .tooltip-arrow {
+ right: -4px;
+}
+
+.tooltip[data-popper-placement^='right'] > .tooltip-arrow {
+ left: -4px;
+}
+
+.tooltip.invisible > .tooltip-arrow:before {
+ visibility: hidden;
+}
+
+[data-popper-arrow],[data-popper-arrow]:before {
+ position: absolute;
+ width: 8px;
+ height: 8px;
+ background: inherit;
+}
+
+[data-popper-arrow] {
+ visibility: hidden;
+}
+
+[data-popper-arrow]:before {
+ content: "";
+ visibility: visible;
+ transform: rotate(45deg);
+}
+
+[data-popper-arrow]:after {
+ content: "";
+ visibility: visible;
+ transform: rotate(45deg);
+ position: absolute;
+ width: 9px;
+ height: 9px;
+ background: inherit;
+}
+
+[role="tooltip"] > [data-popper-arrow]:before {
+ border-style: solid;
+ border-color: #e5e7eb;
+}
+
+.dark [role="tooltip"] > [data-popper-arrow]:before {
+ border-style: solid;
+ border-color: #4b5563;
+}
+
+[role="tooltip"] > [data-popper-arrow]:after {
+ border-style: solid;
+ border-color: #e5e7eb;
+}
+
+.dark [role="tooltip"] > [data-popper-arrow]:after {
+ border-style: solid;
+ border-color: #4b5563;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:before {
+ border-bottom-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:after {
+ border-bottom-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:before {
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:after {
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:before {
+ border-top-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:after {
+ border-top-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:before {
+ border-top-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:after {
+ border-top-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow] {
+ bottom: -5px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow] {
+ top: -5px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow] {
+ right: -5px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow] {
+ left: -5px;
+}
+
+[role="tooltip"].invisible > [data-popper-arrow]:before {
+ visibility: hidden;
+}
+
+[role="tooltip"].invisible > [data-popper-arrow]:after {
+ visibility: hidden;
+}
+
+[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {
+ -webkit-appearance: none;
+ appearance: none;
+ background-color: #fff;
+ border-color: #6B7280;
+ border-width: 1px;
+ border-radius: 0px;
+ padding-top: 0.5rem;
+ padding-right: 0.75rem;
+ padding-bottom: 0.5rem;
+ padding-left: 0.75rem;
+ font-size: 1rem;
+ line-height: 1.5rem;
+ --tw-shadow: 0 0 #0000;
+}
+
+[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+ --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: #1C64F2;
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ border-color: #1C64F2;
+}
+
+input::placeholder,textarea::placeholder {
+ color: #6B7280;
+ opacity: 1;
+}
+
+::-webkit-datetime-edit-fields-wrapper {
+ padding: 0;
+}
+
+::-webkit-date-and-time-value {
+ min-height: 1.5em;
+}
+
+select:not([size]) {
+ background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 10 6'%3e %3cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 1 4 4 4-4'/%3e %3c/svg%3e");
+ background-position: right 0.75rem center;
+ background-repeat: no-repeat;
+ background-size: 0.75em 0.75em;
+ padding-right: 2.5rem;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
+}
+
+:is([dir=rtl]) select:not([size]) {
+ background-position: left 0.75rem center;
+ padding-right: 0.75rem;
+ padding-left: 0;
+}
+
+[multiple] {
+ background-image: initial;
+ background-position: initial;
+ background-repeat: unset;
+ background-size: initial;
+ padding-right: 0.75rem;
+ -webkit-print-color-adjust: unset;
+ print-color-adjust: unset;
+}
+
+[type='checkbox'],[type='radio'] {
+ -webkit-appearance: none;
+ appearance: none;
+ padding: 0;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
+ display: inline-block;
+ vertical-align: middle;
+ background-origin: border-box;
+ -webkit-user-select: none;
+ user-select: none;
+ flex-shrink: 0;
+ height: 1rem;
+ width: 1rem;
+ color: #1C64F2;
+ background-color: #fff;
+ border-color: #6B7280;
+ border-width: 1px;
+ --tw-shadow: 0 0 #0000;
+}
+
+[type='checkbox'] {
+ border-radius: 0px;
+}
+
+[type='radio'] {
+ border-radius: 100%;
+}
+
+[type='checkbox']:focus,[type='radio']:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+ --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
+ --tw-ring-offset-width: 2px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: #1C64F2;
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+}
+
+[type='checkbox']:checked,[type='radio']:checked,.dark [type='checkbox']:checked,.dark [type='radio']:checked {
+ border-color: transparent;
+ background-color: currentColor;
+ background-size: 0.55em 0.55em;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+[type='checkbox']:checked {
+ background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3e %3c/svg%3e");
+ background-repeat: no-repeat;
+ background-size: 0.55em 0.55em;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
+}
+
+[type='radio']:checked {
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
+ background-size: 1em 1em;
+}
+
+.dark [type='radio']:checked {
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
+ background-size: 1em 1em;
+}
+
+[type='checkbox']:indeterminate {
+ background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M0.5 6h14'/%3e %3c/svg%3e");
+ background-color: currentColor;
+ border-color: transparent;
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: 0.55em 0.55em;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
+}
+
+[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {
+ border-color: transparent;
+ background-color: currentColor;
+}
+
+[type='file'] {
+ background: unset;
+ border-color: inherit;
+ border-width: 0;
+ border-radius: 0;
+ padding: 0;
+ font-size: unset;
+ line-height: inherit;
+}
+
+[type='file']:focus {
+ outline: 1px auto inherit;
+}
+
+input[type=file]::-webkit-file-upload-button {
+ color: white;
+ background: #1F2937;
+ border: 0;
+ font-weight: 500;
+ font-size: 0.875rem;
+ cursor: pointer;
+ padding-top: 0.625rem;
+ padding-bottom: 0.625rem;
+ padding-left: 2rem;
+ padding-right: 1rem;
+ margin-inline-start: -1rem;
+ margin-inline-end: 1rem;
+}
+
+input[type=file]::file-selector-button {
+ color: white;
+ background: #1F2937;
+ border: 0;
+ font-weight: 500;
+ font-size: 0.875rem;
+ cursor: pointer;
+ padding-top: 0.625rem;
+ padding-bottom: 0.625rem;
+ padding-left: 2rem;
+ padding-right: 1rem;
+ margin-inline-start: -1rem;
+ margin-inline-end: 1rem;
+}
+
+input[type=file]::-webkit-file-upload-button:hover {
+ background: #374151;
+}
+
+input[type=file]::file-selector-button:hover {
+ background: #374151;
+}
+
+:is([dir=rtl]) input[type=file]::-webkit-file-upload-button {
+ padding-right: 2rem;
+ padding-left: 1rem;
+}
+
+:is([dir=rtl]) input[type=file]::file-selector-button {
+ padding-right: 2rem;
+ padding-left: 1rem;
+}
+
+.dark input[type=file]::-webkit-file-upload-button {
+ color: white;
+ background: #4B5563;
+}
+
+.dark input[type=file]::file-selector-button {
+ color: white;
+ background: #4B5563;
+}
+
+.dark input[type=file]::-webkit-file-upload-button:hover {
+ background: #6B7280;
+}
+
+.dark input[type=file]::file-selector-button:hover {
+ background: #6B7280;
+}
+
+input[type="range"]::-webkit-slider-thumb {
+ height: 1.25rem;
+ width: 1.25rem;
+ background: #1C64F2;
+ border-radius: 9999px;
+ border: 0;
+ appearance: none;
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ cursor: pointer;
+}
+
+input[type="range"]:disabled::-webkit-slider-thumb {
+ background: #9CA3AF;
+}
+
+.dark input[type="range"]:disabled::-webkit-slider-thumb {
+ background: #6B7280;
+}
+
+input[type="range"]:focus::-webkit-slider-thumb {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+ --tw-ring-opacity: 1px;
+ --tw-ring-color: rgb(164 202 254 / var(--tw-ring-opacity));
+}
+
+input[type="range"]::-moz-range-thumb {
+ height: 1.25rem;
+ width: 1.25rem;
+ background: #1C64F2;
+ border-radius: 9999px;
+ border: 0;
+ appearance: none;
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ cursor: pointer;
+}
+
+input[type="range"]:disabled::-moz-range-thumb {
+ background: #9CA3AF;
+}
+
+.dark input[type="range"]:disabled::-moz-range-thumb {
+ background: #6B7280;
+}
+
+input[type="range"]::-moz-range-progress {
+ background: #3F83F8;
+}
+
+input[type="range"]::-ms-fill-lower {
+ background: #3F83F8;
+}
+
+input[type="range"].range-sm::-webkit-slider-thumb {
+ height: 1rem;
+ width: 1rem;
+}
+
+input[type="range"].range-lg::-webkit-slider-thumb {
+ height: 1.5rem;
+ width: 1.5rem;
+}
+
+input[type="range"].range-sm::-moz-range-thumb {
+ height: 1rem;
+ width: 1rem;
+}
+
+input[type="range"].range-lg::-moz-range-thumb {
+ height: 1.5rem;
+ width: 1.5rem;
+}
+
*, ::before, ::after {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
@@ -441,7 +906,7 @@ video {
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
- --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-color: rgb(63 131 248 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
@@ -488,7 +953,7 @@ video {
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
- --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-color: rgb(63 131 248 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
@@ -807,18 +1272,22 @@ video {
isolation: auto;
}
+.z-40 {
+ z-index: 40;
+}
+
.-z-10 {
z-index: -10;
}
-.z-10 {
- z-index: 10;
-}
-
.z-50 {
z-index: 50;
}
+.z-10 {
+ z-index: 10;
+}
+
.z-30 {
z-index: 30;
}
@@ -827,10 +1296,6 @@ video {
z-index: 0;
}
-.z-40 {
- z-index: 40;
-}
-
.col-span-2 {
grid-column: span 2 / span 2;
}
@@ -863,14 +1328,14 @@ video {
margin: 0.5rem;
}
-.m-1 {
- margin: 0.25rem;
-}
-
.m-0\.5 {
margin: 0.125rem;
}
+.m-1 {
+ margin: 0.25rem;
+}
+
.m-11 {
margin: 2.75rem;
}
@@ -943,6 +1408,11 @@ video {
margin-right: 0.25rem;
}
+.mx-auto {
+ margin-left: auto;
+ margin-right: auto;
+}
+
.my-4 {
margin-top: 1rem;
margin-bottom: 1rem;
@@ -963,11 +1433,6 @@ video {
margin-bottom: -0.25rem;
}
-.mx-auto {
- margin-left: auto;
- margin-right: auto;
-}
-
.-mx-1\.5 {
margin-left: -0.375rem;
margin-right: -0.375rem;
@@ -993,10 +1458,6 @@ video {
margin-right: 4rem;
}
-.mb-4 {
- margin-bottom: 1rem;
-}
-
.mt-4 {
margin-top: 1rem;
}
@@ -1013,10 +1474,6 @@ video {
margin-bottom: 4rem;
}
-.mt-1 {
- margin-top: 0.25rem;
-}
-
.mr-0\.5 {
margin-right: 0.125rem;
}
@@ -1029,26 +1486,26 @@ video {
margin-right: 0.25rem;
}
+.mt-1 {
+ margin-top: 0.25rem;
+}
+
+.mb-4 {
+ margin-bottom: 1rem;
+}
+
.ml-1 {
margin-left: 0.25rem;
}
+.mt-2 {
+ margin-top: 0.5rem;
+}
+
.ml-2 {
margin-left: 0.5rem;
}
-.mr-10 {
- margin-right: 2.5rem;
-}
-
-.mb-1\.5 {
- margin-bottom: 0.375rem;
-}
-
-.mb-1 {
- margin-bottom: 0.25rem;
-}
-
.ml-4 {
margin-left: 1rem;
}
@@ -1057,8 +1514,16 @@ video {
margin-bottom: 0.5rem;
}
-.mt-2 {
- margin-top: 0.5rem;
+.mr-16 {
+ margin-right: 4rem;
+}
+
+.mb-1\.5 {
+ margin-bottom: 0.375rem;
+}
+
+.mb-1 {
+ margin-bottom: 0.25rem;
}
.mt-8 {
@@ -1073,10 +1538,6 @@ video {
margin-left: -1.5rem;
}
-.mt-12 {
- margin-top: 3rem;
-}
-
.mb-3 {
margin-bottom: 0.75rem;
}
@@ -1217,6 +1678,14 @@ video {
display: none !important;
}
+.h-6 {
+ height: 1.5rem;
+}
+
+.h-9 {
+ height: 2.25rem;
+}
+
.h-24 {
height: 6rem;
}
@@ -1256,10 +1725,6 @@ video {
height: 1rem;
}
-.h-6 {
- height: 1.5rem;
-}
-
.h-0 {
height: 0px;
}
@@ -1272,6 +1737,10 @@ video {
height: 0.75rem;
}
+.h-modal {
+ height: calc(100% - 2rem);
+}
+
.h-7 {
height: 1.75rem;
}
@@ -1284,6 +1753,14 @@ video {
height: 1.25rem;
}
+.h-10 {
+ height: 2.5rem;
+}
+
+.h-14 {
+ height: 3.5rem;
+}
+
.h-16 {
height: 4rem;
}
@@ -1304,10 +1781,6 @@ video {
height: 20rem;
}
-.h-10 {
- height: 2.5rem;
-}
-
.h-20 {
height: 5rem;
}
@@ -1424,10 +1897,6 @@ video {
height: 0.625rem;
}
-.h-14 {
- height: 3.5rem;
-}
-
.h-72 {
height: 18rem;
}
@@ -1444,6 +1913,10 @@ video {
max-height: 3rem;
}
+.max-h-full {
+ max-height: 100%;
+}
+
.max-h-24 {
max-height: 6rem;
}
@@ -1452,10 +1925,6 @@ video {
max-height: 16rem;
}
-.max-h-full {
- max-height: 100%;
-}
-
.max-h-60 {
max-height: 15rem;
}
@@ -1472,6 +1941,14 @@ video {
min-height: 3.2rem;
}
+.w-64 {
+ width: 16rem;
+}
+
+.w-1\/2 {
+ width: 50%;
+}
+
.w-full {
width: 100%;
}
@@ -1480,10 +1957,6 @@ video {
width: 8rem;
}
-.w-64 {
- width: 16rem;
-}
-
.w-8 {
width: 2rem;
}
@@ -1534,8 +2007,12 @@ video {
width: 1.25rem;
}
-.w-1\/2 {
- width: 50%;
+.w-10 {
+ width: 2.5rem;
+}
+
+.w-14 {
+ width: 3.5rem;
}
.w-max {
@@ -1556,10 +2033,6 @@ video {
width: min-content;
}
-.w-10 {
- width: 2.5rem;
-}
-
.w-20 {
width: 5rem;
}
@@ -1624,10 +2097,6 @@ video {
width: 2.25rem;
}
-.w-14 {
- width: 3.5rem;
-}
-
.w-2 {
width: 0.5rem;
}
@@ -1923,6 +2392,14 @@ video {
grid-auto-flow: row;
}
+.grid-cols-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+}
+
+.grid-cols-7 {
+ grid-template-columns: repeat(7, minmax(0, 1fr));
+}
+
.grid-cols-3 {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
@@ -2003,14 +2480,14 @@ video {
gap: 1rem;
}
-.gap-2 {
- gap: 0.5rem;
-}
-
.gap-3 {
gap: 0.75rem;
}
+.gap-2 {
+ gap: 0.5rem;
+}
+
.gap-8 {
gap: 2rem;
}
@@ -2035,6 +2512,10 @@ video {
column-gap: 0.25rem;
}
+.gap-x-4 {
+ column-gap: 1rem;
+}
+
.gap-x-0\.5 {
column-gap: 0.125rem;
}
@@ -2043,14 +2524,16 @@ video {
column-gap: 0px;
}
-.gap-x-4 {
- column-gap: 1rem;
-}
-
.gap-y-8 {
row-gap: 2rem;
}
+.space-y-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(1rem * var(--tw-space-y-reverse));
+}
+
.space-x-0\.5 > :not([hidden]) ~ :not([hidden]) {
--tw-space-x-reverse: 0;
margin-right: calc(0.125rem * var(--tw-space-x-reverse));
@@ -2081,6 +2564,12 @@ video {
margin-bottom: calc(0px * var(--tw-space-y-reverse));
}
+.space-x-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1rem * var(--tw-space-x-reverse));
+ margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
.space-x-2 > :not([hidden]) ~ :not([hidden]) {
--tw-space-x-reverse: 0;
margin-right: calc(0.5rem * var(--tw-space-x-reverse));
@@ -2093,24 +2582,12 @@ video {
margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse)));
}
-.space-y-4 > :not([hidden]) ~ :not([hidden]) {
- --tw-space-y-reverse: 0;
- margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
- margin-bottom: calc(1rem * var(--tw-space-y-reverse));
-}
-
.-space-x-px > :not([hidden]) ~ :not([hidden]) {
--tw-space-x-reverse: 0;
margin-right: calc(-1px * var(--tw-space-x-reverse));
margin-left: calc(-1px * calc(1 - var(--tw-space-x-reverse)));
}
-.space-x-4 > :not([hidden]) ~ :not([hidden]) {
- --tw-space-x-reverse: 0;
- margin-right: calc(1rem * var(--tw-space-x-reverse));
- margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
-}
-
.space-y-1 > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 0;
margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
@@ -2191,37 +2668,37 @@ video {
.divide-red-300 > :not([hidden]) ~ :not([hidden]) {
--tw-divide-opacity: 1;
- border-color: rgb(252 165 165 / var(--tw-divide-opacity));
+ border-color: rgb(248 180 180 / var(--tw-divide-opacity));
}
.divide-yellow-300 > :not([hidden]) ~ :not([hidden]) {
--tw-divide-opacity: 1;
- border-color: rgb(253 224 71 / var(--tw-divide-opacity));
+ border-color: rgb(250 202 21 / var(--tw-divide-opacity));
}
.divide-green-300 > :not([hidden]) ~ :not([hidden]) {
--tw-divide-opacity: 1;
- border-color: rgb(134 239 172 / var(--tw-divide-opacity));
+ border-color: rgb(132 225 188 / var(--tw-divide-opacity));
}
.divide-indigo-300 > :not([hidden]) ~ :not([hidden]) {
--tw-divide-opacity: 1;
- border-color: rgb(165 180 252 / var(--tw-divide-opacity));
+ border-color: rgb(180 198 252 / var(--tw-divide-opacity));
}
.divide-purple-300 > :not([hidden]) ~ :not([hidden]) {
--tw-divide-opacity: 1;
- border-color: rgb(216 180 254 / var(--tw-divide-opacity));
+ border-color: rgb(202 191 253 / var(--tw-divide-opacity));
}
.divide-pink-300 > :not([hidden]) ~ :not([hidden]) {
--tw-divide-opacity: 1;
- border-color: rgb(249 168 212 / var(--tw-divide-opacity));
+ border-color: rgb(248 180 217 / var(--tw-divide-opacity));
}
.divide-blue-300 > :not([hidden]) ~ :not([hidden]) {
--tw-divide-opacity: 1;
- border-color: rgb(147 197 253 / var(--tw-divide-opacity));
+ border-color: rgb(164 202 254 / var(--tw-divide-opacity));
}
.divide-gray-500 > :not([hidden]) ~ :not([hidden]) {
@@ -2229,9 +2706,14 @@ video {
border-color: rgb(107 114 128 / var(--tw-divide-opacity));
}
+.divide-primary-500 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(254 121 93 / var(--tw-divide-opacity));
+}
+
.divide-orange-300 > :not([hidden]) ~ :not([hidden]) {
--tw-divide-opacity: 1;
- border-color: rgb(253 186 116 / var(--tw-divide-opacity));
+ border-color: rgb(253 186 140 / var(--tw-divide-opacity));
}
.self-start {
@@ -2364,6 +2846,21 @@ video {
border-radius: 0.125rem;
}
+.rounded-l-lg {
+ border-top-left-radius: 0.5rem;
+ border-bottom-left-radius: 0.5rem;
+}
+
+.rounded-r-lg {
+ border-top-right-radius: 0.5rem;
+ border-bottom-right-radius: 0.5rem;
+}
+
+.rounded-t-lg {
+ border-top-left-radius: 0.5rem;
+ border-top-right-radius: 0.5rem;
+}
+
.rounded-b {
border-bottom-right-radius: 0.25rem;
border-bottom-left-radius: 0.25rem;
@@ -2374,26 +2871,11 @@ video {
border-bottom-left-radius: 0.5rem;
}
-.rounded-t-lg {
- border-top-left-radius: 0.5rem;
- border-top-right-radius: 0.5rem;
-}
-
.rounded-b-\[1rem\] {
border-bottom-right-radius: 1rem;
border-bottom-left-radius: 1rem;
}
-.rounded-l-lg {
- border-top-left-radius: 0.5rem;
- border-bottom-left-radius: 0.5rem;
-}
-
-.rounded-r-lg {
- border-top-right-radius: 0.5rem;
- border-bottom-right-radius: 0.5rem;
-}
-
.rounded-b-xl {
border-bottom-right-radius: 0.75rem;
border-bottom-left-radius: 0.75rem;
@@ -2439,6 +2921,10 @@ video {
border-top-right-radius: 0.25rem;
}
+.rounded-bl-full {
+ border-bottom-left-radius: 9999px;
+}
+
.rounded-tl {
border-top-left-radius: 0.25rem;
}
@@ -2463,10 +2949,6 @@ video {
border-width: 2px;
}
-.border-0 {
- border-width: 0px;
-}
-
.\!border-0 {
border-width: 0px !important;
}
@@ -2487,6 +2969,10 @@ video {
border-width: 10px;
}
+.border-0 {
+ border-width: 0px;
+}
+
.border-x {
border-left-width: 1px;
border-right-width: 1px;
@@ -2533,11 +3019,6 @@ video {
border-style: none;
}
-.border-black {
- --tw-border-opacity: 1;
- border-color: rgb(0 0 0 / var(--tw-border-opacity));
-}
-
.border-gray-500 {
--tw-border-opacity: 1;
border-color: rgb(107 114 128 / var(--tw-border-opacity));
@@ -2548,6 +3029,11 @@ video {
border-color: rgb(219 234 254 / var(--tw-border-opacity));
}
+.border-black {
+ --tw-border-opacity: 1;
+ border-color: rgb(0 0 0 / var(--tw-border-opacity));
+}
+
.border-gray-200 {
--tw-border-opacity: 1;
border-color: rgb(229 231 235 / var(--tw-border-opacity));
@@ -2568,39 +3054,44 @@ video {
border-color: rgb(255 255 255 / var(--tw-border-opacity));
}
+.border-primary-400 {
+ --tw-border-opacity: 1;
+ border-color: rgb(255 188 173 / var(--tw-border-opacity));
+}
+
.border-blue-400 {
--tw-border-opacity: 1;
- border-color: rgb(96 165 250 / var(--tw-border-opacity));
+ border-color: rgb(118 169 250 / var(--tw-border-opacity));
}
.border-red-400 {
--tw-border-opacity: 1;
- border-color: rgb(248 113 113 / var(--tw-border-opacity));
+ border-color: rgb(249 128 128 / var(--tw-border-opacity));
}
.border-green-400 {
--tw-border-opacity: 1;
- border-color: rgb(74 222 128 / var(--tw-border-opacity));
+ border-color: rgb(49 196 141 / var(--tw-border-opacity));
}
.border-yellow-300 {
--tw-border-opacity: 1;
- border-color: rgb(253 224 71 / var(--tw-border-opacity));
+ border-color: rgb(250 202 21 / var(--tw-border-opacity));
}
.border-indigo-400 {
--tw-border-opacity: 1;
- border-color: rgb(129 140 248 / var(--tw-border-opacity));
+ border-color: rgb(141 162 251 / var(--tw-border-opacity));
}
.border-purple-400 {
--tw-border-opacity: 1;
- border-color: rgb(192 132 252 / var(--tw-border-opacity));
+ border-color: rgb(172 148 250 / var(--tw-border-opacity));
}
.border-pink-400 {
--tw-border-opacity: 1;
- border-color: rgb(244 114 182 / var(--tw-border-opacity));
+ border-color: rgb(241 126 184 / var(--tw-border-opacity));
}
.border-gray-100 {
@@ -2610,27 +3101,32 @@ video {
.border-blue-700 {
--tw-border-opacity: 1;
- border-color: rgb(29 78 216 / var(--tw-border-opacity));
+ border-color: rgb(26 86 219 / var(--tw-border-opacity));
}
.border-green-700 {
--tw-border-opacity: 1;
- border-color: rgb(21 128 61 / var(--tw-border-opacity));
+ border-color: rgb(4 108 78 / var(--tw-border-opacity));
+}
+
+.border-primary-700 {
+ --tw-border-opacity: 1;
+ border-color: rgb(235 79 39 / var(--tw-border-opacity));
}
.border-purple-700 {
--tw-border-opacity: 1;
- border-color: rgb(126 34 206 / var(--tw-border-opacity));
+ border-color: rgb(108 43 217 / var(--tw-border-opacity));
}
.border-red-700 {
--tw-border-opacity: 1;
- border-color: rgb(185 28 28 / var(--tw-border-opacity));
+ border-color: rgb(200 30 30 / var(--tw-border-opacity));
}
.border-yellow-400 {
--tw-border-opacity: 1;
- border-color: rgb(250 204 21 / var(--tw-border-opacity));
+ border-color: rgb(227 160 8 / var(--tw-border-opacity));
}
.border-gray-900 {
@@ -2640,22 +3136,22 @@ video {
.border-green-600 {
--tw-border-opacity: 1;
- border-color: rgb(22 163 74 / var(--tw-border-opacity));
+ border-color: rgb(5 122 85 / var(--tw-border-opacity));
}
.border-red-600 {
--tw-border-opacity: 1;
- border-color: rgb(220 38 38 / var(--tw-border-opacity));
+ border-color: rgb(224 36 36 / var(--tw-border-opacity));
}
.border-green-500 {
--tw-border-opacity: 1;
- border-color: rgb(34 197 94 / var(--tw-border-opacity));
+ border-color: rgb(14 159 110 / var(--tw-border-opacity));
}
.border-red-500 {
--tw-border-opacity: 1;
- border-color: rgb(239 68 68 / var(--tw-border-opacity));
+ border-color: rgb(240 82 82 / var(--tw-border-opacity));
}
.border-gray-700 {
@@ -2663,53 +3159,73 @@ video {
border-color: rgb(55 65 81 / var(--tw-border-opacity));
}
+.border-primary-600 {
+ --tw-border-opacity: 1;
+ border-color: rgb(239 86 47 / var(--tw-border-opacity));
+}
+
.border-transparent {
border-color: transparent;
}
.border-red-300 {
--tw-border-opacity: 1;
- border-color: rgb(252 165 165 / var(--tw-border-opacity));
+ border-color: rgb(248 180 180 / var(--tw-border-opacity));
}
.border-green-300 {
--tw-border-opacity: 1;
- border-color: rgb(134 239 172 / var(--tw-border-opacity));
+ border-color: rgb(132 225 188 / var(--tw-border-opacity));
}
.border-indigo-300 {
--tw-border-opacity: 1;
- border-color: rgb(165 180 252 / var(--tw-border-opacity));
+ border-color: rgb(180 198 252 / var(--tw-border-opacity));
}
.border-purple-300 {
--tw-border-opacity: 1;
- border-color: rgb(216 180 254 / var(--tw-border-opacity));
+ border-color: rgb(202 191 253 / var(--tw-border-opacity));
}
.border-pink-300 {
--tw-border-opacity: 1;
- border-color: rgb(249 168 212 / var(--tw-border-opacity));
+ border-color: rgb(248 180 217 / var(--tw-border-opacity));
}
.border-blue-300 {
--tw-border-opacity: 1;
- border-color: rgb(147 197 253 / var(--tw-border-opacity));
+ border-color: rgb(164 202 254 / var(--tw-border-opacity));
+}
+
+.border-primary-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(254 121 93 / var(--tw-border-opacity));
}
.border-orange-300 {
--tw-border-opacity: 1;
- border-color: rgb(253 186 116 / var(--tw-border-opacity));
+ border-color: rgb(253 186 140 / var(--tw-border-opacity));
}
.border-inherit {
border-color: inherit;
}
+.border-t-gray-300 {
+ --tw-border-opacity: 1;
+ border-top-color: rgb(209 213 219 / var(--tw-border-opacity));
+}
+
.border-opacity-50 {
--tw-border-opacity: 0.5;
}
+.bg-gray-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
+}
+
.bg-gray-500 {
--tw-bg-opacity: 1;
background-color: rgb(107 114 128 / var(--tw-bg-opacity));
@@ -2722,7 +3238,7 @@ video {
.bg-red-400 {
--tw-bg-opacity: 1;
- background-color: rgb(248 113 113 / var(--tw-bg-opacity));
+ background-color: rgb(249 128 128 / var(--tw-bg-opacity));
}
.bg-slate-400 {
@@ -2735,14 +3251,9 @@ video {
background-color: rgb(0 0 0 / var(--tw-bg-opacity));
}
-.bg-gray-200 {
- --tw-bg-opacity: 1;
- background-color: rgb(229 231 235 / var(--tw-bg-opacity));
-}
-
.bg-indigo-100 {
--tw-bg-opacity: 1;
- background-color: rgb(224 231 255 / var(--tw-bg-opacity));
+ background-color: rgb(229 237 255 / var(--tw-bg-opacity));
}
.bg-gray-100 {
@@ -2750,34 +3261,39 @@ video {
background-color: rgb(243 244 246 / var(--tw-bg-opacity));
}
+.bg-primary-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 241 238 / var(--tw-bg-opacity));
+}
+
.bg-blue-100 {
--tw-bg-opacity: 1;
- background-color: rgb(219 234 254 / var(--tw-bg-opacity));
+ background-color: rgb(225 239 254 / var(--tw-bg-opacity));
}
.bg-red-100 {
--tw-bg-opacity: 1;
- background-color: rgb(254 226 226 / var(--tw-bg-opacity));
+ background-color: rgb(253 232 232 / var(--tw-bg-opacity));
}
.bg-green-100 {
--tw-bg-opacity: 1;
- background-color: rgb(220 252 231 / var(--tw-bg-opacity));
+ background-color: rgb(222 247 236 / var(--tw-bg-opacity));
}
.bg-yellow-100 {
--tw-bg-opacity: 1;
- background-color: rgb(254 249 195 / var(--tw-bg-opacity));
+ background-color: rgb(253 246 178 / var(--tw-bg-opacity));
}
.bg-purple-100 {
--tw-bg-opacity: 1;
- background-color: rgb(243 232 255 / var(--tw-bg-opacity));
+ background-color: rgb(237 235 254 / var(--tw-bg-opacity));
}
.bg-pink-100 {
--tw-bg-opacity: 1;
- background-color: rgb(252 231 243 / var(--tw-bg-opacity));
+ background-color: rgb(252 232 243 / var(--tw-bg-opacity));
}
.bg-gray-50 {
@@ -2792,7 +3308,7 @@ video {
.bg-blue-700 {
--tw-bg-opacity: 1;
- background-color: rgb(29 78 216 / var(--tw-bg-opacity));
+ background-color: rgb(26 86 219 / var(--tw-bg-opacity));
}
.bg-gray-800 {
@@ -2802,42 +3318,52 @@ video {
.bg-green-700 {
--tw-bg-opacity: 1;
- background-color: rgb(21 128 61 / var(--tw-bg-opacity));
+ background-color: rgb(4 108 78 / var(--tw-bg-opacity));
+}
+
+.bg-primary-700 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(235 79 39 / var(--tw-bg-opacity));
}
.bg-purple-700 {
--tw-bg-opacity: 1;
- background-color: rgb(126 34 206 / var(--tw-bg-opacity));
+ background-color: rgb(108 43 217 / var(--tw-bg-opacity));
}
.bg-red-700 {
--tw-bg-opacity: 1;
- background-color: rgb(185 28 28 / var(--tw-bg-opacity));
+ background-color: rgb(200 30 30 / var(--tw-bg-opacity));
}
.bg-yellow-400 {
--tw-bg-opacity: 1;
- background-color: rgb(250 204 21 / var(--tw-bg-opacity));
+ background-color: rgb(227 160 8 / var(--tw-bg-opacity));
}
.bg-blue-400 {
--tw-bg-opacity: 1;
- background-color: rgb(96 165 250 / var(--tw-bg-opacity));
+ background-color: rgb(118 169 250 / var(--tw-bg-opacity));
}
.bg-green-400 {
--tw-bg-opacity: 1;
- background-color: rgb(74 222 128 / var(--tw-bg-opacity));
+ background-color: rgb(49 196 141 / var(--tw-bg-opacity));
+}
+
+.bg-primary-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 188 173 / var(--tw-bg-opacity));
}
.bg-purple-400 {
--tw-bg-opacity: 1;
- background-color: rgb(192 132 252 / var(--tw-bg-opacity));
+ background-color: rgb(172 148 250 / var(--tw-bg-opacity));
}
.bg-yellow-300 {
--tw-bg-opacity: 1;
- background-color: rgb(253 224 71 / var(--tw-bg-opacity));
+ background-color: rgb(250 202 21 / var(--tw-bg-opacity));
}
.bg-white\/30 {
@@ -2850,12 +3376,12 @@ video {
.bg-green-50 {
--tw-bg-opacity: 1;
- background-color: rgb(240 253 244 / var(--tw-bg-opacity));
+ background-color: rgb(243 250 247 / var(--tw-bg-opacity));
}
.bg-red-50 {
--tw-bg-opacity: 1;
- background-color: rgb(254 242 242 / var(--tw-bg-opacity));
+ background-color: rgb(253 242 242 / var(--tw-bg-opacity));
}
.bg-gray-300 {
@@ -2869,42 +3395,47 @@ video {
.bg-blue-600 {
--tw-bg-opacity: 1;
- background-color: rgb(37 99 235 / var(--tw-bg-opacity));
+ background-color: rgb(28 100 242 / var(--tw-bg-opacity));
}
.bg-orange-600 {
--tw-bg-opacity: 1;
- background-color: rgb(234 88 12 / var(--tw-bg-opacity));
+ background-color: rgb(208 56 1 / var(--tw-bg-opacity));
}
.bg-green-500 {
--tw-bg-opacity: 1;
- background-color: rgb(34 197 94 / var(--tw-bg-opacity));
+ background-color: rgb(14 159 110 / var(--tw-bg-opacity));
}
.bg-red-500 {
--tw-bg-opacity: 1;
- background-color: rgb(239 68 68 / var(--tw-bg-opacity));
+ background-color: rgb(240 82 82 / var(--tw-bg-opacity));
}
.bg-purple-500 {
--tw-bg-opacity: 1;
- background-color: rgb(168 85 247 / var(--tw-bg-opacity));
+ background-color: rgb(144 97 249 / var(--tw-bg-opacity));
}
.bg-indigo-500 {
--tw-bg-opacity: 1;
- background-color: rgb(99 102 241 / var(--tw-bg-opacity));
+ background-color: rgb(104 117 245 / var(--tw-bg-opacity));
}
.bg-teal-500 {
--tw-bg-opacity: 1;
- background-color: rgb(20 184 166 / var(--tw-bg-opacity));
+ background-color: rgb(6 148 162 / var(--tw-bg-opacity));
}
.bg-blue-50 {
--tw-bg-opacity: 1;
- background-color: rgb(239 246 255 / var(--tw-bg-opacity));
+ background-color: rgb(235 245 255 / var(--tw-bg-opacity));
+}
+
+.bg-primary-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(239 86 47 / var(--tw-bg-opacity));
}
.bg-gray-600 {
@@ -2914,22 +3445,32 @@ video {
.bg-red-600 {
--tw-bg-opacity: 1;
- background-color: rgb(220 38 38 / var(--tw-bg-opacity));
+ background-color: rgb(224 36 36 / var(--tw-bg-opacity));
}
.bg-green-600 {
--tw-bg-opacity: 1;
- background-color: rgb(22 163 74 / var(--tw-bg-opacity));
+ background-color: rgb(5 122 85 / var(--tw-bg-opacity));
}
.bg-purple-600 {
--tw-bg-opacity: 1;
- background-color: rgb(147 51 234 / var(--tw-bg-opacity));
+ background-color: rgb(126 58 242 / var(--tw-bg-opacity));
}
.bg-indigo-600 {
--tw-bg-opacity: 1;
- background-color: rgb(79 70 229 / var(--tw-bg-opacity));
+ background-color: rgb(88 80 236 / var(--tw-bg-opacity));
+}
+
+.bg-primary-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 245 242 / var(--tw-bg-opacity));
+}
+
+.bg-primary-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(254 121 93 / var(--tw-bg-opacity));
}
.bg-gray-400 {
@@ -2939,12 +3480,17 @@ video {
.bg-pink-500 {
--tw-bg-opacity: 1;
- background-color: rgb(236 72 153 / var(--tw-bg-opacity));
+ background-color: rgb(231 70 148 / var(--tw-bg-opacity));
}
.bg-blue-500 {
--tw-bg-opacity: 1;
- background-color: rgb(59 130 246 / var(--tw-bg-opacity));
+ background-color: rgb(63 131 248 / var(--tw-bg-opacity));
+}
+
+.bg-primary-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(204 69 34 / var(--tw-bg-opacity));
}
.bg-gray-700 {
@@ -2954,67 +3500,72 @@ video {
.bg-red-900 {
--tw-bg-opacity: 1;
- background-color: rgb(127 29 29 / var(--tw-bg-opacity));
+ background-color: rgb(119 29 29 / var(--tw-bg-opacity));
}
.bg-yellow-600 {
--tw-bg-opacity: 1;
- background-color: rgb(202 138 4 / var(--tw-bg-opacity));
+ background-color: rgb(159 88 10 / var(--tw-bg-opacity));
}
.bg-green-800 {
--tw-bg-opacity: 1;
- background-color: rgb(22 101 52 / var(--tw-bg-opacity));
+ background-color: rgb(3 84 63 / var(--tw-bg-opacity));
}
.bg-indigo-800 {
--tw-bg-opacity: 1;
- background-color: rgb(55 48 163 / var(--tw-bg-opacity));
+ background-color: rgb(66 56 157 / var(--tw-bg-opacity));
}
.bg-purple-800 {
--tw-bg-opacity: 1;
- background-color: rgb(107 33 168 / var(--tw-bg-opacity));
+ background-color: rgb(85 33 181 / var(--tw-bg-opacity));
}
.bg-pink-800 {
--tw-bg-opacity: 1;
- background-color: rgb(157 23 77 / var(--tw-bg-opacity));
+ background-color: rgb(153 21 75 / var(--tw-bg-opacity));
}
.bg-blue-800 {
--tw-bg-opacity: 1;
- background-color: rgb(30 64 175 / var(--tw-bg-opacity));
+ background-color: rgb(30 66 159 / var(--tw-bg-opacity));
}
.bg-yellow-500 {
--tw-bg-opacity: 1;
- background-color: rgb(234 179 8 / var(--tw-bg-opacity));
+ background-color: rgb(194 120 3 / var(--tw-bg-opacity));
}
.bg-blue-200 {
--tw-bg-opacity: 1;
- background-color: rgb(191 219 254 / var(--tw-bg-opacity));
+ background-color: rgb(195 221 253 / var(--tw-bg-opacity));
+}
+
+.bg-primary-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 228 222 / var(--tw-bg-opacity));
}
.bg-orange-100 {
--tw-bg-opacity: 1;
- background-color: rgb(255 237 213 / var(--tw-bg-opacity));
+ background-color: rgb(254 236 220 / var(--tw-bg-opacity));
}
.bg-yellow-50 {
--tw-bg-opacity: 1;
- background-color: rgb(254 252 232 / var(--tw-bg-opacity));
+ background-color: rgb(253 253 234 / var(--tw-bg-opacity));
}
.bg-indigo-50 {
--tw-bg-opacity: 1;
- background-color: rgb(238 242 255 / var(--tw-bg-opacity));
+ background-color: rgb(240 245 255 / var(--tw-bg-opacity));
}
.bg-purple-50 {
--tw-bg-opacity: 1;
- background-color: rgb(250 245 255 / var(--tw-bg-opacity));
+ background-color: rgb(246 245 255 / var(--tw-bg-opacity));
}
.bg-pink-50 {
@@ -3024,7 +3575,7 @@ video {
.bg-orange-50 {
--tw-bg-opacity: 1;
- background-color: rgb(255 247 237 / var(--tw-bg-opacity));
+ background-color: rgb(255 248 241 / var(--tw-bg-opacity));
}
.bg-opacity-75 {
@@ -3044,14 +3595,14 @@ video {
}
.from-blue-500 {
- --tw-gradient-from: #3b82f6;
- --tw-gradient-to: rgb(59 130 246 / 0);
+ --tw-gradient-from: #3F83F8;
+ --tw-gradient-to: rgb(63 131 248 / 0);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-green-400 {
- --tw-gradient-from: #4ade80;
- --tw-gradient-to: rgb(74 222 128 / 0);
+ --tw-gradient-from: #31C48D;
+ --tw-gradient-to: rgb(49 196 141 / 0);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
@@ -3062,8 +3613,8 @@ video {
}
.from-teal-400 {
- --tw-gradient-from: #2dd4bf;
- --tw-gradient-to: rgb(45 212 191 / 0);
+ --tw-gradient-from: #16BDCA;
+ --tw-gradient-to: rgb(22 189 202 / 0);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
@@ -3074,26 +3625,26 @@ video {
}
.from-red-400 {
- --tw-gradient-from: #f87171;
- --tw-gradient-to: rgb(248 113 113 / 0);
+ --tw-gradient-from: #F98080;
+ --tw-gradient-to: rgb(249 128 128 / 0);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-pink-400 {
- --tw-gradient-from: #f472b6;
- --tw-gradient-to: rgb(244 114 182 / 0);
+ --tw-gradient-from: #F17EB8;
+ --tw-gradient-to: rgb(241 126 184 / 0);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-purple-500 {
- --tw-gradient-from: #a855f7;
- --tw-gradient-to: rgb(168 85 247 / 0);
+ --tw-gradient-from: #9061F9;
+ --tw-gradient-to: rgb(144 97 249 / 0);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-purple-600 {
- --tw-gradient-from: #9333ea;
- --tw-gradient-to: rgb(147 51 234 / 0);
+ --tw-gradient-from: #7E3AF2;
+ --tw-gradient-to: rgb(126 58 242 / 0);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
@@ -3104,20 +3655,20 @@ video {
}
.from-pink-500 {
- --tw-gradient-from: #ec4899;
- --tw-gradient-to: rgb(236 72 153 / 0);
+ --tw-gradient-from: #E74694;
+ --tw-gradient-to: rgb(231 70 148 / 0);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-teal-200 {
- --tw-gradient-from: #99f6e4;
- --tw-gradient-to: rgb(153 246 228 / 0);
+ --tw-gradient-from: #AFECEF;
+ --tw-gradient-to: rgb(175 236 239 / 0);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-red-200 {
- --tw-gradient-from: #fecaca;
- --tw-gradient-to: rgb(254 202 202 / 0);
+ --tw-gradient-from: #FBD5D5;
+ --tw-gradient-to: rgb(251 213 213 / 0);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
@@ -3128,13 +3679,13 @@ video {
}
.via-blue-600 {
- --tw-gradient-to: rgb(37 99 235 / 0);
- --tw-gradient-stops: var(--tw-gradient-from), #2563eb, var(--tw-gradient-to);
+ --tw-gradient-to: rgb(28 100 242 / 0);
+ --tw-gradient-stops: var(--tw-gradient-from), #1C64F2, var(--tw-gradient-to);
}
.via-green-500 {
- --tw-gradient-to: rgb(34 197 94 / 0);
- --tw-gradient-stops: var(--tw-gradient-from), #22c55e, var(--tw-gradient-to);
+ --tw-gradient-to: rgb(14 159 110 / 0);
+ --tw-gradient-stops: var(--tw-gradient-from), #0E9F6E, var(--tw-gradient-to);
}
.via-cyan-500 {
@@ -3143,8 +3694,8 @@ video {
}
.via-teal-500 {
- --tw-gradient-to: rgb(20 184 166 / 0);
- --tw-gradient-stops: var(--tw-gradient-from), #14b8a6, var(--tw-gradient-to);
+ --tw-gradient-to: rgb(6 148 162 / 0);
+ --tw-gradient-stops: var(--tw-gradient-from), #0694A2, var(--tw-gradient-to);
}
.via-lime-400 {
@@ -3153,31 +3704,31 @@ video {
}
.via-red-500 {
- --tw-gradient-to: rgb(239 68 68 / 0);
- --tw-gradient-stops: var(--tw-gradient-from), #ef4444, var(--tw-gradient-to);
+ --tw-gradient-to: rgb(240 82 82 / 0);
+ --tw-gradient-stops: var(--tw-gradient-from), #F05252, var(--tw-gradient-to);
}
.via-pink-500 {
- --tw-gradient-to: rgb(236 72 153 / 0);
- --tw-gradient-stops: var(--tw-gradient-from), #ec4899, var(--tw-gradient-to);
+ --tw-gradient-to: rgb(231 70 148 / 0);
+ --tw-gradient-stops: var(--tw-gradient-from), #E74694, var(--tw-gradient-to);
}
.via-purple-600 {
- --tw-gradient-to: rgb(147 51 234 / 0);
- --tw-gradient-stops: var(--tw-gradient-from), #9333ea, var(--tw-gradient-to);
+ --tw-gradient-to: rgb(126 58 242 / 0);
+ --tw-gradient-stops: var(--tw-gradient-from), #7E3AF2, var(--tw-gradient-to);
}
.via-red-300 {
- --tw-gradient-to: rgb(252 165 165 / 0);
- --tw-gradient-stops: var(--tw-gradient-from), #fca5a5, var(--tw-gradient-to);
+ --tw-gradient-to: rgb(248 180 180 / 0);
+ --tw-gradient-stops: var(--tw-gradient-from), #F8B4B4, var(--tw-gradient-to);
}
.to-blue-700 {
- --tw-gradient-to: #1d4ed8;
+ --tw-gradient-to: #1A56DB;
}
.to-green-600 {
- --tw-gradient-to: #16a34a;
+ --tw-gradient-to: #057A55;
}
.to-cyan-600 {
@@ -3185,7 +3736,7 @@ video {
}
.to-teal-600 {
- --tw-gradient-to: #0d9488;
+ --tw-gradient-to: #047481;
}
.to-lime-500 {
@@ -3193,31 +3744,31 @@ video {
}
.to-red-600 {
- --tw-gradient-to: #dc2626;
+ --tw-gradient-to: #E02424;
}
.to-pink-600 {
- --tw-gradient-to: #db2777;
+ --tw-gradient-to: #D61F69;
}
.to-purple-700 {
- --tw-gradient-to: #7e22ce;
+ --tw-gradient-to: #6C2BD9;
}
.to-blue-500 {
- --tw-gradient-to: #3b82f6;
+ --tw-gradient-to: #3F83F8;
}
.to-blue-600 {
- --tw-gradient-to: #2563eb;
+ --tw-gradient-to: #1C64F2;
}
.to-pink-500 {
- --tw-gradient-to: #ec4899;
+ --tw-gradient-to: #E74694;
}
.to-orange-400 {
- --tw-gradient-to: #fb923c;
+ --tw-gradient-to: #FF8A4C;
}
.to-lime-200 {
@@ -3225,7 +3776,7 @@ video {
}
.to-yellow-200 {
- --tw-gradient-to: #fef08a;
+ --tw-gradient-to: #FCE96A;
}
.to-emerald-600 {
@@ -3241,36 +3792,40 @@ video {
background-repeat: repeat;
}
+.fill-primary-600 {
+ fill: #EF562F;
+}
+
.fill-blue-600 {
- fill: #2563eb;
+ fill: #1C64F2;
}
.fill-gray-600 {
- fill: #4b5563;
+ fill: #4B5563;
}
.fill-green-500 {
- fill: #22c55e;
+ fill: #0E9F6E;
}
.fill-red-600 {
- fill: #dc2626;
+ fill: #E02424;
}
.fill-yellow-400 {
- fill: #facc15;
+ fill: #E3A008;
}
.fill-pink-600 {
- fill: #db2777;
+ fill: #D61F69;
}
.fill-purple-600 {
- fill: #9333ea;
+ fill: #7E3AF2;
}
.fill-white {
- fill: #fff;
+ fill: #ffffff;
}
.object-cover {
@@ -3348,9 +3903,9 @@ video {
padding-right: 0.25rem;
}
-.py-8 {
- padding-top: 2rem;
- padding-bottom: 2rem;
+.py-1 {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
}
.px-3 {
@@ -3358,11 +3913,6 @@ video {
padding-right: 0.75rem;
}
-.py-1 {
- padding-top: 0.25rem;
- padding-bottom: 0.25rem;
-}
-
.py-5 {
padding-top: 1.25rem;
padding-bottom: 1.25rem;
@@ -3450,6 +4000,10 @@ video {
padding-left: 0.5rem;
}
+.pl-1 {
+ padding-left: 0.25rem;
+}
+
.pr-1 {
padding-right: 0.25rem;
}
@@ -3462,6 +4016,14 @@ video {
padding-top: 0px;
}
+.pl-3 {
+ padding-left: 0.75rem;
+}
+
+.pb-3 {
+ padding-bottom: 0.75rem;
+}
+
.pl-4 {
padding-left: 1rem;
}
@@ -3470,18 +4032,6 @@ video {
padding-right: 1rem;
}
-.pl-3 {
- padding-left: 0.75rem;
-}
-
-.pr-3 {
- padding-right: 0.75rem;
-}
-
-.pl-1 {
- padding-left: 0.25rem;
-}
-
.pb-1\.5 {
padding-bottom: 0.375rem;
}
@@ -3698,6 +4248,14 @@ video {
font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
}
+.leading-6 {
+ line-height: 1.5rem;
+}
+
+.leading-9 {
+ line-height: 2.25rem;
+}
+
.leading-none {
line-height: 1;
}
@@ -3768,44 +4326,54 @@ video {
color: rgb(75 85 99 / var(--tw-text-opacity));
}
+.text-primary-800 {
+ --tw-text-opacity: 1;
+ color: rgb(204 69 34 / var(--tw-text-opacity));
+}
+
.text-blue-800 {
--tw-text-opacity: 1;
- color: rgb(30 64 175 / var(--tw-text-opacity));
+ color: rgb(30 66 159 / var(--tw-text-opacity));
}
.text-red-800 {
--tw-text-opacity: 1;
- color: rgb(153 27 27 / var(--tw-text-opacity));
+ color: rgb(155 28 28 / var(--tw-text-opacity));
}
.text-green-800 {
--tw-text-opacity: 1;
- color: rgb(22 101 52 / var(--tw-text-opacity));
+ color: rgb(3 84 63 / var(--tw-text-opacity));
}
.text-yellow-800 {
--tw-text-opacity: 1;
- color: rgb(133 77 14 / var(--tw-text-opacity));
+ color: rgb(114 59 19 / var(--tw-text-opacity));
}
.text-indigo-800 {
--tw-text-opacity: 1;
- color: rgb(55 48 163 / var(--tw-text-opacity));
+ color: rgb(66 56 157 / var(--tw-text-opacity));
}
.text-purple-800 {
--tw-text-opacity: 1;
- color: rgb(107 33 168 / var(--tw-text-opacity));
+ color: rgb(85 33 181 / var(--tw-text-opacity));
}
.text-pink-800 {
--tw-text-opacity: 1;
- color: rgb(157 23 77 / var(--tw-text-opacity));
+ color: rgb(153 21 75 / var(--tw-text-opacity));
+}
+
+.text-primary-400 {
+ --tw-text-opacity: 1;
+ color: rgb(255 188 173 / var(--tw-text-opacity));
}
.text-blue-400 {
--tw-text-opacity: 1;
- color: rgb(96 165 250 / var(--tw-text-opacity));
+ color: rgb(118 169 250 / var(--tw-text-opacity));
}
.text-gray-400 {
@@ -3815,32 +4383,37 @@ video {
.text-red-400 {
--tw-text-opacity: 1;
- color: rgb(248 113 113 / var(--tw-text-opacity));
+ color: rgb(249 128 128 / var(--tw-text-opacity));
}
.text-green-400 {
--tw-text-opacity: 1;
- color: rgb(74 222 128 / var(--tw-text-opacity));
+ color: rgb(49 196 141 / var(--tw-text-opacity));
}
.text-yellow-400 {
--tw-text-opacity: 1;
- color: rgb(250 204 21 / var(--tw-text-opacity));
+ color: rgb(227 160 8 / var(--tw-text-opacity));
}
.text-indigo-400 {
--tw-text-opacity: 1;
- color: rgb(129 140 248 / var(--tw-text-opacity));
+ color: rgb(141 162 251 / var(--tw-text-opacity));
}
.text-purple-400 {
--tw-text-opacity: 1;
- color: rgb(192 132 252 / var(--tw-text-opacity));
+ color: rgb(172 148 250 / var(--tw-text-opacity));
}
.text-pink-400 {
--tw-text-opacity: 1;
- color: rgb(244 114 182 / var(--tw-text-opacity));
+ color: rgb(241 126 184 / var(--tw-text-opacity));
+}
+
+.text-primary-700 {
+ --tw-text-opacity: 1;
+ color: rgb(235 79 39 / var(--tw-text-opacity));
}
.text-gray-700 {
@@ -3850,47 +4423,52 @@ video {
.text-blue-900 {
--tw-text-opacity: 1;
- color: rgb(30 58 138 / var(--tw-text-opacity));
+ color: rgb(35 56 118 / var(--tw-text-opacity));
}
.text-green-900 {
--tw-text-opacity: 1;
- color: rgb(20 83 45 / var(--tw-text-opacity));
+ color: rgb(1 71 55 / var(--tw-text-opacity));
+}
+
+.text-primary-900 {
+ --tw-text-opacity: 1;
+ color: rgb(165 55 27 / var(--tw-text-opacity));
}
.text-purple-900 {
--tw-text-opacity: 1;
- color: rgb(88 28 135 / var(--tw-text-opacity));
+ color: rgb(74 29 150 / var(--tw-text-opacity));
}
.text-red-900 {
--tw-text-opacity: 1;
- color: rgb(127 29 29 / var(--tw-text-opacity));
+ color: rgb(119 29 29 / var(--tw-text-opacity));
}
.text-yellow-900 {
--tw-text-opacity: 1;
- color: rgb(113 63 18 / var(--tw-text-opacity));
+ color: rgb(99 49 18 / var(--tw-text-opacity));
}
.text-blue-700 {
--tw-text-opacity: 1;
- color: rgb(29 78 216 / var(--tw-text-opacity));
+ color: rgb(26 86 219 / var(--tw-text-opacity));
}
.text-green-700 {
--tw-text-opacity: 1;
- color: rgb(21 128 61 / var(--tw-text-opacity));
+ color: rgb(4 108 78 / var(--tw-text-opacity));
}
.text-purple-700 {
--tw-text-opacity: 1;
- color: rgb(126 34 206 / var(--tw-text-opacity));
+ color: rgb(108 43 217 / var(--tw-text-opacity));
}
.text-red-700 {
--tw-text-opacity: 1;
- color: rgb(185 28 28 / var(--tw-text-opacity));
+ color: rgb(200 30 30 / var(--tw-text-opacity));
}
.\!text-gray-900 {
@@ -3900,32 +4478,47 @@ video {
.text-green-600 {
--tw-text-opacity: 1;
- color: rgb(22 163 74 / var(--tw-text-opacity));
+ color: rgb(5 122 85 / var(--tw-text-opacity));
}
.text-red-600 {
--tw-text-opacity: 1;
- color: rgb(220 38 38 / var(--tw-text-opacity));
+ color: rgb(224 36 36 / var(--tw-text-opacity));
+}
+
+.text-primary-500 {
+ --tw-text-opacity: 1;
+ color: rgb(254 121 93 / var(--tw-text-opacity));
+}
+
+.text-primary-600 {
+ --tw-text-opacity: 1;
+ color: rgb(239 86 47 / var(--tw-text-opacity));
}
.text-purple-600 {
--tw-text-opacity: 1;
- color: rgb(147 51 234 / var(--tw-text-opacity));
+ color: rgb(126 58 242 / var(--tw-text-opacity));
}
.text-teal-600 {
--tw-text-opacity: 1;
- color: rgb(13 148 136 / var(--tw-text-opacity));
+ color: rgb(4 116 129 / var(--tw-text-opacity));
}
.text-orange-500 {
--tw-text-opacity: 1;
- color: rgb(249 115 22 / var(--tw-text-opacity));
+ color: rgb(255 90 31 / var(--tw-text-opacity));
}
.text-blue-600 {
--tw-text-opacity: 1;
- color: rgb(37 99 235 / var(--tw-text-opacity));
+ color: rgb(28 100 242 / var(--tw-text-opacity));
+}
+
+.text-primary-100 {
+ --tw-text-opacity: 1;
+ color: rgb(255 241 238 / var(--tw-text-opacity));
}
.text-gray-200 {
@@ -3940,77 +4533,77 @@ video {
.text-blue-100 {
--tw-text-opacity: 1;
- color: rgb(219 234 254 / var(--tw-text-opacity));
+ color: rgb(225 239 254 / var(--tw-text-opacity));
}
.text-green-100 {
--tw-text-opacity: 1;
- color: rgb(220 252 231 / var(--tw-text-opacity));
+ color: rgb(222 247 236 / var(--tw-text-opacity));
}
.text-red-100 {
--tw-text-opacity: 1;
- color: rgb(254 226 226 / var(--tw-text-opacity));
+ color: rgb(253 232 232 / var(--tw-text-opacity));
}
.text-yellow-100 {
--tw-text-opacity: 1;
- color: rgb(254 249 195 / var(--tw-text-opacity));
+ color: rgb(253 246 178 / var(--tw-text-opacity));
}
.text-purple-100 {
--tw-text-opacity: 1;
- color: rgb(243 232 255 / var(--tw-text-opacity));
+ color: rgb(237 235 254 / var(--tw-text-opacity));
}
.text-indigo-100 {
--tw-text-opacity: 1;
- color: rgb(224 231 255 / var(--tw-text-opacity));
+ color: rgb(229 237 255 / var(--tw-text-opacity));
}
.text-pink-100 {
--tw-text-opacity: 1;
- color: rgb(252 231 243 / var(--tw-text-opacity));
+ color: rgb(252 232 243 / var(--tw-text-opacity));
}
.text-blue-50 {
--tw-text-opacity: 1;
- color: rgb(239 246 255 / var(--tw-text-opacity));
+ color: rgb(235 245 255 / var(--tw-text-opacity));
}
.text-red-500 {
--tw-text-opacity: 1;
- color: rgb(239 68 68 / var(--tw-text-opacity));
+ color: rgb(240 82 82 / var(--tw-text-opacity));
}
.text-yellow-500 {
--tw-text-opacity: 1;
- color: rgb(234 179 8 / var(--tw-text-opacity));
+ color: rgb(194 120 3 / var(--tw-text-opacity));
}
.text-green-500 {
--tw-text-opacity: 1;
- color: rgb(34 197 94 / var(--tw-text-opacity));
+ color: rgb(14 159 110 / var(--tw-text-opacity));
}
.text-blue-500 {
--tw-text-opacity: 1;
- color: rgb(59 130 246 / var(--tw-text-opacity));
+ color: rgb(63 131 248 / var(--tw-text-opacity));
}
.text-indigo-500 {
--tw-text-opacity: 1;
- color: rgb(99 102 241 / var(--tw-text-opacity));
+ color: rgb(104 117 245 / var(--tw-text-opacity));
}
.text-purple-500 {
--tw-text-opacity: 1;
- color: rgb(168 85 247 / var(--tw-text-opacity));
+ color: rgb(144 97 249 / var(--tw-text-opacity));
}
.text-pink-500 {
--tw-text-opacity: 1;
- color: rgb(236 72 153 / var(--tw-text-opacity));
+ color: rgb(231 70 148 / var(--tw-text-opacity));
}
.text-transparent {
@@ -4019,7 +4612,7 @@ video {
.text-orange-800 {
--tw-text-opacity: 1;
- color: rgb(154 52 18 / var(--tw-text-opacity));
+ color: rgb(138 44 13 / var(--tw-text-opacity));
}
.underline {
@@ -4039,7 +4632,7 @@ video {
}
.decoration-blue-400 {
- text-decoration-color: #60a5fa;
+ text-decoration-color: #76A9FA;
}
.decoration-2 {
@@ -4058,12 +4651,12 @@ video {
.placeholder-green-700::placeholder {
--tw-placeholder-opacity: 1;
- color: rgb(21 128 61 / var(--tw-placeholder-opacity));
+ color: rgb(4 108 78 / var(--tw-placeholder-opacity));
}
.placeholder-red-700::placeholder {
--tw-placeholder-opacity: 1;
- color: rgb(185 28 28 / var(--tw-placeholder-opacity));
+ color: rgb(200 30 30 / var(--tw-placeholder-opacity));
}
.opacity-50 {
@@ -4082,12 +4675,24 @@ video {
opacity: 0.3;
}
+.shadow-lg {
+ --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
.shadow {
--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
+.shadow-md {
+ --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
.shadow-sm {
--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
@@ -4100,56 +4705,49 @@ video {
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
-.shadow-lg {
- --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
- --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
-}
-
.shadow-xl {
--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
-.shadow-md {
- --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
- --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
-}
-
.shadow-gray-300 {
- --tw-shadow-color: #d1d5db;
+ --tw-shadow-color: #D1D5DB;
--tw-shadow: var(--tw-shadow-colored);
}
.shadow-blue-700 {
- --tw-shadow-color: #1d4ed8;
+ --tw-shadow-color: #1A56DB;
--tw-shadow: var(--tw-shadow-colored);
}
.shadow-gray-800 {
- --tw-shadow-color: #1f2937;
+ --tw-shadow-color: #1F2937;
--tw-shadow: var(--tw-shadow-colored);
}
.shadow-green-700 {
- --tw-shadow-color: #15803d;
+ --tw-shadow-color: #046C4E;
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.shadow-primary-700 {
+ --tw-shadow-color: #EB4F27;
--tw-shadow: var(--tw-shadow-colored);
}
.shadow-purple-700 {
- --tw-shadow-color: #7e22ce;
+ --tw-shadow-color: #6C2BD9;
--tw-shadow: var(--tw-shadow-colored);
}
.shadow-red-700 {
- --tw-shadow-color: #b91c1c;
+ --tw-shadow-color: #C81E1E;
--tw-shadow: var(--tw-shadow-colored);
}
.shadow-yellow-500 {
- --tw-shadow-color: #eab308;
+ --tw-shadow-color: #C27803;
--tw-shadow: var(--tw-shadow-colored);
}
@@ -4159,27 +4757,32 @@ video {
}
.shadow-blue-500\/50 {
- --tw-shadow-color: rgb(59 130 246 / 0.5);
+ --tw-shadow-color: rgb(63 131 248 / 0.5);
--tw-shadow: var(--tw-shadow-colored);
}
.shadow-green-500\/50 {
- --tw-shadow-color: rgb(34 197 94 / 0.5);
+ --tw-shadow-color: rgb(14 159 110 / 0.5);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.shadow-primary-500\/50 {
+ --tw-shadow-color: rgb(254 121 93 / 0.5);
--tw-shadow: var(--tw-shadow-colored);
}
.shadow-purple-500\/50 {
- --tw-shadow-color: rgb(168 85 247 / 0.5);
+ --tw-shadow-color: rgb(144 97 249 / 0.5);
--tw-shadow: var(--tw-shadow-colored);
}
.shadow-red-500\/50 {
- --tw-shadow-color: rgb(239 68 68 / 0.5);
+ --tw-shadow-color: rgb(240 82 82 / 0.5);
--tw-shadow: var(--tw-shadow-colored);
}
.shadow-yellow-500\/50 {
- --tw-shadow-color: rgb(234 179 8 / 0.5);
+ --tw-shadow-color: rgb(194 120 3 / 0.5);
--tw-shadow: var(--tw-shadow-colored);
}
@@ -4189,7 +4792,7 @@ video {
}
.shadow-teal-500\/50 {
- --tw-shadow-color: rgb(20 184 166 / 0.5);
+ --tw-shadow-color: rgb(6 148 162 / 0.5);
--tw-shadow: var(--tw-shadow-colored);
}
@@ -4199,7 +4802,7 @@ video {
}
.shadow-pink-500\/50 {
- --tw-shadow-color: rgb(236 72 153 / 0.5);
+ --tw-shadow-color: rgb(231 70 148 / 0.5);
--tw-shadow: var(--tw-shadow-colored);
}
@@ -4243,6 +4846,11 @@ video {
--tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity));
}
+.ring-primary-500 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(254 121 93 / var(--tw-ring-opacity));
+}
+
.ring-white {
--tw-ring-opacity: 1;
--tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity));
@@ -4253,13 +4861,13 @@ video {
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
-.drop-shadow-md {
- --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));
+.drop-shadow-2xl {
+ --tw-drop-shadow: drop-shadow(0 25px 25px rgb(0 0 0 / 0.15));
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
-.drop-shadow-2xl {
- --tw-drop-shadow: drop-shadow(0 25px 25px rgb(0 0 0 / 0.15));
+.drop-shadow-md {
+ --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
@@ -4537,6 +5145,10 @@ input[type="text"] {
border-radius: 0.5rem;
}
+.box-shadow {
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+}
+
/******************* Styling of input elements **********************/
/**
@@ -4810,10 +5422,18 @@ code {
color: var(--background-color);
}
+.h-full-child > div {
+ height: 100%;
+}
+
.bg-black-transparent {
background-color: #00000088;
}
+.bg-black-light-transparent {
+ background-color: #00000044;
+}
+
.block-ruby {
display: block ruby;
}
@@ -4887,6 +5507,10 @@ a.link-underline {
background-color: #f2f2f2;
}
+.no-bold b {
+ font-weight: normal;
+}
+
/************************* MISC ELEMENTS *************************/
.selected svg:not(.noselect *) path.selectable {
@@ -4959,6 +5583,10 @@ svg.apply-fill path {
max-width: 100%;
}
+.max-w-screen {
+ max-width: 100vw;
+}
+
/************************* Experimental support for foldable devices ********************************/
@media (horizontal-viewport-segments: 2) {
@@ -5154,27 +5782,27 @@ svg.apply-fill path {
.odd\:bg-blue-800:nth-child(odd) {
--tw-bg-opacity: 1;
- background-color: rgb(30 64 175 / var(--tw-bg-opacity));
+ background-color: rgb(30 66 159 / var(--tw-bg-opacity));
}
.odd\:bg-green-800:nth-child(odd) {
--tw-bg-opacity: 1;
- background-color: rgb(22 101 52 / var(--tw-bg-opacity));
+ background-color: rgb(3 84 63 / var(--tw-bg-opacity));
}
.odd\:bg-red-800:nth-child(odd) {
--tw-bg-opacity: 1;
- background-color: rgb(153 27 27 / var(--tw-bg-opacity));
+ background-color: rgb(155 28 28 / var(--tw-bg-opacity));
}
.odd\:bg-yellow-800:nth-child(odd) {
--tw-bg-opacity: 1;
- background-color: rgb(133 77 14 / var(--tw-bg-opacity));
+ background-color: rgb(114 59 19 / var(--tw-bg-opacity));
}
.odd\:bg-purple-800:nth-child(odd) {
--tw-bg-opacity: 1;
- background-color: rgb(107 33 168 / var(--tw-bg-opacity));
+ background-color: rgb(85 33 181 / var(--tw-bg-opacity));
}
.even\:bg-gray-50:nth-child(even) {
@@ -5184,38 +5812,48 @@ svg.apply-fill path {
.even\:bg-blue-700:nth-child(even) {
--tw-bg-opacity: 1;
- background-color: rgb(29 78 216 / var(--tw-bg-opacity));
+ background-color: rgb(26 86 219 / var(--tw-bg-opacity));
}
.even\:bg-green-700:nth-child(even) {
--tw-bg-opacity: 1;
- background-color: rgb(21 128 61 / var(--tw-bg-opacity));
+ background-color: rgb(4 108 78 / var(--tw-bg-opacity));
}
.even\:bg-red-700:nth-child(even) {
--tw-bg-opacity: 1;
- background-color: rgb(185 28 28 / var(--tw-bg-opacity));
+ background-color: rgb(200 30 30 / var(--tw-bg-opacity));
}
.even\:bg-yellow-700:nth-child(even) {
--tw-bg-opacity: 1;
- background-color: rgb(161 98 7 / var(--tw-bg-opacity));
+ background-color: rgb(142 75 16 / var(--tw-bg-opacity));
}
.even\:bg-purple-700:nth-child(even) {
--tw-bg-opacity: 1;
- background-color: rgb(126 34 206 / var(--tw-bg-opacity));
+ background-color: rgb(108 43 217 / var(--tw-bg-opacity));
}
.focus-within\:z-10:focus-within {
z-index: 10;
}
+.focus-within\:border-primary-500:focus-within {
+ --tw-border-opacity: 1;
+ border-color: rgb(254 121 93 / var(--tw-border-opacity));
+}
+
.focus-within\:bg-gray-900:focus-within {
--tw-bg-opacity: 1;
background-color: rgb(17 24 39 / var(--tw-bg-opacity));
}
+.focus-within\:text-primary-700:focus-within {
+ --tw-text-opacity: 1;
+ color: rgb(235 79 39 / var(--tw-text-opacity));
+}
+
.focus-within\:text-white:focus-within {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
@@ -5251,7 +5889,7 @@ svg.apply-fill path {
.focus-within\:ring-blue-300:focus-within {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(164 202 254 / var(--tw-ring-opacity));
}
.focus-within\:ring-gray-300:focus-within {
@@ -5261,22 +5899,27 @@ svg.apply-fill path {
.focus-within\:ring-green-300:focus-within {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(134 239 172 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(132 225 188 / var(--tw-ring-opacity));
+}
+
+.focus-within\:ring-primary-300:focus-within {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(255 213 204 / var(--tw-ring-opacity));
}
.focus-within\:ring-purple-300:focus-within {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(216 180 254 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(202 191 253 / var(--tw-ring-opacity));
}
.focus-within\:ring-red-300:focus-within {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(248 180 180 / var(--tw-ring-opacity));
}
.focus-within\:ring-yellow-300:focus-within {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(253 224 71 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(250 202 21 / var(--tw-ring-opacity));
}
.hover\:border-gray-300:hover {
@@ -5286,7 +5929,7 @@ svg.apply-fill path {
.hover\:bg-indigo-200:hover {
--tw-bg-opacity: 1;
- background-color: rgb(199 210 254 / var(--tw-bg-opacity));
+ background-color: rgb(205 219 254 / var(--tw-bg-opacity));
}
.hover\:bg-gray-100:hover {
@@ -5294,9 +5937,14 @@ svg.apply-fill path {
background-color: rgb(243 244 246 / var(--tw-bg-opacity));
}
+.hover\:bg-primary-200:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 228 222 / var(--tw-bg-opacity));
+}
+
.hover\:bg-blue-200:hover {
--tw-bg-opacity: 1;
- background-color: rgb(191 219 254 / var(--tw-bg-opacity));
+ background-color: rgb(195 221 253 / var(--tw-bg-opacity));
}
.hover\:bg-gray-200:hover {
@@ -5306,27 +5954,27 @@ svg.apply-fill path {
.hover\:bg-red-200:hover {
--tw-bg-opacity: 1;
- background-color: rgb(254 202 202 / var(--tw-bg-opacity));
+ background-color: rgb(251 213 213 / var(--tw-bg-opacity));
}
.hover\:bg-green-200:hover {
--tw-bg-opacity: 1;
- background-color: rgb(187 247 208 / var(--tw-bg-opacity));
+ background-color: rgb(188 240 218 / var(--tw-bg-opacity));
}
.hover\:bg-yellow-200:hover {
--tw-bg-opacity: 1;
- background-color: rgb(254 240 138 / var(--tw-bg-opacity));
+ background-color: rgb(252 233 106 / var(--tw-bg-opacity));
}
.hover\:bg-purple-200:hover {
--tw-bg-opacity: 1;
- background-color: rgb(233 213 255 / var(--tw-bg-opacity));
+ background-color: rgb(220 215 254 / var(--tw-bg-opacity));
}
.hover\:bg-pink-200:hover {
--tw-bg-opacity: 1;
- background-color: rgb(251 207 232 / var(--tw-bg-opacity));
+ background-color: rgb(250 209 232 / var(--tw-bg-opacity));
}
.hover\:bg-gray-600:hover {
@@ -5341,7 +5989,7 @@ svg.apply-fill path {
.hover\:bg-blue-800:hover {
--tw-bg-opacity: 1;
- background-color: rgb(30 64 175 / var(--tw-bg-opacity));
+ background-color: rgb(30 66 159 / var(--tw-bg-opacity));
}
.hover\:bg-gray-900:hover {
@@ -5351,22 +5999,32 @@ svg.apply-fill path {
.hover\:bg-green-800:hover {
--tw-bg-opacity: 1;
- background-color: rgb(22 101 52 / var(--tw-bg-opacity));
+ background-color: rgb(3 84 63 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-primary-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(204 69 34 / var(--tw-bg-opacity));
}
.hover\:bg-purple-800:hover {
--tw-bg-opacity: 1;
- background-color: rgb(107 33 168 / var(--tw-bg-opacity));
+ background-color: rgb(85 33 181 / var(--tw-bg-opacity));
}
.hover\:bg-red-800:hover {
--tw-bg-opacity: 1;
- background-color: rgb(153 27 27 / var(--tw-bg-opacity));
+ background-color: rgb(155 28 28 / var(--tw-bg-opacity));
}
.hover\:bg-yellow-500:hover {
--tw-bg-opacity: 1;
- background-color: rgb(234 179 8 / var(--tw-bg-opacity));
+ background-color: rgb(194 120 3 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-primary-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(235 79 39 / var(--tw-bg-opacity));
}
.hover\:bg-transparent:hover {
@@ -5378,34 +6036,39 @@ svg.apply-fill path {
background-color: rgb(209 213 219 / var(--tw-bg-opacity));
}
+.hover\:bg-primary-100:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 241 238 / var(--tw-bg-opacity));
+}
+
.hover\:bg-blue-100:hover {
--tw-bg-opacity: 1;
- background-color: rgb(219 234 254 / var(--tw-bg-opacity));
+ background-color: rgb(225 239 254 / var(--tw-bg-opacity));
}
.hover\:bg-blue-400:hover {
--tw-bg-opacity: 1;
- background-color: rgb(96 165 250 / var(--tw-bg-opacity));
+ background-color: rgb(118 169 250 / var(--tw-bg-opacity));
}
.hover\:bg-green-400:hover {
--tw-bg-opacity: 1;
- background-color: rgb(74 222 128 / var(--tw-bg-opacity));
+ background-color: rgb(49 196 141 / var(--tw-bg-opacity));
}
.hover\:bg-red-400:hover {
--tw-bg-opacity: 1;
- background-color: rgb(248 113 113 / var(--tw-bg-opacity));
+ background-color: rgb(249 128 128 / var(--tw-bg-opacity));
}
.hover\:bg-yellow-400:hover {
--tw-bg-opacity: 1;
- background-color: rgb(250 204 21 / var(--tw-bg-opacity));
+ background-color: rgb(227 160 8 / var(--tw-bg-opacity));
}
.hover\:bg-purple-400:hover {
--tw-bg-opacity: 1;
- background-color: rgb(192 132 252 / var(--tw-bg-opacity));
+ background-color: rgb(172 148 250 / var(--tw-bg-opacity));
}
.hover\:bg-gradient-to-br:hover {
@@ -5422,12 +6085,17 @@ svg.apply-fill path {
.hover\:text-blue-800:hover {
--tw-text-opacity: 1;
- color: rgb(30 64 175 / var(--tw-text-opacity));
+ color: rgb(30 66 159 / var(--tw-text-opacity));
+}
+
+.hover\:text-primary-900:hover {
+ --tw-text-opacity: 1;
+ color: rgb(165 55 27 / var(--tw-text-opacity));
}
.hover\:text-blue-900:hover {
--tw-text-opacity: 1;
- color: rgb(30 58 138 / var(--tw-text-opacity));
+ color: rgb(35 56 118 / var(--tw-text-opacity));
}
.hover\:text-gray-400:hover {
@@ -5437,32 +6105,32 @@ svg.apply-fill path {
.hover\:text-red-900:hover {
--tw-text-opacity: 1;
- color: rgb(127 29 29 / var(--tw-text-opacity));
+ color: rgb(119 29 29 / var(--tw-text-opacity));
}
.hover\:text-green-900:hover {
--tw-text-opacity: 1;
- color: rgb(20 83 45 / var(--tw-text-opacity));
+ color: rgb(1 71 55 / var(--tw-text-opacity));
}
.hover\:text-yellow-900:hover {
--tw-text-opacity: 1;
- color: rgb(113 63 18 / var(--tw-text-opacity));
+ color: rgb(99 49 18 / var(--tw-text-opacity));
}
.hover\:text-indigo-900:hover {
--tw-text-opacity: 1;
- color: rgb(49 46 129 / var(--tw-text-opacity));
+ color: rgb(54 47 120 / var(--tw-text-opacity));
}
.hover\:text-purple-900:hover {
--tw-text-opacity: 1;
- color: rgb(88 28 135 / var(--tw-text-opacity));
+ color: rgb(74 29 150 / var(--tw-text-opacity));
}
.hover\:text-pink-900:hover {
--tw-text-opacity: 1;
- color: rgb(131 24 67 / var(--tw-text-opacity));
+ color: rgb(117 26 61 / var(--tw-text-opacity));
}
.hover\:text-gray-900:hover {
@@ -5470,6 +6138,11 @@ svg.apply-fill path {
color: rgb(17 24 39 / var(--tw-text-opacity));
}
+.hover\:text-primary-700:hover {
+ --tw-text-opacity: 1;
+ color: rgb(235 79 39 / var(--tw-text-opacity));
+}
+
.hover\:text-white:hover {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
@@ -5489,9 +6162,14 @@ svg.apply-fill path {
color: rgb(0 0 0 / var(--tw-text-opacity));
}
+.hover\:text-primary-600:hover {
+ --tw-text-opacity: 1;
+ color: rgb(239 86 47 / var(--tw-text-opacity));
+}
+
.hover\:text-blue-700:hover {
--tw-text-opacity: 1;
- color: rgb(29 78 216 / var(--tw-text-opacity));
+ color: rgb(26 86 219 / var(--tw-text-opacity));
}
.hover\:text-gray-700:hover {
@@ -5513,27 +6191,37 @@ svg.apply-fill path {
.focus\:border-blue-500:focus {
--tw-border-opacity: 1;
- border-color: rgb(59 130 246 / var(--tw-border-opacity));
+ border-color: rgb(63 131 248 / var(--tw-border-opacity));
+}
+
+.focus\:border-primary-600:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(239 86 47 / var(--tw-border-opacity));
}
.focus\:border-green-600:focus {
--tw-border-opacity: 1;
- border-color: rgb(22 163 74 / var(--tw-border-opacity));
+ border-color: rgb(5 122 85 / var(--tw-border-opacity));
}
.focus\:border-red-600:focus {
--tw-border-opacity: 1;
- border-color: rgb(220 38 38 / var(--tw-border-opacity));
+ border-color: rgb(224 36 36 / var(--tw-border-opacity));
+}
+
+.focus\:border-primary-500:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(254 121 93 / var(--tw-border-opacity));
}
.focus\:border-green-500:focus {
--tw-border-opacity: 1;
- border-color: rgb(34 197 94 / var(--tw-border-opacity));
+ border-color: rgb(14 159 110 / var(--tw-border-opacity));
}
.focus\:border-red-500:focus {
--tw-border-opacity: 1;
- border-color: rgb(239 68 68 / var(--tw-border-opacity));
+ border-color: rgb(240 82 82 / var(--tw-border-opacity));
}
.focus\:border-gray-200:focus {
@@ -5541,6 +6229,11 @@ svg.apply-fill path {
border-color: rgb(229 231 235 / var(--tw-border-opacity));
}
+.focus\:text-primary-700:focus {
+ --tw-text-opacity: 1;
+ color: rgb(235 79 39 / var(--tw-text-opacity));
+}
+
.focus\:outline-none:focus {
outline: 2px solid transparent;
outline-offset: 2px;
@@ -5577,12 +6270,12 @@ svg.apply-fill path {
.focus\:ring-blue-300:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(164 202 254 / var(--tw-ring-opacity));
}
.focus\:ring-green-300:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(134 239 172 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(132 225 188 / var(--tw-ring-opacity));
}
.focus\:ring-cyan-300:focus {
@@ -5592,7 +6285,7 @@ svg.apply-fill path {
.focus\:ring-teal-300:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(94 234 212 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(126 220 226 / var(--tw-ring-opacity));
}
.focus\:ring-lime-300:focus {
@@ -5602,32 +6295,32 @@ svg.apply-fill path {
.focus\:ring-red-300:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(248 180 180 / var(--tw-ring-opacity));
}
.focus\:ring-pink-300:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(249 168 212 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(248 180 217 / var(--tw-ring-opacity));
}
.focus\:ring-purple-300:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(216 180 254 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(202 191 253 / var(--tw-ring-opacity));
}
.focus\:ring-green-200:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(187 247 208 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(188 240 218 / var(--tw-ring-opacity));
}
.focus\:ring-purple-200:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(233 213 255 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(220 215 254 / var(--tw-ring-opacity));
}
.focus\:ring-pink-200:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(251 207 232 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(250 209 232 / var(--tw-ring-opacity));
}
.focus\:ring-lime-200:focus {
@@ -5637,22 +6330,27 @@ svg.apply-fill path {
.focus\:ring-red-100:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(254 226 226 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(253 232 232 / var(--tw-ring-opacity));
}
.focus\:ring-blue-500:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(63 131 248 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-primary-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(254 121 93 / var(--tw-ring-opacity));
}
.focus\:ring-green-500:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(14 159 110 / var(--tw-ring-opacity));
}
.focus\:ring-red-500:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(240 82 82 / var(--tw-ring-opacity));
}
.focus\:ring-gray-400:focus {
@@ -5662,22 +6360,32 @@ svg.apply-fill path {
.focus\:ring-purple-500:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(168 85 247 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(144 97 249 / var(--tw-ring-opacity));
}
.focus\:ring-teal-500:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(20 184 166 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(6 148 162 / var(--tw-ring-opacity));
}
.focus\:ring-yellow-500:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(234 179 8 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(194 120 3 / var(--tw-ring-opacity));
}
.focus\:ring-orange-500:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(249 115 22 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(255 90 31 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-primary-700:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(235 79 39 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-primary-300:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(255 213 204 / var(--tw-ring-opacity));
}
.focus\:\!ring-gray-300:focus {
@@ -5687,37 +6395,42 @@ svg.apply-fill path {
.focus\:ring-red-400:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(249 128 128 / var(--tw-ring-opacity));
}
.focus\:ring-yellow-400:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(250 204 21 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(227 160 8 / var(--tw-ring-opacity));
}
.focus\:ring-green-400:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(74 222 128 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(49 196 141 / var(--tw-ring-opacity));
}
.focus\:ring-indigo-400:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(129 140 248 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(141 162 251 / var(--tw-ring-opacity));
}
.focus\:ring-purple-400:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(192 132 252 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(172 148 250 / var(--tw-ring-opacity));
}
.focus\:ring-pink-400:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(244 114 182 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(241 126 184 / var(--tw-ring-opacity));
}
.focus\:ring-blue-400:focus {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(118 169 250 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-primary-400:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(255 188 173 / var(--tw-ring-opacity));
}
.focus-visible\:outline-none:focus-visible {
@@ -5760,6 +6473,11 @@ svg.apply-fill path {
--tw-bg-opacity: 0 !important;
}
+.group:hover .group-hover\:text-primary-600 {
+ --tw-text-opacity: 1;
+ color: rgb(239 86 47 / var(--tw-text-opacity));
+}
+
.group:hover .group-hover\:\!text-inherit {
color: inherit !important;
}
@@ -5780,39 +6498,44 @@ svg.apply-fill path {
--tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity));
}
+.peer:checked ~ .peer-checked\:bg-primary-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(239 86 47 / var(--tw-bg-opacity));
+}
+
.peer:checked ~ .peer-checked\:bg-red-600 {
--tw-bg-opacity: 1;
- background-color: rgb(220 38 38 / var(--tw-bg-opacity));
+ background-color: rgb(224 36 36 / var(--tw-bg-opacity));
}
.peer:checked ~ .peer-checked\:bg-green-600 {
--tw-bg-opacity: 1;
- background-color: rgb(22 163 74 / var(--tw-bg-opacity));
+ background-color: rgb(5 122 85 / var(--tw-bg-opacity));
}
.peer:checked ~ .peer-checked\:bg-purple-600 {
--tw-bg-opacity: 1;
- background-color: rgb(147 51 234 / var(--tw-bg-opacity));
+ background-color: rgb(126 58 242 / var(--tw-bg-opacity));
}
.peer:checked ~ .peer-checked\:bg-yellow-400 {
--tw-bg-opacity: 1;
- background-color: rgb(250 204 21 / var(--tw-bg-opacity));
+ background-color: rgb(227 160 8 / var(--tw-bg-opacity));
}
.peer:checked ~ .peer-checked\:bg-teal-600 {
--tw-bg-opacity: 1;
- background-color: rgb(13 148 136 / var(--tw-bg-opacity));
+ background-color: rgb(4 116 129 / var(--tw-bg-opacity));
}
.peer:checked ~ .peer-checked\:bg-orange-500 {
--tw-bg-opacity: 1;
- background-color: rgb(249 115 22 / var(--tw-bg-opacity));
+ background-color: rgb(255 90 31 / var(--tw-bg-opacity));
}
.peer:checked ~ .peer-checked\:bg-blue-600 {
--tw-bg-opacity: 1;
- background-color: rgb(37 99 235 / var(--tw-bg-opacity));
+ background-color: rgb(28 100 242 / var(--tw-bg-opacity));
}
.peer:checked ~ .peer-checked\:after\:translate-x-full::after {
@@ -5872,45 +6595,55 @@ svg.apply-fill path {
padding-right: 0.5rem;
}
+.peer:focus ~ .peer-focus\:text-primary-600 {
+ --tw-text-opacity: 1;
+ color: rgb(239 86 47 / var(--tw-text-opacity));
+}
+
.peer:focus ~ .peer-focus\:ring-4 {
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}
+.peer:focus ~ .peer-focus\:ring-primary-300 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(255 213 204 / var(--tw-ring-opacity));
+}
+
.peer:focus ~ .peer-focus\:ring-red-300 {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(248 180 180 / var(--tw-ring-opacity));
}
.peer:focus ~ .peer-focus\:ring-green-300 {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(134 239 172 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(132 225 188 / var(--tw-ring-opacity));
}
.peer:focus ~ .peer-focus\:ring-purple-300 {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(216 180 254 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(202 191 253 / var(--tw-ring-opacity));
}
.peer:focus ~ .peer-focus\:ring-yellow-300 {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(253 224 71 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(250 202 21 / var(--tw-ring-opacity));
}
.peer:focus ~ .peer-focus\:ring-teal-300 {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(94 234 212 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(126 220 226 / var(--tw-ring-opacity));
}
.peer:focus ~ .peer-focus\:ring-orange-300 {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(253 186 116 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(253 186 140 / var(--tw-ring-opacity));
}
.peer:focus ~ .peer-focus\:ring-blue-300 {
--tw-ring-opacity: 1;
- --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity));
+ --tw-ring-color: rgb(164 202 254 / var(--tw-ring-opacity));
}
[dir="rtl"] .rtl\:origin-right {
@@ -5955,1188 +6688,1366 @@ svg.apply-fill path {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
-@media (prefers-color-scheme: dark) {
- .dark\:block {
- display: block;
- }
-
- .dark\:hidden {
- display: none;
- }
-
- .dark\:divide-gray-600 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(75 85 99 / var(--tw-divide-opacity));
- }
-
- .dark\:divide-gray-700 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(55 65 81 / var(--tw-divide-opacity));
- }
-
- .dark\:divide-gray-800 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(31 41 55 / var(--tw-divide-opacity));
- }
-
- .dark\:divide-red-800 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(153 27 27 / var(--tw-divide-opacity));
- }
-
- .dark\:divide-yellow-800 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(133 77 14 / var(--tw-divide-opacity));
- }
-
- .dark\:divide-green-800 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(22 101 52 / var(--tw-divide-opacity));
- }
-
- .dark\:divide-indigo-800 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(55 48 163 / var(--tw-divide-opacity));
- }
-
- .dark\:divide-purple-800 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(107 33 168 / var(--tw-divide-opacity));
- }
-
- .dark\:divide-pink-800 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(157 23 77 / var(--tw-divide-opacity));
- }
-
- .dark\:divide-blue-800 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(30 64 175 / var(--tw-divide-opacity));
- }
-
- .dark\:divide-orange-800 > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-opacity: 1;
- border-color: rgb(154 52 18 / var(--tw-divide-opacity));
- }
-
- .dark\:border-gray-700 {
- --tw-border-opacity: 1;
- border-color: rgb(55 65 81 / var(--tw-border-opacity));
- }
-
- .dark\:border-gray-800 {
- --tw-border-opacity: 1;
- border-color: rgb(31 41 55 / var(--tw-border-opacity));
- }
-
- .dark\:border-blue-400 {
- --tw-border-opacity: 1;
- border-color: rgb(96 165 250 / var(--tw-border-opacity));
- }
-
- .dark\:border-gray-500 {
- --tw-border-opacity: 1;
- border-color: rgb(107 114 128 / var(--tw-border-opacity));
- }
-
- .dark\:border-red-400 {
- --tw-border-opacity: 1;
- border-color: rgb(248 113 113 / var(--tw-border-opacity));
- }
-
- .dark\:border-green-400 {
- --tw-border-opacity: 1;
- border-color: rgb(74 222 128 / var(--tw-border-opacity));
- }
-
- .dark\:border-yellow-300 {
- --tw-border-opacity: 1;
- border-color: rgb(253 224 71 / var(--tw-border-opacity));
- }
-
- .dark\:border-indigo-400 {
- --tw-border-opacity: 1;
- border-color: rgb(129 140 248 / var(--tw-border-opacity));
- }
-
- .dark\:border-purple-400 {
- --tw-border-opacity: 1;
- border-color: rgb(192 132 252 / var(--tw-border-opacity));
- }
-
- .dark\:border-pink-400 {
- --tw-border-opacity: 1;
- border-color: rgb(244 114 182 / var(--tw-border-opacity));
- }
-
- .dark\:border-gray-600 {
- --tw-border-opacity: 1;
- border-color: rgb(75 85 99 / var(--tw-border-opacity));
- }
-
- .dark\:border-blue-500 {
- --tw-border-opacity: 1;
- border-color: rgb(59 130 246 / var(--tw-border-opacity));
- }
-
- .dark\:border-green-500 {
- --tw-border-opacity: 1;
- border-color: rgb(34 197 94 / var(--tw-border-opacity));
- }
-
- .dark\:border-red-500 {
- --tw-border-opacity: 1;
- border-color: rgb(239 68 68 / var(--tw-border-opacity));
- }
-
- .dark\:border-gray-900 {
- --tw-border-opacity: 1;
- border-color: rgb(17 24 39 / var(--tw-border-opacity));
- }
-
- .dark\:border-white {
- --tw-border-opacity: 1;
- border-color: rgb(255 255 255 / var(--tw-border-opacity));
- }
-
- .dark\:\!border-gray-600 {
- --tw-border-opacity: 1 !important;
- border-color: rgb(75 85 99 / var(--tw-border-opacity)) !important;
- }
-
- .dark\:border-red-800 {
- --tw-border-opacity: 1;
- border-color: rgb(153 27 27 / var(--tw-border-opacity));
- }
-
- .dark\:border-yellow-800 {
- --tw-border-opacity: 1;
- border-color: rgb(133 77 14 / var(--tw-border-opacity));
- }
-
- .dark\:border-green-800 {
- --tw-border-opacity: 1;
- border-color: rgb(22 101 52 / var(--tw-border-opacity));
- }
-
- .dark\:border-indigo-800 {
- --tw-border-opacity: 1;
- border-color: rgb(55 48 163 / var(--tw-border-opacity));
- }
-
- .dark\:border-purple-800 {
- --tw-border-opacity: 1;
- border-color: rgb(107 33 168 / var(--tw-border-opacity));
- }
-
- .dark\:border-pink-800 {
- --tw-border-opacity: 1;
- border-color: rgb(157 23 77 / var(--tw-border-opacity));
- }
-
- .dark\:border-blue-800 {
- --tw-border-opacity: 1;
- border-color: rgb(30 64 175 / var(--tw-border-opacity));
- }
-
- .dark\:border-orange-800 {
- --tw-border-opacity: 1;
- border-color: rgb(154 52 18 / var(--tw-border-opacity));
- }
-
- .dark\:bg-gray-800 {
- --tw-bg-opacity: 1;
- background-color: rgb(31 41 55 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-gray-600 {
- --tw-bg-opacity: 1;
- background-color: rgb(75 85 99 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-blue-900 {
- --tw-bg-opacity: 1;
- background-color: rgb(30 58 138 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-gray-700 {
- --tw-bg-opacity: 1;
- background-color: rgb(55 65 81 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-red-900 {
- --tw-bg-opacity: 1;
- background-color: rgb(127 29 29 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-green-900 {
- --tw-bg-opacity: 1;
- background-color: rgb(20 83 45 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-yellow-900 {
- --tw-bg-opacity: 1;
- background-color: rgb(113 63 18 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-indigo-900 {
- --tw-bg-opacity: 1;
- background-color: rgb(49 46 129 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-purple-900 {
- --tw-bg-opacity: 1;
- background-color: rgb(88 28 135 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-pink-900 {
- --tw-bg-opacity: 1;
- background-color: rgb(131 24 67 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-gray-300 {
- --tw-bg-opacity: 1;
- background-color: rgb(209 213 219 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-blue-600 {
- --tw-bg-opacity: 1;
- background-color: rgb(37 99 235 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-green-600 {
- --tw-bg-opacity: 1;
- background-color: rgb(22 163 74 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-purple-600 {
- --tw-bg-opacity: 1;
- background-color: rgb(147 51 234 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-red-600 {
- --tw-bg-opacity: 1;
- background-color: rgb(220 38 38 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-blue-500 {
- --tw-bg-opacity: 1;
- background-color: rgb(59 130 246 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-green-500 {
- --tw-bg-opacity: 1;
- background-color: rgb(34 197 94 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-gray-500 {
- --tw-bg-opacity: 1;
- background-color: rgb(107 114 128 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-purple-500 {
- --tw-bg-opacity: 1;
- background-color: rgb(168 85 247 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-red-500 {
- --tw-bg-opacity: 1;
- background-color: rgb(239 68 68 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-yellow-400 {
- --tw-bg-opacity: 1;
- background-color: rgb(250 204 21 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-transparent {
- background-color: transparent;
- }
-
- .dark\:bg-gray-900 {
- --tw-bg-opacity: 1;
- background-color: rgb(17 24 39 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-gray-800\/30 {
- background-color: rgb(31 41 55 / 0.3);
- }
-
- .dark\:bg-inherit {
- background-color: inherit;
- }
-
- .dark\:bg-indigo-500 {
- --tw-bg-opacity: 1;
- background-color: rgb(99 102 241 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-yellow-600 {
- --tw-bg-opacity: 1;
- background-color: rgb(202 138 4 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-gray-200 {
- --tw-bg-opacity: 1;
- background-color: rgb(229 231 235 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-green-400 {
- --tw-bg-opacity: 1;
- background-color: rgb(74 222 128 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-indigo-400 {
- --tw-bg-opacity: 1;
- background-color: rgb(129 140 248 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-purple-400 {
- --tw-bg-opacity: 1;
- background-color: rgb(192 132 252 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-pink-400 {
- --tw-bg-opacity: 1;
- background-color: rgb(244 114 182 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-blue-400 {
- --tw-bg-opacity: 1;
- background-color: rgb(96 165 250 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-red-800 {
- --tw-bg-opacity: 1;
- background-color: rgb(153 27 27 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-yellow-800 {
- --tw-bg-opacity: 1;
- background-color: rgb(133 77 14 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-green-800 {
- --tw-bg-opacity: 1;
- background-color: rgb(22 101 52 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-blue-800 {
- --tw-bg-opacity: 1;
- background-color: rgb(30 64 175 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-indigo-800 {
- --tw-bg-opacity: 1;
- background-color: rgb(55 48 163 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-purple-800 {
- --tw-bg-opacity: 1;
- background-color: rgb(107 33 168 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-orange-700 {
- --tw-bg-opacity: 1;
- background-color: rgb(194 65 12 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-orange-800 {
- --tw-bg-opacity: 1;
- background-color: rgb(154 52 18 / var(--tw-bg-opacity));
- }
-
- .dark\:bg-opacity-80 {
- --tw-bg-opacity: 0.8;
- }
-
- .dark\:fill-gray-300 {
- fill: #d1d5db;
- }
-
- .dark\:text-white {
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity));
- }
-
- .dark\:text-gray-400 {
- --tw-text-opacity: 1;
- color: rgb(156 163 175 / var(--tw-text-opacity));
- }
-
- .dark\:text-gray-300 {
- --tw-text-opacity: 1;
- color: rgb(209 213 219 / var(--tw-text-opacity));
- }
-
- .dark\:text-blue-300 {
- --tw-text-opacity: 1;
- color: rgb(147 197 253 / var(--tw-text-opacity));
- }
-
- .dark\:text-red-300 {
- --tw-text-opacity: 1;
- color: rgb(252 165 165 / var(--tw-text-opacity));
- }
-
- .dark\:text-green-300 {
- --tw-text-opacity: 1;
- color: rgb(134 239 172 / var(--tw-text-opacity));
- }
-
- .dark\:text-yellow-300 {
- --tw-text-opacity: 1;
- color: rgb(253 224 71 / var(--tw-text-opacity));
- }
-
- .dark\:text-indigo-300 {
- --tw-text-opacity: 1;
- color: rgb(165 180 252 / var(--tw-text-opacity));
- }
-
- .dark\:text-purple-300 {
- --tw-text-opacity: 1;
- color: rgb(216 180 254 / var(--tw-text-opacity));
- }
-
- .dark\:text-pink-300 {
- --tw-text-opacity: 1;
- color: rgb(249 168 212 / var(--tw-text-opacity));
- }
-
- .dark\:text-blue-400 {
- --tw-text-opacity: 1;
- color: rgb(96 165 250 / var(--tw-text-opacity));
- }
-
- .dark\:text-red-400 {
- --tw-text-opacity: 1;
- color: rgb(248 113 113 / var(--tw-text-opacity));
- }
-
- .dark\:text-green-400 {
- --tw-text-opacity: 1;
- color: rgb(74 222 128 / var(--tw-text-opacity));
- }
-
- .dark\:text-indigo-400 {
- --tw-text-opacity: 1;
- color: rgb(129 140 248 / var(--tw-text-opacity));
- }
-
- .dark\:text-purple-400 {
- --tw-text-opacity: 1;
- color: rgb(192 132 252 / var(--tw-text-opacity));
- }
-
- .dark\:text-pink-400 {
- --tw-text-opacity: 1;
- color: rgb(244 114 182 / var(--tw-text-opacity));
- }
-
- .dark\:text-gray-900 {
- --tw-text-opacity: 1;
- color: rgb(17 24 39 / var(--tw-text-opacity));
- }
-
- .dark\:text-blue-500 {
- --tw-text-opacity: 1;
- color: rgb(59 130 246 / var(--tw-text-opacity));
- }
-
- .dark\:text-green-500 {
- --tw-text-opacity: 1;
- color: rgb(34 197 94 / var(--tw-text-opacity));
- }
-
- .dark\:text-red-500 {
- --tw-text-opacity: 1;
- color: rgb(239 68 68 / var(--tw-text-opacity));
- }
-
- .dark\:\!text-white {
- --tw-text-opacity: 1 !important;
- color: rgb(255 255 255 / var(--tw-text-opacity)) !important;
- }
-
- .dark\:text-gray-500 {
- --tw-text-opacity: 1;
- color: rgb(107 114 128 / var(--tw-text-opacity));
- }
-
- .dark\:text-gray-100 {
- --tw-text-opacity: 1;
- color: rgb(243 244 246 / var(--tw-text-opacity));
- }
-
- .dark\:text-gray-600 {
- --tw-text-opacity: 1;
- color: rgb(75 85 99 / var(--tw-text-opacity));
- }
-
- .dark\:text-gray-700 {
- --tw-text-opacity: 1;
- color: rgb(55 65 81 / var(--tw-text-opacity));
- }
-
- .dark\:text-blue-100 {
- --tw-text-opacity: 1;
- color: rgb(219 234 254 / var(--tw-text-opacity));
- }
-
- .dark\:text-green-100 {
- --tw-text-opacity: 1;
- color: rgb(220 252 231 / var(--tw-text-opacity));
- }
-
- .dark\:text-red-100 {
- --tw-text-opacity: 1;
- color: rgb(254 226 226 / var(--tw-text-opacity));
- }
-
- .dark\:text-yellow-100 {
- --tw-text-opacity: 1;
- color: rgb(254 249 195 / var(--tw-text-opacity));
- }
-
- .dark\:text-purple-100 {
- --tw-text-opacity: 1;
- color: rgb(243 232 255 / var(--tw-text-opacity));
- }
-
- .dark\:text-indigo-100 {
- --tw-text-opacity: 1;
- color: rgb(224 231 255 / var(--tw-text-opacity));
- }
-
- .dark\:text-pink-100 {
- --tw-text-opacity: 1;
- color: rgb(252 231 243 / var(--tw-text-opacity));
- }
-
- .dark\:text-gray-200 {
- --tw-text-opacity: 1;
- color: rgb(229 231 235 / var(--tw-text-opacity));
- }
-
- .dark\:text-red-200 {
- --tw-text-opacity: 1;
- color: rgb(254 202 202 / var(--tw-text-opacity));
- }
-
- .dark\:text-yellow-200 {
- --tw-text-opacity: 1;
- color: rgb(254 240 138 / var(--tw-text-opacity));
- }
-
- .dark\:text-green-200 {
- --tw-text-opacity: 1;
- color: rgb(187 247 208 / var(--tw-text-opacity));
- }
-
- .dark\:text-blue-200 {
- --tw-text-opacity: 1;
- color: rgb(191 219 254 / var(--tw-text-opacity));
- }
-
- .dark\:text-indigo-200 {
- --tw-text-opacity: 1;
- color: rgb(199 210 254 / var(--tw-text-opacity));
- }
-
- .dark\:text-purple-200 {
- --tw-text-opacity: 1;
- color: rgb(233 213 255 / var(--tw-text-opacity));
- }
-
- .dark\:text-orange-200 {
- --tw-text-opacity: 1;
- color: rgb(254 215 170 / var(--tw-text-opacity));
- }
-
- .dark\:text-orange-400 {
- --tw-text-opacity: 1;
- color: rgb(251 146 60 / var(--tw-text-opacity));
- }
-
- .dark\:decoration-blue-600 {
- text-decoration-color: #2563eb;
- }
-
- .dark\:placeholder-gray-400::placeholder {
- --tw-placeholder-opacity: 1;
- color: rgb(156 163 175 / var(--tw-placeholder-opacity));
- }
-
- .dark\:placeholder-green-500::placeholder {
- --tw-placeholder-opacity: 1;
- color: rgb(34 197 94 / var(--tw-placeholder-opacity));
- }
-
- .dark\:placeholder-red-500::placeholder {
- --tw-placeholder-opacity: 1;
- color: rgb(239 68 68 / var(--tw-placeholder-opacity));
- }
-
- .dark\:opacity-25 {
- opacity: 0.25;
- }
-
- .dark\:shadow-gray-800 {
- --tw-shadow-color: #1f2937;
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-blue-800 {
- --tw-shadow-color: #1e40af;
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-gray-900 {
- --tw-shadow-color: #111827;
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-green-800 {
- --tw-shadow-color: #166534;
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-gray-700 {
- --tw-shadow-color: #374151;
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-purple-800 {
- --tw-shadow-color: #6b21a8;
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-red-800 {
- --tw-shadow-color: #991b1b;
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-yellow-700 {
- --tw-shadow-color: #a16207;
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-gray-800\/80 {
- --tw-shadow-color: rgb(31 41 55 / 0.8);
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-blue-800\/80 {
- --tw-shadow-color: rgb(30 64 175 / 0.8);
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-green-800\/80 {
- --tw-shadow-color: rgb(22 101 52 / 0.8);
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-purple-800\/80 {
- --tw-shadow-color: rgb(107 33 168 / 0.8);
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-red-800\/80 {
- --tw-shadow-color: rgb(153 27 27 / 0.8);
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-yellow-800\/80 {
- --tw-shadow-color: rgb(133 77 14 / 0.8);
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-cyan-800\/80 {
- --tw-shadow-color: rgb(21 94 117 / 0.8);
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-teal-800\/80 {
- --tw-shadow-color: rgb(17 94 89 / 0.8);
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-lime-800\/80 {
- --tw-shadow-color: rgb(63 98 18 / 0.8);
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:shadow-pink-800\/80 {
- --tw-shadow-color: rgb(157 23 77 / 0.8);
- --tw-shadow: var(--tw-shadow-colored);
- }
-
- .dark\:ring-gray-500 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity));
- }
-
- .dark\:ring-gray-900 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(17 24 39 / var(--tw-ring-opacity));
- }
-
- .dark\:ring-offset-gray-800 {
- --tw-ring-offset-color: #1f2937;
- }
-
- .dark\:first-letter\:text-gray-100::first-letter {
- --tw-text-opacity: 1;
- color: rgb(243 244 246 / var(--tw-text-opacity));
- }
-
- .dark\:before\:shadow-\[-10px_0_50px_65px_rgba\(16\2c 24\2c 39\2c 1\)\]::before {
- content: var(--tw-content);
- --tw-shadow: -10px 0 50px 65px rgba(16,24,39,1);
- --tw-shadow-colored: -10px 0 50px 65px var(--tw-shadow-color);
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
- }
-
- .dark\:after\:shadow-\[10px_0_50px_65px_rgba\(16\2c 24\2c 39\2c 1\)\]::after {
- content: var(--tw-content);
- --tw-shadow: 10px 0 50px 65px rgba(16,24,39,1);
- --tw-shadow-colored: 10px 0 50px 65px var(--tw-shadow-color);
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
- }
-
- .odd\:dark\:bg-gray-800:nth-child(odd) {
- --tw-bg-opacity: 1;
- background-color: rgb(31 41 55 / var(--tw-bg-opacity));
- }
-
- .odd\:dark\:bg-blue-800:nth-child(odd) {
- --tw-bg-opacity: 1;
- background-color: rgb(30 64 175 / var(--tw-bg-opacity));
- }
-
- .odd\:dark\:bg-green-800:nth-child(odd) {
- --tw-bg-opacity: 1;
- background-color: rgb(22 101 52 / var(--tw-bg-opacity));
- }
-
- .odd\:dark\:bg-red-800:nth-child(odd) {
- --tw-bg-opacity: 1;
- background-color: rgb(153 27 27 / var(--tw-bg-opacity));
- }
-
- .odd\:dark\:bg-yellow-800:nth-child(odd) {
- --tw-bg-opacity: 1;
- background-color: rgb(133 77 14 / var(--tw-bg-opacity));
- }
-
- .odd\:dark\:bg-purple-800:nth-child(odd) {
- --tw-bg-opacity: 1;
- background-color: rgb(107 33 168 / var(--tw-bg-opacity));
- }
-
- .even\:dark\:bg-gray-700:nth-child(even) {
- --tw-bg-opacity: 1;
- background-color: rgb(55 65 81 / var(--tw-bg-opacity));
- }
-
- .even\:dark\:bg-blue-700:nth-child(even) {
- --tw-bg-opacity: 1;
- background-color: rgb(29 78 216 / var(--tw-bg-opacity));
- }
-
- .even\:dark\:bg-green-700:nth-child(even) {
- --tw-bg-opacity: 1;
- background-color: rgb(21 128 61 / var(--tw-bg-opacity));
- }
-
- .even\:dark\:bg-red-700:nth-child(even) {
- --tw-bg-opacity: 1;
- background-color: rgb(185 28 28 / var(--tw-bg-opacity));
- }
-
- .even\:dark\:bg-yellow-700:nth-child(even) {
- --tw-bg-opacity: 1;
- background-color: rgb(161 98 7 / var(--tw-bg-opacity));
- }
-
- .even\:dark\:bg-purple-700:nth-child(even) {
- --tw-bg-opacity: 1;
- background-color: rgb(126 34 206 / var(--tw-bg-opacity));
- }
-
- .dark\:focus-within\:text-white:focus-within {
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity));
- }
-
- .dark\:focus-within\:ring-gray-700:focus-within {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity));
- }
-
- .dark\:focus-within\:ring-blue-800:focus-within {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity));
- }
-
- .dark\:focus-within\:ring-green-800:focus-within {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(22 101 52 / var(--tw-ring-opacity));
- }
-
- .dark\:focus-within\:ring-purple-900:focus-within {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(88 28 135 / var(--tw-ring-opacity));
- }
-
- .dark\:focus-within\:ring-red-900:focus-within {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(127 29 29 / var(--tw-ring-opacity));
- }
-
- .dark\:focus-within\:ring-yellow-900:focus-within {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(113 63 18 / var(--tw-ring-opacity));
- }
-
- .dark\:focus-within\:ring-gray-800:focus-within {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity));
- }
-
- .dark\:hover\:border-gray-600:hover {
- --tw-border-opacity: 1;
- border-color: rgb(75 85 99 / var(--tw-border-opacity));
- }
-
- .dark\:hover\:border-gray-500:hover {
- --tw-border-opacity: 1;
- border-color: rgb(107 114 128 / var(--tw-border-opacity));
- }
-
- .hover\:dark\:bg-gray-800:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(31 41 55 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-gray-700:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(55 65 81 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-blue-800:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(30 64 175 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-red-800:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(153 27 27 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-green-800:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(22 101 52 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-yellow-800:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(133 77 14 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-indigo-800:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(55 48 163 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-purple-800:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(107 33 168 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-pink-800:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(157 23 77 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-gray-800:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(31 41 55 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-blue-700:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(29 78 216 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-green-700:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(21 128 61 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-purple-700:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(126 34 206 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-red-700:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(185 28 28 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-gray-600:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(75 85 99 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-blue-600:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(37 99 235 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-green-600:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(22 163 74 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-purple-500:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(168 85 247 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-red-600:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(220 38 38 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:bg-yellow-400:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(250 204 21 / var(--tw-bg-opacity));
- }
-
- .dark\:hover\:text-blue-300:hover {
- --tw-text-opacity: 1;
- color: rgb(147 197 253 / var(--tw-text-opacity));
- }
-
- .dark\:hover\:text-gray-300:hover {
- --tw-text-opacity: 1;
- color: rgb(209 213 219 / var(--tw-text-opacity));
- }
-
- .dark\:hover\:text-red-300:hover {
- --tw-text-opacity: 1;
- color: rgb(252 165 165 / var(--tw-text-opacity));
- }
-
- .dark\:hover\:text-green-300:hover {
- --tw-text-opacity: 1;
- color: rgb(134 239 172 / var(--tw-text-opacity));
- }
-
- .dark\:hover\:text-yellow-300:hover {
- --tw-text-opacity: 1;
- color: rgb(253 224 71 / var(--tw-text-opacity));
- }
-
- .dark\:hover\:text-indigo-300:hover {
- --tw-text-opacity: 1;
- color: rgb(165 180 252 / var(--tw-text-opacity));
- }
-
- .dark\:hover\:text-purple-300:hover {
- --tw-text-opacity: 1;
- color: rgb(216 180 254 / var(--tw-text-opacity));
- }
-
- .dark\:hover\:text-pink-300:hover {
- --tw-text-opacity: 1;
- color: rgb(249 168 212 / var(--tw-text-opacity));
- }
-
- .dark\:hover\:text-white:hover {
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity));
- }
-
- .dark\:focus\:border-blue-500:focus {
- --tw-border-opacity: 1;
- border-color: rgb(59 130 246 / var(--tw-border-opacity));
- }
-
- .dark\:focus\:border-green-500:focus {
- --tw-border-opacity: 1;
- border-color: rgb(34 197 94 / var(--tw-border-opacity));
- }
-
- .dark\:focus\:border-red-500:focus {
- --tw-border-opacity: 1;
- border-color: rgb(239 68 68 / var(--tw-border-opacity));
- }
-
- .dark\:focus\:text-white:focus {
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity));
- }
-
- .dark\:focus\:ring-gray-800:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-blue-800:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-green-800:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(22 101 52 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-cyan-800:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(21 94 117 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-teal-800:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(17 94 89 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-lime-800:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(63 98 18 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-red-800:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(153 27 27 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-pink-800:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(157 23 77 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-purple-800:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(107 33 168 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-teal-700:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(15 118 110 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-red-400:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-blue-500:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-green-500:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-red-500:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-red-600:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(220 38 38 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-green-600:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(22 163 74 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-purple-600:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(147 51 234 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-teal-600:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(13 148 136 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-yellow-600:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(202 138 4 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-orange-600:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(234 88 12 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-blue-600:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity));
- }
-
- .dark\:focus\:ring-gray-500:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity));
- }
-
- .dark\:disabled\:text-gray-500:disabled {
- --tw-text-opacity: 1;
- color: rgb(107 114 128 / var(--tw-text-opacity));
- }
-
- .group:hover .dark\:group-hover\:bg-gray-800\/60 {
- background-color: rgb(31 41 55 / 0.6);
- }
-
- .group:focus .dark\:group-focus\:ring-gray-800\/70 {
- --tw-ring-color: rgb(31 41 55 / 0.7);
- }
-
- .peer:focus ~ .dark\:peer-focus\:ring-red-800 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(153 27 27 / var(--tw-ring-opacity));
- }
-
- .peer:focus ~ .dark\:peer-focus\:ring-green-800 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(22 101 52 / var(--tw-ring-opacity));
- }
-
- .peer:focus ~ .dark\:peer-focus\:ring-purple-800 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(107 33 168 / var(--tw-ring-opacity));
- }
-
- .peer:focus ~ .dark\:peer-focus\:ring-yellow-800 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(133 77 14 / var(--tw-ring-opacity));
- }
-
- .peer:focus ~ .dark\:peer-focus\:ring-teal-800 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(17 94 89 / var(--tw-ring-opacity));
- }
-
- .peer:focus ~ .dark\:peer-focus\:ring-orange-800 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(154 52 18 / var(--tw-ring-opacity));
- }
-
- .peer:focus ~ .dark\:peer-focus\:ring-blue-800 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity));
- }
+.dark .dark\:block {
+ display: block;
+}
+
+.dark .dark\:hidden {
+ display: none;
+}
+
+.dark .dark\:divide-gray-700 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(55 65 81 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-gray-600 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(75 85 99 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-gray-800 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(31 41 55 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-red-800 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(155 28 28 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-yellow-800 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(114 59 19 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-green-800 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(3 84 63 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-indigo-800 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(66 56 157 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-purple-800 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(85 33 181 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-pink-800 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(153 21 75 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-blue-800 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(30 66 159 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-primary-200 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(255 228 222 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:divide-orange-800 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(138 44 13 / var(--tw-divide-opacity));
+}
+
+.dark .dark\:border-gray-700 {
+ --tw-border-opacity: 1;
+ border-color: rgb(55 65 81 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-gray-800 {
+ --tw-border-opacity: 1;
+ border-color: rgb(31 41 55 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-primary-400 {
+ --tw-border-opacity: 1;
+ border-color: rgb(255 188 173 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-blue-400 {
+ --tw-border-opacity: 1;
+ border-color: rgb(118 169 250 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-gray-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(107 114 128 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-red-400 {
+ --tw-border-opacity: 1;
+ border-color: rgb(249 128 128 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-green-400 {
+ --tw-border-opacity: 1;
+ border-color: rgb(49 196 141 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-yellow-300 {
+ --tw-border-opacity: 1;
+ border-color: rgb(250 202 21 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-indigo-400 {
+ --tw-border-opacity: 1;
+ border-color: rgb(141 162 251 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-purple-400 {
+ --tw-border-opacity: 1;
+ border-color: rgb(172 148 250 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-pink-400 {
+ --tw-border-opacity: 1;
+ border-color: rgb(241 126 184 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-gray-600 {
+ --tw-border-opacity: 1;
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-blue-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(63 131 248 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-green-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(14 159 110 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-primary-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(254 121 93 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-red-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(240 82 82 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-gray-900 {
+ --tw-border-opacity: 1;
+ border-color: rgb(17 24 39 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-white {
+ --tw-border-opacity: 1;
+ border-color: rgb(255 255 255 / var(--tw-border-opacity));
+}
+
+.dark .dark\:\!border-gray-600 {
+ --tw-border-opacity: 1 !important;
+ border-color: rgb(75 85 99 / var(--tw-border-opacity)) !important;
+}
+
+.dark .dark\:border-red-800 {
+ --tw-border-opacity: 1;
+ border-color: rgb(155 28 28 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-yellow-800 {
+ --tw-border-opacity: 1;
+ border-color: rgb(114 59 19 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-green-800 {
+ --tw-border-opacity: 1;
+ border-color: rgb(3 84 63 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-indigo-800 {
+ --tw-border-opacity: 1;
+ border-color: rgb(66 56 157 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-purple-800 {
+ --tw-border-opacity: 1;
+ border-color: rgb(85 33 181 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-pink-800 {
+ --tw-border-opacity: 1;
+ border-color: rgb(153 21 75 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-blue-800 {
+ --tw-border-opacity: 1;
+ border-color: rgb(30 66 159 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-primary-200 {
+ --tw-border-opacity: 1;
+ border-color: rgb(255 228 222 / var(--tw-border-opacity));
+}
+
+.dark .dark\:border-orange-800 {
+ --tw-border-opacity: 1;
+ border-color: rgb(138 44 13 / var(--tw-border-opacity));
+}
+
+.dark .dark\:bg-gray-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-gray-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-primary-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(165 55 27 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-blue-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(35 56 118 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-gray-700 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-red-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(119 29 29 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-green-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(1 71 55 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-yellow-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(99 49 18 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-indigo-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(54 47 120 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-purple-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(74 29 150 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-pink-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(117 26 61 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-gray-300 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(209 213 219 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-blue-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(28 100 242 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-green-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(5 122 85 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-primary-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(239 86 47 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-purple-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(126 58 242 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-red-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(224 36 36 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-blue-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(63 131 248 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-green-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(14 159 110 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-gray-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(107 114 128 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-primary-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(254 121 93 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-purple-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(144 97 249 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-red-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(240 82 82 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-yellow-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(227 160 8 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-transparent {
+ background-color: transparent;
+}
+
+.dark .dark\:bg-gray-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-gray-800\/30 {
+ background-color: rgb(31 41 55 / 0.3);
+}
+
+.dark .dark\:bg-inherit {
+ background-color: inherit;
+}
+
+.dark .dark\:bg-indigo-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(104 117 245 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-primary-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 228 222 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-yellow-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(159 88 10 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-primary-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 188 173 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-gray-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-green-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(49 196 141 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-indigo-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(141 162 251 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-purple-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(172 148 250 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-pink-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(241 126 184 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-blue-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(118 169 250 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-primary-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(204 69 34 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-red-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(155 28 28 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-yellow-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(114 59 19 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-green-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(3 84 63 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-blue-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(30 66 159 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-indigo-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(66 56 157 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-purple-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(85 33 181 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-orange-700 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(180 52 3 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-orange-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(138 44 13 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:bg-opacity-80 {
+ --tw-bg-opacity: 0.8;
+}
+
+.dark .dark\:fill-gray-300 {
+ fill: #D1D5DB;
+}
+
+.dark .dark\:text-white {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-gray-400 {
+ --tw-text-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-gray-300 {
+ --tw-text-opacity: 1;
+ color: rgb(209 213 219 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-primary-300 {
+ --tw-text-opacity: 1;
+ color: rgb(255 213 204 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-blue-300 {
+ --tw-text-opacity: 1;
+ color: rgb(164 202 254 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-red-300 {
+ --tw-text-opacity: 1;
+ color: rgb(248 180 180 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-green-300 {
+ --tw-text-opacity: 1;
+ color: rgb(132 225 188 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-yellow-300 {
+ --tw-text-opacity: 1;
+ color: rgb(250 202 21 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-indigo-300 {
+ --tw-text-opacity: 1;
+ color: rgb(180 198 252 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-purple-300 {
+ --tw-text-opacity: 1;
+ color: rgb(202 191 253 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-pink-300 {
+ --tw-text-opacity: 1;
+ color: rgb(248 180 217 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-primary-400 {
+ --tw-text-opacity: 1;
+ color: rgb(255 188 173 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-blue-400 {
+ --tw-text-opacity: 1;
+ color: rgb(118 169 250 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-red-400 {
+ --tw-text-opacity: 1;
+ color: rgb(249 128 128 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-green-400 {
+ --tw-text-opacity: 1;
+ color: rgb(49 196 141 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-indigo-400 {
+ --tw-text-opacity: 1;
+ color: rgb(141 162 251 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-purple-400 {
+ --tw-text-opacity: 1;
+ color: rgb(172 148 250 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-pink-400 {
+ --tw-text-opacity: 1;
+ color: rgb(241 126 184 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-primary-700 {
+ --tw-text-opacity: 1;
+ color: rgb(235 79 39 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-gray-900 {
+ --tw-text-opacity: 1;
+ color: rgb(17 24 39 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-primary-500 {
+ --tw-text-opacity: 1;
+ color: rgb(254 121 93 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-blue-500 {
+ --tw-text-opacity: 1;
+ color: rgb(63 131 248 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-green-500 {
+ --tw-text-opacity: 1;
+ color: rgb(14 159 110 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-red-500 {
+ --tw-text-opacity: 1;
+ color: rgb(240 82 82 / var(--tw-text-opacity));
+}
+
+.dark .dark\:\!text-white {
+ --tw-text-opacity: 1 !important;
+ color: rgb(255 255 255 / var(--tw-text-opacity)) !important;
+}
+
+.dark .dark\:text-gray-500 {
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-primary-100 {
+ --tw-text-opacity: 1;
+ color: rgb(255 241 238 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-gray-100 {
+ --tw-text-opacity: 1;
+ color: rgb(243 244 246 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-primary-800 {
+ --tw-text-opacity: 1;
+ color: rgb(204 69 34 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-primary-900 {
+ --tw-text-opacity: 1;
+ color: rgb(165 55 27 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-gray-600 {
+ --tw-text-opacity: 1;
+ color: rgb(75 85 99 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-gray-700 {
+ --tw-text-opacity: 1;
+ color: rgb(55 65 81 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-blue-100 {
+ --tw-text-opacity: 1;
+ color: rgb(225 239 254 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-green-100 {
+ --tw-text-opacity: 1;
+ color: rgb(222 247 236 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-red-100 {
+ --tw-text-opacity: 1;
+ color: rgb(253 232 232 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-yellow-100 {
+ --tw-text-opacity: 1;
+ color: rgb(253 246 178 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-purple-100 {
+ --tw-text-opacity: 1;
+ color: rgb(237 235 254 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-indigo-100 {
+ --tw-text-opacity: 1;
+ color: rgb(229 237 255 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-pink-100 {
+ --tw-text-opacity: 1;
+ color: rgb(252 232 243 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-primary-200 {
+ --tw-text-opacity: 1;
+ color: rgb(255 228 222 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-gray-200 {
+ --tw-text-opacity: 1;
+ color: rgb(229 231 235 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-red-200 {
+ --tw-text-opacity: 1;
+ color: rgb(251 213 213 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-yellow-200 {
+ --tw-text-opacity: 1;
+ color: rgb(252 233 106 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-green-200 {
+ --tw-text-opacity: 1;
+ color: rgb(188 240 218 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-blue-200 {
+ --tw-text-opacity: 1;
+ color: rgb(195 221 253 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-indigo-200 {
+ --tw-text-opacity: 1;
+ color: rgb(205 219 254 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-purple-200 {
+ --tw-text-opacity: 1;
+ color: rgb(220 215 254 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-orange-200 {
+ --tw-text-opacity: 1;
+ color: rgb(252 217 189 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-orange-400 {
+ --tw-text-opacity: 1;
+ color: rgb(255 138 76 / var(--tw-text-opacity));
+}
+
+.dark .dark\:decoration-blue-600 {
+ text-decoration-color: #1C64F2;
+}
+
+.dark .dark\:placeholder-gray-400::placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
+}
+
+.dark .dark\:placeholder-green-500::placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(14 159 110 / var(--tw-placeholder-opacity));
+}
+
+.dark .dark\:placeholder-red-500::placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(240 82 82 / var(--tw-placeholder-opacity));
+}
+
+.dark .dark\:opacity-25 {
+ opacity: 0.25;
+}
+
+.dark .dark\:shadow-gray-800 {
+ --tw-shadow-color: #1F2937;
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-blue-800 {
+ --tw-shadow-color: #1E429F;
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-gray-900 {
+ --tw-shadow-color: #111827;
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-green-800 {
+ --tw-shadow-color: #03543F;
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-gray-700 {
+ --tw-shadow-color: #374151;
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-primary-800 {
+ --tw-shadow-color: #CC4522;
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-purple-800 {
+ --tw-shadow-color: #5521B5;
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-red-800 {
+ --tw-shadow-color: #9B1C1C;
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-yellow-700 {
+ --tw-shadow-color: #8E4B10;
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-gray-800\/80 {
+ --tw-shadow-color: rgb(31 41 55 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-blue-800\/80 {
+ --tw-shadow-color: rgb(30 66 159 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-green-800\/80 {
+ --tw-shadow-color: rgb(3 84 63 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-primary-800\/80 {
+ --tw-shadow-color: rgb(204 69 34 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-purple-800\/80 {
+ --tw-shadow-color: rgb(85 33 181 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-red-800\/80 {
+ --tw-shadow-color: rgb(155 28 28 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-yellow-800\/80 {
+ --tw-shadow-color: rgb(114 59 19 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-cyan-800\/80 {
+ --tw-shadow-color: rgb(21 94 117 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-teal-800\/80 {
+ --tw-shadow-color: rgb(5 80 92 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-lime-800\/80 {
+ --tw-shadow-color: rgb(63 98 18 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:shadow-pink-800\/80 {
+ --tw-shadow-color: rgb(153 21 75 / 0.8);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.dark .dark\:ring-gray-500 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:ring-primary-500 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(254 121 93 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:ring-gray-900 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(17 24 39 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:ring-offset-gray-800 {
+ --tw-ring-offset-color: #1F2937;
+}
+
+.dark .dark\:first-letter\:text-gray-100::first-letter {
+ --tw-text-opacity: 1;
+ color: rgb(243 244 246 / var(--tw-text-opacity));
+}
+
+.dark .dark\:before\:shadow-\[-10px_0_50px_65px_rgba\(16\2c 24\2c 39\2c 1\)\]::before {
+ content: var(--tw-content);
+ --tw-shadow: -10px 0 50px 65px rgba(16,24,39,1);
+ --tw-shadow-colored: -10px 0 50px 65px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.dark .dark\:after\:shadow-\[10px_0_50px_65px_rgba\(16\2c 24\2c 39\2c 1\)\]::after {
+ content: var(--tw-content);
+ --tw-shadow: 10px 0 50px 65px rgba(16,24,39,1);
+ --tw-shadow-colored: 10px 0 50px 65px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.dark .odd\:dark\:bg-gray-800:nth-child(odd) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
+}
+
+.dark .odd\:dark\:bg-blue-800:nth-child(odd) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(30 66 159 / var(--tw-bg-opacity));
+}
+
+.dark .odd\:dark\:bg-green-800:nth-child(odd) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(3 84 63 / var(--tw-bg-opacity));
+}
+
+.dark .odd\:dark\:bg-red-800:nth-child(odd) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(155 28 28 / var(--tw-bg-opacity));
+}
+
+.dark .odd\:dark\:bg-yellow-800:nth-child(odd) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(114 59 19 / var(--tw-bg-opacity));
+}
+
+.dark .odd\:dark\:bg-purple-800:nth-child(odd) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(85 33 181 / var(--tw-bg-opacity));
+}
+
+.dark .even\:dark\:bg-gray-700:nth-child(even) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
+}
+
+.dark .even\:dark\:bg-blue-700:nth-child(even) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(26 86 219 / var(--tw-bg-opacity));
+}
+
+.dark .even\:dark\:bg-green-700:nth-child(even) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(4 108 78 / var(--tw-bg-opacity));
+}
+
+.dark .even\:dark\:bg-red-700:nth-child(even) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(200 30 30 / var(--tw-bg-opacity));
+}
+
+.dark .even\:dark\:bg-yellow-700:nth-child(even) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(142 75 16 / var(--tw-bg-opacity));
+}
+
+.dark .even\:dark\:bg-purple-700:nth-child(even) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(108 43 217 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:focus-within\:border-primary-500:focus-within {
+ --tw-border-opacity: 1;
+ border-color: rgb(254 121 93 / var(--tw-border-opacity));
+}
+
+.dark .dark\:focus-within\:text-white:focus-within {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.dark .dark\:focus-within\:ring-gray-700:focus-within {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus-within\:ring-blue-800:focus-within {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(30 66 159 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus-within\:ring-green-800:focus-within {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(3 84 63 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus-within\:ring-primary-800:focus-within {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(204 69 34 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus-within\:ring-purple-900:focus-within {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(74 29 150 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus-within\:ring-red-900:focus-within {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(119 29 29 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus-within\:ring-yellow-900:focus-within {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(99 49 18 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus-within\:ring-gray-800:focus-within {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:hover\:border-gray-600:hover {
+ --tw-border-opacity: 1;
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
+}
+
+.dark .dark\:hover\:border-gray-500:hover {
+ --tw-border-opacity: 1;
+ border-color: rgb(107 114 128 / var(--tw-border-opacity));
+}
+
+.dark .hover\:dark\:bg-gray-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-gray-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-primary-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(204 69 34 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-blue-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(30 66 159 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-red-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(155 28 28 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-green-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(3 84 63 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-yellow-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(114 59 19 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-indigo-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(66 56 157 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-purple-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(85 33 181 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-pink-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(153 21 75 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-gray-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-blue-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(26 86 219 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-green-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(4 108 78 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-primary-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(235 79 39 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-purple-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(108 43 217 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-red-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(200 30 30 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-gray-600:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-blue-600:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(28 100 242 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-green-600:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(5 122 85 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-primary-600:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(239 86 47 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-purple-500:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(144 97 249 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-red-600:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(224 36 36 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-yellow-400:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(227 160 8 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:bg-primary-500:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(254 121 93 / var(--tw-bg-opacity));
+}
+
+.dark .dark\:hover\:text-primary-300:hover {
+ --tw-text-opacity: 1;
+ color: rgb(255 213 204 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-blue-300:hover {
+ --tw-text-opacity: 1;
+ color: rgb(164 202 254 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-gray-300:hover {
+ --tw-text-opacity: 1;
+ color: rgb(209 213 219 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-red-300:hover {
+ --tw-text-opacity: 1;
+ color: rgb(248 180 180 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-green-300:hover {
+ --tw-text-opacity: 1;
+ color: rgb(132 225 188 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-yellow-300:hover {
+ --tw-text-opacity: 1;
+ color: rgb(250 202 21 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-indigo-300:hover {
+ --tw-text-opacity: 1;
+ color: rgb(180 198 252 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-purple-300:hover {
+ --tw-text-opacity: 1;
+ color: rgb(202 191 253 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-pink-300:hover {
+ --tw-text-opacity: 1;
+ color: rgb(248 180 217 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-primary-900:hover {
+ --tw-text-opacity: 1;
+ color: rgb(165 55 27 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-white:hover {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:text-primary-100:hover {
+ --tw-text-opacity: 1;
+ color: rgb(255 241 238 / var(--tw-text-opacity));
+}
+
+.dark .dark\:focus\:border-blue-500:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(63 131 248 / var(--tw-border-opacity));
+}
+
+.dark .dark\:focus\:border-primary-500:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(254 121 93 / var(--tw-border-opacity));
+}
+
+.dark .dark\:focus\:border-green-500:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(14 159 110 / var(--tw-border-opacity));
+}
+
+.dark .dark\:focus\:border-red-500:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(240 82 82 / var(--tw-border-opacity));
+}
+
+.dark .dark\:focus\:text-white:focus {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.dark .dark\:focus\:ring-gray-800:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-blue-800:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(30 66 159 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-green-800:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(3 84 63 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-cyan-800:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(21 94 117 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-teal-800:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(5 80 92 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-lime-800:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(63 98 18 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-red-800:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(155 28 28 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-pink-800:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(153 21 75 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-purple-800:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(85 33 181 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-teal-700:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(3 102 114 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-red-400:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(249 128 128 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-blue-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(63 131 248 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-primary-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(254 121 93 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-green-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(14 159 110 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-red-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(240 82 82 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-primary-600:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(239 86 47 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-red-600:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(224 36 36 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-green-600:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(5 122 85 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-purple-600:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(126 58 242 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-teal-600:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(4 116 129 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-yellow-600:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(159 88 10 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-orange-600:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(208 56 1 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-blue-600:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(28 100 242 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:focus\:ring-gray-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity));
+}
+
+.dark .dark\:disabled\:text-gray-500:disabled {
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity));
+}
+
+.dark .group:hover .dark\:group-hover\:bg-gray-800\/60 {
+ background-color: rgb(31 41 55 / 0.6);
+}
+
+.dark .group:hover .dark\:group-hover\:text-primary-500 {
+ --tw-text-opacity: 1;
+ color: rgb(254 121 93 / var(--tw-text-opacity));
+}
+
+.dark .group:focus .dark\:group-focus\:ring-gray-800\/70 {
+ --tw-ring-color: rgb(31 41 55 / 0.7);
+}
+
+.peer:focus ~ .dark .peer-focus\:dark\:text-primary-500 {
+ --tw-text-opacity: 1;
+ color: rgb(254 121 93 / var(--tw-text-opacity));
+}
+
+.dark .peer:focus ~ .dark\:peer-focus\:ring-primary-800 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(204 69 34 / var(--tw-ring-opacity));
+}
+
+.dark .peer:focus ~ .dark\:peer-focus\:ring-red-800 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(155 28 28 / var(--tw-ring-opacity));
+}
+
+.dark .peer:focus ~ .dark\:peer-focus\:ring-green-800 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(3 84 63 / var(--tw-ring-opacity));
+}
+
+.dark .peer:focus ~ .dark\:peer-focus\:ring-purple-800 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(85 33 181 / var(--tw-ring-opacity));
+}
+
+.dark .peer:focus ~ .dark\:peer-focus\:ring-yellow-800 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(114 59 19 / var(--tw-ring-opacity));
+}
+
+.dark .peer:focus ~ .dark\:peer-focus\:ring-teal-800 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(5 80 92 / var(--tw-ring-opacity));
+}
+
+.dark .peer:focus ~ .dark\:peer-focus\:ring-orange-800 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(138 44 13 / var(--tw-ring-opacity));
+}
+
+.dark .peer:focus ~ .dark\:peer-focus\:ring-blue-800 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(30 66 159 / var(--tw-ring-opacity));
}
@media (max-width: 480px) {
@@ -7168,14 +8079,18 @@ svg.apply-fill path {
margin-right: 0.5rem;
}
- .sm\:mt-2 {
- margin-top: 0.5rem;
- }
-
.sm\:mr-1 {
margin-right: 0.25rem;
}
+ .sm\:mt-0 {
+ margin-top: 0px;
+ }
+
+ .sm\:mt-2 {
+ margin-top: 0.5rem;
+ }
+
.sm\:mb-0 {
margin-bottom: 0px;
}
@@ -7224,6 +8139,10 @@ svg.apply-fill path {
width: 50%;
}
+ .sm\:w-64 {
+ width: 16rem;
+ }
+
.sm\:w-11 {
width: 2.75rem;
}
@@ -7248,10 +8167,18 @@ svg.apply-fill path {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
+ .sm\:flex-row {
+ flex-direction: row;
+ }
+
.sm\:flex-nowrap {
flex-wrap: nowrap;
}
+ .sm\:gap-y-3 {
+ row-gap: 0.75rem;
+ }
+
.sm\:divide-x > :not([hidden]) ~ :not([hidden]) {
--tw-divide-x-reverse: 0;
border-right-width: calc(1px * var(--tw-divide-x-reverse));
@@ -7266,6 +8193,10 @@ svg.apply-fill path {
padding: 0.25rem;
}
+ .sm\:p-3 {
+ padding: 0.75rem;
+ }
+
.sm\:p-2 {
padding: 0.5rem;
}
@@ -7332,11 +8263,6 @@ svg.apply-fill path {
margin: 0.25rem;
}
- .md\:mx-2 {
- margin-left: 0.5rem;
- margin-right: 0.5rem;
- }
-
.md\:mx-4 {
margin-left: 1rem;
margin-right: 1rem;
@@ -7378,10 +8304,6 @@ svg.apply-fill path {
display: none;
}
- .md\:h-8 {
- height: 2rem;
- }
-
.md\:h-auto {
height: auto;
}
@@ -7426,10 +8348,6 @@ svg.apply-fill path {
height: 100%;
}
- .md\:w-8 {
- width: 2rem;
- }
-
.md\:w-6\/12 {
width: 50%;
}
@@ -7554,6 +8472,11 @@ svg.apply-fill path {
padding: 0px;
}
+ .md\:px-5 {
+ padding-left: 1.25rem;
+ padding-right: 1.25rem;
+ }
+
.md\:px-6 {
padding-left: 1.5rem;
padding-right: 1.5rem;
@@ -7592,28 +8515,36 @@ svg.apply-fill path {
font-weight: 500;
}
+ .md\:text-primary-700 {
+ --tw-text-opacity: 1;
+ color: rgb(235 79 39 / var(--tw-text-opacity));
+ }
+
.md\:hover\:bg-transparent:hover {
background-color: transparent;
}
- @media (prefers-color-scheme: dark) {
- .md\:dark\:bg-transparent {
- background-color: transparent;
- }
+ .md\:hover\:text-primary-700:hover {
+ --tw-text-opacity: 1;
+ color: rgb(235 79 39 / var(--tw-text-opacity));
+ }
- .md\:dark\:text-white {
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity));
- }
+ .dark .md\:dark\:bg-transparent {
+ background-color: transparent;
+ }
- .md\:dark\:hover\:bg-transparent:hover {
- background-color: transparent;
- }
+ .dark .md\:dark\:text-white {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+ }
- .md\:dark\:hover\:text-white:hover {
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity));
- }
+ .dark .md\:dark\:hover\:bg-transparent:hover {
+ background-color: transparent;
+ }
+
+ .dark .md\:dark\:hover\:text-white:hover {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
}
}
diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts
index a77a21d89c..c6ee72d841 100644
--- a/scripts/generateTranslations.ts
+++ b/scripts/generateTranslations.ts
@@ -15,7 +15,8 @@ class TranslationPart {
const rootTranslation = new TranslationPart()
for (const file of files) {
const content = JSON.parse(readFileSync(file, { encoding: "utf8" }))
- rootTranslation.addTranslation(file.substr(0, file.length - ".json".length), content)
+ const language = file.substr(0, file.length - ".json".length)
+ rootTranslation.addTranslation(language, content)
}
return rootTranslation
}
@@ -47,10 +48,6 @@ class TranslationPart {
return
}
for (const translationsKey in translations) {
- if (!translations.hasOwnProperty(translationsKey)) {
- continue
- }
-
const v = translations[translationsKey]
if (typeof v != "string") {
console.error(
@@ -105,9 +102,6 @@ class TranslationPart {
}
for (let key in object) {
- if (!object.hasOwnProperty(key)) {
- continue
- }
if (ignoreTerms.indexOf(key) >= 0) {
continue
}
@@ -156,13 +150,13 @@ class TranslationPart {
this.contents.set(key, new TranslationPart())
}
- ;(this.contents.get(key) as TranslationPart).recursiveAdd(v, context + "." + key)
+ (this.contents.get(key) as TranslationPart).recursiveAdd(v, context + "." + key)
}
}
knownLanguages(): string[] {
const languages = []
- for (let key of Array.from(this.contents.keys())) {
+ for (const key of Array.from(this.contents.keys())) {
const value = this.contents.get(key)
if (typeof value === "string") {
@@ -181,20 +175,20 @@ class TranslationPart {
const parts = []
let keys = Array.from(this.contents.keys())
keys = keys.sort()
- for (let key of keys) {
+ for (const key of keys) {
let value = this.contents.get(key)
if (typeof value === "string") {
value = value.replace(/"/g, "\\\"").replace(/\n/g, "\\n")
if (neededLanguage === undefined) {
- parts.push(`\"${key}\": \"${value}\"`)
+ parts.push(`"${key}": "${value}"`)
} else if (key === neededLanguage) {
return `"${value}"`
}
} else {
const sub = (value as TranslationPart).toJson(neededLanguage)
if (sub !== "") {
- parts.push(`\"${key}\": ${sub}`)
+ parts.push(`"${key}": ${sub}`)
}
}
}
@@ -335,24 +329,6 @@ class TranslationPart {
}
}
-/**
- * Checks that the given object only contains string-values
- * @param tr
- */
-function isTranslation(tr: any): boolean {
- if (tr["#"] === "no-translations") {
- return false
- }
- if (tr["special"]) {
- return false
- }
- for (const key in tr) {
- if (typeof tr[key] !== "string") {
- return false
- }
- }
- return true
-}
/**
* Converts a translation object into something that can be added to the 'generated translations'.
@@ -362,9 +338,10 @@ function isTranslation(tr: any): boolean {
function transformTranslation(
obj: any,
path: string[] = [],
- languageWhitelist: string[] = undefined
+ languageWhitelist: string[] = undefined,
+ shortNotation = false
) {
- if (isTranslation(obj)) {
+ if (GenerateTranslations.isTranslation(obj)) {
return `new Translation( ${JSON.stringify(obj)} )`
}
@@ -381,7 +358,7 @@ function transformTranslation(
}
let value = obj[key]
- if (isTranslation(value)) {
+ if (GenerateTranslations.isTranslation(value)) {
if (languageWhitelist !== undefined) {
const nv = {}
for (const ln of languageWhitelist) {
@@ -396,7 +373,7 @@ function transformTranslation(
)}.${key}\n\tThe translations in other languages are ${JSON.stringify(value)}`
}
const subParts: string[] = value["en"].match(/{[^}]*}/g)
- let expr = `return new Translation(${JSON.stringify(value)}, "core:${path.join(
+ let expr = `new Translation(${JSON.stringify(value)}, "core:${path.join(
"."
)}.${key}")`
if (subParts !== null) {
@@ -410,12 +387,16 @@ function transformTranslation(
"."
)}: A subpart contains invalid characters: ${subParts.join(", ")}`
}
- expr = `return new TypedTranslation<{ ${types.join(", ")} }>(${JSON.stringify(
+ expr = `new TypedTranslation<{ ${types.join(", ")} }>(${JSON.stringify(
value
)}, "core:${path.join(".")}.${key}")`
}
+ if (shortNotation) {
+ values.push(`${spaces} ${key}: ${expr}`)
- values.push(`${spaces}get ${key}() { ${expr} }`)
+ } else {
+ values.push(`${spaces}get ${key}() { return ${expr} }`)
+ }
} else {
values.push(
spaces + key + ": " + transformTranslation(value, [...path, key], languageWhitelist)
@@ -496,54 +477,11 @@ function formatFile(path) {
writeFileSync(path, contents)
}
-/**
- * Generates the big compiledTranslations file
- */
-function genTranslations() {
- if (!fs.existsSync("./src/assets/generated/")) {
- fs.mkdirSync("./src/assets/generated/")
- }
- const translations = JSON.parse(
- fs.readFileSync("./src/assets/generated/translations.json", "utf-8")
- )
- const transformed = transformTranslation(translations)
-
- let module = `import {Translation, TypedTranslation} from "../../UI/i18n/Translation"\n\nexport default class CompiledTranslations {\n\n`
- module += " public static t = " + transformed
- module += "\n }"
-
- fs.writeFileSync("./src/assets/generated/CompiledTranslations.ts", module)
-}
/**
* Reads 'lang/*.json', writes them into to 'assets/generated/translations.json'.
* This is only for the core translations
*/
-function compileTranslationsFromWeblate() {
- const translations = ScriptUtils.readDirRecSync("./langs", 1).filter(
- (path) => path.indexOf(".json") > 0
- )
-
- const allTranslations = new TranslationPart()
-
- allTranslations.validateStrict()
-
- for (const translationFile of translations) {
- try {
- const contents = JSON.parse(readFileSync(translationFile, "utf-8"))
- let language = translationFile.substring(translationFile.lastIndexOf("/") + 1)
- language = language.substring(0, language.length - 5)
- allTranslations.add(language, contents)
- } catch (e) {
- throw "Could not read file " + translationFile + " due to " + e
- }
- }
-
- writeFileSync(
- "./src/assets/generated/translations.json",
- JSON.stringify(JSON.parse(allTranslations.toJson()), null, " ")
- )
-}
/**
* Get all the strings out of the layers; writes them onto the weblate paths
@@ -635,7 +573,7 @@ function MergeTranslation(source: any, target: any, language: string, context: s
if (targetV[language] !== undefined && targetV[language] !== sourceV) {
was = " (overwritten " + targetV[language] + ")"
}
- console.log(" + ", context + "." + language, "-->", sourceV, was)
+ // console.log(" + ", context + "." + language, "-->", sourceV, was)
continue
}
if (typeof sourceV === "object") {
@@ -724,7 +662,7 @@ function removeNonEnglishTranslations(object: any) {
leaf["en"] = en
},
(possibleLeaf) =>
- possibleLeaf !== null && typeof possibleLeaf === "object" && isTranslation(possibleLeaf)
+ possibleLeaf !== null && typeof possibleLeaf === "object" && GenerateTranslations.isTranslation(possibleLeaf)
)
}
@@ -759,6 +697,25 @@ class GenerateTranslations extends Script {
super("Syncs translations from/to the theme and layer files")
}
+ /**
+ * Checks that the given object only contains string-values
+ * @param tr
+ */
+ static isTranslation(tr: Record): boolean {
+ if (tr["#"] === "no-translations") {
+ return false
+ }
+ if (tr["special"]) {
+ return false
+ }
+ for (const key in tr) {
+ if (typeof tr[key] !== "string") {
+ return false
+ }
+ }
+ return true
+ }
+
/**
* OUtputs the 'used_languages.json'-file
*/
@@ -781,22 +738,74 @@ class GenerateTranslations extends Script {
}
}
+
+ /**
+ * Generates the big compiledTranslations file based on 'translations.json'
+ */
+ genTranslations(englishOnly?: boolean) {
+ if (!fs.existsSync("./src/assets/generated/")) {
+ fs.mkdirSync("./src/assets/generated/")
+ }
+ const translations = JSON.parse(
+ fs.readFileSync("./src/assets/generated/translations.json", "utf-8")
+ )
+ const transformed = transformTranslation(translations, undefined, englishOnly ? ["en"] : undefined, englishOnly)
+
+ let module = `import {Translation, TypedTranslation} from "../../UI/i18n/Translation"\n\nexport default class CompiledTranslations {\n\n`
+ module += " public static t = " + transformed
+ module += "\n }"
+
+ fs.writeFileSync("./src/assets/generated/CompiledTranslations.ts", module)
+ }
+
+ compileTranslationsFromWeblate(englishOnly: boolean) {
+ const translations = ScriptUtils.readDirRecSync("./langs", 1).filter(
+ (path) => path.indexOf(".json") > 0
+ )
+
+ const allTranslations = new TranslationPart()
+
+ allTranslations.validateStrict()
+
+ for (const translationFile of translations) {
+ try {
+ const contents = JSON.parse(readFileSync(translationFile, "utf-8"))
+ let language = translationFile.substring(translationFile.lastIndexOf("/") + 1)
+ language = language.substring(0, language.length - 5)
+ if (englishOnly && language !== "en") {
+ continue
+ }
+ allTranslations.add(language, contents)
+ } catch (e) {
+ throw "Could not read file " + translationFile + " due to " + e
+ }
+ }
+
+ writeFileSync(
+ "./src/assets/generated/translations.json",
+ JSON.stringify(JSON.parse(allTranslations.toJson()), null, " ")
+ )
+ }
+
async main(args: string[]): Promise {
if (!existsSync("./langs/themes")) {
mkdirSync("./langs/themes")
}
const themeOverwritesWeblate = args[0] === "--ignore-weblate"
const englishOnly = args[0] === "--english-only"
+ if (englishOnly) {
+ console.log("ENGLISH ONLY")
+ }
if (!themeOverwritesWeblate) {
- mergeLayerTranslations()
- mergeThemeTranslations()
- compileTranslationsFromWeblate()
+ mergeLayerTranslations(englishOnly)
+ mergeThemeTranslations(englishOnly)
+ this.compileTranslationsFromWeblate(englishOnly)
} else {
console.log("Ignore weblate")
}
this.detectUsedLanguages()
- genTranslations()
+ this.genTranslations(englishOnly)
{
const allTranslationFiles = ScriptUtils.readDirRecSync("langs").filter((path) =>
path.endsWith(".json")
diff --git a/scripts/osm2pgsql/osmPoiDatabase.ts b/scripts/osm2pgsql/osmPoiDatabase.ts
index 02a999d7ea..cb7159e9ca 100644
--- a/scripts/osm2pgsql/osmPoiDatabase.ts
+++ b/scripts/osm2pgsql/osmPoiDatabase.ts
@@ -94,7 +94,7 @@ export class OsmPoiDatabase {
let latestDate: Date = undefined
for (const name of dbs) {
const date = new Date(name)
- if (latestDate.getTime() < date.getTime()) {
+ if (latestDate === undefined || latestDate.getTime() < date.getTime()) {
latest = name
latestDate = date
}
@@ -104,7 +104,7 @@ export class OsmPoiDatabase {
}
console.log("Latest database is:", latest)
- return latest
+ return "osm-poi."+latest
}
async createNew(date: string) {
diff --git a/scripts/osm2pgsql/update.sh b/scripts/osm2pgsql/update.sh
index 601d490cdd..d88f896068 100755
--- a/scripts/osm2pgsql/update.sh
+++ b/scripts/osm2pgsql/update.sh
@@ -1,18 +1,23 @@
#! /bin/bash
-# Full database update. DOwnload latest from planet.osm.org, build update script, setup and seed it
+# Full database update. Downloads the latest from planet.osm.org, build update script, setup and seed it
+# Meant to be run with 'nohup'
nvm use
npm run init # contains a 'npm run generate, which builds the layers'
npm run generate:buildDbScript
mv build_db.lua ~/data/
+
+
+cd ~/data || exit
+rm planet-latest.osm.pbf
+
+wget https://planet.osm.org/pbf/planet-latest.osm.pbf
+
TIMESTAMP=$(osmium fileinfo ~/data/planet-latest.osm.pbf -g header.option.timestamp)
DATE=$(echo $TIMESTAMP | sed "s/T.*//")
echo $DATE
npm run create:database -- -- ${DATE/T.*//}
-cd ~/data || exit
-rm planet-latest.osm.pbf
-wget https://planet.osm.org/pbf/planet-latest.osm.pbf
rm seeddb.log
osm2pgsql -O flex -S build_db.lua -s --flat-nodes=import-help-file -d postgresql://user:password@localhost:5444/osm-poi planet-latest.osm.pbf >> seeddb.log
@@ -20,7 +25,10 @@ osm2pgsql -O flex -S build_db.lua -s --flat-nodes=import-help-file -d postgresql
# To see the progress
# tail -f seeddb.log
+cd ~/git/MapComplete || exit
npm run delete:database:old
+nohup npm run server:summary >> summary_server.log &
+cd - || exit
# Restart tileserver
export DATABASE_URL=postgresql://user:password@localhost:5444/osm-poi.${DATE}
diff --git a/src/Logic/State/UserSettingsMetaTagging.ts b/src/Logic/State/UserSettingsMetaTagging.ts
index 6e568c5c32..33a5ae85b5 100644
--- a/src/Logic/State/UserSettingsMetaTagging.ts
+++ b/src/Logic/State/UserSettingsMetaTagging.ts
@@ -1,42 +1,14 @@
import { Utils } from "../../Utils"
/** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */
export class ThemeMetaTagging {
- public static readonly themeName = "usersettings"
+ public static readonly themeName = "usersettings"
- public metaTaggging_for_usersettings(feat: { properties: Record }) {
- Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () =>
- feat.properties._description
- .match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)
- ?.at(1)
- )
- Utils.AddLazyProperty(
- feat.properties,
- "_d",
- () => feat.properties._description?.replace(/</g, "<")?.replace(/>/g, ">") ?? ""
- )
- Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () =>
- ((feat) => {
- const e = document.createElement("div")
- e.innerHTML = feat.properties._d
- return Array.from(e.getElementsByTagName("a")).filter(
- (a) => a.href.match(/mastodon|en.osm.town/) !== null
- )[0]?.href
- })(feat)
- )
- Utils.AddLazyProperty(feat.properties, "_mastodon_link", () =>
- ((feat) => {
- const e = document.createElement("div")
- e.innerHTML = feat.properties._d
- return Array.from(e.getElementsByTagName("a")).filter(
- (a) => a.getAttribute("rel")?.indexOf("me") >= 0
- )[0]?.href
- })(feat)
- )
- Utils.AddLazyProperty(
- feat.properties,
- "_mastodon_candidate",
- () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a
- )
- feat.properties["__current_backgroun"] = "initial_value"
- }
-}
+ public metaTaggging_for_usersettings(feat: {properties: Record}) {
+ Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) )
+ Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? '' )
+ Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) )
+ Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) )
+ Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a )
+ feat.properties['__current_backgroun'] = 'initial_value'
+ }
+}
\ No newline at end of file
diff --git a/src/Logic/Web/ThemeViewStateHashActor.ts b/src/Logic/Web/ThemeViewStateHashActor.ts
index 84aa808687..acded8c92b 100644
--- a/src/Logic/Web/ThemeViewStateHashActor.ts
+++ b/src/Logic/Web/ThemeViewStateHashActor.ts
@@ -4,75 +4,67 @@ import { MenuState } from "../../Models/MenuState"
export default class ThemeViewStateHashActor {
private readonly _state: ThemeViewState
+ private isUpdatingHash = false
public static readonly documentation = [
"The URL-hash can contain multiple values:",
"",
"- The id of the currently selected object, e.g. `node/1234`",
"- The currently opened menu view",
- "- The base64-encoded JSON-file specifying a custom theme (only when loading)",
"",
"### Possible hashes to open a menu",
"",
"The possible hashes are:",
"",
- MenuState._menuviewTabs.map((tab) => "`menu:" + tab + "`").join(","),
- MenuState._themeviewTabs.map((tab) => "`theme-menu:" + tab + "`").join(","),
+ MenuState.pageNames.map((tab) => "`" + tab + "`").join(",")
]
/**
- * Converts the hash to the appropriate themeview state and, vice versa, sets the hash.
+ * Converts the hash to the appropriate theme-view state and, vice versa, sets the hash.
*
* As the navigator-back-button changes the hash first, this class thus also handles the 'back'-button events.
*
* Note that there is no "real" way to intercept the back button, we can only detect the removal of the hash.
* As such, we use a change in the hash to close the appropriate windows
*
- * @param state
*/
constructor(state: ThemeViewState) {
this._state = state
+ const hashOnLoad = Hash.hash.data
+ const containsMenu = this.loadStateFromHash(hashOnLoad)
// First of all, try to recover the selected element
- if (Hash.hash.data) {
- const hash = Hash.hash.data
- this.loadStateFromHash(hash)
- Hash.hash.setData(hash) // reapply the previous hash
- state.indexedFeatures.featuresById.addCallbackAndRunD((_) => {
- let unregister = this.loadSelectedElementFromHash(hash)
+ if (!containsMenu && hashOnLoad?.length > 0) {
+ state.indexedFeatures.featuresById.addCallbackAndRunD(() => {
// once that we have found a matching element, we can be sure the indexedFeaturesource was popuplated and that the job is done
- return unregister
+ return this.loadSelectedElementFromHash(hashOnLoad)
})
}
- // Register a hash change listener to correctly handle the back button
- Hash.hash.addCallback((hash) => {
- if (!!hash) {
- // There is still a hash
- // We _only_ have to (at most) close the overlays in this case
- if (state.previewedImage.data) {
- state.previewedImage.setData(undefined)
- return
- }
-
- const parts = hash.split(";")
- if (parts.indexOf("background") < 0) {
- state.guistate.backgroundLayerSelectionIsOpened.setData(false)
- }
- this.loadSelectedElementFromHash(hash)
- } else {
- this.back()
- }
- })
// At last, register callbacks on the state to update the hash when they change.
// Note: these should use 'addCallback', not 'addCallbackAndRun'
- state.selectedElement.addCallback((_) => this.setHash())
- state.guistate.allToggles.forEach(({ toggle, submenu }) => {
- submenu?.addCallback((_) => this.setHash())
- toggle.addCallback((_) => this.setHash())
+ state.selectedElement.addCallback(() => this.setHash())
+
+ // Register a hash change listener to correctly handle the back button
+ Hash.hash.addCallback((hash) => {
+ if(this.isUpdatingHash){
+ return
+ }
+ if (!hash) {
+ this.back()
+ } else {
+ if (!this.loadStateFromHash(hash)) {
+ this.loadSelectedElementFromHash(hash)
+ }
+ }
})
+ for (const key in state.guistate.pageStates) {
+ const toggle = state.guistate.pageStates[key]
+ toggle.addCallback(() => this.setHash())
+ }
+
// When all is done, set the hash. This must happen last to give the code above correct info
this.setHash()
}
@@ -80,15 +72,10 @@ export default class ThemeViewStateHashActor {
/**
* Selects the appropriate element
* Returns true if this method can be unregistered for the first run
- * @param hash
- * @private
*/
private loadSelectedElementFromHash(hash: string): boolean {
const state = this._state
const selectedElement = state.selectedElement
- // state.indexedFeatures.featuresById.stabilized(250)
-
- hash = hash.split(";")[0] // The 'selectedElement' is always the _first_ item in the hash (if any)
// Set the hash based on the selected element...
// ... search and select an element based on the hash
@@ -101,7 +88,7 @@ export default class ThemeViewStateHashActor {
if (!found) {
return false
}
- if (found.properties.id === "last_click") {
+ if (found.properties.id.startsWith("last_click")) {
return true
}
console.log(
@@ -114,67 +101,46 @@ export default class ThemeViewStateHashActor {
return true
}
- private loadStateFromHash(hash: string) {
- const state = this._state
- for (const superpart of hash.split(";")) {
- const parts = superpart.at(-1)?.split(":") ?? []
-
- outer: for (const { toggle, name, submenu } of state.guistate.allToggles) {
- for (const part of parts) {
- if (part.indexOf(":") < 0) {
- if (part === name) {
- toggle.setData(true)
- continue outer
- }
- continue
- }
- const [main, submenuValue] = part.split(":")
- if (part !== main) {
- continue
- }
- toggle.setData(true)
- submenu?.setData(submenuValue)
- continue outer
- }
-
- // If we arrive here, the loop above has not found any match
- toggle.setData(false)
+ private loadStateFromHash(hash: string): boolean {
+ for (const page in this._state.guistate.pageStates) {
+ if (page === hash) {
+ const toggle = this._state.guistate.pageStates[page]
+ toggle.set(true)
+ console.log("Loading menu view from hash:", page)
+ return true
}
}
+ return false
}
- private setHash() {
- const s = this._state
- let h = ""
-
- for (const { toggle, showOverOthers, name, submenu } of s.guistate.allToggles) {
- if (showOverOthers || !toggle.data) {
- continue
+ /**
+ * Sets the hash based on:
+ *
+ * 1. Selected element ID
+ * 2. A selected 'page' from the menu
+ *
+ */
+ private setHash(): void {
+ // Important ! This function is called by 'addCallback' and might thus never return 'true' or it will be unregistered
+ this.isUpdatingHash = true
+ try {
+ const selectedElement = this._state.selectedElement.data
+ if (selectedElement) {
+ Hash.hash.set(selectedElement.properties.id)
+ return
}
- h = name
- if (submenu?.data) {
- h += ":" + submenu.data
+ for (const page in this._state.guistate.pageStates) {
+ const toggle = this._state.guistate.pageStates[page]
+ if (toggle.data) {
+ Hash.hash.set(page)
+ return
+ }
}
+ Hash.hash.set(undefined)
+ return
+ } finally {
+ this.isUpdatingHash = false
}
-
- if (s.selectedElement.data !== undefined) {
- h = s.selectedElement.data.properties.id
- }
-
- for (const { toggle, showOverOthers, name, submenu } of s.guistate.allToggles) {
- if (!showOverOthers || !toggle.data) {
- continue
- }
- if (h) {
- h += ";" + name
- } else {
- h = name
- }
- if (submenu?.data) {
- h += ":" + submenu.data
- }
- }
- Hash.hash.setData(h)
}
private back() {
@@ -183,13 +149,9 @@ export default class ThemeViewStateHashActor {
state.previewedImage.setData(undefined)
return
}
- // history.pushState(null, null, window.location.pathname);
- if (state.selectedElement.data) {
- state.selectedElement.setData(undefined)
- return
- }
if (state.guistate.closeAll()) {
return
}
+ state.selectedElement.setData(undefined)
}
}
diff --git a/src/Models/MenuState.ts b/src/Models/MenuState.ts
index ae48ae6fe7..0d5a73ccc8 100644
--- a/src/Models/MenuState.ts
+++ b/src/Models/MenuState.ts
@@ -2,11 +2,10 @@ import LayerConfig from "./ThemeConfig/LayerConfig"
import { UIEventSource } from "../Logic/UIEventSource"
import UserRelatedState from "../Logic/State/UserRelatedState"
import { Utils } from "../Utils"
-import { LocalStorageSource } from "../Logic/Web/LocalStorageSource"
import Zoomcontrol from "../UI/Zoomcontrol"
+import { LocalStorageSource } from "../Logic/Web/LocalStorageSource"
-export type ThemeViewTabStates = (typeof MenuState._themeviewTabs)[number]
-export type MenuViewTabStates = (typeof MenuState._menuviewTabs)[number]
+export type PageType = (typeof MenuState.pageNames)[number]
/**
* Indicates if a menu is open, and if so, which tab is selected;
@@ -15,141 +14,48 @@ export type MenuViewTabStates = (typeof MenuState._menuviewTabs)[number]
* Some convenience methods are provided for this as well
*/
export class MenuState {
- public static readonly _themeviewTabs = ["intro", "download", "copyright", "share"] as const
- public static readonly _menuviewTabs = [
- "about",
- "settings",
- "favourites",
- "community",
- "privacy",
- "advanced",
+
+
+ public static readonly pageNames = [
+ "copyright", "copyright_icons", "community_index", "hotkeys",
+ "privacy", "filter", "background", "about_theme", "download", "favourites",
+ "usersettings", "share", "menu",
] as const
- public readonly themeIsOpened: UIEventSource
- public readonly themeViewTabIndex: UIEventSource
- public readonly themeViewTab: UIEventSource
- public readonly menuIsOpened: UIEventSource
- public readonly menuViewTabIndex: UIEventSource
- public readonly menuViewTab: UIEventSource
- public readonly backgroundLayerSelectionIsOpened: UIEventSource =
- new UIEventSource(false)
-
- public readonly filtersPanelIsOpened: UIEventSource = new UIEventSource(false)
- public readonly privacyPanelIsOpened: UIEventSource = new UIEventSource(false)
- /**
- * Standalone copyright panel
- */
- public readonly copyrightPanelIsOpened: UIEventSource = new UIEventSource(
- false
- )
-
- public readonly communityIndexPanelIsOpened: UIEventSource = new UIEventSource(false)
- public readonly allToggles: {
- toggle: UIEventSource
- name: string
- submenu?: UIEventSource
- showOverOthers?: boolean
- }[]
+ public readonly pageStates: Record>
public readonly highlightedLayerInFilters: UIEventSource = new UIEventSource(
- undefined
+ undefined,
)
public highlightedUserSetting: UIEventSource = new UIEventSource(undefined)
- constructor(shouldOpenWelcomeMessage: boolean, themeid: string = "") {
+ constructor(shouldShowWelcomeMessage: boolean, themeid: string) {
// Note: this class is _not_ responsible to update the Hash, @see ThemeViewStateHashActor for this
- if (themeid) {
- themeid += "-"
+ const states = {}
+ for (const pageName of MenuState.pageNames) {
+ const toggle = new UIEventSource(false)
+ states[pageName] = toggle
}
- this.themeIsOpened = LocalStorageSource.GetParsed(
- themeid + "thememenuisopened",
- shouldOpenWelcomeMessage
- )
- this.themeViewTabIndex = LocalStorageSource.GetParsed(themeid + "themeviewtabindex", 0)
- this.themeViewTab = this.themeViewTabIndex.sync(
- (i) => MenuState._themeviewTabs[i],
- [],
- (str) => MenuState._themeviewTabs.indexOf(str)
- )
+ this.pageStates = >>states
- this.menuIsOpened = LocalStorageSource.GetParsed(themeid + "menuisopened", false)
- this.menuViewTabIndex = LocalStorageSource.GetParsed(themeid + "menuviewtabindex", 0)
- this.menuViewTab = this.menuViewTabIndex.sync(
- (i) => MenuState._menuviewTabs[i],
- [],
- (str) => MenuState._menuviewTabs.indexOf(str)
- )
- this.menuIsOpened.addCallbackAndRun((isOpen) => {
- if (!isOpen) {
- this.highlightedUserSetting.setData(undefined)
+ for (const pageName of MenuState.pageNames) {
+ if(pageName === "menu"){
+ continue
}
- })
- this.menuViewTab.addCallbackD((tab) => {
- if (tab !== "settings") {
- this.highlightedUserSetting.setData(undefined)
- }
- })
- this.filtersPanelIsOpened.addCallbackAndRun((isOpen) => {
- if (!isOpen) {
- this.highlightedLayerInFilters.setData(undefined)
- }
- })
-
- this.menuIsOpened.addCallbackAndRunD((opened) => {
- if (opened) {
- this.themeIsOpened.setData(false)
- }
- })
- this.themeIsOpened.addCallbackAndRunD((opened) => {
- if (opened) {
- this.menuIsOpened.setData(false)
- }
- })
-
- this.allToggles = [
- {
- toggle: this.privacyPanelIsOpened,
- name: "privacy",
- showOverOthers: true,
- },
- {
- toggle: this.copyrightPanelIsOpened,
- name: "copyright",
- showOverOthers: true,
- },
- {
- toggle: this.communityIndexPanelIsOpened,
- name: "community",
- showOverOthers: true,
- },
- {
- toggle: this.filtersPanelIsOpened,
- name: "filters",
- showOverOthers: true,
- },
- {
- toggle: this.menuIsOpened,
- name: "menu",
- submenu: this.menuViewTab,
- },
- {
- toggle: this.themeIsOpened,
- name: "theme-menu",
- submenu: this.themeViewTab,
- },
- {
- toggle: this.backgroundLayerSelectionIsOpened,
- name: "background",
- showOverOthers: true,
- },
- ]
- for (const toggle of this.allToggles) {
- toggle.toggle.addCallback((isOpen) => {
- if (!isOpen) {
- this.resetZoomIfAllClosed()
+ this.pageStates[pageName].addCallback(enabled => {
+ if (enabled) {
+ this.pageStates.menu.set(false)
}
})
}
+
+ const visitedBefore = LocalStorageSource.GetParsed(
+ themeid + "thememenuisopened", false,
+ )
+ if (!visitedBefore.data && shouldShowWelcomeMessage) {
+ this.pageStates.about_theme.set(true)
+ visitedBefore.set(true)
+ }
}
private resetZoomIfAllClosed() {
@@ -160,7 +66,7 @@ export class MenuState {
}
public openFilterView(highlightLayer?: LayerConfig | string) {
- this.filtersPanelIsOpened.setData(true)
+ this.pageStates.filter.setData(true)
if (highlightLayer) {
if (typeof highlightLayer !== "string") {
highlightLayer = highlightLayer.id
@@ -170,8 +76,6 @@ export class MenuState {
}
public openUsersettings(highlightTagRendering?: string) {
- this.menuIsOpened.setData(true)
- this.menuViewTab.setData("settings")
if (
highlightTagRendering !== undefined &&
!UserRelatedState.availableUserSettingsIds.some((tr) => tr === highlightTagRendering)
@@ -181,15 +85,15 @@ export class MenuState {
Utils.sortedByLevenshteinDistance(
highlightTagRendering,
UserRelatedState.availableUserSettingsIds,
- (x) => x
- )
+ (x) => x,
+ ),
)
}
this.highlightedUserSetting.setData(highlightTagRendering)
}
public isSomethingOpen(): boolean {
- return this.allToggles.some((t) => t.toggle.data)
+ return Object.values(this.pageStates).some((t) => t.data)
}
/**
@@ -197,14 +101,19 @@ export class MenuState {
* Returns 'true' if at least one menu was opened
*/
public closeAll(): boolean {
- let somethingWasOpen = false
- for (const t of this.allToggles) {
- somethingWasOpen = t.toggle.data
- t.toggle.setData(false)
- if (somethingWasOpen) {
- break
+ const ps = this.pageStates
+ for (const key in ps) {
+ const toggle = ps[key]
+ const wasOpen = toggle.data
+ toggle.setData(false)
+ if (wasOpen) {
+ return true
}
}
- return somethingWasOpen
+ if (ps.menu.data) {
+ ps.menu.set(false)
+ return true
+ }
}
+
}
diff --git a/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts b/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts
index d477e1c95f..feb5578ada 100644
--- a/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts
+++ b/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts
@@ -203,6 +203,7 @@ export default class CreateNoteImportLayer extends Conversion {
}
}
+ if(json.allowMove === undefined && json.source["geoJson"] === undefined){
+ if (!Constants.priviliged_layers.find((x) => x == json.id)) {
+ context.err(
+ "Layer " +
+ json.id +
+ " does not have an explicit 'allowMove'"
+ )
+ }
+ }
+
if (context.hasErrors()) {
return undefined
}
diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts
index 589c55842f..4c81f2931f 100644
--- a/src/Models/ThemeViewState.ts
+++ b/src/Models/ThemeViewState.ts
@@ -5,7 +5,7 @@ import { Store, UIEventSource } from "../Logic/UIEventSource"
import {
FeatureSource,
IndexedFeatureSource,
- WritableFeatureSource,
+ WritableFeatureSource
} from "../Logic/FeatureSource/FeatureSource"
import { OsmConnection } from "../Logic/Osm/OsmConnection"
import { ExportableMap, MapProperties } from "./MapProperties"
@@ -51,7 +51,7 @@ import SaveFeatureSourceToLocalStorage from "../Logic/FeatureSource/Actors/SaveF
import BBoxFeatureSource from "../Logic/FeatureSource/Sources/TouchesBboxFeatureSource"
import ThemeViewStateHashActor from "../Logic/Web/ThemeViewStateHashActor"
import NoElementsInViewDetector, {
- FeatureViewState,
+ FeatureViewState
} from "../Logic/Actors/NoElementsInViewDetector"
import FilteredLayer from "./FilteredLayer"
import { PreferredRasterLayerSelector } from "../Logic/Actors/PreferredRasterLayerSelector"
@@ -64,7 +64,7 @@ import { GeolocationControlState } from "../UI/BigComponents/GeolocationControl"
import Zoomcontrol from "../UI/Zoomcontrol"
import {
SummaryTileSource,
- SummaryTileSourceRewriter,
+ SummaryTileSourceRewriter
} from "../Logic/FeatureSource/TiledFeatureSource/SummaryTileSource"
import summaryLayer from "../assets/generated/layers/summary.json"
import last_click_layerconfig from "../assets/generated/layers/last_click.json"
@@ -178,7 +178,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
"oauth_token",
undefined,
"Used to complete the login"
- ),
+ )
})
this.userRelatedState = new UserRelatedState(
this.osmConnection,
@@ -257,8 +257,8 @@ export default class ThemeViewState implements SpecialVisualizationState {
bbox.asGeoJson({
zoom: this.mapProperties.zoom.data,
...this.mapProperties.location.data,
- id: "current_view_" + currentViewIndex,
- }),
+ id: "current_view_" + currentViewIndex
+ })
]
})
)
@@ -275,10 +275,10 @@ export default class ThemeViewState implements SpecialVisualizationState {
featurePropertiesStore: this.featureProperties,
osmConnection: this.osmConnection,
historicalUserLocations: this.geolocation.historicalUserLocations,
- featureSwitches: this.featureSwitches,
+ featureSwitches: this.featureSwitches
},
layout?.isLeftRightSensitive() ?? false,
- (e, extraMsg) => this.reportError(e, extraMsg),
+ (e, extraMsg) => this.reportError(e, extraMsg)
)
this.historicalUserLocations = this.geolocation.historicalUserLocations
this.newFeatures = new NewGeometryFromChangesFeatureSource(
@@ -303,7 +303,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
"leftover features, such as",
features[0].properties
)
- },
+ }
}
)
this.perLayer = perLayer.perLayer
@@ -359,7 +359,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
{
currentZoom: this.mapProperties.zoom,
layerState: this.layerState,
- bounds: this.visualFeedbackViewportBounds,
+ bounds: this.visualFeedbackViewportBounds
}
)
this.hasDataInView = new NoElementsInViewDetector(this).hasFeatureInView
@@ -391,7 +391,6 @@ export default class ThemeViewState implements SpecialVisualizationState {
public focusOnMap() {
if (this.map.data) {
this.map.data.getCanvas().focus()
- console.log("Focused on map")
return
}
this.map.addCallbackAndRunD((map) => {
@@ -454,7 +453,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
doShowLayer,
metaTags: this.userRelatedState.preferencesAsTags,
selectedElement: this.selectedElement,
- fetchStore: (id) => this.featureProperties.getStore(id),
+ fetchStore: (id) => this.featureProperties.getStore(id)
})
})
return filteringFeatureSource
@@ -481,7 +480,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
doShowLayer: flayerGps.isDisplayed,
layer: flayerGps.layerDef,
metaTags: this.userRelatedState.preferencesAsTags,
- selectedElement: this.selectedElement,
+ selectedElement: this.selectedElement
})
}
@@ -527,8 +526,6 @@ export default class ThemeViewState implements SpecialVisualizationState {
/**
* Selects the feature that is 'i' closest to the map center
- * @param i
- * @private
*/
private selectClosestAtCenter(i: number = 0) {
if (this.userRelatedState.a11y.data !== "never") {
@@ -557,23 +554,22 @@ export default class ThemeViewState implements SpecialVisualizationState {
this.previewedImage.setData(undefined)
return
}
- this.selectedElement.setData(undefined)
- this.guistate.closeAll()
- if (!this.guistate.isSomethingOpen()) {
- Zoomcontrol.resetzoom()
- this.focusOnMap()
+ if(this.guistate.closeAll()){
+ return
}
+ this.selectedElement.setData(undefined)
+ Zoomcontrol.resetzoom()
+ this.focusOnMap()
})
Hotkeys.RegisterHotkey({ nomod: "f" }, docs.selectFavourites, () => {
- this.guistate.menuViewTab.setData("favourites")
- this.guistate.menuIsOpened.setData(true)
+ this.guistate.pageStates.favourites.set(true)
})
Hotkeys.RegisterHotkey(
{
nomod: " ",
- onUp: true,
+ onUp: true
},
docs.selectItem,
() => {
@@ -581,8 +577,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
return false
}
if (
- this.guistate.menuIsOpened.data ||
- this.guistate.themeIsOpened.data ||
+ this.guistate.isSomethingOpen() ||
this.previewedImage.data !== undefined
) {
return
@@ -603,7 +598,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
Hotkeys.RegisterHotkey(
{
nomod: "" + i,
- onUp: true,
+ onUp: true
},
doc,
() => this.selectClosestAtCenter(i - 1)
@@ -616,22 +611,21 @@ export default class ThemeViewState implements SpecialVisualizationState {
}
Hotkeys.RegisterHotkey(
{
- nomod: "b",
+ nomod: "b"
},
docs.openLayersPanel,
() => {
if (this.featureSwitches.featureSwitchBackgroundSelection.data) {
- this.guistate.backgroundLayerSelectionIsOpened.setData(true)
+ this.guistate.pageStates.background.setData(true)
}
}
)
Hotkeys.RegisterHotkey(
{
- nomod: "s",
+ nomod: "s"
},
Translations.t.hotkeyDocumentation.openFilterPanel,
() => {
- console.log("S pressed")
if (this.featureSwitches.featureSwitchFilter.data) {
this.guistate.openFilterView()
}
@@ -650,7 +644,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
available,
category,
current.data,
- skipLayers,
+ skipLayers
)
if (!best) {
return
@@ -706,7 +700,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
Hotkeys.RegisterHotkey(
{
- shift: "T",
+ shift: "T"
},
Translations.t.hotkeyDocumentation.translationMode,
() => {
@@ -743,7 +737,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
this.mapProperties.zoom.map((z) => Math.max(Math.floor(z), 0)),
this.mapProperties,
{
- isActive: this.mapProperties.zoom.map((z) => z < maxzoom),
+ isActive: this.mapProperties.zoom.map((z) => z < maxzoom)
}
)
@@ -775,7 +769,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
current_view: this.currentView,
favourite: this.favourites,
summary: this.featureSummary,
- last_click: this.lastClickObject,
+ last_click: this.lastClickObject
}
this.closestFeatures.registerSource(specialLayers.favourite, "favourite")
@@ -830,7 +824,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
doShowLayer: flayer.isDisplayed,
layer: flayer.layerDef,
metaTags: this.userRelatedState.preferencesAsTags,
- selectedElement: this.selectedElement,
+ selectedElement: this.selectedElement
})
})
const summaryLayerConfig = new LayerConfig(summaryLayer, "summaryLayer")
@@ -838,7 +832,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
features: specialLayers.summary,
layer: summaryLayerConfig,
// doShowLayer: this.mapProperties.zoom.map((z) => z < maxzoom),
- selectedElement: this.selectedElement,
+ selectedElement: this.selectedElement
})
const lastClickLayerConfig = new LayerConfig(
@@ -849,28 +843,27 @@ export default class ThemeViewState implements SpecialVisualizationState {
lastClickLayerConfig.isShown === undefined
? specialLayers.last_click
: specialLayers.last_click.features.mapD((fs) =>
- fs.filter((f) => {
- const matches = lastClickLayerConfig.isShown.matchesProperties(
- f.properties
- )
- console.debug("LastClick ", f, "matches", matches)
- return matches
- })
- )
+ fs.filter((f) => {
+ const matches = lastClickLayerConfig.isShown.matchesProperties(
+ f.properties
+ )
+ console.debug("LastClick ", f, "matches", matches)
+ return matches
+ })
+ )
new ShowDataLayer(this.map, {
features: new StaticFeatureSource(lastClickFiltered),
layer: lastClickLayerConfig,
onClick: (feature) => {
- console.log("Last click was clicked", feature)
if (this.mapProperties.zoom.data >= Constants.minZoomLevelToAddNewPoint) {
this.selectedElement.setData(feature)
return
}
this.map.data.flyTo({
zoom: Constants.minZoomLevelToAddNewPoint,
- center: GeoOperations.centerpointCoordinates(feature),
+ center: GeoOperations.centerpointCoordinates(feature)
})
- },
+ }
})
}
@@ -885,10 +878,12 @@ export default class ThemeViewState implements SpecialVisualizationState {
this.lastClickObject.clear()
}
})
- this.guistate.allToggles.forEach((toggle) => {
- toggle.toggle.addCallbackD((isOpened) => {
+ Object.values(this.guistate.pageStates).forEach((toggle) => {
+ toggle.addCallbackD((isOpened) => {
if (!isOpened) {
- this.focusOnMap()
+ if (!this.guistate.isSomethingOpen()) {
+ this.focusOnMap()
+ }
}
})
})
@@ -955,8 +950,8 @@ export default class ThemeViewState implements SpecialVisualizationState {
userid: this.osmConnection.userDetails.data?.uid,
pendingChanges: this.changes.pendingChanges.data,
previousChanges: this.changes.allChanges.data,
- changeRewrites: Utils.MapToObj(this.changes._changesetHandler._remappings),
- }),
+ changeRewrites: Utils.MapToObj(this.changes._changesetHandler._remappings)
+ })
})
} catch (e) {
console.error("Could not upload an error report")
diff --git a/src/UI/AllThemesGui.svelte b/src/UI/AllThemesGui.svelte
index fc2977eb7a..3d94571bc7 100644
--- a/src/UI/AllThemesGui.svelte
+++ b/src/UI/AllThemesGui.svelte
@@ -27,6 +27,7 @@
import Github from "../assets/svg/Github.svelte"
import { Utils } from "../Utils"
import { ArrowTrendingUp } from "@babeard/svelte-heroicons/solid/ArrowTrendingUp"
+ import Searchbar from "./Base/Searchbar.svelte"
const featureSwitches = new OsmConnectionFeatureSwitches()
const osmConnection = new OsmConnection({
@@ -42,7 +43,7 @@
const tr = Translations.t.general.morescreen
let userLanguages = osmConnection.userDetails.map((ud) => ud.languages)
- let themeSearchText: UIEventSource = new UIEventSource(undefined)
+ let themeSearchText: UIEventSource = new UIEventSource("")
document.addEventListener("keydown", function (event) {
if (event.ctrlKey && event.code === "KeyF") {
@@ -101,24 +102,7 @@
-
+ MoreScreen.applySearch(themeSearchText.data)}/>
diff --git a/src/UI/Base/CloseAnimation.svelte b/src/UI/Base/CloseAnimation.svelte
deleted file mode 100644
index 64a7f03665..0000000000
--- a/src/UI/Base/CloseAnimation.svelte
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/UI/Base/DrawerLeft.svelte b/src/UI/Base/DrawerLeft.svelte
new file mode 100644
index 0000000000..d12ba07ba8
--- /dev/null
+++ b/src/UI/Base/DrawerLeft.svelte
@@ -0,0 +1,30 @@
+
+
+
+
+
+ CONTENTS
+
+
+
diff --git a/src/UI/Base/DynLink.svelte b/src/UI/Base/DynLink.svelte
index 9337a5ff6b..91deac7e99 100644
--- a/src/UI/Base/DynLink.svelte
+++ b/src/UI/Base/DynLink.svelte
@@ -1,6 +1,7 @@
{}}
>
@@ -37,22 +38,21 @@
- dispatch("close")}
- use:ariaLabel={Translations.t.general.backToMap}
- >
-
+
+
+ dispatch("close")}
+ />
+
diff --git a/src/UI/Base/Link.svelte b/src/UI/Base/Link.svelte
index f7bae099fb..6456c53612 100644
--- a/src/UI/Base/Link.svelte
+++ b/src/UI/Base/Link.svelte
@@ -1,6 +1,10 @@
import { OsmConnection } from "../../Logic/Osm/OsmConnection"
- import Logout from "../../assets/svg/Logout.svelte"
import Translations from "../i18n/Translations"
import Tr from "./Tr.svelte"
import ArrowRightOnRectangle from "@babeard/svelte-heroicons/solid/ArrowRightOnRectangle"
export let osmConnection: OsmConnection
+ export let clss = ""
{
osmConnection.LogOut()
}}
>
-
+
diff --git a/src/UI/Base/MapControlButton.svelte b/src/UI/Base/MapControlButton.svelte
index e9349c34a0..7fd1434541 100644
--- a/src/UI/Base/MapControlButton.svelte
+++ b/src/UI/Base/MapControlButton.svelte
@@ -14,15 +14,10 @@
export let arialabel: Translation = undefined
export let arialabelDynamic: Store = new ImmutableStore(arialabel)
let arialabelString = arialabelDynamic.bind((tr) => tr?.current)
- export let htmlElem: UIEventSource = undefined
- let _htmlElem: HTMLElement
- $: {
- htmlElem?.setData(_htmlElem)
- }
+
dispatch("click", e)}
on:keydown
use:ariaLabelStore={arialabelString}
diff --git a/src/UI/Base/OpenJosm.svelte b/src/UI/Base/OpenJosm.svelte
index c576fd9198..e3bbb60886 100644
--- a/src/UI/Base/OpenJosm.svelte
+++ b/src/UI/Base/OpenJosm.svelte
@@ -35,8 +35,8 @@
{#if $showButton}
-
-
+
diff --git a/src/UI/Base/Page.svelte b/src/UI/Base/Page.svelte
new file mode 100644
index 0000000000..9a12e3c38a
--- /dev/null
+++ b/src/UI/Base/Page.svelte
@@ -0,0 +1,59 @@
+
+
+{#if !onlyLink}
+ shown.set(false)} outsideclose
+ size="xl"
+ {defaultClass} {bodyClass} {dialogClass} {headerClass}
+ color="none">
+
+
+ {#if $$slots.footer}
+
+ {/if}
+
+{:else}
+
+{/if}
+
+
diff --git a/src/UI/Base/Searchbar.svelte b/src/UI/Base/Searchbar.svelte
new file mode 100644
index 0000000000..4cbb351024
--- /dev/null
+++ b/src/UI/Base/Searchbar.svelte
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/src/UI/Base/TitledPanel.svelte b/src/UI/Base/TitledPanel.svelte
index b7ddbcb11a..6e68e500ea 100644
--- a/src/UI/Base/TitledPanel.svelte
+++ b/src/UI/Base/TitledPanel.svelte
@@ -6,4 +6,7 @@
+
+
+
diff --git a/src/UI/BigComponents/AboutMapComplete.svelte b/src/UI/BigComponents/AboutMapComplete.svelte
deleted file mode 100644
index 14dd1a7d30..0000000000
--- a/src/UI/BigComponents/AboutMapComplete.svelte
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
diff --git a/src/UI/BigComponents/CopyrightAllIcons.svelte b/src/UI/BigComponents/CopyrightAllIcons.svelte
new file mode 100644
index 0000000000..f1423db48f
--- /dev/null
+++ b/src/UI/BigComponents/CopyrightAllIcons.svelte
@@ -0,0 +1,22 @@
+
+
+{#each iconAttributions as iconAttribution}
+
+{/each}
diff --git a/src/UI/BigComponents/CopyrightPanel.svelte b/src/UI/BigComponents/CopyrightPanel.svelte
index c370f67144..3fec0de6b3 100644
--- a/src/UI/BigComponents/CopyrightPanel.svelte
+++ b/src/UI/BigComponents/CopyrightPanel.svelte
@@ -4,11 +4,7 @@
import contributors from "../../assets/contributors.json"
import translators from "../../assets/translators.json"
import { Translation, TypedTranslation } from "../i18n/Translation"
- import AccordionSingle from "../Flowbite/AccordionSingle.svelte"
import Tr from "../Base/Tr.svelte"
- import IconCopyrightPanel from "./IconCopyrightPanel.svelte"
- import licenses from "../../assets/generated/license_info.json"
- import type SmallLicense from "../../Models/smallLicense"
import Constants from "../../Models/Constants"
import ContributorCount from "../../Logic/ContributorCount"
import BaseUIElement from "../BaseUIElement"
@@ -24,7 +20,6 @@
const t = Translations.t.general.attribution
const layoutToUse = state.layout
- const iconAttributions: string[] = layoutToUse.getUsedImages()
let maintainer: Translation = undefined
if (layoutToUse.credits !== undefined && layoutToUse.credits !== "") {
@@ -53,11 +48,7 @@
return Translations.t.general.attribution.attributionBackgroundLayer.Subs(props)
})
- const allLicenses = {}
- for (const key in licenses) {
- const license: SmallLicense = licenses[key]
- allLicenses[license.path] = license
- }
+
function calculateDataContributions(contributions: Map): Translation {
if (contributions === undefined) {
@@ -121,9 +112,6 @@
-
-
-
@@ -159,14 +147,6 @@
-
-
-
-
- {#each iconAttributions as iconAttribution}
-
- {/each}
-
MapComplete {Constants.vNumber}
diff --git a/src/UI/BigComponents/IconCopyrightPanel.svelte b/src/UI/BigComponents/CopyrightSingleIcon.svelte
similarity index 100%
rename from src/UI/BigComponents/IconCopyrightPanel.svelte
rename to src/UI/BigComponents/CopyrightSingleIcon.svelte
diff --git a/src/UI/BigComponents/FilterPanel.svelte b/src/UI/BigComponents/FilterPage.svelte
similarity index 86%
rename from src/UI/BigComponents/FilterPanel.svelte
rename to src/UI/BigComponents/FilterPage.svelte
index e997a43ba8..3c168df3fa 100644
--- a/src/UI/BigComponents/FilterPanel.svelte
+++ b/src/UI/BigComponents/FilterPage.svelte
@@ -9,9 +9,11 @@
import Translations from "../i18n/Translations"
import Tr from "../Base/Tr.svelte"
import Filter from "../../assets/svg/Filter.svelte"
- import TitledPanel from "../Base/TitledPanel.svelte"
+ import Page from "../Base/Page.svelte"
export let state: ThemeViewState
+ export let onlyLink: boolean
+
let layout = state.layout
let allEnabled: boolean
@@ -47,8 +49,12 @@
}
-
-
+
+
+
+
+
+
@@ -80,4 +86,4 @@
zoomlevel={state.mapProperties.zoom}
/>
{/each}
-
+
diff --git a/src/UI/BigComponents/Geosearch.svelte b/src/UI/BigComponents/Geosearch.svelte
index 87369e37a6..55b9fbe31c 100644
--- a/src/UI/BigComponents/Geosearch.svelte
+++ b/src/UI/BigComponents/Geosearch.svelte
@@ -107,13 +107,14 @@
-
-
+
diff --git a/src/UI/BigComponents/HotkeyTable.svelte b/src/UI/BigComponents/HotkeyTable.svelte
index 63ca146a30..e31fa98e3d 100644
--- a/src/UI/BigComponents/HotkeyTable.svelte
+++ b/src/UI/BigComponents/HotkeyTable.svelte
@@ -15,10 +15,6 @@
}
-
-
-
-
@@ -47,4 +43,3 @@
{/each}
-
diff --git a/src/UI/BigComponents/MenuDrawer.svelte b/src/UI/BigComponents/MenuDrawer.svelte
new file mode 100644
index 0000000000..a65c7f69e4
--- /dev/null
+++ b/src/UI/BigComponents/MenuDrawer.svelte
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+
+ {pg.menu.set(false)}} />
+
+ {#if $showHome}
+
+
+ {#if Utils.isIframe}
+
+ {:else}
+
+ {/if}
+
+ {/if}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/UI/BigComponents/OpenBackgroundSelectorButton.svelte b/src/UI/BigComponents/OpenBackgroundSelectorButton.svelte
index d399d68b24..a19dc3568b 100644
--- a/src/UI/BigComponents/OpenBackgroundSelectorButton.svelte
+++ b/src/UI/BigComponents/OpenBackgroundSelectorButton.svelte
@@ -20,7 +20,7 @@
state.guistate.backgroundLayerSelectionIsOpened.setData(true)}
+ on:click={() => state.guistate.pageStates.background.setData(true)}
{htmlElem}
>
diff --git a/src/UI/BigComponents/SelectedElementTitle.svelte b/src/UI/BigComponents/SelectedElementTitle.svelte
index ce1bd59a1f..97fb3aaa26 100644
--- a/src/UI/BigComponents/SelectedElementTitle.svelte
+++ b/src/UI/BigComponents/SelectedElementTitle.svelte
@@ -8,6 +8,7 @@
import Tr from "../Base/Tr.svelte"
import { XCircleIcon } from "@rgossiaux/svelte-heroicons/solid"
import { ariaLabel } from "../../Utils/ariaLabel"
+ import { CloseButton } from "flowbite-svelte"
export let state: SpecialVisualizationState
export let layer: LayerConfig
@@ -72,14 +73,10 @@
{/if}
- state.selectedElement.setData(undefined)}
- style="border: 0 !important; padding: 0 !important;"
- use:ariaLabel={Translations.t.general.backToMap}
- >
-
-
+
+ state.selectedElement.setData(undefined)}/>
+
+
diff --git a/src/UI/BigComponents/ShareScreen.svelte b/src/UI/BigComponents/ShareScreen.svelte
index cd17c4a8c8..e848b4150e 100644
--- a/src/UI/BigComponents/ShareScreen.svelte
+++ b/src/UI/BigComponents/ShareScreen.svelte
@@ -35,6 +35,8 @@
let enableBackground = true
let enableGeolocation = true
+ let location = state.mapProperties.location
+
function calculateLinkToShare(
showWelcomeMessage: boolean,
enableLogin: boolean,
@@ -116,10 +118,12 @@
)
-
+
+
+
Open the current location in other applications
+
-
diff --git a/src/UI/BigComponents/ThemeIntroPanel.svelte b/src/UI/BigComponents/ThemeIntroPanel.svelte
index 06404839f5..059e672a3c 100644
--- a/src/UI/BigComponents/ThemeIntroPanel.svelte
+++ b/src/UI/BigComponents/ThemeIntroPanel.svelte
@@ -12,8 +12,6 @@
import { GeoLocationState } from "../../Logic/State/GeoLocationState"
import If from "../Base/If.svelte"
import { ExclamationTriangleIcon } from "@babeard/svelte-heroicons/mini"
- import Location_refused from "../../assets/svg/Location_refused.svelte"
- import Location from "../../assets/svg/Location.svelte"
import ChevronDoubleLeft from "@babeard/svelte-heroicons/solid/ChevronDoubleLeft"
import GeolocationIndicator from "./GeolocationIndicator.svelte"
@@ -38,7 +36,7 @@
const glstate = state.geolocation.geolocationState
if (glstate.currentGPSLocation.data !== undefined) {
const c: GeolocationCoordinates = glstate.currentGPSLocation.data
- state.guistate.themeIsOpened.setData(false)
+ state.guistate.pageStates.about_theme.setData(false)
const coor = { lon: c.longitude, lat: c.latitude }
state.mapProperties.location.setData(coor)
}
@@ -65,7 +63,7 @@
-
state.guistate.themeIsOpened.setData(false)}>
+ state.guistate.pageStates.about_theme.setData(false)}>
@@ -96,7 +94,7 @@
state.guistate.themeIsOpened.setData(false)}
+ on:searchCompleted={() => state.guistate.pageStates.about_theme.setData(false)}
on:searchIsValid={(event) => {
searchEnabled = event.detail
}}
@@ -138,20 +136,10 @@
{/if}
- {#if Utils.isIframe}
-
- {:else}
-
-
-
- {/if}
+
+
diff --git a/src/UI/Comparison/ComparisonTool.svelte b/src/UI/Comparison/ComparisonTool.svelte
index 0a9a33d4c3..4d3edc91c6 100644
--- a/src/UI/Comparison/ComparisonTool.svelte
+++ b/src/UI/Comparison/ComparisonTool.svelte
@@ -15,6 +15,7 @@
import AccordionSingle from "../Flowbite/AccordionSingle.svelte"
import GlobeAlt from "@babeard/svelte-heroicons/mini/GlobeAlt"
import { ComparisonState } from "./ComparisonState"
+ import LoginToggle from "../Base/LoginToggle.svelte"
export let externalData: Store<
| { success: { content: Record
} }
@@ -45,35 +46,38 @@
let enableLogin = state.featureSwitches.featureSwitchEnableLogin
-{#if !$sourceUrl || !$enableLogin}
-
-{:else if $externalData === undefined}
-
-{:else if $externalData["error"] !== undefined}
-
-
-
-{:else if $propertyKeysExternal.length === 0 && $knownImages.size + $unknownImages.length === 0}
-
-{:else if !$hasDifferencesAtStart}
+
+
+ {#if !$sourceUrl || !$enableLogin}
+
+ {:else if $externalData === undefined}
+
+ {:else if $externalData["error"] !== undefined}
+
+
+
+ {:else if $propertyKeysExternal.length === 0 && $knownImages.size + $unknownImages.length === 0}
+
+ {:else if !$hasDifferencesAtStart}
-{:else if $comparisonState !== undefined}
-
+ {:else if $comparisonState !== undefined}
+
-
-
-{/if}
+
+
+ {/if}
+
diff --git a/src/UI/DownloadFlow/DownloadPanel.svelte b/src/UI/DownloadFlow/DownloadPanel.svelte
index c6e4dc3c9c..428eae6c7f 100644
--- a/src/UI/DownloadFlow/DownloadPanel.svelte
+++ b/src/UI/DownloadFlow/DownloadPanel.svelte
@@ -65,10 +65,6 @@
{:else}
-
-
-
-
let fallbackImage: string = undefined
@@ -16,25 +17,37 @@
let imgEl: HTMLImageElement
export let imgClass: string = undefined
export let previewedImage: UIEventSource = undefined
+ export let attributionFormat: "minimal" | "medium" | "large" = "medium"
+ let canZoom = previewedImage !== undefined // We check if there is a SOURCE, not if there is data in it!
+ let loaded = false
-
{
+
+
loaded = true}
+ class={imgClass ?? ""}
+ class:cursor-zoom-in={previewedImage !== undefined}
+ on:click={() => {
previewedImage?.setData(image)
}}
- on:error={() => {
+ on:error={() => {
if (fallbackImage) {
imgEl.src = fallbackImage
}
}}
- src={image.url}
- />
+ src={image.url}
+ />
+ {#if canZoom && loaded}
+
previewedImage.set(image)}>
+
+
+ {/if}
+
+
-
+
diff --git a/src/UI/Image/ImageAttribution.svelte b/src/UI/Image/ImageAttribution.svelte
index b62ce1baf5..cd7c9847a3 100644
--- a/src/UI/Image/ImageAttribution.svelte
+++ b/src/UI/Image/ImageAttribution.svelte
@@ -4,11 +4,15 @@
import { Store, UIEventSource } from "../../Logic/UIEventSource"
import ToSvelte from "../Base/ToSvelte.svelte"
import { EyeIcon } from "@rgossiaux/svelte-heroicons/solid"
+ import Tr from "../Base/Tr.svelte"
+ import Translations from "../i18n/Translations"
/**
* A small element showing the attribution of a single image
*/
export let image: Partial & { id: string; url: string }
+ export let attributionFormat: "minimal" | "medium" | "large" = "medium"
+
let license: Store = UIEventSource.FromPromise(
image.provider?.DownloadAttribution(image)
)
@@ -16,50 +20,59 @@
{#if $license !== undefined}
-
+
{#if icon !== undefined}
{/if}
-
- {#if $license.title}
- {#if $license.informationLocation}
-
- {$license.title}
-
- {:else}
- $license.title
+
+ {#if attributionFormat !== "minimal" }
+ {#if $license.title}
+ {#if $license.informationLocation}
+
+ {$license.title}
+
+ {:else}
+ $license.title
+ {/if}
{/if}
{/if}
{#if $license.artist}
-
- {@html $license.artist}
-
+ {#if attributionFormat === "large"}
+
+ {:else}
+
+ {@html $license.artist}
+
+ {/if}
{/if}
-
- {#if $license.license !== undefined || $license.licenseShortName !== undefined}
-
- {$license?.license ?? $license?.licenseShortName}
-
- {/if}
-
- {#if $license.views}
-
-
- {$license.views}
-
- {/if}
-
-
{#if $license.date}
{$license.date.toLocaleDateString()}
{/if}
+
+ {#if attributionFormat !== "minimal"}
+
+ {#if ($license.license !== undefined || $license.licenseShortName !== undefined)}
+
+ {$license?.license ?? $license?.licenseShortName}
+
+ {/if}
+
+ {#if $license.views}
+
+
+ {$license.views}
+
+ {/if}
+
+ {/if}
+
{/if}
diff --git a/src/UI/Image/ImageOperations.svelte b/src/UI/Image/ImageOperations.svelte
index 0152e9cf57..592ee75971 100644
--- a/src/UI/Image/ImageOperations.svelte
+++ b/src/UI/Image/ImageOperations.svelte
@@ -11,6 +11,8 @@
import { twMerge } from "tailwind-merge"
import { UIEventSource } from "../../Logic/UIEventSource"
import Loading from "../Base/Loading.svelte"
+ import Tr from "../Base/Tr.svelte"
+ import Translations from "../i18n/Translations"
export let image: ProvidedImage
export let clss: string = undefined
@@ -38,9 +40,9 @@
class="pointer-events-none absolute bottom-0 left-0 flex w-full flex-wrap items-end justify-between"
>
-
+
download()}
>
- Download
+
diff --git a/src/UI/Image/LinkableImage.svelte b/src/UI/Image/LinkableImage.svelte
index d1abd41d35..da3cbfbf6c 100644
--- a/src/UI/Image/LinkableImage.svelte
+++ b/src/UI/Image/LinkableImage.svelte
@@ -14,6 +14,8 @@
import AttributedImage from "./AttributedImage.svelte"
import SpecialTranslation from "../Popup/TagRendering/SpecialTranslation.svelte"
import LoginToggle from "../Base/LoginToggle.svelte"
+ import ImagePreview from "./ImagePreview.svelte"
+ import FloatOver from "../Base/FloatOver.svelte"
export let tags: UIEventSource
export let state: SpecialVisualizationState
@@ -31,7 +33,7 @@
key: undefined,
provider: AllImageProviders.byName(image.provider),
date: new Date(image.date),
- id: Object.values(image.osmTags)[0],
+ id: Object.values(image.osmTags)[0]
}
async function applyLink(isLinked: boolean) {
@@ -42,7 +44,7 @@
if (isLinked) {
const action = new LinkImageAction(currentTags.id, key, url, tags, {
theme: tags.data._orig_theme ?? state.layout.id,
- changeType: "link-image",
+ changeType: "link-image"
})
await state.changes.applyAction(action)
} else {
@@ -51,24 +53,26 @@
if (v === url) {
const action = new ChangeTagAction(currentTags.id, new Tag(k, ""), currentTags, {
theme: tags.data._orig_theme ?? state.layout.id,
- changeType: "remove-image",
+ changeType: "remove-image"
})
state.changes.applyAction(action)
}
}
}
}
+
isLinked.addCallback((isLinked) => applyLink(isLinked))
+
-
-
state.previewedImage.setData(providedImage)}>
-
-
+
+
{#if linkable}
diff --git a/src/UI/Image/NearbyImages.svelte b/src/UI/Image/NearbyImages.svelte
index 753d6c8d9d..665490c2b3 100644
--- a/src/UI/Image/NearbyImages.svelte
+++ b/src/UI/Image/NearbyImages.svelte
@@ -60,7 +60,7 @@
{/if}
{:else}
-
+
{#each $result as image (image.pictureUrl)}
diff --git a/src/UI/Map/MapLibreAdaptor.ts b/src/UI/Map/MapLibreAdaptor.ts
index dd2d48485c..f52cefaa81 100644
--- a/src/UI/Map/MapLibreAdaptor.ts
+++ b/src/UI/Map/MapLibreAdaptor.ts
@@ -61,7 +61,6 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap {
if (!MapLibreAdaptor.pmtilesInited) {
maplibregl.addProtocol("pmtiles", new Protocol().tile)
MapLibreAdaptor.pmtilesInited = true
- console.log("PM-tiles protocol added" + "")
}
this._maplibreMap = maplibreMap
diff --git a/src/UI/Map/RasterLayerOverview.svelte b/src/UI/Map/RasterLayerOverview.svelte
index 86c6e007bc..6a0ccc94b4 100644
--- a/src/UI/Map/RasterLayerOverview.svelte
+++ b/src/UI/Map/RasterLayerOverview.svelte
@@ -4,32 +4,30 @@
*/
import { Store, UIEventSource } from "../../Logic/UIEventSource"
import type { RasterLayerPolygon } from "../../Models/RasterLayers"
- import type { MapProperties } from "../../Models/MapProperties"
- import { Map as MlMap } from "maplibre-gl"
import RasterLayerPicker from "./RasterLayerPicker.svelte"
import type { EliCategory } from "../../Models/RasterLayerProperties"
- import UserRelatedState from "../../Logic/State/UserRelatedState"
import Translations from "../i18n/Translations"
import Tr from "../Base/Tr.svelte"
- import TitledPanel from "../Base/TitledPanel.svelte"
import Loading from "../Base/Loading.svelte"
+ import Page from "../Base/Page.svelte"
+ import ThemeViewState from "../../Models/ThemeViewState"
+ import { Square3Stack3dIcon } from "@babeard/svelte-heroicons/solid"
- export let availableLayers: { store: Store }
- export let mapproperties: MapProperties
- export let userstate: UserRelatedState
- export let map: Store
+ export let state: ThemeViewState
+
+ let map = state.map
+ let mapproperties = state.mapProperties
+ let userstate = state.userRelatedState
+ let shown = state.guistate.pageStates.background
+ let availableLayers: { store: Store } = state.availableLayers
let _availableLayers = availableLayers.store
- /**
- * Used to toggle the background layers on/off
- */
- export let visible: UIEventSource = undefined
type CategoryType = "photo" | "map" | "other" | "osmbasedmap"
const categories: Record = {
photo: ["photo", "historicphoto"],
map: ["map", "historicmap"],
other: ["other", "elevation"],
- osmbasedmap: ["osmbasedmap"],
+ osmbasedmap: ["osmbasedmap"]
}
function availableForCategory(type: CategoryType): Store {
@@ -45,27 +43,35 @@
const otherLayers = availableForCategory("other")
function onApply() {
- visible.setData(false)
+ shown.setData(false)
}
function getPref(type: CategoryType): undefined | UIEventSource {
return userstate?.osmConnection?.GetPreference("preferred-layer-" + type)
}
+
+ export let onlyLink: boolean
+
-
-
+
+
+
+
+
+
{#if $_availableLayers?.length < 1}
{:else}
-
+
+
{/if}
-
+
diff --git a/src/UI/Map/RasterLayerPicker.svelte b/src/UI/Map/RasterLayerPicker.svelte
index 2dd007fafb..1bc23e2cbb 100644
--- a/src/UI/Map/RasterLayerPicker.svelte
+++ b/src/UI/Map/RasterLayerPicker.svelte
@@ -13,7 +13,7 @@
export let mapproperties: MapProperties
export let map: Store
- export let visible: Store = undefined
+ export let shown: Store = undefined
let dispatch = createEventDispatcher<{ appliedLayer }>()
@@ -48,10 +48,10 @@
let rasterLayerOnMap = UIEventSource.feedFrom(rasterLayer)
- if (visible) {
+ if (shown) {
onDestroy(
- visible?.addCallbackAndRunD((visible) => {
- if (visible) {
+ shown?.addCallbackAndRunD((shown) => {
+ if (shown) {
rasterLayerOnMap.setData(rasterLayer.data ?? availableLayers[0])
} else {
rasterLayerOnMap.setData(undefined)
@@ -85,7 +85,7 @@
rasterLayer={rasterLayerOnMap}
placedOverMap={map}
placedOverMapProperties={mapproperties}
- {visible}
+ visible={shown}
/>
diff --git a/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte b/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte
index 90203e64c7..5d8cd6fcba 100644
--- a/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte
+++ b/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte
@@ -352,6 +352,7 @@
{/if}
+
{#if config.mappings?.length >= 8 || hideMappingsUnlessSearchedFor}
@@ -369,6 +370,7 @@
{/if}
{/if}
+
{#if config?.freeform?.key && !(config?.mappings?.filter((m) => m.hideInAnswer != true)?.length > 0)}
{:else if config.mappings !== undefined && !config.multiAnswer}
-
+
{#each config.mappings as mapping, i (mapping.then)}
{:else if config.mappings !== undefined && config.multiAnswer}
-
+
{#each config.mappings as mapping, i (mapping.then)}
onInputKeypress(e)}
@@ -456,6 +461,7 @@
onInputKeypress(e)}
@@ -475,6 +481,8 @@
{/if}
{/if}
+
+
state?.osmConnection?.AttemptLogin()}>
diff --git a/src/UI/SpecialVisualizations.ts b/src/UI/SpecialVisualizations.ts
index f3480f5217..dc4a894394 100644
--- a/src/UI/SpecialVisualizations.ts
+++ b/src/UI/SpecialVisualizations.ts
@@ -5,7 +5,7 @@ import Title from "./Base/Title"
import {
RenderingSpecification,
SpecialVisualization,
- SpecialVisualizationState,
+ SpecialVisualizationState
} from "./SpecialVisualization"
import { HistogramViz } from "./Popup/HistogramViz"
import MinimapViz from "./Popup/MinimapViz.svelte"
@@ -108,13 +108,13 @@ class NearbyImageVis implements SpecialVisualization {
{
name: "mode",
defaultValue: "closed",
- doc: "Either `open` or `closed`. If `open`, then the image carousel will always be shown",
+ doc: "Either `open` or `closed`. If `open`, then the image carousel will always be shown"
},
{
name: "readonly",
required: false,
- doc: "If 'readonly', will not show the 'link'-button",
- },
+ doc: "If 'readonly', will not show the 'link'-button"
+ }
]
docs =
"A component showing nearby images loaded from various online services such as Mapillary. In edit mode and when used on a feature, the user can select an image to add to the feature"
@@ -138,7 +138,7 @@ class NearbyImageVis implements SpecialVisualization {
lat,
feature,
layer,
- linkable: !readonly,
+ linkable: !readonly
})
}
}
@@ -152,13 +152,13 @@ class StealViz implements SpecialVisualization {
{
name: "featureId",
doc: "The key of the attribute which contains the id of the feature from which to use the tags",
- required: true,
+ required: true
},
{
name: "tagRenderingId",
doc: "The layer-id and tagRenderingId to render. Can be multiple value if ';'-separated (in which case every value must also contain the layerId, e.g. `layerId.tagRendering0; layerId.tagRendering1`). Note: this can cause layer injection",
- required: true,
- },
+ required: true
+ }
]
needsUrls = []
svelteBased = true
@@ -192,7 +192,7 @@ class StealViz implements SpecialVisualization {
tags: otherTags,
selectedElement: otherFeature,
state,
- layer,
+ layer
})
)
}
@@ -225,38 +225,36 @@ class CloseNoteViz implements SpecialVisualization {
{
name: "text",
doc: "Text to show on this button",
- required: true,
+ required: true
},
{
name: "icon",
doc: "Icon to show",
- defaultValue: "checkmark.svg",
+ defaultValue: "checkmark.svg"
},
{
name: "idkey",
doc: "The property name where the ID of the note to close can be found",
- defaultValue: "id",
+ defaultValue: "id"
},
{
name: "comment",
- doc: "Text to add onto the note when closing",
+ doc: "Text to add onto the note when closing"
},
{
name: "minZoom",
- doc: "If set, only show the closenote button if zoomed in enough",
+ doc: "If set, only show the closenote button if zoomed in enough"
},
{
name: "zoomButton",
- doc: "Text to show if not zoomed in enough",
- },
+ doc: "Text to show if not zoomed in enough"
+ }
]
public constr(
state: SpecialVisualizationState,
tags: UIEventSource>,
- args: string[],
- feature: Feature,
- layer: LayerConfig
+ args: string[]
): SvelteUIElement {
const { text, icon, idkey, comment, minZoom, zoomButton } = Utils.ParseVisArgs(
this.args,
@@ -271,7 +269,7 @@ class CloseNoteViz implements SpecialVisualization {
message: comment,
text: Translations.T(text),
minzoom: minZoom,
- zoomMoreMessage: zoomButton,
+ zoomMoreMessage: zoomButton
})
}
}
@@ -287,12 +285,12 @@ export class QuestionViz implements SpecialVisualization {
args = [
{
name: "labels",
- doc: "One or more ';'-separated labels. If these are given, only questions with these labels will be given. Use `unlabeled` for all questions that don't have an explicit label. If none given, all questions will be shown",
+ doc: "One or more ';'-separated labels. If these are given, only questions with these labels will be given. Use `unlabeled` for all questions that don't have an explicit label. If none given, all questions will be shown"
},
{
name: "blacklisted-labels",
- doc: "One or more ';'-separated labels of questions which should _not_ be included",
- },
+ doc: "One or more ';'-separated labels of questions which should _not_ be included"
+ }
]
svelteBased = true
@@ -317,7 +315,7 @@ export class QuestionViz implements SpecialVisualization {
selectedElement: feature,
state,
onlyForLabels: labels,
- notForLabels: blacklist,
+ notForLabels: blacklist
}).SetClass("w-full")
}
}
@@ -353,18 +351,18 @@ export default class SpecialVisualizations {
viz.docs,
viz.args.length > 0
? MarkdownUtils.table(
- ["name", "default", "description"],
- viz.args.map((arg) => {
- let defaultArg = arg.defaultValue ?? "_undefined_"
- if (defaultArg == "") {
- defaultArg = "_empty string_"
- }
- return [arg.name, defaultArg, arg.doc]
- })
- )
+ ["name", "default", "description"],
+ viz.args.map((arg) => {
+ let defaultArg = arg.defaultValue ?? "_undefined_"
+ if (defaultArg == "") {
+ defaultArg = "_empty string_"
+ }
+ return [arg.name, defaultArg, arg.doc]
+ })
+ )
: undefined,
"#### Example usage of " + viz.funcName,
- "" + example + "
",
+ "" + example + "
"
].join("\n\n")
}
@@ -400,24 +398,24 @@ export default class SpecialVisualizations {
argname: "some_arg",
message: {
en: "some other really long message",
- nl: "een boodschap in een andere taal",
+ nl: "een boodschap in een andere taal"
},
- other_arg_name: "more args",
+ other_arg_name: "more args"
},
before: {
en: "Some text to prefix before the special element (e.g. a title)",
- nl: "Een tekst om voor het element te zetten (bv. een titel)",
+ nl: "Een tekst om voor het element te zetten (bv. een titel)"
},
after: {
- en: "Some text to put after the element, e.g. a footer",
- },
- },
+ en: "Some text to put after the element, e.g. a footer"
+ }
+ }
},
null,
" "
)
).SetClass("code"),
- 'In other words: use `{ "before": ..., "after": ..., "special": {"type": ..., "argname": ...argvalue...}`. The args are in the `special` block; an argvalue can be a string, a translation or another value. (Refer to class `RewriteSpecial` in case of problems)',
+ "In other words: use `{ \"before\": ..., \"after\": ..., \"special\": {\"type\": ..., \"argname\": ...argvalue...}`. The args are in the `special` block; an argvalue can be a string, a translation or another value. (Refer to class `RewriteSpecial` in case of problems)"
])
.SetClass("flex flex-col")
.AsMarkdown()
@@ -437,9 +435,9 @@ export default class SpecialVisualizations {
const [lon, lat] = GeoOperations.centerpointCoordinates(feature)
return new SvelteUIElement(AddNewPoint, {
state,
- coordinate: { lon, lat },
+ coordinate: { lon, lat }
}).SetClass("w-full h-full overflow-auto")
- },
+ }
},
{
funcName: "language_picker",
@@ -456,11 +454,11 @@ export default class SpecialVisualizations {
availableLanguages: languages,
preferredLanguages: state.osmConnection.userDetails.map(
(ud) => ud.languages
- ),
+ )
})
})
)
- },
+ }
},
{
funcName: "logout",
@@ -470,7 +468,7 @@ export default class SpecialVisualizations {
constr(state: SpecialVisualizationState): BaseUIElement {
return new SvelteUIElement(LogoutButton, { osmConnection: state.osmConnection })
- },
+ }
},
new HistogramViz(),
new StealViz(),
@@ -482,13 +480,13 @@ export default class SpecialVisualizations {
{
doc: "The (maximum) zoomlevel: the target zoomlevel after fitting the entire feature. The minimap will fit the entire feature, then zoom out to this zoom level. The higher, the more zoomed in with 1 being the entire world and 19 being really close",
name: "zoomlevel",
- defaultValue: "18",
+ defaultValue: "18"
},
{
doc: "(Matches all resting arguments) This argument should be the key of a property of the feature. The corresponding value is interpreted as either the id or the a list of ID's. The features with these ID's will be shown on this minimap. (Note: if the key is 'id', list interpration is disabled)",
name: "idKey",
- defaultValue: "id",
- },
+ defaultValue: "id"
+ }
],
example:
"`{minimap()}`, `{minimap(17, id, _list_of_embedded_feature_ids_calculated_by_calculated_tag):height:10rem; border: 2px solid black}`",
@@ -500,7 +498,7 @@ export default class SpecialVisualizations {
feature: Feature
): SvelteUIElement {
return new SvelteUIElement(MinimapViz, { state, args, feature, tagSource })
- },
+ }
},
{
funcName: "split_button",
@@ -521,7 +519,7 @@ export default class SpecialVisualizations {
return undefined
})
)
- },
+ }
},
{
funcName: "move_button",
@@ -542,9 +540,9 @@ export default class SpecialVisualizations {
return new SvelteUIElement(MoveWizard, {
state,
featureToMove: feature,
- layer,
+ layer
})
- },
+ }
},
{
funcName: "delete_button",
@@ -566,9 +564,9 @@ export default class SpecialVisualizations {
deleteConfig: layer.deletion,
state,
feature,
- layer,
+ layer
}).SetClass("p-0 m-0")
- },
+ }
},
new ShareLinkViz(),
new ExportAsGpxViz(),
@@ -589,9 +587,9 @@ export default class SpecialVisualizations {
const [lon, lat] = GeoOperations.centerpointCoordinates(feature)
return new SvelteUIElement(CreateNewNote, {
state,
- coordinate: new UIEventSource({ lon, lat }),
+ coordinate: new UIEventSource({ lon, lat })
})
- },
+ }
},
new CloseNoteViz(),
new PlantNetDetectionViz(),
@@ -610,8 +608,8 @@ export default class SpecialVisualizations {
{
name: "keyToShowWikipediaFor",
doc: "Use the wikidata entry from this key to show the wikipedia article for. Multiple keys can be given (separated by ';'), in which case the first matching value is used",
- defaultValue: "wikidata;wikipedia",
- },
+ defaultValue: "wikidata;wikipedia"
+ }
],
needsUrls: [...Wikidata.neededUrls, ...Wikipedia.neededUrls],
@@ -624,9 +622,9 @@ export default class SpecialVisualizations {
return tags[key]?.split(";")?.map((id) => id.trim()) ?? []
})
return new SvelteUIElement(WikipediaPanel, {
- wikiIds,
+ wikiIds
})
- },
+ }
},
{
funcName: "wikidata_label",
@@ -635,8 +633,8 @@ export default class SpecialVisualizations {
{
name: "keyToShowWikidataFor",
doc: "Use the wikidata entry from this key to show the label",
- defaultValue: "wikidata",
- },
+ defaultValue: "wikidata"
+ }
],
needsUrls: Wikidata.neededUrls,
example:
@@ -660,7 +658,7 @@ export default class SpecialVisualizations {
})
)
})
- ),
+ )
},
new MapillaryLinkVis(),
new LanguageElement(),
@@ -674,7 +672,7 @@ export default class SpecialVisualizations {
_,
__,
layer: LayerConfig
- ) => new SvelteUIElement(AllTagsPanel, { tags, layer }),
+ ) => new SvelteUIElement(AllTagsPanel, { tags, layer })
},
{
funcName: "image_carousel",
@@ -683,8 +681,8 @@ export default class SpecialVisualizations {
{
name: "image_key",
defaultValue: AllImageProviders.defaultKeys.join(","),
- doc: "The keys given to the images, e.g. if image is given, the first picture URL will be added as image , the second as image:0 , the third as image:1 , etc... Multiple values are allowed if ';'-separated ",
- },
+ doc: "The keys given to the images, e.g. if image is given, the first picture URL will be added as image , the second as image:0 , the third as image:1 , etc... Multiple values are allowed if ';'-separated "
+ }
],
needsUrls: AllImageProviders.apiUrls,
constr: (state, tags, args) => {
@@ -697,7 +695,7 @@ export default class SpecialVisualizations {
tags,
state
)
- },
+ }
},
{
funcName: "image_upload",
@@ -707,13 +705,13 @@ export default class SpecialVisualizations {
{
name: "image-key",
doc: "Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added)",
- required: false,
+ required: false
},
{
name: "label",
doc: "The text to show on the button",
- required: false,
- },
+ required: false
+ }
],
constr: (state, tags, args) => {
const targetKey = args[0] === "" ? undefined : args[0]
@@ -722,9 +720,9 @@ export default class SpecialVisualizations {
tags,
targetKey,
labelText: args[1],
- image: args[2],
+ image: args[2]
})
- },
+ }
},
{
funcName: "rating",
@@ -734,12 +732,12 @@ export default class SpecialVisualizations {
{
name: "subjectKey",
defaultValue: "name",
- doc: "The key to use to determine the subject. If the value is specified, the subject will be tags[subjectKey] and will use this to filter the reviews.",
+ doc: "The key to use to determine the subject. If the value is specified, the subject will be tags[subjectKey] and will use this to filter the reviews."
},
{
name: "fallback",
- doc: "The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value",
- },
+ doc: "The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value"
+ }
],
constr: (state, tags, args, feature) => {
const nameKey = args[0] ?? "name"
@@ -750,14 +748,14 @@ export default class SpecialVisualizations {
state.userRelatedState.mangroveIdentity,
{
nameKey: nameKey,
- fallbackName,
+ fallbackName
},
state.featureSwitchIsTesting
)
return new SvelteUIElement(StarsBarIcon, {
- score: reviews.average,
+ score: reviews.average
})
- },
+ }
},
{
@@ -768,12 +766,12 @@ export default class SpecialVisualizations {
{
name: "subjectKey",
defaultValue: "name",
- doc: "The key to use to determine the subject. If specified, the subject will be tags[subjectKey] ",
+ doc: "The key to use to determine the subject. If specified, the subject will be tags[subjectKey] "
},
{
name: "fallback",
- doc: "The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value",
- },
+ doc: "The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value"
+ }
],
constr: (state, tags, args, feature, layer) => {
const nameKey = args[0] ?? "name"
@@ -784,12 +782,12 @@ export default class SpecialVisualizations {
state.userRelatedState?.mangroveIdentity,
{
nameKey: nameKey,
- fallbackName,
+ fallbackName
},
state.featureSwitchIsTesting
)
return new SvelteUIElement(ReviewForm, { reviews, state, tags, feature, layer })
- },
+ }
},
{
funcName: "list_reviews",
@@ -799,12 +797,12 @@ export default class SpecialVisualizations {
{
name: "subjectKey",
defaultValue: "name",
- doc: "The key to use to determine the subject. If specified, the subject will be tags[subjectKey] ",
+ doc: "The key to use to determine the subject. If specified, the subject will be tags[subjectKey] "
},
{
name: "fallback",
- doc: "The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value",
- },
+ doc: "The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value"
+ }
],
constr: (state, tags, args, feature, layer) => {
const nameKey = args[0] ?? "name"
@@ -815,12 +813,12 @@ export default class SpecialVisualizations {
state.userRelatedState?.mangroveIdentity,
{
nameKey: nameKey,
- fallbackName,
+ fallbackName
},
state.featureSwitchIsTesting
)
return new SvelteUIElement(AllReviews, { reviews, state, tags, feature, layer })
- },
+ }
},
{
funcName: "reviews",
@@ -831,12 +829,12 @@ export default class SpecialVisualizations {
{
name: "subjectKey",
defaultValue: "name",
- doc: "The key to use to determine the subject. If specified, the subject will be tags[subjectKey] ",
+ doc: "The key to use to determine the subject. If specified, the subject will be tags[subjectKey] "
},
{
name: "fallback",
- doc: "The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value",
- },
+ doc: "The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value"
+ }
],
constr(
state: SpecialVisualizationState,
@@ -859,9 +857,9 @@ export default class SpecialVisualizations {
args,
feature,
layer
- ),
+ )
])
- },
+ }
},
{
funcName: "import_mangrove_key",
@@ -869,8 +867,8 @@ export default class SpecialVisualizations {
args: [
{
name: "text",
- doc: "The text that is shown on the button",
- },
+ doc: "The text that is shown on the button"
+ }
],
needsUrls: [],
constr(
@@ -880,7 +878,7 @@ export default class SpecialVisualizations {
): BaseUIElement {
const [text] = argument
return new SvelteUIElement(ImportReviewIdentity, { state, text })
- },
+ }
},
{
funcName: "opening_hours_table",
@@ -889,18 +887,18 @@ export default class SpecialVisualizations {
{
name: "key",
defaultValue: "opening_hours",
- doc: "The tagkey from which the table is constructed.",
+ doc: "The tagkey from which the table is constructed."
},
{
name: "prefix",
defaultValue: "",
- doc: "Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__",
+ doc: "Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__"
},
{
name: "postfix",
defaultValue: "",
- doc: "Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__",
- },
+ doc: "Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__"
+ }
],
needsUrls: [Constants.countryCoderEndpoint],
example:
@@ -908,7 +906,7 @@ export default class SpecialVisualizations {
constr: (state, tagSource: UIEventSource, args) => {
const [key, prefix, postfix] = args
return new OpeningHoursVisualization(tagSource, key, prefix, postfix)
- },
+ }
},
{
funcName: "opening_hours_state",
@@ -917,18 +915,18 @@ export default class SpecialVisualizations {
{
name: "key",
defaultValue: "opening_hours",
- doc: "The tagkey from which the opening hours are read.",
+ doc: "The tagkey from which the opening hours are read."
},
{
name: "prefix",
defaultValue: "",
- doc: "Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__",
+ doc: "Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__"
},
{
name: "postfix",
defaultValue: "",
- doc: "Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__",
- },
+ doc: "Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__"
+ }
],
constr(
state: SpecialVisualizationState,
@@ -943,9 +941,9 @@ export default class SpecialVisualizations {
keyToUse,
tags,
prefix,
- postfix,
+ postfix
})
- },
+ }
},
{
funcName: "canonical",
@@ -957,8 +955,8 @@ export default class SpecialVisualizations {
{
name: "key",
doc: "The key of the tag to give the canonical text for",
- required: true,
- },
+ required: true
+ }
],
constr: (state, tagSource, args) => {
const key = args[0]
@@ -982,7 +980,7 @@ export default class SpecialVisualizations {
return unit.asHumanLongValue(value, getCountry)
})
)
- },
+ }
},
{
funcName: "export_as_geojson",
@@ -996,7 +994,7 @@ export default class SpecialVisualizations {
new SvelteUIElement(ArrowDownTray),
new Combine([
t.downloadFeatureAsGeojson.SetClass("font-bold text-lg"),
- t.downloadGeoJsonHelper.SetClass("subtle"),
+ t.downloadGeoJsonHelper.SetClass("subtle")
]).SetClass("flex flex-col")
)
.onClick(() => {
@@ -1009,12 +1007,12 @@ export default class SpecialVisualizations {
data,
title + "_mapcomplete_export.geojson",
{
- mimetype: "application/vnd.geo+json",
+ mimetype: "application/vnd.geo+json"
}
)
})
.SetClass("w-full")
- },
+ }
},
{
funcName: "open_in_iD",
@@ -1024,9 +1022,9 @@ export default class SpecialVisualizations {
constr: (state, feature) => {
return new SvelteUIElement(OpenIdEditor, {
mapProperties: state.mapProperties,
- objectId: feature.data.id,
+ objectId: feature.data.id
})
- },
+ }
},
{
funcName: "open_in_josm",
@@ -1036,7 +1034,7 @@ export default class SpecialVisualizations {
constr: (state) => {
return new SvelteUIElement(OpenJosm, { state })
- },
+ }
},
{
funcName: "clear_location_history",
@@ -1051,7 +1049,7 @@ export default class SpecialVisualizations {
state.historicalUserLocations.features.setData([])
state.selectedElement.setData(undefined)
})
- },
+ }
},
{
funcName: "visualize_note_comments",
@@ -1060,13 +1058,13 @@ export default class SpecialVisualizations {
{
name: "commentsKey",
doc: "The property name of the comments, which should be stringified json",
- defaultValue: "comments",
+ defaultValue: "comments"
},
{
name: "start",
doc: "Drop the first 'start' comments",
- defaultValue: "0",
- },
+ defaultValue: "0"
+ }
],
needsUrls: [Constants.osmAuthConfig.url],
constr: (state, tags, args) =>
@@ -1088,7 +1086,7 @@ export default class SpecialVisualizations {
)
).SetClass("flex flex-col")
})
- ),
+ )
},
{
funcName: "add_image_to_note",
@@ -1097,8 +1095,8 @@ export default class SpecialVisualizations {
{
name: "Id-key",
doc: "The property name where the ID of the note to close can be found",
- defaultValue: "id",
- },
+ defaultValue: "id"
+ }
],
needsUrls: [Imgur.apiUrl],
@@ -1107,7 +1105,7 @@ export default class SpecialVisualizations {
tags = state.featureProperties.getStore(id)
console.log("Id is", id)
return new SvelteUIElement(UploadImage, { state, tags })
- },
+ }
},
{
funcName: "title",
@@ -1137,12 +1135,12 @@ export default class SpecialVisualizations {
tags: tagsSource,
state,
feature,
- layer,
+ layer
})
.SetClass("px-1")
.setSpan()
})
- ),
+ )
},
{
funcName: "maproulette_task",
@@ -1186,7 +1184,7 @@ export default class SpecialVisualizations {
})
)
},
- docs: "Fetches the metadata of MapRoulette campaign that this task is part of and shows those details (namely `title`, `description` and `instruction`).\n\nThis reads the property `mr_challengeId` to detect the parent campaign.",
+ docs: "Fetches the metadata of MapRoulette campaign that this task is part of and shows those details (namely `title`, `description` and `instruction`).\n\nThis reads the property `mr_challengeId` to detect the parent campaign."
},
{
funcName: "maproulette_set_status",
@@ -1197,15 +1195,15 @@ export default class SpecialVisualizations {
"\n" +
"```json\n" +
"{\n" +
- ' "id": "mark_duplicate",\n' +
- ' "render": {\n' +
- ' "special": {\n' +
- ' "type": "maproulette_set_status",\n' +
- ' "message": {\n' +
- ' "en": "Mark as not found or false positive"\n' +
+ " \"id\": \"mark_duplicate\",\n" +
+ " \"render\": {\n" +
+ " \"special\": {\n" +
+ " \"type\": \"maproulette_set_status\",\n" +
+ " \"message\": {\n" +
+ " \"en\": \"Mark as not found or false positive\"\n" +
" },\n" +
- ' "status": "2",\n' +
- ' "image": "close"\n' +
+ " \"status\": \"2\",\n" +
+ " \"image\": \"close\"\n" +
" }\n" +
" }\n" +
"}\n" +
@@ -1213,32 +1211,32 @@ export default class SpecialVisualizations {
args: [
{
name: "message",
- doc: "A message to show to the user",
+ doc: "A message to show to the user"
},
{
name: "image",
doc: "Image to show",
- defaultValue: "confirm",
+ defaultValue: "confirm"
},
{
name: "message_confirm",
- doc: "What to show when the task is closed, either by the user or was already closed.",
+ doc: "What to show when the task is closed, either by the user or was already closed."
},
{
name: "status",
doc: "A statuscode to apply when the button is clicked. 1 = `close`, 2 = `false_positive`, 3 = `skip`, 4 = `deleted`, 5 = `already fixed` (on the map, e.g. for duplicates), 6 = `too hard`",
- defaultValue: "1",
+ defaultValue: "1"
},
{
name: "maproulette_id",
doc: "The property name containing the maproulette id",
- defaultValue: "mr_taskId",
+ defaultValue: "mr_taskId"
},
{
name: "ask_feedback",
doc: "If not an empty string, this will be used as question to ask some additional feedback. A text field will be added",
- defaultValue: "",
- },
+ defaultValue: ""
+ }
],
constr: (state, tagsSource, args) => {
@@ -1248,7 +1246,7 @@ export default class SpecialVisualizations {
message_closed,
statusToSet,
maproulette_id_key,
- askFeedback,
+ askFeedback
] = args
if (image === "") {
image = "confirm"
@@ -1265,9 +1263,9 @@ export default class SpecialVisualizations {
message_closed,
statusToSet,
maproulette_id_key,
- askFeedback,
+ askFeedback
})
- },
+ }
},
{
funcName: "statistics",
@@ -1294,7 +1292,7 @@ export default class SpecialVisualizations {
[state.mapProperties.bounds]
)
)
- },
+ }
},
{
funcName: "send_email",
@@ -1303,29 +1301,29 @@ export default class SpecialVisualizations {
{
name: "to",
doc: "Who to send the email to?",
- required: true,
+ required: true
},
{
name: "subject",
doc: "The subject of the email",
- required: true,
+ required: true
},
{
name: "body",
doc: "The text in the email",
- required: true,
+ required: true
},
{
name: "button_text",
doc: "The text shown on the button in the UI",
- required: true,
- },
+ required: true
+ }
],
constr(__, tags, args) {
return new SvelteUIElement(SendEmail, { args, tags })
- },
+ }
},
{
funcName: "link",
@@ -1334,36 +1332,36 @@ export default class SpecialVisualizations {
{
name: "text",
doc: "Text to be shown",
- required: true,
+ required: true
},
{
name: "href",
doc: "The URL to link to. Note that this will be URI-encoded before ",
- required: true,
+ required: true
},
{
name: "class",
- doc: "CSS-classes to add to the element",
+ doc: "CSS-classes to add to the element"
},
{
name: "download",
- doc: "Expects a string which denotes the filename to download the contents of `href` into. If set, this link will act as a download-button.",
+ doc: "Expects a string which denotes the filename to download the contents of `href` into. If set, this link will act as a download-button."
},
{
name: "arialabel",
- doc: "If set, this text will be used as aria-label",
+ doc: "If set, this text will be used as aria-label"
},
{
name: "icon",
- doc: "If set, show this icon next to the link. You might want to combine this with `class: button`",
- },
+ doc: "If set, show this icon next to the link. You might want to combine this with `class: button`"
+ }
],
constr(
state: SpecialVisualizationState,
tagSource: UIEventSource>,
args: string[]
- ): BaseUIElement {
+ ): SvelteUIElement {
let [text, href, classnames, download, ariaLabel, icon] = args
if (download === "") {
download = undefined
@@ -1371,11 +1369,7 @@ export default class SpecialVisualizations {
const newTab = download === undefined && !href.startsWith("#")
const textStore = tagSource.map((tags) => Utils.SubstituteKeys(text, tags))
const hrefStore = tagSource.map(
- (tags) =>
- Utils.SubstituteKeys(href, tags).replaceAll(
- / /g,
- "%20"
- ) /* Chromium based browsers eat the spaces */
+ (tags) => Utils.SubstituteKeys(href, tags)
)
return new SvelteUIElement(DynLink, {
text: textStore,
@@ -1384,9 +1378,9 @@ export default class SpecialVisualizations {
download: tagSource.map((tags) => Utils.SubstituteKeys(download, tags)),
ariaLabel: tagSource.map((tags) => Utils.SubstituteKeys(ariaLabel, tags)),
newTab: new ImmutableStore(newTab),
- icon: tagSource.map((tags) => Utils.SubstituteKeys(icon, tags)),
+ icon: tagSource.map((tags) => Utils.SubstituteKeys(icon, tags))
}).setSpan()
- },
+ }
},
{
funcName: "multi",
@@ -1400,10 +1394,10 @@ export default class SpecialVisualizations {
type: "multi",
key: "_doors_from_building_properties",
tagrendering: {
- en: "The building containing this feature has a door of width {entrance:width}",
- },
- },
- },
+ en: "The building containing this feature has a door of width {entrance:width}"
+ }
+ }
+ }
},
null,
" "
@@ -1413,17 +1407,17 @@ export default class SpecialVisualizations {
{
name: "key",
doc: "The property to read and to interpret as a list of properties",
- required: true,
+ required: true
},
{
name: "tagrendering",
doc: "An entire tagRenderingConfig",
- required: true,
+ required: true
},
{
name: "classes",
- doc: "CSS-classes to apply on every individual item. Seperated by `space`",
- },
+ doc: "CSS-classes to apply on every individual item. Seperated by `space`"
+ }
],
constr(
state: SpecialVisualizationState,
@@ -1459,14 +1453,14 @@ export default class SpecialVisualizations {
tags: new ImmutableStore(property),
state,
feature,
- layer,
+ layer
}).SetClass(classes)
elements.push(subsTr)
}
return elements
})
)
- },
+ }
},
{
funcName: "translated",
@@ -1476,8 +1470,8 @@ export default class SpecialVisualizations {
{
name: "key",
doc: "The attribute to interpret as json",
- defaultValue: "value",
- },
+ defaultValue: "value"
+ }
],
constr(
state: SpecialVisualizationState,
@@ -1498,7 +1492,7 @@ export default class SpecialVisualizations {
}
})
)
- },
+ }
},
{
funcName: "fediverse_link",
@@ -1507,8 +1501,8 @@ export default class SpecialVisualizations {
{
name: "key",
doc: "The attribute-name containing the link",
- required: true,
- },
+ required: true
+ }
],
constr(
@@ -1532,13 +1526,13 @@ export default class SpecialVisualizations {
const normalLink = new SvelteUIElement(Link, {
text: fediAccount,
href: "https://" + host + "/@" + username,
- newTab: true,
+ newTab: true
})
const loggedInContributorMastodon =
state.userRelatedState?.preferencesAsTags?.data?.[
"_mastodon_link"
- ]
+ ]
console.log(
"LoggedinContributorMastodon",
loggedInContributorMastodon
@@ -1554,12 +1548,12 @@ export default class SpecialVisualizations {
new SvelteUIElement(Link, {
href: homeHost + "/" + fediAccount,
text: Translations.t.validation.fediverse.onYourServer,
- newTab: true,
- }).SetClass("button"),
+ newTab: true
+ }).SetClass("button")
])
})
)
- },
+ }
},
{
funcName: "braced",
@@ -1569,8 +1563,8 @@ export default class SpecialVisualizations {
{
name: "text",
required: true,
- doc: "The value to show",
- },
+ doc: "The value to show"
+ }
],
constr(
state: SpecialVisualizationState,
@@ -1580,7 +1574,7 @@ export default class SpecialVisualizations {
layer: LayerConfig
): BaseUIElement {
return new FixedUiElement("{" + args[0] + "}")
- },
+ }
},
{
funcName: "tags",
@@ -1590,8 +1584,8 @@ export default class SpecialVisualizations {
{
name: "key",
defaultValue: "value",
- doc: "The key to look for the tags",
- },
+ doc: "The key to look for the tags"
+ }
],
constr(
state: SpecialVisualizationState,
@@ -1616,14 +1610,14 @@ export default class SpecialVisualizations {
} catch (e) {
return new FixedUiElement(
"Could not parse this tag: " +
- JSON.stringify(value) +
- " due to " +
- e
+ JSON.stringify(value) +
+ " due to " +
+ e
).SetClass("alert")
}
})
)
- },
+ }
},
{
funcName: "giggity",
@@ -1631,8 +1625,8 @@ export default class SpecialVisualizations {
{
name: "giggityUrl",
required: true,
- doc: "The URL of the giggity-XML",
- },
+ doc: "The URL of the giggity-XML"
+ }
],
docs: "Shows events that are happening based on a Giggity URL",
needsUrls: (args) => args[0],
@@ -1646,7 +1640,7 @@ export default class SpecialVisualizations {
): BaseUIElement {
const giggityUrl = argument[0]
return new SvelteUIElement(Giggity, { tags: tagSource, state, giggityUrl })
- },
+ }
},
{
funcName: "gps_all_tags",
@@ -1669,10 +1663,10 @@ export default class SpecialVisualizations {
new SvelteUIElement(OrientationDebugPanel, {}),
new SvelteUIElement(AllTagsPanel, {
state,
- tags,
- }),
+ tags
+ })
])
- },
+ }
},
{
funcName: "favourite_status",
@@ -1691,9 +1685,9 @@ export default class SpecialVisualizations {
tags: tagSource,
state,
layer,
- feature,
+ feature
})
- },
+ }
},
{
funcName: "favourite_icon",
@@ -1711,9 +1705,9 @@ export default class SpecialVisualizations {
tags: tagSource,
state,
layer,
- feature,
+ feature
}).SetClass("w-full h-full")
- },
+ }
},
{
funcName: "direction_indicator",
@@ -1728,7 +1722,7 @@ export default class SpecialVisualizations {
layer: LayerConfig
): BaseUIElement {
return new SvelteUIElement(DirectionIndicator, { state, feature })
- },
+ }
},
{
funcName: "qr_code",
@@ -1741,7 +1735,7 @@ export default class SpecialVisualizations {
feature: Feature
): SvelteUIElement {
return new SvelteUIElement(QrCode, { state, tags, feature })
- },
+ }
},
{
funcName: "direction_absolute",
@@ -1750,8 +1744,8 @@ export default class SpecialVisualizations {
{
name: "key",
doc: "The attribute containing the degrees",
- defaultValue: "_direction:centerpoint",
- },
+ defaultValue: "_direction:centerpoint"
+ }
],
constr(
@@ -1774,7 +1768,7 @@ export default class SpecialVisualizations {
return Translations.t.general.visualFeedback.directionsAbsolute[dir]
})
)
- },
+ }
},
{
funcName: "compare_data",
@@ -1783,18 +1777,18 @@ export default class SpecialVisualizations {
{
name: "url",
required: true,
- doc: "The attribute containing the url where to fetch more data",
+ doc: "The attribute containing the url where to fetch more data"
},
{
name: "host",
required: true,
- doc: "The domain name(s) where data might be fetched from - this is needed to set the CSP. A domain must include 'https', e.g. 'https://example.com'. For multiple domains, separate them with ';'. If you don't know the possible domains, use '*'. ",
+ doc: "The domain name(s) where data might be fetched from - this is needed to set the CSP. A domain must include 'https', e.g. 'https://example.com'. For multiple domains, separate them with ';'. If you don't know the possible domains, use '*'. "
},
{
name: "readonly",
required: false,
- doc: "If 'yes', will not show 'apply'-buttons",
- },
+ doc: "If 'yes', will not show 'apply'-buttons"
+ }
],
docs: "Gives an interactive element which shows a tag comparison between the OSM-object and the upstream object. This allows to copy some or all tags into OSM",
constr(
@@ -1814,9 +1808,9 @@ export default class SpecialVisualizations {
layer,
feature,
readonly,
- externalData,
+ externalData
})
- },
+ }
},
{
funcName: "login_button",
@@ -1835,7 +1829,7 @@ export default class SpecialVisualizations {
new SvelteUIElement(LoginButton, { osmConnection: state.osmConnection }),
state.osmConnection.isLoggedIn
)
- },
+ }
},
{
funcName: "linked_data_from_website",
@@ -1844,26 +1838,26 @@ export default class SpecialVisualizations {
{
name: "key",
defaultValue: "website",
- doc: "Attempt to load ld+json from the specified URL. This can be in an embedded
@@ -232,6 +192,58 @@
+
+
+
+
+
{console.log("Opening...."); state.guistate.pageStates.menu.setData(true)}}
+ on:keydown={forwardEventToMap}
+ >
+
+
+
+
state.guistate.pageStates.about_theme.set(true)}
+ on:keydown={forwardEventToMap}
+ >
+
+
+
+
+
+
+
+
+
+ {#if $debug && $hash}
+
+ {$hash}
+
+ {/if}
+
+
+
+
+ {
+ state.map?.data?.getCanvas()?.focus()
+ }}
+ perLayer={state.perLayer}
+ selectedElement={state.selectedElement}
+ geolocationState={state.geolocation.geolocationState}
+ />
+
+
+
+
+
{#if $selectedElement === undefined}
@@ -240,44 +252,12 @@
{/if}
-
- {
- state.map?.data?.getCanvas()?.focus()
- }}
- perLayer={state.perLayer}
- selectedElement={state.selectedElement}
- geolocationState={state.geolocation.geolocationState}
- />
-
+
- state.guistate.themeIsOpened.setData(true)}
- on:keydown={forwardEventToMap}
- htmlElem={openMapButton}
- >
-
-
-
-
-
-
-
-
- state.guistate.menuIsOpened.setData(true)}
- on:keydown={forwardEventToMap}
- htmlElem={openMenuButton}
- >
-
-
+
{#if currentViewLayer?.tagRenderings && currentViewLayer.defaultIcon()}
@@ -443,15 +413,22 @@
+
+
+
+
+
+
+
{#if $selectedElement !== undefined && $selectedLayer !== undefined && !$selectedLayer.popupInFloatover}
{
- selectedElement.setData(undefined)
+ state.selectedElement.setData(undefined)
}}
>
-
+
{/if}
@@ -465,7 +442,7 @@
}}
>
-
+
{:else}
-
+
{/if}
{/if}
@@ -485,225 +462,5 @@
-
-
- state.guistate.themeIsOpened.setData(false)}>
-
-
-
- state.guistate.themeIsOpened.setData(false)}
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- state.guistate.filtersPanelIsOpened.setData(false)}>
-
-
-
-
-
-
- {
- state.guistate.backgroundLayerSelectionIsOpened.setData(false)
- }}
- >
-
-
-
-
-
-
- state.guistate.menuIsOpened.setData(false)}>
-
-
-
- state.guistate.menuIsOpened.setData(false)}
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- state.guistate.privacyPanelIsOpened.setData(false)}>
-
-
-
-
-
-
- state.guistate.copyrightPanelIsOpened.setData(false)}>
-
-
-
-
-
-
- state.guistate.communityIndexPanelIsOpened.setData(false)}>
-
-
-
-
-
-
-
sl !== undefined && sl === currentViewLayer)}
- moveTo={openCurrentViewLayerButton}
- debug="currentViewLayer"
- />
- sl !== undefined && sl?.properties?.id === LastClickFeatureSource.newPointElementId
- )}
- moveTo={openNewElementButton}
- debug="newElement"
- />
-
-
diff --git a/src/UI/i18n/Translations.ts b/src/UI/i18n/Translations.ts
index 2006a5e899..ea95dc47c9 100644
--- a/src/UI/i18n/Translations.ts
+++ b/src/UI/i18n/Translations.ts
@@ -3,7 +3,6 @@ import { Translation, TypedTranslation } from "./Translation"
import BaseUIElement from "../BaseUIElement"
import CompiledTranslations from "../../assets/generated/CompiledTranslations"
import LanguageUtils from "../../Utils/LanguageUtils"
-import { ClickableToggle } from "../Input/Toggle"
import { Store } from "../../Logic/UIEventSource"
import Locale from "./Locale"
import { Utils } from "../../Utils"
diff --git a/src/Utils.ts b/src/Utils.ts
index 874b327b4b..f90c51f559 100644
--- a/src/Utils.ts
+++ b/src/Utils.ts
@@ -114,7 +114,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
"version",
"wayHandling",
"widenFactor",
- "width",
+ "width"
]
private static extraKeys = [
"nl",
@@ -133,7 +133,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
"yes",
"no",
"true",
- "false",
+ "false"
]
private static injectedDownloads = {}
private static _download_cache = new Map<
@@ -150,7 +150,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (Utils.runningFromConsole) {
return
}
- DOMPurify.addHook("afterSanitizeAttributes", function (node) {
+ DOMPurify.addHook("afterSanitizeAttributes", function(node) {
// set all elements owning target to target=_blank + add noopener noreferrer
const target = node.getAttribute("target")
if (target) {
@@ -163,7 +163,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
public static purify(src: string): string {
return DOMPurify.sanitize(src, {
USE_PROFILES: { html: true },
- ADD_ATTR: ["target"], // Don't remove target='_blank'. Note that Utils.initDomPurify does add a hook which automatically adds 'rel=noopener'
+ ADD_ATTR: ["target"] // Don't remove target='_blank'. Note that Utils.initDomPurify does add a hook which automatically adds 'rel=noopener'
})
}
@@ -344,7 +344,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
console.error("Error while calculating a lazy property", e)
return undefined
}
- },
+ }
})
}
@@ -368,7 +368,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
whenDone()
}
})
- },
+ }
})
}
@@ -651,7 +651,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (!Array.isArray(targetV)) {
throw new Error(
"Cannot concatenate: value to add is not an array: " +
- JSON.stringify(targetV)
+ JSON.stringify(targetV)
)
}
if (Array.isArray(sourceV)) {
@@ -659,9 +659,9 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
} else {
throw new Error(
"Could not merge concatenate " +
- JSON.stringify(sourceV) +
- " and " +
- JSON.stringify(targetV)
+ JSON.stringify(sourceV) +
+ " and " +
+ JSON.stringify(targetV)
)
}
} else {
@@ -922,7 +922,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
continue
}
const i = part.charCodeAt(0)
- result += '"' + keys[i] + '":' + part.substring(1)
+ result += "\"" + keys[i] + "\":" + part.substring(1)
}
return result
@@ -960,6 +960,11 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (!result["error"]) {
return result
}
+ const error = result.error
+ if (error.statuscode === 429 || error.statuscode === 509) {
+ // rate limited
+ return result
+ }
console.log(
`Request to ${url} failed, Trying again in a moment. Attempt ${
i + 1
@@ -1000,7 +1005,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
resolve({
error: "other error: " + xhr.statusText + ", " + xhr.responseText,
url,
- statuscode: xhr.status,
+ statuscode: xhr.status
})
}
}
@@ -1014,12 +1019,12 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
xhr.onerror = (ev: ProgressEvent) =>
reject(
"Could not get " +
- url +
- ", xhr status code is " +
- xhr.status +
- " (" +
- xhr.statusText +
- ")"
+ url +
+ ", xhr status code is " +
+ xhr.status +
+ " (" +
+ xhr.statusText +
+ ")"
)
})
}
@@ -1077,12 +1082,13 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
}
const promise =
/*NO AWAIT as we work with the promise directly */ Utils.downloadJsonAdvanced(
- url,
- headers
- )
+ url,
+ headers
+ )
Utils._download_cache.set(url, { promise, timestamp: new Date().getTime() })
return await promise
}
+
public static async downloadJson(
url: string,
headers?: Record
@@ -1271,7 +1277,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
): T[] {
const withDistance: [T, number][] = ts.map((t) => [
t,
- Utils.levenshteinDistance(getName(t), reference),
+ Utils.levenshteinDistance(getName(t), reference)
])
withDistance.sort(([_, a], [__, b]) => a - b)
return withDistance.map((n) => n[0])
@@ -1393,7 +1399,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
return {
r: Utils.percentageToNumber(match[1]),
g: Utils.percentageToNumber(match[2]),
- b: Utils.percentageToNumber(match[3]),
+ b: Utils.percentageToNumber(match[3])
}
}
@@ -1404,14 +1410,14 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
return {
r: parseInt(hex.substr(1, 1), 16),
g: parseInt(hex.substr(2, 1), 16),
- b: parseInt(hex.substr(3, 1), 16),
+ b: parseInt(hex.substr(3, 1), 16)
}
}
return {
r: parseInt(hex.substr(1, 2), 16),
g: parseInt(hex.substr(3, 2), 16),
- b: parseInt(hex.substr(5, 2), 16),
+ b: parseInt(hex.substr(5, 2), 16)
}
}
@@ -1586,7 +1592,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
line: Number(line),
column: Number(column),
markdownLocation,
- filename: path.substring(path.lastIndexOf("/") + 1),
+ filename: path.substring(path.lastIndexOf("/") + 1)
}
}
@@ -1705,6 +1711,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
}
private static readonly _metrixPrefixes = ["", "k", "M", "G", "T", "P", "E"]
+
/**
* Converts a big number (e.g. 1000000) into a rounded postfixed verion (e.g. 1M)
*
@@ -1727,6 +1734,26 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
}
}
+ /**
+ * Removes or rewrites some characters in links, as some blink/chromium based browsers are picky about them
+ *
+ * Utils.prepareHref("tel:+32 123 456") // => "tel:+32123456"
+ * Utils.prepareHref("https://osm.org/user/User Name") // => "https://osm.org/user/User%20Name"
+ */
+ static prepareHref(href: string): string {
+ if (href.startsWith("tel:")) {
+ // Telephone numbers are not allowed to contain spaces in chromium-based browsers
+ href = "tel:" + href.replaceAll(/[^+0-9]/g, "")
+ }
+
+ /* Chromium based browsers eat the spaces */
+ href = href.replaceAll(
+ / /g,
+ "%20"
+ )
+ return href
+ }
+
private static emojiRegex = /[\p{Extended_Pictographic}🛰️]$/u
/**
diff --git a/src/index.css b/src/index.css
index eccbdb3b40..70dd07ca3a 100644
--- a/src/index.css
+++ b/src/index.css
@@ -178,6 +178,10 @@ input[type="text"] {
border-radius: 0.5rem;
}
+.box-shadow {
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+}
+
/******************* Styling of input elements **********************/
/**
@@ -461,10 +465,18 @@ code {
color: var(--background-color);
}
+.h-full-child > div {
+ height: 100%;
+}
+
.bg-black-transparent {
background-color: #00000088;
}
+.bg-black-light-transparent {
+ background-color: #00000044;
+}
+
.block-ruby {
display: block ruby;
}
@@ -538,6 +550,10 @@ a.link-underline {
background-color: #f2f2f2;
}
+.no-bold b {
+ font-weight: normal;
+}
+
/************************* MISC ELEMENTS *************************/
.selected svg:not(.noselect *) path.selectable {
@@ -622,6 +638,10 @@ svg.apply-fill path {
max-width: 100%;
}
+.max-w-screen {
+ max-width: 100vw;
+}
+
/************************* Experimental support for foldable devices ********************************/
@media (horizontal-viewport-segments: 2) {
.theme-list {
diff --git a/src/service-worker.ts b/src/service-worker.ts
index 5a10ac80d6..a0f1140f8c 100644
--- a/src/service-worker.ts
+++ b/src/service-worker.ts
@@ -12,74 +12,84 @@ async function install() {
addEventListener("install", (e) => (e).waitUntil(install()))
addEventListener("activate", (e) => (e).waitUntil(activate()))
+async function clearCaches(exceptVersion = undefined) {
+ const keys = await caches.keys()
+ await Promise.all(keys.map((k) => k !== version && caches.delete(k)))
+ console.log("Cleared caches")
+}
+
async function activate() {
console.log("Activating service worker")
- caches
- .keys()
- .then((keys) => {
- // Remove all old caches
- Promise.all(keys.map((key) => key !== version && caches.delete(key)))
- })
- .catch(console.error)
+ await clearCaches(version)
}
-function fetchAndCache(event) {
- return fetch(event.request).then((networkResponse) => {
- return caches.open(version).then((cache) => {
- cache.put(event.request, networkResponse.clone())
- console.log("Cached", event.request)
- return networkResponse
- })
- })
+async function fetchAndCache(event: ServiceWorkerFetchEvent): Promise {
+ let networkResponse = await fetch(event.request)
+ let cache = await caches.open(version)
+ await cache.put(event.request, networkResponse.clone())
+ console.log("Cached", event.request)
+ return networkResponse
}
-const cacheFirst = async (event, attemptUpdate: boolean = false) => {
- await event.respondWith(
- caches.match(event.request, { ignoreSearch: true }).then((cacheResponse) => {
- if (cacheResponse !== undefined) {
- console.debug("Loaded from cache: ", event.request)
- if (attemptUpdate) {
- fetchAndCache(event)
- }
- return cacheResponse
- }
- return fetchAndCache(event)
- })
- )
+async function cacheFirst(event: ServiceWorkerFetchEvent, attemptUpdate: boolean = false) {
+ const cacheResponse = await caches.match(event.request, { ignoreSearch: true })
+ if (cacheResponse === undefined) {
+ return fetchAndCache(event)
+ }
+ console.debug("Loaded from cache: ", event.request)
+ if (attemptUpdate) {
+ fetchAndCache(event)
+ }
+ return cacheResponse
+
+}
+
+const neverCache: RegExp[] = [
+ /\.html$/,
+ /service-worker/
+]
+const neverCacheHost : RegExp[] = [
+ /127\.0\.0\.[0-9]+/,
+ /\.local/,
+ /\.gitpod\.io/,
+ /localhost/
+]
+
+async function handleRequest(event: ServiceWorkerFetchEvent) {
+ const origin = new URL(self.origin)
+ const requestUrl = new URL(event.request.url)
+ if (requestUrl.pathname.endsWith("service-worker-version")) {
+ console.log("Sending version number...")
+ await event.respondWith(
+ new Response(JSON.stringify({ "service-worker-version": version })),
+ )
+ return
+ }
+ if (requestUrl.pathname.endsWith("/service-worker-clear")) {
+ await clearCaches()
+ await event.respondWith(
+ new Response(JSON.stringify({ "cache-cleared": true })),
+ )
+ return
+ }
+
+ const shouldBeCached =
+ origin.host === requestUrl.host &&
+ !neverCacheHost.some(blacklisted => origin.host.match(blacklisted)) &&
+ !neverCache.some(blacklisted => event.request.url.match(blacklisted))
+ if (!shouldBeCached) {
+ console.debug("Not intercepting ", requestUrl.toString(), origin.host, requestUrl.host)
+ // We return _without_ calling event.respondWith, which signals the browser that it'll have to handle it himself
+ return
+ }
+ await event.respondWith(await cacheFirst(event))
}
self.addEventListener("fetch", async (e) => {
// Important: this lambda must run synchronously, as the browser will otherwise handle the request
- const event = e
+ const event: ServiceWorkerFetchEvent = e
try {
- const origin = new URL(self.origin)
- const requestUrl = new URL(event.request.url)
- if (requestUrl.pathname.endsWith("service-worker-version")) {
- console.log("Sending version number...")
- await event.respondWith(
- new Response(JSON.stringify({ "service-worker-version": version }))
- )
- return
- }
- if (requestUrl.pathname.endsWith("/service-worker-clear")) {
- const keys = await caches.keys()
- await Promise.all(keys.map((k) => caches.delete(k)))
- console.log("Cleared caches")
- return
- }
- const shouldBeCached =
- origin.host === requestUrl.host &&
- origin.hostname !== "127.0.0.1" &&
- origin.hostname !== "localhost" &&
- !origin.hostname.endsWith(".local") &&
- !origin.host.endsWith(".gitpod.io") &&
- origin.pathname.indexOf("service-worker") < 0
- if (!shouldBeCached) {
- console.debug("Not intercepting ", requestUrl.toString(), origin.host, requestUrl.host)
- // We return _without_ calling event.respondWith, which signals the browser that it'll have to handle it himself
- return
- }
- await cacheFirst(event)
+ await handleRequest(event)
} catch (e) {
console.error("CRASH IN SW:", e)
await event.respondWith(fetch(event.request.url))
diff --git a/status.html b/status.html
index 1e21e85e51..1c3c72b7a1 100644
--- a/status.html
+++ b/status.html
@@ -2,7 +2,7 @@
- MapComplete statistics
+ MapComplete status page
diff --git a/tailwind.config.cjs b/tailwind.config.cjs
index e77c997a7d..a2294bd3ac 100644
--- a/tailwind.config.cjs
+++ b/tailwind.config.cjs
@@ -1,8 +1,10 @@
/** @type {import('tailwindcss').Config} */
const plugin = require("tailwindcss/plugin")
+const flowbitePlugin = require("flowbite/plugin")
module.exports = {
- content: ["./**/*.{html,ts,svelte}"],
+ content: ["./**/*.{html,ts,svelte}", './node_modules/flowbite-svelte/**/*.{html,js,svelte,ts}'],
+
theme: {
extend: {
maxHeight: {
@@ -12,10 +14,24 @@ module.exports = {
colors: {
subtle: "#dbeafe",
unsubtle: "#bfdbfe",
+ // flowbite-svelte
+ primary: {
+ 50: '#FFF5F2',
+ 100: '#FFF1EE',
+ 200: '#FFE4DE',
+ 300: '#FFD5CC',
+ 400: '#FFBCAD',
+ 500: '#FE795D',
+ 600: '#EF562F',
+ 700: '#EB4F27',
+ 800: '#CC4522',
+ 900: '#A5371B'
+ }
},
},
},
plugins: [
+ flowbitePlugin,
plugin(function ({ addVariant, e }) {
addVariant("landscape", ({ modifySelectors, separator }) => {
modifySelectors(({ className }) => {