From 0d9d5687869f7963a892f01db41ca9eab0d83633 Mon Sep 17 00:00:00 2001 From: Rodrigo_R Date: Sun, 12 Nov 2023 23:31:20 -0300 Subject: [PATCH] Inicializar la rama developyo con mis archivos locales --- backend/app/__init__.py | 0 .../app/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 184 bytes backend/app/__pycache__/urls.cpython-311.pyc | Bin 0 -> 363 bytes backend/app/__pycache__/views.cpython-311.pyc | Bin 0 -> 1810 bytes backend/app/admin.py | 3 + backend/app/apps.py | 6 + backend/app/migrations/__init__.py | 0 backend/app/models.py | 3 + backend/app/templates/app/error.html | 11 + backend/app/templates/app/paradero_info.html | 12 + backend/app/tests.py | 3 + backend/app/urls.py | 7 + backend/app/views.py | 52 + backend/db.sqlite3 | Bin 0 -> 131072 bytes backend/manage.py | 22 + backend/project/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 189 bytes .../__pycache__/settings.cpython-311.pyc | Bin 0 -> 2742 bytes .../project/__pycache__/urls.cpython-311.pyc | Bin 0 -> 1135 bytes .../project/__pycache__/wsgi.cpython-311.pyc | Bin 0 -> 733 bytes backend/project/asgi.py | 16 + backend/project/settings.py | 134 +++ backend/project/urls.py | 23 + backend/project/wsgi.py | 16 + backend/requirements.txt | 3 + docker-compose.yml | 49 + frontend/.gitignore | 24 + frontend/.vscode/extensions.json | 3 + frontend/README.md | 47 + frontend/index.html | 13 + frontend/jsconfig.json | 32 + frontend/package-lock.json | 931 ++++++++++++++++++ frontend/package.json | 19 + frontend/public/vite.svg | 1 + frontend/src/App.svelte | 39 + frontend/src/app.css | 80 ++ frontend/src/assets/S.png | Bin 0 -> 12498 bytes frontend/src/assets/descarga.jpg | Bin 0 -> 4236 bytes ...rte-publico-servicio-bus-bus-thumbnail.png | Bin 0 -> 3793 bytes .../gratis-png-simbolo-del-bus-bus-s.png | Bin 0 -> 8078 bytes frontend/src/assets/svelte.svg | 1 + frontend/src/assets/zyro-image.png | Bin 0 -> 8121 bytes frontend/src/lib/Counter.svelte | 10 + frontend/src/main.js | 8 + frontend/src/routes/ParaderoInfo.svelte | 250 +++++ frontend/src/routes/index.svelte | 11 + frontend/src/routes/prueba.html | 0 frontend/src/services/config.js | 2 + frontend/src/services/getinfodevice.js | 9 + frontend/src/vite-env.d.ts | 2 + frontend/svelte.config.js | 7 + frontend/vite.config.js | 7 + 52 files changed, 1856 insertions(+) create mode 100644 backend/app/__init__.py create mode 100644 backend/app/__pycache__/__init__.cpython-311.pyc create mode 100644 backend/app/__pycache__/urls.cpython-311.pyc create mode 100644 backend/app/__pycache__/views.cpython-311.pyc create mode 100644 backend/app/admin.py create mode 100644 backend/app/apps.py create mode 100644 backend/app/migrations/__init__.py create mode 100644 backend/app/models.py create mode 100644 backend/app/templates/app/error.html create mode 100644 backend/app/templates/app/paradero_info.html create mode 100644 backend/app/tests.py create mode 100644 backend/app/urls.py create mode 100644 backend/app/views.py create mode 100644 backend/db.sqlite3 create mode 100644 backend/manage.py create mode 100644 backend/project/__init__.py create mode 100644 backend/project/__pycache__/__init__.cpython-311.pyc create mode 100644 backend/project/__pycache__/settings.cpython-311.pyc create mode 100644 backend/project/__pycache__/urls.cpython-311.pyc create mode 100644 backend/project/__pycache__/wsgi.cpython-311.pyc create mode 100644 backend/project/asgi.py create mode 100644 backend/project/settings.py create mode 100644 backend/project/urls.py create mode 100644 backend/project/wsgi.py create mode 100644 backend/requirements.txt create mode 100644 docker-compose.yml create mode 100644 frontend/.gitignore create mode 100644 frontend/.vscode/extensions.json create mode 100644 frontend/README.md create mode 100644 frontend/index.html create mode 100644 frontend/jsconfig.json create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/vite.svg create mode 100644 frontend/src/App.svelte create mode 100644 frontend/src/app.css create mode 100644 frontend/src/assets/S.png create mode 100644 frontend/src/assets/descarga.jpg create mode 100644 frontend/src/assets/gratis-png-aeropuerto-bus-tren-parada-bus-transporte-publico-servicio-bus-bus-thumbnail.png create mode 100644 frontend/src/assets/gratis-png-simbolo-del-bus-bus-s.png create mode 100644 frontend/src/assets/svelte.svg create mode 100644 frontend/src/assets/zyro-image.png create mode 100644 frontend/src/lib/Counter.svelte create mode 100644 frontend/src/main.js create mode 100644 frontend/src/routes/ParaderoInfo.svelte create mode 100644 frontend/src/routes/index.svelte create mode 100644 frontend/src/routes/prueba.html create mode 100644 frontend/src/services/config.js create mode 100644 frontend/src/services/getinfodevice.js create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/svelte.config.js create mode 100644 frontend/vite.config.js diff --git a/backend/app/__init__.py b/backend/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/__pycache__/__init__.cpython-311.pyc b/backend/app/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68e66c0e8f1e8bdfb2176ab1a6b1df00c84c6f56 GIT binary patch literal 184 zcmZ3^%ge<81TQNrQbF`%5CH>>P{wCAAY(d13PUi1CZpdPO4oIE6{9^?Zx~+;sY}yBjX1K7*WIw6axTAyfAbC literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/urls.cpython-311.pyc b/backend/app/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..980606861fa8e8dccce1246262103bb7c1015359 GIT binary patch literal 363 zcmZ3^%ge<81nGrNsSAMgV<3hDRw(PU8;~)bA%!7@F^3_SF^Z9qA%!W0Ifp5iIf|K) zfr%lNF@+_SIg16RGlg{x+cIVbhSfj}0qKlUtSRil44ND-K?0hLw^#}iOEO+ELO85t znW^Q)ReS}BMTse?MfvfWd1?9jw|G(bAWeCRxv74dY`3^mvJ&&s^Yu!La*B&Uw%lSU z0y(#c4aDXK3ImNVNiE7NUdiwoD8%qfRKK7ozcMwsBws(Vpgx-^v54i2gtFr_J^_#!r%slBqKRcCe` zY<7tbJ-8*%HVxR&6m)W3>{~9m_0UU?QV>+^$xw30O<;1#sc%-++Ddxp+ugTsX5YN` z=I!^*Z}Ipr0$KlXp8TvJ^ba5OMLaSNuYj?IFv3C^RfHu$;I>#6E7Fn_+EQ6wlCk_P zT2inATE)^Wlu@7a02v`rDXC&Y!HRvx?CKYU)$A%Gi^Zb^;Y$WB!E?9^3bF}4I9Qgg&7vMYe}LVPD>XI`{guB46~xQZ&NKYG~7pCpLKW*JKA~_M+Jaui`bq>JH@G zi}L!C2m8Ya_NXmxWL6xf#;)aZ4mGQ=GwP7+%0_n8rOc+;VmW8lteojOE4e^-nQKzZ zelH_(o6xFRA%R{q8M|v!3=NV?(4gmkK?#B4*sG+PQ39QkZ(PD07RWW5Il%~XOvhz~ zq76+Q;;zy%aWZnC^DG6ImV=?t!lq;L)xCDp5pZREgK3bLXLB`bualxxp7rw7T2PI98FNN=cJ1ggI9LPv?Q`~LPSysz&7sP-aY`KqUuqFi_=0-xGYkE0x0gSFt{ z@#queHKGCXl))VV_(pu~qz8_9nkC@){;5Ga07Q+&K(z42C;tbg*aECD%dysMmIELx zRKK?8$(mIpxgb6V=(4G`VLFyw-O#QRlM%I@hPb9NZpFDe#T6$L<^LEwwIkLABNi_71Bbf{ zG+;ER8BKv}Aak10QEtY=tc40;%v>gn(}r`63q2h=^aB;b+TVt`bMUY~KmoT##~;44 zm3xqDOt(fawns14Z$68?*@~swu~hv=S4GC>LOp+=pKFd^YP=5$?ye*nYCYc_MoO|X zKHW)80WHsRT7r_4m{^~G5$kdD_U_duTGNcFTp2Ha#jG|ZP kpsD8I-9gjM!MlTudU$n*V?wfvA~lf`t_xlC-#RSdUuC1fM*si- literal 0 HcmV?d00001 diff --git a/backend/app/admin.py b/backend/app/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/backend/app/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/backend/app/apps.py b/backend/app/apps.py new file mode 100644 index 0000000..f855d4c --- /dev/null +++ b/backend/app/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class TransportAppConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'app' diff --git a/backend/app/migrations/__init__.py b/backend/app/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/models.py b/backend/app/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/backend/app/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/backend/app/templates/app/error.html b/backend/app/templates/app/error.html new file mode 100644 index 0000000..b899299 --- /dev/null +++ b/backend/app/templates/app/error.html @@ -0,0 +1,11 @@ + + + + + Error + + +

Error

+

{{ error_message }}

+ + diff --git a/backend/app/templates/app/paradero_info.html b/backend/app/templates/app/paradero_info.html new file mode 100644 index 0000000..15f0f3e --- /dev/null +++ b/backend/app/templates/app/paradero_info.html @@ -0,0 +1,12 @@ + + + + + Información del Paradero + + +

Información del Paradero

+

Detalle del paradero:

+
{{ data }}
+ + diff --git a/backend/app/tests.py b/backend/app/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/backend/app/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/app/urls.py b/backend/app/urls.py new file mode 100644 index 0000000..c646de2 --- /dev/null +++ b/backend/app/urls.py @@ -0,0 +1,7 @@ +# app/urls.py +from django.urls import path +from . import views + +urlpatterns = [ + path('paradero_info/', views.paradero_info, name='paradero_info'), +] diff --git a/backend/app/views.py b/backend/app/views.py new file mode 100644 index 0000000..7b27c91 --- /dev/null +++ b/backend/app/views.py @@ -0,0 +1,52 @@ +from django.shortcuts import render +from django.http import JsonResponse +import requests + +# app/views.py + + +def get_auth_token(): + auth_url = "https://transporte.hz.kursor.cl/api/auth/" + auth_data = { + "username": "usuario1", + "password": "usuario1" + } + response = requests.post(auth_url, json=auth_data) + + if response.status_code == 200: + token = response.json().get('token') + return token + else: + return None + + +def paradero_info(request): + id_paradero = request.GET.get('id') + + token = get_auth_token() + + # Realiza una solicitud a la API GetInfoDevice para obtener la información + api_url = "https://transporte.hz.kursor.cl/api/dispositivos/getInfoDevice/" + headers = { + 'Authorization': f'Bearer {token}' + } + + data = { + "GetInfoDevice": { + "idDispositivo": id_paradero, + "KeyAuthorizacion": "token" + } +} + response = requests.post(api_url, json=data,headers=headers) + + if response.status_code == 200: + + # Procesa la respuesta de la API + data = response.json()["GetInfoDeviceResponse"] + + return JsonResponse(data) + else: + error_message = "No se pudo obtener información del paradero." + # Devuelve un mensaje de error en formato JSON + return JsonResponse({'error': error_message}, status=400) + diff --git a/backend/db.sqlite3 b/backend/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..4de5b78c0db0df5613d9245106d2f204a9ca0811 GIT binary patch literal 131072 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 literal 0 HcmV?d00001 diff --git a/backend/project/__pycache__/urls.cpython-311.pyc b/backend/project/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58f6ad4b5745913e2887328f86619871286eb80c GIT binary patch literal 1135 zcmb7Dzi-n(6h1q4lDZ0Ap$ms9S* znw-6Z$tOfn4^e}fv5}ZP)6nxq+(@jRmDoMoKqg`~wU{|>)&%340UeqMeS>=%CDMk` zqRm4C-oQPLUvWdT*QTu($ZM1L@Uipi`4b%SbPx@5K~%(3Jm3Onf{$6K>Zk8GFGmb- z zN-;@slw@3}F2)1F6P)byNtRW~smv0;Ug32Ix`CMv;ZtaKwCuVoRbL~Xuoaw=gxzxW z-1VIMF_Ch08ycfCtbbF%)rbi##4i=savlNK|ESS;pUA!@S@wQYw3&u+PNQ@PCY1Gb zYkGxie>O{FFi3&r(O9w2E^ zL+?<}C~QKLDD}*uRpAOtTff^Z^TBRM0)Su-n!SYHd%wxuVtY!w%~Aiwl)# z=v9emTfosn#r#Ys!h(#jb=s1VVuhtSiusu}|BBAwH9Ef(z*gLW6TtOEABA%B`Pt5S z`)0yv9<$qG0g(EXNd?2CVHn25TrjK&(gQ}ul_P{_uTymO=ug+AiR`((2Olneys_Wi szjJIYomfk!RvS{658MOy^R?r})sw~5W6M9W{E6LIF!$#5PjsO0PiRO|!Tn@hu2gJ!k&Vjyajse$=RlXN_{i)-pqUR-tRXbU*_i>F!Fu>8Ga)Gzl+6G zN>`Kfo|$|C4o%>MTQO-8W9`^V?50fsNq@Q%KF>^(uUlT?GshOdi5U|iU;*04W^pog zL35T{4XDl@{&LJGyCR8djjX|2pK6W&{vaaLQHO2i@DpXYWkWO-0 z9J3EGQl==QiR8O6K8kUGF&(fhx(o@HAgAp%OVc>&Fda$JZku|q4PYWOq>(V#$z^~_ zVTwnJcB2>{QibUBv`*Ek=W*FlF7GoD$|xU0+UWBVq>qvyETF%Qs zVAupfZb_Bjop5qH<|uA~kl6+^FQXVlnH0HW5;=C+ZmjdUYv5nuydZb6@oKfTqcBsg zw~}X3C|fBDBf$*e;$m7isr=7X0K4hI#jWR)M|hD{OmXwmK)p9=Y!gDpR+*H>P^f!A zoTJ-C8^M#|zkLMON9QLj{D6hwqC0%Nc?$j+_(SkVm8D^2>9n$ZR#`rpD_VBP6#onI CrQZbr literal 0 HcmV?d00001 diff --git a/backend/project/asgi.py b/backend/project/asgi.py new file mode 100644 index 0000000..3bfb994 --- /dev/null +++ b/backend/project/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for transporte_project project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'transporte_project.settings') + +application = get_asgi_application() diff --git a/backend/project/settings.py b/backend/project/settings.py new file mode 100644 index 0000000..6886828 --- /dev/null +++ b/backend/project/settings.py @@ -0,0 +1,134 @@ +""" +Django settings for project project. + +Generated by 'django-admin startproject' using Django 4.2.6. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.2/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-r=1wxol#v6tkxk_(rr1@4)!0x&0^!*r-ulesdw^miid*b$btx2' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'corsheaders', + 'django.contrib.messages', + 'django.contrib.staticfiles', + +] + +MIDDLEWARE = [ + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'project.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ BASE_DIR, 'app/templates'], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'project.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.2/howto/static-files/ + +CORS_ALLOWED_ORIGINS = [ + "http://localhost:3000", + # Agrega otros dominios permitidos aquí si es necesario +] + +CORS_ALLOW_CREDENTIALS = True + + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/backend/project/urls.py b/backend/project/urls.py new file mode 100644 index 0000000..d8e07f7 --- /dev/null +++ b/backend/project/urls.py @@ -0,0 +1,23 @@ +""" +URL configuration for project project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import include, path + +urlpatterns = [ + path('admin/', admin.site.urls), + path('rutaParadero/', include('app.urls')), +] diff --git a/backend/project/wsgi.py b/backend/project/wsgi.py new file mode 100644 index 0000000..bd0dab5 --- /dev/null +++ b/backend/project/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for transporte_project project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'transporte_project.settings') + +application = get_wsgi_application() diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..e4c103a --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,3 @@ +django +requests +django-cors-headers \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..963d9e7 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,49 @@ +version: '3' +name: 'info-paradero' + +services: + + backend: + image: python:3.11-alpine + environment: + - PORT=4000 + - DBNAME=/proyecto/db.sqlite3 + ports: + - 4000:4000 + working_dir: /proyecto + volumes: + - ./backend:/proyecto + - venv:/root/venv + command: sh -c " + [ -d /root/venv/bin ] || ( \ + python -m venv /root/venv/ \ + && . /root/venv/bin/activate \ + && pip install -r requirements.txt \ + ) ; + + . /root/venv/bin/activate ; + + cd /proyecto ; + [ -d project ] || django-admin startproject project ; + [ -f .env ] || ( [ -f .env.develop ] && cp .env.develop .env ) ; + chmod -R o+w . ; + python manage.py runserver 0.0.0.0:$$PORT + " + + frontend: + image: node:18-alpine + volumes: + - ./frontend:/app + environment: + - PORT=3000 + - VITE_BACKEND=http://localhost:4000/rutaParadero + ports: + - 3000:3000 + working_dir: /app + command: sh -c " + [ -d node_modules ] || (npm install) ; + npm run dev + " + +volumes: + venv: \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/.vscode/extensions.json b/frontend/.vscode/extensions.json new file mode 100644 index 0000000..bdef820 --- /dev/null +++ b/frontend/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["svelte.svelte-vscode"] +} diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..382941e --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,47 @@ +# Svelte + Vite + +This template should help get you started developing with Svelte in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Need an official Svelte framework? + +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. + +## Technical considerations + +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + +This template contains as little as possible to get started with Vite + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why include `.vscode/extensions.json`?** + +Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. + +**Why enable `checkJs` in the JS template?** + +It is likely that most cases of changing variable types in runtime are likely to be accidental, rather than deliberate. This provides advanced typechecking out of the box. Should you like to take advantage of the dynamically-typed nature of JavaScript, it is trivial to change the configuration. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/sveltejs/svelte-hmr/tree/master/packages/svelte-hmr#preservation-of-local-state). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```js +// store.js +// An extremely simple external store +import { writable } from 'svelte/store' +export default writable(0) +``` diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..feaf27c --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Svelte + + +

+ + + diff --git a/frontend/jsconfig.json b/frontend/jsconfig.json new file mode 100644 index 0000000..5696a2d --- /dev/null +++ b/frontend/jsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "moduleResolution": "bundler", + "target": "ESNext", + "module": "ESNext", + /** + * svelte-preprocess cannot figure out whether you have + * a value or a type, so tell TypeScript to enforce using + * `import type` instead of `import` for Types. + */ + "verbatimModuleSyntax": true, + "isolatedModules": true, + "resolveJsonModule": true, + /** + * To have warnings / errors of the Svelte compiler at the + * correct position, enable source maps by default. + */ + "sourceMap": true, + "esModuleInterop": true, + "skipLibCheck": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable this if you'd like to use dynamic types. + */ + "checkJs": true + }, + /** + * Use global.d.ts instead of compilerOptions.types + * to avoid limiting type declarations. + */ + "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..8adb010 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,931 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "svelte-navigator": "^3.2.2" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.4.2", + "svelte": "^4.0.5", + "vite": "^4.4.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.6.tgz", + "integrity": "sha512-zO79p0+DZnXPnF0ltIigWDx/ux7Ni+HRaFOw720Qeivc1azFUrJxTl0OryXVibYNx1hCboGia1NRV3x8RNv4cA==", + "dev": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.3", + "svelte-hmr": "^0.15.3", + "vitefu": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.54.0 || ^4.0.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", + "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.2.0", + "svelte": "^3.54.0 || ^4.0.0", + "vite": "^4.0.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", + "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "dev": true, + "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/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "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/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", + "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.2.tgz", + "integrity": "sha512-My2tytF2e2NnHSpn2M7/3VdXT4JdTglYVUuSuK/mXL2XtulPYbeBfl8Dm1QiaKRn0zoULRnL+EtfZHHP0k4H3A==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^3.2.1", + "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-hmr": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", + "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.19.0 || ^4.0.0" + } + }, + "node_modules/svelte-navigator": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/svelte-navigator/-/svelte-navigator-3.2.2.tgz", + "integrity": "sha512-Xio4ohLUG1nQJ+ENNbLphXXu9L189fnI1WGg+2Q3CIMPe8Jm2ipytKQthdBs8t0mN7p3Eb03SE9hq0xZAqwQNQ==", + "hasInstallScript": true, + "dependencies": { + "svelte2tsx": "^0.1.151" + }, + "peerDependencies": { + "svelte": "3.x" + } + }, + "node_modules/svelte2tsx": { + "version": "0.1.193", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.1.193.tgz", + "integrity": "sha512-vzy4YQNYDnoqp2iZPnJy7kpPAY6y121L0HKrSBjU/IWW7DQ6T7RMJed2VVHFmVYm0zAGYMDl9urPc6R4DDUyhg==", + "dependencies": { + "dedent-js": "^1.0.1", + "pascal-case": "^3.1.1" + }, + "peerDependencies": { + "svelte": "^3.24", + "typescript": "^4.1.2" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..469b44e --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,19 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --host --port=$PORT", + "build": "vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.4.2", + "svelte": "^4.0.5", + "vite": "^4.4.5" + }, + "dependencies": { + "svelte-navigator": "^3.2.2" + } +} diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte new file mode 100644 index 0000000..fa78a69 --- /dev/null +++ b/frontend/src/App.svelte @@ -0,0 +1,39 @@ + + + + + +
+ + + +
+ + + + + + + diff --git a/frontend/src/app.css b/frontend/src/app.css new file mode 100644 index 0000000..b87aec7 --- /dev/null +++ b/frontend/src/app.css @@ -0,0 +1,80 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +.card { + padding: 2em; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/frontend/src/assets/S.png b/frontend/src/assets/S.png new file mode 100644 index 0000000000000000000000000000000000000000..487b45a78ebe0414910efbd72d96a429cecae745 GIT binary patch literal 12498 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/descarga.jpg b/frontend/src/assets/descarga.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b9661afb34a614d162fb93cfb966caced768c47 GIT binary patch literal 4236 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/gratis-png-aeropuerto-bus-tren-parada-bus-transporte-publico-servicio-bus-bus-thumbnail.png b/frontend/src/assets/gratis-png-aeropuerto-bus-tren-parada-bus-transporte-publico-servicio-bus-bus-thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..c963287cc587b5e662e99494daa4877e0ca30814 GIT binary patch literal 3793 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 Hu0mjf3c1I@ literal 0 HcmV?d00001 diff --git a/frontend/src/assets/gratis-png-simbolo-del-bus-bus-s.png b/frontend/src/assets/gratis-png-simbolo-del-bus-bus-s.png new file mode 100644 index 0000000000000000000000000000000000000000..356cb4f389aad77a8a23f7def97e8f1c864e8158 GIT binary patch literal 8078 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