From 9132ef39ece7deb3715b80755622afd62451e888 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sat, 18 Jan 2025 09:19:21 -0500
Subject: [PATCH 01/30] fix: add 'finding_recommendations' key and update
'no_adventures_to_recommendations' in multiple locale files
---
frontend/src/locales/de.json | 10 +++++++++-
frontend/src/locales/en.json | 8 ++++++++
frontend/src/locales/es.json | 10 +++++++++-
frontend/src/locales/fr.json | 10 +++++++++-
frontend/src/locales/it.json | 10 +++++++++-
frontend/src/locales/nl.json | 10 +++++++++-
frontend/src/locales/pl.json | 10 +++++++++-
frontend/src/locales/sv.json | 10 +++++++++-
frontend/src/locales/zh.json | 10 +++++++++-
.../src/routes/collections/[id]/+page.svelte | 16 ++++++++--------
10 files changed, 88 insertions(+), 16 deletions(-)
diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json
index e978969..0508d18 100644
--- a/frontend/src/locales/de.json
+++ b/frontend/src/locales/de.json
@@ -220,7 +220,8 @@
"will_be_marked": "wird als besucht markiert, sobald das Abenteuer gespeichert ist.",
"cities_updated": "Städte aktualisiert",
"create_adventure": "Erstelle Abenteuer",
- "no_adventures_to_recommendations": "Keine Abenteuer gefunden. \nFügen Sie mindestens ein Abenteuer hinzu, um Empfehlungen zu erhalten."
+ "no_adventures_to_recommendations": "Keine Abenteuer gefunden. \nFügen Sie mindestens ein Abenteuer hinzu, um Empfehlungen zu erhalten.",
+ "finding_recommendations": "Entdecken Sie verborgene Schätze für Ihr nächstes Abenteuer"
},
"home": {
"desc_1": "Entdecken, planen und erkunden Sie mit Leichtigkeit",
@@ -546,5 +547,12 @@
"immich_integration": "Immich-Integration",
"documentation": "Immich-Integrationsdokumentation",
"localhost_note": "Hinweis: localhost wird höchstwahrscheinlich nicht funktionieren, es sei denn, Sie haben Docker-Netzwerke entsprechend eingerichtet. \nEs wird empfohlen, die IP-Adresse des Servers oder den Domänennamen zu verwenden."
+ },
+ "recomendations": {
+ "address": "Adresse",
+ "contact": "Kontakt",
+ "phone": "Telefon",
+ "recommendation": "Empfehlung",
+ "website": "Webseite"
}
}
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json
index c5ff3c5..a138392 100644
--- a/frontend/src/locales/en.json
+++ b/frontend/src/locales/en.json
@@ -242,6 +242,7 @@
"flight_information": "Flight Information",
"out_of_range": "Not in itinerary date range",
"preview": "Preview",
+ "finding_recommendations": "Discovering hidden gems for your next adventure",
"md_instructions": "Write your markdown here...",
"days": "days",
"activities": {
@@ -546,5 +547,12 @@
"immich_integration": "Immich Integration",
"localhost_note": "Note: localhost will most likely not work unless you have setup docker networks accordingly. It is recommended to use the IP address of the server or the domain name.",
"documentation": "Immich Integration Documentation"
+ },
+ "recomendations": {
+ "address": "Address",
+ "phone": "Phone",
+ "contact": "Contact",
+ "website": "Website",
+ "recommendation": "Recommendation"
}
}
diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json
index 3440276..79e2f7d 100644
--- a/frontend/src/locales/es.json
+++ b/frontend/src/locales/es.json
@@ -267,7 +267,8 @@
"will_be_marked": "se marcará como visitado una vez guardada la aventura.",
"cities_updated": "ciudades actualizadas",
"create_adventure": "Crear aventura",
- "no_adventures_to_recommendations": "No se encontraron aventuras. \nAñade al menos una aventura para obtener recomendaciones."
+ "no_adventures_to_recommendations": "No se encontraron aventuras. \nAñade al menos una aventura para obtener recomendaciones.",
+ "finding_recommendations": "Descubriendo gemas ocultas para tu próxima aventura"
},
"worldtravel": {
"all": "Todo",
@@ -546,5 +547,12 @@
"immich_integration": "Integración Immich",
"documentation": "Documentación de integración de Immich",
"localhost_note": "Nota: lo más probable es que localhost no funcione a menos que haya configurado las redes acoplables en consecuencia. \nSe recomienda utilizar la dirección IP del servidor o el nombre de dominio."
+ },
+ "recomendations": {
+ "address": "DIRECCIÓN",
+ "contact": "Contacto",
+ "phone": "Teléfono",
+ "recommendation": "Recomendación",
+ "website": "Sitio web"
}
}
diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json
index 8cac395..8f10eb4 100644
--- a/frontend/src/locales/fr.json
+++ b/frontend/src/locales/fr.json
@@ -220,7 +220,8 @@
"will_be_marked": "sera marqué comme visité une fois l’aventure sauvegardée.",
"cities_updated": "villes mises à jour",
"create_adventure": "Créer une aventure",
- "no_adventures_to_recommendations": "Aucune aventure trouvée. \nAjoutez au moins une aventure pour obtenir des recommandations."
+ "no_adventures_to_recommendations": "Aucune aventure trouvée. \nAjoutez au moins une aventure pour obtenir des recommandations.",
+ "finding_recommendations": "Découvrir des trésors cachés pour votre prochaine aventure"
},
"home": {
"desc_1": "Découvrez, planifiez et explorez en toute simplicité",
@@ -546,5 +547,12 @@
"update_integration": "Intégration des mises à jour",
"documentation": "Documentation d'intégration Immich",
"localhost_note": "Remarque : localhost ne fonctionnera probablement pas à moins que vous n'ayez configuré les réseaux Docker en conséquence. \nIl est recommandé d'utiliser l'adresse IP du serveur ou le nom de domaine."
+ },
+ "recomendations": {
+ "address": "Adresse",
+ "contact": "Contact",
+ "phone": "Téléphone",
+ "recommendation": "Recommandation",
+ "website": "Site web"
}
}
diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json
index 2c43ba6..a885cf9 100644
--- a/frontend/src/locales/it.json
+++ b/frontend/src/locales/it.json
@@ -220,7 +220,8 @@
"will_be_marked": "verrà contrassegnato come visitato una volta salvata l'avventura.",
"cities_updated": "città aggiornate",
"create_adventure": "Crea Avventura",
- "no_adventures_to_recommendations": "Nessuna avventura trovata. \nAggiungi almeno un'avventura per ricevere consigli."
+ "no_adventures_to_recommendations": "Nessuna avventura trovata. \nAggiungi almeno un'avventura per ricevere consigli.",
+ "finding_recommendations": "Alla scoperta di gemme nascoste per la tua prossima avventura"
},
"home": {
"desc_1": "Scopri, pianifica ed esplora con facilità",
@@ -546,5 +547,12 @@
"update_integration": "Aggiorna integrazione",
"documentation": "Documentazione sull'integrazione di Immich",
"localhost_note": "Nota: molto probabilmente localhost non funzionerà a meno che tu non abbia configurato le reti docker di conseguenza. \nSi consiglia di utilizzare l'indirizzo IP del server o il nome del dominio."
+ },
+ "recomendations": {
+ "address": "Indirizzo",
+ "contact": "Contatto",
+ "phone": "Telefono",
+ "recommendation": "Raccomandazione",
+ "website": "Sito web"
}
}
diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json
index e230dd2..71d3506 100644
--- a/frontend/src/locales/nl.json
+++ b/frontend/src/locales/nl.json
@@ -220,7 +220,8 @@
"will_be_marked": "wordt gemarkeerd als bezocht zodra het avontuur is opgeslagen.",
"cities_updated": "steden bijgewerkt",
"create_adventure": "Creëer avontuur",
- "no_adventures_to_recommendations": "Geen avonturen gevonden. \nVoeg ten minste één avontuur toe om aanbevelingen te krijgen."
+ "no_adventures_to_recommendations": "Geen avonturen gevonden. \nVoeg ten minste één avontuur toe om aanbevelingen te krijgen.",
+ "finding_recommendations": "Ontdek verborgen juweeltjes voor je volgende avontuur"
},
"home": {
"desc_1": "Ontdek, plan en verken met gemak",
@@ -546,5 +547,12 @@
"update_integration": "Integratie bijwerken",
"documentation": "Immich-integratiedocumentatie",
"localhost_note": "Opmerking: localhost zal hoogstwaarschijnlijk niet werken tenzij u de docker-netwerken dienovereenkomstig hebt ingesteld. \nHet wordt aanbevolen om het IP-adres van de server of de domeinnaam te gebruiken."
+ },
+ "recomendations": {
+ "address": "Adres",
+ "contact": "Contact",
+ "phone": "Telefoon",
+ "recommendation": "Aanbeveling",
+ "website": "Website"
}
}
diff --git a/frontend/src/locales/pl.json b/frontend/src/locales/pl.json
index a39baeb..c14b61a 100644
--- a/frontend/src/locales/pl.json
+++ b/frontend/src/locales/pl.json
@@ -267,7 +267,8 @@
"will_be_marked": "zostanie oznaczona jako odwiedzona po zapisaniu przygody.",
"cities_updated": "miasta zaktualizowane",
"create_adventure": "Stwórz przygodę",
- "no_adventures_to_recommendations": "Nie znaleziono żadnych przygód. \nDodaj co najmniej jedną przygodę, aby uzyskać rekomendacje."
+ "no_adventures_to_recommendations": "Nie znaleziono żadnych przygód. \nDodaj co najmniej jedną przygodę, aby uzyskać rekomendacje.",
+ "finding_recommendations": "Odkrywanie ukrytych klejnotów na następną przygodę"
},
"worldtravel": {
"country_list": "Lista krajów",
@@ -546,5 +547,12 @@
"immich_disabled": "Integracja z Immich została pomyślnie wyłączona!",
"documentation": "Dokumentacja integracji Immicha",
"localhost_note": "Uwaga: localhost najprawdopodobniej nie będzie działać, jeśli nie skonfigurujesz odpowiednio sieci dokerów. \nZalecane jest użycie adresu IP serwera lub nazwy domeny."
+ },
+ "recomendations": {
+ "address": "Adres",
+ "contact": "Kontakt",
+ "phone": "Telefon",
+ "recommendation": "Zalecenie",
+ "website": "Strona internetowa"
}
}
diff --git a/frontend/src/locales/sv.json b/frontend/src/locales/sv.json
index 3dfcae1..c60bb30 100644
--- a/frontend/src/locales/sv.json
+++ b/frontend/src/locales/sv.json
@@ -220,7 +220,8 @@
"will_be_marked": "kommer att markeras som besökt när äventyret har sparats.",
"cities_updated": "städer uppdaterade",
"create_adventure": "Skapa äventyr",
- "no_adventures_to_recommendations": "Inga äventyr hittades. \nLägg till minst ett äventyr för att få rekommendationer."
+ "no_adventures_to_recommendations": "Inga äventyr hittades. \nLägg till minst ett äventyr för att få rekommendationer.",
+ "finding_recommendations": "Upptäck dolda pärlor för ditt nästa äventyr"
},
"home": {
"desc_1": "Upptäck, planera och utforska med lätthet",
@@ -546,5 +547,12 @@
"update_integration": "Uppdatera integration",
"documentation": "Immich Integrationsdokumentation",
"localhost_note": "Obs: localhost kommer sannolikt inte att fungera om du inte har konfigurerat docker-nätverk i enlighet med detta. \nDet rekommenderas att använda serverns IP-adress eller domännamnet."
+ },
+ "recomendations": {
+ "address": "Adress",
+ "contact": "Kontakta",
+ "phone": "Telefon",
+ "recommendation": "Rekommendation",
+ "website": "Webbplats"
}
}
diff --git a/frontend/src/locales/zh.json b/frontend/src/locales/zh.json
index 6a43eb2..3161fe8 100644
--- a/frontend/src/locales/zh.json
+++ b/frontend/src/locales/zh.json
@@ -220,7 +220,8 @@
"will_be_marked": "保存冒险后将被标记为已访问。",
"cities_updated": "城市已更新",
"create_adventure": "创造冒险",
- "no_adventures_to_recommendations": "没有发现任何冒险。\n至少添加一次冒险以获得推荐。"
+ "no_adventures_to_recommendations": "没有发现任何冒险。\n至少添加一次冒险以获得推荐。",
+ "finding_recommendations": "为您的下一次冒险发现隐藏的宝石"
},
"home": {
"desc_1": "轻松发现、规划和探索",
@@ -546,5 +547,12 @@
"update_integration": "更新集成",
"documentation": "Immich 集成文档",
"localhost_note": "注意:除非您相应地设置了 docker 网络,否则 localhost 很可能无法工作。\n建议使用服务器的IP地址或域名。"
+ },
+ "recomendations": {
+ "address": "地址",
+ "contact": "接触",
+ "phone": "电话",
+ "recommendation": "推荐",
+ "website": "网站"
}
}
diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte
index 1653708..3a4c1f7 100644
--- a/frontend/src/routes/collections/[id]/+page.svelte
+++ b/frontend/src/routes/collections/[id]/+page.svelte
@@ -1022,13 +1022,12 @@
- {recomendation.name || 'Recommendation'}
+ {recomendation.name || $t('recomendations.recommendation')}
{recomendation.tag}
-
{recomendation.description || 'No description available.'}
{#if recomendation.address}
- Address:
+ {$t('recomendations.address')}:
{recomendation.address.housenumber}
{recomendation.address.street}, {recomendation.address.city}, {recomendation
.address.state}
@@ -1037,15 +1036,16 @@
{/if}
{#if recomendation.contact}
- Contact:
+ {$t('recomendations.contact')}:
{#if recomendation.contact.phone}
- Phone: {recomendation.contact.phone}
+ {$t('recomendations.phone')}: {recomendation.contact.phone}
{/if}
{#if recomendation.contact.email}
- Email: {recomendation.contact.email}
+ {$t('auth.email')}: {recomendation.contact.email}
{/if}
{#if recomendation.contact.website}
- Website: {recomendation.contact.website}
- Discovering hidden gems for your next adventure...
+ {$t('adventures.finding_recommendations')}...
From d60945d5b70dcf5acfd9545f9d1d0af8eb639621 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sat, 18 Jan 2025 12:28:14 -0500
Subject: [PATCH 02/30] feat: implement global search functionality for
adventures, collections, users, and locations
---
backend/server/adventures/managers.py | 22 ++
backend/server/adventures/models.py | 5 +-
backend/server/adventures/urls.py | 1 +
backend/server/adventures/views/__init__.py | 3 +-
.../adventures/views/adventure_image_view.py | 4 -
.../server/adventures/views/adventure_view.py | 273 +++++-------------
.../adventures/views/collection_view.py | 1 -
.../views/generate_description_view.py | 11 +-
.../adventures/views/global_search_view.py | 71 +++++
.../src/lib/components/AdventureModal.svelte | 4 +
10 files changed, 186 insertions(+), 209 deletions(-)
create mode 100644 backend/server/adventures/managers.py
create mode 100644 backend/server/adventures/views/global_search_view.py
diff --git a/backend/server/adventures/managers.py b/backend/server/adventures/managers.py
new file mode 100644
index 0000000..6d8d43c
--- /dev/null
+++ b/backend/server/adventures/managers.py
@@ -0,0 +1,22 @@
+from django.db import models
+from django.db.models import Q
+
+class AdventureManager(models.Manager):
+ def retrieve_adventures(self, user, include_owned=False, include_shared=False, include_public=False):
+ # Initialize the query with an empty Q object
+ query = Q()
+
+ # Add owned adventures to the query if included
+ if include_owned:
+ query |= Q(user_id=user.id)
+
+ # Add shared adventures to the query if included
+ if include_shared:
+ query |= Q(collection__shared_with=user.id)
+
+ # Add public adventures to the query if included
+ if include_public:
+ query |= Q(is_public=True)
+
+ # Perform the query with the final Q object and remove duplicates
+ return self.filter(query).distinct()
diff --git a/backend/server/adventures/models.py b/backend/server/adventures/models.py
index c77bc4d..779d7f6 100644
--- a/backend/server/adventures/models.py
+++ b/backend/server/adventures/models.py
@@ -4,12 +4,13 @@ from typing import Iterable
import uuid
from django.db import models
from django.utils.deconstruct import deconstructible
-
+from adventures.managers import AdventureManager
from django.contrib.auth import get_user_model
from django.contrib.postgres.fields import ArrayField
from django.forms import ValidationError
from django_resized import ResizedImageField
+
ADVENTURE_TYPES = [
('general', 'General 🌍'),
('outdoor', 'Outdoor 🏞️'),
@@ -88,6 +89,8 @@ class Adventure(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
+ objects = AdventureManager()
+
# DEPRECATED FIELDS - TO BE REMOVED IN FUTURE VERSIONS
# Migrations performed in this version will remove these fields
# image = ResizedImageField(force_format="WEBP", quality=75, null=True, blank=True, upload_to='images/')
diff --git a/backend/server/adventures/urls.py b/backend/server/adventures/urls.py
index c28478e..cc59670 100644
--- a/backend/server/adventures/urls.py
+++ b/backend/server/adventures/urls.py
@@ -16,6 +16,7 @@ router.register(r'reverse-geocode', ReverseGeocodeViewSet, basename='reverse-geo
router.register(r'categories', CategoryViewSet, basename='categories')
router.register(r'ics-calendar', IcsCalendarGeneratorViewSet, basename='ics-calendar')
router.register(r'overpass', OverpassViewSet, basename='overpass')
+router.register(r'search', GlobalSearchView, basename='search')
urlpatterns = [
diff --git a/backend/server/adventures/views/__init__.py b/backend/server/adventures/views/__init__.py
index 7b0d335..5920619 100644
--- a/backend/server/adventures/views/__init__.py
+++ b/backend/server/adventures/views/__init__.py
@@ -10,4 +10,5 @@ from .note_view import *
from .overpass_view import *
from .reverse_geocode_view import *
from .stats_view import *
-from .transportation_view import *
\ No newline at end of file
+from .transportation_view import *
+from .global_search_view import *
\ No newline at end of file
diff --git a/backend/server/adventures/views/adventure_image_view.py b/backend/server/adventures/views/adventure_image_view.py
index b4a3ce4..d76f6a5 100644
--- a/backend/server/adventures/views/adventure_image_view.py
+++ b/backend/server/adventures/views/adventure_image_view.py
@@ -11,10 +11,6 @@ class AdventureImageViewSet(viewsets.ModelViewSet):
serializer_class = AdventureImageSerializer
permission_classes = [IsAuthenticated]
- def dispatch(self, request, *args, **kwargs):
- print(f"Method: {request.method}")
- return super().dispatch(request, *args, **kwargs)
-
@action(detail=True, methods=['post'])
def image_delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
diff --git a/backend/server/adventures/views/adventure_view.py b/backend/server/adventures/views/adventure_view.py
index be86ff3..5249e00 100644
--- a/backend/server/adventures/views/adventure_view.py
+++ b/backend/server/adventures/views/adventure_view.py
@@ -1,15 +1,14 @@
from django.db import transaction
-from rest_framework.decorators import action
-from rest_framework import viewsets
-from django.db.models.functions import Lower
-from rest_framework.response import Response
-from adventures.models import Adventure, Category
from django.core.exceptions import PermissionDenied
-from adventures.serializers import AdventureSerializer
-from django.db.models import Q
+from django.db.models import Q, Max
+from django.db.models.functions import Lower
+from rest_framework import viewsets
+from rest_framework.decorators import action
+from rest_framework.response import Response
+
+from adventures.models import Adventure, Category
from adventures.permissions import IsOwnerOrSharedWithFullAccess
-from django.shortcuts import get_object_or_404
-from django.db.models import Max
+from adventures.serializers import AdventureSerializer
from adventures.utils import pagination
class AdventureViewSet(viewsets.ModelViewSet):
@@ -30,11 +29,8 @@ class AdventureViewSet(viewsets.ModelViewSet):
order_direction = 'asc'
if order_by == 'date':
- # order by the earliest visit object associated with the adventure
- queryset = queryset.annotate(latest_visit=Max('visits__start_date'))
- queryset = queryset.filter(latest_visit__isnull=False)
+ queryset = queryset.annotate(latest_visit=Max('visits__start_date')).filter(latest_visit__isnull=False)
ordering = 'latest_visit'
- # Apply case-insensitive sorting for the 'name' field
elif order_by == 'name':
queryset = queryset.annotate(lower_name=Lower('name'))
ordering = 'lower_name'
@@ -47,262 +43,138 @@ class AdventureViewSet(viewsets.ModelViewSet):
if order_direction == 'desc':
ordering = f'-{ordering}'
- # reverse ordering for updated_at field
if order_by == 'updated_at':
- if order_direction == 'asc':
- ordering = '-updated_at'
- else:
- ordering = 'updated_at'
-
- print(f"Ordering by: {ordering}") # For debugging
+ ordering = '-updated_at' if order_direction == 'asc' else 'updated_at'
if include_collections == 'false':
- queryset = queryset.filter(collection = None)
+ queryset = queryset.filter(collection=None)
return queryset.order_by(ordering)
def get_queryset(self):
- print(self.request.user)
- # if the user is not authenticated return only public adventures for retrieve action
- if not self.request.user.is_authenticated:
+ """
+ Returns the queryset for the AdventureViewSet. Unauthenticated users can only
+ retrieve public adventures, while authenticated users can access their own,
+ shared, and public adventures depending on the action.
+ """
+ user = self.request.user
+
+ if not user.is_authenticated:
+ # Unauthenticated users can only access public adventures for retrieval
if self.action == 'retrieve':
- return Adventure.objects.filter(is_public=True).distinct().order_by('-updated_at')
+ return Adventure.objects.retrieve_adventures(user, include_public=True).order_by('-updated_at')
return Adventure.objects.none()
- if self.action == 'retrieve':
- # For individual adventure retrieval, include public adventures
- return Adventure.objects.filter(
- Q(is_public=True) | Q(user_id=self.request.user.id) | Q(collection__shared_with=self.request.user)
- ).distinct().order_by('-updated_at')
- else:
- # For other actions, include user's own adventures and shared adventures
- return Adventure.objects.filter(
- Q(user_id=self.request.user.id) | Q(collection__shared_with=self.request.user)
- ).distinct().order_by('-updated_at')
-
- def retrieve(self, request, *args, **kwargs):
- queryset = self.get_queryset()
- adventure = get_object_or_404(queryset, pk=kwargs['pk'])
- serializer = self.get_serializer(adventure)
- return Response(serializer.data)
+ # Authenticated users: Handle retrieval separately
+ include_public = self.action == 'retrieve'
+ return Adventure.objects.retrieve_adventures(
+ user,
+ include_public=include_public,
+ include_owned=True,
+ include_shared=True
+ ).order_by('-updated_at')
def perform_update(self, serializer):
adventure = serializer.save()
if adventure.collection:
adventure.is_public = adventure.collection.is_public
adventure.save()
-
+
@action(detail=False, methods=['get'])
def filtered(self, request):
types = request.query_params.get('types', '').split(',')
is_visited = request.query_params.get('is_visited', 'all')
- # Handle case where types is all
if 'all' in types:
types = Category.objects.filter(user_id=request.user).values_list('name', flat=True)
-
else:
- for type in types:
- if not Category.objects.filter(user_id=request.user, name=type).exists():
- return Response({"error": f"Category {type} does not exist"}, status=400)
-
- if not types:
- return Response({"error": "At least one type must be provided"}, status=400)
+ if not types or not all(
+ Category.objects.filter(user_id=request.user, name=type).exists() for type in types
+ ):
+ return Response({"error": "Invalid category or no types provided"}, status=400)
queryset = Adventure.objects.filter(
category__in=Category.objects.filter(name__in=types, user_id=request.user),
user_id=request.user.id
)
- # Handle is_visited filtering
- if is_visited.lower() == 'true':
- serializer = self.get_serializer(queryset, many=True)
- filtered_ids = [
- adventure.id for adventure, serialized_adventure in zip(queryset, serializer.data)
- if serialized_adventure['is_visited']
- ]
- queryset = queryset.filter(id__in=filtered_ids)
- elif is_visited.lower() == 'false':
- serializer = self.get_serializer(queryset, many=True)
- filtered_ids = [
- adventure.id for adventure, serialized_adventure in zip(queryset, serializer.data)
- if not serialized_adventure['is_visited']
- ]
- queryset = queryset.filter(id__in=filtered_ids)
- # If is_visited is 'all' or any other value, we don't apply additional filtering
+ if is_visited.lower() in ['true', 'false']:
+ is_visited_bool = is_visited.lower() == 'true'
+ queryset = queryset.filter(is_visited=is_visited_bool)
- # Apply sorting
queryset = self.apply_sorting(queryset)
+ return self.paginate_and_respond(queryset, request)
- # Paginate and respond
- adventures = self.paginate_and_respond(queryset, request)
- return adventures
-
@action(detail=False, methods=['get'])
def all(self, request):
if not request.user.is_authenticated:
return Response({"error": "User is not authenticated"}, status=400)
- include_collections = request.query_params.get('include_collections', 'false')
- if include_collections not in ['true', 'false']:
- include_collections = 'false'
- if include_collections == 'true':
- queryset = Adventure.objects.filter(
- Q(is_public=True) | Q(user_id=request.user.id)
- )
- else:
- queryset = Adventure.objects.filter(
- Q(is_public=True) | Q(user_id=request.user.id), collection=None
- )
+ include_collections = request.query_params.get('include_collections', 'false') == 'true'
queryset = Adventure.objects.filter(
- Q(user_id=request.user.id)
+ Q(is_public=True) | Q(user_id=request.user.id),
+ collection=None if not include_collections else Q()
)
+
queryset = self.apply_sorting(queryset)
serializer = self.get_serializer(queryset, many=True)
-
return Response(serializer.data)
-
+
@action(detail=False, methods=['get'])
def search(self, request):
- query = self.request.query_params.get('query', '')
- property = self.request.query_params.get('property', 'all')
+ query = request.query_params.get('query', '')
+ property = request.query_params.get('property', 'all')
+
if len(query) < 2:
return Response({"error": "Query must be at least 2 characters long"}, status=400)
-
- if property not in ['name', 'type', 'location', 'description', 'activity_types']:
+
+ valid_properties = ['name', 'location', 'description', 'activity_types']
+ if property not in valid_properties:
property = 'all'
- queryset = Adventure.objects.none()
+ filters = {
+ 'name': Q(name__icontains=query),
+ 'location': Q(location__icontains=query),
+ 'description': Q(description__icontains=query),
+ 'activity_types': Q(activity_types__icontains=query),
+ 'all': Q(name__icontains=query) | Q(description__icontains=query) |
+ Q(location__icontains=query) | Q(activity_types__icontains=query)
+ }
- if property == 'name':
- queryset = Adventure.objects.filter(
- (Q(name__icontains=query)) &
- (Q(user_id=request.user.id) | Q(is_public=True))
- )
- elif property == 'type':
- queryset = Adventure.objects.filter(
- (Q(type__icontains=query)) &
- (Q(user_id=request.user.id) | Q(is_public=True))
- )
- elif property == 'location':
- queryset = Adventure.objects.filter(
- (Q(location__icontains=query)) &
- (Q(user_id=request.user.id) | Q(is_public=True))
- )
- elif property == 'description':
- queryset = Adventure.objects.filter(
- (Q(description__icontains=query)) &
- (Q(user_id=request.user.id) | Q(is_public=True))
- )
- elif property == 'activity_types':
- queryset = Adventure.objects.filter(
- (Q(activity_types__icontains=query)) &
- (Q(user_id=request.user.id) | Q(is_public=True))
- )
- else:
- queryset = Adventure.objects.filter(
- (Q(name__icontains=query) | Q(description__icontains=query) | Q(location__icontains=query) | Q(activity_types__icontains=query)) &
- (Q(user_id=request.user.id) | Q(is_public=True))
+ queryset = Adventure.objects.filter(
+ filters[property] & (Q(user_id=request.user.id) | Q(is_public=True))
)
-
+
queryset = self.apply_sorting(queryset)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
-
+
def update(self, request, *args, **kwargs):
- # Retrieve the current object
instance = self.get_object()
-
- # Partially update the instance with the request data
serializer = self.get_serializer(instance, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
- # if the adventure is trying to have is_public changed and its part of a collection return an error
- if new_collection is not None:
- serializer.validated_data['is_public'] = new_collection.is_public
- elif instance.collection:
- serializer.validated_data['is_public'] = instance.collection.is_public
-
-
- # Retrieve the collection from the validated data
new_collection = serializer.validated_data.get('collection')
-
- user = request.user
- print(new_collection)
-
- if new_collection is not None and new_collection!=instance.collection:
- # Check if the user is the owner of the new collection
- if new_collection.user_id != user or instance.user_id != user:
+ if new_collection and new_collection!=instance.collection:
+ if new_collection.user_id != request.user or instance.user_id != request.user:
raise PermissionDenied("You do not have permission to use this collection.")
- elif new_collection is None:
- # Handle the case where the user is trying to set the collection to None
- if instance.collection is not None and instance.collection.user_id != user:
- raise PermissionDenied("You cannot remove the collection as you are not the owner.")
-
- # Perform the update
+ elif new_collection is None and instance.collection and instance.collection.user_id != request.user:
+ raise PermissionDenied("You cannot remove the collection as you are not the owner.")
+
self.perform_update(serializer)
-
- # Return the updated instance
- return Response(serializer.data)
-
- def partial_update(self, request, *args, **kwargs):
- # Retrieve the current object
- instance = self.get_object()
-
- # Partially update the instance with the request data
- serializer = self.get_serializer(instance, data=request.data, partial=True)
- serializer.is_valid(raise_exception=True)
-
- # Retrieve the collection from the validated data
- new_collection = serializer.validated_data.get('collection')
-
- user = request.user
- print(new_collection)
-
- # if the adventure is trying to have is_public changed and its part of a collection return an error
- if new_collection is not None:
- serializer.validated_data['is_public'] = new_collection.is_public
- elif instance.collection:
- serializer.validated_data['is_public'] = instance.collection.is_public
-
- if new_collection is not None and new_collection!=instance.collection:
- # Check if the user is the owner of the new collection
- if new_collection.user_id != user or instance.user_id != user:
- raise PermissionDenied("You do not have permission to use this collection.")
- elif new_collection is None:
- # Handle the case where the user is trying to set the collection to None
- if instance.collection is not None and instance.collection.user_id != user:
- raise PermissionDenied("You cannot remove the collection as you are not the owner.")
-
- # Perform the update
- self.perform_update(serializer)
-
- # Return the updated instance
return Response(serializer.data)
- def perform_update(self, serializer):
- serializer.save()
-
- # when creating an adventure, make sure the user is the owner of the collection or shared with the collection
@transaction.atomic
def perform_create(self, serializer):
- # Retrieve the collection from the validated data
collection = serializer.validated_data.get('collection')
-
- # Check if a collection is provided
- if collection:
- user = self.request.user
- # Check if the user is the owner or is in the shared_with list
- if collection.user_id != user and not collection.shared_with.filter(id=user.id).exists():
- # Return an error response if the user does not have permission
- raise PermissionDenied("You do not have permission to use this collection.")
- # if collection the owner of the adventure is the owner of the collection
- # set the is_public field of the adventure to the is_public field of the collection
+
+ if collection and not (collection.user_id == self.request.user or collection.shared_with.filter(id=self.request.user.id).exists()):
+ raise PermissionDenied("You do not have permission to use this collection.")
+ elif collection:
serializer.save(user_id=collection.user_id, is_public=collection.is_public)
return
- # Save the adventure with the current user as the owner
- serializer.save(user_id=self.request.user)
+ serializer.save(user_id=self.request.user, is_public=collection.is_public if collection else False)
def paginate_and_respond(self, queryset, request):
paginator = self.pagination_class()
@@ -310,5 +182,6 @@ class AdventureViewSet(viewsets.ModelViewSet):
if page is not None:
serializer = self.get_serializer(page, many=True)
return paginator.get_paginated_response(serializer.data)
+
serializer = self.get_serializer(queryset, many=True)
- return Response(serializer.data)
\ No newline at end of file
+ return Response(serializer.data)
diff --git a/backend/server/adventures/views/collection_view.py b/backend/server/adventures/views/collection_view.py
index 7e35d64..f0529ee 100644
--- a/backend/server/adventures/views/collection_view.py
+++ b/backend/server/adventures/views/collection_view.py
@@ -216,4 +216,3 @@ class CollectionViewSet(viewsets.ModelViewSet):
return paginator.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
-
diff --git a/backend/server/adventures/views/generate_description_view.py b/backend/server/adventures/views/generate_description_view.py
index 154bdc1..988773a 100644
--- a/backend/server/adventures/views/generate_description_view.py
+++ b/backend/server/adventures/views/generate_description_view.py
@@ -12,7 +12,7 @@ class GenerateDescription(viewsets.ViewSet):
name = self.request.query_params.get('name', '')
# un url encode the name
name = name.replace('%20', ' ')
- print(name)
+ name = self.get_search_term(name)
url = 'https://en.wikipedia.org/w/api.php?origin=*&action=query&prop=extracts&exintro&explaintext&format=json&titles=%s' % name
response = requests.get(url)
data = response.json()
@@ -27,6 +27,7 @@ class GenerateDescription(viewsets.ViewSet):
name = self.request.query_params.get('name', '')
# un url encode the name
name = name.replace('%20', ' ')
+ name = self.get_search_term(name)
url = 'https://en.wikipedia.org/w/api.php?origin=*&action=query&prop=pageimages&format=json&piprop=original&titles=%s' % name
response = requests.get(url)
data = response.json()
@@ -34,4 +35,10 @@ class GenerateDescription(viewsets.ViewSet):
extract = data["query"]["pages"][page_id]
if extract.get('original') is None:
return Response({"error": "No image found"}, status=400)
- return Response(extract["original"])
\ No newline at end of file
+ return Response(extract["original"])
+
+ def get_search_term(self, term):
+ response = requests.get(f'https://en.wikipedia.org/w/api.php?action=opensearch&search={term}&limit=10&namespace=0&format=json')
+ data = response.json()
+ if data[1] and len(data[1]) > 0:
+ return data[1][0]
\ No newline at end of file
diff --git a/backend/server/adventures/views/global_search_view.py b/backend/server/adventures/views/global_search_view.py
new file mode 100644
index 0000000..3780629
--- /dev/null
+++ b/backend/server/adventures/views/global_search_view.py
@@ -0,0 +1,71 @@
+
+from rest_framework import viewsets
+from rest_framework.response import Response
+from rest_framework.permissions import IsAuthenticated
+from adventures.models import Adventure, Collection
+from adventures.serializers import AdventureSerializer, CollectionSerializer
+from django.db.models import Q
+from adventures.utils import pagination
+from worldtravel.models import Country, Region, City
+from worldtravel.serializers import CountrySerializer, RegionSerializer, CitySerializer
+from users.models import CustomUser as User
+from users.serializers import CustomUserDetailsSerializer as UserSerializer
+
+class GlobalSearchView(viewsets.ViewSet):
+ permission_classes = [IsAuthenticated]
+ pagination_class = pagination.StandardResultsSetPagination
+
+ def list(self, request):
+ search_term = request.query_params.get('query', '')
+ # print(f"Searching for: {search_term}") # For debugging
+
+ if not search_term:
+ return Response({"error": "Search query is required"}, status=400)
+
+ # Search for adventures
+ adventures = Adventure.objects.filter(
+ (Q(name__icontains=search_term) | Q(description__icontains=search_term) | Q(location__icontains=search_term)) & Q(user_id=request.user.id)
+ )
+
+ # Search for collections
+ collections = Collection.objects.filter(
+ Q(name__icontains=search_term) & Q(user_id=request.user.id)
+ )
+
+ # Search for users
+ users = User.objects.filter(
+ (Q(username__icontains=search_term) | Q(first_name__icontains=search_term) | Q(last_name__icontains=search_term)) & Q(public_profile=True)
+ )
+
+ # Search for countries
+ countries = Country.objects.filter(
+ Q(name__icontains=search_term) | Q(country_code__icontains=search_term)
+ )
+
+ # Search for regions
+ regions = Region.objects.filter(
+ Q(name__icontains=search_term) | Q(country__name__icontains=search_term)
+ )
+
+ # Search for cities
+ cities = City.objects.filter(
+ Q(name__icontains=search_term) | Q(region__name__icontains=search_term) | Q(region__country__name__icontains=search_term)
+ )
+
+ # Serialize the results
+ adventure_serializer = AdventureSerializer(adventures, many=True)
+ collection_serializer = CollectionSerializer(collections, many=True)
+ user_serializer = UserSerializer(users, many=True)
+ country_serializer = CountrySerializer(countries, many=True)
+ region_serializer = RegionSerializer(regions, many=True)
+ city_serializer = CitySerializer(cities, many=True)
+
+ return Response({
+ "adventures": adventure_serializer.data,
+ "collections": collection_serializer.data,
+ "users": user_serializer.data,
+ "countries": country_serializer.data,
+ "regions": region_serializer.data,
+ "cities": city_serializer.data
+ })
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte
index 1e9b1b4..5b0ce94 100644
--- a/frontend/src/lib/components/AdventureModal.svelte
+++ b/frontend/src/lib/components/AdventureModal.svelte
@@ -289,6 +289,7 @@
let res = await fetch(imageUrl);
let blob = await res.blob();
let file = new File([blob], `${imageSearch}.jpg`, { type: 'image/jpeg' });
+ wikiImageError = '';
let formData = new FormData();
formData.append('image', file);
formData.append('adventure', adventure.id);
@@ -1097,6 +1098,9 @@ it would also work to just use on:click on the MapLibre component itself. -->
{$t('adventures.fetch_image')}
+ {#if wikiImageError}
+ {$t('adventures.wiki_image_error')}
+ {/if}
{#if immichIntegration}
From f10e171a8ec9cd2a848866ea6c1aed305dd21b8f Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sat, 18 Jan 2025 12:57:56 -0500
Subject: [PATCH 03/30] fix: update RegionCard component to handle undefined
visited state and refactor global search API to return structured results
---
.../adventures/views/global_search_view.py | 92 ++++----
frontend/src/lib/components/RegionCard.svelte | 6 +-
frontend/src/routes/search/+page.server.ts | 43 ++--
frontend/src/routes/search/+page.svelte | 212 ++++++------------
4 files changed, 129 insertions(+), 224 deletions(-)
diff --git a/backend/server/adventures/views/global_search_view.py b/backend/server/adventures/views/global_search_view.py
index 3780629..d2fa5d3 100644
--- a/backend/server/adventures/views/global_search_view.py
+++ b/backend/server/adventures/views/global_search_view.py
@@ -1,71 +1,73 @@
-
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
+from django.db.models import Q
+from django.contrib.postgres.search import SearchVector, SearchQuery
from adventures.models import Adventure, Collection
from adventures.serializers import AdventureSerializer, CollectionSerializer
-from django.db.models import Q
-from adventures.utils import pagination
-from worldtravel.models import Country, Region, City
-from worldtravel.serializers import CountrySerializer, RegionSerializer, CitySerializer
+from worldtravel.models import Country, Region, City, VisitedCity, VisitedRegion
+from worldtravel.serializers import CountrySerializer, RegionSerializer, CitySerializer, VisitedCitySerializer, VisitedRegionSerializer
from users.models import CustomUser as User
from users.serializers import CustomUserDetailsSerializer as UserSerializer
class GlobalSearchView(viewsets.ViewSet):
permission_classes = [IsAuthenticated]
- pagination_class = pagination.StandardResultsSetPagination
def list(self, request):
- search_term = request.query_params.get('query', '')
- # print(f"Searching for: {search_term}") # For debugging
-
+ search_term = request.query_params.get('query', '').strip()
if not search_term:
return Response({"error": "Search query is required"}, status=400)
- # Search for adventures
- adventures = Adventure.objects.filter(
- (Q(name__icontains=search_term) | Q(description__icontains=search_term) | Q(location__icontains=search_term)) & Q(user_id=request.user.id)
- )
+ # Initialize empty results
+ results = {
+ "adventures": [],
+ "collections": [],
+ "users": [],
+ "countries": [],
+ "regions": [],
+ "cities": [],
+ "visited_regions": [],
+ "visited_cities": []
+ }
- # Search for collections
+ # Adventures: Full-Text Search
+ adventures = Adventure.objects.annotate(
+ search=SearchVector('name', 'description', 'location')
+ ).filter(search=SearchQuery(search_term), user_id=request.user)
+ results["adventures"] = AdventureSerializer(adventures, many=True).data
+
+ # Collections: Partial Match Search
collections = Collection.objects.filter(
- Q(name__icontains=search_term) & Q(user_id=request.user.id)
+ Q(name__icontains=search_term) & Q(user_id=request.user)
)
+ results["collections"] = CollectionSerializer(collections, many=True).data
- # Search for users
+ # Users: Public Profiles Only
users = User.objects.filter(
- (Q(username__icontains=search_term) | Q(first_name__icontains=search_term) | Q(last_name__icontains=search_term)) & Q(public_profile=True)
+ (Q(username__icontains=search_term) |
+ Q(first_name__icontains=search_term) |
+ Q(last_name__icontains=search_term)) & Q(public_profile=True)
)
+ results["users"] = UserSerializer(users, many=True).data
- # Search for countries
- countries = Country.objects.filter(
- Q(name__icontains=search_term) | Q(country_code__icontains=search_term)
- )
+ # Countries: Full-Text Search
+ countries = Country.objects.annotate(
+ search=SearchVector('name', 'country_code')
+ ).filter(search=SearchQuery(search_term))
+ results["countries"] = CountrySerializer(countries, many=True).data
- # Search for regions
- regions = Region.objects.filter(
- Q(name__icontains=search_term) | Q(country__name__icontains=search_term)
- )
+ # Regions and Cities: Partial Match Search
+ regions = Region.objects.filter(Q(name__icontains=search_term))
+ results["regions"] = RegionSerializer(regions, many=True).data
- # Search for cities
- cities = City.objects.filter(
- Q(name__icontains=search_term) | Q(region__name__icontains=search_term) | Q(region__country__name__icontains=search_term)
- )
+ cities = City.objects.filter(Q(name__icontains=search_term))
+ results["cities"] = CitySerializer(cities, many=True).data
- # Serialize the results
- adventure_serializer = AdventureSerializer(adventures, many=True)
- collection_serializer = CollectionSerializer(collections, many=True)
- user_serializer = UserSerializer(users, many=True)
- country_serializer = CountrySerializer(countries, many=True)
- region_serializer = RegionSerializer(regions, many=True)
- city_serializer = CitySerializer(cities, many=True)
+ # Visited Regions and Cities
+ visited_regions = VisitedRegion.objects.filter(user_id=request.user)
+ results["visited_regions"] = VisitedRegionSerializer(visited_regions, many=True).data
- return Response({
- "adventures": adventure_serializer.data,
- "collections": collection_serializer.data,
- "users": user_serializer.data,
- "countries": country_serializer.data,
- "regions": region_serializer.data,
- "cities": city_serializer.data
- })
-
\ No newline at end of file
+ visited_cities = VisitedCity.objects.filter(user_id=request.user)
+ results["visited_cities"] = VisitedCitySerializer(visited_cities, many=True).data
+
+ return Response(results)
diff --git a/frontend/src/lib/components/RegionCard.svelte b/frontend/src/lib/components/RegionCard.svelte
index 5acd3a9..a5fc538 100644
--- a/frontend/src/lib/components/RegionCard.svelte
+++ b/frontend/src/lib/components/RegionCard.svelte
@@ -7,7 +7,7 @@
import { t } from 'svelte-i18n';
export let region: Region;
- export let visited: boolean;
+ export let visited: boolean | undefined;
function goToCity() {
console.log(region);
@@ -64,12 +64,12 @@
- {#if !visited}
+ {#if !visited && visited !== undefined}
{$t('adventures.mark_visited')}
{/if}
- {#if visited}
+ {#if visited && visited !== undefined}
{$t('adventures.remove')}
{/if}
{#if region.num_cities > 0}
diff --git a/frontend/src/routes/search/+page.server.ts b/frontend/src/routes/search/+page.server.ts
index 8ff7e23..250bc96 100644
--- a/frontend/src/routes/search/+page.server.ts
+++ b/frontend/src/routes/search/+page.server.ts
@@ -8,7 +8,6 @@ const serverEndpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
export const load = (async (event) => {
const query = event.url.searchParams.get('query');
- const property = event.url.searchParams.get('property') || 'all';
if (!query) {
return { data: [] };
@@ -16,15 +15,12 @@ export const load = (async (event) => {
let sessionId = event.cookies.get('sessionid');
- let res = await fetch(
- `${serverEndpoint}/api/adventures/search/?query=${query}&property=${property}`,
- {
- headers: {
- 'Content-Type': 'application/json',
- Cookie: `sessionid=${sessionId}`
- }
+ let res = await fetch(`${serverEndpoint}/api/search/?query=${query}`, {
+ headers: {
+ 'Content-Type': 'application/json',
+ Cookie: `sessionid=${sessionId}`
}
- );
+ });
if (!res.ok) {
console.error('Failed to fetch search data');
@@ -32,27 +28,16 @@ export const load = (async (event) => {
return { error: error.error };
}
- let adventures: Adventure[] = await res.json();
-
- let osmRes = await fetch(`https://nominatim.openstreetmap.org/search?q=${query}&format=jsonv2`, {
- headers: {
- 'User-Agent': `AdventureLog / ${appVersion} `
- }
- });
-
- if (!osmRes.ok) {
- console.error('Failed to fetch OSM data');
- let error = await res.json();
- return { error: error.error };
- }
-
- let osmData = (await osmRes.json()) as OpenStreetMapPlace[];
+ let data = await res.json();
return {
- props: {
- adventures,
- query,
- osmData
- }
+ adventures: data.adventures,
+ collections: data.collections,
+ users: data.users,
+ countries: data.countries,
+ regions: data.regions,
+ cities: data.cities,
+ visited_cities: data.visited_cities,
+ visited_regions: data.visited_regions
};
}) satisfies PageServerLoad;
diff --git a/frontend/src/routes/search/+page.svelte b/frontend/src/routes/search/+page.svelte
index 6c35530..f45e6be 100644
--- a/frontend/src/routes/search/+page.svelte
+++ b/frontend/src/routes/search/+page.svelte
@@ -1,184 +1,102 @@
-{#if isAdventureModalOpen}
-
(isAdventureModalOpen = false)}
- on:save={filterByProperty}
- />
-{/if}
+Search{query ? `: ${query}` : ''}
-{#if myAdventures.length === 0 && osmResults.length === 0}
-
-{/if}
-
-{#if myAdventures.length !== 0}
- {$t('search.adventurelog_results')}
-
-
- (property = 'all')}
- />
- (property = 'name')}
- />
- (property = 'location')}
- />
- (property = 'description')}
- />
- (property = 'activity_types')}
- />
-
-
{$t('adventures.filter')}
+{#if adventures.length > 0}
+
Adventures
+
+ {#each adventures as adventure}
+
+ {/each}
{/if}
-{#if myAdventures.length > 0}
-
{$t('adventures.my_adventures')}
-
- {#each myAdventures as adventure}
-
0}
+ Collections
+
+ {#each collections as collection}
+
+ {/each}
+
+{/if}
+
+{#if countries.length > 0}
+ Countries
+
+ {#each countries as country}
+
+ {/each}
+
+{/if}
+
+{#if regions.length > 0}
+ Regions
+
+ {#each regions as region}
+ visitedRegion.region === region.id)}
/>
{/each}
{/if}
-{#if publicAdventures.length > 0}
- {$t('search.public_adventures')}
-
- {#each publicAdventures as adventure}
-
+{#if cities.length > 0}
+
Cities
+
+ {#each cities as city}
+ visitedCity.city === city.id)}
+ />
{/each}
{/if}
-{#if myAdventures.length > 0 && osmResults.length > 0 && publicAdventures.length > 0}
-
-{/if}
-{#if osmResults.length > 0}
-
{$t('search.online_results')}
-
- {#each osmResults as result}
-
-
{result.display_name}
-
{result.type}
-
{result.lat}, {result.lon}
-
+
+{#if users.length > 0}
+
Users
+
+ {#each users as user}
+
{/each}
{/if}
+{#if adventures.length === 0 && regions.length === 0 && cities.length === 0 && countries.length === 0 && collections.length === 0 && users.length === 0}
+
+ {$t('adventures.no_results')}
+
+{/if}
+
Search{query ? `: ${query}` : ''}
From 433599dc20625b84af9d792f5e720a79d1df1bf0 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sat, 18 Jan 2025 17:03:03 -0500
Subject: [PATCH 04/30] feat: implement protected media serving and permission
checks for adventure images
---
backend/nginx.conf | 12 ++-
.../utils/check_adventure_image_permisison.py | 33 +++++++
backend/server/main/settings.py | 2 +-
backend/server/main/urls.py | 13 ++-
backend/server/main/views.py | 30 ++++++-
frontend/src/lib/components/Navbar.svelte | 87 ++++++++++---------
frontend/src/routes/search/+page.server.ts | 8 +-
7 files changed, 130 insertions(+), 55 deletions(-)
create mode 100644 backend/server/adventures/utils/check_adventure_image_permisison.py
diff --git a/backend/nginx.conf b/backend/nginx.conf
index b4bad7d..8074aa6 100644
--- a/backend/nginx.conf
+++ b/backend/nginx.conf
@@ -19,7 +19,7 @@ http {
}
server {
- listen 80; # NGINX listens on port 80 inside the container
+ listen 80;
server_name localhost;
location / {
@@ -34,8 +34,12 @@ http {
alias /code/staticfiles/; # Serve static files directly
}
- location /media/ {
- alias /code/media/; # Serve media files directly
+ # Serve protected media files with X-Accel-Redirect
+ location /protectedMedia/ {
+ internal; # Only internal requests are allowed
+ alias /code/media/; # This should match Django MEDIA_ROOT
+ try_files $uri =404; # Return a 404 if the file doesn't exist
}
+
}
-}
\ No newline at end of file
+}
diff --git a/backend/server/adventures/utils/check_adventure_image_permisison.py b/backend/server/adventures/utils/check_adventure_image_permisison.py
new file mode 100644
index 0000000..ad7df57
--- /dev/null
+++ b/backend/server/adventures/utils/check_adventure_image_permisison.py
@@ -0,0 +1,33 @@
+from adventures.models import AdventureImage
+
+def checkAdventureImagePermission(imageId, user):
+ """
+ Checks if the given user has permission to access the specified adventure image.
+
+ Args:
+ imageId (str): The ID of the image to check permissions for.
+ user (User): The user object to check permissions against.
+
+ Returns:
+ bool: True if the user has permission to access the image, False otherwise.
+
+ Raises:
+ AdventureImage.DoesNotExist: If the image with the specified ID does not exist.
+ """
+ try:
+ # Construct the full relative path to match the database field
+ image_path = f"images/{imageId}"
+ # Fetch the AdventureImage object
+ adventure = AdventureImage.objects.get(image=image_path).adventure
+ if adventure.is_public:
+ return True
+ elif adventure.user_id == user:
+ return True
+ elif adventure.collection:
+ if adventure.collection.shared_with.filter(id=user.id).exists():
+ return True
+ else:
+ return False
+ except AdventureImage.DoesNotExist:
+ print('No image')
+ return False
diff --git a/backend/server/main/settings.py b/backend/server/main/settings.py
index 208b2a1..83ab09a 100644
--- a/backend/server/main/settings.py
+++ b/backend/server/main/settings.py
@@ -157,7 +157,7 @@ STATIC_ROOT = BASE_DIR / "staticfiles"
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
-MEDIA_ROOT = BASE_DIR / 'media'
+MEDIA_ROOT = BASE_DIR / 'media' # This path must match the NGINX root
STATICFILES_DIRS = [BASE_DIR / 'static']
STORAGES = {
diff --git a/backend/server/main/urls.py b/backend/server/main/urls.py
index 571946e..b7bb2a1 100644
--- a/backend/server/main/urls.py
+++ b/backend/server/main/urls.py
@@ -1,12 +1,9 @@
from django.urls import include, re_path, path
from django.contrib import admin
from django.views.generic import RedirectView, TemplateView
-from django.conf import settings
-from django.conf.urls.static import static
from users.views import IsRegistrationDisabled, PublicUserListView, PublicUserDetailView, UserMetadataView, UpdateUserMetadataView, EnabledSocialProvidersView
-from .views import get_csrf_token, get_public_url
+from .views import get_csrf_token, get_public_url, serve_protected_media
from drf_yasg.views import get_schema_view
-
from drf_yasg import openapi
schema_view = get_schema_view(
@@ -20,6 +17,9 @@ urlpatterns = [
path('api/', include('worldtravel.urls')),
path("_allauth/", include("allauth.headless.urls")),
+ # Serve protected media files
+ re_path(r'^media/(?P.*)$', serve_protected_media, name='serve-protected-media'),
+
path('auth/is-registration-disabled/', IsRegistrationDisabled.as_view(), name='is_registration_disabled'),
path('auth/users/', PublicUserListView.as_view(), name='public-user-list'),
path('auth/user//', PublicUserDetailView.as_view(), name='public-user-detail'),
@@ -44,6 +44,5 @@ urlpatterns = [
path("api/integrations/", include("integrations.urls")),
- # Include the API endpoints:
-
-] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+ # Include the API endpoints:
+]
\ No newline at end of file
diff --git a/backend/server/main/views.py b/backend/server/main/views.py
index f21082b..594017b 100644
--- a/backend/server/main/views.py
+++ b/backend/server/main/views.py
@@ -1,10 +1,38 @@
from django.http import JsonResponse
from django.middleware.csrf import get_token
from os import getenv
+from django.conf import settings
+from django.http import HttpResponse, HttpResponseForbidden
+from django.contrib.auth.decorators import login_required
+from django.views.static import serve
+from adventures.utils.check_adventure_image_permisison import checkAdventureImagePermission
def get_csrf_token(request):
csrf_token = get_token(request)
return JsonResponse({'csrfToken': csrf_token})
def get_public_url(request):
- return JsonResponse({'PUBLIC_URL': getenv('PUBLIC_URL')})
\ No newline at end of file
+ return JsonResponse({'PUBLIC_URL': getenv('PUBLIC_URL')})
+
+def serve_protected_media(request, path):
+ if path.startswith('images/'):
+ image_id = path.split('/')[1]
+ user = request.user
+ if checkAdventureImagePermission(image_id, user):
+ if settings.DEBUG:
+ # In debug mode, serve the file directly
+ return serve(request, path, document_root=settings.MEDIA_ROOT)
+ else:
+ # In production, use X-Accel-Redirect
+ response = HttpResponse()
+ response['Content-Type'] = ''
+ response['X-Accel-Redirect'] = '/protectedMedia/' + path
+ return response
+ else:
+ return HttpResponseForbidden()
+ else:
+ response = HttpResponse()
+ response['Content-Type'] = ''
+ response['X-Accel-Redirect'] = '/protectedMedia/' + path
+ return response
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/Navbar.svelte b/frontend/src/lib/components/Navbar.svelte
index bbfbaf5..13a2e85 100644
--- a/frontend/src/lib/components/Navbar.svelte
+++ b/frontend/src/lib/components/Navbar.svelte
@@ -120,27 +120,34 @@
{/if}
-
+
+
+
+
+
+ {$t('navbar.search')}
+
+ {/if}
{/if}
-
+
+ {/if}
diff --git a/frontend/src/routes/search/+page.server.ts b/frontend/src/routes/search/+page.server.ts
index 250bc96..45838a8 100644
--- a/frontend/src/routes/search/+page.server.ts
+++ b/frontend/src/routes/search/+page.server.ts
@@ -1,12 +1,14 @@
-import type { Adventure, OpenStreetMapPlace } from '$lib/types';
-import { fail } from '@sveltejs/kit';
+import { redirect } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
-import { appVersion } from '$lib/config';
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
const serverEndpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
export const load = (async (event) => {
+ if (!event.locals.user) {
+ return redirect(302, '/login');
+ }
+
const query = event.url.searchParams.get('query');
if (!query) {
From aa216f5688f8786430ef7bf7035ce73daa07fb24 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sat, 18 Jan 2025 20:06:12 -0500
Subject: [PATCH 05/30] feat: add Attachment model and implement file
permission checks for media access
---
backend/server/adventures/admin.py | 3 +-
.../adventures/migrations/0018_attachment.py | 26 ++++++++++++
backend/server/adventures/models.py | 10 +++++
.../utils/check_adventure_image_permisison.py | 33 ---------------
.../adventures/utils/file_permissions.py | 41 +++++++++++++++++++
backend/server/main/settings.py | 2 -
backend/server/main/views.py | 24 ++++++-----
7 files changed, 93 insertions(+), 46 deletions(-)
create mode 100644 backend/server/adventures/migrations/0018_attachment.py
delete mode 100644 backend/server/adventures/utils/check_adventure_image_permisison.py
create mode 100644 backend/server/adventures/utils/file_permissions.py
diff --git a/backend/server/adventures/admin.py b/backend/server/adventures/admin.py
index 5c39301..a1a1101 100644
--- a/backend/server/adventures/admin.py
+++ b/backend/server/adventures/admin.py
@@ -1,7 +1,7 @@
import os
from django.contrib import admin
from django.utils.html import mark_safe
-from .models import Adventure, Checklist, ChecklistItem, Collection, Transportation, Note, AdventureImage, Visit, Category
+from .models import Adventure, Checklist, ChecklistItem, Collection, Transportation, Note, AdventureImage, Visit, Category, Attachment
from worldtravel.models import Country, Region, VisitedRegion, City, VisitedCity
from allauth.account.decorators import secure_admin_login
@@ -139,6 +139,7 @@ admin.site.register(AdventureImage, AdventureImageAdmin)
admin.site.register(Category, CategoryAdmin)
admin.site.register(City, CityAdmin)
admin.site.register(VisitedCity)
+admin.site.register(Attachment)
admin.site.site_header = 'AdventureLog Admin'
admin.site.site_title = 'AdventureLog Admin Site'
diff --git a/backend/server/adventures/migrations/0018_attachment.py b/backend/server/adventures/migrations/0018_attachment.py
new file mode 100644
index 0000000..f41c44b
--- /dev/null
+++ b/backend/server/adventures/migrations/0018_attachment.py
@@ -0,0 +1,26 @@
+# Generated by Django 5.0.8 on 2025-01-19 00:39
+
+import django.db.models.deletion
+import uuid
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('adventures', '0017_adventureimage_is_primary'),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Attachment',
+ fields=[
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
+ ('file', models.FileField(upload_to='attachments/')),
+ ('adventure', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='adventures.adventure')),
+ ('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/backend/server/adventures/models.py b/backend/server/adventures/models.py
index 779d7f6..346c509 100644
--- a/backend/server/adventures/models.py
+++ b/backend/server/adventures/models.py
@@ -287,6 +287,16 @@ class AdventureImage(models.Model):
def __str__(self):
return self.image.url
+
+class Attachment(models.Model):
+ id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
+ user_id = models.ForeignKey(
+ User, on_delete=models.CASCADE, default=default_user_id)
+ file = models.FileField(upload_to='attachments/')
+ adventure = models.ForeignKey(Adventure, related_name='attachments', on_delete=models.CASCADE)
+
+ def __str__(self):
+ return self.file.url
class Category(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
diff --git a/backend/server/adventures/utils/check_adventure_image_permisison.py b/backend/server/adventures/utils/check_adventure_image_permisison.py
deleted file mode 100644
index ad7df57..0000000
--- a/backend/server/adventures/utils/check_adventure_image_permisison.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from adventures.models import AdventureImage
-
-def checkAdventureImagePermission(imageId, user):
- """
- Checks if the given user has permission to access the specified adventure image.
-
- Args:
- imageId (str): The ID of the image to check permissions for.
- user (User): The user object to check permissions against.
-
- Returns:
- bool: True if the user has permission to access the image, False otherwise.
-
- Raises:
- AdventureImage.DoesNotExist: If the image with the specified ID does not exist.
- """
- try:
- # Construct the full relative path to match the database field
- image_path = f"images/{imageId}"
- # Fetch the AdventureImage object
- adventure = AdventureImage.objects.get(image=image_path).adventure
- if adventure.is_public:
- return True
- elif adventure.user_id == user:
- return True
- elif adventure.collection:
- if adventure.collection.shared_with.filter(id=user.id).exists():
- return True
- else:
- return False
- except AdventureImage.DoesNotExist:
- print('No image')
- return False
diff --git a/backend/server/adventures/utils/file_permissions.py b/backend/server/adventures/utils/file_permissions.py
new file mode 100644
index 0000000..02971bc
--- /dev/null
+++ b/backend/server/adventures/utils/file_permissions.py
@@ -0,0 +1,41 @@
+from adventures.models import AdventureImage, Attachment
+
+protected_paths = ['images/', 'attachments/']
+
+def checkFilePermission(fileId, user, mediaType):
+ if mediaType not in protected_paths:
+ return True
+ if mediaType == 'images/':
+ try:
+ # Construct the full relative path to match the database field
+ image_path = f"images/{fileId}"
+ # Fetch the AdventureImage object
+ adventure = AdventureImage.objects.get(image=image_path).adventure
+ if adventure.is_public:
+ return True
+ elif adventure.user_id == user:
+ return True
+ elif adventure.collection:
+ if adventure.collection.shared_with.filter(id=user.id).exists():
+ return True
+ else:
+ return False
+ except AdventureImage.DoesNotExist:
+ return False
+ elif mediaType == 'attachments/':
+ try:
+ # Construct the full relative path to match the database field
+ attachment_path = f"attachments/{fileId}"
+ # Fetch the Attachment object
+ attachment = Attachment.objects.get(file=attachment_path).adventure
+ if attachment.is_public:
+ return True
+ elif attachment.user_id == user:
+ return True
+ elif attachment.collection:
+ if attachment.collection.shared_with.filter(id=user.id).exists():
+ return True
+ else:
+ return False
+ except Attachment.DoesNotExist:
+ return False
\ No newline at end of file
diff --git a/backend/server/main/settings.py b/backend/server/main/settings.py
index 83ab09a..d8aa026 100644
--- a/backend/server/main/settings.py
+++ b/backend/server/main/settings.py
@@ -81,8 +81,6 @@ MIDDLEWARE = (
# disable verifications for new users
ACCOUNT_EMAIL_VERIFICATION = 'none'
-ALLAUTH_UI_THEME = "night"
-
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
diff --git a/backend/server/main/views.py b/backend/server/main/views.py
index 594017b..3393e13 100644
--- a/backend/server/main/views.py
+++ b/backend/server/main/views.py
@@ -3,9 +3,8 @@ from django.middleware.csrf import get_token
from os import getenv
from django.conf import settings
from django.http import HttpResponse, HttpResponseForbidden
-from django.contrib.auth.decorators import login_required
from django.views.static import serve
-from adventures.utils.check_adventure_image_permisison import checkAdventureImagePermission
+from adventures.utils.file_permissions import checkFilePermission
def get_csrf_token(request):
csrf_token = get_token(request)
@@ -14,16 +13,19 @@ def get_csrf_token(request):
def get_public_url(request):
return JsonResponse({'PUBLIC_URL': getenv('PUBLIC_URL')})
+protected_paths = ['images/', 'attachments/']
+
def serve_protected_media(request, path):
- if path.startswith('images/'):
+ if any([path.startswith(protected_path) for protected_path in protected_paths]):
image_id = path.split('/')[1]
user = request.user
- if checkAdventureImagePermission(image_id, user):
+ media_type = path.split('/')[0] + '/'
+ if checkFilePermission(image_id, user, media_type):
if settings.DEBUG:
# In debug mode, serve the file directly
return serve(request, path, document_root=settings.MEDIA_ROOT)
else:
- # In production, use X-Accel-Redirect
+ # In production, use X-Accel-Redirect to serve the file using Nginx
response = HttpResponse()
response['Content-Type'] = ''
response['X-Accel-Redirect'] = '/protectedMedia/' + path
@@ -31,8 +33,10 @@ def serve_protected_media(request, path):
else:
return HttpResponseForbidden()
else:
- response = HttpResponse()
- response['Content-Type'] = ''
- response['X-Accel-Redirect'] = '/protectedMedia/' + path
- return response
-
\ No newline at end of file
+ if settings.DEBUG:
+ return serve(request, path, document_root=settings.MEDIA_ROOT)
+ else:
+ response = HttpResponse()
+ response['Content-Type'] = ''
+ response['X-Accel-Redirect'] = '/protectedMedia/' + path
+ return response
\ No newline at end of file
From e0fa62c1ea4f46b78ac169dc9d272f46b1056749 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sun, 19 Jan 2025 00:05:08 -0500
Subject: [PATCH 06/30] feat: add GSAP animations to signup, login, and
dashboard pages; include Attachment serializer in backend
---
backend/server/adventures/serializers.py | 25 +-
backend/server/adventures/views.py | 0
frontend/package.json | 4 +-
frontend/pnpm-lock.yaml | 393 +++++++++++++++++++++
frontend/src/routes/dashboard/+page.svelte | 61 +++-
frontend/src/routes/login/+page.svelte | 23 ++
frontend/src/routes/signup/+page.svelte | 23 ++
7 files changed, 521 insertions(+), 8 deletions(-)
delete mode 100644 backend/server/adventures/views.py
diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py
index 2c677f7..bf8beec 100644
--- a/backend/server/adventures/serializers.py
+++ b/backend/server/adventures/serializers.py
@@ -1,6 +1,6 @@
from django.utils import timezone
import os
-from .models import Adventure, AdventureImage, ChecklistItem, Collection, Note, Transportation, Checklist, Visit, Category
+from .models import Adventure, AdventureImage, ChecklistItem, Collection, Note, Transportation, Checklist, Visit, Category, Attachment
from rest_framework import serializers
from main.utils import CustomModelSerializer
@@ -21,6 +21,26 @@ class AdventureImageSerializer(CustomModelSerializer):
representation['image'] = f"{public_url}/media/{instance.image.name}"
return representation
+class AttachmentSerializer(CustomModelSerializer):
+ extension = serializers.SerializerMethodField()
+ class Meta:
+ model = Attachment
+ fields = ['id', 'file', 'adventure', 'extension']
+ read_only_fields = ['id']
+
+ def get_extension(self, obj):
+ return obj.file.name.split('.')[-1]
+
+ def to_representation(self, instance):
+ representation = super().to_representation(instance)
+ if instance.file:
+ public_url = os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/')
+ #print(public_url)
+ # remove any ' from the url
+ public_url = public_url.replace("'", "")
+ representation['file'] = f"{public_url}/media/{instance.file.name}"
+ return representation
+
class CategorySerializer(serializers.ModelSerializer):
num_adventures = serializers.SerializerMethodField()
class Meta:
@@ -57,6 +77,7 @@ class VisitSerializer(serializers.ModelSerializer):
class AdventureSerializer(CustomModelSerializer):
images = AdventureImageSerializer(many=True, read_only=True)
visits = VisitSerializer(many=True, read_only=False, required=False)
+ attachments = AttachmentSerializer(many=True, read_only=True)
category = CategorySerializer(read_only=False, required=False)
is_visited = serializers.SerializerMethodField()
@@ -65,7 +86,7 @@ class AdventureSerializer(CustomModelSerializer):
fields = [
'id', 'user_id', 'name', 'description', 'rating', 'activity_types', 'location',
'is_public', 'collection', 'created_at', 'updated_at', 'images', 'link', 'longitude',
- 'latitude', 'visits', 'is_visited', 'category'
+ 'latitude', 'visits', 'is_visited', 'category', 'attachments'
]
read_only_fields = ['id', 'created_at', 'updated_at', 'user_id', 'is_visited']
diff --git a/backend/server/adventures/views.py b/backend/server/adventures/views.py
deleted file mode 100644
index e69de29..0000000
diff --git a/frontend/package.json b/frontend/package.json
index 442a9d6..f8abe55 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -41,9 +41,11 @@
"dependencies": {
"@lukulent/svelte-umami": "^0.0.3",
"emoji-picker-element": "^1.26.0",
+ "gsap": "^3.12.7",
"marked": "^15.0.4",
"qrcode": "^1.5.4",
"svelte-i18n": "^4.0.1",
- "svelte-maplibre": "^0.9.8"
+ "svelte-maplibre": "^0.9.8",
+ "tsparticles": "^3.7.1"
}
}
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 1c141b3..3e72f67 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -14,6 +14,9 @@ importers:
emoji-picker-element:
specifier: ^1.26.0
version: 1.26.0
+ gsap:
+ specifier: ^3.12.7
+ version: 3.12.7
marked:
specifier: ^15.0.4
version: 15.0.4
@@ -26,6 +29,9 @@ importers:
svelte-maplibre:
specifier: ^0.9.8
version: 0.9.8(svelte@4.2.19)
+ tsparticles:
+ specifier: ^3.7.1
+ version: 3.7.1
devDependencies:
'@event-calendar/core':
specifier: ^3.7.1
@@ -674,6 +680,147 @@ packages:
peerDependencies:
tailwindcss: '>=3.0.0 || insiders'
+ '@tsparticles/basic@3.7.1':
+ resolution: {integrity: sha512-oJMJ3qzYUROYaOEsaFXkVynxT2OTWBXbQ9MNc1bJi/bVc1VOU44VN7X/KmiZjD+w1U+Qalk6BeVvDRwpFshblw==}
+
+ '@tsparticles/engine@3.7.1':
+ resolution: {integrity: sha512-GYzBgq/oOE9YJdOL1++MoawWmYg4AvVct6CIrJGx84ZRb3U2owYmLsRGabYl0qX1CWWOvUG569043RJmyp/vQA==}
+
+ '@tsparticles/interaction-external-attract@3.7.1':
+ resolution: {integrity: sha512-cpnMsFJ7ZJNKccpQvskKvSs1ofknByHE6FGqbEb17ij7HqvbECQOCOVKHPFnYipHe14cXor/Cd+nVisRcTASoQ==}
+
+ '@tsparticles/interaction-external-bounce@3.7.1':
+ resolution: {integrity: sha512-npvU9Qt6WDonjezHqi+hWM44ga2Oh5yXdr8eSoJpvuHZrCP7rIdRSz5XseHouO1bMS9DbXk86sx4qwrhB5w58w==}
+
+ '@tsparticles/interaction-external-bubble@3.7.1':
+ resolution: {integrity: sha512-WdbYL46lMfuf2g5kfVB1hhhxRBtEXDvnwz8PJwLKurSThL/27bqsqysyXsMzXtLByXUneGhtJTj4D5I5RYdgjA==}
+
+ '@tsparticles/interaction-external-connect@3.7.1':
+ resolution: {integrity: sha512-hqx0ANIbjLIz/nxmk0LvqANBiNLLmVybbCA7N+xDHtEORvpKjNlKEvMz6Razocl6vRjoHZ/olSwcxIG84dh/cg==}
+
+ '@tsparticles/interaction-external-grab@3.7.1':
+ resolution: {integrity: sha512-JMYpFW+7YvkpK5MYlt4Ec3Gwb5ZxS7RLVL8IRUSd5yJOw25husPTYg+FQywxrt5WhKe+tPsCAYo+uGIbTTHi9w==}
+
+ '@tsparticles/interaction-external-pause@3.7.1':
+ resolution: {integrity: sha512-Kkp+7sCe24hawH0XvS1V6UCCuHfMvpLK7oseqSam9Gt4SyGrFvaqIXxkjXhRhn9MysJyKFPBV4/dtBM1HR9p6A==}
+
+ '@tsparticles/interaction-external-push@3.7.1':
+ resolution: {integrity: sha512-4VoaR5jvXgQdB7irtq4uSZYr5c+D6TBTVEnLVpBfJhUs6jhw6mgN5g7yp5izIYkK0AlcO431MHn8dvJacvRLDw==}
+
+ '@tsparticles/interaction-external-remove@3.7.1':
+ resolution: {integrity: sha512-FRBW7U7zD5MkO6/b7e8iSMk/UTtRLY2XiIVFZNsKri3Re3yPpvZzzd5tl2YlYGQlg1Xc+K8SJYMQQA3PtgQ/Tg==}
+
+ '@tsparticles/interaction-external-repulse@3.7.1':
+ resolution: {integrity: sha512-mwM06dVmg2FEvHMQsPOfRBQWACbjf3qnelODkqI9DSVxQ0B8DESP4BYNXyraFGYv00YiPzRv5Xy/uejHdbsQUA==}
+
+ '@tsparticles/interaction-external-slow@3.7.1':
+ resolution: {integrity: sha512-CfCAs3kUQC3pLOj0dbzn5AolQyBHgjxORLdfnYBhepvFV1BXB+4ytChRfXBzjykBPI6U+rCnw5Fk/vVjAroSFA==}
+
+ '@tsparticles/interaction-external-trail@3.7.1':
+ resolution: {integrity: sha512-M7lNQUWP15m8YIDP/JZcZAXaVJLqdwpBs0Uv9F6dU6jsnNXwwHFVFZ+1icrnlbgl9k/Ehhodbdo5weE7GHhQhQ==}
+
+ '@tsparticles/interaction-particles-attract@3.7.1':
+ resolution: {integrity: sha512-UABbBORKaiItAT8vR0t4ye2H3VE6/Ah4zcylBlnq0Jd5yDkyP4rnkwhicaY6y4Zlfwyx+0PWdAC4f/ziFAyObg==}
+
+ '@tsparticles/interaction-particles-collisions@3.7.1':
+ resolution: {integrity: sha512-0GY9++Gn2KXViyeifXWkH7a2UO5+uRwyS1rDeTN8eleyiq2j9zQf4xztZEIft8T0hTetq2rkWxQ92j2kev6NVA==}
+
+ '@tsparticles/interaction-particles-links@3.7.1':
+ resolution: {integrity: sha512-BxCXAAOBNmEvlyOQzwprryW8YdtMIop2v4kgSCff5MCtDwYWoQIfzaQlWbBAkD9ey6BoF8iMjhBUaY1MnDecTA==}
+
+ '@tsparticles/move-base@3.7.1':
+ resolution: {integrity: sha512-LPtMHwJHhzwfRIcSAk814fY9NcRiICwaEbapaJSYyP1DwscSXqOWoyAEWwzV9hMgAcPdsED6nGeg8RCXGm58lw==}
+
+ '@tsparticles/move-parallax@3.7.1':
+ resolution: {integrity: sha512-B40azo6EJyMdI+kmIxpqWDaObPwODTYLDCikzkZ73n5tS6OhFUlkz81Scfo+g1iGTdryKFygUKhVGcG1EFuA5g==}
+
+ '@tsparticles/plugin-absorbers@3.7.1':
+ resolution: {integrity: sha512-3s+fILLV1tdKOq/bXwfoxFVbzkWwXpdWTC2C0QIP6BFwDSQqV5txluiLEf7SCf8C5etQ6dstEnOgVbdzK7+eWA==}
+
+ '@tsparticles/plugin-easing-quad@3.7.1':
+ resolution: {integrity: sha512-nSwKCRe6C/noCi3dyZlm1GiQGask0aXdWDuS36b82iwzwQ01cBTXeXR25mLr4fsfMLFfYAZXyBxEMMpw3rkSiw==}
+
+ '@tsparticles/plugin-emitters-shape-circle@3.7.1':
+ resolution: {integrity: sha512-eBwktnGROkiyCvtrSwdPpoRbIjQgV/Odq//0dw8D+qUdnox6dNzzhJjz8L2LAA2kQZBqtdBqV2kcx3w5ZdqoEQ==}
+
+ '@tsparticles/plugin-emitters-shape-square@3.7.1':
+ resolution: {integrity: sha512-nvGBsRLrkiz6Q38TJRl8Y/eu9i1ChQ9oorQydLBok+iZ6MefuOj39iYsAOkD1w9yRVrFWKHG6CR1mmJUniz/HA==}
+
+ '@tsparticles/plugin-emitters@3.7.1':
+ resolution: {integrity: sha512-WV5Uwxp/Ckqv5kZynTj6mj13jYbQCArNLFv8ks+zjdlteoyT5EhQl4rg+TalaySCb1zCd6Fu2Scp35l3JJgbnw==}
+
+ '@tsparticles/plugin-hex-color@3.7.1':
+ resolution: {integrity: sha512-7xu3MV8EdNNejjYyEmrq5fCDdYAcqz/9VatLpnwtwR5Q5t2qI0tD4CrcGaFfC/rTAVJacfiJe02UV/hlj03KKA==}
+
+ '@tsparticles/plugin-hsl-color@3.7.1':
+ resolution: {integrity: sha512-zzAI1CuoCMBJhgeYZ5Rq42nGbPg35ZzIs11eQegjsWG5Msm5QKSj60qPzERnoUcCc4HCKtIWP7rYMz6h3xpoEg==}
+
+ '@tsparticles/plugin-rgb-color@3.7.1':
+ resolution: {integrity: sha512-taEraTpCYR6jpjflqBL95tN0zFU8JrAChXTt8mxVn7gddxoNMHI/LGymEPRCweLukwV6GQyAGOkeGEdWDPtYTA==}
+
+ '@tsparticles/shape-circle@3.7.1':
+ resolution: {integrity: sha512-kmOWaUuFwuTtcCFYjuyJbdA5qDqWdGsharLalYnIczkLu2c1I8jJo/OmGePKhWn62ocu7mqKMomfElkIcw2AsA==}
+
+ '@tsparticles/shape-emoji@3.7.1':
+ resolution: {integrity: sha512-mX18c/xhYVljS/r5Xbowzclw+1YwhtWoQFOOfkmjjZppA+RjgcwSKLvH6E20PaH1yVTjBOfSF+3POKpwsULzTg==}
+
+ '@tsparticles/shape-image@3.7.1':
+ resolution: {integrity: sha512-eDzfkQhqLY6fb9QH2Vo9TGfdJBFFpYnojhxQxc7IdzIwOFMD3JK4B52RVl9oowR+rNE8dNp6P2L+eMAF4yld0g==}
+
+ '@tsparticles/shape-line@3.7.1':
+ resolution: {integrity: sha512-lMPYApUpg7avxmYPfHHr4dQepZSNn/g0Q1/g2+lnTi8ZtUBiCZ2WMVy9R3GOzyozbnzigLQ6AJRnOpsUZV7H4g==}
+
+ '@tsparticles/shape-polygon@3.7.1':
+ resolution: {integrity: sha512-5FrRfpYC3qnvV2nXBLE4Q0v+SMNWJO8xgzh6MBFwfptvqH4EOrqc/58eS5x0jlf+evwf9LjPgeGkOTcwaHHcYQ==}
+
+ '@tsparticles/shape-square@3.7.1':
+ resolution: {integrity: sha512-7VCqbRwinjBZ+Ryme27rOtl+jKrET8qDthqZLrAoj3WONBqyt+R9q6SXAJ9WodqEX68IBvcluqbFY5qDZm8iAQ==}
+
+ '@tsparticles/shape-star@3.7.1':
+ resolution: {integrity: sha512-3G4oipioyWKLEQYT11Sx3k6AObu3dbv/A5LRqGGTQm5IR6UACa+INwykZYI0a+MdJJMb83E0e4Fn3hlZbi0/8w==}
+
+ '@tsparticles/shape-text@3.7.1':
+ resolution: {integrity: sha512-aU1V9O8uQQBlL0jGFh9Q0b5vQ1Ji6Oo5ptyyj5yJ5uP/ZU00L0Vhk4DNyLXpaU0+H6OBoPpCqnvEsZBB9/HmCQ==}
+
+ '@tsparticles/slim@3.7.1':
+ resolution: {integrity: sha512-OtJEhud2KleX7OxiG2r/VYriHNIwTpFm3sPFy4EOJzAD0EW7KZoKXGpGn5gwGI1NWeB0jso92yNTrTC2ZTW0qw==}
+
+ '@tsparticles/updater-color@3.7.1':
+ resolution: {integrity: sha512-QimV3yn17dcdJx7PpTwLtw9BhkQ0q8qFF035OdcZpnynBPAO/hg0zvSMpMGoeuDVFH02wWBy4h2/BYCv6wh6Sw==}
+
+ '@tsparticles/updater-destroy@3.7.1':
+ resolution: {integrity: sha512-krXNoMDKyeyE/ZjQh3LVjrLYivFefQOQ9i+B7RpMe7x4h+iRgpB6npTCqidGQ82+hZ8G6xfQ9ToduebWwK4JGg==}
+
+ '@tsparticles/updater-life@3.7.1':
+ resolution: {integrity: sha512-NY5gUrgO5AsARNC0usP9PKahXf7JCxbP/H1vzTfA0SJw4veANfWTldOvhIlcm2CHVP5P1b827p0hWsBHECwz7A==}
+
+ '@tsparticles/updater-opacity@3.7.1':
+ resolution: {integrity: sha512-YcyviCooTv7SAKw7sxd84CfJqZ7dYPSdYZzCpedV6TKIObRiwLqXlyLXQGJ3YltghKQSCSolmVy8woWBCDm1qA==}
+
+ '@tsparticles/updater-out-modes@3.7.1':
+ resolution: {integrity: sha512-Cb5sWquRtUYLSiFpmBjjYKRdpNV52diCo9+qMtK1oVlldDBhUwqO+1TQjdlaA2yl5DURlY9ZfOHXvY+IT7CHCw==}
+
+ '@tsparticles/updater-roll@3.7.1':
+ resolution: {integrity: sha512-gHLRqpTGVGPJBEAIPUiYVembIn5bcaTXXxsUJEM/IN+GIOvj2uZZGZ4r2aFTA6WugqEbJsJdblDSvMfouyz7Ug==}
+
+ '@tsparticles/updater-rotate@3.7.1':
+ resolution: {integrity: sha512-toVHwl+h6SvtA8dyxSA2kMH2QdDA71vehuAa+HoRqf1y06h5kxyYiMKZFHCqDJ6lFfRPs47MjrC9dD2bDz14MQ==}
+
+ '@tsparticles/updater-size@3.7.1':
+ resolution: {integrity: sha512-+Y0H0PnDJVIsJ+zHTyubYu1jtRFmVnY1dAv3VCjScIDw6bcpL/ol+HrtHTGIX0WbMyUfjCyALfAoaXi/Wm8VcQ==}
+
+ '@tsparticles/updater-stroke-color@3.7.1':
+ resolution: {integrity: sha512-VHhQkCNuxjx/Hy7A+g0Yijb24T0+wQ3jNsF/yfrR9dEdZWSBiimZLvV1bilPdAeEtieAJTAZo2VNhcD1snF0iQ==}
+
+ '@tsparticles/updater-tilt@3.7.1':
+ resolution: {integrity: sha512-pSOXoXPre1VPKC5nC5GW0L9jw63w1dVdsDdggEau7MP9xO7trko9L/KyayBX12Y4Ief1ca12Incxxr67hw7GGA==}
+
+ '@tsparticles/updater-twinkle@3.7.1':
+ resolution: {integrity: sha512-maRTqPbeZcxBK6s1ry+ih71qSVaitfP1KTrAKR38v26GMwyO6z+zYV2bu9WTRt21FRFAoxlMLWxNu21GtQoXDA==}
+
+ '@tsparticles/updater-wobble@3.7.1':
+ resolution: {integrity: sha512-YIlNg4L0w4egQJhPLpgcvcfv9+X621+cQsrdN9sSmajxhhwtEQvQUvFUzGTcvpjVi+GcBNp0t4sCKEzoP8iaYw==}
+
'@types/cookie@0.6.0':
resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
@@ -1165,6 +1312,9 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ gsap@3.12.7:
+ resolution: {integrity: sha512-V4GsyVamhmKefvcAKaoy0h6si0xX7ogwBoBSs2CTJwt7luW0oZzC0LhdkyuKV8PJAXr7Yaj8pMjCKD4GJ+eEMg==}
+
has-unicode@2.0.1:
resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
@@ -1956,6 +2106,9 @@ packages:
tslib@2.6.3:
resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
+ tsparticles@3.7.1:
+ resolution: {integrity: sha512-NNkOYIo01eHpDuaJxDCGgcLEMZKEJTCN/XPVCLg7VxgEWN19rjXpDnDguISxadS8GSFPws7hpGgbeDDAm3MX+Q==}
+
type-detect@4.0.8:
resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
engines: {node: '>=4'}
@@ -2596,6 +2749,228 @@ snapshots:
postcss-selector-parser: 6.0.10
tailwindcss: 3.4.4
+ '@tsparticles/basic@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+ '@tsparticles/move-base': 3.7.1
+ '@tsparticles/plugin-hex-color': 3.7.1
+ '@tsparticles/plugin-hsl-color': 3.7.1
+ '@tsparticles/plugin-rgb-color': 3.7.1
+ '@tsparticles/shape-circle': 3.7.1
+ '@tsparticles/updater-color': 3.7.1
+ '@tsparticles/updater-opacity': 3.7.1
+ '@tsparticles/updater-out-modes': 3.7.1
+ '@tsparticles/updater-size': 3.7.1
+
+ '@tsparticles/engine@3.7.1': {}
+
+ '@tsparticles/interaction-external-attract@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-external-bounce@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-external-bubble@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-external-connect@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-external-grab@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-external-pause@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-external-push@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-external-remove@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-external-repulse@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-external-slow@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-external-trail@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-particles-attract@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-particles-collisions@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/interaction-particles-links@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/move-base@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/move-parallax@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/plugin-absorbers@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/plugin-easing-quad@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/plugin-emitters-shape-circle@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+ '@tsparticles/plugin-emitters': 3.7.1
+
+ '@tsparticles/plugin-emitters-shape-square@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+ '@tsparticles/plugin-emitters': 3.7.1
+
+ '@tsparticles/plugin-emitters@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/plugin-hex-color@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/plugin-hsl-color@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/plugin-rgb-color@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/shape-circle@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/shape-emoji@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/shape-image@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/shape-line@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/shape-polygon@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/shape-square@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/shape-star@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/shape-text@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/slim@3.7.1':
+ dependencies:
+ '@tsparticles/basic': 3.7.1
+ '@tsparticles/engine': 3.7.1
+ '@tsparticles/interaction-external-attract': 3.7.1
+ '@tsparticles/interaction-external-bounce': 3.7.1
+ '@tsparticles/interaction-external-bubble': 3.7.1
+ '@tsparticles/interaction-external-connect': 3.7.1
+ '@tsparticles/interaction-external-grab': 3.7.1
+ '@tsparticles/interaction-external-pause': 3.7.1
+ '@tsparticles/interaction-external-push': 3.7.1
+ '@tsparticles/interaction-external-remove': 3.7.1
+ '@tsparticles/interaction-external-repulse': 3.7.1
+ '@tsparticles/interaction-external-slow': 3.7.1
+ '@tsparticles/interaction-particles-attract': 3.7.1
+ '@tsparticles/interaction-particles-collisions': 3.7.1
+ '@tsparticles/interaction-particles-links': 3.7.1
+ '@tsparticles/move-parallax': 3.7.1
+ '@tsparticles/plugin-easing-quad': 3.7.1
+ '@tsparticles/shape-emoji': 3.7.1
+ '@tsparticles/shape-image': 3.7.1
+ '@tsparticles/shape-line': 3.7.1
+ '@tsparticles/shape-polygon': 3.7.1
+ '@tsparticles/shape-square': 3.7.1
+ '@tsparticles/shape-star': 3.7.1
+ '@tsparticles/updater-life': 3.7.1
+ '@tsparticles/updater-rotate': 3.7.1
+ '@tsparticles/updater-stroke-color': 3.7.1
+
+ '@tsparticles/updater-color@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-destroy@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-life@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-opacity@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-out-modes@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-roll@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-rotate@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-size@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-stroke-color@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-tilt@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-twinkle@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
+ '@tsparticles/updater-wobble@3.7.1':
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+
'@types/cookie@0.6.0': {}
'@types/estree@1.0.6': {}
@@ -3141,6 +3516,8 @@ snapshots:
graceful-fs@4.2.11: {}
+ gsap@3.12.7: {}
+
has-unicode@2.0.1: {}
hasown@2.0.2:
@@ -3923,6 +4300,22 @@ snapshots:
tslib@2.6.3: {}
+ tsparticles@3.7.1:
+ dependencies:
+ '@tsparticles/engine': 3.7.1
+ '@tsparticles/interaction-external-trail': 3.7.1
+ '@tsparticles/plugin-absorbers': 3.7.1
+ '@tsparticles/plugin-emitters': 3.7.1
+ '@tsparticles/plugin-emitters-shape-circle': 3.7.1
+ '@tsparticles/plugin-emitters-shape-square': 3.7.1
+ '@tsparticles/shape-text': 3.7.1
+ '@tsparticles/slim': 3.7.1
+ '@tsparticles/updater-destroy': 3.7.1
+ '@tsparticles/updater-roll': 3.7.1
+ '@tsparticles/updater-tilt': 3.7.1
+ '@tsparticles/updater-twinkle': 3.7.1
+ '@tsparticles/updater-wobble': 3.7.1
+
type-detect@4.0.8: {}
type@2.7.3: {}
diff --git a/frontend/src/routes/dashboard/+page.svelte b/frontend/src/routes/dashboard/+page.svelte
index b015fa8..fd3ee82 100644
--- a/frontend/src/routes/dashboard/+page.svelte
+++ b/frontend/src/routes/dashboard/+page.svelte
@@ -2,6 +2,57 @@
import AdventureCard from '$lib/components/AdventureCard.svelte';
import type { PageData } from './$types';
import { t } from 'svelte-i18n';
+ import { onMount } from 'svelte';
+ import { gsap } from 'gsap';
+
+ // Initial animation for page load
+ onMount(() => {
+ // Stat animations with quicker duration
+ gsap.from('.stat', {
+ opacity: 0,
+ y: 50,
+ duration: 0.6, // Quicker animation duration
+ stagger: 0.1, // Faster staggering between elements
+ ease: 'power2.out' // Slightly sharper easing for quicker feel
+ });
+
+ gsap.from('.stat-title', {
+ opacity: 0,
+ x: -50, // Smaller movement for quicker animation
+ duration: 0.6, // Quicker animation duration
+ stagger: 0.1, // Faster staggering
+ ease: 'power2.out'
+ });
+
+ // Stat values with faster reveal and snappier effect
+ gsap.from('.stat-value', {
+ opacity: 0,
+ scale: 0.8, // Slightly less scaling for a snappier effect
+ duration: 1, // Shorter duration
+ stagger: 0.2, // Faster staggering
+ ease: 'power2.out', // Snappier easing
+ delay: 0.3 // Faster delay for quicker sequencing
+ });
+
+ // Adventure card animations with quicker reveal
+ gsap.from('.adventure-card', {
+ opacity: 0,
+ y: 50, // Less movement for snappier feel
+ duration: 0.8, // Quicker duration
+ stagger: 0.1, // Faster staggering
+ ease: 'power2.out',
+ delay: 0.6 // Shorter delay for quicker appearance
+ });
+
+ // Inspiration section with faster bounce effect
+ gsap.from('.inspiration', {
+ opacity: 0,
+ scale: 0.7, // Less scale for snappier effect
+ duration: 1, // Slightly quicker duration
+ ease: 'elastic.out(0.75, 0.5)', // Snappier bounce
+ delay: 1 // Reduced delay for quicker animation
+ });
+ });
export let data: PageData;
@@ -19,9 +70,7 @@
@@ -62,7 +111,9 @@
{$t('dashboard.recent_adventures')}
{#each recentAdventures as adventure}
-
+
{/each}
{/if}
@@ -70,7 +121,7 @@
{#if recentAdventures.length === 0}
{$t('dashboard.no_recent_adventures')}
diff --git a/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte
index 6fcc628..bfccb5f 100644
--- a/frontend/src/routes/login/+page.svelte
+++ b/frontend/src/routes/login/+page.svelte
@@ -15,6 +15,29 @@
import OpenIdConnect from '~icons/mdi/openid';
import { page } from '$app/stores';
+ import { gsap } from 'gsap'; // Import GSAP
+ import { onMount } from 'svelte';
+
+ onMount(() => {
+ gsap.from('.card', {
+ opacity: 0,
+ y: 50,
+ duration: 1,
+ ease: 'power3.out'
+ });
+ gsap.from('.text-center', {
+ opacity: 0,
+ x: -50,
+ duration: 1,
+ ease: 'power2.out'
+ });
+ gsap.from('.input', {
+ opacity: 0,
+ y: 30,
+ duration: 1,
+ ease: 'power2.out'
+ });
+ });
import ImageInfoModal from '$lib/components/ImageInfoModal.svelte';
import type { Background } from '$lib/types.js';
diff --git a/frontend/src/routes/signup/+page.svelte b/frontend/src/routes/signup/+page.svelte
index 6643e06..ecbcced 100644
--- a/frontend/src/routes/signup/+page.svelte
+++ b/frontend/src/routes/signup/+page.svelte
@@ -4,6 +4,29 @@
export let data;
console.log(data);
+ import { gsap } from 'gsap'; // Import GSAP
+ import { onMount } from 'svelte';
+
+ onMount(() => {
+ gsap.from('.card', {
+ opacity: 0,
+ y: 50,
+ duration: 1,
+ ease: 'power3.out'
+ });
+ gsap.from('.text-center', {
+ opacity: 0,
+ x: -50,
+ duration: 1,
+ ease: 'power2.out'
+ });
+ gsap.from('.input', {
+ opacity: 0,
+ y: 30,
+ duration: 1,
+ ease: 'power2.out'
+ });
+ });
import FileImageBox from '~icons/mdi/file-image-box';
From e9538b707f1eb4c6c914305c39b0a1530445044d Mon Sep 17 00:00:00 2001
From: Lars Lehmann <33843261+larsl-net@users.noreply.github.com>
Date: Sun, 19 Jan 2025 11:36:28 +0100
Subject: [PATCH 07/30] Add basic PWA
---
frontend/src/app.html | 1 +
frontend/static/adventurelog.svg | 313 +++++++++++++++++++++++++++++++
frontend/static/manifest.json | 16 ++
3 files changed, 330 insertions(+)
create mode 100644 frontend/static/adventurelog.svg
create mode 100644 frontend/static/manifest.json
diff --git a/frontend/src/app.html b/frontend/src/app.html
index f2516ae..1f4fe8f 100644
--- a/frontend/src/app.html
+++ b/frontend/src/app.html
@@ -4,6 +4,7 @@
+
%sveltekit.head%
diff --git a/frontend/static/adventurelog.svg b/frontend/static/adventurelog.svg
new file mode 100644
index 0000000..92667f2
--- /dev/null
+++ b/frontend/static/adventurelog.svg
@@ -0,0 +1,313 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/static/manifest.json b/frontend/static/manifest.json
new file mode 100644
index 0000000..9f08d31
--- /dev/null
+++ b/frontend/static/manifest.json
@@ -0,0 +1,16 @@
+{
+ "short_name": "AdventureLog",
+ "name": "AdventureLog",
+ "start_url": "/dashboard",
+ "icons": [
+ {
+ "src": "adventurelog.svg",
+ "type": "image/svg+xml",
+ "sizes": "any"
+ }
+ ],
+ "background_color": "#2a323c",
+ "display": "standalone",
+ "scope": "/",
+ "description": "Self-hostable travel tracker and trip planner."
+}
\ No newline at end of file
From 3ccd0785089cd756e57ecc5264f1f92d5c6a1c3d Mon Sep 17 00:00:00 2001
From: Lars Lehmann <33843261+larsl-net@users.noreply.github.com>
Date: Sun, 19 Jan 2025 11:51:04 +0100
Subject: [PATCH 08/30] Add Service Worker
---
frontend/src/service-worker.ts | 81 ++++++++++++++++++++++++++++++++++
1 file changed, 81 insertions(+)
create mode 100644 frontend/src/service-worker.ts
diff --git a/frontend/src/service-worker.ts b/frontend/src/service-worker.ts
new file mode 100644
index 0000000..e0bd09c
--- /dev/null
+++ b/frontend/src/service-worker.ts
@@ -0,0 +1,81 @@
+/// Source: https://dev.to/100lvlmaster/create-a-pwa-with-sveltekit-svelte-a36
+///
+
+import { build, files, timestamp } from '$service-worker';
+
+const worker = (self as unknown) as ServiceWorkerGlobalScope;
+const FILES = `cache${timestamp}`;
+
+// `build` is an array of all the files generated by the bundler,
+// `files` is an array of everything in the `static` directory
+const to_cache = build.concat(files);
+const staticAssets = new Set(to_cache);
+
+worker.addEventListener('install', (event) => {
+ event.waitUntil(
+ caches
+ .open(FILES)
+ .then((cache) => cache.addAll(to_cache))
+ .then(() => {
+ worker.skipWaiting();
+ })
+ );
+});
+
+worker.addEventListener('activate', (event) => {
+ event.waitUntil(
+ caches.keys().then(async (keys) => {
+ // delete old caches
+ for (const key of keys) {
+ if (key !== FILES) await caches.delete(key);
+ }
+
+ worker.clients.claim();
+ })
+ );
+});
+
+/**
+ * Fetch the asset from the network and store it in the cache.
+ * Fall back to the cache if the user is offline.
+ */
+async function fetchAndCache(request: Request) {
+ const cache = await caches.open(`offline${timestamp}`);
+
+ try {
+ const response = await fetch(request);
+ cache.put(request, response.clone());
+ return response;
+ } catch (err) {
+ const response = await cache.match(request);
+ if (response) return response;
+
+ throw err;
+ }
+}
+
+worker.addEventListener('fetch', (event) => {
+ if (event.request.method !== 'GET' || event.request.headers.has('range')) return;
+
+ const url = new URL(event.request.url);
+
+ // don't try to handle e.g. data: URIs
+ const isHttp = url.protocol.startsWith('http');
+ const isDevServerRequest =
+ url.hostname === self.location.hostname && url.port !== self.location.port;
+ const isStaticAsset = url.host === self.location.host && staticAssets.has(url.pathname);
+ const skipBecauseUncached = event.request.cache === 'only-if-cached' && !isStaticAsset;
+
+ if (isHttp && !isDevServerRequest && !skipBecauseUncached) {
+ event.respondWith(
+ (async () => {
+ // always serve static files and bundler-generated assets from cache.
+ // if your application has other URLs with data that will never change,
+ // set this variable to true for them and they will only be fetched once.
+ const cachedAsset = isStaticAsset && (await caches.match(event.request));
+
+ return cachedAsset || fetchAndCache(event.request);
+ })()
+ );
+ }
+});
\ No newline at end of file
From a88e59869e6ac1accd5307209c57ace8942d295c Mon Sep 17 00:00:00 2001
From: Lars Lehmann
Date: Sun, 19 Jan 2025 22:43:31 +0100
Subject: [PATCH 09/30] Fix service worker
---
frontend/src/app.html | 2 +-
frontend/src/service-worker.ts | 81 ----------------------------
frontend/src/service-worker/indes.ts | 60 +++++++++++++++++++++
3 files changed, 61 insertions(+), 82 deletions(-)
delete mode 100644 frontend/src/service-worker.ts
create mode 100644 frontend/src/service-worker/indes.ts
diff --git a/frontend/src/app.html b/frontend/src/app.html
index 1f4fe8f..abea469 100644
--- a/frontend/src/app.html
+++ b/frontend/src/app.html
@@ -4,7 +4,7 @@
-
+
%sveltekit.head%
diff --git a/frontend/src/service-worker.ts b/frontend/src/service-worker.ts
deleted file mode 100644
index e0bd09c..0000000
--- a/frontend/src/service-worker.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-/// Source: https://dev.to/100lvlmaster/create-a-pwa-with-sveltekit-svelte-a36
-///
-
-import { build, files, timestamp } from '$service-worker';
-
-const worker = (self as unknown) as ServiceWorkerGlobalScope;
-const FILES = `cache${timestamp}`;
-
-// `build` is an array of all the files generated by the bundler,
-// `files` is an array of everything in the `static` directory
-const to_cache = build.concat(files);
-const staticAssets = new Set(to_cache);
-
-worker.addEventListener('install', (event) => {
- event.waitUntil(
- caches
- .open(FILES)
- .then((cache) => cache.addAll(to_cache))
- .then(() => {
- worker.skipWaiting();
- })
- );
-});
-
-worker.addEventListener('activate', (event) => {
- event.waitUntil(
- caches.keys().then(async (keys) => {
- // delete old caches
- for (const key of keys) {
- if (key !== FILES) await caches.delete(key);
- }
-
- worker.clients.claim();
- })
- );
-});
-
-/**
- * Fetch the asset from the network and store it in the cache.
- * Fall back to the cache if the user is offline.
- */
-async function fetchAndCache(request: Request) {
- const cache = await caches.open(`offline${timestamp}`);
-
- try {
- const response = await fetch(request);
- cache.put(request, response.clone());
- return response;
- } catch (err) {
- const response = await cache.match(request);
- if (response) return response;
-
- throw err;
- }
-}
-
-worker.addEventListener('fetch', (event) => {
- if (event.request.method !== 'GET' || event.request.headers.has('range')) return;
-
- const url = new URL(event.request.url);
-
- // don't try to handle e.g. data: URIs
- const isHttp = url.protocol.startsWith('http');
- const isDevServerRequest =
- url.hostname === self.location.hostname && url.port !== self.location.port;
- const isStaticAsset = url.host === self.location.host && staticAssets.has(url.pathname);
- const skipBecauseUncached = event.request.cache === 'only-if-cached' && !isStaticAsset;
-
- if (isHttp && !isDevServerRequest && !skipBecauseUncached) {
- event.respondWith(
- (async () => {
- // always serve static files and bundler-generated assets from cache.
- // if your application has other URLs with data that will never change,
- // set this variable to true for them and they will only be fetched once.
- const cachedAsset = isStaticAsset && (await caches.match(event.request));
-
- return cachedAsset || fetchAndCache(event.request);
- })()
- );
- }
-});
\ No newline at end of file
diff --git a/frontend/src/service-worker/indes.ts b/frontend/src/service-worker/indes.ts
new file mode 100644
index 0000000..5a4466b
--- /dev/null
+++ b/frontend/src/service-worker/indes.ts
@@ -0,0 +1,60 @@
+///
+
+import { build, files, version } from '$service-worker';
+
+const CACHE = `cache-${version}`;
+
+const ASSETS = [
+ ...build, // the app itself
+ ...files // everything in `static`
+];
+
+self.addEventListener('install', (event) => {
+ // Create a new cache and add all files to it
+ async function addFilesToCache() {
+ const cache = await caches.open(CACHE);
+ await cache.addAll(ASSETS);
+ }
+ event.waitUntil(addFilesToCache());
+});
+
+self.addEventListener('activate', (event) => {
+ // Remove previous cached data from disk
+ async function deleteOldCaches() {
+ for (const key of await caches.keys()) {
+ if (key !== CACHE) await caches.delete(key);
+ }
+ }
+ event.waitUntil(deleteOldCaches());
+});
+
+self.addEventListener('fetch', (event) => {
+ // ignore POST requests, etc
+ if (event.request.method !== 'GET') return;
+
+ async function respond() {
+ const url = new URL(event.request.url);
+ const cache = await caches.open(CACHE);
+
+ // `build`/`files` can always be served from the cache
+ if (ASSETS.includes(url.pathname)) {
+ return cache.match(url.pathname);
+ }
+
+ // for everything else, try the network first, but
+ // fall back to the cache if we're offline
+ try {
+ const response = await fetch(event.request);
+
+ if (response.status === 200) {
+ cache.put(event.request, response.clone());
+ }
+
+ return response;
+ } catch {
+ return cache.match(event.request);
+ }
+ }
+
+ event.respondWith(respond());
+});
From 94c3e3d363b6a22e885a023e19135d5955c0d4c1 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sun, 19 Jan 2025 22:22:03 -0500
Subject: [PATCH 10/30] feat: implement attachment management with upload,
delete, and permission checks; update serializers and models
---
.../migrations/0019_alter_attachment_file.py | 19 +++
.../migrations/0020_attachment_name.py | 19 +++
.../migrations/0021_alter_attachment_name.py | 18 +++
backend/server/adventures/models.py | 3 +-
backend/server/adventures/serializers.py | 2 +-
backend/server/adventures/urls.py | 1 +
backend/server/adventures/views/__init__.py | 3 +-
.../adventures/views/attachment_view.py | 39 +++++
.../src/lib/components/AdventureModal.svelte | 151 +++++++++++++++++-
.../src/lib/components/AttachmentCard.svelte | 99 ++++++++++++
frontend/src/lib/types.ts | 10 ++
frontend/src/locales/en.json | 11 ++
.../src/routes/adventures/+page.server.ts | 16 ++
.../src/routes/adventures/[id]/+page.svelte | 53 ++++++
frontend/src/routes/dashboard/+page.svelte | 10 +-
15 files changed, 444 insertions(+), 10 deletions(-)
create mode 100644 backend/server/adventures/migrations/0019_alter_attachment_file.py
create mode 100644 backend/server/adventures/migrations/0020_attachment_name.py
create mode 100644 backend/server/adventures/migrations/0021_alter_attachment_name.py
create mode 100644 backend/server/adventures/views/attachment_view.py
create mode 100644 frontend/src/lib/components/AttachmentCard.svelte
diff --git a/backend/server/adventures/migrations/0019_alter_attachment_file.py b/backend/server/adventures/migrations/0019_alter_attachment_file.py
new file mode 100644
index 0000000..bb48fae
--- /dev/null
+++ b/backend/server/adventures/migrations/0019_alter_attachment_file.py
@@ -0,0 +1,19 @@
+# Generated by Django 5.0.8 on 2025-01-19 22:17
+
+import adventures.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('adventures', '0018_attachment'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='attachment',
+ name='file',
+ field=models.FileField(upload_to=adventures.models.PathAndRename('attachments/')),
+ ),
+ ]
diff --git a/backend/server/adventures/migrations/0020_attachment_name.py b/backend/server/adventures/migrations/0020_attachment_name.py
new file mode 100644
index 0000000..4773250
--- /dev/null
+++ b/backend/server/adventures/migrations/0020_attachment_name.py
@@ -0,0 +1,19 @@
+# Generated by Django 5.0.8 on 2025-01-19 22:32
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('adventures', '0019_alter_attachment_file'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='attachment',
+ name='name',
+ field=models.CharField(default='', max_length=200),
+ preserve_default=False,
+ ),
+ ]
diff --git a/backend/server/adventures/migrations/0021_alter_attachment_name.py b/backend/server/adventures/migrations/0021_alter_attachment_name.py
new file mode 100644
index 0000000..93b7eb3
--- /dev/null
+++ b/backend/server/adventures/migrations/0021_alter_attachment_name.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.0.8 on 2025-01-19 22:32
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('adventures', '0020_attachment_name'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='attachment',
+ name='name',
+ field=models.CharField(blank=True, max_length=200, null=True),
+ ),
+ ]
diff --git a/backend/server/adventures/models.py b/backend/server/adventures/models.py
index 346c509..af0d7b9 100644
--- a/backend/server/adventures/models.py
+++ b/backend/server/adventures/models.py
@@ -292,8 +292,9 @@ class Attachment(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(
User, on_delete=models.CASCADE, default=default_user_id)
- file = models.FileField(upload_to='attachments/')
+ file = models.FileField(upload_to=PathAndRename('attachments/'))
adventure = models.ForeignKey(Adventure, related_name='attachments', on_delete=models.CASCADE)
+ name = models.CharField(max_length=200, null=True, blank=True)
def __str__(self):
return self.file.url
diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py
index bf8beec..c213169 100644
--- a/backend/server/adventures/serializers.py
+++ b/backend/server/adventures/serializers.py
@@ -25,7 +25,7 @@ class AttachmentSerializer(CustomModelSerializer):
extension = serializers.SerializerMethodField()
class Meta:
model = Attachment
- fields = ['id', 'file', 'adventure', 'extension']
+ fields = ['id', 'file', 'adventure', 'extension', 'name']
read_only_fields = ['id']
def get_extension(self, obj):
diff --git a/backend/server/adventures/urls.py b/backend/server/adventures/urls.py
index cc59670..16ab3b5 100644
--- a/backend/server/adventures/urls.py
+++ b/backend/server/adventures/urls.py
@@ -17,6 +17,7 @@ router.register(r'categories', CategoryViewSet, basename='categories')
router.register(r'ics-calendar', IcsCalendarGeneratorViewSet, basename='ics-calendar')
router.register(r'overpass', OverpassViewSet, basename='overpass')
router.register(r'search', GlobalSearchView, basename='search')
+router.register(r'attachments', AttachmentViewSet, basename='attachments')
urlpatterns = [
diff --git a/backend/server/adventures/views/__init__.py b/backend/server/adventures/views/__init__.py
index 5920619..171df52 100644
--- a/backend/server/adventures/views/__init__.py
+++ b/backend/server/adventures/views/__init__.py
@@ -11,4 +11,5 @@ from .overpass_view import *
from .reverse_geocode_view import *
from .stats_view import *
from .transportation_view import *
-from .global_search_view import *
\ No newline at end of file
+from .global_search_view import *
+from .attachment_view import *
\ No newline at end of file
diff --git a/backend/server/adventures/views/attachment_view.py b/backend/server/adventures/views/attachment_view.py
new file mode 100644
index 0000000..47ed328
--- /dev/null
+++ b/backend/server/adventures/views/attachment_view.py
@@ -0,0 +1,39 @@
+from rest_framework import viewsets, status
+from rest_framework.decorators import action
+from rest_framework.permissions import IsAuthenticated
+from rest_framework.response import Response
+from django.db.models import Q
+from adventures.models import Adventure, Attachment
+from adventures.serializers import AttachmentSerializer
+import uuid
+
+class AttachmentViewSet(viewsets.ModelViewSet):
+ serializer_class = AttachmentSerializer
+ permission_classes = [IsAuthenticated]
+
+ def get_queryset(self):
+ return Attachment.objects.filter(user_id=self.request.user)
+
+ @action(detail=True, methods=['post'])
+ def attachment_delete(self, request, *args, **kwargs):
+ return self.destroy(request, *args, **kwargs)
+
+ def create(self, request, *args, **kwargs):
+ if not request.user.is_authenticated:
+ return Response({"error": "User is not authenticated"}, status=status.HTTP_401_UNAUTHORIZED)
+ adventure_id = request.data.get('adventure')
+ try:
+ adventure = Adventure.objects.get(id=adventure_id)
+ except Adventure.DoesNotExist:
+ return Response({"error": "Adventure not found"}, status=status.HTTP_404_NOT_FOUND)
+
+ if adventure.user_id != request.user:
+ # Check if the adventure has a collection
+ if adventure.collection:
+ # Check if the user is in the collection's shared_with list
+ if not adventure.collection.shared_with.filter(id=request.user.id).exists():
+ return Response({"error": "User does not have permission to access this adventure"}, status=status.HTTP_403_FORBIDDEN)
+ else:
+ return Response({"error": "User does not own this adventure"}, status=status.HTTP_403_FORBIDDEN)
+
+ return super().create(request, *args, **kwargs)
\ No newline at end of file
diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte
index 5b0ce94..9e31453 100644
--- a/frontend/src/lib/components/AdventureModal.svelte
+++ b/frontend/src/lib/components/AdventureModal.svelte
@@ -2,6 +2,7 @@
import { createEventDispatcher } from 'svelte';
import type {
Adventure,
+ Attachment,
Category,
Collection,
OpenStreetMapPlace,
@@ -36,6 +37,7 @@
import Star from '~icons/mdi/star';
import Crown from '~icons/mdi/crown';
+ import AttachmentCard from './AttachmentCard.svelte';
let wikiError: string = '';
@@ -66,7 +68,8 @@
display_name: '',
icon: '',
user_id: ''
- }
+ },
+ attachments: []
};
export let adventureToEdit: Adventure | null = null;
@@ -93,7 +96,9 @@
display_name: '',
icon: '',
user_id: ''
- }
+ },
+
+ attachments: adventureToEdit?.attachments || []
};
let markers: Point[] = [];
@@ -134,6 +139,86 @@
}
}
+ function deleteAttachment(event: CustomEvent) {
+ adventure.attachments = adventure.attachments.filter(
+ (attachment) => attachment.id !== event.detail
+ );
+ }
+
+ let attachmentName: string = '';
+ let attachmentToEdit: Attachment | null = null;
+
+ async function editAttachment() {
+ if (attachmentToEdit) {
+ let res = await fetch(`/api/attachments/${attachmentToEdit.id}/`, {
+ method: 'PATCH',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({ name: attachmentToEdit.name })
+ });
+ if (res.ok) {
+ let newAttachment = (await res.json()) as Attachment;
+ adventure.attachments = adventure.attachments.map((attachment) => {
+ if (attachment.id === newAttachment.id) {
+ return newAttachment;
+ }
+ return attachment;
+ });
+ attachmentToEdit = null;
+ addToast('success', $t('adventures.attachment_update_success'));
+ } else {
+ addToast('error', $t('adventures.attachment_update_error'));
+ }
+ }
+ }
+
+ async function uploadAttachment(event: Event) {
+ event.preventDefault();
+ console.log('UPLOAD');
+
+ if (!fileInput || !fileInput.files || fileInput.files.length === 0) {
+ console.error('No files selected');
+ return;
+ }
+
+ const file = fileInput.files[0];
+ console.log(file);
+
+ const formData = new FormData();
+ formData.append('file', file);
+ formData.append('adventure', adventure.id);
+ formData.append('name', attachmentName);
+
+ console.log(formData);
+
+ try {
+ const res = await fetch('/adventures?/attachment', {
+ method: 'POST',
+ body: formData
+ });
+
+ console.log(res);
+
+ if (res.ok) {
+ const newData = deserialize(await res.text()) as { data: Attachment };
+ adventure.attachments = [...adventure.attachments, newData.data];
+ addToast('success', $t('adventures.attachment_upload_success'));
+ attachmentName = '';
+ } else {
+ addToast('error', $t('adventures.attachment_upload_error'));
+ }
+ } catch (err) {
+ console.error(err);
+ addToast('error', $t('adventures.attachment_upload_error'));
+ } finally {
+ // Reset the file input for a new upload
+ if (fileInput) {
+ fileInput.value = '';
+ }
+ }
+ }
+
function clearMap() {
console.log('CLEAR');
markers = [];
@@ -878,6 +963,68 @@ it would also work to just use on:click on the MapLibre component itself. -->
+
+
+
+ {$t('adventures.attachments')} ({adventure.attachments?.length || 0})
+
+
+
diff --git a/frontend/src/lib/components/AttachmentCard.svelte b/frontend/src/lib/components/AttachmentCard.svelte
new file mode 100644
index 0000000..7d90f2f
--- /dev/null
+++ b/frontend/src/lib/components/AttachmentCard.svelte
@@ -0,0 +1,99 @@
+
+
+
+
+
+
window.open(attachment.file, '_blank')}
+ role="button"
+ tabindex="0"
+ aria-label={attachment.file.split('/').pop()}
+ >
+ {#if !['.jpg', '.jpeg', '.png', '.gif', '.webp'].some((ext) => attachment.file.endsWith(ext))}
+
+
+ {attachment.name}
+ {attachment.extension.toUpperCase()}
+
+
+
+ {/if}
+
+
+
+
+ {$t('adventures.attachment')}
+
+
+ {attachment.extension}
+
+
+
+
+
+ {attachment.name}
+
+
+ window.open(attachment.file, '_blank')}
+ >
+ {$t('notes.open')}
+
+ {#if allowEdit}
+ dispatch('edit', attachment)}
+ >
+ {$t('transportation.edit')}
+
+ {/if}
+
+ {$t('adventures.delete')}
+
+
+
+
diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts
index 60191a9..c97c43d 100644
--- a/frontend/src/lib/types.ts
+++ b/frontend/src/lib/types.ts
@@ -40,6 +40,7 @@ export type Adventure = {
updated_at?: string | null;
is_visited?: boolean;
category: Category | null;
+ attachments: Attachment[];
};
export type Country = {
@@ -252,3 +253,12 @@ export type ImmichAlbum = {
order: string;
lastModifiedAssetTimestamp: string;
};
+
+export type Attachment = {
+ id: string;
+ file: string;
+ adventure: string;
+ extension: string;
+ user_id: string;
+ name: string;
+};
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json
index a138392..a819849 100644
--- a/frontend/src/locales/en.json
+++ b/frontend/src/locales/en.json
@@ -129,6 +129,11 @@
"search_results": "Searh results",
"no_results": "No results found",
"wiki_desc": "Pulls excerpt from Wikipedia article matching the name of the adventure.",
+ "attachments": "Attachments",
+ "attachment": "Attachment",
+ "images": "Images",
+ "primary": "Primary",
+ "view_attachment": "View Attachment",
"generate_desc": "Generate Description",
"public_adventure": "Public Adventure",
"location_information": "Location Information",
@@ -245,6 +250,12 @@
"finding_recommendations": "Discovering hidden gems for your next adventure",
"md_instructions": "Write your markdown here...",
"days": "days",
+ "attachment_upload_success": "Attachment uploaded successfully!",
+ "attachment_upload_error": "Error uploading attachment",
+ "upload": "Upload",
+ "attachment_delete_success": "Attachment deleted successfully!",
+ "attachment_update_success": "Attachment updated successfully!",
+ "attachment_update_error": "Error updating attachment",
"activities": {
"general": "General 🌍",
"outdoor": "Outdoor 🏞️",
diff --git a/frontend/src/routes/adventures/+page.server.ts b/frontend/src/routes/adventures/+page.server.ts
index a2d7ab6..89887f3 100644
--- a/frontend/src/routes/adventures/+page.server.ts
+++ b/frontend/src/routes/adventures/+page.server.ts
@@ -76,5 +76,21 @@ export const actions: Actions = {
});
let data = await res.json();
return data;
+ },
+ attachment: async (event) => {
+ let formData = await event.request.formData();
+ let csrfToken = await fetchCSRFToken();
+ let sessionId = event.cookies.get('sessionid');
+ let res = await fetch(`${serverEndpoint}/api/attachments/`, {
+ method: 'POST',
+ headers: {
+ Cookie: `csrftoken=${csrfToken}; sessionid=${sessionId}`,
+ 'X-CSRFToken': csrfToken,
+ Referer: event.url.origin // Include Referer header
+ },
+ body: formData
+ });
+ let data = await res.json();
+ return data;
}
};
diff --git a/frontend/src/routes/adventures/[id]/+page.svelte b/frontend/src/routes/adventures/[id]/+page.svelte
index 21b622f..96b7cbb 100644
--- a/frontend/src/routes/adventures/[id]/+page.svelte
+++ b/frontend/src/routes/adventures/[id]/+page.svelte
@@ -12,6 +12,12 @@
return marked(markdown);
};
+ function deleteAttachment(event: CustomEvent
) {
+ adventure.attachments = adventure.attachments.filter(
+ (attachment) => attachment.id !== event.detail
+ );
+ }
+
export let data: PageData;
console.log(data);
@@ -30,6 +36,7 @@
import ClipboardList from '~icons/mdi/clipboard-list';
import AdventureModal from '$lib/components/AdventureModal.svelte';
import ImageDisplayModal from '$lib/components/ImageDisplayModal.svelte';
+ import AttachmentCard from '$lib/components/AttachmentCard.svelte';
onMount(() => {
if (data.props.adventure) {
@@ -380,6 +387,52 @@
{/if}
+ {#if adventure.attachments && adventure.attachments.length > 0}
+
+
+
{$t('adventures.attachments')}
+
+ {#if adventure.attachments && adventure.attachments.length > 0}
+
+ {#each adventure.attachments as attachment}
+
+ {/each}
+
+ {/if}
+
+
+ {/if}
+ {#if adventure.images && adventure.images.length > 0}
+
+
{$t('adventures.images')}
+
+ {#if adventure.images && adventure.images.length > 0}
+
+ {#each adventure.images as image}
+
+
+
+
+
+
(image_url = image.image)}
+ >
+ {#if image.is_primary}
+
+ {$t('adventures.primary')}
+
+ {/if}
+
+ {/each}
+
+ {/if}
+
+
+ {/if}
diff --git a/frontend/src/routes/dashboard/+page.svelte b/frontend/src/routes/dashboard/+page.svelte
index fd3ee82..76c77bb 100644
--- a/frontend/src/routes/dashboard/+page.svelte
+++ b/frontend/src/routes/dashboard/+page.svelte
@@ -21,7 +21,7 @@
x: -50, // Smaller movement for quicker animation
duration: 0.6, // Quicker animation duration
stagger: 0.1, // Faster staggering
- ease: 'power2.out'
+ ease: 'power2.out' // Slightly sharper easing for quicker feel
});
// Stat values with faster reveal and snappier effect
@@ -30,8 +30,8 @@
scale: 0.8, // Slightly less scaling for a snappier effect
duration: 1, // Shorter duration
stagger: 0.2, // Faster staggering
- ease: 'power2.out', // Snappier easing
- delay: 0.3 // Faster delay for quicker sequencing
+ ease: 'elastic.out(0.75, 0.5)', // Slightly snappier bounce
+ delay: 0 // Faster delay for quicker sequencing
});
// Adventure card animations with quicker reveal
@@ -41,7 +41,7 @@
duration: 0.8, // Quicker duration
stagger: 0.1, // Faster staggering
ease: 'power2.out',
- delay: 0.6 // Shorter delay for quicker appearance
+ delay: 0 // Shorter delay for quicker appearance
});
// Inspiration section with faster bounce effect
@@ -50,7 +50,7 @@
scale: 0.7, // Less scale for snappier effect
duration: 1, // Slightly quicker duration
ease: 'elastic.out(0.75, 0.5)', // Snappier bounce
- delay: 1 // Reduced delay for quicker animation
+ delay: 0 // Reduced delay for quicker animation
});
});
From 1f3abf7f3281046fb077ef89adc3dd651f08f8f2 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sun, 19 Jan 2025 22:33:35 -0500
Subject: [PATCH 11/30] feat: replace placeholder image with gradient
background and text for no image available state in CardCarousel component
---
frontend/src/lib/components/CardCarousel.svelte | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/frontend/src/lib/components/CardCarousel.svelte b/frontend/src/lib/components/CardCarousel.svelte
index edbf469..cb238d0 100644
--- a/frontend/src/lib/components/CardCarousel.svelte
+++ b/frontend/src/lib/components/CardCarousel.svelte
@@ -95,11 +95,14 @@
{:else}
-
-
+
+
+
+
+ {$t('adventures.no_image_found')}
+
+
{/if}
From 25edec460b19c8ce0c57a542934368d3e1e79ab2 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sun, 19 Jan 2025 23:09:28 -0500
Subject: [PATCH 12/30] feat: enhance search page with reactive data updates
and simplify component usage
---
frontend/src/routes/search/+page.svelte | 60 ++++++++++++-------------
1 file changed, 28 insertions(+), 32 deletions(-)
diff --git a/frontend/src/routes/search/+page.svelte b/frontend/src/routes/search/+page.svelte
index f45e6be..d498aa1 100644
--- a/frontend/src/routes/search/+page.svelte
+++ b/frontend/src/routes/search/+page.svelte
@@ -1,32 +1,39 @@
Search{query ? `: ${query}` : ''}
@@ -44,7 +51,7 @@
Collections
{#each collections as collection}
-
+
{/each}
{/if}
@@ -62,10 +69,7 @@
Regions
{#each regions as region}
- visitedRegion.region === region.id)}
- />
+ vr.region === region.id)} />
{/each}
{/if}
@@ -74,10 +78,7 @@
Cities
{#each cities as city}
- visitedCity.city === city.id)}
- />
+ vc.city === city.id)} />
{/each}
{/if}
@@ -96,8 +97,3 @@
{$t('adventures.no_results')}
{/if}
-
-
- Search{query ? `: ${query}` : ''}
-
-
From 30c58ca1183de42940465d37bcb86dba2453121e Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Mon, 20 Jan 2025 09:01:11 -0500
Subject: [PATCH 13/30] feat: refactor AttachmentCard component to handle
delete action locally and simplify adventure page logic
---
frontend/src/lib/components/AttachmentCard.svelte | 6 +++---
frontend/src/routes/adventures/[id]/+page.svelte | 8 +-------
2 files changed, 4 insertions(+), 10 deletions(-)
diff --git a/frontend/src/lib/components/AttachmentCard.svelte b/frontend/src/lib/components/AttachmentCard.svelte
index 7d90f2f..1de97e8 100644
--- a/frontend/src/lib/components/AttachmentCard.svelte
+++ b/frontend/src/lib/components/AttachmentCard.svelte
@@ -90,10 +90,10 @@
>
{$t('transportation.edit')}
+
+ {$t('adventures.delete')}
+
{/if}
-
- {$t('adventures.delete')}
-
diff --git a/frontend/src/routes/adventures/[id]/+page.svelte b/frontend/src/routes/adventures/[id]/+page.svelte
index 96b7cbb..a471572 100644
--- a/frontend/src/routes/adventures/[id]/+page.svelte
+++ b/frontend/src/routes/adventures/[id]/+page.svelte
@@ -12,12 +12,6 @@
return marked(markdown);
};
- function deleteAttachment(event: CustomEvent) {
- adventure.attachments = adventure.attachments.filter(
- (attachment) => attachment.id !== event.detail
- );
- }
-
export let data: PageData;
console.log(data);
@@ -395,7 +389,7 @@
{#if adventure.attachments && adventure.attachments.length > 0}
{#each adventure.attachments as attachment}
-
+
{/each}
{/if}
From 64d2bdebcea09c1f654764c5baa2a82307290df3 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Mon, 20 Jan 2025 20:03:00 -0500
Subject: [PATCH 14/30] feat: add GPX file handling and GeoJSON integration in
adventure page; update dependencies and AttachmentCard component
---
.../adventures/views/attachment_view.py | 2 -
frontend/package.json | 1 +
frontend/pnpm-lock.yaml | 40 +++++++++++
.../src/lib/components/AttachmentCard.svelte | 2 +-
.../src/routes/adventures/[id]/+page.svelte | 69 ++++++++++++++++++-
frontend/src/routes/gpx/[file]/+server.ts | 22 ++++++
6 files changed, 131 insertions(+), 5 deletions(-)
create mode 100644 frontend/src/routes/gpx/[file]/+server.ts
diff --git a/backend/server/adventures/views/attachment_view.py b/backend/server/adventures/views/attachment_view.py
index 47ed328..e83bdea 100644
--- a/backend/server/adventures/views/attachment_view.py
+++ b/backend/server/adventures/views/attachment_view.py
@@ -2,10 +2,8 @@ from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
-from django.db.models import Q
from adventures.models import Adventure, Attachment
from adventures.serializers import AttachmentSerializer
-import uuid
class AttachmentViewSet(viewsets.ModelViewSet):
serializer_class = AttachmentSerializer
diff --git a/frontend/package.json b/frontend/package.json
index f8abe55..5b53d58 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -40,6 +40,7 @@
"type": "module",
"dependencies": {
"@lukulent/svelte-umami": "^0.0.3",
+ "@mapbox/togeojson": "^0.16.2",
"emoji-picker-element": "^1.26.0",
"gsap": "^3.12.7",
"marked": "^15.0.4",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 3e72f67..7a021cb 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -11,6 +11,9 @@ importers:
'@lukulent/svelte-umami':
specifier: ^0.0.3
version: 0.0.3(svelte@4.2.19)
+ '@mapbox/togeojson':
+ specifier: ^0.16.2
+ version: 0.16.2
emoji-picker-element:
specifier: ^1.26.0
version: 1.26.0
@@ -483,6 +486,10 @@ packages:
'@mapbox/tiny-sdf@2.0.6':
resolution: {integrity: sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==}
+ '@mapbox/togeojson@0.16.2':
+ resolution: {integrity: sha512-DcApudmw4g/grOrpM5gYPZfts6Kr8litBESN6n/27sDsjR2f+iJhx4BA0J2B+XrLlnHyJkKztYApe6oCUZpzFA==}
+ hasBin: true
+
'@mapbox/unitbezier@0.0.1':
resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==}
@@ -868,6 +875,10 @@ packages:
engines: {node: '>=16'}
hasBin: true
+ '@xmldom/xmldom@0.8.10':
+ resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
+ engines: {node: '>=10.0.0'}
+
abbrev@1.1.1:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
@@ -972,6 +983,9 @@ packages:
resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==}
engines: {node: '>=8.0.0'}
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
builtin-modules@3.3.0:
resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
engines: {node: '>=6'}
@@ -1039,6 +1053,10 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ concat-stream@2.0.0:
+ resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==}
+ engines: {'0': node >= 6.0}
+
confbox@0.1.7:
resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==}
@@ -2116,6 +2134,9 @@ packages:
type@2.7.3:
resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==}
+ typedarray@0.0.6:
+ resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+
typescript@5.5.2:
resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==}
engines: {node: '>=14.17'}
@@ -2553,6 +2574,12 @@ snapshots:
'@mapbox/tiny-sdf@2.0.6': {}
+ '@mapbox/togeojson@0.16.2':
+ dependencies:
+ '@xmldom/xmldom': 0.8.10
+ concat-stream: 2.0.0
+ minimist: 1.2.8
+
'@mapbox/unitbezier@0.0.1': {}
'@mapbox/vector-tile@1.3.1':
@@ -3031,6 +3058,8 @@ snapshots:
- encoding
- supports-color
+ '@xmldom/xmldom@0.8.10': {}
+
abbrev@1.1.1: {}
acorn-import-attributes@1.9.5(acorn@8.12.0):
@@ -3125,6 +3154,8 @@ snapshots:
buffer-crc32@1.0.0: {}
+ buffer-from@1.1.2: {}
+
builtin-modules@3.3.0: {}
bytewise-core@1.2.3:
@@ -3196,6 +3227,13 @@ snapshots:
concat-map@0.0.1: {}
+ concat-stream@2.0.0:
+ dependencies:
+ buffer-from: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ typedarray: 0.0.6
+
confbox@0.1.7: {}
console-control-strings@1.1.0: {}
@@ -4320,6 +4358,8 @@ snapshots:
type@2.7.3: {}
+ typedarray@0.0.6: {}
+
typescript@5.5.2: {}
typewise-core@1.2.0: {}
diff --git a/frontend/src/lib/components/AttachmentCard.svelte b/frontend/src/lib/components/AttachmentCard.svelte
index 1de97e8..226b052 100644
--- a/frontend/src/lib/components/AttachmentCard.svelte
+++ b/frontend/src/lib/components/AttachmentCard.svelte
@@ -27,7 +27,7 @@
const isImage = ['.jpg', '.jpeg', '.png', '.gif', '.webp'].some((ext) =>
attachment.file.endsWith(ext)
);
- return isImage ? `url(${attachment.file})` : 'url(/path/to/default-placeholder.png)';
+ return isImage ? `url(${attachment.file})` : '';
}
diff --git a/frontend/src/routes/adventures/[id]/+page.svelte b/frontend/src/routes/adventures/[id]/+page.svelte
index a471572..90fc283 100644
--- a/frontend/src/routes/adventures/[id]/+page.svelte
+++ b/frontend/src/routes/adventures/[id]/+page.svelte
@@ -4,14 +4,65 @@
import type { PageData } from './$types';
import { goto } from '$app/navigation';
import Lost from '$lib/assets/undraw_lost.svg';
- import { DefaultMarker, MapLibre, Popup } from 'svelte-maplibre';
+ import { DefaultMarker, MapLibre, Popup, GeoJSON, LineLayer } from 'svelte-maplibre';
import { t } from 'svelte-i18n';
import { marked } from 'marked'; // Import the markdown parser
+ // @ts-ignore
+ import toGeoJSON from '@mapbox/togeojson';
+
+ let geojson: any;
+
const renderMarkdown = (markdown: string) => {
return marked(markdown);
};
+ async function getGpxFiles() {
+ let gpxfiles: string[] = [];
+
+ // Collect all GPX file attachments
+ if (adventure.attachments && adventure.attachments.length > 0) {
+ adventure.attachments
+ .filter((attachment) => attachment.extension === 'gpx')
+ .forEach((attachment) => gpxfiles.push(attachment.file));
+ }
+
+ // Initialize a collection GeoJSON object
+ geojson = {
+ type: 'FeatureCollection',
+ features: []
+ };
+
+ // Process each GPX file
+ if (gpxfiles.length > 0) {
+ for (const gpxfile of gpxfiles) {
+ try {
+ let gpxFileName = gpxfile.split('/').pop();
+ let res = await fetch('/gpx/' + gpxFileName);
+
+ if (!res.ok) {
+ console.error(`Failed to fetch GPX file: ${gpxFileName}`);
+ continue;
+ }
+
+ let gpxData = await res.text();
+ let parser = new DOMParser();
+ let gpx = parser.parseFromString(gpxData, 'text/xml');
+
+ // Convert GPX to GeoJSON and merge features
+ let convertedGeoJSON = toGeoJSON.gpx(gpx);
+ if (convertedGeoJSON.features) {
+ geojson.features.push(...convertedGeoJSON.features);
+ }
+ } catch (error) {
+ console.error(`Error processing GPX file ${gpxfile}:`, error);
+ }
+ }
+
+ // Log the final GeoJSON for debugging
+ }
+ }
+
export let data: PageData;
console.log(data);
@@ -32,7 +83,7 @@
import ImageDisplayModal from '$lib/components/ImageDisplayModal.svelte';
import AttachmentCard from '$lib/components/AttachmentCard.svelte';
- onMount(() => {
+ onMount(async () => {
if (data.props.adventure) {
adventure = data.props.adventure;
// sort so that any image in adventure_images .is_primary is first
@@ -48,6 +99,7 @@
} else {
notFound = true;
}
+ getGpxFiles();
});
function saveEdit(event: CustomEvent) {
@@ -345,6 +397,19 @@
center={{ lng: adventure.longitude, lat: adventure.latitude }}
zoom={12}
>
+
+ {#if geojson}
+
+
+
+
+ {/if}
+
diff --git a/frontend/src/routes/gpx/[file]/+server.ts b/frontend/src/routes/gpx/[file]/+server.ts
new file mode 100644
index 0000000..9edaa38
--- /dev/null
+++ b/frontend/src/routes/gpx/[file]/+server.ts
@@ -0,0 +1,22 @@
+const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
+const endpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
+
+/** @type {import('./$types').RequestHandler} */
+export async function GET(event) {
+ let sessionid = event.cookies.get('sessionid');
+ let fileName = event.params.file;
+ let res = await fetch(`${endpoint}/media/attachments/${fileName}`, {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ Cookie: `sessionid=${sessionid}`
+ }
+ });
+ let data = await res.text();
+ return new Response(data, {
+ status: res.status,
+ headers: {
+ 'Content-Type': 'application/xml'
+ }
+ });
+}
From f9cf92041dc19635078d93012a07e9a3f1c3b43c Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Tue, 21 Jan 2025 19:01:45 -0500
Subject: [PATCH 15/30] feat: enhance CategoryModal with loading state and
remove unused activities route
---
.../src/lib/components/CategoryModal.svelte | 43 +++++++++-------
.../src/routes/activities/+page.server.ts | 51 -------------------
frontend/src/routes/activities/+page.svelte | 38 --------------
.../src/routes/adventures/[id]/+page.svelte | 2 -
4 files changed, 25 insertions(+), 109 deletions(-)
delete mode 100644 frontend/src/routes/activities/+page.server.ts
delete mode 100644 frontend/src/routes/activities/+page.svelte
diff --git a/frontend/src/lib/components/CategoryModal.svelte b/frontend/src/lib/components/CategoryModal.svelte
index 687e6c7..e28706f 100644
--- a/frontend/src/lib/components/CategoryModal.svelte
+++ b/frontend/src/lib/components/CategoryModal.svelte
@@ -6,14 +6,14 @@
let modal: HTMLDialogElement;
import { t } from 'svelte-i18n';
- import InformationSlabCircle from '~icons/mdi/information-slab-circle';
-
export let categories: Category[] = [];
let category_to_edit: Category | null = null;
let is_changed: boolean = false;
+ let has_loaded: boolean = false;
+
onMount(async () => {
modal = document.getElementById('my_modal_1') as HTMLDialogElement;
if (modal) {
@@ -21,6 +21,7 @@
}
let category_fetch = await fetch('/api/categories/categories');
categories = await category_fetch.json();
+ has_loaded = true;
// remove the general category if it exists
// categories = categories.filter((c) => c.name !== 'general');
});
@@ -77,25 +78,31 @@
{$t('categories.manage_categories')}
- {#each categories as category}
-
-
{category.display_name} {category.icon}
-
-
(category_to_edit = category)} class="btn btn-primary btn-sm"
- >Edit
- {#if category.name != 'general'}
-
{$t('adventures.remove')}
+
{category.display_name} {category.icon}
+
+ (category_to_edit = category)} class="btn btn-primary btn-sm"
+ >Edit
- {:else}
- {$t('adventures.remove')}
- {/if}
+ {#if category.name != 'general'}
+ {$t('adventures.remove')}
+ {:else}
+ {$t('adventures.remove')}
+ {/if}
+
+ {/each}
+ {#if categories.length === 0}
+
{$t('categories.no_categories_found')}
+ {/if}
+ {:else}
+
+
- {/each}
- {#if categories.length === 0}
-
{$t('categories.no_categories_found')}
{/if}
{#if category_to_edit}
diff --git a/frontend/src/routes/activities/+page.server.ts b/frontend/src/routes/activities/+page.server.ts
deleted file mode 100644
index 626bef8..0000000
--- a/frontend/src/routes/activities/+page.server.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { redirect, type Actions } from '@sveltejs/kit';
-import type { PageServerLoad } from './$types';
-import { fetchCSRFToken } from '$lib/index.server';
-const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
-const endpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
-
-export const load = (async (event) => {
- if (!event.locals.user) {
- return redirect(302, '/login');
- }
- let csrfToken = await fetchCSRFToken();
- let allActivities: string[] = [];
- let res = await event.fetch(`${endpoint}/api/activity-types/types/`, {
- headers: {
- 'X-CSRFToken': csrfToken,
- Cookie: `csrftoken=${csrfToken}`
- },
- credentials: 'include'
- });
- console.log(res);
- let data = await res.json();
- if (data) {
- allActivities = data;
- }
- return {
- props: {
- activities: allActivities
- }
- };
-}) satisfies PageServerLoad;
-
-export const actions: Actions = {
- getActivities: async (event) => {
- let csrfToken = await fetchCSRFToken();
- let allActivities: string[] = [];
- let res = await fetch(`${endpoint}/api/activity-types/types/`, {
- headers: {
- 'X-CSRFToken': csrfToken,
- 'Content-Type': 'application/json',
- Cookie: `csrftoken=${csrfToken}`,
- Referer: event.url.origin // Include Referer header
- }
- });
- console.log(res);
- let data = await res.json();
- if (data) {
- allActivities = data;
- }
- return { activities: allActivities };
- }
-};
diff --git a/frontend/src/routes/activities/+page.svelte b/frontend/src/routes/activities/+page.svelte
deleted file mode 100644
index 89aa22c..0000000
--- a/frontend/src/routes/activities/+page.svelte
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
- {$t('navbar.tag')}
- {$t('adventures.actions')}
-
-
-
- {#each activities as activity}
-
- {activity}
-
- goto(`/search?query=${activity}&property=activity_types`)}
- >{$t('adventures.see_adventures')}
-
-
- {/each}
-
-
-
-
- My Tags
-
-
diff --git a/frontend/src/routes/adventures/[id]/+page.svelte b/frontend/src/routes/adventures/[id]/+page.svelte
index 90fc283..89bc328 100644
--- a/frontend/src/routes/adventures/[id]/+page.svelte
+++ b/frontend/src/routes/adventures/[id]/+page.svelte
@@ -58,8 +58,6 @@
console.error(`Error processing GPX file ${gpxfile}:`, error);
}
}
-
- // Log the final GeoJSON for debugging
}
}
From 1b3cf6ab39748971111326463176ebde7fd7e9e4 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Tue, 21 Jan 2025 19:17:51 -0500
Subject: [PATCH 16/30] feat: add keyboard shortcut to focus search input in
Navbar and clean up dashboard animations
---
frontend/src/lib/components/Navbar.svelte | 50 +++++++++++++---------
frontend/src/routes/dashboard/+page.svelte | 10 -----
2 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/frontend/src/lib/components/Navbar.svelte b/frontend/src/lib/components/Navbar.svelte
index 13a2e85..5e0d475 100644
--- a/frontend/src/lib/components/Navbar.svelte
+++ b/frontend/src/lib/components/Navbar.svelte
@@ -12,6 +12,28 @@
import { page } from '$app/stores';
import { t, locale, locales } from 'svelte-i18n';
import { themes } from '$lib';
+ import { onMount } from 'svelte';
+ let inputElement: HTMLInputElement | null = null;
+
+ // Event listener for focusing input
+ function handleKeydown(event: KeyboardEvent) {
+ if (event.key === '/' && document.activeElement !== inputElement) {
+ event.preventDefault(); // Prevent browser's search shortcut
+ if (inputElement) {
+ inputElement.focus();
+ }
+ }
+ }
+
+ onMount(() => {
+ // Attach event listener on component mount
+ document.addEventListener('keydown', handleKeydown);
+
+ // Cleanup event listener on component destruction
+ return () => {
+ document.removeEventListener('keydown', handleKeydown);
+ };
+ });
let languages: { [key: string]: string } = {
en: 'English',
@@ -123,12 +145,7 @@
{#if data.user}
-
+
-
-
-
-
-
+ /
{$t('navbar.search')}
Date: Tue, 21 Jan 2025 19:33:48 -0500
Subject: [PATCH 17/30] feat: enhance attachment handling with new localization
strings and GPX upload tips
---
.../src/lib/components/AdventureModal.svelte | 4 ++--
.../src/lib/components/AttachmentCard.svelte | 16 +++++++++-------
frontend/src/locales/de.json | 15 ++++++++++++++-
frontend/src/locales/en.json | 2 ++
frontend/src/locales/es.json | 15 ++++++++++++++-
frontend/src/locales/fr.json | 15 ++++++++++++++-
frontend/src/locales/it.json | 15 ++++++++++++++-
frontend/src/locales/nl.json | 15 ++++++++++++++-
frontend/src/locales/pl.json | 15 ++++++++++++++-
frontend/src/locales/sv.json | 15 ++++++++++++++-
frontend/src/locales/zh.json | 15 ++++++++++++++-
frontend/src/routes/adventures/[id]/+page.svelte | 12 +++++++++++-
frontend/src/routes/search/+page.svelte | 7 ++++++-
13 files changed, 142 insertions(+), 19 deletions(-)
diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte
index 9e31453..e734744 100644
--- a/frontend/src/lib/components/AdventureModal.svelte
+++ b/frontend/src/lib/components/AdventureModal.svelte
@@ -997,7 +997,7 @@ it would also work to just use on:click on the MapLibre component itself. -->
{$t('adventures.upload')}
@@ -1014,7 +1014,7 @@ it would also work to just use on:click on the MapLibre component itself. -->
-
window.open(attachment.file, '_blank')}
- >
- {$t('notes.open')}
-
+ {#if !allowEdit}
+
window.open(attachment.file, '_blank')}
+ >
+ {$t('notes.open')}
+
+ {/if}
{#if allowEdit}
{
@@ -447,7 +449,15 @@
{#if adventure.attachments && adventure.attachments.length > 0}
-
{$t('adventures.attachments')}
+
+ {$t('adventures.attachments')}
+
+
+
+
+
+
+
{#if adventure.attachments && adventure.attachments.length > 0}
diff --git a/frontend/src/routes/search/+page.svelte b/frontend/src/routes/search/+page.svelte
index d498aa1..1e96cbb 100644
--- a/frontend/src/routes/search/+page.svelte
+++ b/frontend/src/routes/search/+page.svelte
@@ -42,7 +42,7 @@
Adventures
{#each adventures as adventure}
-
+
{/each}
{/if}
@@ -97,3 +97,8 @@
{$t('adventures.no_results')}
{/if}
+
+
+ Search: {query}
+
+
From 3f30819d25dac9de7d6bf5057c80c34460bb21f5 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Tue, 21 Jan 2025 19:40:56 -0500
Subject: [PATCH 18/30] feat: add GPX file support in AdventureModal and
improve map marker handling
---
.../src/lib/components/AdventureModal.svelte | 2 +-
.../src/routes/adventures/[id]/+page.svelte | 84 ++++++++++---------
2 files changed, 45 insertions(+), 41 deletions(-)
diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte
index e734744..cb5a920 100644
--- a/frontend/src/lib/components/AdventureModal.svelte
+++ b/frontend/src/lib/components/AdventureModal.svelte
@@ -990,7 +990,7 @@ it would also work to just use on:click on the MapLibre component itself. -->
type="file"
id="fileInput"
class="file-input file-input-bordered w-full max-w-xs"
- accept="image/*,video/*,audio/*,application/pdf"
+ accept="image/*,video/*,audio/*,application/pdf,.gpx"
bind:this={fileInput}
/>
diff --git a/frontend/src/routes/adventures/[id]/+page.svelte b/frontend/src/routes/adventures/[id]/+page.svelte
index 8d3ea0c..fb0528f 100644
--- a/frontend/src/routes/adventures/[id]/+page.svelte
+++ b/frontend/src/routes/adventures/[id]/+page.svelte
@@ -99,7 +99,7 @@
} else {
notFound = true;
}
- getGpxFiles();
+ await getGpxFiles();
});
function saveEdit(event: CustomEvent) {
@@ -379,23 +379,25 @@
{/if}
- {#if adventure.longitude && adventure.latitude}
-
-
-
{$t('adventures.latitude')}
-
{adventure.latitude}° N
+ {#if (adventure.longitude && adventure.latitude) || geojson}
+ {#if adventure.longitude && adventure.latitude}
+
+
+
{$t('adventures.latitude')}
+
{adventure.latitude}° N
+
+
+
{$t('adventures.longitude')}
+
{adventure.longitude}° W
+
-
-
{$t('adventures.longitude')}
-
{adventure.longitude}° W
-
-
+ {/if}
{#if geojson}
@@ -415,34 +417,36 @@
it would also work to just use on:click on the MapLibre component itself. -->
-
-
- {adventure.name}
-
- {adventure.category?.display_name + ' ' + adventure.category?.icon}
-
- {#if adventure.visits.length > 0}
-
- {#each adventure.visits as visit}
- {visit.start_date
- ? new Date(visit.start_date).toLocaleDateString(undefined, {
- timeZone: 'UTC'
- })
- : ''}
- {visit.end_date &&
- visit.end_date !== '' &&
- visit.end_date !== visit.start_date
- ? ' - ' +
- new Date(visit.end_date).toLocaleDateString(undefined, {
- timeZone: 'UTC'
- })
- : ''}
-
- {/each}
+ {#if adventure.longitude && adventure.latitude}
+
+
+ {adventure.name}
+
+ {adventure.category?.display_name + ' ' + adventure.category?.icon}
- {/if}
-
-
+ {#if adventure.visits.length > 0}
+
+ {#each adventure.visits as visit}
+ {visit.start_date
+ ? new Date(visit.start_date).toLocaleDateString(undefined, {
+ timeZone: 'UTC'
+ })
+ : ''}
+ {visit.end_date &&
+ visit.end_date !== '' &&
+ visit.end_date !== visit.start_date
+ ? ' - ' +
+ new Date(visit.end_date).toLocaleDateString(undefined, {
+ timeZone: 'UTC'
+ })
+ : ''}
+
+ {/each}
+
+ {/if}
+
+
+ {/if}
{/if}
From 10230e926c31c7609a65f9e8705e5f4c5bbd9afe Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 22 Jan 2025 03:28:49 +0000
Subject: [PATCH 19/30] build(deps-dev): bump vite
Bumps the npm_and_yarn group with 1 update in the /frontend directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).
Updates `vite` from 5.3.6 to 5.4.12
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.12/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.12/packages/vite)
---
updated-dependencies:
- dependency-name: vite
dependency-type: direct:development
dependency-group: npm_and_yarn
...
Signed-off-by: dependabot[bot]
---
frontend/package.json | 2 +-
frontend/pnpm-lock.yaml | 259 ++++++++++++++++++++++++++++++++++------
2 files changed, 223 insertions(+), 38 deletions(-)
diff --git a/frontend/package.json b/frontend/package.json
index 442a9d6..34753ba 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -35,7 +35,7 @@
"tslib": "^2.6.3",
"typescript": "^5.5.2",
"unplugin-icons": "^0.19.0",
- "vite": "^5.3.6"
+ "vite": "^5.4.12"
},
"type": "module",
"dependencies": {
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 1c141b3..bb91165 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -41,19 +41,19 @@ importers:
version: 1.1.67
'@sveltejs/adapter-auto':
specifier: ^3.2.2
- version: 3.2.2(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))
+ version: 3.2.2(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))
'@sveltejs/adapter-node':
specifier: ^5.2.0
- version: 5.2.0(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))
+ version: 5.2.0(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))
'@sveltejs/adapter-vercel':
specifier: ^5.4.1
- version: 5.4.1(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))
+ version: 5.4.1(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))
'@sveltejs/kit':
specifier: ^2.8.3
- version: 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ version: 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@sveltejs/vite-plugin-svelte':
specifier: ^3.1.1
- version: 3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ version: 3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@tailwindcss/typography':
specifier: ^0.5.13
version: 0.5.13(tailwindcss@3.4.4)
@@ -97,8 +97,8 @@ importers:
specifier: ^0.19.0
version: 0.19.0
vite:
- specifier: ^5.3.6
- version: 5.3.6(@types/node@22.5.4)
+ specifier: ^5.4.12
+ version: 5.4.12(@types/node@22.5.4)
packages:
@@ -555,81 +555,176 @@ packages:
cpu: [arm]
os: [android]
+ '@rollup/rollup-android-arm-eabi@4.31.0':
+ resolution: {integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==}
+ cpu: [arm]
+ os: [android]
+
'@rollup/rollup-android-arm64@4.24.0':
resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==}
cpu: [arm64]
os: [android]
+ '@rollup/rollup-android-arm64@4.31.0':
+ resolution: {integrity: sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==}
+ cpu: [arm64]
+ os: [android]
+
'@rollup/rollup-darwin-arm64@4.24.0':
resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==}
cpu: [arm64]
os: [darwin]
+ '@rollup/rollup-darwin-arm64@4.31.0':
+ resolution: {integrity: sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==}
+ cpu: [arm64]
+ os: [darwin]
+
'@rollup/rollup-darwin-x64@4.24.0':
resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==}
cpu: [x64]
os: [darwin]
+ '@rollup/rollup-darwin-x64@4.31.0':
+ resolution: {integrity: sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.31.0':
+ resolution: {integrity: sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.31.0':
+ resolution: {integrity: sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==}
+ cpu: [x64]
+ os: [freebsd]
+
'@rollup/rollup-linux-arm-gnueabihf@4.24.0':
resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==}
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm-gnueabihf@4.31.0':
+ resolution: {integrity: sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm-musleabihf@4.24.0':
resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==}
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm-musleabihf@4.31.0':
+ resolution: {integrity: sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-gnu@4.24.0':
resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==}
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-gnu@4.31.0':
+ resolution: {integrity: sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==}
+ cpu: [arm64]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-musl@4.24.0':
resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==}
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-musl@4.31.0':
+ resolution: {integrity: sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.31.0':
+ resolution: {integrity: sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==}
+ cpu: [loong64]
+ os: [linux]
+
'@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==}
cpu: [ppc64]
os: [linux]
+ '@rollup/rollup-linux-powerpc64le-gnu@4.31.0':
+ resolution: {integrity: sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==}
+ cpu: [ppc64]
+ os: [linux]
+
'@rollup/rollup-linux-riscv64-gnu@4.24.0':
resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==}
cpu: [riscv64]
os: [linux]
+ '@rollup/rollup-linux-riscv64-gnu@4.31.0':
+ resolution: {integrity: sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==}
+ cpu: [riscv64]
+ os: [linux]
+
'@rollup/rollup-linux-s390x-gnu@4.24.0':
resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==}
cpu: [s390x]
os: [linux]
+ '@rollup/rollup-linux-s390x-gnu@4.31.0':
+ resolution: {integrity: sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==}
+ cpu: [s390x]
+ os: [linux]
+
'@rollup/rollup-linux-x64-gnu@4.24.0':
resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==}
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-gnu@4.31.0':
+ resolution: {integrity: sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-linux-x64-musl@4.24.0':
resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==}
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-musl@4.31.0':
+ resolution: {integrity: sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-win32-arm64-msvc@4.24.0':
resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==}
cpu: [arm64]
os: [win32]
+ '@rollup/rollup-win32-arm64-msvc@4.31.0':
+ resolution: {integrity: sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==}
+ cpu: [arm64]
+ os: [win32]
+
'@rollup/rollup-win32-ia32-msvc@4.24.0':
resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==}
cpu: [ia32]
os: [win32]
+ '@rollup/rollup-win32-ia32-msvc@4.31.0':
+ resolution: {integrity: sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==}
+ cpu: [ia32]
+ os: [win32]
+
'@rollup/rollup-win32-x64-msvc@4.24.0':
resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==}
cpu: [x64]
os: [win32]
+ '@rollup/rollup-win32-x64-msvc@4.31.0':
+ resolution: {integrity: sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==}
+ cpu: [x64]
+ os: [win32]
+
'@sveltejs/adapter-auto@3.2.2':
resolution: {integrity: sha512-Mso5xPCA8zgcKrv+QioVlqMZkyUQ5MjDJiEPuG/Z7cV/5tmwV7LmcVWk5tZ+H0NCOV1x12AsoSpt/CwFwuVXMA==}
peerDependencies:
@@ -1559,8 +1654,8 @@ packages:
picocolors@1.0.1:
resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
- picocolors@1.1.0:
- resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -1629,8 +1724,8 @@ packages:
resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.4.47:
- resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
+ postcss@8.5.1:
+ resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
engines: {node: ^10 || ^12 || >=14}
potpack@2.0.0:
@@ -1713,6 +1808,11 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ rollup@4.31.0:
+ resolution: {integrity: sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
@@ -2017,8 +2117,8 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- vite@5.3.6:
- resolution: {integrity: sha512-es78AlrylO8mTVBygC0gTC0FENv0C6T496vvd33ydbjF/mIi9q3XQ9A3NWo5qLGFKywvz10J26813OkLvcQleA==}
+ vite@5.4.12:
+ resolution: {integrity: sha512-KwUaKB27TvWwDJr1GjjWthLMATbGEbeWYZIbGZ5qFIsgPP3vWzLu4cVooqhm5/Z2SPDUMjyPVjTztm5tYKwQxA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -2026,6 +2126,7 @@ packages:
less: '*'
lightningcss: ^1.21.0
sass: '*'
+ sass-embedded: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
@@ -2038,6 +2139,8 @@ packages:
optional: true
sass:
optional: true
+ sass-embedded:
+ optional: true
stylus:
optional: true
sugarss:
@@ -2480,76 +2583,133 @@ snapshots:
'@rollup/rollup-android-arm-eabi@4.24.0':
optional: true
+ '@rollup/rollup-android-arm-eabi@4.31.0':
+ optional: true
+
'@rollup/rollup-android-arm64@4.24.0':
optional: true
+ '@rollup/rollup-android-arm64@4.31.0':
+ optional: true
+
'@rollup/rollup-darwin-arm64@4.24.0':
optional: true
+ '@rollup/rollup-darwin-arm64@4.31.0':
+ optional: true
+
'@rollup/rollup-darwin-x64@4.24.0':
optional: true
+ '@rollup/rollup-darwin-x64@4.31.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.31.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-arm-gnueabihf@4.24.0':
optional: true
+ '@rollup/rollup-linux-arm-gnueabihf@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-arm-musleabihf@4.24.0':
optional: true
+ '@rollup/rollup-linux-arm-musleabihf@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-arm64-gnu@4.24.0':
optional: true
+ '@rollup/rollup-linux-arm64-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-arm64-musl@4.24.0':
optional: true
+ '@rollup/rollup-linux-arm64-musl@4.31.0':
+ optional: true
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
optional: true
+ '@rollup/rollup-linux-powerpc64le-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-riscv64-gnu@4.24.0':
optional: true
+ '@rollup/rollup-linux-riscv64-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-s390x-gnu@4.24.0':
optional: true
+ '@rollup/rollup-linux-s390x-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-x64-gnu@4.24.0':
optional: true
+ '@rollup/rollup-linux-x64-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-x64-musl@4.24.0':
optional: true
+ '@rollup/rollup-linux-x64-musl@4.31.0':
+ optional: true
+
'@rollup/rollup-win32-arm64-msvc@4.24.0':
optional: true
+ '@rollup/rollup-win32-arm64-msvc@4.31.0':
+ optional: true
+
'@rollup/rollup-win32-ia32-msvc@4.24.0':
optional: true
+ '@rollup/rollup-win32-ia32-msvc@4.31.0':
+ optional: true
+
'@rollup/rollup-win32-x64-msvc@4.24.0':
optional: true
- '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))':
+ '@rollup/rollup-win32-x64-msvc@4.31.0':
+ optional: true
+
+ '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))':
dependencies:
- '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
import-meta-resolve: 4.1.0
- '@sveltejs/adapter-node@5.2.0(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))':
+ '@sveltejs/adapter-node@5.2.0(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))':
dependencies:
'@rollup/plugin-commonjs': 26.0.1(rollup@4.24.0)
'@rollup/plugin-json': 6.1.0(rollup@4.24.0)
'@rollup/plugin-node-resolve': 15.2.3(rollup@4.24.0)
- '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
rollup: 4.24.0
- '@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))':
+ '@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))':
dependencies:
- '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@vercel/nft': 0.27.2
esbuild: 0.21.5
transitivePeerDependencies:
- encoding
- supports-color
- '@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))':
+ '@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))':
dependencies:
- '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@types/cookie': 0.6.0
cookie: 0.6.0
devalue: 5.1.1
@@ -2563,28 +2723,28 @@ snapshots:
sirv: 3.0.0
svelte: 4.2.19
tiny-glob: 0.2.9
- vite: 5.3.6(@types/node@22.5.4)
+ vite: 5.4.12(@types/node@22.5.4)
- '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))':
+ '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))':
dependencies:
- '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
debug: 4.3.5
svelte: 4.2.19
- vite: 5.3.6(@types/node@22.5.4)
+ vite: 5.4.12(@types/node@22.5.4)
transitivePeerDependencies:
- supports-color
- '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))':
+ '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))':
dependencies:
- '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
debug: 4.3.5
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.10
svelte: 4.2.19
svelte-hmr: 0.16.0(svelte@4.2.19)
- vite: 5.3.6(@types/node@22.5.4)
- vitefu: 0.2.5(vite@5.3.6(@types/node@22.5.4))
+ vite: 5.4.12(@types/node@22.5.4)
+ vitefu: 0.2.5(vite@5.4.12(@types/node@22.5.4))
transitivePeerDependencies:
- supports-color
@@ -3499,7 +3659,7 @@ snapshots:
picocolors@1.0.1: {}
- picocolors@1.1.0: {}
+ picocolors@1.1.1: {}
picomatch@2.3.1: {}
@@ -3562,10 +3722,10 @@ snapshots:
picocolors: 1.0.1
source-map-js: 1.2.0
- postcss@8.4.47:
+ postcss@8.5.1:
dependencies:
nanoid: 3.3.8
- picocolors: 1.1.0
+ picocolors: 1.1.1
source-map-js: 1.2.1
potpack@2.0.0: {}
@@ -3653,6 +3813,31 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.24.0
fsevents: 2.3.3
+ rollup@4.31.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.31.0
+ '@rollup/rollup-android-arm64': 4.31.0
+ '@rollup/rollup-darwin-arm64': 4.31.0
+ '@rollup/rollup-darwin-x64': 4.31.0
+ '@rollup/rollup-freebsd-arm64': 4.31.0
+ '@rollup/rollup-freebsd-x64': 4.31.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.31.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.31.0
+ '@rollup/rollup-linux-arm64-gnu': 4.31.0
+ '@rollup/rollup-linux-arm64-musl': 4.31.0
+ '@rollup/rollup-linux-loongarch64-gnu': 4.31.0
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.31.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.31.0
+ '@rollup/rollup-linux-s390x-gnu': 4.31.0
+ '@rollup/rollup-linux-x64-gnu': 4.31.0
+ '@rollup/rollup-linux-x64-musl': 4.31.0
+ '@rollup/rollup-win32-arm64-msvc': 4.31.0
+ '@rollup/rollup-win32-ia32-msvc': 4.31.0
+ '@rollup/rollup-win32-x64-msvc': 4.31.0
+ fsevents: 2.3.3
+
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
@@ -3973,18 +4158,18 @@ snapshots:
util-deprecate@1.0.2: {}
- vite@5.3.6(@types/node@22.5.4):
+ vite@5.4.12(@types/node@22.5.4):
dependencies:
esbuild: 0.21.5
- postcss: 8.4.47
- rollup: 4.24.0
+ postcss: 8.5.1
+ rollup: 4.31.0
optionalDependencies:
'@types/node': 22.5.4
fsevents: 2.3.3
- vitefu@0.2.5(vite@5.3.6(@types/node@22.5.4)):
+ vitefu@0.2.5(vite@5.4.12(@types/node@22.5.4)):
optionalDependencies:
- vite: 5.3.6(@types/node@22.5.4)
+ vite: 5.4.12(@types/node@22.5.4)
vt-pbf@3.1.3:
dependencies:
From d5fe7eeff81a00ef5559bfaea6206f04d50d034c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 22 Jan 2025 04:51:56 +0000
Subject: [PATCH 20/30] build(deps): bump the npm_and_yarn group across 2
directories with 1 update
Bumps the npm_and_yarn group with 1 update in the /documentation directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).
Bumps the npm_and_yarn group with 1 update in the /frontend directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).
Updates `vite` from 5.4.11 to 5.4.14
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.14/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.14/packages/vite)
Updates `vite` from 5.3.6 to 5.4.12
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.14/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.14/packages/vite)
---
updated-dependencies:
- dependency-name: vite
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: vite
dependency-type: direct:development
dependency-group: npm_and_yarn
...
Signed-off-by: dependabot[bot]
---
documentation/pnpm-lock.yaml | 14 +-
frontend/package.json | 2 +-
frontend/pnpm-lock.yaml | 259 ++++++++++++++++++++++++++++++-----
3 files changed, 230 insertions(+), 45 deletions(-)
diff --git a/documentation/pnpm-lock.yaml b/documentation/pnpm-lock.yaml
index 109ad48..c5fa66d 100644
--- a/documentation/pnpm-lock.yaml
+++ b/documentation/pnpm-lock.yaml
@@ -709,8 +709,8 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
- vite@5.4.11:
- resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==}
+ vite@5.4.14:
+ resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -1105,9 +1105,9 @@ snapshots:
'@ungap/structured-clone@1.2.0': {}
- '@vitejs/plugin-vue@5.2.0(vite@5.4.11)(vue@3.5.13)':
+ '@vitejs/plugin-vue@5.2.0(vite@5.4.14)(vue@3.5.13)':
dependencies:
- vite: 5.4.11
+ vite: 5.4.14
vue: 3.5.13
'@vue/compiler-core@3.5.13':
@@ -1475,7 +1475,7 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.2
- vite@5.4.11:
+ vite@5.4.14:
dependencies:
esbuild: 0.21.5
postcss: 8.4.49
@@ -1492,7 +1492,7 @@ snapshots:
'@shikijs/transformers': 1.23.1
'@shikijs/types': 1.23.1
'@types/markdown-it': 14.1.2
- '@vitejs/plugin-vue': 5.2.0(vite@5.4.11)(vue@3.5.13)
+ '@vitejs/plugin-vue': 5.2.0(vite@5.4.14)(vue@3.5.13)
'@vue/devtools-api': 7.6.4
'@vue/shared': 3.5.13
'@vueuse/core': 11.3.0(vue@3.5.13)
@@ -1501,7 +1501,7 @@ snapshots:
mark.js: 8.11.1
minisearch: 7.1.1
shiki: 1.23.1
- vite: 5.4.11
+ vite: 5.4.14
vue: 3.5.13
optionalDependencies:
postcss: 8.4.49
diff --git a/frontend/package.json b/frontend/package.json
index 442a9d6..34753ba 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -35,7 +35,7 @@
"tslib": "^2.6.3",
"typescript": "^5.5.2",
"unplugin-icons": "^0.19.0",
- "vite": "^5.3.6"
+ "vite": "^5.4.12"
},
"type": "module",
"dependencies": {
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 1c141b3..bb91165 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -41,19 +41,19 @@ importers:
version: 1.1.67
'@sveltejs/adapter-auto':
specifier: ^3.2.2
- version: 3.2.2(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))
+ version: 3.2.2(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))
'@sveltejs/adapter-node':
specifier: ^5.2.0
- version: 5.2.0(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))
+ version: 5.2.0(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))
'@sveltejs/adapter-vercel':
specifier: ^5.4.1
- version: 5.4.1(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))
+ version: 5.4.1(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))
'@sveltejs/kit':
specifier: ^2.8.3
- version: 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ version: 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@sveltejs/vite-plugin-svelte':
specifier: ^3.1.1
- version: 3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ version: 3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@tailwindcss/typography':
specifier: ^0.5.13
version: 0.5.13(tailwindcss@3.4.4)
@@ -97,8 +97,8 @@ importers:
specifier: ^0.19.0
version: 0.19.0
vite:
- specifier: ^5.3.6
- version: 5.3.6(@types/node@22.5.4)
+ specifier: ^5.4.12
+ version: 5.4.12(@types/node@22.5.4)
packages:
@@ -555,81 +555,176 @@ packages:
cpu: [arm]
os: [android]
+ '@rollup/rollup-android-arm-eabi@4.31.0':
+ resolution: {integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==}
+ cpu: [arm]
+ os: [android]
+
'@rollup/rollup-android-arm64@4.24.0':
resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==}
cpu: [arm64]
os: [android]
+ '@rollup/rollup-android-arm64@4.31.0':
+ resolution: {integrity: sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==}
+ cpu: [arm64]
+ os: [android]
+
'@rollup/rollup-darwin-arm64@4.24.0':
resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==}
cpu: [arm64]
os: [darwin]
+ '@rollup/rollup-darwin-arm64@4.31.0':
+ resolution: {integrity: sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==}
+ cpu: [arm64]
+ os: [darwin]
+
'@rollup/rollup-darwin-x64@4.24.0':
resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==}
cpu: [x64]
os: [darwin]
+ '@rollup/rollup-darwin-x64@4.31.0':
+ resolution: {integrity: sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.31.0':
+ resolution: {integrity: sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.31.0':
+ resolution: {integrity: sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==}
+ cpu: [x64]
+ os: [freebsd]
+
'@rollup/rollup-linux-arm-gnueabihf@4.24.0':
resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==}
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm-gnueabihf@4.31.0':
+ resolution: {integrity: sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm-musleabihf@4.24.0':
resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==}
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm-musleabihf@4.31.0':
+ resolution: {integrity: sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-gnu@4.24.0':
resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==}
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-gnu@4.31.0':
+ resolution: {integrity: sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==}
+ cpu: [arm64]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-musl@4.24.0':
resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==}
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-musl@4.31.0':
+ resolution: {integrity: sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.31.0':
+ resolution: {integrity: sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==}
+ cpu: [loong64]
+ os: [linux]
+
'@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==}
cpu: [ppc64]
os: [linux]
+ '@rollup/rollup-linux-powerpc64le-gnu@4.31.0':
+ resolution: {integrity: sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==}
+ cpu: [ppc64]
+ os: [linux]
+
'@rollup/rollup-linux-riscv64-gnu@4.24.0':
resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==}
cpu: [riscv64]
os: [linux]
+ '@rollup/rollup-linux-riscv64-gnu@4.31.0':
+ resolution: {integrity: sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==}
+ cpu: [riscv64]
+ os: [linux]
+
'@rollup/rollup-linux-s390x-gnu@4.24.0':
resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==}
cpu: [s390x]
os: [linux]
+ '@rollup/rollup-linux-s390x-gnu@4.31.0':
+ resolution: {integrity: sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==}
+ cpu: [s390x]
+ os: [linux]
+
'@rollup/rollup-linux-x64-gnu@4.24.0':
resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==}
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-gnu@4.31.0':
+ resolution: {integrity: sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-linux-x64-musl@4.24.0':
resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==}
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-musl@4.31.0':
+ resolution: {integrity: sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-win32-arm64-msvc@4.24.0':
resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==}
cpu: [arm64]
os: [win32]
+ '@rollup/rollup-win32-arm64-msvc@4.31.0':
+ resolution: {integrity: sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==}
+ cpu: [arm64]
+ os: [win32]
+
'@rollup/rollup-win32-ia32-msvc@4.24.0':
resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==}
cpu: [ia32]
os: [win32]
+ '@rollup/rollup-win32-ia32-msvc@4.31.0':
+ resolution: {integrity: sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==}
+ cpu: [ia32]
+ os: [win32]
+
'@rollup/rollup-win32-x64-msvc@4.24.0':
resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==}
cpu: [x64]
os: [win32]
+ '@rollup/rollup-win32-x64-msvc@4.31.0':
+ resolution: {integrity: sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==}
+ cpu: [x64]
+ os: [win32]
+
'@sveltejs/adapter-auto@3.2.2':
resolution: {integrity: sha512-Mso5xPCA8zgcKrv+QioVlqMZkyUQ5MjDJiEPuG/Z7cV/5tmwV7LmcVWk5tZ+H0NCOV1x12AsoSpt/CwFwuVXMA==}
peerDependencies:
@@ -1559,8 +1654,8 @@ packages:
picocolors@1.0.1:
resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
- picocolors@1.1.0:
- resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -1629,8 +1724,8 @@ packages:
resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.4.47:
- resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
+ postcss@8.5.1:
+ resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
engines: {node: ^10 || ^12 || >=14}
potpack@2.0.0:
@@ -1713,6 +1808,11 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ rollup@4.31.0:
+ resolution: {integrity: sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
@@ -2017,8 +2117,8 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- vite@5.3.6:
- resolution: {integrity: sha512-es78AlrylO8mTVBygC0gTC0FENv0C6T496vvd33ydbjF/mIi9q3XQ9A3NWo5qLGFKywvz10J26813OkLvcQleA==}
+ vite@5.4.12:
+ resolution: {integrity: sha512-KwUaKB27TvWwDJr1GjjWthLMATbGEbeWYZIbGZ5qFIsgPP3vWzLu4cVooqhm5/Z2SPDUMjyPVjTztm5tYKwQxA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -2026,6 +2126,7 @@ packages:
less: '*'
lightningcss: ^1.21.0
sass: '*'
+ sass-embedded: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
@@ -2038,6 +2139,8 @@ packages:
optional: true
sass:
optional: true
+ sass-embedded:
+ optional: true
stylus:
optional: true
sugarss:
@@ -2480,76 +2583,133 @@ snapshots:
'@rollup/rollup-android-arm-eabi@4.24.0':
optional: true
+ '@rollup/rollup-android-arm-eabi@4.31.0':
+ optional: true
+
'@rollup/rollup-android-arm64@4.24.0':
optional: true
+ '@rollup/rollup-android-arm64@4.31.0':
+ optional: true
+
'@rollup/rollup-darwin-arm64@4.24.0':
optional: true
+ '@rollup/rollup-darwin-arm64@4.31.0':
+ optional: true
+
'@rollup/rollup-darwin-x64@4.24.0':
optional: true
+ '@rollup/rollup-darwin-x64@4.31.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.31.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-arm-gnueabihf@4.24.0':
optional: true
+ '@rollup/rollup-linux-arm-gnueabihf@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-arm-musleabihf@4.24.0':
optional: true
+ '@rollup/rollup-linux-arm-musleabihf@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-arm64-gnu@4.24.0':
optional: true
+ '@rollup/rollup-linux-arm64-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-arm64-musl@4.24.0':
optional: true
+ '@rollup/rollup-linux-arm64-musl@4.31.0':
+ optional: true
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
optional: true
+ '@rollup/rollup-linux-powerpc64le-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-riscv64-gnu@4.24.0':
optional: true
+ '@rollup/rollup-linux-riscv64-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-s390x-gnu@4.24.0':
optional: true
+ '@rollup/rollup-linux-s390x-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-x64-gnu@4.24.0':
optional: true
+ '@rollup/rollup-linux-x64-gnu@4.31.0':
+ optional: true
+
'@rollup/rollup-linux-x64-musl@4.24.0':
optional: true
+ '@rollup/rollup-linux-x64-musl@4.31.0':
+ optional: true
+
'@rollup/rollup-win32-arm64-msvc@4.24.0':
optional: true
+ '@rollup/rollup-win32-arm64-msvc@4.31.0':
+ optional: true
+
'@rollup/rollup-win32-ia32-msvc@4.24.0':
optional: true
+ '@rollup/rollup-win32-ia32-msvc@4.31.0':
+ optional: true
+
'@rollup/rollup-win32-x64-msvc@4.24.0':
optional: true
- '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))':
+ '@rollup/rollup-win32-x64-msvc@4.31.0':
+ optional: true
+
+ '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))':
dependencies:
- '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
import-meta-resolve: 4.1.0
- '@sveltejs/adapter-node@5.2.0(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))':
+ '@sveltejs/adapter-node@5.2.0(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))':
dependencies:
'@rollup/plugin-commonjs': 26.0.1(rollup@4.24.0)
'@rollup/plugin-json': 6.1.0(rollup@4.24.0)
'@rollup/plugin-node-resolve': 15.2.3(rollup@4.24.0)
- '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
rollup: 4.24.0
- '@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))':
+ '@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))':
dependencies:
- '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@vercel/nft': 0.27.2
esbuild: 0.21.5
transitivePeerDependencies:
- encoding
- supports-color
- '@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))':
+ '@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))':
dependencies:
- '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@types/cookie': 0.6.0
cookie: 0.6.0
devalue: 5.1.1
@@ -2563,28 +2723,28 @@ snapshots:
sirv: 3.0.0
svelte: 4.2.19
tiny-glob: 0.2.9
- vite: 5.3.6(@types/node@22.5.4)
+ vite: 5.4.12(@types/node@22.5.4)
- '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))':
+ '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))':
dependencies:
- '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
debug: 4.3.5
svelte: 4.2.19
- vite: 5.3.6(@types/node@22.5.4)
+ vite: 5.4.12(@types/node@22.5.4)
transitivePeerDependencies:
- supports-color
- '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))':
+ '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))':
dependencies:
- '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.3.6(@types/node@22.5.4))
+ '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
debug: 4.3.5
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.10
svelte: 4.2.19
svelte-hmr: 0.16.0(svelte@4.2.19)
- vite: 5.3.6(@types/node@22.5.4)
- vitefu: 0.2.5(vite@5.3.6(@types/node@22.5.4))
+ vite: 5.4.12(@types/node@22.5.4)
+ vitefu: 0.2.5(vite@5.4.12(@types/node@22.5.4))
transitivePeerDependencies:
- supports-color
@@ -3499,7 +3659,7 @@ snapshots:
picocolors@1.0.1: {}
- picocolors@1.1.0: {}
+ picocolors@1.1.1: {}
picomatch@2.3.1: {}
@@ -3562,10 +3722,10 @@ snapshots:
picocolors: 1.0.1
source-map-js: 1.2.0
- postcss@8.4.47:
+ postcss@8.5.1:
dependencies:
nanoid: 3.3.8
- picocolors: 1.1.0
+ picocolors: 1.1.1
source-map-js: 1.2.1
potpack@2.0.0: {}
@@ -3653,6 +3813,31 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.24.0
fsevents: 2.3.3
+ rollup@4.31.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.31.0
+ '@rollup/rollup-android-arm64': 4.31.0
+ '@rollup/rollup-darwin-arm64': 4.31.0
+ '@rollup/rollup-darwin-x64': 4.31.0
+ '@rollup/rollup-freebsd-arm64': 4.31.0
+ '@rollup/rollup-freebsd-x64': 4.31.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.31.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.31.0
+ '@rollup/rollup-linux-arm64-gnu': 4.31.0
+ '@rollup/rollup-linux-arm64-musl': 4.31.0
+ '@rollup/rollup-linux-loongarch64-gnu': 4.31.0
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.31.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.31.0
+ '@rollup/rollup-linux-s390x-gnu': 4.31.0
+ '@rollup/rollup-linux-x64-gnu': 4.31.0
+ '@rollup/rollup-linux-x64-musl': 4.31.0
+ '@rollup/rollup-win32-arm64-msvc': 4.31.0
+ '@rollup/rollup-win32-ia32-msvc': 4.31.0
+ '@rollup/rollup-win32-x64-msvc': 4.31.0
+ fsevents: 2.3.3
+
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
@@ -3973,18 +4158,18 @@ snapshots:
util-deprecate@1.0.2: {}
- vite@5.3.6(@types/node@22.5.4):
+ vite@5.4.12(@types/node@22.5.4):
dependencies:
esbuild: 0.21.5
- postcss: 8.4.47
- rollup: 4.24.0
+ postcss: 8.5.1
+ rollup: 4.31.0
optionalDependencies:
'@types/node': 22.5.4
fsevents: 2.3.3
- vitefu@0.2.5(vite@5.3.6(@types/node@22.5.4)):
+ vitefu@0.2.5(vite@5.4.12(@types/node@22.5.4)):
optionalDependencies:
- vite: 5.3.6(@types/node@22.5.4)
+ vite: 5.4.12(@types/node@22.5.4)
vt-pbf@3.1.3:
dependencies:
From 0eb4bc706a783d7528f55d79e19e027a5d293a45 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Wed, 22 Jan 2025 08:36:02 -0500
Subject: [PATCH 21/30] feat: enhance adventure handling with user ID support
in serializers and attachment view; refactor saveEdit function and clean up
Avatar component
---
backend/server/adventures/serializers.py | 8 +-
.../adventures/views/attachment_view.py | 5 +-
.../src/lib/components/AdventureModal.svelte | 364 +++++++++---------
frontend/src/lib/components/Avatar.svelte | 1 -
.../src/routes/adventures/+page.server.ts | 3 +
.../src/routes/adventures/[id]/+page.svelte | 4 +-
6 files changed, 199 insertions(+), 186 deletions(-)
diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py
index c213169..a7c0bd2 100644
--- a/backend/server/adventures/serializers.py
+++ b/backend/server/adventures/serializers.py
@@ -8,8 +8,8 @@ from main.utils import CustomModelSerializer
class AdventureImageSerializer(CustomModelSerializer):
class Meta:
model = AdventureImage
- fields = ['id', 'image', 'adventure', 'is_primary']
- read_only_fields = ['id']
+ fields = ['id', 'image', 'adventure', 'is_primary', 'user_id']
+ read_only_fields = ['id', 'user_id']
def to_representation(self, instance):
representation = super().to_representation(instance)
@@ -25,8 +25,8 @@ class AttachmentSerializer(CustomModelSerializer):
extension = serializers.SerializerMethodField()
class Meta:
model = Attachment
- fields = ['id', 'file', 'adventure', 'extension', 'name']
- read_only_fields = ['id']
+ fields = ['id', 'file', 'adventure', 'extension', 'name', 'user_id']
+ read_only_fields = ['id', 'user_id']
def get_extension(self, obj):
return obj.file.name.split('.')[-1]
diff --git a/backend/server/adventures/views/attachment_view.py b/backend/server/adventures/views/attachment_view.py
index e83bdea..0292b16 100644
--- a/backend/server/adventures/views/attachment_view.py
+++ b/backend/server/adventures/views/attachment_view.py
@@ -34,4 +34,7 @@ class AttachmentViewSet(viewsets.ModelViewSet):
else:
return Response({"error": "User does not own this adventure"}, status=status.HTTP_403_FORBIDDEN)
- return super().create(request, *args, **kwargs)
\ No newline at end of file
+ return super().create(request, *args, **kwargs)
+
+ def perform_create(self, serializer):
+ serializer.save(user_id=self.request.user)
\ No newline at end of file
diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte
index cb5a920..d6d0121 100644
--- a/frontend/src/lib/components/AdventureModal.svelte
+++ b/frontend/src/lib/components/AdventureModal.svelte
@@ -173,16 +173,27 @@
}
}
+ let selectedFile: File | null = null;
+
+ function handleFileChange(event: Event) {
+ const input = event.target as HTMLInputElement;
+ if (input.files && input.files.length) {
+ selectedFile = input.files[0];
+ console.log('Selected file:', selectedFile);
+ }
+ }
+
async function uploadAttachment(event: Event) {
event.preventDefault();
console.log('UPLOAD');
+ console.log(selectedFile);
- if (!fileInput || !fileInput.files || fileInput.files.length === 0) {
+ if (!selectedFile) {
console.error('No files selected');
return;
}
- const file = fileInput.files[0];
+ const file = selectedFile;
console.log(file);
const formData = new FormData();
@@ -962,69 +973,6 @@ it would also work to just use on:click on the MapLibre component itself. -->
-
-
-
-
- {$t('adventures.attachments')} ({adventure.attachments?.length || 0})
-
-
-
@@ -1185,122 +1133,180 @@ it would also work to just use on:click on the MapLibre component itself. -->
{:else}
-
{$t('adventures.upload_images_here')}
-
-
-
- {$t('adventures.image')}
-
-
-
-
-
-
-
-
-
-
- {$t('adventures.url')}
-
-
-
-
- {$t('adventures.fetch_image')}
-
-
-
-
-
-
- {$t('adventures.wikipedia')}
-
-
-
-
- {$t('adventures.fetch_image')}
-
-
- {#if wikiImageError}
-
{$t('adventures.wiki_image_error')}
- {/if}
-
-
- {#if immichIntegration}
-
{
- url = e.detail;
- fetchImage();
- }}
- />
- {/if}
-
-
-
- {#if images.length > 0}
- {$t('adventures.my_images')}
-
- {#each images as image}
-
-
removeImage(image.id)}
- >
- ✕
-
- {#if !image.is_primary}
-
makePrimaryImage(image.id)}
- >
-
-
- {:else}
-
-
-
-
-
- {/if}
-
+
+
+
+
+ {$t('adventures.attachments')} ({adventure.attachments?.length || 0})
+
+
+
+ {#each adventure.attachments as attachment}
+
(attachmentToEdit = e.detail)}
+ />
+ {/each}
- {/each}
-
- {:else}
-
{$t('adventures.no_images')}
- {/if}
+
+
+
+
+
+
+ {$t('adventures.images')} ({adventure.images?.length || 0})
+
+
+
+ {$t('adventures.image')}
+
+
+
+
+
+
+
+
+ {$t('adventures.url')}
+
+
+
+
+ {$t('adventures.fetch_image')}
+
+
+
+
+
+
+ {$t('adventures.wikipedia')}
+
+
+
+
+ {$t('adventures.fetch_image')}
+
+
+ {#if wikiImageError}
+
{$t('adventures.wiki_image_error')}
+ {/if}
+
+
+ {#if immichIntegration}
+
{
+ url = e.detail;
+ fetchImage();
+ }}
+ />
+ {/if}
+
+
+
+ {#if images.length > 0}
+ {$t('adventures.my_images')}
+
+ {#each images as image}
+
+
removeImage(image.id)}
+ >
+ ✕
+
+ {#if !image.is_primary}
+
makePrimaryImage(image.id)}
+ >
+
+
+ {:else}
+
+
+
+
+
+ {/if}
+
+
+ {/each}
+
+ {:else}
+ {$t('adventures.no_images')}
+ {/if}
+
+
+
{$t('about.close')}
diff --git a/frontend/src/lib/components/Avatar.svelte b/frontend/src/lib/components/Avatar.svelte
index a94a8eb..01eb068 100644
--- a/frontend/src/lib/components/Avatar.svelte
+++ b/frontend/src/lib/components/Avatar.svelte
@@ -36,7 +36,6 @@
goto('/profile')}>{$t('navbar.profile')}
goto('/adventures')}>{$t('navbar.my_adventures')}
-
goto('/activities')}>{$t('navbar.my_tags')}
goto('/shared')}>{$t('navbar.shared_with_me')}
goto('/settings')}>{$t('navbar.settings')}
diff --git a/frontend/src/routes/adventures/+page.server.ts b/frontend/src/routes/adventures/+page.server.ts
index 89887f3..9875399 100644
--- a/frontend/src/routes/adventures/+page.server.ts
+++ b/frontend/src/routes/adventures/+page.server.ts
@@ -91,6 +91,9 @@ export const actions: Actions = {
body: formData
});
let data = await res.json();
+
+ console.log(res);
+ console.log(data);
return data;
}
};
diff --git a/frontend/src/routes/adventures/[id]/+page.svelte b/frontend/src/routes/adventures/[id]/+page.svelte
index fb0528f..35cd73c 100644
--- a/frontend/src/routes/adventures/[id]/+page.svelte
+++ b/frontend/src/routes/adventures/[id]/+page.svelte
@@ -102,9 +102,11 @@
await getGpxFiles();
});
- function saveEdit(event: CustomEvent) {
+ async function saveEdit(event: CustomEvent) {
adventure = event.detail;
isEditModalOpen = false;
+ geojson = null;
+ await getGpxFiles();
}
From 9e66c67c623bf0b1d73f0efa303fb03f7596762d Mon Sep 17 00:00:00 2001
From: Lars Lehmann
Date: Thu, 23 Jan 2025 20:07:16 +0100
Subject: [PATCH 22/30] fix: Display adventure category icon also on collection
maps
---
frontend/package-lock.json | 4499 +++++++++++++++++
.../src/routes/collections/[id]/+page.svelte | 7 +-
2 files changed, 4504 insertions(+), 2 deletions(-)
create mode 100644 frontend/package-lock.json
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
new file mode 100644
index 0000000..3748c97
--- /dev/null
+++ b/frontend/package-lock.json
@@ -0,0 +1,4499 @@
+{
+ "name": "adventurelog-frontend",
+ "version": "0.8.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "adventurelog-frontend",
+ "version": "0.8.0",
+ "dependencies": {
+ "@lukulent/svelte-umami": "^0.0.3",
+ "emoji-picker-element": "^1.26.0",
+ "gsap": "^3.12.7",
+ "marked": "^15.0.4",
+ "qrcode": "^1.5.4",
+ "svelte-i18n": "^4.0.1",
+ "svelte-maplibre": "^0.9.8",
+ "tsparticles": "^3.7.1"
+ },
+ "devDependencies": {
+ "@event-calendar/core": "^3.7.1",
+ "@event-calendar/day-grid": "^3.7.1",
+ "@event-calendar/time-grid": "^3.7.1",
+ "@iconify-json/mdi": "^1.1.67",
+ "@sveltejs/adapter-auto": "^3.2.2",
+ "@sveltejs/adapter-node": "^5.2.0",
+ "@sveltejs/adapter-vercel": "^5.4.1",
+ "@sveltejs/kit": "^2.8.3",
+ "@sveltejs/vite-plugin-svelte": "^3.1.1",
+ "@tailwindcss/typography": "^0.5.13",
+ "@types/node": "^22.5.4",
+ "@types/qrcode": "^1.5.5",
+ "autoprefixer": "^10.4.19",
+ "daisyui": "^4.12.6",
+ "postcss": "^8.4.38",
+ "prettier": "^3.3.2",
+ "prettier-plugin-svelte": "^3.2.5",
+ "svelte": "^4.2.19",
+ "svelte-check": "^3.8.1",
+ "tailwindcss": "^3.4.4",
+ "tslib": "^2.6.3",
+ "typescript": "^5.5.2",
+ "unplugin-icons": "^0.19.0",
+ "vite": "^5.3.6"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@antfu/install-pkg": {
+ "version": "0.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "package-manager-detector": "^0.2.0",
+ "tinyexec": "^0.3.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@antfu/utils": {
+ "version": "0.7.10",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.24.2",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@event-calendar/core": {
+ "version": "3.8.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "svelte": "^4.2.19"
+ }
+ },
+ "node_modules/@event-calendar/day-grid": {
+ "version": "3.8.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@event-calendar/core": "~3.8.0",
+ "svelte": "^4.2.19"
+ }
+ },
+ "node_modules/@event-calendar/time-grid": {
+ "version": "3.8.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@event-calendar/core": "~3.8.0",
+ "svelte": "^4.2.19"
+ }
+ },
+ "node_modules/@formatjs/ecma402-abstract": {
+ "version": "2.3.2",
+ "license": "MIT",
+ "dependencies": {
+ "@formatjs/fast-memoize": "2.2.6",
+ "@formatjs/intl-localematcher": "0.5.10",
+ "decimal.js": "10",
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/fast-memoize": {
+ "version": "2.2.6",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/icu-messageformat-parser": {
+ "version": "2.11.0",
+ "license": "MIT",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.2",
+ "@formatjs/icu-skeleton-parser": "1.8.12",
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/icu-skeleton-parser": {
+ "version": "1.8.12",
+ "license": "MIT",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.2",
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/intl-localematcher": {
+ "version": "0.5.10",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@iconify-json/mdi": {
+ "version": "1.2.3",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@iconify/utils": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@antfu/install-pkg": "^0.4.1",
+ "@antfu/utils": "^0.7.10",
+ "@iconify/types": "^2.0.0",
+ "debug": "^4.4.0",
+ "globals": "^15.13.0",
+ "kolorist": "^1.8.0",
+ "local-pkg": "^0.5.1",
+ "mlly": "^1.7.3"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@lukulent/svelte-umami": {
+ "version": "0.0.3",
+ "license": "MIT",
+ "peerDependencies": {
+ "svelte": "^4.0.0"
+ }
+ },
+ "node_modules/@mapbox/geojson-rewind": {
+ "version": "0.5.2",
+ "license": "ISC",
+ "dependencies": {
+ "get-stream": "^6.0.1",
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "geojson-rewind": "geojson-rewind"
+ }
+ },
+ "node_modules/@mapbox/jsonlint-lines-primitives": {
+ "version": "2.0.2",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp": {
+ "version": "2.0.0-rc.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "consola": "^3.2.3",
+ "detect-libc": "^2.0.0",
+ "https-proxy-agent": "^7.0.5",
+ "node-fetch": "^2.6.7",
+ "nopt": "^8.0.0",
+ "semver": "^7.5.3",
+ "tar": "^7.4.0"
+ },
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@mapbox/point-geometry": {
+ "version": "0.1.0",
+ "license": "ISC"
+ },
+ "node_modules/@mapbox/tiny-sdf": {
+ "version": "2.0.6",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/@mapbox/unitbezier": {
+ "version": "0.0.1",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/@mapbox/vector-tile": {
+ "version": "1.3.1",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mapbox/point-geometry": "~0.1.0"
+ }
+ },
+ "node_modules/@mapbox/whoots-js": {
+ "version": "3.1.0",
+ "license": "ISC",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@maplibre/maplibre-gl-style-spec": {
+ "version": "20.4.0",
+ "license": "ISC",
+ "dependencies": {
+ "@mapbox/jsonlint-lines-primitives": "~2.0.2",
+ "@mapbox/unitbezier": "^0.0.1",
+ "json-stringify-pretty-compact": "^4.0.0",
+ "minimist": "^1.2.8",
+ "quickselect": "^2.0.0",
+ "rw": "^1.3.3",
+ "tinyqueue": "^3.0.0"
+ },
+ "bin": {
+ "gl-style-format": "dist/gl-style-format.mjs",
+ "gl-style-migrate": "dist/gl-style-migrate.mjs",
+ "gl-style-validate": "dist/gl-style-validate.mjs"
+ }
+ },
+ "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/quickselect": {
+ "version": "2.0.0",
+ "license": "ISC"
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.28",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/plugin-commonjs": {
+ "version": "28.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "commondir": "^1.0.1",
+ "estree-walker": "^2.0.2",
+ "fdir": "^6.2.0",
+ "is-reference": "1.2.1",
+ "magic-string": "^0.30.3",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0 || 14 >= 14.17"
+ },
+ "peerDependencies": {
+ "rollup": "^2.68.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-json": {
+ "version": "6.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "16.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "@types/resolve": "1.20.2",
+ "deepmerge": "^4.2.2",
+ "is-module": "^1.0.0",
+ "resolve": "^1.22.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.78.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.31.0",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@sveltejs/adapter-auto": {
+ "version": "3.3.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "import-meta-resolve": "^4.1.0"
+ },
+ "peerDependencies": {
+ "@sveltejs/kit": "^2.0.0"
+ }
+ },
+ "node_modules/@sveltejs/adapter-node": {
+ "version": "5.2.12",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/plugin-commonjs": "^28.0.1",
+ "@rollup/plugin-json": "^6.1.0",
+ "@rollup/plugin-node-resolve": "^16.0.0",
+ "rollup": "^4.9.5"
+ },
+ "peerDependencies": {
+ "@sveltejs/kit": "^2.4.0"
+ }
+ },
+ "node_modules/@sveltejs/adapter-vercel": {
+ "version": "5.5.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vercel/nft": "^0.29.0",
+ "esbuild": "^0.24.0"
+ },
+ "peerDependencies": {
+ "@sveltejs/kit": "^2.4.0"
+ }
+ },
+ "node_modules/@sveltejs/kit": {
+ "version": "2.16.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/cookie": "^0.6.0",
+ "cookie": "^0.6.0",
+ "devalue": "^5.1.0",
+ "esm-env": "^1.2.2",
+ "import-meta-resolve": "^4.1.0",
+ "kleur": "^4.1.5",
+ "magic-string": "^0.30.5",
+ "mrmime": "^2.0.0",
+ "sade": "^1.8.1",
+ "set-cookie-parser": "^2.6.0",
+ "sirv": "^3.0.0"
+ },
+ "bin": {
+ "svelte-kit": "svelte-kit.js"
+ },
+ "engines": {
+ "node": ">=18.13"
+ },
+ "peerDependencies": {
+ "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0",
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.3 || ^6.0.0"
+ }
+ },
+ "node_modules/@sveltejs/vite-plugin-svelte": {
+ "version": "3.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0",
+ "debug": "^4.3.4",
+ "deepmerge": "^4.3.1",
+ "kleur": "^4.1.5",
+ "magic-string": "^0.30.10",
+ "svelte-hmr": "^0.16.0",
+ "vitefu": "^0.2.5"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20"
+ },
+ "peerDependencies": {
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.0"
+ }
+ },
+ "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20"
+ },
+ "peerDependencies": {
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/typography": {
+ "version": "0.5.16",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash.castarray": "^4.4.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "postcss-selector-parser": "6.0.10"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
+ }
+ },
+ "node_modules/@tsparticles/basic": {
+ "version": "3.8.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/matteobruni"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/tsparticles"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/matteobruni"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0",
+ "@tsparticles/move-base": "3.8.0",
+ "@tsparticles/plugin-hex-color": "3.8.0",
+ "@tsparticles/plugin-hsl-color": "3.8.0",
+ "@tsparticles/plugin-rgb-color": "3.8.0",
+ "@tsparticles/shape-circle": "3.8.0",
+ "@tsparticles/updater-color": "3.8.0",
+ "@tsparticles/updater-opacity": "3.8.0",
+ "@tsparticles/updater-out-modes": "3.8.0",
+ "@tsparticles/updater-size": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/engine": {
+ "version": "3.8.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/matteobruni"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/tsparticles"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/matteobruni"
+ }
+ ],
+ "hasInstallScript": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsparticles/interaction-external-attract": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-external-bounce": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-external-bubble": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-external-connect": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-external-grab": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-external-pause": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-external-push": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-external-remove": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-external-repulse": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-external-slow": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-external-trail": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-particles-attract": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-particles-collisions": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/interaction-particles-links": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/move-base": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/move-parallax": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/plugin-absorbers": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/plugin-easing-quad": {
+ "version": "3.8.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/matteobruni"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/tsparticles"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/matteobruni"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/plugin-emitters": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/plugin-emitters-shape-circle": {
+ "version": "3.8.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/matteobruni"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/tsparticles"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/matteobruni"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0",
+ "@tsparticles/plugin-emitters": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/plugin-emitters-shape-square": {
+ "version": "3.8.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/matteobruni"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/tsparticles"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/matteobruni"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0",
+ "@tsparticles/plugin-emitters": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/plugin-hex-color": {
+ "version": "3.8.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/matteobruni"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/tsparticles"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/matteobruni"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/plugin-hsl-color": {
+ "version": "3.8.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/matteobruni"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/tsparticles"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/matteobruni"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/plugin-rgb-color": {
+ "version": "3.8.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/matteobruni"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/tsparticles"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/matteobruni"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/shape-circle": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/shape-emoji": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/shape-image": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/shape-line": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/shape-polygon": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/shape-square": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/shape-star": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/shape-text": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/slim": {
+ "version": "3.8.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/matteobruni"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/tsparticles"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/matteobruni"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/basic": "3.8.0",
+ "@tsparticles/engine": "3.8.0",
+ "@tsparticles/interaction-external-attract": "3.8.0",
+ "@tsparticles/interaction-external-bounce": "3.8.0",
+ "@tsparticles/interaction-external-bubble": "3.8.0",
+ "@tsparticles/interaction-external-connect": "3.8.0",
+ "@tsparticles/interaction-external-grab": "3.8.0",
+ "@tsparticles/interaction-external-pause": "3.8.0",
+ "@tsparticles/interaction-external-push": "3.8.0",
+ "@tsparticles/interaction-external-remove": "3.8.0",
+ "@tsparticles/interaction-external-repulse": "3.8.0",
+ "@tsparticles/interaction-external-slow": "3.8.0",
+ "@tsparticles/interaction-particles-attract": "3.8.0",
+ "@tsparticles/interaction-particles-collisions": "3.8.0",
+ "@tsparticles/interaction-particles-links": "3.8.0",
+ "@tsparticles/move-parallax": "3.8.0",
+ "@tsparticles/plugin-easing-quad": "3.8.0",
+ "@tsparticles/shape-emoji": "3.8.0",
+ "@tsparticles/shape-image": "3.8.0",
+ "@tsparticles/shape-line": "3.8.0",
+ "@tsparticles/shape-polygon": "3.8.0",
+ "@tsparticles/shape-square": "3.8.0",
+ "@tsparticles/shape-star": "3.8.0",
+ "@tsparticles/updater-life": "3.8.0",
+ "@tsparticles/updater-rotate": "3.8.0",
+ "@tsparticles/updater-stroke-color": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-color": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-destroy": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-life": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-opacity": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-out-modes": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-roll": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-rotate": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-size": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-stroke-color": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-tilt": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-twinkle": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@tsparticles/updater-wobble": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0"
+ }
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.6.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "license": "MIT"
+ },
+ "node_modules/@types/geojson": {
+ "version": "7946.0.15",
+ "license": "MIT"
+ },
+ "node_modules/@types/geojson-vt": {
+ "version": "3.2.5",
+ "license": "MIT",
+ "dependencies": {
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/leaflet": {
+ "version": "1.9.16",
+ "license": "MIT",
+ "dependencies": {
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/mapbox__point-geometry": {
+ "version": "0.1.4",
+ "license": "MIT"
+ },
+ "node_modules/@types/mapbox__vector-tile": {
+ "version": "1.3.4",
+ "license": "MIT",
+ "dependencies": {
+ "@types/geojson": "*",
+ "@types/mapbox__point-geometry": "*",
+ "@types/pbf": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "22.10.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/@types/pbf": {
+ "version": "3.0.5",
+ "license": "MIT"
+ },
+ "node_modules/@types/pug": {
+ "version": "2.0.10",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/qrcode": {
+ "version": "1.5.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.20.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/supercluster": {
+ "version": "7.1.3",
+ "license": "MIT",
+ "dependencies": {
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@vercel/nft": {
+ "version": "0.29.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mapbox/node-pre-gyp": "^2.0.0-rc.0",
+ "@rollup/pluginutils": "^5.1.3",
+ "acorn": "^8.6.0",
+ "acorn-import-attributes": "^1.9.5",
+ "async-sema": "^3.1.1",
+ "bindings": "^1.4.0",
+ "estree-walker": "2.0.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "node-gyp-build": "^4.2.2",
+ "picomatch": "^4.0.2",
+ "resolve-from": "^5.0.0"
+ },
+ "bin": {
+ "nft": "out/cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/abbrev": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-attributes": {
+ "version": "1.9.5",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/async-sema": {
+ "version": "3.1.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.20",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.3",
+ "caniuse-lite": "^1.0.30001646",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bindings": {
+ "version": "1.5.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.4",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001695",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cli-color": {
+ "version": "2.0.4",
+ "license": "ISC",
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.64",
+ "es6-iterator": "^2.0.3",
+ "memoizee": "^0.4.15",
+ "timers-ext": "^0.1.7"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "6.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/code-red": {
+ "version": "1.0.4",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15",
+ "@types/estree": "^1.0.1",
+ "acorn": "^8.10.0",
+ "estree-walker": "^3.0.3",
+ "periscopic": "^3.1.0"
+ }
+ },
+ "node_modules/code-red/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/consola": {
+ "version": "3.4.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.6.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/isexe": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-selector-tokenizer": {
+ "version": "0.8.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "fastparse": "^1.1.2"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "2.3.1",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/culori": {
+ "version": "3.3.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/d": {
+ "version": "1.0.2",
+ "license": "ISC",
+ "dependencies": {
+ "es5-ext": "^0.10.64",
+ "type": "^2.7.2"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/d3-array": {
+ "version": "3.2.4",
+ "license": "ISC",
+ "dependencies": {
+ "internmap": "1 - 2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-geo": {
+ "version": "3.1.1",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2.5.0 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/daisyui": {
+ "version": "4.12.23",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "css-selector-tokenizer": "^0.8",
+ "culori": "^3",
+ "picocolors": "^1",
+ "postcss-js": "^4"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/daisyui"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.4.3",
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "6.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/devalue": {
+ "version": "5.1.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/dijkstrajs": {
+ "version": "1.0.3",
+ "license": "MIT"
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/earcut": {
+ "version": "3.0.1",
+ "license": "ISC"
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.86",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emoji-picker-element": {
+ "version": "1.26.0",
+ "license": "Apache-2.0"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "license": "MIT"
+ },
+ "node_modules/es5-ext": {
+ "version": "0.10.64",
+ "hasInstallScript": true,
+ "license": "ISC",
+ "dependencies": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "esniff": "^2.0.1",
+ "next-tick": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/es6-iterator": {
+ "version": "2.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/es6-promise": {
+ "version": "3.3.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es6-symbol": {
+ "version": "3.1.4",
+ "license": "ISC",
+ "dependencies": {
+ "d": "^1.0.2",
+ "ext": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/es6-weak-map": {
+ "version": "2.0.3",
+ "license": "ISC",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.46",
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.24.2",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.24.2",
+ "@esbuild/android-arm": "0.24.2",
+ "@esbuild/android-arm64": "0.24.2",
+ "@esbuild/android-x64": "0.24.2",
+ "@esbuild/darwin-arm64": "0.24.2",
+ "@esbuild/darwin-x64": "0.24.2",
+ "@esbuild/freebsd-arm64": "0.24.2",
+ "@esbuild/freebsd-x64": "0.24.2",
+ "@esbuild/linux-arm": "0.24.2",
+ "@esbuild/linux-arm64": "0.24.2",
+ "@esbuild/linux-ia32": "0.24.2",
+ "@esbuild/linux-loong64": "0.24.2",
+ "@esbuild/linux-mips64el": "0.24.2",
+ "@esbuild/linux-ppc64": "0.24.2",
+ "@esbuild/linux-riscv64": "0.24.2",
+ "@esbuild/linux-s390x": "0.24.2",
+ "@esbuild/linux-x64": "0.24.2",
+ "@esbuild/netbsd-arm64": "0.24.2",
+ "@esbuild/netbsd-x64": "0.24.2",
+ "@esbuild/openbsd-arm64": "0.24.2",
+ "@esbuild/openbsd-x64": "0.24.2",
+ "@esbuild/sunos-x64": "0.24.2",
+ "@esbuild/win32-arm64": "0.24.2",
+ "@esbuild/win32-ia32": "0.24.2",
+ "@esbuild/win32-x64": "0.24.2"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/esm-env": {
+ "version": "1.2.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esniff": {
+ "version": "2.0.1",
+ "license": "ISC",
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.62",
+ "event-emitter": "^0.3.5",
+ "type": "^2.7.2"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "license": "MIT"
+ },
+ "node_modules/event-emitter": {
+ "version": "0.3.5",
+ "license": "MIT",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "node_modules/ext": {
+ "version": "1.7.0",
+ "license": "ISC",
+ "dependencies": {
+ "type": "^2.7.2"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fastparse": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.18.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.4.3",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fflate": {
+ "version": "0.8.2",
+ "license": "MIT"
+ },
+ "node_modules/file-uri-to-path": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/geojson-vt": {
+ "version": "4.0.2",
+ "license": "ISC"
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gl-matrix": {
+ "version": "3.4.3",
+ "license": "MIT"
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "4.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^4.1.3",
+ "kind-of": "^6.0.3",
+ "which": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/globals": {
+ "version": "15.14.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalyzer": {
+ "version": "0.1.0",
+ "license": "MIT"
+ },
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "license": "MIT"
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/gsap": {
+ "version": "3.12.7",
+ "license": "Standard 'no charge' license: https://gsap.com/standard-license. Club GSAP members get more: https://gsap.com/licensing/. Why GreenSock doesn't employ an MIT license: https://gsap.com/why-license/"
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "4.1.3",
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/intl-messageformat": {
+ "version": "10.7.14",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.2",
+ "@formatjs/fast-memoize": "2.2.6",
+ "@formatjs/icu-messageformat-parser": "2.11.0",
+ "tslib": "2"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-promise": {
+ "version": "2.2.2",
+ "license": "MIT"
+ },
+ "node_modules/is-reference": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "3.1.1",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.7",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/json-stringify-pretty-compact": {
+ "version": "4.0.0",
+ "license": "MIT"
+ },
+ "node_modules/just-compare": {
+ "version": "2.3.0",
+ "license": "MIT"
+ },
+ "node_modules/just-flush": {
+ "version": "2.3.0",
+ "license": "MIT"
+ },
+ "node_modules/kdbush": {
+ "version": "4.0.2",
+ "license": "ISC"
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/kolorist": {
+ "version": "1.8.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/local-pkg": {
+ "version": "0.5.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mlly": "^1.7.3",
+ "pkg-types": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/locate-character": {
+ "version": "3.0.0",
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash.castarray": {
+ "version": "4.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/lru-queue": {
+ "version": "0.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "es5-ext": "~0.10.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/maplibre-gl": {
+ "version": "4.7.1",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mapbox/geojson-rewind": "^0.5.2",
+ "@mapbox/jsonlint-lines-primitives": "^2.0.2",
+ "@mapbox/point-geometry": "^0.1.0",
+ "@mapbox/tiny-sdf": "^2.0.6",
+ "@mapbox/unitbezier": "^0.0.1",
+ "@mapbox/vector-tile": "^1.3.1",
+ "@mapbox/whoots-js": "^3.1.0",
+ "@maplibre/maplibre-gl-style-spec": "^20.3.1",
+ "@types/geojson": "^7946.0.14",
+ "@types/geojson-vt": "3.2.5",
+ "@types/mapbox__point-geometry": "^0.1.4",
+ "@types/mapbox__vector-tile": "^1.3.4",
+ "@types/pbf": "^3.0.5",
+ "@types/supercluster": "^7.1.3",
+ "earcut": "^3.0.0",
+ "geojson-vt": "^4.0.2",
+ "gl-matrix": "^3.4.3",
+ "global-prefix": "^4.0.0",
+ "kdbush": "^4.0.2",
+ "murmurhash-js": "^1.0.0",
+ "pbf": "^3.3.0",
+ "potpack": "^2.0.0",
+ "quickselect": "^3.0.0",
+ "supercluster": "^8.0.1",
+ "tinyqueue": "^3.0.0",
+ "vt-pbf": "^3.1.3"
+ },
+ "engines": {
+ "node": ">=16.14.0",
+ "npm": ">=8.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1"
+ }
+ },
+ "node_modules/marked": {
+ "version": "15.0.6",
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.30",
+ "license": "CC0-1.0"
+ },
+ "node_modules/memoizee": {
+ "version": "0.4.17",
+ "license": "ISC",
+ "dependencies": {
+ "d": "^1.0.2",
+ "es5-ext": "^0.10.64",
+ "es6-weak-map": "^2.0.3",
+ "event-emitter": "^0.3.5",
+ "is-promise": "^2.2.2",
+ "lru-queue": "^0.1.0",
+ "next-tick": "^1.1.0",
+ "timers-ext": "^0.1.7"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/minizlib/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/minizlib/node_modules/glob": {
+ "version": "10.4.5",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minizlib/node_modules/minimatch": {
+ "version": "9.0.5",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minizlib/node_modules/rimraf": {
+ "version": "5.0.10",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^10.3.7"
+ },
+ "bin": {
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.7.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "pathe": "^2.0.1",
+ "pkg-types": "^1.3.0",
+ "ufo": "^1.5.4"
+ }
+ },
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/murmurhash-js": {
+ "version": "1.0.0",
+ "license": "MIT"
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/next-tick": {
+ "version": "1.1.0",
+ "license": "ISC"
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-gyp-build": {
+ "version": "4.8.4",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nopt": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^3.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/package-manager-detector": {
+ "version": "0.2.8",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pbf": {
+ "version": "3.3.0",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "ieee754": "^1.1.12",
+ "resolve-protobuf-schema": "^2.1.0"
+ },
+ "bin": {
+ "pbf": "bin/pbf"
+ }
+ },
+ "node_modules/periscopic": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "is-reference": "^3.0.0"
+ }
+ },
+ "node_modules/periscopic/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/periscopic/node_modules/is-reference": {
+ "version": "3.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.6"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.3.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/pmtiles": {
+ "version": "3.2.1",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@types/leaflet": "^1.9.8",
+ "fflate": "^0.8.0"
+ }
+ },
+ "node_modules/pngjs": {
+ "version": "5.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-nested/node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.10",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/potpack": {
+ "version": "2.0.0",
+ "license": "ISC"
+ },
+ "node_modules/prettier": {
+ "version": "3.4.2",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-plugin-svelte": {
+ "version": "3.3.3",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "prettier": "^3.0.0",
+ "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0"
+ }
+ },
+ "node_modules/protocol-buffers-schema": {
+ "version": "3.6.0",
+ "license": "MIT"
+ },
+ "node_modules/qrcode": {
+ "version": "1.5.4",
+ "license": "MIT",
+ "dependencies": {
+ "dijkstrajs": "^1.0.1",
+ "pngjs": "^5.0.0",
+ "yargs": "^15.3.1"
+ },
+ "bin": {
+ "qrcode": "bin/qrcode"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/quickselect": {
+ "version": "3.0.0",
+ "license": "ISC"
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/readdirp/node_modules/picomatch": {
+ "version": "2.3.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "license": "ISC"
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-protobuf-schema": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "protocol-buffers-schema": "^3.3.1"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "2.7.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.31.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.31.0",
+ "@rollup/rollup-android-arm64": "4.31.0",
+ "@rollup/rollup-darwin-arm64": "4.31.0",
+ "@rollup/rollup-darwin-x64": "4.31.0",
+ "@rollup/rollup-freebsd-arm64": "4.31.0",
+ "@rollup/rollup-freebsd-x64": "4.31.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.31.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.31.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.31.0",
+ "@rollup/rollup-linux-arm64-musl": "4.31.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.31.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.31.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.31.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.31.0",
+ "@rollup/rollup-linux-x64-gnu": "4.31.0",
+ "@rollup/rollup-linux-x64-musl": "4.31.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.31.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.31.0",
+ "@rollup/rollup-win32-x64-msvc": "4.31.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rw": {
+ "version": "1.3.3",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/sade": {
+ "version": "1.8.1",
+ "license": "MIT",
+ "dependencies": {
+ "mri": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/sander": {
+ "version": "0.5.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es6-promise": "^3.1.2",
+ "graceful-fs": "^4.1.3",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.2"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "license": "ISC"
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/sorcery": {
+ "version": "0.11.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.14",
+ "buffer-crc32": "^1.0.0",
+ "minimist": "^1.2.0",
+ "sander": "^0.5.0"
+ },
+ "bin": {
+ "sorcery": "bin/sorcery"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/sucrase/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "10.4.5",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sucrase/node_modules/minimatch": {
+ "version": "9.0.5",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/supercluster": {
+ "version": "8.0.1",
+ "license": "ISC",
+ "dependencies": {
+ "kdbush": "^4.0.2"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svelte": {
+ "version": "4.2.19",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.15",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/estree": "^1.0.1",
+ "acorn": "^8.9.0",
+ "aria-query": "^5.3.0",
+ "axobject-query": "^4.0.0",
+ "code-red": "^1.0.3",
+ "css-tree": "^2.3.1",
+ "estree-walker": "^3.0.3",
+ "is-reference": "^3.0.1",
+ "locate-character": "^3.0.0",
+ "magic-string": "^0.30.4",
+ "periscopic": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/svelte-check": {
+ "version": "3.8.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "chokidar": "^3.4.1",
+ "picocolors": "^1.0.0",
+ "sade": "^1.7.4",
+ "svelte-preprocess": "^5.1.3",
+ "typescript": "^5.0.3"
+ },
+ "bin": {
+ "svelte-check": "bin/svelte-check"
+ },
+ "peerDependencies": {
+ "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0"
+ }
+ },
+ "node_modules/svelte-hmr": {
+ "version": "0.16.0",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^12.20 || ^14.13.1 || >= 16"
+ },
+ "peerDependencies": {
+ "svelte": "^3.19.0 || ^4.0.0"
+ }
+ },
+ "node_modules/svelte-i18n": {
+ "version": "4.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "cli-color": "^2.0.3",
+ "deepmerge": "^4.2.2",
+ "esbuild": "^0.19.2",
+ "estree-walker": "^2",
+ "intl-messageformat": "^10.5.3",
+ "sade": "^1.8.1",
+ "tiny-glob": "^0.2.9"
+ },
+ "bin": {
+ "svelte-i18n": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "peerDependencies": {
+ "svelte": "^3 || ^4 || ^5"
+ }
+ },
+ "node_modules/svelte-i18n/node_modules/@esbuild/linux-x64": {
+ "version": "0.19.12",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/svelte-i18n/node_modules/esbuild": {
+ "version": "0.19.12",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.19.12",
+ "@esbuild/android-arm": "0.19.12",
+ "@esbuild/android-arm64": "0.19.12",
+ "@esbuild/android-x64": "0.19.12",
+ "@esbuild/darwin-arm64": "0.19.12",
+ "@esbuild/darwin-x64": "0.19.12",
+ "@esbuild/freebsd-arm64": "0.19.12",
+ "@esbuild/freebsd-x64": "0.19.12",
+ "@esbuild/linux-arm": "0.19.12",
+ "@esbuild/linux-arm64": "0.19.12",
+ "@esbuild/linux-ia32": "0.19.12",
+ "@esbuild/linux-loong64": "0.19.12",
+ "@esbuild/linux-mips64el": "0.19.12",
+ "@esbuild/linux-ppc64": "0.19.12",
+ "@esbuild/linux-riscv64": "0.19.12",
+ "@esbuild/linux-s390x": "0.19.12",
+ "@esbuild/linux-x64": "0.19.12",
+ "@esbuild/netbsd-x64": "0.19.12",
+ "@esbuild/openbsd-x64": "0.19.12",
+ "@esbuild/sunos-x64": "0.19.12",
+ "@esbuild/win32-arm64": "0.19.12",
+ "@esbuild/win32-ia32": "0.19.12",
+ "@esbuild/win32-x64": "0.19.12"
+ }
+ },
+ "node_modules/svelte-maplibre": {
+ "version": "0.9.14",
+ "license": "MIT",
+ "dependencies": {
+ "d3-geo": "^3.1.0",
+ "dequal": "^2.0.3",
+ "just-compare": "^2.3.0",
+ "just-flush": "^2.3.0",
+ "maplibre-gl": "^4.0.0",
+ "pmtiles": "^3.0.3"
+ },
+ "peerDependencies": {
+ "@deck.gl/core": "^8.8.0",
+ "@deck.gl/layers": "^8.8.0",
+ "@deck.gl/mapbox": "^8.8.0",
+ "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@deck.gl/core": {
+ "optional": true
+ },
+ "@deck.gl/layers": {
+ "optional": true
+ },
+ "@deck.gl/mapbox": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/svelte-preprocess": {
+ "version": "5.1.4",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/pug": "^2.0.6",
+ "detect-indent": "^6.1.0",
+ "magic-string": "^0.30.5",
+ "sorcery": "^0.11.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.10.2",
+ "coffeescript": "^2.5.1",
+ "less": "^3.11.3 || ^4.0.0",
+ "postcss": "^7 || ^8",
+ "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
+ "pug": "^3.0.0",
+ "sass": "^1.26.8",
+ "stylus": "^0.55.0",
+ "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0",
+ "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0",
+ "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "coffeescript": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "postcss-load-config": {
+ "optional": true
+ },
+ "pug": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/svelte/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/svelte/node_modules/is-reference": {
+ "version": "3.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.6"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.17",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.6.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.2",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.6",
+ "lilconfig": "^3.1.3",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.47",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.2",
+ "postcss-nested": "^6.2.0",
+ "postcss-selector-parser": "^6.1.2",
+ "resolve": "^1.22.8",
+ "sucrase": "^3.35.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tar": {
+ "version": "7.4.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tar/node_modules/mkdirp": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/timers-ext": {
+ "version": "0.1.8",
+ "license": "ISC",
+ "dependencies": {
+ "es5-ext": "^0.10.64",
+ "next-tick": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/tiny-glob": {
+ "version": "0.2.9",
+ "license": "MIT",
+ "dependencies": {
+ "globalyzer": "0.1.0",
+ "globrex": "^0.1.2"
+ }
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyqueue": {
+ "version": "3.0.0",
+ "license": "ISC"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "license": "0BSD"
+ },
+ "node_modules/tsparticles": {
+ "version": "3.8.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/matteobruni"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/tsparticles"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/matteobruni"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@tsparticles/engine": "3.8.0",
+ "@tsparticles/interaction-external-trail": "3.8.0",
+ "@tsparticles/plugin-absorbers": "3.8.0",
+ "@tsparticles/plugin-emitters": "3.8.0",
+ "@tsparticles/plugin-emitters-shape-circle": "3.8.0",
+ "@tsparticles/plugin-emitters-shape-square": "3.8.0",
+ "@tsparticles/shape-text": "3.8.0",
+ "@tsparticles/slim": "3.8.0",
+ "@tsparticles/updater-destroy": "3.8.0",
+ "@tsparticles/updater-roll": "3.8.0",
+ "@tsparticles/updater-tilt": "3.8.0",
+ "@tsparticles/updater-twinkle": "3.8.0",
+ "@tsparticles/updater-wobble": "3.8.0"
+ }
+ },
+ "node_modules/type": {
+ "version": "2.7.3",
+ "license": "ISC"
+ },
+ "node_modules/typescript": {
+ "version": "5.7.3",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.5.4",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unplugin": {
+ "version": "1.16.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/unplugin-icons": {
+ "version": "0.19.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@antfu/install-pkg": "^0.4.1",
+ "@antfu/utils": "^0.7.10",
+ "@iconify/utils": "^2.1.29",
+ "debug": "^4.3.6",
+ "kolorist": "^1.8.0",
+ "local-pkg": "^0.5.0",
+ "unplugin": "^1.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@svgr/core": ">=7.0.0",
+ "@svgx/core": "^1.0.1",
+ "@vue/compiler-sfc": "^3.0.2 || ^2.7.0",
+ "vue-template-compiler": "^2.6.12",
+ "vue-template-es2015-compiler": "^1.9.0"
+ },
+ "peerDependenciesMeta": {
+ "@svgr/core": {
+ "optional": true
+ },
+ "@svgx/core": {
+ "optional": true
+ },
+ "@vue/compiler-sfc": {
+ "optional": true
+ },
+ "vue-template-compiler": {
+ "optional": true
+ },
+ "vue-template-es2015-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.2",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vite": {
+ "version": "5.4.14",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/esbuild": {
+ "version": "0.21.5",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/vitefu": {
+ "version": "0.2.5",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vt-pbf": {
+ "version": "3.1.3",
+ "license": "MIT",
+ "dependencies": {
+ "@mapbox/point-geometry": "0.1.0",
+ "@mapbox/vector-tile": "^1.3.1",
+ "pbf": "^3.2.1"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.6.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "4.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.1",
+ "license": "ISC"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/y18n": {
+ "version": "4.0.3",
+ "license": "ISC"
+ },
+ "node_modules/yallist": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.7.0",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "15.4.1",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ }
+ }
+}
diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte
index 3a4c1f7..0187454 100644
--- a/frontend/src/routes/collections/[id]/+page.svelte
+++ b/frontend/src/routes/collections/[id]/+page.svelte
@@ -833,14 +833,17 @@
>
{#each adventures as adventure}
{#if adventure.longitude && adventure.latitude}
-
+
+
+ {adventure.category?.icon}
+
{adventure.name}
{adventure.category?.display_name + ' ' + adventure.category?.icon}
-
+
{/if}
{/each}
{#each transportations as transportation}
From f04a6e30a7b05e12dc83979923b418a69ffdf405 Mon Sep 17 00:00:00 2001
From: Lars Lehmann
Date: Thu, 23 Jan 2025 20:14:10 +0100
Subject: [PATCH 23/30] Remove package-lock.json
---
frontend/package-lock.json | 4499 ------------------------------------
1 file changed, 4499 deletions(-)
delete mode 100644 frontend/package-lock.json
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
deleted file mode 100644
index 3748c97..0000000
--- a/frontend/package-lock.json
+++ /dev/null
@@ -1,4499 +0,0 @@
-{
- "name": "adventurelog-frontend",
- "version": "0.8.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "adventurelog-frontend",
- "version": "0.8.0",
- "dependencies": {
- "@lukulent/svelte-umami": "^0.0.3",
- "emoji-picker-element": "^1.26.0",
- "gsap": "^3.12.7",
- "marked": "^15.0.4",
- "qrcode": "^1.5.4",
- "svelte-i18n": "^4.0.1",
- "svelte-maplibre": "^0.9.8",
- "tsparticles": "^3.7.1"
- },
- "devDependencies": {
- "@event-calendar/core": "^3.7.1",
- "@event-calendar/day-grid": "^3.7.1",
- "@event-calendar/time-grid": "^3.7.1",
- "@iconify-json/mdi": "^1.1.67",
- "@sveltejs/adapter-auto": "^3.2.2",
- "@sveltejs/adapter-node": "^5.2.0",
- "@sveltejs/adapter-vercel": "^5.4.1",
- "@sveltejs/kit": "^2.8.3",
- "@sveltejs/vite-plugin-svelte": "^3.1.1",
- "@tailwindcss/typography": "^0.5.13",
- "@types/node": "^22.5.4",
- "@types/qrcode": "^1.5.5",
- "autoprefixer": "^10.4.19",
- "daisyui": "^4.12.6",
- "postcss": "^8.4.38",
- "prettier": "^3.3.2",
- "prettier-plugin-svelte": "^3.2.5",
- "svelte": "^4.2.19",
- "svelte-check": "^3.8.1",
- "tailwindcss": "^3.4.4",
- "tslib": "^2.6.3",
- "typescript": "^5.5.2",
- "unplugin-icons": "^0.19.0",
- "vite": "^5.3.6"
- }
- },
- "node_modules/@alloc/quick-lru": {
- "version": "5.2.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.3.0",
- "license": "Apache-2.0",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@antfu/install-pkg": {
- "version": "0.4.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "package-manager-detector": "^0.2.0",
- "tinyexec": "^0.3.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@antfu/utils": {
- "version": "0.7.10",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.24.2",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@event-calendar/core": {
- "version": "3.8.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "svelte": "^4.2.19"
- }
- },
- "node_modules/@event-calendar/day-grid": {
- "version": "3.8.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@event-calendar/core": "~3.8.0",
- "svelte": "^4.2.19"
- }
- },
- "node_modules/@event-calendar/time-grid": {
- "version": "3.8.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@event-calendar/core": "~3.8.0",
- "svelte": "^4.2.19"
- }
- },
- "node_modules/@formatjs/ecma402-abstract": {
- "version": "2.3.2",
- "license": "MIT",
- "dependencies": {
- "@formatjs/fast-memoize": "2.2.6",
- "@formatjs/intl-localematcher": "0.5.10",
- "decimal.js": "10",
- "tslib": "2"
- }
- },
- "node_modules/@formatjs/fast-memoize": {
- "version": "2.2.6",
- "license": "MIT",
- "dependencies": {
- "tslib": "2"
- }
- },
- "node_modules/@formatjs/icu-messageformat-parser": {
- "version": "2.11.0",
- "license": "MIT",
- "dependencies": {
- "@formatjs/ecma402-abstract": "2.3.2",
- "@formatjs/icu-skeleton-parser": "1.8.12",
- "tslib": "2"
- }
- },
- "node_modules/@formatjs/icu-skeleton-parser": {
- "version": "1.8.12",
- "license": "MIT",
- "dependencies": {
- "@formatjs/ecma402-abstract": "2.3.2",
- "tslib": "2"
- }
- },
- "node_modules/@formatjs/intl-localematcher": {
- "version": "0.5.10",
- "license": "MIT",
- "dependencies": {
- "tslib": "2"
- }
- },
- "node_modules/@iconify-json/mdi": {
- "version": "1.2.3",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@iconify/types": "*"
- }
- },
- "node_modules/@iconify/types": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@iconify/utils": {
- "version": "2.2.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@antfu/install-pkg": "^0.4.1",
- "@antfu/utils": "^0.7.10",
- "@iconify/types": "^2.0.0",
- "debug": "^4.4.0",
- "globals": "^15.13.0",
- "kolorist": "^1.8.0",
- "local-pkg": "^0.5.1",
- "mlly": "^1.7.3"
- }
- },
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
- "version": "6.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
- "version": "6.2.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
- "version": "9.2.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@isaacs/cliui/node_modules/string-width": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
- "version": "7.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
- "version": "8.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/@isaacs/fs-minipass": {
- "version": "4.0.1",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.4"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.8",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.0",
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@lukulent/svelte-umami": {
- "version": "0.0.3",
- "license": "MIT",
- "peerDependencies": {
- "svelte": "^4.0.0"
- }
- },
- "node_modules/@mapbox/geojson-rewind": {
- "version": "0.5.2",
- "license": "ISC",
- "dependencies": {
- "get-stream": "^6.0.1",
- "minimist": "^1.2.6"
- },
- "bin": {
- "geojson-rewind": "geojson-rewind"
- }
- },
- "node_modules/@mapbox/jsonlint-lines-primitives": {
- "version": "2.0.2",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/@mapbox/node-pre-gyp": {
- "version": "2.0.0-rc.0",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "consola": "^3.2.3",
- "detect-libc": "^2.0.0",
- "https-proxy-agent": "^7.0.5",
- "node-fetch": "^2.6.7",
- "nopt": "^8.0.0",
- "semver": "^7.5.3",
- "tar": "^7.4.0"
- },
- "bin": {
- "node-pre-gyp": "bin/node-pre-gyp"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@mapbox/point-geometry": {
- "version": "0.1.0",
- "license": "ISC"
- },
- "node_modules/@mapbox/tiny-sdf": {
- "version": "2.0.6",
- "license": "BSD-2-Clause"
- },
- "node_modules/@mapbox/unitbezier": {
- "version": "0.0.1",
- "license": "BSD-2-Clause"
- },
- "node_modules/@mapbox/vector-tile": {
- "version": "1.3.1",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@mapbox/point-geometry": "~0.1.0"
- }
- },
- "node_modules/@mapbox/whoots-js": {
- "version": "3.1.0",
- "license": "ISC",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@maplibre/maplibre-gl-style-spec": {
- "version": "20.4.0",
- "license": "ISC",
- "dependencies": {
- "@mapbox/jsonlint-lines-primitives": "~2.0.2",
- "@mapbox/unitbezier": "^0.0.1",
- "json-stringify-pretty-compact": "^4.0.0",
- "minimist": "^1.2.8",
- "quickselect": "^2.0.0",
- "rw": "^1.3.3",
- "tinyqueue": "^3.0.0"
- },
- "bin": {
- "gl-style-format": "dist/gl-style-format.mjs",
- "gl-style-migrate": "dist/gl-style-migrate.mjs",
- "gl-style-validate": "dist/gl-style-validate.mjs"
- }
- },
- "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/quickselect": {
- "version": "2.0.0",
- "license": "ISC"
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@polka/url": {
- "version": "1.0.0-next.28",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@rollup/plugin-commonjs": {
- "version": "28.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@rollup/pluginutils": "^5.0.1",
- "commondir": "^1.0.1",
- "estree-walker": "^2.0.2",
- "fdir": "^6.2.0",
- "is-reference": "1.2.1",
- "magic-string": "^0.30.3",
- "picomatch": "^4.0.2"
- },
- "engines": {
- "node": ">=16.0.0 || 14 >= 14.17"
- },
- "peerDependencies": {
- "rollup": "^2.68.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/plugin-json": {
- "version": "6.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@rollup/pluginutils": "^5.1.0"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/plugin-node-resolve": {
- "version": "16.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@rollup/pluginutils": "^5.0.1",
- "@types/resolve": "1.20.2",
- "deepmerge": "^4.2.2",
- "is-module": "^1.0.0",
- "resolve": "^1.22.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.78.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/pluginutils": {
- "version": "5.1.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^2.0.2",
- "picomatch": "^4.0.2"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.31.0",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@sveltejs/adapter-auto": {
- "version": "3.3.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "import-meta-resolve": "^4.1.0"
- },
- "peerDependencies": {
- "@sveltejs/kit": "^2.0.0"
- }
- },
- "node_modules/@sveltejs/adapter-node": {
- "version": "5.2.12",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@rollup/plugin-commonjs": "^28.0.1",
- "@rollup/plugin-json": "^6.1.0",
- "@rollup/plugin-node-resolve": "^16.0.0",
- "rollup": "^4.9.5"
- },
- "peerDependencies": {
- "@sveltejs/kit": "^2.4.0"
- }
- },
- "node_modules/@sveltejs/adapter-vercel": {
- "version": "5.5.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vercel/nft": "^0.29.0",
- "esbuild": "^0.24.0"
- },
- "peerDependencies": {
- "@sveltejs/kit": "^2.4.0"
- }
- },
- "node_modules/@sveltejs/kit": {
- "version": "2.16.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/cookie": "^0.6.0",
- "cookie": "^0.6.0",
- "devalue": "^5.1.0",
- "esm-env": "^1.2.2",
- "import-meta-resolve": "^4.1.0",
- "kleur": "^4.1.5",
- "magic-string": "^0.30.5",
- "mrmime": "^2.0.0",
- "sade": "^1.8.1",
- "set-cookie-parser": "^2.6.0",
- "sirv": "^3.0.0"
- },
- "bin": {
- "svelte-kit": "svelte-kit.js"
- },
- "engines": {
- "node": ">=18.13"
- },
- "peerDependencies": {
- "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0",
- "svelte": "^4.0.0 || ^5.0.0-next.0",
- "vite": "^5.0.3 || ^6.0.0"
- }
- },
- "node_modules/@sveltejs/vite-plugin-svelte": {
- "version": "3.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0",
- "debug": "^4.3.4",
- "deepmerge": "^4.3.1",
- "kleur": "^4.1.5",
- "magic-string": "^0.30.10",
- "svelte-hmr": "^0.16.0",
- "vitefu": "^0.2.5"
- },
- "engines": {
- "node": "^18.0.0 || >=20"
- },
- "peerDependencies": {
- "svelte": "^4.0.0 || ^5.0.0-next.0",
- "vite": "^5.0.0"
- }
- },
- "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
- "version": "2.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.0.0 || >=20"
- },
- "peerDependencies": {
- "@sveltejs/vite-plugin-svelte": "^3.0.0",
- "svelte": "^4.0.0 || ^5.0.0-next.0",
- "vite": "^5.0.0"
- }
- },
- "node_modules/@tailwindcss/typography": {
- "version": "0.5.16",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "lodash.castarray": "^4.4.0",
- "lodash.isplainobject": "^4.0.6",
- "lodash.merge": "^4.6.2",
- "postcss-selector-parser": "6.0.10"
- },
- "peerDependencies": {
- "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
- }
- },
- "node_modules/@tsparticles/basic": {
- "version": "3.8.0",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/matteobruni"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/tsparticles"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/matteobruni"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0",
- "@tsparticles/move-base": "3.8.0",
- "@tsparticles/plugin-hex-color": "3.8.0",
- "@tsparticles/plugin-hsl-color": "3.8.0",
- "@tsparticles/plugin-rgb-color": "3.8.0",
- "@tsparticles/shape-circle": "3.8.0",
- "@tsparticles/updater-color": "3.8.0",
- "@tsparticles/updater-opacity": "3.8.0",
- "@tsparticles/updater-out-modes": "3.8.0",
- "@tsparticles/updater-size": "3.8.0"
- }
- },
- "node_modules/@tsparticles/engine": {
- "version": "3.8.0",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/matteobruni"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/tsparticles"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/matteobruni"
- }
- ],
- "hasInstallScript": true,
- "license": "MIT"
- },
- "node_modules/@tsparticles/interaction-external-attract": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-external-bounce": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-external-bubble": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-external-connect": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-external-grab": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-external-pause": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-external-push": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-external-remove": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-external-repulse": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-external-slow": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-external-trail": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-particles-attract": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-particles-collisions": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/interaction-particles-links": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/move-base": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/move-parallax": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/plugin-absorbers": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/plugin-easing-quad": {
- "version": "3.8.0",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/matteobruni"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/tsparticles"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/matteobruni"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/plugin-emitters": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/plugin-emitters-shape-circle": {
- "version": "3.8.0",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/matteobruni"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/tsparticles"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/matteobruni"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0",
- "@tsparticles/plugin-emitters": "3.8.0"
- }
- },
- "node_modules/@tsparticles/plugin-emitters-shape-square": {
- "version": "3.8.0",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/matteobruni"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/tsparticles"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/matteobruni"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0",
- "@tsparticles/plugin-emitters": "3.8.0"
- }
- },
- "node_modules/@tsparticles/plugin-hex-color": {
- "version": "3.8.0",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/matteobruni"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/tsparticles"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/matteobruni"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/plugin-hsl-color": {
- "version": "3.8.0",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/matteobruni"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/tsparticles"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/matteobruni"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/plugin-rgb-color": {
- "version": "3.8.0",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/matteobruni"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/tsparticles"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/matteobruni"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/shape-circle": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/shape-emoji": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/shape-image": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/shape-line": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/shape-polygon": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/shape-square": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/shape-star": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/shape-text": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/slim": {
- "version": "3.8.0",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/matteobruni"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/tsparticles"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/matteobruni"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@tsparticles/basic": "3.8.0",
- "@tsparticles/engine": "3.8.0",
- "@tsparticles/interaction-external-attract": "3.8.0",
- "@tsparticles/interaction-external-bounce": "3.8.0",
- "@tsparticles/interaction-external-bubble": "3.8.0",
- "@tsparticles/interaction-external-connect": "3.8.0",
- "@tsparticles/interaction-external-grab": "3.8.0",
- "@tsparticles/interaction-external-pause": "3.8.0",
- "@tsparticles/interaction-external-push": "3.8.0",
- "@tsparticles/interaction-external-remove": "3.8.0",
- "@tsparticles/interaction-external-repulse": "3.8.0",
- "@tsparticles/interaction-external-slow": "3.8.0",
- "@tsparticles/interaction-particles-attract": "3.8.0",
- "@tsparticles/interaction-particles-collisions": "3.8.0",
- "@tsparticles/interaction-particles-links": "3.8.0",
- "@tsparticles/move-parallax": "3.8.0",
- "@tsparticles/plugin-easing-quad": "3.8.0",
- "@tsparticles/shape-emoji": "3.8.0",
- "@tsparticles/shape-image": "3.8.0",
- "@tsparticles/shape-line": "3.8.0",
- "@tsparticles/shape-polygon": "3.8.0",
- "@tsparticles/shape-square": "3.8.0",
- "@tsparticles/shape-star": "3.8.0",
- "@tsparticles/updater-life": "3.8.0",
- "@tsparticles/updater-rotate": "3.8.0",
- "@tsparticles/updater-stroke-color": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-color": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-destroy": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-life": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-opacity": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-out-modes": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-roll": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-rotate": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-size": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-stroke-color": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-tilt": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-twinkle": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@tsparticles/updater-wobble": {
- "version": "3.8.0",
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0"
- }
- },
- "node_modules/@types/cookie": {
- "version": "0.6.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/estree": {
- "version": "1.0.6",
- "license": "MIT"
- },
- "node_modules/@types/geojson": {
- "version": "7946.0.15",
- "license": "MIT"
- },
- "node_modules/@types/geojson-vt": {
- "version": "3.2.5",
- "license": "MIT",
- "dependencies": {
- "@types/geojson": "*"
- }
- },
- "node_modules/@types/leaflet": {
- "version": "1.9.16",
- "license": "MIT",
- "dependencies": {
- "@types/geojson": "*"
- }
- },
- "node_modules/@types/mapbox__point-geometry": {
- "version": "0.1.4",
- "license": "MIT"
- },
- "node_modules/@types/mapbox__vector-tile": {
- "version": "1.3.4",
- "license": "MIT",
- "dependencies": {
- "@types/geojson": "*",
- "@types/mapbox__point-geometry": "*",
- "@types/pbf": "*"
- }
- },
- "node_modules/@types/node": {
- "version": "22.10.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~6.20.0"
- }
- },
- "node_modules/@types/pbf": {
- "version": "3.0.5",
- "license": "MIT"
- },
- "node_modules/@types/pug": {
- "version": "2.0.10",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/qrcode": {
- "version": "1.5.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/resolve": {
- "version": "1.20.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/supercluster": {
- "version": "7.1.3",
- "license": "MIT",
- "dependencies": {
- "@types/geojson": "*"
- }
- },
- "node_modules/@vercel/nft": {
- "version": "0.29.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@mapbox/node-pre-gyp": "^2.0.0-rc.0",
- "@rollup/pluginutils": "^5.1.3",
- "acorn": "^8.6.0",
- "acorn-import-attributes": "^1.9.5",
- "async-sema": "^3.1.1",
- "bindings": "^1.4.0",
- "estree-walker": "2.0.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "node-gyp-build": "^4.2.2",
- "picomatch": "^4.0.2",
- "resolve-from": "^5.0.0"
- },
- "bin": {
- "nft": "out/cli.js"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/abbrev": {
- "version": "3.0.0",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
- "node_modules/acorn": {
- "version": "8.14.0",
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-import-attributes": {
- "version": "1.9.5",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^8"
- }
- },
- "node_modules/agent-base": {
- "version": "7.1.3",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/any-promise": {
- "version": "1.3.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/anymatch/node_modules/picomatch": {
- "version": "2.3.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/arg": {
- "version": "5.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/aria-query": {
- "version": "5.3.2",
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/async-sema": {
- "version": "3.1.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/autoprefixer": {
- "version": "10.4.20",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/autoprefixer"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.23.3",
- "caniuse-lite": "^1.0.30001646",
- "fraction.js": "^4.3.7",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.1",
- "postcss-value-parser": "^4.2.0"
- },
- "bin": {
- "autoprefixer": "bin/autoprefixer"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/axobject-query": {
- "version": "4.1.0",
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/binary-extensions": {
- "version": "2.3.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/bindings": {
- "version": "1.5.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "file-uri-to-path": "1.0.0"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.24.4",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "caniuse-lite": "^1.0.30001688",
- "electron-to-chromium": "^1.5.73",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.1"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer-crc32": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/camelcase": {
- "version": "5.3.1",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase-css": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001695",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/chokidar": {
- "version": "3.6.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chownr": {
- "version": "3.0.0",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/cli-color": {
- "version": "2.0.4",
- "license": "ISC",
- "dependencies": {
- "d": "^1.0.1",
- "es5-ext": "^0.10.64",
- "es6-iterator": "^2.0.3",
- "memoizee": "^0.4.15",
- "timers-ext": "^0.1.7"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/cliui": {
- "version": "6.0.0",
- "license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^6.2.0"
- }
- },
- "node_modules/code-red": {
- "version": "1.0.4",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15",
- "@types/estree": "^1.0.1",
- "acorn": "^8.10.0",
- "estree-walker": "^3.0.3",
- "periscopic": "^3.1.0"
- }
- },
- "node_modules/code-red/node_modules/estree-walker": {
- "version": "3.0.3",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "license": "MIT"
- },
- "node_modules/commander": {
- "version": "4.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/commondir": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/confbox": {
- "version": "0.1.8",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/consola": {
- "version": "3.4.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
- "node_modules/cookie": {
- "version": "0.6.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/cross-spawn/node_modules/isexe": {
- "version": "2.0.0",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/cross-spawn/node_modules/which": {
- "version": "2.0.2",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/css-selector-tokenizer": {
- "version": "0.8.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "fastparse": "^1.1.2"
- }
- },
- "node_modules/css-tree": {
- "version": "2.3.1",
- "license": "MIT",
- "dependencies": {
- "mdn-data": "2.0.30",
- "source-map-js": "^1.0.1"
- },
- "engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
- }
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/culori": {
- "version": "3.3.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
- "node_modules/d": {
- "version": "1.0.2",
- "license": "ISC",
- "dependencies": {
- "es5-ext": "^0.10.64",
- "type": "^2.7.2"
- },
- "engines": {
- "node": ">=0.12"
- }
- },
- "node_modules/d3-array": {
- "version": "3.2.4",
- "license": "ISC",
- "dependencies": {
- "internmap": "1 - 2"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-geo": {
- "version": "3.1.1",
- "license": "ISC",
- "dependencies": {
- "d3-array": "2.5.0 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/daisyui": {
- "version": "4.12.23",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "css-selector-tokenizer": "^0.8",
- "culori": "^3",
- "picocolors": "^1",
- "postcss-js": "^4"
- },
- "engines": {
- "node": ">=16.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/daisyui"
- }
- },
- "node_modules/debug": {
- "version": "4.4.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decamelize": {
- "version": "1.2.0",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decimal.js": {
- "version": "10.4.3",
- "license": "MIT"
- },
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/detect-indent": {
- "version": "6.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/detect-libc": {
- "version": "2.0.3",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/devalue": {
- "version": "5.1.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/didyoumean": {
- "version": "1.2.2",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/dijkstrajs": {
- "version": "1.0.3",
- "license": "MIT"
- },
- "node_modules/dlv": {
- "version": "1.1.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/earcut": {
- "version": "3.0.1",
- "license": "ISC"
- },
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.86",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/emoji-picker-element": {
- "version": "1.26.0",
- "license": "Apache-2.0"
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "license": "MIT"
- },
- "node_modules/es5-ext": {
- "version": "0.10.64",
- "hasInstallScript": true,
- "license": "ISC",
- "dependencies": {
- "es6-iterator": "^2.0.3",
- "es6-symbol": "^3.1.3",
- "esniff": "^2.0.1",
- "next-tick": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/es6-iterator": {
- "version": "2.0.3",
- "license": "MIT",
- "dependencies": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "node_modules/es6-promise": {
- "version": "3.3.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/es6-symbol": {
- "version": "3.1.4",
- "license": "ISC",
- "dependencies": {
- "d": "^1.0.2",
- "ext": "^1.7.0"
- },
- "engines": {
- "node": ">=0.12"
- }
- },
- "node_modules/es6-weak-map": {
- "version": "2.0.3",
- "license": "ISC",
- "dependencies": {
- "d": "1",
- "es5-ext": "^0.10.46",
- "es6-iterator": "^2.0.3",
- "es6-symbol": "^3.1.1"
- }
- },
- "node_modules/esbuild": {
- "version": "0.24.2",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.24.2",
- "@esbuild/android-arm": "0.24.2",
- "@esbuild/android-arm64": "0.24.2",
- "@esbuild/android-x64": "0.24.2",
- "@esbuild/darwin-arm64": "0.24.2",
- "@esbuild/darwin-x64": "0.24.2",
- "@esbuild/freebsd-arm64": "0.24.2",
- "@esbuild/freebsd-x64": "0.24.2",
- "@esbuild/linux-arm": "0.24.2",
- "@esbuild/linux-arm64": "0.24.2",
- "@esbuild/linux-ia32": "0.24.2",
- "@esbuild/linux-loong64": "0.24.2",
- "@esbuild/linux-mips64el": "0.24.2",
- "@esbuild/linux-ppc64": "0.24.2",
- "@esbuild/linux-riscv64": "0.24.2",
- "@esbuild/linux-s390x": "0.24.2",
- "@esbuild/linux-x64": "0.24.2",
- "@esbuild/netbsd-arm64": "0.24.2",
- "@esbuild/netbsd-x64": "0.24.2",
- "@esbuild/openbsd-arm64": "0.24.2",
- "@esbuild/openbsd-x64": "0.24.2",
- "@esbuild/sunos-x64": "0.24.2",
- "@esbuild/win32-arm64": "0.24.2",
- "@esbuild/win32-ia32": "0.24.2",
- "@esbuild/win32-x64": "0.24.2"
- }
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/esm-env": {
- "version": "1.2.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/esniff": {
- "version": "2.0.1",
- "license": "ISC",
- "dependencies": {
- "d": "^1.0.1",
- "es5-ext": "^0.10.62",
- "event-emitter": "^0.3.5",
- "type": "^2.7.2"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "license": "MIT"
- },
- "node_modules/event-emitter": {
- "version": "0.3.5",
- "license": "MIT",
- "dependencies": {
- "d": "1",
- "es5-ext": "~0.10.14"
- }
- },
- "node_modules/ext": {
- "version": "1.7.0",
- "license": "ISC",
- "dependencies": {
- "type": "^2.7.2"
- }
- },
- "node_modules/fast-glob": {
- "version": "3.3.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.8"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fastparse": {
- "version": "1.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fastq": {
- "version": "1.18.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/fdir": {
- "version": "6.4.3",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/fflate": {
- "version": "0.8.2",
- "license": "MIT"
- },
- "node_modules/file-uri-to-path": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-up": {
- "version": "4.1.0",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/foreground-child": {
- "version": "3.3.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/fraction.js": {
- "version": "4.3.7",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "patreon",
- "url": "https://github.com/sponsors/rawify"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/geojson-vt": {
- "version": "4.0.2",
- "license": "ISC"
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "license": "ISC",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-stream": {
- "version": "6.0.1",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/gl-matrix": {
- "version": "3.4.3",
- "license": "MIT"
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/global-prefix": {
- "version": "4.0.0",
- "license": "MIT",
- "dependencies": {
- "ini": "^4.1.3",
- "kind-of": "^6.0.3",
- "which": "^4.0.0"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/globals": {
- "version": "15.14.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/globalyzer": {
- "version": "0.1.0",
- "license": "MIT"
- },
- "node_modules/globrex": {
- "version": "0.1.2",
- "license": "MIT"
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/gsap": {
- "version": "3.12.7",
- "license": "Standard 'no charge' license: https://gsap.com/standard-license. Club GSAP members get more: https://gsap.com/licensing/. Why GreenSock doesn't employ an MIT license: https://gsap.com/why-license/"
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/https-proxy-agent": {
- "version": "7.0.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "BSD-3-Clause"
- },
- "node_modules/import-meta-resolve": {
- "version": "4.1.0",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ini": {
- "version": "4.1.3",
- "license": "ISC",
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/internmap": {
- "version": "2.0.3",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/intl-messageformat": {
- "version": "10.7.14",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@formatjs/ecma402-abstract": "2.3.2",
- "@formatjs/fast-memoize": "2.2.6",
- "@formatjs/icu-messageformat-parser": "2.11.0",
- "tslib": "2"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.16.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-module": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-promise": {
- "version": "2.2.2",
- "license": "MIT"
- },
- "node_modules/is-reference": {
- "version": "1.2.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/isexe": {
- "version": "3.1.1",
- "license": "ISC",
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/jackspeak": {
- "version": "3.4.3",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/cliui": "^8.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- },
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
- }
- },
- "node_modules/jiti": {
- "version": "1.21.7",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jiti": "bin/jiti.js"
- }
- },
- "node_modules/json-stringify-pretty-compact": {
- "version": "4.0.0",
- "license": "MIT"
- },
- "node_modules/just-compare": {
- "version": "2.3.0",
- "license": "MIT"
- },
- "node_modules/just-flush": {
- "version": "2.3.0",
- "license": "MIT"
- },
- "node_modules/kdbush": {
- "version": "4.0.2",
- "license": "ISC"
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/kleur": {
- "version": "4.1.5",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/kolorist": {
- "version": "1.8.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lilconfig": {
- "version": "3.1.3",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/local-pkg": {
- "version": "0.5.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mlly": "^1.7.3",
- "pkg-types": "^1.2.1"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/locate-character": {
- "version": "3.0.0",
- "license": "MIT"
- },
- "node_modules/locate-path": {
- "version": "5.0.0",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lodash.castarray": {
- "version": "4.4.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lru-cache": {
- "version": "10.4.3",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/lru-queue": {
- "version": "0.1.0",
- "license": "MIT",
- "dependencies": {
- "es5-ext": "~0.10.2"
- }
- },
- "node_modules/magic-string": {
- "version": "0.30.17",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0"
- }
- },
- "node_modules/maplibre-gl": {
- "version": "4.7.1",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@mapbox/geojson-rewind": "^0.5.2",
- "@mapbox/jsonlint-lines-primitives": "^2.0.2",
- "@mapbox/point-geometry": "^0.1.0",
- "@mapbox/tiny-sdf": "^2.0.6",
- "@mapbox/unitbezier": "^0.0.1",
- "@mapbox/vector-tile": "^1.3.1",
- "@mapbox/whoots-js": "^3.1.0",
- "@maplibre/maplibre-gl-style-spec": "^20.3.1",
- "@types/geojson": "^7946.0.14",
- "@types/geojson-vt": "3.2.5",
- "@types/mapbox__point-geometry": "^0.1.4",
- "@types/mapbox__vector-tile": "^1.3.4",
- "@types/pbf": "^3.0.5",
- "@types/supercluster": "^7.1.3",
- "earcut": "^3.0.0",
- "geojson-vt": "^4.0.2",
- "gl-matrix": "^3.4.3",
- "global-prefix": "^4.0.0",
- "kdbush": "^4.0.2",
- "murmurhash-js": "^1.0.0",
- "pbf": "^3.3.0",
- "potpack": "^2.0.0",
- "quickselect": "^3.0.0",
- "supercluster": "^8.0.1",
- "tinyqueue": "^3.0.0",
- "vt-pbf": "^3.1.3"
- },
- "engines": {
- "node": ">=16.14.0",
- "npm": ">=8.1.0"
- },
- "funding": {
- "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1"
- }
- },
- "node_modules/marked": {
- "version": "15.0.6",
- "license": "MIT",
- "bin": {
- "marked": "bin/marked.js"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/mdn-data": {
- "version": "2.0.30",
- "license": "CC0-1.0"
- },
- "node_modules/memoizee": {
- "version": "0.4.17",
- "license": "ISC",
- "dependencies": {
- "d": "^1.0.2",
- "es5-ext": "^0.10.64",
- "es6-weak-map": "^2.0.3",
- "event-emitter": "^0.3.5",
- "is-promise": "^2.2.2",
- "lru-queue": "^0.1.0",
- "next-tick": "^1.1.0",
- "timers-ext": "^0.1.7"
- },
- "engines": {
- "node": ">=0.12"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/micromatch/node_modules/picomatch": {
- "version": "2.3.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/min-indent": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/minipass": {
- "version": "7.1.2",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/minizlib": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.0.4",
- "rimraf": "^5.0.5"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/minizlib/node_modules/brace-expansion": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/minizlib/node_modules/glob": {
- "version": "10.4.5",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/minizlib/node_modules/minimatch": {
- "version": "9.0.5",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/minizlib/node_modules/rimraf": {
- "version": "5.0.10",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^10.3.7"
- },
- "bin": {
- "rimraf": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/mlly": {
- "version": "1.7.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.14.0",
- "pathe": "^2.0.1",
- "pkg-types": "^1.3.0",
- "ufo": "^1.5.4"
- }
- },
- "node_modules/mri": {
- "version": "1.2.0",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mrmime": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/murmurhash-js": {
- "version": "1.0.0",
- "license": "MIT"
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.8",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/next-tick": {
- "version": "1.1.0",
- "license": "ISC"
- },
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/node-gyp-build": {
- "version": "4.8.4",
- "dev": true,
- "license": "MIT",
- "bin": {
- "node-gyp-build": "bin.js",
- "node-gyp-build-optional": "optional.js",
- "node-gyp-build-test": "build-test.js"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.19",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/nopt": {
- "version": "8.1.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "abbrev": "^3.0.0"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-range": {
- "version": "0.1.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-hash": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "license": "MIT",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "4.1.0",
- "license": "MIT",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/package-json-from-dist": {
- "version": "1.0.1",
- "dev": true,
- "license": "BlueOak-1.0.0"
- },
- "node_modules/package-manager-detector": {
- "version": "0.2.8",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/path-scurry": {
- "version": "1.11.1",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "lru-cache": "^10.2.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
- },
- "engines": {
- "node": ">=16 || 14 >=14.18"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/pathe": {
- "version": "2.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/pbf": {
- "version": "3.3.0",
- "license": "BSD-3-Clause",
- "dependencies": {
- "ieee754": "^1.1.12",
- "resolve-protobuf-schema": "^2.1.0"
- },
- "bin": {
- "pbf": "bin/pbf"
- }
- },
- "node_modules/periscopic": {
- "version": "3.1.0",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^3.0.0",
- "is-reference": "^3.0.0"
- }
- },
- "node_modules/periscopic/node_modules/estree-walker": {
- "version": "3.0.3",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/periscopic/node_modules/is-reference": {
- "version": "3.0.3",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.6"
- }
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "4.0.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.6",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/pkg-types": {
- "version": "1.3.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.4",
- "pathe": "^2.0.1"
- }
- },
- "node_modules/pmtiles": {
- "version": "3.2.1",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@types/leaflet": "^1.9.8",
- "fflate": "^0.8.0"
- }
- },
- "node_modules/pngjs": {
- "version": "5.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.1",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.8",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-import": {
- "version": "15.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-js": {
- "version": "4.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "camelcase-css": "^2.0.1"
- },
- "engines": {
- "node": "^12 || ^14 || >= 16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.4.21"
- }
- },
- "node_modules/postcss-load-config": {
- "version": "4.0.2",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "lilconfig": "^3.0.0",
- "yaml": "^2.3.4"
- },
- "engines": {
- "node": ">= 14"
- },
- "peerDependencies": {
- "postcss": ">=8.0.9",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "postcss": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
- }
- },
- "node_modules/postcss-nested": {
- "version": "6.2.0",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "postcss-selector-parser": "^6.1.1"
- },
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.14"
- }
- },
- "node_modules/postcss-nested/node_modules/postcss-selector-parser": {
- "version": "6.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "6.0.10",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/potpack": {
- "version": "2.0.0",
- "license": "ISC"
- },
- "node_modules/prettier": {
- "version": "3.4.2",
- "dev": true,
- "license": "MIT",
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/prettier-plugin-svelte": {
- "version": "3.3.3",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "prettier": "^3.0.0",
- "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0"
- }
- },
- "node_modules/protocol-buffers-schema": {
- "version": "3.6.0",
- "license": "MIT"
- },
- "node_modules/qrcode": {
- "version": "1.5.4",
- "license": "MIT",
- "dependencies": {
- "dijkstrajs": "^1.0.1",
- "pngjs": "^5.0.0",
- "yargs": "^15.3.1"
- },
- "bin": {
- "qrcode": "bin/qrcode"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/quickselect": {
- "version": "3.0.0",
- "license": "ISC"
- },
- "node_modules/read-cache": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pify": "^2.3.0"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/readdirp/node_modules/picomatch": {
- "version": "2.3.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-main-filename": {
- "version": "2.0.0",
- "license": "ISC"
- },
- "node_modules/resolve": {
- "version": "1.22.10",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.16.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-protobuf-schema": {
- "version": "2.1.0",
- "license": "MIT",
- "dependencies": {
- "protocol-buffers-schema": "^3.3.1"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "2.7.1",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/rollup": {
- "version": "4.31.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "1.0.6"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.31.0",
- "@rollup/rollup-android-arm64": "4.31.0",
- "@rollup/rollup-darwin-arm64": "4.31.0",
- "@rollup/rollup-darwin-x64": "4.31.0",
- "@rollup/rollup-freebsd-arm64": "4.31.0",
- "@rollup/rollup-freebsd-x64": "4.31.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.31.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.31.0",
- "@rollup/rollup-linux-arm64-gnu": "4.31.0",
- "@rollup/rollup-linux-arm64-musl": "4.31.0",
- "@rollup/rollup-linux-loongarch64-gnu": "4.31.0",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.31.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.31.0",
- "@rollup/rollup-linux-s390x-gnu": "4.31.0",
- "@rollup/rollup-linux-x64-gnu": "4.31.0",
- "@rollup/rollup-linux-x64-musl": "4.31.0",
- "@rollup/rollup-win32-arm64-msvc": "4.31.0",
- "@rollup/rollup-win32-ia32-msvc": "4.31.0",
- "@rollup/rollup-win32-x64-msvc": "4.31.0",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/rw": {
- "version": "1.3.3",
- "license": "BSD-3-Clause"
- },
- "node_modules/sade": {
- "version": "1.8.1",
- "license": "MIT",
- "dependencies": {
- "mri": "^1.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/sander": {
- "version": "0.5.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es6-promise": "^3.1.2",
- "graceful-fs": "^4.1.3",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.5.2"
- }
- },
- "node_modules/semver": {
- "version": "7.6.3",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "license": "ISC"
- },
- "node_modules/set-cookie-parser": {
- "version": "2.7.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/signal-exit": {
- "version": "4.1.0",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/sirv": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@polka/url": "^1.0.0-next.24",
- "mrmime": "^2.0.0",
- "totalist": "^3.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/sorcery": {
- "version": "0.11.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.14",
- "buffer-crc32": "^1.0.0",
- "minimist": "^1.2.0",
- "sander": "^0.5.0"
- },
- "bin": {
- "sorcery": "bin/sorcery"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs": {
- "name": "string-width",
- "version": "4.2.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi-cjs": {
- "name": "strip-ansi",
- "version": "6.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-indent": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "min-indent": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/sucrase": {
- "version": "3.35.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "glob": "^10.3.10",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/sucrase/node_modules/brace-expansion": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/sucrase/node_modules/glob": {
- "version": "10.4.5",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/sucrase/node_modules/minimatch": {
- "version": "9.0.5",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/supercluster": {
- "version": "8.0.1",
- "license": "ISC",
- "dependencies": {
- "kdbush": "^4.0.2"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/svelte": {
- "version": "4.2.19",
- "license": "MIT",
- "dependencies": {
- "@ampproject/remapping": "^2.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.15",
- "@jridgewell/trace-mapping": "^0.3.18",
- "@types/estree": "^1.0.1",
- "acorn": "^8.9.0",
- "aria-query": "^5.3.0",
- "axobject-query": "^4.0.0",
- "code-red": "^1.0.3",
- "css-tree": "^2.3.1",
- "estree-walker": "^3.0.3",
- "is-reference": "^3.0.1",
- "locate-character": "^3.0.0",
- "magic-string": "^0.30.4",
- "periscopic": "^3.1.0"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/svelte-check": {
- "version": "3.8.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.17",
- "chokidar": "^3.4.1",
- "picocolors": "^1.0.0",
- "sade": "^1.7.4",
- "svelte-preprocess": "^5.1.3",
- "typescript": "^5.0.3"
- },
- "bin": {
- "svelte-check": "bin/svelte-check"
- },
- "peerDependencies": {
- "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0"
- }
- },
- "node_modules/svelte-hmr": {
- "version": "0.16.0",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^12.20 || ^14.13.1 || >= 16"
- },
- "peerDependencies": {
- "svelte": "^3.19.0 || ^4.0.0"
- }
- },
- "node_modules/svelte-i18n": {
- "version": "4.0.1",
- "license": "MIT",
- "dependencies": {
- "cli-color": "^2.0.3",
- "deepmerge": "^4.2.2",
- "esbuild": "^0.19.2",
- "estree-walker": "^2",
- "intl-messageformat": "^10.5.3",
- "sade": "^1.8.1",
- "tiny-glob": "^0.2.9"
- },
- "bin": {
- "svelte-i18n": "dist/cli.js"
- },
- "engines": {
- "node": ">= 16"
- },
- "peerDependencies": {
- "svelte": "^3 || ^4 || ^5"
- }
- },
- "node_modules/svelte-i18n/node_modules/@esbuild/linux-x64": {
- "version": "0.19.12",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/svelte-i18n/node_modules/esbuild": {
- "version": "0.19.12",
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.19.12",
- "@esbuild/android-arm": "0.19.12",
- "@esbuild/android-arm64": "0.19.12",
- "@esbuild/android-x64": "0.19.12",
- "@esbuild/darwin-arm64": "0.19.12",
- "@esbuild/darwin-x64": "0.19.12",
- "@esbuild/freebsd-arm64": "0.19.12",
- "@esbuild/freebsd-x64": "0.19.12",
- "@esbuild/linux-arm": "0.19.12",
- "@esbuild/linux-arm64": "0.19.12",
- "@esbuild/linux-ia32": "0.19.12",
- "@esbuild/linux-loong64": "0.19.12",
- "@esbuild/linux-mips64el": "0.19.12",
- "@esbuild/linux-ppc64": "0.19.12",
- "@esbuild/linux-riscv64": "0.19.12",
- "@esbuild/linux-s390x": "0.19.12",
- "@esbuild/linux-x64": "0.19.12",
- "@esbuild/netbsd-x64": "0.19.12",
- "@esbuild/openbsd-x64": "0.19.12",
- "@esbuild/sunos-x64": "0.19.12",
- "@esbuild/win32-arm64": "0.19.12",
- "@esbuild/win32-ia32": "0.19.12",
- "@esbuild/win32-x64": "0.19.12"
- }
- },
- "node_modules/svelte-maplibre": {
- "version": "0.9.14",
- "license": "MIT",
- "dependencies": {
- "d3-geo": "^3.1.0",
- "dequal": "^2.0.3",
- "just-compare": "^2.3.0",
- "just-flush": "^2.3.0",
- "maplibre-gl": "^4.0.0",
- "pmtiles": "^3.0.3"
- },
- "peerDependencies": {
- "@deck.gl/core": "^8.8.0",
- "@deck.gl/layers": "^8.8.0",
- "@deck.gl/mapbox": "^8.8.0",
- "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "@deck.gl/core": {
- "optional": true
- },
- "@deck.gl/layers": {
- "optional": true
- },
- "@deck.gl/mapbox": {
- "optional": true
- }
- }
- },
- "node_modules/svelte-preprocess": {
- "version": "5.1.4",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "@types/pug": "^2.0.6",
- "detect-indent": "^6.1.0",
- "magic-string": "^0.30.5",
- "sorcery": "^0.11.0",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">= 16.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.10.2",
- "coffeescript": "^2.5.1",
- "less": "^3.11.3 || ^4.0.0",
- "postcss": "^7 || ^8",
- "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
- "pug": "^3.0.0",
- "sass": "^1.26.8",
- "stylus": "^0.55.0",
- "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0",
- "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0",
- "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
- "coffeescript": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "postcss": {
- "optional": true
- },
- "postcss-load-config": {
- "optional": true
- },
- "pug": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/svelte/node_modules/estree-walker": {
- "version": "3.0.3",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/svelte/node_modules/is-reference": {
- "version": "3.0.3",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.6"
- }
- },
- "node_modules/tailwindcss": {
- "version": "3.4.17",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@alloc/quick-lru": "^5.2.0",
- "arg": "^5.0.2",
- "chokidar": "^3.6.0",
- "didyoumean": "^1.2.2",
- "dlv": "^1.1.3",
- "fast-glob": "^3.3.2",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "jiti": "^1.21.6",
- "lilconfig": "^3.1.3",
- "micromatch": "^4.0.8",
- "normalize-path": "^3.0.0",
- "object-hash": "^3.0.0",
- "picocolors": "^1.1.1",
- "postcss": "^8.4.47",
- "postcss-import": "^15.1.0",
- "postcss-js": "^4.0.1",
- "postcss-load-config": "^4.0.2",
- "postcss-nested": "^6.2.0",
- "postcss-selector-parser": "^6.1.2",
- "resolve": "^1.22.8",
- "sucrase": "^3.35.0"
- },
- "bin": {
- "tailwind": "lib/cli.js",
- "tailwindcss": "lib/cli.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/tailwindcss/node_modules/glob-parent": {
- "version": "6.0.2",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/tailwindcss/node_modules/postcss-selector-parser": {
- "version": "6.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/tar": {
- "version": "7.4.3",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "@isaacs/fs-minipass": "^4.0.0",
- "chownr": "^3.0.0",
- "minipass": "^7.1.2",
- "minizlib": "^3.0.1",
- "mkdirp": "^3.0.1",
- "yallist": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/tar/node_modules/mkdirp": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT",
- "bin": {
- "mkdirp": "dist/cjs/src/bin.js"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/thenify": {
- "version": "3.3.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/timers-ext": {
- "version": "0.1.8",
- "license": "ISC",
- "dependencies": {
- "es5-ext": "^0.10.64",
- "next-tick": "^1.1.0"
- },
- "engines": {
- "node": ">=0.12"
- }
- },
- "node_modules/tiny-glob": {
- "version": "0.2.9",
- "license": "MIT",
- "dependencies": {
- "globalyzer": "0.1.0",
- "globrex": "^0.1.2"
- }
- },
- "node_modules/tinyexec": {
- "version": "0.3.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tinyqueue": {
- "version": "3.0.0",
- "license": "ISC"
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/totalist": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "license": "0BSD"
- },
- "node_modules/tsparticles": {
- "version": "3.8.0",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/matteobruni"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/tsparticles"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/matteobruni"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@tsparticles/engine": "3.8.0",
- "@tsparticles/interaction-external-trail": "3.8.0",
- "@tsparticles/plugin-absorbers": "3.8.0",
- "@tsparticles/plugin-emitters": "3.8.0",
- "@tsparticles/plugin-emitters-shape-circle": "3.8.0",
- "@tsparticles/plugin-emitters-shape-square": "3.8.0",
- "@tsparticles/shape-text": "3.8.0",
- "@tsparticles/slim": "3.8.0",
- "@tsparticles/updater-destroy": "3.8.0",
- "@tsparticles/updater-roll": "3.8.0",
- "@tsparticles/updater-tilt": "3.8.0",
- "@tsparticles/updater-twinkle": "3.8.0",
- "@tsparticles/updater-wobble": "3.8.0"
- }
- },
- "node_modules/type": {
- "version": "2.7.3",
- "license": "ISC"
- },
- "node_modules/typescript": {
- "version": "5.7.3",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/ufo": {
- "version": "1.5.4",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/undici-types": {
- "version": "6.20.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/unplugin": {
- "version": "1.16.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.14.0",
- "webpack-virtual-modules": "^0.6.2"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/unplugin-icons": {
- "version": "0.19.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@antfu/install-pkg": "^0.4.1",
- "@antfu/utils": "^0.7.10",
- "@iconify/utils": "^2.1.29",
- "debug": "^4.3.6",
- "kolorist": "^1.8.0",
- "local-pkg": "^0.5.0",
- "unplugin": "^1.12.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- },
- "peerDependencies": {
- "@svgr/core": ">=7.0.0",
- "@svgx/core": "^1.0.1",
- "@vue/compiler-sfc": "^3.0.2 || ^2.7.0",
- "vue-template-compiler": "^2.6.12",
- "vue-template-es2015-compiler": "^1.9.0"
- },
- "peerDependenciesMeta": {
- "@svgr/core": {
- "optional": true
- },
- "@svgx/core": {
- "optional": true
- },
- "@vue/compiler-sfc": {
- "optional": true
- },
- "vue-template-compiler": {
- "optional": true
- },
- "vue-template-es2015-compiler": {
- "optional": true
- }
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.1.2",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/vite": {
- "version": "5.4.14",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esbuild": "^0.21.3",
- "postcss": "^8.4.43",
- "rollup": "^4.20.0"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^18.0.0 || >=20.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^18.0.0 || >=20.0.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "sass-embedded": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.4.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- }
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-x64": {
- "version": "0.21.5",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/vite/node_modules/esbuild": {
- "version": "0.21.5",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.21.5",
- "@esbuild/android-arm": "0.21.5",
- "@esbuild/android-arm64": "0.21.5",
- "@esbuild/android-x64": "0.21.5",
- "@esbuild/darwin-arm64": "0.21.5",
- "@esbuild/darwin-x64": "0.21.5",
- "@esbuild/freebsd-arm64": "0.21.5",
- "@esbuild/freebsd-x64": "0.21.5",
- "@esbuild/linux-arm": "0.21.5",
- "@esbuild/linux-arm64": "0.21.5",
- "@esbuild/linux-ia32": "0.21.5",
- "@esbuild/linux-loong64": "0.21.5",
- "@esbuild/linux-mips64el": "0.21.5",
- "@esbuild/linux-ppc64": "0.21.5",
- "@esbuild/linux-riscv64": "0.21.5",
- "@esbuild/linux-s390x": "0.21.5",
- "@esbuild/linux-x64": "0.21.5",
- "@esbuild/netbsd-x64": "0.21.5",
- "@esbuild/openbsd-x64": "0.21.5",
- "@esbuild/sunos-x64": "0.21.5",
- "@esbuild/win32-arm64": "0.21.5",
- "@esbuild/win32-ia32": "0.21.5",
- "@esbuild/win32-x64": "0.21.5"
- }
- },
- "node_modules/vitefu": {
- "version": "0.2.5",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/vt-pbf": {
- "version": "3.1.3",
- "license": "MIT",
- "dependencies": {
- "@mapbox/point-geometry": "0.1.0",
- "@mapbox/vector-tile": "^1.3.1",
- "pbf": "^3.2.1"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/webpack-virtual-modules": {
- "version": "0.6.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "node_modules/which": {
- "version": "4.0.0",
- "license": "ISC",
- "dependencies": {
- "isexe": "^3.1.1"
- },
- "bin": {
- "node-which": "bin/which.js"
- },
- "engines": {
- "node": "^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/which-module": {
- "version": "2.0.1",
- "license": "ISC"
- },
- "node_modules/wrap-ansi": {
- "version": "6.2.0",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi-cjs": {
- "name": "wrap-ansi",
- "version": "7.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/y18n": {
- "version": "4.0.3",
- "license": "ISC"
- },
- "node_modules/yallist": {
- "version": "5.0.0",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/yaml": {
- "version": "2.7.0",
- "dev": true,
- "license": "ISC",
- "bin": {
- "yaml": "bin.mjs"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/yargs": {
- "version": "15.4.1",
- "license": "MIT",
- "dependencies": {
- "cliui": "^6.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^4.1.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^4.2.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^18.1.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yargs-parser": {
- "version": "18.1.3",
- "license": "ISC",
- "dependencies": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- },
- "engines": {
- "node": ">=6"
- }
- }
- }
-}
From 69967b759fb37d641080f0e7d298a9d4808f8d20 Mon Sep 17 00:00:00 2001
From: Lars Lehmann
Date: Thu, 23 Jan 2025 21:29:49 +0100
Subject: [PATCH 24/30] fix: Error loading calender when transport has no date
---
frontend/src/routes/collections/[id]/+page.svelte | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte
index 3a4c1f7..dea338f 100644
--- a/frontend/src/routes/collections/[id]/+page.svelte
+++ b/frontend/src/routes/collections/[id]/+page.svelte
@@ -90,12 +90,14 @@
if (transportations) {
dates = dates.concat(
- transportations.map((transportation) => ({
- id: transportation.id,
- start: transportation.date || '', // Ensure it's a string
- end: transportation.end_date || transportation.date || '', // Ensure it's a string
- title: transportation.name + (transportation.type ? ` (${transportation.type})` : '')
- }))
+ transportations
+ .filter((i) => i.date)
+ .map((transportation) => ({
+ id: transportation.id,
+ start: transportation.date || '', // Ensure it's a string
+ end: transportation.end_date || transportation.date || '', // Ensure it's a string
+ title: transportation.name + (transportation.type ? ` (${transportation.type})` : '')
+ }))
);
}
From 8fee537d8b08f5f1a6e08e2f22f48ded1e7af44d Mon Sep 17 00:00:00 2001
From: Lars Lehmann
Date: Thu, 23 Jan 2025 21:56:19 +0100
Subject: [PATCH 25/30] feat: Open collection calendar on start date
---
frontend/src/routes/collections/[id]/+page.svelte | 3 +++
1 file changed, 3 insertions(+)
diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte
index dea338f..c9b4660 100644
--- a/frontend/src/routes/collections/[id]/+page.svelte
+++ b/frontend/src/routes/collections/[id]/+page.svelte
@@ -164,6 +164,9 @@
(new Date(collection.end_date).getTime() - new Date(collection.start_date).getTime()) /
(1000 * 60 * 60 * 24)
) + 1;
+
+ // Update `options.evdateents` when `collection.start_date` changes
+ options = { ...options, date: collection.start_date };
}
if (collection.transportations) {
transportations = collection.transportations;
From abaee8c9c4b78dc1abe3e4fcffbe0fefcb6ca98a Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Thu, 23 Jan 2025 17:48:55 -0500
Subject: [PATCH 26/30] feat: Add attachments array to recommendation object
and update options with collection start date
---
frontend/src/routes/collections/[id]/+page.svelte | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte
index c9b4660..5e3a9c8 100644
--- a/frontend/src/routes/collections/[id]/+page.svelte
+++ b/frontend/src/routes/collections/[id]/+page.svelte
@@ -166,6 +166,7 @@
) + 1;
// Update `options.evdateents` when `collection.start_date` changes
+ // @ts-ignore
options = { ...options, date: collection.start_date };
}
if (collection.transportations) {
@@ -232,7 +233,8 @@
id: '',
name: recomendation.tag,
user_id: ''
- }
+ },
+ attachments: []
};
isAdventureModalOpen = true;
}
From 6a5bfbda2d57709b403e21740cf3ff0745965263 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Thu, 23 Jan 2025 17:51:56 -0500
Subject: [PATCH 27/30] feat: Enhance adventure marker popup with image
carousel and visit details
---
.../src/routes/collections/[id]/+page.svelte | 55 ++++++++++++++++---
1 file changed, 48 insertions(+), 7 deletions(-)
diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte
index ba758e4..6f49525 100644
--- a/frontend/src/routes/collections/[id]/+page.svelte
+++ b/frontend/src/routes/collections/[id]/+page.svelte
@@ -33,6 +33,8 @@
import ChecklistModal from '$lib/components/ChecklistModal.svelte';
import AdventureModal from '$lib/components/AdventureModal.svelte';
import TransportationModal from '$lib/components/TransportationModal.svelte';
+ import CardCarousel from '$lib/components/CardCarousel.svelte';
+ import { goto } from '$app/navigation';
export let data: PageData;
console.log(data);
@@ -840,16 +842,55 @@
>
{#each adventures as adventure}
{#if adventure.longitude && adventure.latitude}
-
+
{adventure.category?.icon}
-
- {adventure.name}
-
- {adventure.category?.display_name + ' ' + adventure.category?.icon}
-
-
+ {#if isPopupOpen}
+ (isPopupOpen = false)}>
+ {#if adventure.images && adventure.images.length > 0}
+
+ {/if}
+ {adventure.name}
+
+ {adventure.is_visited ? $t('adventures.visited') : $t('adventures.planned')}
+
+
+ {adventure.category?.display_name + ' ' + adventure.category?.icon}
+
+ {#if adventure.visits && adventure.visits.length > 0}
+
+ {#each adventure.visits as visit}
+ {visit.start_date
+ ? new Date(visit.start_date).toLocaleDateString(undefined, {
+ timeZone: 'UTC'
+ })
+ : ''}
+ {visit.end_date &&
+ visit.end_date !== '' &&
+ visit.end_date !== visit.start_date
+ ? ' - ' +
+ new Date(visit.end_date).toLocaleDateString(undefined, {
+ timeZone: 'UTC'
+ })
+ : ''}
+
+ {/each}
+
+ {/if}
+ goto(`/adventures/${adventure.id}`)}
+ >{$t('map.view_details')}
+
+ {/if}
{/if}
{/each}
From d326d3832949c968410a89f611d1319580a01692 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sun, 26 Jan 2025 20:06:47 -0500
Subject: [PATCH 28/30] feat: Update session cookie domain handling using
publicsuffix2 and psl libraries
---
backend/server/main/settings.py | 17 ++++++++++++++---
backend/server/requirements.txt | 3 ++-
frontend/package.json | 1 +
frontend/pnpm-lock.yaml | 16 ++++++++++++++++
frontend/src/routes/login/+page.server.ts | 23 +++++++++++------------
5 files changed, 44 insertions(+), 16 deletions(-)
diff --git a/backend/server/main/settings.py b/backend/server/main/settings.py
index d8aa026..4471b0d 100644
--- a/backend/server/main/settings.py
+++ b/backend/server/main/settings.py
@@ -14,6 +14,7 @@ from dotenv import load_dotenv
from os import getenv
from pathlib import Path
from urllib.parse import urlparse
+from publicsuffix2 import get_sld
# Load environment variables from .env file
load_dotenv()
@@ -132,16 +133,26 @@ SESSION_COOKIE_SAMESITE = None
SESSION_COOKIE_SECURE = FRONTEND_URL.startswith('https')
+# Parse the FRONTEND_URL
parsed_url = urlparse(FRONTEND_URL)
hostname = parsed_url.hostname
+
+# Check if the hostname is an IP address
is_ip_address = hostname.replace('.', '').isdigit()
+
if is_ip_address:
# Do not set a domain for IP addresses
SESSION_COOKIE_DOMAIN = None
else:
- # Calculate the cookie domain for valid domain names
- domain_parts = hostname.split('.')
- SESSION_COOKIE_DOMAIN = '.' + '.'.join(domain_parts[-2:]) if len(domain_parts) > 1 else hostname
+ # Use publicsuffix2 to calculate the correct cookie domain
+ cookie_domain = get_sld(hostname)
+ if cookie_domain:
+ SESSION_COOKIE_DOMAIN = f".{cookie_domain}"
+ else:
+ # Fallback to the hostname if parsing fails
+ SESSION_COOKIE_DOMAIN = hostname
+
+print("SESSION_COOKIE_DOMAIN:", SESSION_COOKIE_DOMAIN)
# Static files (CSS, JavaScript, Images)
diff --git a/backend/server/requirements.txt b/backend/server/requirements.txt
index 80ba65b..dcd0125 100644
--- a/backend/server/requirements.txt
+++ b/backend/server/requirements.txt
@@ -20,4 +20,5 @@ django-ical==1.9.2
icalendar==6.1.0
ijson==3.3.0
tqdm==4.67.1
-overpy==0.7
\ No newline at end of file
+overpy==0.7
+publicsuffix2==2.20191221
\ No newline at end of file
diff --git a/frontend/package.json b/frontend/package.json
index fcf148c..b80fe8d 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -44,6 +44,7 @@
"emoji-picker-element": "^1.26.0",
"gsap": "^3.12.7",
"marked": "^15.0.4",
+ "psl": "^1.15.0",
"qrcode": "^1.5.4",
"svelte-i18n": "^4.0.1",
"svelte-maplibre": "^0.9.8",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 546738e..ea075fa 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -23,6 +23,9 @@ importers:
marked:
specifier: ^15.0.4
version: 15.0.4
+ psl:
+ specifier: ^1.15.0
+ version: 1.15.0
qrcode:
specifier: ^1.5.4
version: 1.5.4
@@ -1913,6 +1916,13 @@ packages:
protocol-buffers-schema@3.6.0:
resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==}
+ psl@1.15.0:
+ resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
qrcode@1.5.4:
resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
engines: {node: '>=10.13.0'}
@@ -4154,6 +4164,12 @@ snapshots:
protocol-buffers-schema@3.6.0: {}
+ psl@1.15.0:
+ dependencies:
+ punycode: 2.3.1
+
+ punycode@2.3.1: {}
+
qrcode@1.5.4:
dependencies:
dijkstrajs: 1.0.3
diff --git a/frontend/src/routes/login/+page.server.ts b/frontend/src/routes/login/+page.server.ts
index b2571a1..f952225 100644
--- a/frontend/src/routes/login/+page.server.ts
+++ b/frontend/src/routes/login/+page.server.ts
@@ -1,5 +1,6 @@
import { fail, redirect, type RequestEvent } from '@sveltejs/kit';
-
+// @ts-ignore
+import psl from 'psl';
import type { Actions, PageServerLoad, RouteParams } from './$types';
import { getRandomBackground, getRandomQuote } from '$lib';
import { fetchCSRFToken } from '$lib/index.server';
@@ -105,7 +106,7 @@ export const actions: Actions = {
}
};
-function handleSuccessfulLogin(event: RequestEvent, response: Response) {
+function handleSuccessfulLogin(event: RequestEvent, response: Response) {
const setCookieHeader = response.headers.get('Set-Cookie');
if (setCookieHeader) {
const sessionIdRegex = /sessionid=([^;]+).*?expires=([^;]+)/;
@@ -113,24 +114,22 @@ function handleSuccessfulLogin(event: RequestEvent, response: Response) {
if (match) {
const [, sessionId, expiryString] = match;
- // Get the proper cookie domain
+ // Get the proper cookie domain using psl
const hostname = event.url.hostname;
- const domainParts = hostname.split('.');
- let cookieDomain: string | undefined = undefined;
+ let cookieDomain;
// Check if hostname is an IP address
const isIPAddress = /^\d{1,3}(\.\d{1,3}){3}$/.test(hostname);
if (!isIPAddress) {
- if (domainParts.length > 2) {
- // For subdomains like app.mydomain.com -> .mydomain.com
- cookieDomain = '.' + domainParts.slice(-2).join('.');
- } else if (domainParts.length === 2) {
- // For root domains like mydomain.com -> .mydomain.com
- cookieDomain = '.' + hostname;
+ const parsed = psl.parse(hostname);
+
+ if (parsed && parsed.domain) {
+ // Use the parsed domain (e.g., mydomain.com)
+ cookieDomain = `.${parsed.domain}`;
}
}
- // Do not set a domain for IP addresses or single-part hostnames
+ // Do not set a domain for IP addresses or invalid hostnames
console.log('Setting sessionid cookie with domain:', cookieDomain);
From f5dc0ceb0a203693d62ec35df503361f13ca89ec Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Sun, 26 Jan 2025 20:18:50 -0500
Subject: [PATCH 29/30] feat: Refactor session cookie domain handling to use
psl for improved domain parsing
---
backend/server/main/settings.py | 3 ---
frontend/src/routes/+page.server.ts | 22 +++++++++++-----------
frontend/src/routes/login/+page.server.ts | 2 --
3 files changed, 11 insertions(+), 16 deletions(-)
diff --git a/backend/server/main/settings.py b/backend/server/main/settings.py
index 4471b0d..063bf35 100644
--- a/backend/server/main/settings.py
+++ b/backend/server/main/settings.py
@@ -152,9 +152,6 @@ else:
# Fallback to the hostname if parsing fails
SESSION_COOKIE_DOMAIN = hostname
-print("SESSION_COOKIE_DOMAIN:", SESSION_COOKIE_DOMAIN)
-
-
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.7/howto/static-files/
diff --git a/frontend/src/routes/+page.server.ts b/frontend/src/routes/+page.server.ts
index 7855cd8..b8c71b5 100644
--- a/frontend/src/routes/+page.server.ts
+++ b/frontend/src/routes/+page.server.ts
@@ -1,5 +1,7 @@
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
import { redirect, type Actions } from '@sveltejs/kit';
+// @ts-ignore
+import psl from 'psl';
import { themes } from '$lib';
import { fetchCSRFToken } from '$lib/index.server';
import type { PageServerLoad } from './$types';
@@ -43,23 +45,21 @@ export const actions: Actions = {
credentials: 'include'
});
- // Determine the proper cookie domain
+ // Get the proper cookie domain using psl
const hostname = event.url.hostname;
- const domainParts = hostname.split('.');
+ let cookieDomain;
+
+ // Check if hostname is an IP address
const isIPAddress = /^\d{1,3}(\.\d{1,3}){3}$/.test(hostname);
- let cookieDomain: string | undefined = undefined;
if (!isIPAddress) {
- // Handle domain names
- if (domainParts.length > 2) {
- // For subdomains like app.mydomain.com -> .mydomain.com
- cookieDomain = '.' + domainParts.slice(-2).join('.');
- } else if (domainParts.length === 2) {
- // For root domains like mydomain.com -> .mydomain.com
- cookieDomain = '.' + hostname;
+ const parsed = psl.parse(hostname);
+
+ if (parsed && parsed.domain) {
+ // Use the parsed domain (e.g., mydomain.com)
+ cookieDomain = `.${parsed.domain}`;
}
}
- // No domain is set for IP addresses or single-part hostnames like "localhost"
// Delete the session cookie
event.cookies.delete('sessionid', {
diff --git a/frontend/src/routes/login/+page.server.ts b/frontend/src/routes/login/+page.server.ts
index f952225..68dcd88 100644
--- a/frontend/src/routes/login/+page.server.ts
+++ b/frontend/src/routes/login/+page.server.ts
@@ -131,8 +131,6 @@ function handleSuccessfulLogin(event: RequestEvent, respo
}
// Do not set a domain for IP addresses or invalid hostnames
- console.log('Setting sessionid cookie with domain:', cookieDomain);
-
event.cookies.set('sessionid', sessionId, {
path: '/',
httpOnly: true,
From 3468e82b043c3da238cca48904295cb286f09568 Mon Sep 17 00:00:00 2001
From: Sean Morley
Date: Mon, 27 Jan 2025 09:23:48 -0500
Subject: [PATCH 30/30] feat: Sanitize FRONTEND_URL by removing quotes for
improved URL parsing
---
backend/server/main/settings.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/backend/server/main/settings.py b/backend/server/main/settings.py
index 063bf35..c83c711 100644
--- a/backend/server/main/settings.py
+++ b/backend/server/main/settings.py
@@ -127,13 +127,16 @@ USE_L10N = True
USE_TZ = True
-FRONTEND_URL = getenv('FRONTEND_URL', 'http://localhost:3000')
+unParsedFrontenedUrl = getenv('FRONTEND_URL', 'http://localhost:3000')
+FRONTEND_URL = unParsedFrontenedUrl.replace("'", "").replace('"', '')
SESSION_COOKIE_SAMESITE = None
SESSION_COOKIE_SECURE = FRONTEND_URL.startswith('https')
# Parse the FRONTEND_URL
+# Remove and ' from the URL
+
parsed_url = urlparse(FRONTEND_URL)
hostname = parsed_url.hostname