diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..c80c207
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,27 @@
+FROM golang:alpine as builder
+
+ARG ACCESS_TOKEN_USR="nothing"
+ARG ACCESS_TOKEN_PWD="nothing"
+
+RUN apk add --no-cache ca-certificates tzdata git
+
+WORKDIR /
+
+# Create a netrc file using the credentials specified using --build-arg
+RUN printf "machine git.coopgo.io\n\
+ login ${ACCESS_TOKEN_USR}\n\
+ password ${ACCESS_TOKEN_PWD}\n"\
+ >> ~/.netrc
+RUN chmod 600 ~/.netrc
+
+COPY . .
+
+RUN go mod download && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /server
+
+FROM scratch
+COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
+COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
+COPY --from=builder /server /
+
+EXPOSE 8080
+ENTRYPOINT ["/server"]
diff --git a/themes/spie06/README.md b/themes/spie06/README.md
new file mode 100644
index 0000000..0fb22b2
--- /dev/null
+++ b/themes/spie06/README.md
@@ -0,0 +1,24 @@
+# PARCOURSMOB default template
+
+This theme uses :
+
+- [TailwindCSS](https://tailwindcss.com/) as CSS framework and [Tailwind UI components](https://tailwindui.com/)
+- [AlpineJS](https://alpinejs.dev/) lightweight Javascript framework
+
+## TailwindCSS
+
+Look at the [Tailwind CSS docs](https://tailwindcss.com/docs/installation) to know how to install and use Tailwind.
+
+If you installed the Tailwind CLI, run this command from this repository while developing from the web/ directory.
+
+```
+npx tailwind -i ./assets/css/main.css -o public/css/main.css --watch
+```
+
+## Esbuild
+
+To bundle Javascript with esbuild :
+
+```
+npx esbuild assets/js/main.js --bundle --outfile=public/js/main.js
+```
\ No newline at end of file
diff --git a/themes/spie06/config.yaml b/themes/spie06/config.yaml
new file mode 100644
index 0000000..4481431
--- /dev/null
+++ b/themes/spie06/config.yaml
@@ -0,0 +1,208 @@
+name: PARCOURSMOB
+
+views:
+ generic:
+ files:
+ - web/layouts/layout.html
+ - web/layouts/_partials/mainmenu.html
+ dashboard:
+ files:
+ - web/layouts/dashboard/_partials/agenda-widget.html
+ - web/layouts/dashboard/_partials/beneficiaries-widget.html
+ - web/layouts/dashboard/dashboard.html
+ beneficiaries:
+ list:
+ files:
+ - web/layouts/beneficiaries/list.html
+ create:
+ files:
+ - web/layouts/_partials/address_autocomplete.html
+ - web/layouts/beneficiaries/create.html
+ display:
+ files:
+ - web/layouts/_partials/address_autocomplete.html
+ - web/layouts/vehicles_management/_partials/vehicle-type-select.html
+ - web/layouts/beneficiaries/_partials/beneficiary-vehicles.html
+ - web/layouts/beneficiaries/_partials/beneficiary-notes.html
+ - web/layouts/beneficiaries/_partials/beneficiary-journeys.html
+ - web/layouts/beneficiaries/_partials/beneficiary-events.html
+ - web/layouts/beneficiaries/_partials/beneficiary-files.html
+ - web/layouts/beneficiaries/display.html
+ update:
+ files:
+ - web/layouts/_partials/address_autocomplete.html
+ - web/layouts/beneficiaries/update.html
+
+ vehicles:
+ search:
+ files:
+ - web/layouts/_partials/address_autocomplete.html
+ - web/layouts/vehicles_management/_partials/vehicle-type-select.html
+ - web/layouts/vehicles/search.html
+ booking_display:
+ files:
+ - web/layouts/vehicles/booking-display.html
+ bookings_list:
+ files:
+ - web/layouts/vehicles_management/_partials/bookings-list.html
+ - web/layouts/vehicles/bookings-list.html
+ vehicles_management:
+ overview:
+ files:
+ - web/layouts/vehicles_management/_partials/bookings-list.html
+ - web/layouts/vehicles_management/_partials/vehicles-list.html
+ - web/layouts/vehicles_management/overview.html
+ bookings_list:
+ files:
+ - web/layouts/vehicles_management/_partials/bookings-list.html
+ - web/layouts/vehicles_management/bookings-list.html
+ fleet_add:
+ files:
+ - web/layouts/_partials/address_autocomplete.html
+ - web/layouts/vehicles_management/_partials/vehicle-type-select.html
+ - web/layouts/vehicles_management/fleet-add.html
+ fleet_display:
+ files:
+ - web/layouts/vehicles_management/_partials/calendar.html
+ - web/layouts/vehicles_management/fleet-display.html
+ fleet_update:
+ files:
+ - web/layouts/_partials/address_autocomplete.html
+ - web/layouts/vehicles_management/_partials/vehicle-type-select.html
+ - web/layouts/vehicles_management/fleet-update.html
+ booking_display:
+ files:
+ - web/layouts/vehicles_management/booking-display.html
+ agenda:
+ list:
+ files:
+ - web/layouts/agenda/home.html
+ display_event:
+ files:
+ - web/layouts/agenda/display-event.html
+ create_event:
+ files:
+ - web/layouts/_partials/address_autocomplete.html
+ - web/layouts/agenda/create-event.html
+ directory:
+ home:
+ files:
+ - web/layouts/directory/home.html
+ journeys:
+ search:
+ files:
+ - web/layouts/_partials/address_autocomplete.html
+ - web/layouts/journeys/_partials/journeys-all.html
+ - web/layouts/journeys/_partials/journeys-others.html
+ - web/layouts/journeys/_partials/journeys-carpool.html
+ - web/layouts/journeys/_partials/journeys-public-transit.html
+ - web/layouts/journeys/search.html
+ support:
+ request:
+ files:
+ - web/layouts/support/support.html
+ administration:
+ home:
+ files:
+ - web/layouts/administration/home.html
+ create_group:
+ files:
+ - web/layouts/administration/create_group.html
+ display_group:
+ files:
+ - web/layouts/administration/_partials/groups_admins.html
+ - web/layouts/administration/_partials/group_members.html
+ - web/layouts/administration/display_group.html
+ group:
+ settings:
+ files:
+ - web/layouts/administration/_partials/groups_admins.html
+ - web/layouts/administration/_partials/group_members.html
+ - web/layouts/group/settings.html
+ auth:
+ groups:
+ files:
+ - web/layouts/auth/groups.html
+ lost_password:
+ init:
+ files:
+ - web/layouts/auth/lost-password-init.html
+ recover:
+ form:
+ files:
+ - web/layouts/auth/lost-password-recover.html
+ ko:
+ files:
+ - web/layouts/auth/lost-password-recover-ko.html
+ onboarding:
+ form:
+ files:
+ - web/layouts/auth/onboarding.html
+ ko:
+ files:
+ - web/layouts/auth/onboarding-ko.html
+
+icons:
+ svg:
+ coopgo:parcoursmob/monogram:
+ hero:outline/briefcase:
+ hero:outline/support:
+ hero:outline/calendar:
+ hero:outline/chevron-right:
+ hero:outline/cog:
+ hero:outline/document-arrow-down:
+ hero:outline/document-text:
+ hero:outline/folder-plus:
+ hero:outline/home:
+ hero:outline/map:
+ hero:outline/office-building:
+ hero:outline/paper-clip:
+ hero:outline/plus-circle:
+ hero:outline/shield-check:
+ hero:outline/table-cells:
+ hero:outline/user-group:
+ hero:outline/x:
+ hero:solid/chevron-right:
+ hero:solid/question-mark-icon:
+ hero:solid/search:
+ hero:solid/selector:
+ img:profile-picture-placeholder:
+ tabler-icons:car:
+ tabler-icons:walk:
+ tabler-icons:bus:
+
+emails:
+ onboarding:
+ new_administrator:
+ subject: PARCOURSMOB - Vous avez été invité comme administrateur
+ files:
+ - emails/layout.html
+ - emails/onboarding/new-administrator.html
+ existing_administrator:
+ subject: PARCOURSMOB - Vous avez été invité comme administrateur
+ files:
+ - emails/layout.html
+ - emails/onboarding/existing-administrator.html
+ new_member:
+ subject: PARCOURSMOB - Vous avez été invité à rejoindre une organisation
+ files:
+ - emails/layout.html
+ - emails/onboarding/new-member.html
+ existing_member:
+ subject: PARCOURSMOB - Vous avez été invité à rejoindre une organisation
+ files:
+ - emails/layout.html
+ - emails/onboarding/existing-member.html
+ auth:
+ retrieve_password:
+ subject: PAROURSMOB - Réinitialisez votre mot de passe
+ files:
+ - emails/layout.html
+ - emails/auth/retrieve-password.html
+ support:
+ request:
+ subject: PARCOURMOB - Demande de support
+ files:
+ - emails/layout.html
+ - emails/onboarding/support_emailing.html
+
diff --git a/themes/spie06/emails/auth/retrieve-password.html b/themes/spie06/emails/auth/retrieve-password.html
new file mode 100644
index 0000000..0bc2260
--- /dev/null
+++ b/themes/spie06/emails/auth/retrieve-password.html
@@ -0,0 +1,5 @@
+{{define "content"}}
+
Vous avez été ajouté comme administrateur de l'organisation {{.group}} sur PARCOURSMOB.
+Vous avez été ajouté à l'organisation {{.group}} sur PARCOURSMOB.
+Vous avez été ajouté comme administrateur de l'organisation {{.group}} sur PARCOURSMOB.
+Vous devez créer votre compte pour y accéder.
+Vous avez été ajouté à l'organisation {{.group}} sur PARCOURSMOB.
+Vous devez créer votre compte pour y accéder.
+Aucun covoiturage disponible pour ce trajet.
+{{end}}
+
+{{$first := true}}
+{{range .ViewState.carpools}}
+{{if $first}}
+{{$first = false}}
+
+{{else}}
+
+{{end}}
+
+ {{if .days.monday}}
+
Départ entre {{.outward.monday.mintime}} et {{.outward.monday.maxtime}}
+ {{else if .days.tuesday}}
+
Départ entre {{.outward.tuesday.mintime}} et {{.outward.tuesday.maxtime}}
+ {{else if .days.wednesday}}
+
Départ entre {{.outward.wednesday.mintime}} et {{.outward.wednesday.maxtime}}
+ {{else if .days.thursday}}
+
Départ entre {{.outward.thursday.mintime}} et {{.outward.thursday.maxtime}}
+ {{else if .days.friday}}
+
Départ entre {{.outward.friday.mintime}} et {{.outward.friday.maxtime}}
+ {{else if .days.saturday}}
+
Départ entre {{.outward.saturday.mintime}} et {{.outward.saturday.maxtime}}
+ {{else if .days.sunday}}
+
Départ entre {{.outward.sunday.mintime}} et {{.outward.sunday.maxtime}}
+ {{end}}
+
{{divideFloat64 .duration 60.0 | printf "%.0f"}} Minutes
+
+
+
+ {{.from.address}}, {{.from.city}}
+
+ {{$.IconSet.Icon "hero:outline/chevron-right" "h-3 w-3 stroke-gray-800 m-2"}}
+
+ {{.to.address}}, {{.to.city}}
+
+
+
+
+ Avec
+
+ {{.driver.alias}}
+
+
+ sur l'application
+
+ RIDYGO
+
+
+
+{{end}}
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/journeys/_partials/journeys-others.html b/themes/spie06/web/layouts/journeys/_partials/journeys-others.html
new file mode 100644
index 0000000..39f2176
--- /dev/null
+++ b/themes/spie06/web/layouts/journeys/_partials/journeys-others.html
@@ -0,0 +1,38 @@
+{{define "journeys_others"}}
+
+
+
+
+ {{.IconSet.Icon "tabler-icons:car" "h-6 w-6 inline-flex mr-4"}}
+ {{len .ViewState.vehicles}} véhicules partagés disponibles ce jour là et la semaine suivante
+
+
+
+
+
+
+
+
+ Véhicule
+ Numéro
+ Gestionnaire
+ Lieu
+
+
+
+ {{range .ViewState.vehicles}}
+
+ {{.Data.name}}
+ {{.Data.licence_plate}}
+ COOPGO
+ {{if .Data.address}}{{.Data.address.properties.label}}{{end}}
+
+ {{end}}
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/journeys/_partials/journeys-public-transit.html b/themes/spie06/web/layouts/journeys/_partials/journeys-public-transit.html
new file mode 100644
index 0000000..59bbfab
--- /dev/null
+++ b/themes/spie06/web/layouts/journeys/_partials/journeys-public-transit.html
@@ -0,0 +1,81 @@
+{{define "journeys_public_transit"}}
+
+{{ if eq (len .ViewState.journeys.Journeys) 0}}
+
Aucun transport en commun pour ce trajet.
+{{end}}
+
+{{$first := true}}
+{{range .ViewState.journeys.Journeys}}
+{{if $first}}
+{{$first = false}}
+
+{{else}}
+
+{{end}}
+
+
{{(timeFrom .Departure).Format "15:04"}} - {{(timeFrom .Arrival).Format "15:04"}}
+
{{.Duration.Minutes | printf "%.0f"}} Minutes
+
+
+
+
+ {{$firstwalk := true}}
+ {{range .Sections}}
+ {{if eq .Type "street_network"}}
+
+
+ {{if $firstwalk}}
+ {{$firstwalk = false}}
+
+ {{end}}
+
+
+
+ {{$.IconSet.Icon "tabler-icons:walk" "h-3 w-3 stroke-gray-800"}}
+
+
+
+
+
+
+ {{end}}
+ {{if eq .Type "public_transport"}}
+
+
+
+
+
+
+ {{$.IconSet.Icon "tabler-icons:bus" "h-5 w-5 stroke-white"}}
+
+
+
+
+
+
+
+ {{end}}
+ {{end}}
+
+
+
+{{end}}
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/journeys/search.html b/themes/spie06/web/layouts/journeys/search.html
new file mode 100644
index 0000000..bbe6f8f
--- /dev/null
+++ b/themes/spie06/web/layouts/journeys/search.html
@@ -0,0 +1,120 @@
+{{define "content"}}
+
+
Déplacements
+
+
+
+
+
+
Chercher une solution
+
+
+
+
+ {{if .ViewState.searched}}
+
+
+
+
+
+ Select a tab
+
+ Tous modes
+
+ Covoiturage
+
+ Transports
+
+
+
+ Autres
+
+
+
+
+
+
{{template "journeys_all" .}}
+
{{template "journeys_carpool" .}}
+
{{template "journeys_public_transit" .}}
+
{{template "journeys_others" .}}
+
+
+
+ {{end}}
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/layout.html b/themes/spie06/web/layouts/layout.html
new file mode 100644
index 0000000..557ab71
--- /dev/null
+++ b/themes/spie06/web/layouts/layout.html
@@ -0,0 +1,180 @@
+{{define "main"}}
+
+
+
+
+
PARCOURSMOB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Close sidebar
+ {{ .IconSet.Icon "hero:outline/x" "h-6 w-6" }}
+
+
+
+
+
+
+
+
+
+ {{ template "mainmenu" . }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ template "mainmenu" . }}
+
+
+
+
+
+
+ Open sidebar
+
+
+
+
+
+
+
+
+
+
+ {{ template "content" . }}
+
+
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/support/support.html b/themes/spie06/web/layouts/support/support.html
new file mode 100644
index 0000000..224bd63
--- /dev/null
+++ b/themes/spie06/web/layouts/support/support.html
@@ -0,0 +1,27 @@
+{{define "content"}}
+
+
+
Demande de support technique
+
+
+ Le support technique PARCOURSMOB est ouvert les jours ouvrés de 9h à 18h. Vous pouvez également nous joindre par email à support@parcoursmob.fr , par exemple pour nous envoyez des copies d'écran du problème que vous rencontrez.
+
+
+
+
+ {{end}}
diff --git a/themes/spie06/web/layouts/vehicles/booking-display.html b/themes/spie06/web/layouts/vehicles/booking-display.html
new file mode 100644
index 0000000..21d19c3
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles/booking-display.html
@@ -0,0 +1,201 @@
+{{define "content"}}
+
+
Réservation de véhicule
+
+
+
+
+
+
Bénéficiaire
+
+
+
+
+
+
Nom
+
+ {{.ViewState.beneficiary.Data.first_name}}
+ {{.ViewState.beneficiary.Data.last_name}}
+
+
+
Email
+
+ {{.ViewState.beneficiary.Data.email}}
+
+
+
Téléphone
+
+ {{.ViewState.beneficiary.Data.phone_number}}
+
+ {{if .ViewState.Data.birthdate}}
+
+
Date de naissance
+ {{(timeFrom
+ .ViewState.Data.birthdate).Format
+ "02/01/2006"}}
+
+ {{end}}
+ {{if and .ViewState.Data.gender (ne .ViewState.Data.gender "0")}}
+
+
Date de naissance
+ {{genderISO5218
+ .ViewState.Data.gender}}
+
+ {{end}}
+ {{if .ViewState.Data.address}}
+
+
Adresse
+
+ {{.ViewState.Data.address.properties.label}}
+
+ {{end}}
+
+
+
+
+
+
+
+
+
+
+
+
Réservation
+
Informations utiles sur la réservation.
+
+
+
+
+
+
+
+
+
+
+
+
+
Gestionnaire
+
+ {{.ViewState.group.Data.name}}
+
+
+ {{if .ViewState.booking.Data.booked_by}}
+
+ {{end}}
+
+
Véhicule
+
+ {{.ViewState.vehicle.Data.name}}
+
+
+
Immatriculation
+
+ {{.ViewState.vehicle.Data.licence_plate}}
+
+
+
Type
+
+ Voiture
+
+ {{if .ViewState.vehicle.Data.address}}
+
+
Lieu de récupération
+ {{.ViewState.vehicle.Data.address.properties.label}}
+
+ {{end}}
+
+
Date de récupération
+ {{(timeFrom .ViewState.booking.Startdate).Format
+ "02/01/2006"}}
+
+
+
Date de retour
+ {{(timeFrom .ViewState.booking.Enddate).Format
+ "02/01/2006"}}
+
+
+
Documents
+ {{if eq (len .ViewState.documents) 0}}
+
Aucun document
+ {{end}}
+
+
+ {{if gt (len .ViewState.documents) 0}}
+
+
+
+
+
+ Type
+ Nom du document
+ Ajouté le
+
+ Actions
+
+
+
+
+ {{range .ViewState.documents}}
+
+
+
+ {{index $.ViewState.file_types_map .Metadata.Type}}
+
+
+
+ {{.Metadata.Name}}
+
+ {{.LastModified.Format "02/01/2006"}}
+
+
+ Voir le document
+
+
+
+ {{end}}
+
+
+
+
+
+
+
+ {{end}}
+
+
+
+
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles/bookings-list.html b/themes/spie06/web/layouts/vehicles/bookings-list.html
new file mode 100644
index 0000000..5cc979c
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles/bookings-list.html
@@ -0,0 +1,68 @@
+{{define "content"}}
+
+
Réservations
+
+
+
+
+
+
+
+
+
+
+
+
+ Type
+
+
+ Beneficiaire
+
+
+ Dates
+
+
+ Actions
+
+
+
+
+
+ {{range .ViewState.bookings}}
+
+
+
+ Voiture
+
+
+
+
+
+
+ Du {{(timeFrom .Startdate).Format "02/01/2006"}} au {{(timeFrom .Enddate).Format "02/01/2006"}}
+
+
+ Voir
+
+
+ {{end}}
+
+
+
+
+
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles/search.html b/themes/spie06/web/layouts/vehicles/search.html
new file mode 100644
index 0000000..b9d4845
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles/search.html
@@ -0,0 +1,237 @@
+{{define "content"}}
+
+
Véhicules partagés
+
+
+
+
+
+
+
Chercher un véhicule
+
+
+
+
+
+
Bénéficiaire
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{template "vehicle_type_select" .}}
+
+
+ Chercher
+
+
+
+
+
+
+ {{if .ViewState.searched}}
+
+
Véhicules disponibles
+
+
+
+
+
+
+ Véhicule
+ Numéro
+ Gestionnaire
+ Lieu
+
+ Réserver
+
+
+
+
+ {{range .ViewState.search.vehicles}}
+
+ {{.Data.name}}
+ {{.Data.licence_plate}}
+ COOPGO
+ {{if .Data.address}}{{.Data.address.properties.label}}{{end}}
+
+
+ Réserver pour {{$.ViewState.search.beneficiary.Data.first_name}} {{$.ViewState.search.beneficiary.Data.last_name}}
+
+
+
+
+
+
+
+
+
+
+
+ {{$.IconSet.Icon "hero:outline/folder-plus" "h-6 w-6 text-white"}}
+
+
+
+
Documents demandés
+
+
Ajoutez des documents pour finaliser
+
+
+
+
+ {{range $.ViewState.search.mandatory_documents}}
+ {{$type := .}}
+
+
{{index $.ViewState.search.file_types_map $type}}
+
+ {{range $.ViewState.search.beneficiary_documents}}
+ {{if eq $type .Metadata.Type}}
+ Fichier bénéficiaire : {{.Metadata.Name}}
+ {{end}}
+ {{end}}
+ Ajouter un fichier
+
+
+
+
+
+ {{end}}
+
+ Réserver
+
+
+
+ Annuler
+
+
+
+
+
+
+
+ {{end}}
+
+
+
+
+
+
+ {{end}}
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles_management/_partials/bookings-list.html b/themes/spie06/web/layouts/vehicles_management/_partials/bookings-list.html
new file mode 100644
index 0000000..77a477d
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles_management/_partials/bookings-list.html
@@ -0,0 +1,77 @@
+{{define "bookings_list"}}
+
+
+
+
+
+
+
+
+
+ Statut
+
+
+ Type
+
+
+ Numéro (Immat / Bicycode)
+
+
+ Beneficiaire
+
+
+ Dates
+
+
+ Actions
+
+
+
+
+ {{range .ViewState.bookings}}
+
+
+ {{if eq .Status 1 }}
+
+ A venir
+
+ {{end}}
+ {{if eq .Status 0 }}
+
+ En cours
+
+ {{end}}
+ {{if eq .Status -1 }}
+
+ Terminé
+
+ {{end}}
+
+
+ {{ (index $.ViewState.vehicles_map .Vehicleid).Type }}
+
+
+ {{ (index $.ViewState.vehicles_map .Vehicleid).Data.licence_plate }}
+
+
+
+
+
+ Du {{(timeFrom .Startdate).Format "02/01/2006"}} au {{(timeFrom .Enddate).Format "02/01/2006"}}
+
+
+ Voir
+
+
+ {{end}}
+
+
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles_management/_partials/calendar.html b/themes/spie06/web/layouts/vehicles_management/_partials/calendar.html
new file mode 100644
index 0000000..5a6dbb5
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles_management/_partials/calendar.html
@@ -0,0 +1,259 @@
+{{define "calendar"}}
+
+
Août 2022
+
+ Mois précédent
+
+
+
+
+
+
+ Mois suivant
+
+
+
+
+
+
+
+
L
+
M
+
M
+
J
+
V
+
S
+
D
+
+
+
+
+
+ 1
+
+
+
+
+ 2
+
+
+
+
+ 3
+
+
+
+
+ 4
+
+
+
+
+ 5
+
+
+
+
+ 6
+
+
+
+
+ 7
+
+
+
+
+ 8
+
+
+
+
+ 9
+
+
+
+
+ 10
+
+
+
+
+ 11
+
+
+
+
+ 12
+
+
+
+
+ 13
+
+
+
+
+ 14
+
+
+
+
+ 15
+
+
+
+
+ 16
+
+
+
+
+ 17
+
+
+
+
+ 18
+
+
+
+
+ 19
+
+
+
+
+ 20
+
+
+
+
+ 21
+
+
+
+
+ 22
+
+
+
+
+ 23
+
+
+
+
+ 24
+
+
+
+
+ 25
+
+
+
+
+ 26
+
+
+
+
+ 27
+
+
+
+
+ 28
+
+
+
+
+ 29
+
+
+
+
+ 30
+
+
+
+
+ 31
+
+
+
+
+ 1
+
+
+
+
+ 2
+
+
+
+
+ 3
+
+
+
+
+ 4
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles_management/_partials/vehicle-type-select.html b/themes/spie06/web/layouts/vehicles_management/_partials/vehicle-type-select.html
new file mode 100644
index 0000000..eaadfa0
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles_management/_partials/vehicle-type-select.html
@@ -0,0 +1,105 @@
+{{define "vehicle_type_select"}}
+
+
+
Type de véhicule
+
+
+
+
+ {{$.IconSet.Icon "hero:solid/selector" "h-5 w-5 text-gray-400"}}
+
+
+
+
+
+
+
+ Voiture
+
+
+
+
+
+
+
+
+ Voiture sans permis
+
+
+
+
+
+
+
+
+ Scooter
+
+
+
+
+
+
+
+
+ Trotinette
+
+
+
+
+
+
+
+
+ Vélo électrique
+
+
+
+
+
+
+
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles_management/_partials/vehicles-list.html b/themes/spie06/web/layouts/vehicles_management/_partials/vehicles-list.html
new file mode 100644
index 0000000..c8840ae
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles_management/_partials/vehicles-list.html
@@ -0,0 +1,56 @@
+{{define "vehicles_list"}}
+
+
+
+
+
+
+
+
+
+ Numéro (Immat / Bicycode)
+
+
+ Type
+
+
+ Modèle
+
+
+ Lieu
+
+
+ Actions
+
+
+
+
+ {{range .ViewState.vehicles}}
+
+
+ {{.Data.licence_plate}}
+
+
+ {{if eq .Type "electric_bike"}}Vélo électrique{{else}}Voiture{{end}}
+
+
+ {{.Data.name}}
+
+
+ {{if .Data.address}}{{.Data.address.properties.label}}{{end}}
+
+
+ Voir
+
+
+ {{end}}
+
+
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles_management/booking-display.html b/themes/spie06/web/layouts/vehicles_management/booking-display.html
new file mode 100644
index 0000000..2a767fd
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles_management/booking-display.html
@@ -0,0 +1,276 @@
+{{define "content"}}
+
+
Réservation de véhicule
+
+
+
+
+
+
Bénéficiaire
+
+
+
+
+
+
Nom
+
+ {{.ViewState.beneficiary.Data.first_name}}
+ {{.ViewState.beneficiary.Data.last_name}}
+
+
+
Email
+
+ {{.ViewState.beneficiary.Data.email}}
+
+
+
Téléphone
+
+ {{.ViewState.beneficiary.Data.phone_number}}
+
+ {{if .ViewState.Data.birthdate}}
+
+
Date de naissance
+ {{(timeFrom
+ .ViewState.Data.birthdate).Format
+ "02/01/2006"}}
+
+ {{end}}
+ {{if and .ViewState.Data.gender (ne .ViewState.Data.gender "0")}}
+
+
Date de naissance
+ {{genderISO5218
+ .ViewState.Data.gender}}
+
+ {{end}}
+ {{if .ViewState.Data.address}}
+
+
Adresse
+
+ {{.ViewState.Data.address.properties.label}}
+
+
+ {{end}}
+
+
+
+
+
+
+
+
+
+
+
+
Réservation
+
Informations utiles sur la réservation.
+
+
+ SMS
+ Email
+
+
+
+
+
+
+
+
+
+ {{if .ViewState.booking.Data.booked_by}}
+
+
+ {{end}}
+
+
Véhicule
+
+ {{.ViewState.vehicle.Data.name}}
+
+
+
Immatriculation
+
+ {{.ViewState.vehicle.Data.licence_plate}}
+
+
+
Type
+
+ Voiture
+
+ {{if .ViewState.vehicle.Data.address}}
+
+
Lieu de récupération
+ {{.ViewState.vehicle.Data.address.properties.label}}
+
+ {{end}}
+
+
Date de récupération
+
+
+
{{(timeFrom .ViewState.booking.Startdate).Format "02/01/2006"}}
+
Modifier
+
+
+
+
+
+
+ OK
+
+
+
+
+
+
Date de retour
+
+
+
{{(timeFrom .ViewState.booking.Enddate).Format "02/01/2006"}}
+
Modifier
+
+
+
+
+
+
+ OK
+
+
+
+
+
+
Indisponible à partir du
+
+
+
{{(timeFrom .ViewState.booking.Unavailablefrom).Format "02/01/2006"}}
+
Modifier
+
+
+
+
+
+
+ OK
+
+
+
+
+
+
Sera à nouveau disponible le
+
+
+
{{(timeFrom .ViewState.booking.Unavailableto).Format "02/01/2006"}}
+
Modifier
+
+
+
+
+
+
+ OK
+
+
+
+
+
Documents
+ {{if eq (len .ViewState.documents) 0}}
+
Aucun document
+ {{end}}
+
+
+ {{if gt (len .ViewState.documents) 0}}
+
+
+
+
+
+ Type
+ Nom du document
+ Ajouté le
+
+ Actions
+
+
+
+
+ {{range .ViewState.documents}}
+
+
+
+ {{index $.ViewState.file_types_map .Metadata.Type}}
+
+
+
+ {{.Metadata.Name}}
+
+ {{.LastModified.Format "02/01/2006"}}
+
+
+ Voir le document
+
+
+
+ {{end}}
+
+
+
+
+
+
+
+ {{end}}
+
+
+
+
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles_management/bookings-list.html b/themes/spie06/web/layouts/vehicles_management/bookings-list.html
new file mode 100644
index 0000000..6bd90c0
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles_management/bookings-list.html
@@ -0,0 +1,25 @@
+{{define "content"}}
+
+
Historique des réservations de véhicules
+
+
+
+
+
+{{template "bookings_list" .}}
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles_management/fleet-add.html b/themes/spie06/web/layouts/vehicles_management/fleet-add.html
new file mode 100644
index 0000000..55ae759
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles_management/fleet-add.html
@@ -0,0 +1,106 @@
+{{define "content"}}
+
+
+
+
Ajouter un véhicule
+
+
+
+
+
+
+
+
Identité du véhicule
+
Informations de base sur le véhicule
+
+
+
+
+ Modèle (ou nom donné au
+ véhicule)
+
+
+
+ {{template "vehicle_type_select" .}}
+
+
+ Immatriculation
+
+
+
+
+
+
+
+
+
+
Informations pratiques
+
Informations pratiques pour la réservation
+
+
+ {{ $fieldName := "address" }}
+ {{ template "address_autocomplete" dict "FieldName" $fieldName }}
+
+
+
Informations pratiques pour le bénéficiaire
+
+
+
+
+
+
+
+
+
+
Certains champs de sont pas valides.
+
+ Annuler
+
+
Ajouter
+ le véhicule
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles_management/fleet-display.html b/themes/spie06/web/layouts/vehicles_management/fleet-display.html
new file mode 100644
index 0000000..d786100
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles_management/fleet-display.html
@@ -0,0 +1,90 @@
+{{define "content"}}
+
+
+
+
+
+
{{.ViewState.vehicle.Data.name}}
+
+
+
+
+
+
+
+
+
+
Informations
+
Informations sur le véhicule
+
+
+
+ {{if .ViewState.vehicle.Data.type}}
+
+
Type
+ {{if eq .ViewState.vehicle.Data.type "electric_bike"}}Vélo électrique{{else}}Voiture{{end}}
+
+ {{else}}
+
+
Type
+ Voiture
+
+ {{end}}
+ {{if .ViewState.vehicle.Data.licence_plate}}
+
+
Numéro (Immatriculation, bicycode, ...)
+ {{.ViewState.vehicle.Data.licence_plate}}
+
+ {{end}}
+ {{if .ViewState.vehicle.Data.address}}
+
+
Lieu
+ {{.ViewState.vehicle.Data.address.properties.label}}
+
+ {{end}}
+ {{if .ViewState.vehicle.Data.informations}}
+
+
Informations pratiques pour le bénéficiaire
+ {{.ViewState.vehicle.Data.informations}}
+
+ {{end}}
+
+
+
+
+
+
+
+
Réservations à venir
+ {{if eq (len .ViewState.vehicle.Bookings) 0}}
+
Aucune réservation à venir
+ {{end}}
+
+ {{range .ViewState.vehicle.Bookings}}
+
+
+
+ {{end}}
+
+ {{template "calendar" .}}
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles_management/fleet-update.html b/themes/spie06/web/layouts/vehicles_management/fleet-update.html
new file mode 100644
index 0000000..88b6770
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles_management/fleet-update.html
@@ -0,0 +1,106 @@
+{{define "content"}}
+
+
+
+
Modifier un véhicule
+
+
+
+
+
+
+
+
Identité du véhicule
+
Informations de base sur le véhicule
+
+
+
+
+ Modèle (ou nom donné au
+ véhicule)
+
+
+
+ {{template "vehicle_type_select" .}}
+
+
+ Immatriculation
+
+
+
+
+
+
+
+
+
+
Informations pratiques
+
Informations pratiques pour la réservation
+
+
+ {{ $fieldName := "address" }}
+ {{ template "address_autocomplete" (dict "FieldName" $fieldName "Address" .ViewState.vehicle.Data.address) }}
+
+
+
Informations pratiques pour le bénéficiaire
+
+
+
+
+
+
+
+
+
+
Certains champs de sont pas valides.
+
+ Annuler
+
+
Modifier
+ le véhicule
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/layouts/vehicles_management/overview.html b/themes/spie06/web/layouts/vehicles_management/overview.html
new file mode 100644
index 0000000..60fd3ab
--- /dev/null
+++ b/themes/spie06/web/layouts/vehicles_management/overview.html
@@ -0,0 +1,45 @@
+{{define "content"}}
+
+
Gestion des véhicules et réservations
+
+
+
+
+
Réservations en cours et à venir
+
+
+
+
+
+{{template "bookings_list" .}}
+
+
+
+{{template "vehicles_list" .}}
+
+{{end}}
\ No newline at end of file
diff --git a/themes/spie06/web/public/css/main.css b/themes/spie06/web/public/css/main.css
new file mode 100644
index 0000000..768eb13
--- /dev/null
+++ b/themes/spie06/web/public/css/main.css
@@ -0,0 +1,2877 @@
+/*
+! tailwindcss v3.1.6 | MIT License | https://tailwindcss.com
+*/
+
+/*
+1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
+2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
+*/
+
+*,
+::before,
+::after {
+ box-sizing: border-box;
+ /* 1 */
+ border-width: 0;
+ /* 2 */
+ border-style: solid;
+ /* 2 */
+ border-color: #e5e7eb;
+ /* 2 */
+}
+
+::before,
+::after {
+ --tw-content: '';
+}
+
+/*
+1. Use a consistent sensible line-height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+3. Use a more readable tab size.
+4. Use the user's configured `sans` font-family by default.
+*/
+
+html {
+ line-height: 1.5;
+ /* 1 */
+ -webkit-text-size-adjust: 100%;
+ /* 2 */
+ -moz-tab-size: 4;
+ /* 3 */
+ -o-tab-size: 4;
+ tab-size: 4;
+ /* 3 */
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ /* 4 */
+}
+
+/*
+1. Remove the margin in all browsers.
+2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
+*/
+
+body {
+ margin: 0;
+ /* 1 */
+ line-height: inherit;
+ /* 2 */
+}
+
+/*
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+3. Ensure horizontal rules are visible by default.
+*/
+
+hr {
+ height: 0;
+ /* 1 */
+ color: inherit;
+ /* 2 */
+ border-top-width: 1px;
+ /* 3 */
+}
+
+/*
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+}
+
+/*
+Remove the default font size and weight for headings.
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+/*
+Reset links to optimize for opt-in styling instead of opt-out.
+*/
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+/*
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/*
+1. Use the user's configured `mono` font family by default.
+2. Correct the odd `em` font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ /* 1 */
+ font-size: 1em;
+ /* 2 */
+}
+
+/*
+Add the correct font size in all browsers.
+*/
+
+small {
+ font-size: 80%;
+}
+
+/*
+Prevent `sub` and `sup` elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/*
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+3. Remove gaps between table borders by default.
+*/
+
+table {
+ text-indent: 0;
+ /* 1 */
+ border-color: inherit;
+ /* 2 */
+ border-collapse: collapse;
+ /* 3 */
+}
+
+/*
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+3. Remove default padding in all browsers.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit;
+ /* 1 */
+ font-size: 100%;
+ /* 1 */
+ font-weight: inherit;
+ /* 1 */
+ line-height: inherit;
+ /* 1 */
+ color: inherit;
+ /* 1 */
+ margin: 0;
+ /* 2 */
+ padding: 0;
+ /* 3 */
+}
+
+/*
+Remove the inheritance of text transform in Edge and Firefox.
+*/
+
+button,
+select {
+ text-transform: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Remove default button styles.
+*/
+
+button,
+[type='button'],
+[type='reset'],
+[type='submit'] {
+ -webkit-appearance: button;
+ /* 1 */
+ background-color: transparent;
+ /* 2 */
+ background-image: none;
+ /* 2 */
+}
+
+/*
+Use the modern Firefox focus style for all focusable elements.
+*/
+
+:-moz-focusring {
+ outline: auto;
+}
+
+/*
+Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
+*/
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+/*
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+ vertical-align: baseline;
+}
+
+/*
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/*
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ /* 1 */
+ outline-offset: -2px;
+ /* 2 */
+}
+
+/*
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to `inherit` in Safari.
+*/
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ /* 1 */
+ font: inherit;
+ /* 2 */
+}
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+ display: list-item;
+}
+
+/*
+Removes the default spacing and border for appropriate elements.
+*/
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+ margin: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+}
+
+legend {
+ padding: 0;
+}
+
+ol,
+ul,
+menu {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+/*
+Prevent resizing textareas horizontally by default.
+*/
+
+textarea {
+ resize: vertical;
+}
+
+/*
+1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
+2. Set the default placeholder color to the user's configured gray 400 color.
+*/
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+input:-ms-input-placeholder, textarea:-ms-input-placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+/*
+Set the default cursor for buttons.
+*/
+
+button,
+[role="button"] {
+ cursor: pointer;
+}
+
+/*
+Make sure disabled buttons don't get the pointer cursor.
+*/
+
+:disabled {
+ cursor: default;
+}
+
+/*
+1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
+2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
+ This can trigger a poorly considered lint error in some tools but is included by design.
+*/
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ display: block;
+ /* 1 */
+ vertical-align: middle;
+ /* 2 */
+}
+
+/*
+Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
+*/
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #fff;
+ border-color: #6b7280;
+ border-width: 1px;
+ border-radius: 0px;
+ padding-top: 0.5rem;
+ padding-right: 0.75rem;
+ padding-bottom: 0.5rem;
+ padding-left: 0.75rem;
+ font-size: 1rem;
+ line-height: 1.5rem;
+ --tw-shadow: 0 0 #0000;
+}
+
+[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+ --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: #2563eb;
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ border-color: #2563eb;
+}
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ color: #6b7280;
+ opacity: 1;
+}
+
+input:-ms-input-placeholder, textarea:-ms-input-placeholder {
+ color: #6b7280;
+ opacity: 1;
+}
+
+input::placeholder,textarea::placeholder {
+ color: #6b7280;
+ opacity: 1;
+}
+
+::-webkit-datetime-edit-fields-wrapper {
+ padding: 0;
+}
+
+::-webkit-date-and-time-value {
+ min-height: 1.5em;
+}
+
+::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field {
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+select {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
+ background-position: right 0.5rem center;
+ background-repeat: no-repeat;
+ background-size: 1.5em 1.5em;
+ padding-right: 2.5rem;
+ -webkit-print-color-adjust: exact;
+ color-adjust: exact;
+ print-color-adjust: exact;
+}
+
+[multiple] {
+ background-image: initial;
+ background-position: initial;
+ background-repeat: unset;
+ background-size: initial;
+ padding-right: 0.75rem;
+ -webkit-print-color-adjust: unset;
+ color-adjust: unset;
+ print-color-adjust: unset;
+}
+
+[type='checkbox'],[type='radio'] {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ padding: 0;
+ -webkit-print-color-adjust: exact;
+ color-adjust: exact;
+ print-color-adjust: exact;
+ display: inline-block;
+ vertical-align: middle;
+ background-origin: border-box;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ flex-shrink: 0;
+ height: 1rem;
+ width: 1rem;
+ color: #2563eb;
+ background-color: #fff;
+ border-color: #6b7280;
+ border-width: 1px;
+ --tw-shadow: 0 0 #0000;
+}
+
+[type='checkbox'] {
+ border-radius: 0px;
+}
+
+[type='radio'] {
+ border-radius: 100%;
+}
+
+[type='checkbox']:focus,[type='radio']:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+ --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
+ --tw-ring-offset-width: 2px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: #2563eb;
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+}
+
+[type='checkbox']:checked,[type='radio']:checked {
+ border-color: transparent;
+ background-color: currentColor;
+ background-size: 100% 100%;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+[type='checkbox']:checked {
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
+}
+
+[type='radio']:checked {
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
+}
+
+[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {
+ border-color: transparent;
+ background-color: currentColor;
+}
+
+[type='checkbox']:indeterminate {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");
+ border-color: transparent;
+ background-color: currentColor;
+ background-size: 100% 100%;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {
+ border-color: transparent;
+ background-color: currentColor;
+}
+
+[type='file'] {
+ background: unset;
+ border-color: inherit;
+ border-width: 0;
+ border-radius: 0;
+ padding: 0;
+ font-size: unset;
+ line-height: inherit;
+}
+
+[type='file']:focus {
+ outline: 1px solid ButtonText;
+ outline: 1px auto -webkit-focus-ring-color;
+}
+
+html {
+ font-family: Bitter, serif;
+}
+
+*, ::before, ::after {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+::-webkit-backdrop {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+::backdrop {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0;
+}
+
+.pointer-events-none {
+ pointer-events: none;
+}
+
+.visible {
+ visibility: visible;
+}
+
+.fixed {
+ position: fixed;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.relative {
+ position: relative;
+}
+
+.sticky {
+ position: -webkit-sticky;
+ position: sticky;
+}
+
+.inset-0 {
+ top: 0px;
+ right: 0px;
+ bottom: 0px;
+ left: 0px;
+}
+
+.inset-y-0 {
+ top: 0px;
+ bottom: 0px;
+}
+
+.top-0 {
+ top: 0px;
+}
+
+.right-0 {
+ right: 0px;
+}
+
+.left-0 {
+ left: 0px;
+}
+
+.top-4 {
+ top: 1rem;
+}
+
+.left-4 {
+ left: 1rem;
+}
+
+.z-40 {
+ z-index: 40;
+}
+
+.z-10 {
+ z-index: 10;
+}
+
+.z-0 {
+ z-index: 0;
+}
+
+.col-span-6 {
+ grid-column: span 6 / span 6;
+}
+
+.col-span-1 {
+ grid-column: span 1 / span 1;
+}
+
+.col-span-3 {
+ grid-column: span 3 / span 3;
+}
+
+.col-span-5 {
+ grid-column: span 5 / span 5;
+}
+
+.m-auto {
+ margin: auto;
+}
+
+.m-2 {
+ margin: 0.5rem;
+}
+
+.-mx-4 {
+ margin-left: -1rem;
+ margin-right: -1rem;
+}
+
+.mx-auto {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.-my-2 {
+ margin-top: -0.5rem;
+ margin-bottom: -0.5rem;
+}
+
+.my-4 {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+}
+
+.my-8 {
+ margin-top: 2rem;
+ margin-bottom: 2rem;
+}
+
+.-my-1\.5 {
+ margin-top: -0.375rem;
+ margin-bottom: -0.375rem;
+}
+
+.-my-1 {
+ margin-top: -0.25rem;
+ margin-bottom: -0.25rem;
+}
+
+.-mr-12 {
+ margin-right: -3rem;
+}
+
+.ml-1 {
+ margin-left: 0.25rem;
+}
+
+.mt-5 {
+ margin-top: 1.25rem;
+}
+
+.ml-4 {
+ margin-left: 1rem;
+}
+
+.ml-3 {
+ margin-left: 0.75rem;
+}
+
+.mt-2 {
+ margin-top: 0.5rem;
+}
+
+.mt-1 {
+ margin-top: 0.25rem;
+}
+
+.mt-10 {
+ margin-top: 2.5rem;
+}
+
+.mr-2 {
+ margin-right: 0.5rem;
+}
+
+.mr-4 {
+ margin-right: 1rem;
+}
+
+.mt-8 {
+ margin-top: 2rem;
+}
+
+.mt-4 {
+ margin-top: 1rem;
+}
+
+.mt-6 {
+ margin-top: 1.5rem;
+}
+
+.mt-3 {
+ margin-top: 0.75rem;
+}
+
+.mr-3 {
+ margin-right: 0.75rem;
+}
+
+.mr-1\.5 {
+ margin-right: 0.375rem;
+}
+
+.mr-1 {
+ margin-right: 0.25rem;
+}
+
+.ml-5 {
+ margin-left: 1.25rem;
+}
+
+.ml-2 {
+ margin-left: 0.5rem;
+}
+
+.mb-4 {
+ margin-bottom: 1rem;
+}
+
+.ml-6 {
+ margin-left: 1.5rem;
+}
+
+.-mb-px {
+ margin-bottom: -1px;
+}
+
+.-ml-4 {
+ margin-left: -1rem;
+}
+
+.-mt-4 {
+ margin-top: -1rem;
+}
+
+.mb-10 {
+ margin-bottom: 2.5rem;
+}
+
+.-mt-2 {
+ margin-top: -0.5rem;
+}
+
+.-mb-8 {
+ margin-bottom: -2rem;
+}
+
+.-ml-px {
+ margin-left: -1px;
+}
+
+.ml-16 {
+ margin-left: 4rem;
+}
+
+.-mr-1\.5 {
+ margin-right: -0.375rem;
+}
+
+.-mr-1 {
+ margin-right: -0.25rem;
+}
+
+.block {
+ display: block;
+}
+
+.inline-block {
+ display: inline-block;
+}
+
+.inline {
+ display: inline;
+}
+
+.flex {
+ display: flex;
+}
+
+.inline-flex {
+ display: inline-flex;
+}
+
+.table {
+ display: table;
+}
+
+.table-cell {
+ display: table-cell;
+}
+
+.flow-root {
+ display: flow-root;
+}
+
+.grid {
+ display: grid;
+}
+
+.hidden {
+ display: none;
+}
+
+.h-full {
+ height: 100%;
+}
+
+.h-10 {
+ height: 2.5rem;
+}
+
+.h-6 {
+ height: 1.5rem;
+}
+
+.h-16 {
+ height: 4rem;
+}
+
+.h-8 {
+ height: 2rem;
+}
+
+.h-0 {
+ height: 0px;
+}
+
+.h-5 {
+ height: 1.25rem;
+}
+
+.h-4 {
+ height: 1rem;
+}
+
+.h-12 {
+ height: 3rem;
+}
+
+.h-3 {
+ height: 0.75rem;
+}
+
+.max-h-60 {
+ max-height: 15rem;
+}
+
+.min-h-full {
+ min-height: 100%;
+}
+
+.w-full {
+ width: 100%;
+}
+
+.w-10 {
+ width: 2.5rem;
+}
+
+.w-6 {
+ width: 1.5rem;
+}
+
+.w-auto {
+ width: auto;
+}
+
+.w-14 {
+ width: 3.5rem;
+}
+
+.w-5 {
+ width: 1.25rem;
+}
+
+.w-48 {
+ width: 12rem;
+}
+
+.w-8 {
+ width: 2rem;
+}
+
+.w-4 {
+ width: 1rem;
+}
+
+.w-16 {
+ width: 4rem;
+}
+
+.w-11 {
+ width: 2.75rem;
+}
+
+.w-12 {
+ width: 3rem;
+}
+
+.w-3 {
+ width: 0.75rem;
+}
+
+.w-0\.5 {
+ width: 0.125rem;
+}
+
+.w-0 {
+ width: 0px;
+}
+
+.min-w-full {
+ min-width: 100%;
+}
+
+.min-w-0 {
+ min-width: 0px;
+}
+
+.max-w-xs {
+ max-width: 20rem;
+}
+
+.max-w-7xl {
+ max-width: 80rem;
+}
+
+.max-w-3xl {
+ max-width: 48rem;
+}
+
+.max-w-2xl {
+ max-width: 42rem;
+}
+
+.max-w-lg {
+ max-width: 32rem;
+}
+
+.flex-1 {
+ flex: 1 1 0%;
+}
+
+.flex-auto {
+ flex: 1 1 auto;
+}
+
+.flex-none {
+ flex: none;
+}
+
+.flex-shrink-0 {
+ flex-shrink: 0;
+}
+
+.shrink {
+ flex-shrink: 1;
+}
+
+.flex-grow {
+ flex-grow: 1;
+}
+
+.table-fixed {
+ table-layout: fixed;
+}
+
+.origin-top-right {
+ transform-origin: top right;
+}
+
+.-translate-x-full {
+ --tw-translate-x: -100%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-x-0 {
+ --tw-translate-x: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-x-5 {
+ --tw-translate-x: 1.25rem;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-y-4 {
+ --tw-translate-y: 1rem;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-y-0 {
+ --tw-translate-y: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.scale-95 {
+ --tw-scale-x: .95;
+ --tw-scale-y: .95;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.scale-100 {
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.transform {
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.cursor-default {
+ cursor: default;
+}
+
+.cursor-pointer {
+ cursor: pointer;
+}
+
+.select-none {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.resize-none {
+ resize: none;
+}
+
+.appearance-none {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+.grid-cols-6 {
+ grid-template-columns: repeat(6, minmax(0, 1fr));
+}
+
+.grid-cols-1 {
+ grid-template-columns: repeat(1, minmax(0, 1fr));
+}
+
+.grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+}
+
+.grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.grid-cols-7 {
+ grid-template-columns: repeat(7, minmax(0, 1fr));
+}
+
+.flex-row {
+ flex-direction: row;
+}
+
+.flex-col {
+ flex-direction: column;
+}
+
+.flex-col-reverse {
+ flex-direction: column-reverse;
+}
+
+.flex-wrap {
+ flex-wrap: wrap;
+}
+
+.items-start {
+ align-items: flex-start;
+}
+
+.items-end {
+ align-items: flex-end;
+}
+
+.items-center {
+ align-items: center;
+}
+
+.justify-end {
+ justify-content: flex-end;
+}
+
+.justify-center {
+ justify-content: center;
+}
+
+.justify-between {
+ justify-content: space-between;
+}
+
+.gap-6 {
+ gap: 1.5rem;
+}
+
+.gap-5 {
+ gap: 1.25rem;
+}
+
+.gap-4 {
+ gap: 1rem;
+}
+
+.gap-x-4 {
+ -moz-column-gap: 1rem;
+ column-gap: 1rem;
+}
+
+.gap-y-8 {
+ row-gap: 2rem;
+}
+
+.space-y-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));
+}
+
+.space-y-6 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));
+}
+
+.space-y-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(1rem * var(--tw-space-y-reverse));
+}
+
+.space-x-5 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1.25rem * var(--tw-space-x-reverse));
+ margin-left: calc(1.25rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.-space-x-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(-0.25rem * var(--tw-space-x-reverse));
+ margin-left: calc(-0.25rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.-space-y-px > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(-1px * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(-1px * var(--tw-space-y-reverse));
+}
+
+.space-x-8 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(2rem * var(--tw-space-x-reverse));
+ margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.-space-x-px > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(-1px * var(--tw-space-x-reverse));
+ margin-left: calc(-1px * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-x-3 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.75rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-y-8 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(2rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(2rem * var(--tw-space-y-reverse));
+}
+
+.space-x-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-x-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1rem * var(--tw-space-x-reverse));
+ margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-y-reverse > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 1;
+}
+
+.divide-y > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-y-reverse: 0;
+ border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
+ border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
+}
+
+.divide-gray-300 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(209 213 219 / var(--tw-divide-opacity));
+}
+
+.divide-gray-200 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(229 231 235 / var(--tw-divide-opacity));
+}
+
+.overflow-auto {
+ overflow: auto;
+}
+
+.overflow-hidden {
+ overflow: hidden;
+}
+
+.overflow-x-auto {
+ overflow-x: auto;
+}
+
+.overflow-y-auto {
+ overflow-y: auto;
+}
+
+.truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.whitespace-nowrap {
+ white-space: nowrap;
+}
+
+.rounded-full {
+ border-radius: 9999px;
+}
+
+.rounded-2xl {
+ border-radius: 1rem;
+}
+
+.rounded-md {
+ border-radius: 0.375rem;
+}
+
+.rounded-co {
+ border-radius: 40%;
+}
+
+.rounded-xl {
+ border-radius: 0.75rem;
+}
+
+.rounded {
+ border-radius: 0.25rem;
+}
+
+.rounded-3xl {
+ border-radius: 1.5rem;
+}
+
+.rounded-lg {
+ border-radius: 0.5rem;
+}
+
+.rounded-l-3xl {
+ border-top-left-radius: 1.5rem;
+ border-bottom-left-radius: 1.5rem;
+}
+
+.rounded-r-3xl {
+ border-top-right-radius: 1.5rem;
+ border-bottom-right-radius: 1.5rem;
+}
+
+.rounded-l-2xl {
+ border-top-left-radius: 1rem;
+ border-bottom-left-radius: 1rem;
+}
+
+.rounded-r-2xl {
+ border-top-right-radius: 1rem;
+ border-bottom-right-radius: 1rem;
+}
+
+.rounded-l-md {
+ border-top-left-radius: 0.375rem;
+ border-bottom-left-radius: 0.375rem;
+}
+
+.rounded-r-md {
+ border-top-right-radius: 0.375rem;
+ border-bottom-right-radius: 0.375rem;
+}
+
+.rounded-b-2xl {
+ border-bottom-right-radius: 1rem;
+ border-bottom-left-radius: 1rem;
+}
+
+.border {
+ border-width: 1px;
+}
+
+.border-2 {
+ border-width: 2px;
+}
+
+.border-0 {
+ border-width: 0px;
+}
+
+.border-r {
+ border-right-width: 1px;
+}
+
+.border-t {
+ border-top-width: 1px;
+}
+
+.border-b {
+ border-bottom-width: 1px;
+}
+
+.border-b-2 {
+ border-bottom-width: 2px;
+}
+
+.border-l-0 {
+ border-left-width: 0px;
+}
+
+.border-t-2 {
+ border-top-width: 2px;
+}
+
+.border-dashed {
+ border-style: dashed;
+}
+
+.border-gray-200 {
+ --tw-border-opacity: 1;
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
+}
+
+.border-transparent {
+ border-color: transparent;
+}
+
+.border-gray-300 {
+ --tw-border-opacity: 1;
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
+}
+
+.border-co-red {
+ --tw-border-opacity: 1;
+ border-color: rgb(222 21 129 / var(--tw-border-opacity));
+}
+
+.border-indigo-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(99 102 241 / var(--tw-border-opacity));
+}
+
+.border-co-blue {
+ --tw-border-opacity: 1;
+ border-color: rgb(0 114 126 / var(--tw-border-opacity));
+}
+
+.bg-gray-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
+}
+
+.bg-gray-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
+}
+
+.bg-co-blue {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 114 126 / var(--tw-bg-opacity));
+}
+
+.bg-white {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
+}
+
+.bg-co-green {
+ --tw-bg-opacity: 1;
+ background-color: rgb(108 193 31 / var(--tw-bg-opacity));
+}
+
+.bg-co-red {
+ --tw-bg-opacity: 1;
+ background-color: rgb(222 21 129 / var(--tw-bg-opacity));
+}
+
+.bg-co-yellow {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 221 0 / var(--tw-bg-opacity));
+}
+
+.bg-gray-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
+}
+
+.bg-gray-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
+}
+
+.bg-green-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(220 252 231 / var(--tw-bg-opacity));
+}
+
+.bg-indigo-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(238 242 255 / var(--tw-bg-opacity));
+}
+
+.bg-indigo-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(79 70 229 / var(--tw-bg-opacity));
+}
+
+.bg-gray-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
+}
+
+.bg-opacity-75 {
+ --tw-bg-opacity: 0.75;
+}
+
+.bg-opacity-30 {
+ --tw-bg-opacity: 0.3;
+}
+
+.stroke-gray-800 {
+ stroke: #1f2937;
+}
+
+.stroke-white {
+ stroke: #fff;
+}
+
+.p-1 {
+ padding: 0.25rem;
+}
+
+.p-12 {
+ padding: 3rem;
+}
+
+.p-2 {
+ padding: 0.5rem;
+}
+
+.p-4 {
+ padding: 1rem;
+}
+
+.p-0 {
+ padding: 0px;
+}
+
+.p-1\.5 {
+ padding: 0.375rem;
+}
+
+.px-4 {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+.py-2 {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.py-1 {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+}
+
+.py-6 {
+ padding-top: 1.5rem;
+ padding-bottom: 1.5rem;
+}
+
+.py-3\.5 {
+ padding-top: 0.875rem;
+ padding-bottom: 0.875rem;
+}
+
+.py-3 {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+}
+
+.px-3 {
+ padding-left: 0.75rem;
+ padding-right: 0.75rem;
+}
+
+.py-4 {
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+}
+
+.px-2 {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.py-5 {
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+}
+
+.py-10 {
+ padding-top: 2.5rem;
+ padding-bottom: 2.5rem;
+}
+
+.px-1 {
+ padding-left: 0.25rem;
+ padding-right: 0.25rem;
+}
+
+.py-12 {
+ padding-top: 3rem;
+ padding-bottom: 3rem;
+}
+
+.py-8 {
+ padding-top: 2rem;
+ padding-bottom: 2rem;
+}
+
+.px-6 {
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+}
+
+.pb-4 {
+ padding-bottom: 1rem;
+}
+
+.pt-2 {
+ padding-top: 0.5rem;
+}
+
+.pt-5 {
+ padding-top: 1.25rem;
+}
+
+.pl-8 {
+ padding-left: 2rem;
+}
+
+.pr-3 {
+ padding-right: 0.75rem;
+}
+
+.pl-3 {
+ padding-left: 0.75rem;
+}
+
+.pr-9 {
+ padding-right: 2.25rem;
+}
+
+.pl-4 {
+ padding-left: 1rem;
+}
+
+.pr-4 {
+ padding-right: 1rem;
+}
+
+.pr-2 {
+ padding-right: 0.5rem;
+}
+
+.pr-12 {
+ padding-right: 3rem;
+}
+
+.pl-1 {
+ padding-left: 0.25rem;
+}
+
+.pr-10 {
+ padding-right: 2.5rem;
+}
+
+.pb-2 {
+ padding-bottom: 0.5rem;
+}
+
+.pt-8 {
+ padding-top: 2rem;
+}
+
+.pb-6 {
+ padding-bottom: 1.5rem;
+}
+
+.pt-4 {
+ padding-top: 1rem;
+}
+
+.pb-8 {
+ padding-bottom: 2rem;
+}
+
+.pt-16 {
+ padding-top: 4rem;
+}
+
+.pt-1\.5 {
+ padding-top: 0.375rem;
+}
+
+.pt-1 {
+ padding-top: 0.25rem;
+}
+
+.pl-1\.5 {
+ padding-left: 0.375rem;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.align-middle {
+ vertical-align: middle;
+}
+
+.text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.text-base {
+ font-size: 1rem;
+ line-height: 1.5rem;
+}
+
+.text-xs {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.text-2xl {
+ font-size: 1.5rem;
+ line-height: 2rem;
+}
+
+.text-lg {
+ font-size: 1.125rem;
+ line-height: 1.75rem;
+}
+
+.text-xl {
+ font-size: 1.25rem;
+ line-height: 1.75rem;
+}
+
+.text-3xl {
+ font-size: 1.875rem;
+ line-height: 2.25rem;
+}
+
+.font-medium {
+ font-weight: 500;
+}
+
+.font-normal {
+ font-weight: 400;
+}
+
+.font-semibold {
+ font-weight: 600;
+}
+
+.font-bold {
+ font-weight: 700;
+}
+
+.font-extrabold {
+ font-weight: 800;
+}
+
+.uppercase {
+ text-transform: uppercase;
+}
+
+.capitalize {
+ text-transform: capitalize;
+}
+
+.leading-4 {
+ line-height: 1rem;
+}
+
+.leading-6 {
+ line-height: 1.5rem;
+}
+
+.leading-5 {
+ line-height: 1.25rem;
+}
+
+.tracking-wide {
+ letter-spacing: 0.025em;
+}
+
+.tracking-tight {
+ letter-spacing: -0.025em;
+}
+
+.text-gray-500 {
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity));
+}
+
+.text-gray-400 {
+ --tw-text-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-text-opacity));
+}
+
+.text-gray-900 {
+ --tw-text-opacity: 1;
+ color: rgb(17 24 39 / var(--tw-text-opacity));
+}
+
+.text-white {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.text-gray-700 {
+ --tw-text-opacity: 1;
+ color: rgb(55 65 81 / var(--tw-text-opacity));
+}
+
+.text-co-blue {
+ --tw-text-opacity: 1;
+ color: rgb(0 114 126 / var(--tw-text-opacity));
+}
+
+.text-co-red {
+ --tw-text-opacity: 1;
+ color: rgb(222 21 129 / var(--tw-text-opacity));
+}
+
+.text-indigo-600 {
+ --tw-text-opacity: 1;
+ color: rgb(79 70 229 / var(--tw-text-opacity));
+}
+
+.text-green-800 {
+ --tw-text-opacity: 1;
+ color: rgb(22 101 52 / var(--tw-text-opacity));
+}
+
+.text-gray-600 {
+ --tw-text-opacity: 1;
+ color: rgb(75 85 99 / var(--tw-text-opacity));
+}
+
+.text-co-green {
+ --tw-text-opacity: 1;
+ color: rgb(108 193 31 / var(--tw-text-opacity));
+}
+
+.text-black {
+ --tw-text-opacity: 1;
+ color: rgb(0 0 0 / var(--tw-text-opacity));
+}
+
+.placeholder-gray-500::-moz-placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-placeholder-opacity));
+}
+
+.placeholder-gray-500:-ms-input-placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-placeholder-opacity));
+}
+
+.placeholder-gray-500::placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-placeholder-opacity));
+}
+
+.placeholder-gray-400::-moz-placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
+}
+
+.placeholder-gray-400:-ms-input-placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
+}
+
+.placeholder-gray-400::placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
+}
+
+.opacity-0 {
+ opacity: 0;
+}
+
+.opacity-100 {
+ opacity: 1;
+}
+
+.shadow {
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-lg {
+ --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-sm {
+ --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
+ --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-inner {
+ --tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
+ --tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-xl {
+ --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.ring-1 {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.ring-2 {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.ring-0 {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.ring-8 {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.ring-black {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity));
+}
+
+.ring-gray-300 {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity));
+}
+
+.ring-white {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity));
+}
+
+.ring-opacity-5 {
+ --tw-ring-opacity: 0.05;
+}
+
+.blur {
+ --tw-blur: blur(8px);
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
+}
+
+.filter {
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
+}
+
+.transition-opacity {
+ transition-property: opacity;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition {
+ transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-colors {
+ transition-property: color, background-color, border-color, fill, stroke, -webkit-text-decoration-color;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, -webkit-text-decoration-color;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-all {
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.duration-300 {
+ transition-duration: 300ms;
+}
+
+.duration-100 {
+ transition-duration: 100ms;
+}
+
+.duration-75 {
+ transition-duration: 75ms;
+}
+
+.duration-200 {
+ transition-duration: 200ms;
+}
+
+.ease-linear {
+ transition-timing-function: linear;
+}
+
+.ease-in-out {
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.ease-out {
+ transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
+}
+
+.ease-in {
+ transition-timing-function: cubic-bezier(0.4, 0, 1, 1);
+}
+
+@font-face {
+ font-family: "Manometer";
+
+ src: url("https://coopgo.fr/fonts/manometer.woff2") format("woff2"), url("/fonts/manometer.woff") format("woff");
+}
+
+@font-face {
+ font-family: "Bitter";
+
+ font-style: normal;
+
+ src: url("https://coopgo.fr/fonts/Bitter-Regular.woff") format("woff");
+}
+
+.focus-within\:text-gray-600:focus-within {
+ --tw-text-opacity: 1;
+ color: rgb(75 85 99 / var(--tw-text-opacity));
+}
+
+.focus-within\:outline-none:focus-within {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.focus-within\:ring-2:focus-within {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.focus-within\:ring-co-blue:focus-within {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(0 114 126 / var(--tw-ring-opacity));
+}
+
+.focus-within\:ring-offset-2:focus-within {
+ --tw-ring-offset-width: 2px;
+}
+
+.hover\:border-gray-300:hover {
+ --tw-border-opacity: 1;
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
+}
+
+.hover\:bg-gray-50:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-gray-200:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-white:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-co-blue:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 114 126 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-gray-100:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-blue-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-opacity-5:hover {
+ --tw-bg-opacity: 0.05;
+}
+
+.hover\:text-gray-600:hover {
+ --tw-text-opacity: 1;
+ color: rgb(75 85 99 / var(--tw-text-opacity));
+}
+
+.hover\:text-co-blue:hover {
+ --tw-text-opacity: 1;
+ color: rgb(0 114 126 / var(--tw-text-opacity));
+}
+
+.hover\:text-white:hover {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.hover\:text-gray-700:hover {
+ --tw-text-opacity: 1;
+ color: rgb(55 65 81 / var(--tw-text-opacity));
+}
+
+.hover\:text-gray-900:hover {
+ --tw-text-opacity: 1;
+ color: rgb(17 24 39 / var(--tw-text-opacity));
+}
+
+.hover\:text-gray-500:hover {
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity));
+}
+
+.hover\:text-inherit:hover {
+ color: inherit;
+}
+
+.focus\:border-transparent:focus {
+ border-color: transparent;
+}
+
+.focus\:border-co-blue:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(0 114 126 / var(--tw-border-opacity));
+}
+
+.focus\:border-indigo-500:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(99 102 241 / var(--tw-border-opacity));
+}
+
+.focus\:border-blue-500:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
+}
+
+.focus\:placeholder-gray-400:focus::-moz-placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
+}
+
+.focus\:placeholder-gray-400:focus:-ms-input-placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
+}
+
+.focus\:placeholder-gray-400:focus::placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
+}
+
+.focus\:outline-none:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.focus\:ring-2:focus {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.focus\:ring-0:focus {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.focus\:ring-1:focus {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.focus\:ring-inset:focus {
+ --tw-ring-inset: inset;
+}
+
+.focus\:ring-white:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-co-blue:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(0 114 126 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-indigo-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-co-red:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(222 21 129 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-blue-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-offset-2:focus {
+ --tw-ring-offset-width: 2px;
+}
+
+.focus\:ring-offset-gray-100:focus {
+ --tw-ring-offset-color: #f3f4f6;
+}
+
+.disabled\:cursor-not-allowed:disabled {
+ cursor: not-allowed;
+}
+
+.disabled\:opacity-30:disabled {
+ opacity: 0.3;
+}
+
+.group:hover .group-hover\:text-gray-500 {
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity));
+}
+
+@media (prefers-color-scheme: dark) {
+ .dark\:border-gray-600 {
+ --tw-border-opacity: 1;
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
+ }
+
+ .dark\:bg-gray-700 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
+ }
+
+ .dark\:bg-gray-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
+ }
+}
+
+@media (min-width: 640px) {
+ .sm\:col-span-3 {
+ grid-column: span 3 / span 3;
+ }
+
+ .sm\:col-span-6 {
+ grid-column: span 6 / span 6;
+ }
+
+ .sm\:col-span-1 {
+ grid-column: span 1 / span 1;
+ }
+
+ .sm\:col-span-2 {
+ grid-column: span 2 / span 2;
+ }
+
+ .sm\:col-span-4 {
+ grid-column: span 4 / span 4;
+ }
+
+ .sm\:-mx-6 {
+ margin-left: -1.5rem;
+ margin-right: -1.5rem;
+ }
+
+ .sm\:mx-auto {
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ .sm\:my-8 {
+ margin-top: 2rem;
+ margin-bottom: 2rem;
+ }
+
+ .sm\:mt-0 {
+ margin-top: 0px;
+ }
+
+ .sm\:ml-16 {
+ margin-left: 4rem;
+ }
+
+ .sm\:ml-5 {
+ margin-left: 1.25rem;
+ }
+
+ .sm\:mt-5 {
+ margin-top: 1.25rem;
+ }
+
+ .sm\:mt-6 {
+ margin-top: 1.5rem;
+ }
+
+ .sm\:block {
+ display: block;
+ }
+
+ .sm\:flex {
+ display: flex;
+ }
+
+ .sm\:grid {
+ display: grid;
+ }
+
+ .sm\:hidden {
+ display: none;
+ }
+
+ .sm\:w-auto {
+ width: auto;
+ }
+
+ .sm\:w-full {
+ width: 100%;
+ }
+
+ .sm\:max-w-xs {
+ max-width: 20rem;
+ }
+
+ .sm\:max-w-md {
+ max-width: 28rem;
+ }
+
+ .sm\:max-w-sm {
+ max-width: 24rem;
+ }
+
+ .sm\:flex-auto {
+ flex: 1 1 auto;
+ }
+
+ .sm\:flex-none {
+ flex: none;
+ }
+
+ .sm\:flex-1 {
+ flex: 1 1 0%;
+ }
+
+ .sm\:translate-y-0 {
+ --tw-translate-y: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+ }
+
+ .sm\:scale-95 {
+ --tw-scale-x: .95;
+ --tw-scale-y: .95;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+ }
+
+ .sm\:scale-100 {
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+ }
+
+ .sm\:grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .sm\:grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
+ .sm\:flex-row-reverse {
+ flex-direction: row-reverse;
+ }
+
+ .sm\:flex-nowrap {
+ flex-wrap: nowrap;
+ }
+
+ .sm\:items-center {
+ align-items: center;
+ }
+
+ .sm\:justify-end {
+ justify-content: flex-end;
+ }
+
+ .sm\:justify-between {
+ justify-content: space-between;
+ }
+
+ .sm\:gap-6 {
+ gap: 1.5rem;
+ }
+
+ .sm\:gap-4 {
+ gap: 1rem;
+ }
+
+ .sm\:space-y-0 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0px * var(--tw-space-y-reverse));
+ }
+
+ .sm\:space-x-3 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.75rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse)));
+ }
+
+ .sm\:space-x-reverse > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 1;
+ }
+
+ .sm\:divide-y > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-y-reverse: 0;
+ border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
+ border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
+ }
+
+ .sm\:divide-gray-200 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(229 231 235 / var(--tw-divide-opacity));
+ }
+
+ .sm\:overflow-hidden {
+ overflow: hidden;
+ }
+
+ .sm\:rounded-lg {
+ border-radius: 0.5rem;
+ }
+
+ .sm\:rounded-3xl {
+ border-radius: 1.5rem;
+ }
+
+ .sm\:rounded-2xl {
+ border-radius: 1rem;
+ }
+
+ .sm\:p-6 {
+ padding: 1.5rem;
+ }
+
+ .sm\:p-0 {
+ padding: 0px;
+ }
+
+ .sm\:px-6 {
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+ }
+
+ .sm\:px-10 {
+ padding-left: 2.5rem;
+ padding-right: 2.5rem;
+ }
+
+ .sm\:py-5 {
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+ }
+
+ .sm\:pl-6 {
+ padding-left: 1.5rem;
+ }
+
+ .sm\:pr-6 {
+ padding-right: 1.5rem;
+ }
+
+ .sm\:pb-5 {
+ padding-bottom: 1.25rem;
+ }
+
+ .sm\:text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .md\:fixed {
+ position: fixed;
+ }
+
+ .md\:inset-y-0 {
+ top: 0px;
+ bottom: 0px;
+ }
+
+ .md\:col-span-1 {
+ grid-column: span 1 / span 1;
+ }
+
+ .md\:col-span-2 {
+ grid-column: span 2 / span 2;
+ }
+
+ .md\:mx-0 {
+ margin-left: 0px;
+ margin-right: 0px;
+ }
+
+ .md\:ml-0 {
+ margin-left: 0px;
+ }
+
+ .md\:ml-6 {
+ margin-left: 1.5rem;
+ }
+
+ .md\:mt-0 {
+ margin-top: 0px;
+ }
+
+ .md\:flex {
+ display: flex;
+ }
+
+ .md\:grid {
+ display: grid;
+ }
+
+ .md\:hidden {
+ display: none;
+ }
+
+ .md\:w-64 {
+ width: 16rem;
+ }
+
+ .md\:grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
+ .md\:grid-cols-6 {
+ grid-template-columns: repeat(6, minmax(0, 1fr));
+ }
+
+ .md\:flex-row {
+ flex-direction: row;
+ }
+
+ .md\:flex-col {
+ flex-direction: column;
+ }
+
+ .md\:items-center {
+ align-items: center;
+ }
+
+ .md\:justify-between {
+ justify-content: space-between;
+ }
+
+ .md\:gap-6 {
+ gap: 1.5rem;
+ }
+
+ .md\:space-x-5 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1.25rem * var(--tw-space-x-reverse));
+ margin-left: calc(1.25rem * calc(1 - var(--tw-space-x-reverse)));
+ }
+
+ .md\:space-x-3 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.75rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse)));
+ }
+
+ .md\:rounded-lg {
+ border-radius: 0.5rem;
+ }
+
+ .md\:px-8 {
+ padding-left: 2rem;
+ padding-right: 2rem;
+ }
+
+ .md\:px-6 {
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+ }
+
+ .md\:pl-64 {
+ padding-left: 16rem;
+ }
+
+ .md\:pl-4 {
+ padding-left: 1rem;
+ }
+
+ .md\:pr-6 {
+ padding-right: 1.5rem;
+ }
+
+ .md\:pl-0 {
+ padding-left: 0px;
+ }
+
+ .md\:pr-0 {
+ padding-right: 0px;
+ }
+
+ .md\:text-right {
+ text-align: right;
+ }
+}
+
+@media (min-width: 1024px) {
+ .lg\:col-span-2 {
+ grid-column: span 2 / span 2;
+ }
+
+ .lg\:col-span-1 {
+ grid-column: span 1 / span 1;
+ }
+
+ .lg\:col-start-1 {
+ grid-column-start: 1;
+ }
+
+ .lg\:col-start-3 {
+ grid-column-start: 3;
+ }
+
+ .lg\:col-start-2 {
+ grid-column-start: 2;
+ }
+
+ .lg\:-mx-8 {
+ margin-left: -2rem;
+ margin-right: -2rem;
+ }
+
+ .lg\:table-cell {
+ display: table-cell;
+ }
+
+ .lg\:max-w-7xl {
+ max-width: 80rem;
+ }
+
+ .lg\:grid-flow-col-dense {
+ grid-auto-flow: column dense;
+ }
+
+ .lg\:grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
+ .lg\:grid-cols-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ }
+
+ .lg\:px-8 {
+ padding-left: 2rem;
+ padding-right: 2rem;
+ }
+}
\ No newline at end of file
diff --git a/themes/spie06/web/public/images/Tutoriel SPIE06 - Positionner sur un permis accéléré.pdf b/themes/spie06/web/public/images/Tutoriel SPIE06 - Positionner sur un permis accéléré.pdf
new file mode 100644
index 0000000..c1497f7
Binary files /dev/null and b/themes/spie06/web/public/images/Tutoriel SPIE06 - Positionner sur un permis accéléré.pdf differ
diff --git a/themes/spie06/web/public/images/departement06.png b/themes/spie06/web/public/images/departement06.png
new file mode 100644
index 0000000..c7e5608
Binary files /dev/null and b/themes/spie06/web/public/images/departement06.png differ
diff --git a/themes/spie06/web/public/images/main_logo.svg b/themes/spie06/web/public/images/main_logo.svg
new file mode 100644
index 0000000..e098d7a
--- /dev/null
+++ b/themes/spie06/web/public/images/main_logo.svg
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/spie06/web/public/images/parcoursmob_logo_bluered.svg b/themes/spie06/web/public/images/parcoursmob_logo_bluered.svg
new file mode 100644
index 0000000..092d2ef
--- /dev/null
+++ b/themes/spie06/web/public/images/parcoursmob_logo_bluered.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/themes/spie06/web/public/images/parcoursmob_logo_whitered.svg b/themes/spie06/web/public/images/parcoursmob_logo_whitered.svg
new file mode 100644
index 0000000..d267bdd
--- /dev/null
+++ b/themes/spie06/web/public/images/parcoursmob_logo_whitered.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/themes/spie06/web/public/js/main.js b/themes/spie06/web/public/js/main.js
new file mode 100644
index 0000000..c1c927c
--- /dev/null
+++ b/themes/spie06/web/public/js/main.js
@@ -0,0 +1,2995 @@
+(() => {
+ var __create = Object.create;
+ var __defProp = Object.defineProperty;
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+ var __getOwnPropNames = Object.getOwnPropertyNames;
+ var __getProtoOf = Object.getPrototypeOf;
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
+ var __commonJS = (cb, mod) => function __require() {
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
+ };
+ var __copyProps = (to, from, except, desc) => {
+ if (from && typeof from === "object" || typeof from === "function") {
+ for (let key of __getOwnPropNames(from))
+ if (!__hasOwnProp.call(to, key) && key !== except)
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+ }
+ return to;
+ };
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
+ mod
+ ));
+
+ // ../../../../../../node_modules/@kingshott/iodine/dist/iodine.min.js
+ var require_iodine_min = __commonJS({
+ "../../../../../../node_modules/@kingshott/iodine/dist/iodine.min.js"(exports, module) {
+ var e = class {
+ constructor() {
+ this.locale = void 0, this.messages = { after: "The date must be after: '[PARAM]'", afterOrEqual: "The date must be after or equal to: '[PARAM]'", array: "[FIELD] must be an array", before: "The date must be before: '[PARAM]'", beforeOrEqual: "The date must be before or equal to: '[PARAM]'", boolean: "[FIELD] must be true or false", date: "[FIELD] must be a date", different: "[FIELD] must be different to '[PARAM]'", endsWith: "[FIELD] must end with '[PARAM]'", email: "[FIELD] must be a valid email address", falsy: "[FIELD] must be a falsy value (false, 'false', 0 or '0')", in: "[FIELD] must be one of the following options: [PARAM]", integer: "[FIELD] must be an integer", json: "[FIELD] must be a parsable JSON object string", max: "[FIELD] must be less than or equal to [PARAM]", min: "[FIELD] must be greater than or equal to [PARAM]", maxLength: "[FIELD] must not be greater than '[PARAM]' in character length", minLength: "[FIELD] must not be less than '[PARAM]' character length", notIn: "[FIELD] must not be one of the following options: [PARAM]", numeric: "[FIELD] must be numeric", optional: "[FIELD] is optional", regexMatch: "[FIELD] must satisify the regular expression: [PARAM]", required: "[FIELD] must be present", same: "[FIELD] must be '[PARAM]'", startsWith: "[FIELD] must start with '[PARAM]'", string: "[FIELD] must be a string", truthy: "[FIELD] must be a truthy value (true, 'true', 1 or '1')", url: "[FIELD] must be a valid url", uuid: "[FIELD] must be a valid UUID" };
+ }
+ _compare(e2, t, r, s = false) {
+ return !!this.assertDate(e2) && !(!this.assertDate(t) && !this.assertInteger(t)) && (t = "number" == typeof t ? t : t.getTime(), "less" === r && s ? e2.getTime() <= t : "less" !== r || s ? "more" === r && s ? e2.getTime() >= t : "more" !== r || s ? void 0 : e2.getTime() > t : e2.getTime() < t);
+ }
+ _error(e2, t) {
+ let { param: r, field: s } = "object" == typeof t ? t : { param: t, field: void 0 };
+ const a = e2.split(":");
+ let i = a.shift();
+ r = r || a.join(":"), ["after", "afterOrEqual", "before", "beforeOrEqual"].includes(i) && (r = new Date(parseInt(r)).toLocaleTimeString(this.locale, { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "numeric", hour12: false }));
+ let n = [null, void 0, ""].includes(r) ? this.messages[i] : this.messages[i].replace("[PARAM]", r);
+ return [null, void 0, ""].includes(s) ? n.replace("[FIELD]", this.default_field_name ?? "Value") : n.replace("[FIELD]", s);
+ }
+ _missing() {
+ return { valid: false, rule: "None", error: "Rules exist, but no value was provided to check" };
+ }
+ _prepare(e2, t = []) {
+ return t.length ? "optional" === t[0] && this.assertOptional(e2) ? [] : t.filter((e3) => "optional" !== e3).map((e3) => "string" == typeof e3 ? [e3, this._title(e3.split(":").shift()), e3.split(":").slice(1).join(":")] : [`${e3.rule}:${e3.param}`, this._title(e3.rule), e3.param]) : [];
+ }
+ _title(e2) {
+ return `${e2[0].toUpperCase()}${e2.slice(1)}`;
+ }
+ _validate(e2, t) {
+ for (let r in t = this._prepare(e2, t))
+ if (!this[`assert${t[r][1]}`].apply(this, [e2, t[r][2]]))
+ return { valid: false, rule: t[r][0], error: this._error(t[r][0]) };
+ return { valid: true, rule: "", error: "" };
+ }
+ assert(e2, t) {
+ if (Array.isArray(t))
+ return this._validate(e2, t);
+ let r = Object.keys(t), s = { valid: true, fields: {} };
+ for (let a = 0; a < r.length; a++)
+ s.fields[r[a]] = e2.hasOwnProperty(r[a]) ? this._validate(e2[r[a]], t[r[a]]) : this._missing(), s.fields[r[a]].valid || (s.valid = false);
+ return s;
+ }
+ assertAfter(e2, t) {
+ return this._compare(e2, t, "more", false);
+ }
+ assertAfterOrEqual(e2, t) {
+ return this._compare(e2, t, "more", true);
+ }
+ assertArray(e2) {
+ return Array.isArray(e2);
+ }
+ assertBefore(e2, t) {
+ return this._compare(e2, t, "less", false);
+ }
+ assertBeforeOrEqual(e2, t) {
+ return this._compare(e2, t, "less", true);
+ }
+ assertBoolean(e2) {
+ return [true, false].includes(e2);
+ }
+ assertDate(e2) {
+ return e2 && "[object Date]" === Object.prototype.toString.call(e2) && !isNaN(e2);
+ }
+ assertDifferent(e2, t) {
+ return e2 != t;
+ }
+ assertEndsWith(e2, t) {
+ return this.assertString(e2) && e2.endsWith(t);
+ }
+ assertEmail(e2) {
+ return new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$").test(String(e2).toLowerCase());
+ }
+ assertFalsy(e2) {
+ return [0, "0", false, "false"].includes(e2);
+ }
+ assertIn(e2, t) {
+ return ("string" == typeof t ? t.split(",") : t).includes(e2);
+ }
+ assertInteger(e2) {
+ return Number.isInteger(e2) && parseInt(e2).toString() === e2.toString();
+ }
+ assertJson(e2) {
+ try {
+ return "object" == typeof JSON.parse(e2);
+ } catch (e3) {
+ return false;
+ }
+ }
+ assertMax(e2, t) {
+ return parseFloat(e2) <= t;
+ }
+ assertMin(e2, t) {
+ return parseFloat(e2) >= t;
+ }
+ assertMaxLength(e2, t) {
+ return "string" == typeof e2 && e2.length <= t;
+ }
+ assertMinLength(e2, t) {
+ return "string" == typeof e2 && e2.length >= t;
+ }
+ assertNotIn(e2, t) {
+ return !this.assertIn(e2, t);
+ }
+ assertNumeric(e2) {
+ return !isNaN(parseFloat(e2)) && isFinite(e2);
+ }
+ assertOptional(e2) {
+ return [null, void 0, ""].includes(e2);
+ }
+ assertRegexMatch(e2, t) {
+ return new RegExp(t).test(String(e2));
+ }
+ assertRequired(e2) {
+ return !this.assertOptional(e2);
+ }
+ assertSame(e2, t) {
+ return e2 == t;
+ }
+ assertStartsWith(e2, t) {
+ return this.assertString(e2) && e2.startsWith(t);
+ }
+ assertString(e2) {
+ return "string" == typeof e2;
+ }
+ assertTruthy(e2) {
+ return [1, "1", true, "true"].includes(e2);
+ }
+ assertUrl(e2) {
+ return new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$").test(String(e2).toLowerCase());
+ }
+ assertUuid(e2) {
+ return new RegExp("^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$").test(String(e2).toLowerCase());
+ }
+ rule(t, r) {
+ e.prototype[`assert${this._title(t)}`] = r;
+ }
+ setErrorMessages(e2) {
+ this.messages = e2;
+ }
+ setErrorMessage(e2, t) {
+ this.messages[e2] = t;
+ }
+ setLocale(e2) {
+ this.locale = e2;
+ }
+ setDefaultFieldName(e2) {
+ this.default_field_name = e2;
+ }
+ };
+ "undefined" != typeof window && (window.Iodine = new e()), module.exports = e;
+ }
+ });
+
+ // assets/js/main.js
+ var import_iodine = __toESM(require_iodine_min());
+
+ // ../../../../../../node_modules/alpinejs/dist/module.esm.js
+ var flushPending = false;
+ var flushing = false;
+ var queue = [];
+ function scheduler(callback) {
+ queueJob(callback);
+ }
+ function queueJob(job) {
+ if (!queue.includes(job))
+ queue.push(job);
+ queueFlush();
+ }
+ function dequeueJob(job) {
+ let index = queue.indexOf(job);
+ if (index !== -1)
+ queue.splice(index, 1);
+ }
+ function queueFlush() {
+ if (!flushing && !flushPending) {
+ flushPending = true;
+ queueMicrotask(flushJobs);
+ }
+ }
+ function flushJobs() {
+ flushPending = false;
+ flushing = true;
+ for (let i = 0; i < queue.length; i++) {
+ queue[i]();
+ }
+ queue.length = 0;
+ flushing = false;
+ }
+ var reactive;
+ var effect;
+ var release;
+ var raw;
+ var shouldSchedule = true;
+ function disableEffectScheduling(callback) {
+ shouldSchedule = false;
+ callback();
+ shouldSchedule = true;
+ }
+ function setReactivityEngine(engine) {
+ reactive = engine.reactive;
+ release = engine.release;
+ effect = (callback) => engine.effect(callback, { scheduler: (task) => {
+ if (shouldSchedule) {
+ scheduler(task);
+ } else {
+ task();
+ }
+ } });
+ raw = engine.raw;
+ }
+ function overrideEffect(override) {
+ effect = override;
+ }
+ function elementBoundEffect(el) {
+ let cleanup2 = () => {
+ };
+ let wrappedEffect = (callback) => {
+ let effectReference = effect(callback);
+ if (!el._x_effects) {
+ el._x_effects = /* @__PURE__ */ new Set();
+ el._x_runEffects = () => {
+ el._x_effects.forEach((i) => i());
+ };
+ }
+ el._x_effects.add(effectReference);
+ cleanup2 = () => {
+ if (effectReference === void 0)
+ return;
+ el._x_effects.delete(effectReference);
+ release(effectReference);
+ };
+ return effectReference;
+ };
+ return [wrappedEffect, () => {
+ cleanup2();
+ }];
+ }
+ var onAttributeAddeds = [];
+ var onElRemoveds = [];
+ var onElAddeds = [];
+ function onElAdded(callback) {
+ onElAddeds.push(callback);
+ }
+ function onElRemoved(el, callback) {
+ if (typeof callback === "function") {
+ if (!el._x_cleanups)
+ el._x_cleanups = [];
+ el._x_cleanups.push(callback);
+ } else {
+ callback = el;
+ onElRemoveds.push(callback);
+ }
+ }
+ function onAttributesAdded(callback) {
+ onAttributeAddeds.push(callback);
+ }
+ function onAttributeRemoved(el, name, callback) {
+ if (!el._x_attributeCleanups)
+ el._x_attributeCleanups = {};
+ if (!el._x_attributeCleanups[name])
+ el._x_attributeCleanups[name] = [];
+ el._x_attributeCleanups[name].push(callback);
+ }
+ function cleanupAttributes(el, names) {
+ if (!el._x_attributeCleanups)
+ return;
+ Object.entries(el._x_attributeCleanups).forEach(([name, value]) => {
+ if (names === void 0 || names.includes(name)) {
+ value.forEach((i) => i());
+ delete el._x_attributeCleanups[name];
+ }
+ });
+ }
+ var observer = new MutationObserver(onMutate);
+ var currentlyObserving = false;
+ function startObservingMutations() {
+ observer.observe(document, { subtree: true, childList: true, attributes: true, attributeOldValue: true });
+ currentlyObserving = true;
+ }
+ function stopObservingMutations() {
+ flushObserver();
+ observer.disconnect();
+ currentlyObserving = false;
+ }
+ var recordQueue = [];
+ var willProcessRecordQueue = false;
+ function flushObserver() {
+ recordQueue = recordQueue.concat(observer.takeRecords());
+ if (recordQueue.length && !willProcessRecordQueue) {
+ willProcessRecordQueue = true;
+ queueMicrotask(() => {
+ processRecordQueue();
+ willProcessRecordQueue = false;
+ });
+ }
+ }
+ function processRecordQueue() {
+ onMutate(recordQueue);
+ recordQueue.length = 0;
+ }
+ function mutateDom(callback) {
+ if (!currentlyObserving)
+ return callback();
+ stopObservingMutations();
+ let result = callback();
+ startObservingMutations();
+ return result;
+ }
+ var isCollecting = false;
+ var deferredMutations = [];
+ function deferMutations() {
+ isCollecting = true;
+ }
+ function flushAndStopDeferringMutations() {
+ isCollecting = false;
+ onMutate(deferredMutations);
+ deferredMutations = [];
+ }
+ function onMutate(mutations) {
+ if (isCollecting) {
+ deferredMutations = deferredMutations.concat(mutations);
+ return;
+ }
+ let addedNodes = [];
+ let removedNodes = [];
+ let addedAttributes = /* @__PURE__ */ new Map();
+ let removedAttributes = /* @__PURE__ */ new Map();
+ for (let i = 0; i < mutations.length; i++) {
+ if (mutations[i].target._x_ignoreMutationObserver)
+ continue;
+ if (mutations[i].type === "childList") {
+ mutations[i].addedNodes.forEach((node) => node.nodeType === 1 && addedNodes.push(node));
+ mutations[i].removedNodes.forEach((node) => node.nodeType === 1 && removedNodes.push(node));
+ }
+ if (mutations[i].type === "attributes") {
+ let el = mutations[i].target;
+ let name = mutations[i].attributeName;
+ let oldValue = mutations[i].oldValue;
+ let add2 = () => {
+ if (!addedAttributes.has(el))
+ addedAttributes.set(el, []);
+ addedAttributes.get(el).push({ name, value: el.getAttribute(name) });
+ };
+ let remove = () => {
+ if (!removedAttributes.has(el))
+ removedAttributes.set(el, []);
+ removedAttributes.get(el).push(name);
+ };
+ if (el.hasAttribute(name) && oldValue === null) {
+ add2();
+ } else if (el.hasAttribute(name)) {
+ remove();
+ add2();
+ } else {
+ remove();
+ }
+ }
+ }
+ removedAttributes.forEach((attrs, el) => {
+ cleanupAttributes(el, attrs);
+ });
+ addedAttributes.forEach((attrs, el) => {
+ onAttributeAddeds.forEach((i) => i(el, attrs));
+ });
+ for (let node of removedNodes) {
+ if (addedNodes.includes(node))
+ continue;
+ onElRemoveds.forEach((i) => i(node));
+ if (node._x_cleanups) {
+ while (node._x_cleanups.length)
+ node._x_cleanups.pop()();
+ }
+ }
+ addedNodes.forEach((node) => {
+ node._x_ignoreSelf = true;
+ node._x_ignore = true;
+ });
+ for (let node of addedNodes) {
+ if (removedNodes.includes(node))
+ continue;
+ if (!node.isConnected)
+ continue;
+ delete node._x_ignoreSelf;
+ delete node._x_ignore;
+ onElAddeds.forEach((i) => i(node));
+ node._x_ignore = true;
+ node._x_ignoreSelf = true;
+ }
+ addedNodes.forEach((node) => {
+ delete node._x_ignoreSelf;
+ delete node._x_ignore;
+ });
+ addedNodes = null;
+ removedNodes = null;
+ addedAttributes = null;
+ removedAttributes = null;
+ }
+ function scope(node) {
+ return mergeProxies(closestDataStack(node));
+ }
+ function addScopeToNode(node, data2, referenceNode) {
+ node._x_dataStack = [data2, ...closestDataStack(referenceNode || node)];
+ return () => {
+ node._x_dataStack = node._x_dataStack.filter((i) => i !== data2);
+ };
+ }
+ function refreshScope(element, scope2) {
+ let existingScope = element._x_dataStack[0];
+ Object.entries(scope2).forEach(([key, value]) => {
+ existingScope[key] = value;
+ });
+ }
+ function closestDataStack(node) {
+ if (node._x_dataStack)
+ return node._x_dataStack;
+ if (typeof ShadowRoot === "function" && node instanceof ShadowRoot) {
+ return closestDataStack(node.host);
+ }
+ if (!node.parentNode) {
+ return [];
+ }
+ return closestDataStack(node.parentNode);
+ }
+ function mergeProxies(objects) {
+ let thisProxy = new Proxy({}, {
+ ownKeys: () => {
+ return Array.from(new Set(objects.flatMap((i) => Object.keys(i))));
+ },
+ has: (target, name) => {
+ return objects.some((obj) => obj.hasOwnProperty(name));
+ },
+ get: (target, name) => {
+ return (objects.find((obj) => {
+ if (obj.hasOwnProperty(name)) {
+ let descriptor = Object.getOwnPropertyDescriptor(obj, name);
+ if (descriptor.get && descriptor.get._x_alreadyBound || descriptor.set && descriptor.set._x_alreadyBound) {
+ return true;
+ }
+ if ((descriptor.get || descriptor.set) && descriptor.enumerable) {
+ let getter = descriptor.get;
+ let setter = descriptor.set;
+ let property = descriptor;
+ getter = getter && getter.bind(thisProxy);
+ setter = setter && setter.bind(thisProxy);
+ if (getter)
+ getter._x_alreadyBound = true;
+ if (setter)
+ setter._x_alreadyBound = true;
+ Object.defineProperty(obj, name, {
+ ...property,
+ get: getter,
+ set: setter
+ });
+ }
+ return true;
+ }
+ return false;
+ }) || {})[name];
+ },
+ set: (target, name, value) => {
+ let closestObjectWithKey = objects.find((obj) => obj.hasOwnProperty(name));
+ if (closestObjectWithKey) {
+ closestObjectWithKey[name] = value;
+ } else {
+ objects[objects.length - 1][name] = value;
+ }
+ return true;
+ }
+ });
+ return thisProxy;
+ }
+ function initInterceptors(data2) {
+ let isObject2 = (val) => typeof val === "object" && !Array.isArray(val) && val !== null;
+ let recurse = (obj, basePath = "") => {
+ Object.entries(Object.getOwnPropertyDescriptors(obj)).forEach(([key, { value, enumerable }]) => {
+ if (enumerable === false || value === void 0)
+ return;
+ let path = basePath === "" ? key : `${basePath}.${key}`;
+ if (typeof value === "object" && value !== null && value._x_interceptor) {
+ obj[key] = value.initialize(data2, path, key);
+ } else {
+ if (isObject2(value) && value !== obj && !(value instanceof Element)) {
+ recurse(value, path);
+ }
+ }
+ });
+ };
+ return recurse(data2);
+ }
+ function interceptor(callback, mutateObj = () => {
+ }) {
+ let obj = {
+ initialValue: void 0,
+ _x_interceptor: true,
+ initialize(data2, path, key) {
+ return callback(this.initialValue, () => get(data2, path), (value) => set(data2, path, value), path, key);
+ }
+ };
+ mutateObj(obj);
+ return (initialValue) => {
+ if (typeof initialValue === "object" && initialValue !== null && initialValue._x_interceptor) {
+ let initialize = obj.initialize.bind(obj);
+ obj.initialize = (data2, path, key) => {
+ let innerValue = initialValue.initialize(data2, path, key);
+ obj.initialValue = innerValue;
+ return initialize(data2, path, key);
+ };
+ } else {
+ obj.initialValue = initialValue;
+ }
+ return obj;
+ };
+ }
+ function get(obj, path) {
+ return path.split(".").reduce((carry, segment) => carry[segment], obj);
+ }
+ function set(obj, path, value) {
+ if (typeof path === "string")
+ path = path.split(".");
+ if (path.length === 1)
+ obj[path[0]] = value;
+ else if (path.length === 0)
+ throw error;
+ else {
+ if (obj[path[0]])
+ return set(obj[path[0]], path.slice(1), value);
+ else {
+ obj[path[0]] = {};
+ return set(obj[path[0]], path.slice(1), value);
+ }
+ }
+ }
+ var magics = {};
+ function magic(name, callback) {
+ magics[name] = callback;
+ }
+ function injectMagics(obj, el) {
+ Object.entries(magics).forEach(([name, callback]) => {
+ Object.defineProperty(obj, `$${name}`, {
+ get() {
+ let [utilities, cleanup2] = getElementBoundUtilities(el);
+ utilities = { interceptor, ...utilities };
+ onElRemoved(el, cleanup2);
+ return callback(el, utilities);
+ },
+ enumerable: false
+ });
+ });
+ return obj;
+ }
+ function tryCatch(el, expression, callback, ...args) {
+ try {
+ return callback(...args);
+ } catch (e) {
+ handleError(e, el, expression);
+ }
+ }
+ function handleError(error2, el, expression = void 0) {
+ Object.assign(error2, { el, expression });
+ console.warn(`Alpine Expression Error: ${error2.message}
+
+${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
+ setTimeout(() => {
+ throw error2;
+ }, 0);
+ }
+ var shouldAutoEvaluateFunctions = true;
+ function dontAutoEvaluateFunctions(callback) {
+ let cache = shouldAutoEvaluateFunctions;
+ shouldAutoEvaluateFunctions = false;
+ callback();
+ shouldAutoEvaluateFunctions = cache;
+ }
+ function evaluate(el, expression, extras = {}) {
+ let result;
+ evaluateLater(el, expression)((value) => result = value, extras);
+ return result;
+ }
+ function evaluateLater(...args) {
+ return theEvaluatorFunction(...args);
+ }
+ var theEvaluatorFunction = normalEvaluator;
+ function setEvaluator(newEvaluator) {
+ theEvaluatorFunction = newEvaluator;
+ }
+ function normalEvaluator(el, expression) {
+ let overriddenMagics = {};
+ injectMagics(overriddenMagics, el);
+ let dataStack = [overriddenMagics, ...closestDataStack(el)];
+ if (typeof expression === "function") {
+ return generateEvaluatorFromFunction(dataStack, expression);
+ }
+ let evaluator = generateEvaluatorFromString(dataStack, expression, el);
+ return tryCatch.bind(null, el, expression, evaluator);
+ }
+ function generateEvaluatorFromFunction(dataStack, func) {
+ return (receiver = () => {
+ }, { scope: scope2 = {}, params = [] } = {}) => {
+ let result = func.apply(mergeProxies([scope2, ...dataStack]), params);
+ runIfTypeOfFunction(receiver, result);
+ };
+ }
+ var evaluatorMemo = {};
+ function generateFunctionFromString(expression, el) {
+ if (evaluatorMemo[expression]) {
+ return evaluatorMemo[expression];
+ }
+ let AsyncFunction = Object.getPrototypeOf(async function() {
+ }).constructor;
+ let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression) || /^(let|const)\s/.test(expression) ? `(() => { ${expression} })()` : expression;
+ const safeAsyncFunction = () => {
+ try {
+ return new AsyncFunction(["__self", "scope"], `with (scope) { __self.result = ${rightSideSafeExpression} }; __self.finished = true; return __self.result;`);
+ } catch (error2) {
+ handleError(error2, el, expression);
+ return Promise.resolve();
+ }
+ };
+ let func = safeAsyncFunction();
+ evaluatorMemo[expression] = func;
+ return func;
+ }
+ function generateEvaluatorFromString(dataStack, expression, el) {
+ let func = generateFunctionFromString(expression, el);
+ return (receiver = () => {
+ }, { scope: scope2 = {}, params = [] } = {}) => {
+ func.result = void 0;
+ func.finished = false;
+ let completeScope = mergeProxies([scope2, ...dataStack]);
+ if (typeof func === "function") {
+ let promise = func(func, completeScope).catch((error2) => handleError(error2, el, expression));
+ if (func.finished) {
+ runIfTypeOfFunction(receiver, func.result, completeScope, params, el);
+ func.result = void 0;
+ } else {
+ promise.then((result) => {
+ runIfTypeOfFunction(receiver, result, completeScope, params, el);
+ }).catch((error2) => handleError(error2, el, expression)).finally(() => func.result = void 0);
+ }
+ }
+ };
+ }
+ function runIfTypeOfFunction(receiver, value, scope2, params, el) {
+ if (shouldAutoEvaluateFunctions && typeof value === "function") {
+ let result = value.apply(scope2, params);
+ if (result instanceof Promise) {
+ result.then((i) => runIfTypeOfFunction(receiver, i, scope2, params)).catch((error2) => handleError(error2, el, value));
+ } else {
+ receiver(result);
+ }
+ } else {
+ receiver(value);
+ }
+ }
+ var prefixAsString = "x-";
+ function prefix(subject = "") {
+ return prefixAsString + subject;
+ }
+ function setPrefix(newPrefix) {
+ prefixAsString = newPrefix;
+ }
+ var directiveHandlers = {};
+ function directive(name, callback) {
+ directiveHandlers[name] = callback;
+ }
+ function directives(el, attributes, originalAttributeOverride) {
+ attributes = Array.from(attributes);
+ if (el._x_virtualDirectives) {
+ let vAttributes = Object.entries(el._x_virtualDirectives).map(([name, value]) => ({ name, value }));
+ let staticAttributes = attributesOnly(vAttributes);
+ vAttributes = vAttributes.map((attribute) => {
+ if (staticAttributes.find((attr) => attr.name === attribute.name)) {
+ return {
+ name: `x-bind:${attribute.name}`,
+ value: `"${attribute.value}"`
+ };
+ }
+ return attribute;
+ });
+ attributes = attributes.concat(vAttributes);
+ }
+ let transformedAttributeMap = {};
+ let directives2 = attributes.map(toTransformedAttributes((newName, oldName) => transformedAttributeMap[newName] = oldName)).filter(outNonAlpineAttributes).map(toParsedDirectives(transformedAttributeMap, originalAttributeOverride)).sort(byPriority);
+ return directives2.map((directive2) => {
+ return getDirectiveHandler(el, directive2);
+ });
+ }
+ function attributesOnly(attributes) {
+ return Array.from(attributes).map(toTransformedAttributes()).filter((attr) => !outNonAlpineAttributes(attr));
+ }
+ var isDeferringHandlers = false;
+ var directiveHandlerStacks = /* @__PURE__ */ new Map();
+ var currentHandlerStackKey = Symbol();
+ function deferHandlingDirectives(callback) {
+ isDeferringHandlers = true;
+ let key = Symbol();
+ currentHandlerStackKey = key;
+ directiveHandlerStacks.set(key, []);
+ let flushHandlers = () => {
+ while (directiveHandlerStacks.get(key).length)
+ directiveHandlerStacks.get(key).shift()();
+ directiveHandlerStacks.delete(key);
+ };
+ let stopDeferring = () => {
+ isDeferringHandlers = false;
+ flushHandlers();
+ };
+ callback(flushHandlers);
+ stopDeferring();
+ }
+ function getElementBoundUtilities(el) {
+ let cleanups = [];
+ let cleanup2 = (callback) => cleanups.push(callback);
+ let [effect3, cleanupEffect] = elementBoundEffect(el);
+ cleanups.push(cleanupEffect);
+ let utilities = {
+ Alpine: alpine_default,
+ effect: effect3,
+ cleanup: cleanup2,
+ evaluateLater: evaluateLater.bind(evaluateLater, el),
+ evaluate: evaluate.bind(evaluate, el)
+ };
+ let doCleanup = () => cleanups.forEach((i) => i());
+ return [utilities, doCleanup];
+ }
+ function getDirectiveHandler(el, directive2) {
+ let noop = () => {
+ };
+ let handler3 = directiveHandlers[directive2.type] || noop;
+ let [utilities, cleanup2] = getElementBoundUtilities(el);
+ onAttributeRemoved(el, directive2.original, cleanup2);
+ let fullHandler = () => {
+ if (el._x_ignore || el._x_ignoreSelf)
+ return;
+ handler3.inline && handler3.inline(el, directive2, utilities);
+ handler3 = handler3.bind(handler3, el, directive2, utilities);
+ isDeferringHandlers ? directiveHandlerStacks.get(currentHandlerStackKey).push(handler3) : handler3();
+ };
+ fullHandler.runCleanups = cleanup2;
+ return fullHandler;
+ }
+ var startingWith = (subject, replacement) => ({ name, value }) => {
+ if (name.startsWith(subject))
+ name = name.replace(subject, replacement);
+ return { name, value };
+ };
+ var into = (i) => i;
+ function toTransformedAttributes(callback = () => {
+ }) {
+ return ({ name, value }) => {
+ let { name: newName, value: newValue } = attributeTransformers.reduce((carry, transform) => {
+ return transform(carry);
+ }, { name, value });
+ if (newName !== name)
+ callback(newName, name);
+ return { name: newName, value: newValue };
+ };
+ }
+ var attributeTransformers = [];
+ function mapAttributes(callback) {
+ attributeTransformers.push(callback);
+ }
+ function outNonAlpineAttributes({ name }) {
+ return alpineAttributeRegex().test(name);
+ }
+ var alpineAttributeRegex = () => new RegExp(`^${prefixAsString}([^:^.]+)\\b`);
+ function toParsedDirectives(transformedAttributeMap, originalAttributeOverride) {
+ return ({ name, value }) => {
+ let typeMatch = name.match(alpineAttributeRegex());
+ let valueMatch = name.match(/:([a-zA-Z0-9\-:]+)/);
+ let modifiers = name.match(/\.[^.\]]+(?=[^\]]*$)/g) || [];
+ let original = originalAttributeOverride || transformedAttributeMap[name] || name;
+ return {
+ type: typeMatch ? typeMatch[1] : null,
+ value: valueMatch ? valueMatch[1] : null,
+ modifiers: modifiers.map((i) => i.replace(".", "")),
+ expression: value,
+ original
+ };
+ };
+ }
+ var DEFAULT = "DEFAULT";
+ var directiveOrder = [
+ "ignore",
+ "ref",
+ "data",
+ "id",
+ "bind",
+ "init",
+ "for",
+ "mask",
+ "model",
+ "modelable",
+ "transition",
+ "show",
+ "if",
+ DEFAULT,
+ "teleport"
+ ];
+ function byPriority(a, b) {
+ let typeA = directiveOrder.indexOf(a.type) === -1 ? DEFAULT : a.type;
+ let typeB = directiveOrder.indexOf(b.type) === -1 ? DEFAULT : b.type;
+ return directiveOrder.indexOf(typeA) - directiveOrder.indexOf(typeB);
+ }
+ function dispatch(el, name, detail = {}) {
+ el.dispatchEvent(new CustomEvent(name, {
+ detail,
+ bubbles: true,
+ composed: true,
+ cancelable: true
+ }));
+ }
+ var tickStack = [];
+ var isHolding = false;
+ function nextTick(callback = () => {
+ }) {
+ queueMicrotask(() => {
+ isHolding || setTimeout(() => {
+ releaseNextTicks();
+ });
+ });
+ return new Promise((res) => {
+ tickStack.push(() => {
+ callback();
+ res();
+ });
+ });
+ }
+ function releaseNextTicks() {
+ isHolding = false;
+ while (tickStack.length)
+ tickStack.shift()();
+ }
+ function holdNextTicks() {
+ isHolding = true;
+ }
+ function walk(el, callback) {
+ if (typeof ShadowRoot === "function" && el instanceof ShadowRoot) {
+ Array.from(el.children).forEach((el2) => walk(el2, callback));
+ return;
+ }
+ let skip = false;
+ callback(el, () => skip = true);
+ if (skip)
+ return;
+ let node = el.firstElementChild;
+ while (node) {
+ walk(node, callback, false);
+ node = node.nextElementSibling;
+ }
+ }
+ function warn(message, ...args) {
+ console.warn(`Alpine Warning: ${message}`, ...args);
+ }
+ function start() {
+ if (!document.body)
+ warn("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's `