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"}} +

Bonjour,

+

Vous avez demandé à réinitialiser votre mot de passe pour {{.username}}

+

Pour créer votre nouveau mot de passe, cliquez sur le lien suivant : http://localhost:9000/auth/lost-password/recover?key={{.key}}

+{{end}} \ No newline at end of file diff --git a/themes/spie06/emails/layout.html b/themes/spie06/emails/layout.html new file mode 100644 index 0000000..6ac319a --- /dev/null +++ b/themes/spie06/emails/layout.html @@ -0,0 +1,62 @@ +{{define "main"}} + + + + + +
+ PARCOURSMOB +
+
+ {{template "content" .}} +
+ + +{{end}} \ No newline at end of file diff --git a/themes/spie06/emails/onboarding/existing-administrator.html b/themes/spie06/emails/onboarding/existing-administrator.html new file mode 100644 index 0000000..ba0fe56 --- /dev/null +++ b/themes/spie06/emails/onboarding/existing-administrator.html @@ -0,0 +1,4 @@ +{{define "content"}} +

Vous avez été ajouté comme administrateur de l'organisation {{.group}} sur PARCOURSMOB.

+

Connectez vous sur http://localhost:9000 pour y accéder

+{{end}} \ No newline at end of file diff --git a/themes/spie06/emails/onboarding/existing-member.html b/themes/spie06/emails/onboarding/existing-member.html new file mode 100644 index 0000000..f90cd72 --- /dev/null +++ b/themes/spie06/emails/onboarding/existing-member.html @@ -0,0 +1,4 @@ +{{define "content"}} +

Vous avez été ajouté à l'organisation {{.group}} sur PARCOURSMOB.

+

Connectez vous sur http://localhost:9000 pour y accéder

+{{end}} \ No newline at end of file diff --git a/themes/spie06/emails/onboarding/new-administrator.html b/themes/spie06/emails/onboarding/new-administrator.html new file mode 100644 index 0000000..53687a3 --- /dev/null +++ b/themes/spie06/emails/onboarding/new-administrator.html @@ -0,0 +1,5 @@ +{{define "content"}} +

Vous avez été ajouté comme administrateur de l'organisation {{.group}} sur PARCOURSMOB.

+

Vous devez créer votre compte pour y accéder.

+

Pour créer votre compte PARCOURSMOB, cliquez sur : http://localhost:9000/auth/onboarding?key={{.key}}

+{{end}} \ No newline at end of file diff --git a/themes/spie06/emails/onboarding/new-member.html b/themes/spie06/emails/onboarding/new-member.html new file mode 100644 index 0000000..3c230aa --- /dev/null +++ b/themes/spie06/emails/onboarding/new-member.html @@ -0,0 +1,5 @@ +{{define "content"}} +

Vous avez été ajouté à l'organisation {{.group}} sur PARCOURSMOB.

+

Vous devez créer votre compte pour y accéder.

+

Pour créer votre compte PARCOURSMOB, cliquez sur : http://localhost:9000/auth/onboarding?key={{.key}}

+{{end}} \ No newline at end of file diff --git a/themes/spie06/emails/onboarding/support_emailing.html b/themes/spie06/emails/onboarding/support_emailing.html new file mode 100644 index 0000000..40ea8c7 --- /dev/null +++ b/themes/spie06/emails/onboarding/support_emailing.html @@ -0,0 +1,4 @@ +{{define "content"}} +

Vous avez reçu un commentaire sur PARCOURSMOB de la part de {{.user}}

+

{{.key}}

+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/assets/css/main.css b/themes/spie06/web/assets/css/main.css new file mode 100644 index 0000000..15ab027 --- /dev/null +++ b/themes/spie06/web/assets/css/main.css @@ -0,0 +1,19 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@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"); } + + +@layer base { + html { + font-family: Bitter, serif; + } +} \ No newline at end of file diff --git a/themes/spie06/web/assets/js/main.js b/themes/spie06/web/assets/js/main.js new file mode 100644 index 0000000..0b0b059 --- /dev/null +++ b/themes/spie06/web/assets/js/main.js @@ -0,0 +1,6 @@ +import '@kingshott/iodine'; +import Alpine from 'alpinejs' + +window.Alpine = Alpine + +Alpine.start() \ No newline at end of file diff --git a/themes/spie06/web/fonts/bitter.ttf b/themes/spie06/web/fonts/bitter.ttf new file mode 100644 index 0000000..3b66905 Binary files /dev/null and b/themes/spie06/web/fonts/bitter.ttf differ diff --git a/themes/spie06/web/layouts/_partials/address_autocomplete.html b/themes/spie06/web/layouts/_partials/address_autocomplete.html new file mode 100644 index 0000000..3ffd1b2 --- /dev/null +++ b/themes/spie06/web/layouts/_partials/address_autocomplete.html @@ -0,0 +1,48 @@ +{{ define "address_autocomplete" }} + + +
+ + + + + +
+{{ end }} \ No newline at end of file diff --git a/themes/spie06/web/layouts/_partials/files_list.html b/themes/spie06/web/layouts/_partials/files_list.html new file mode 100644 index 0000000..0f10791 --- /dev/null +++ b/themes/spie06/web/layouts/_partials/files_list.html @@ -0,0 +1,31 @@ +{{define "documents_list"}} +
+ + + + + + + + + + + + + + + + + + +
Type + Actions +
+
+ {{index $.ViewState.file_types_map .Metadata.Type}} +
+
{{.Metadata.Name}} + +
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/_partials/mainmenu.html b/themes/spie06/web/layouts/_partials/mainmenu.html new file mode 100644 index 0000000..94d2108 --- /dev/null +++ b/themes/spie06/web/layouts/_partials/mainmenu.html @@ -0,0 +1,19 @@ +{{define "mainmenu"}} + +{{range .LayoutState.MenuItems}} + +{{end}} + +{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/administration/_partials/group_members.html b/themes/spie06/web/layouts/administration/_partials/group_members.html new file mode 100644 index 0000000..6e03022 --- /dev/null +++ b/themes/spie06/web/layouts/administration/_partials/group_members.html @@ -0,0 +1,47 @@ +{{define "groups_members"}} +
+ +

Membres de l'organisation

+ +
+ + {{range .ViewState.members}} + + {{end}} +
+
+ + +{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/administration/_partials/groups_admins.html b/themes/spie06/web/layouts/administration/_partials/groups_admins.html new file mode 100644 index 0000000..3495123 --- /dev/null +++ b/themes/spie06/web/layouts/administration/_partials/groups_admins.html @@ -0,0 +1,49 @@ +{{define "groups_admins"}} +
+ +

Administrateurs

+ +
+ + {{range .ViewState.admins}} + + {{end}} +
+
+ + + + +{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/administration/create_group.html b/themes/spie06/web/layouts/administration/create_group.html new file mode 100644 index 0000000..c5485ab --- /dev/null +++ b/themes/spie06/web/layouts/administration/create_group.html @@ -0,0 +1,142 @@ +{{define "content"}} + + +
+

Administration > Créer une organisation

+
+ +
+
+
+
+
+

Nouvelle organisation

+

Informations de base sur la nouvelle organisation à créer

+
+
+
+
+ + +
+
+
+
+
+
+
+
+

Paramètres

+

Paramètres de configuration de l'organisation (modules + accessibles, ...)

+
+
+ +
+ Droits d'accès aux modules + +
+
+
+ +
+
+ +

Gestion des bénéficiaires assignés à sa propre organisation. +

+
+
+
+
+ +
+
+ +

Trouver des solutions et organiser les déplacements de ses bénéficiaires.

+
+
+
+
+ +
+
+ +

Trouver et réserver des véhicules pour ses bénéficiaires. +

+
+
+
+
+ +
+
+ +

Gérer les véhicules et réservations (pour les gestionnaires de flottes) +

+
+
+
+
+ +
+
+ +

Agenda des dispositifs pour les bénéficiaires (sessions permis, événements, ...) +

+
+
+
+
+
+
+
+ +
+

Certains champs de sont pas valides.

+ + + + +
+
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/administration/display_group.html b/themes/spie06/web/layouts/administration/display_group.html new file mode 100644 index 0000000..eece157 --- /dev/null +++ b/themes/spie06/web/layouts/administration/display_group.html @@ -0,0 +1,140 @@ +{{define "content"}} +
+
+
+ +
+

{{.ViewState.group.Data.name}}

+
+
+
+ +
+
+
+
+
+
+
+

+ Paramètres de l'organisation

+

Paramètres généraux de l'organisation

+
+ {{template "groups_admins" .}} +
+
+
+ +
+ + +
+ +
+ + {{template "groups_members" .}} +
+
+
+ +
+ + +
+ +
+
+
+
+
+
+

Modules activés

+ +
+
+
+
+ +
+
+ +

Gestion des bénéficiaires assignés à sa propre organisation. +

+
+
+
+
+ +
+
+ +

Trouver des solutions et organiser les déplacements de ses bénéficiaires.

+
+
+
+
+ +
+
+ +

Trouver et réserver des véhicules pour ses bénéficiaires. +

+
+
+
+
+ +
+
+ +

Gérer les véhicules et réservations (pour les gestionnaires de flottes) +

+
+
+
+
+ +
+
+ +

Agenda des dispositifs pour les bénéficiaires (sessions permis, événements, ...) +

+
+
+
+
+ +
+
+ +

Administration générale de la plateforme PARCOURSMOB. Créer, ajouter des organisations et administrateurs. +

+
+
+
+
+
+ +
+
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/administration/home.html b/themes/spie06/web/layouts/administration/home.html new file mode 100644 index 0000000..372307d --- /dev/null +++ b/themes/spie06/web/layouts/administration/home.html @@ -0,0 +1,124 @@ +{{define "content"}} +
+

Administration

+
+ +
+

Statistiques

+ +
+ +
+

Gestion des organisations

+ +
+
+

+
+ +
+ +
+ +
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/agenda/create-event.html b/themes/spie06/web/layouts/agenda/create-event.html new file mode 100644 index 0000000..c3af0c4 --- /dev/null +++ b/themes/spie06/web/layouts/agenda/create-event.html @@ -0,0 +1,217 @@ +{{ define "content" }} + +
+

Ajouter à l'agenda

+
+ +
+
+
+
+
+

Informations sur le dispositif

+

Informations générales sur le dispositif d'accompagnement à ajouter à l'agenda

+
+
+
+
+ + +
+
+ + +
+
+ +
+ +
+
+ + {{ $fieldName := "address" }} + {{ template "address_autocomplete" dict "FieldName" $fieldName }} +
+
+
+
+ +
+
+
+

Planification

+

Dates et horaires de l'événement

+
+
+
+ +
+ + Toute la journée + + +
+ +
+
+
+ + +
+
+ + +
+ + +
+
+ +
+
+
+ + +
+
+ + +
+ + +
+
+ + +
+ +
+
+
+ +
+
+
+

Paramètres

+

Paramètres du dispositift (nombre de places disponibles, etc...)

+
+
+
+
+ + +
+
+
+
+
+ + + +
+

Certains champs de sont pas valides.

+ + + + +
+
+
+ +{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/agenda/display-event.html b/themes/spie06/web/layouts/agenda/display-event.html new file mode 100644 index 0000000..fcc31a7 --- /dev/null +++ b/themes/spie06/web/layouts/agenda/display-event.html @@ -0,0 +1,140 @@ +{{ define "content" }} +
+
+
+
+

{{.ViewState.event.Name}}

+

+ {{if eq .ViewState.event.Startdate .ViewState.event.Enddate}} + Le {{(timeFrom .ViewState.event.Startdate).Format "02/01/2006"}} + {{else}} + Du {{(timeFrom .ViewState.event.Startdate).Format "02/01/2006"}} au {{(timeFrom .ViewState.event.Enddate).Format "02/01/2006"}} + {{end}} +

+
+
+
+ +
+
+
+
+
+

Informations

+

Informations sur le dispositif.

+
+
+
+ {{if .ViewState.event.Type}} +
+
Type
+
{{.ViewState.event.Type}}
+
+ {{end}} + {{if .ViewState.group}} +
+
Structure gestionnaire
+
{{.ViewState.group.Data.name}}
+
+ {{end}} + {{if .ViewState.event.MaxSubscribers}} +
+
Total places
+
{{.ViewState.event.MaxSubscribers}}
+
+ {{end}} + {{if ne .ViewState.event.MaxSubscribers 0}} +
+
Places restantes
+
{{.ViewState.event.RemainingSubscriptions}}
+
+ {{end}} + {{if .ViewState.event.Data.address}} +
+
Adresse
+
{{.ViewState.event.Data.address.properties.label}}
+
+ {{end}} + {{if .ViewState.event.Description}} +
+
Description
+
{{.ViewState.event.Description}}
+
+ {{end}} +
+
+
+
+
+
+
+

Inscrire un bénéficiaire

+ {{if gt .ViewState.event.RemainingSubscriptions 0}} +
+
+ + + + +
    + + +
+ +
+ +
+ {{else}} +

Il n'y a plus de place disponible

+ {{end}} + {{if .ViewState.subscribers}} +

Inscrits

+
+ {{range .ViewState.subscribers}} + + {{end}} +
+ {{end}} +
+
+
+
+{{ end }} \ No newline at end of file diff --git a/themes/spie06/web/layouts/agenda/home.html b/themes/spie06/web/layouts/agenda/home.html new file mode 100644 index 0000000..864f81c --- /dev/null +++ b/themes/spie06/web/layouts/agenda/home.html @@ -0,0 +1,114 @@ +{{define "content"}} +
+

Agenda dispositifs

+ +
+
+

+
+ +
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + {{range .ViewState.events}} + + + + + + + + + + + + + + + {{end}} + + +
+ Type de dispositif + + Structure + + Nom + + Lieu + + Dates + + Places disponibles + + Bénéficiaires positionnés + + Actions +
+
{{.Type}}
+
+ +
+ {{range .Owners}} + {{if (index $.ViewState.groups .)}} + {{(index $.ViewState.groups .).Data.name}} + {{end}} + {{end}} +
+
+
{{.Name}}
+
+
{{if .Data.address}}{{.Data.address.properties.label}}{{end}}
+
+
+ {{if eq .Startdate .Enddate}} + Le {{(timeFrom .Startdate).Format "02/01/2006"}} + {{else}} + Du {{(timeFrom .Startdate).Format "02/01/2006"}}
Au {{(timeFrom .Enddate).Format "02/01/2006"}} + {{end}} +
+
+ {{if ne .RemainingSubscriptions 999}} +
{{.RemainingSubscriptions}}
+ {{end}} +
+
+ {{range .Subscriptions}} + + {{end}} +
+
+ Voir +
+
+
+
+
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/auth/groups.html b/themes/spie06/web/layouts/auth/groups.html new file mode 100644 index 0000000..e2aad30 --- /dev/null +++ b/themes/spie06/web/layouts/auth/groups.html @@ -0,0 +1,40 @@ +{{define "main"}} + + + PARCOURSMOB + + + + + + +
+
+ {{.IconSet.Icon "coopgo:parcoursmob/monogram" "mx-auto h-16 w-auto"}} +

Connectez vous à votre organisation

+
+ +
+
+
+
+ Organisations + {{range .ViewState.groups}} +
+ +
+ {{end}} +
+
+
+
+
+ + +{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/auth/lost-password-init.html b/themes/spie06/web/layouts/auth/lost-password-init.html new file mode 100644 index 0000000..996fcbd --- /dev/null +++ b/themes/spie06/web/layouts/auth/lost-password-init.html @@ -0,0 +1,40 @@ +{{define "main"}} + + + PARCOURSMOB - Identification + + + +
+ + + +
+
+ +

Réinitialiser votre mot de passe PARCOURSMOB

+
+ +
+
+
+ +
+ +
+
+ +

Si votre compte existe, vous allez recevoir un mot de passe par email contenant un lien pour réinitialiser votre mot de passe. Celui-ci sera actif pendant 72h.

+ +
+ +
+ + +
+
+
+
+ + +{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/auth/lost-password-recover-ko.html b/themes/spie06/web/layouts/auth/lost-password-recover-ko.html new file mode 100644 index 0000000..90b6928 --- /dev/null +++ b/themes/spie06/web/layouts/auth/lost-password-recover-ko.html @@ -0,0 +1,26 @@ +{{define "main"}} + + + PARCOURSMOB - Identification + + + + + + +
+
+ +

Réinitialiser votre mot de passe PARCOURSMOB

+

Ce lien de réinitialisation n'est plus actif. Vous l'avez déjà utilisé ou il a expiré. Vous pouvez redemander un nouveau mot de passe ou réessayer de vous connecter directement à PARCOURSMOB.

+
+ + + +
+
+ +
+ + +{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/auth/lost-password-recover.html b/themes/spie06/web/layouts/auth/lost-password-recover.html new file mode 100644 index 0000000..4286fd5 --- /dev/null +++ b/themes/spie06/web/layouts/auth/lost-password-recover.html @@ -0,0 +1,41 @@ +{{define "main"}} + + + PARCOURSMOB - Identification + + + +
+ + + +
+
+ +

Réinitialisez votre mot de passe PARCOURSMOB

+
+ +
+
+ +

Vous avez demandé à réinitialiser votre mot de passe pour {{.ViewState.recover.username}}

+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+
+
+ + +{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/auth/onboarding-ko.html b/themes/spie06/web/layouts/auth/onboarding-ko.html new file mode 100644 index 0000000..12d3972 --- /dev/null +++ b/themes/spie06/web/layouts/auth/onboarding-ko.html @@ -0,0 +1,26 @@ +{{define "main"}} + + + PARCOURSMOB - Identification + + + + + + +
+
+ +

Inscription à PARCOURSMOB

+

Ce lien d'inscription n'est plus actif. Vous avez peut être déjà créé votre compte. Si ce n'est pas le cas, le lien a pu expirer : veuillez en demander un nouveau à l'administrateur PARCOURSMOB de votre structure.

+
+ + + +
+
+ +
+ + +{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/auth/onboarding.html b/themes/spie06/web/layouts/auth/onboarding.html new file mode 100644 index 0000000..3d18e6c --- /dev/null +++ b/themes/spie06/web/layouts/auth/onboarding.html @@ -0,0 +1,54 @@ +{{define "main"}} + + + PARCOURSMOB - Identification + + + +
+ + + +
+
+ +

Créez votre compte PARCOURSMOB

+
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + + +
+ +
+ + +
+
+
+
+ + +{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-events.html b/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-events.html new file mode 100644 index 0000000..684622f --- /dev/null +++ b/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-events.html @@ -0,0 +1,4 @@ +{{define "beneficiary_events"}} +
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-files.html b/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-files.html new file mode 100644 index 0000000..b4a3de4 --- /dev/null +++ b/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-files.html @@ -0,0 +1,135 @@ +{{define "beneficiary_files"}} +
+ {{if eq (len .ViewState.documents) 0}} +

Aucun document

+ {{end}} + + + {{if gt (len .ViewState.documents) 0}} + +
+ + + + + + + + + + + {{range .ViewState.documents}} + + + + + + + {{end}} + + + + +
Type + Actions +
+
+ {{index $.ViewState.file_types_map .Metadata.Type}} +
+
{{.Metadata.Name}}{{.LastModified.Format "02/01/2006"}} + + + +
+
+ + {{end}} + +

Ajouter un document

+
+
+
+ + +
+
+ + +
+
+ +
+
+ {{.IconSet.Icon "hero:outline/folder-plus" "mx-auto h-12 w-12 text-gray-400"}} +
+ + + + +
+

Jusqu'à 10MB

+

+
+
+
+
+ +
+ +
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-journeys.html b/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-journeys.html new file mode 100644 index 0000000..160a179 --- /dev/null +++ b/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-journeys.html @@ -0,0 +1,38 @@ +{{define "beneficiary_journeys"}} +
+
+ + {{ $departureField := "departure" }} + {{ $departureLabel := "Départ" }} + {{ template "address_autocomplete" dict "FieldName" $departureField "FieldLabel" $departureLabel }} + + {{ $destinationField := "destination" }} + {{ $destinationLabel := "Destination" }} + {{ template "address_autocomplete" dict "FieldName" $destinationField "FieldLabel" $destinationLabel }} + + +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ + +
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-notes.html b/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-notes.html new file mode 100644 index 0000000..a793a17 --- /dev/null +++ b/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-notes.html @@ -0,0 +1,108 @@ +{{define "beneficiary_notes"}} +
+ +
+
+
+
+ +
+ +
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-vehicles.html b/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-vehicles.html new file mode 100644 index 0000000..897ade0 --- /dev/null +++ b/themes/spie06/web/layouts/beneficiaries/_partials/beneficiary-vehicles.html @@ -0,0 +1,39 @@ +{{define "beneficiary_vehicles"}} +
+ {{if .ViewState.bookings}} +

Mises à disposition réalisées

+ + {{end}} +

Réserver un véhicule

+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ {{template "vehicle_type_select" .}} + + +
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/beneficiaries/create.html b/themes/spie06/web/layouts/beneficiaries/create.html new file mode 100644 index 0000000..36ba876 --- /dev/null +++ b/themes/spie06/web/layouts/beneficiaries/create.html @@ -0,0 +1,184 @@ +{{define "content"}} + +
+

Ajouter un bénéficiaire

+
+ +
+
+
+
+
+

Informations obligatoires

+

Informations personnelles sur le bénéficiaire obligatoires + pour créer son profil dans PARCOURSMOB

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+
+ +
+
+
+

Informations optionnelles

+

Autres informations de profil optionnelles

+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ + + + +
+
+
+
+
+
+
+

Paramètres

+

Paramètres liés au bénéficiaire, utiles pour exploiter les fonctionnalités de PARCOURSMOB

+
+
+ + {{ $fieldName := "address" }} + {{ template "address_autocomplete" dict "FieldName" $fieldName }} + + + +
+
+
+ +
+

Certains champs de sont pas valides.

+ + + + +
+
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/beneficiaries/display.html b/themes/spie06/web/layouts/beneficiaries/display.html new file mode 100644 index 0000000..6829e5a --- /dev/null +++ b/themes/spie06/web/layouts/beneficiaries/display.html @@ -0,0 +1,152 @@ +{{define "content"}} +
+ +
+
+
+
+ + +
+
+
+

{{.ViewState.beneficiary.Data.first_name}} + {{.ViewState.beneficiary.Data.last_name}}

+

{{if .ViewState.beneficiary.Metadata.created}}Ajouté le par + Conseiller 1{{end}} +

+
+
+
+ + +
+
+ +
+
+
+
+
+

+ Informations personnelles

+

Informations générales sur le bénéficiaire.

+
+
+
+ {{if .ViewState.beneficiary.Data.email}} +
+
Email
+
{{.ViewState.beneficiary.Data.email}}
+
+ {{end}} + {{if .ViewState.beneficiary.Data.phone_number}} +
+
Téléphone
+
{{.ViewState.beneficiary.Data.phone_number}}
+
+ {{end}} + {{if .ViewState.beneficiary.Data.birthdate}} +
+
Date de naissance
+
{{(timeFrom .ViewState.beneficiary.Data.birthdate).Format + "02/01/2006"}}
+
+ {{end}} + {{if and .ViewState.beneficiary.Data.gender (ne .ViewState.beneficiary.Data.gender "0")}} +
+
Genre
+
{{genderISO5218 .ViewState.beneficiary.Data.gender}}
+
+ {{end}} + {{if .ViewState.beneficiary.Data.address}} +
+
Adresse
+
{{.ViewState.beneficiary.Data.address.properties.label}}
+
+ {{end}} +
+
+
+
+ +
+
+
+
+
+ + +
+ +
+ +
{{template "beneficiary_journeys" .}}
+
{{template "beneficiary_vehicles" .}}
+
{{template "beneficiary_events" .}}
+
{{template "beneficiary_files" .}}
+
{{template "beneficiary_notes" .}}
+
+
+
+
+ +
+
+

Actions réalisées

+

Aucune action réalisée pour le moment

+
+
+
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/beneficiaries/list.html b/themes/spie06/web/layouts/beneficiaries/list.html new file mode 100644 index 0000000..da8bbad --- /dev/null +++ b/themes/spie06/web/layouts/beneficiaries/list.html @@ -0,0 +1,166 @@ +{{define "content"}} +
+

Bénéficiaires

+ +
+
+

+
+ +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + +
+ Nom + + Téléphone + + Adresse + + Labels + + Modifier +
+
+ + +
+
+
+ +
+
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/beneficiaries/update.html b/themes/spie06/web/layouts/beneficiaries/update.html new file mode 100644 index 0000000..da1b4c9 --- /dev/null +++ b/themes/spie06/web/layouts/beneficiaries/update.html @@ -0,0 +1,184 @@ +{{define "content"}} + +
+

Modifier un bénéficiaire

+
+ +
+
+
+
+
+

Informations obligatoires

+

Informations personnelles sur le bénéficiaire obligatoires + pour créer son profil dans PARCOURSMOB

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+
+ +
+
+
+

Informations optionnelles

+

Autres informations de profil optionnelles

+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ + + + +
+
+
+
+
+
+
+

Paramètres

+

Paramètres liés au bénéficiaire, utiles pour exploiter les fonctionnalités de PARCOURSMOB

+
+
+ + {{ $fieldName := "address" }} + {{ template "address_autocomplete" (dict "FieldName" $fieldName "Address" .ViewState.Data.address) }} + + +
+
+
+ +
+

Certains champs de sont pas valides.

+ + + + +
+
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/dashboard/_partials/agenda-widget.html b/themes/spie06/web/layouts/dashboard/_partials/agenda-widget.html new file mode 100644 index 0000000..c63ce4b --- /dev/null +++ b/themes/spie06/web/layouts/dashboard/_partials/agenda-widget.html @@ -0,0 +1,29 @@ +{{define "agenda_widget"}} +
+
+
+

Prochains dispositifs

+
+ +
+ + + + + +
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/dashboard/_partials/beneficiaries-widget.html b/themes/spie06/web/layouts/dashboard/_partials/beneficiaries-widget.html new file mode 100644 index 0000000..dcf45cc --- /dev/null +++ b/themes/spie06/web/layouts/dashboard/_partials/beneficiaries-widget.html @@ -0,0 +1,31 @@ +{{define "beneficiaries_widget"}} +
+
+
+

Bénéficiaires

+

Derniers bénéficiaires ajoutés

+
+ +
+ + + + + +
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/dashboard/dashboard.html b/themes/spie06/web/layouts/dashboard/dashboard.html new file mode 100644 index 0000000..10c1e7f --- /dev/null +++ b/themes/spie06/web/layouts/dashboard/dashboard.html @@ -0,0 +1,77 @@ +{{define "content"}} + +
+

Tableau de bord

+
+
+

Statistiques de votre organisation

+ +
+ +
+
+ + + {{template "beneficiaries_widget" .ViewState.beneficiaries}} + {{template "agenda_widget" .ViewState.events}} + + +
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/directory/home.html b/themes/spie06/web/layouts/directory/home.html new file mode 100644 index 0000000..da927c1 --- /dev/null +++ b/themes/spie06/web/layouts/directory/home.html @@ -0,0 +1,23 @@ +{{define "content"}} +
+

Répertoire des solutions

+ +
+
+

+
+
+ +
+
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/group/settings.html b/themes/spie06/web/layouts/group/settings.html new file mode 100644 index 0000000..c693377 --- /dev/null +++ b/themes/spie06/web/layouts/group/settings.html @@ -0,0 +1,129 @@ +{{define "content"}} +
+
+
+ +
+

{{.ViewState.group.Data.name}}

+
+
+
+ +
+
+
+
+
+
+
+

+ Paramètres de l'organisation

+

Paramètres généraux de l'organisation

+
+ {{template "groups_members" .}} + +
+
+
+ +
+ + +
+ +
+ + {{template "groups_admins" .}} +
+
+
+
+
+

Modules activés

+ +
+
+
+
+ +
+
+ +

Gestion des bénéficiaires assignés à sa propre organisation. +

+
+
+
+
+ +
+
+ +

Trouver des solutions et organiser les déplacements de ses bénéficiaires.

+
+
+
+
+ +
+
+ +

Trouver et réserver des véhicules pour ses bénéficiaires. +

+
+
+
+
+ +
+
+ +

Gérer les véhicules et réservations (pour les gestionnaires de flottes) +

+
+
+
+
+ +
+
+ +

Agenda des dispositifs pour les bénéficiaires (sessions permis, événements, ...) +

+
+
+
+
+ +
+
+ +

Administration générale de la plateforme PARCOURSMOB. Créer, ajouter des organisations et administrateurs. +

+
+
+
+
+
+ +
+
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/journeys/_partials/journeys-all.html b/themes/spie06/web/layouts/journeys/_partials/journeys-all.html new file mode 100644 index 0000000..c340373 --- /dev/null +++ b/themes/spie06/web/layouts/journeys/_partials/journeys-all.html @@ -0,0 +1,105 @@ +{{define "journeys_all"}} +
+ {{ if gt (len .ViewState.carpools) 0}} + {{$carpool := (index .ViewState.carpools 0)}} +
+
+ {{.IconSet.Icon "tabler-icons:car" "h-6 w-6 inline-flex mr-4"}} Covoiturage + {{if $carpool.days.monday}} + entre {{$carpool.outward.monday.mintime}} et {{$carpool.outward.monday.maxtime}} + {{else if $carpool.days.tuesday}} + entre {{$carpool.outward.tuesday.mintime}} et {{$carpool.outward.tuesday.maxtime}} + {{else if $carpool.days.wednesday}} + entre {{$carpool.outward.wednesday.mintime}} et {{$carpool.outward.wednesday.maxtime}} + {{else if $carpool.days.thursday}} + entre {{$carpool.outward.thursday.mintime}} et {{$carpool.outward.thursday.maxtime}} + {{else if $carpool.days.friday}} + entre {{$carpool.outward.friday.mintime}} et {{$carpool.outward.friday.maxtime}} + {{else if $carpool.days.saturday}} + entre {{$carpool.outward.saturday.mintime}} et {{$carpool.outward.saturday.maxtime}} + {{else if $carpool.days.sunday}} + entre {{$carpool.outward.sunday.mintime}} et {{$carpool.outward.sunday.maxtime}} + {{end}} + (Temps trajet : {{divideFloat64 $carpool.duration 60.0 | printf "%.0f"}} Minutes) +
+
+ + RIDYGO + +
+
+ +
+ + {{$carpool.from.address}}, {{$carpool.from.city}} + + {{$.IconSet.Icon "hero:outline/chevron-right" "h-3 w-3 stroke-gray-800 m-2"}} + + {{$carpool.to.address}}, {{$carpool.to.city}} + +
+ +
+ Conducteur : + + {{$carpool.driver.alias}} + +
+ +
+ +
+ + + {{end}} + + {{ if gt (len .ViewState.journeys.Journeys) 0}} +
+
+ {{.IconSet.Icon "tabler-icons:bus" "h-6 w-6 inline-flex mr-4"}} + {{(timeFrom (index .ViewState.journeys.Journeys 0).Departure).Format "15:04"}} - {{(timeFrom (index .ViewState.journeys.Journeys 0).Arrival).Format "15:04"}} + ({{(index .ViewState.journeys.Journeys 0).Duration.Minutes | printf "%.0f"}} Minutes) +
+
+
+
+ {{$firstwalk := true}} + {{range (index .ViewState.journeys.Journeys 0).Sections}} + {{if eq .Type "street_network"}} + + {{$.IconSet.Icon "tabler-icons:walk" "h-4 w-4 stroke-gray-800"}} + + {{if $firstwalk}} + {{$firstwalk = false}} + {{$.IconSet.Icon "hero:outline/chevron-right" "h-3 w-3 stroke-gray-800 m-2"}} + {{end}} + {{end}} + {{if eq .Type "public_transport"}} + + {{if eq .Display.Network "Antibes - Envibus"}}Envibus{{else}}{{.Display.Network}}{{end}} Ligne {{.Display.Label}} + + {{$.IconSet.Icon "hero:outline/chevron-right" "h-3 w-3 stroke-gray-800 m-2"}} + {{end}} + {{end}} +
+ +
+
+ +
+ + {{end}} + + +
+
+ {{.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 +
+
+
+
+ +
+
+{{end}} \ No newline at end of file diff --git a/themes/spie06/web/layouts/journeys/_partials/journeys-carpool.html b/themes/spie06/web/layouts/journeys/_partials/journeys-carpool.html new file mode 100644 index 0000000..1a0a198 --- /dev/null +++ b/themes/spie06/web/layouts/journeys/_partials/journeys-carpool.html @@ -0,0 +1,56 @@ +{{define "journeys_carpool"}} + +{{ if eq (len .ViewState.carpools) 0}} +

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 +
+
+
+
+
+ + + + + + + + + + + {{range .ViewState.vehicles}} + + + + + + + {{end}} + +
VéhiculeNuméroGestionnaireLieu
{{.Data.name}}{{.Data.licence_plate}}COOPGO{{if .Data.address}}{{.Data.address.properties.label}}{{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
+
+
+ + +
+
+{{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

+
+
+ + {{ $departureField := "departure" }} + {{ $departureLabel := "Départ" }} + {{ $departure := .ViewState.departure }} + {{ template "address_autocomplete" dict "FieldName" $departureField "FieldLabel" $departureLabel "Address" $departure }} + + {{ $destinationField := "destination" }} + {{ $destinationLabel := "Destination" }} + {{ $destination := .ViewState.destination }} + {{ template "address_autocomplete" dict "FieldName" $destinationField "FieldLabel" $destinationLabel "Address" $destination }} + + +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ + +
+
+
+
+
+ {{if .ViewState.searched}} +
+
+
+
+
+ + +
+ +
+ +
{{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 + + + + + + + + + + + +
+
+ + +
+ +
+
+ {{ 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}} +
+ +
Réservé par
+
+ {{if .ViewState.booking.Data.booked_by.user}} + + + {{.ViewState.booking.Data.booked_by.user.display_name}} + + {{end}} +
+
+ {{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}} + +
+ + + + + + + + + + + {{range .ViewState.documents}} + + + + + + + {{end}} + + + + +
Type + Actions +
+
+ {{index $.ViewState.file_types_map .Metadata.Type}} +
+
+

{{.Metadata.Name}}

+
{{.LastModified.Format "02/01/2006"}} + + + +
+
+ + {{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

+
+ +
+
+
+
+
+ + + + + + + + + + + + + {{range .ViewState.bookings}} + + + + + + + + + {{end}} + + +
+ Type + + Beneficiaire + + Dates + + Actions +
+
Voiture
+
+
+
+
Du {{(timeFrom .Startdate).Format "02/01/2006"}} au {{(timeFrom .Enddate).Format "02/01/2006"}}
+
+ Voir +
+
+
+
+
+
+ + +{{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

+
+
+ +
+ + +
+ + + + +
    + + + + +
+
+
+ + + +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ {{template "vehicle_type_select" .}} + + +
+
+
+
+
+ {{if .ViewState.searched}} +
+

Véhicules disponibles

+
+
+
+ + + + + + + + + + + + {{range .ViewState.search.vehicles}} + + + + + + + + {{end}} + +
VéhiculeNuméroGestionnaireLieu + Réserver +
{{.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}} + +
+
+
+
+
+ {{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"}} +
+
+
+
+
+ + + + + + + + + + + + + {{range .ViewState.bookings}} + + + + + + + + + {{end}} + +
+ Statut + + Type + + Numéro (Immat / Bicycode) + + Beneficiaire + + Dates + + Actions +
+ {{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}} \ 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

+ + +
+
+
L
+
M
+
M
+
J
+
V
+
S
+
D
+
+
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+{{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"}} +
+ + +
+ + +
    + +
  • + + 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"}} +
+
+
+
+
+ + + + + + + + + + + + {{range .ViewState.vehicles}} + + + + + + + + {{end}} + +
+ Numéro (Immat / Bicycode) + + Type + + Modèle + + Lieu + + Actions +
+
{{.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}} \ 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.

+
+
+ + + +
+
+
+
+
+
+
+ + {{if .ViewState.booking.Data.booked_by}} + +
+
Prescripteur
+
+ {{if .ViewState.booking.Data.booked_by.user}} + + + {{.ViewState.booking.Data.booked_by.user.display_name}} + + {{end}} + {{if .ViewState.booking.Data.booked_by.group}}{{.ViewState.booking.Data.booked_by.group.name}}{{end}} +
+
+ {{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 +
+
+
+ +
+ +
+
+
+
+
Date de retour
+
+
+
{{(timeFrom .ViewState.booking.Enddate).Format "02/01/2006"}}
+ Modifier +
+
+
+ +
+ +
+
+
+
+
Indisponible à partir du
+
+
+
{{(timeFrom .ViewState.booking.Unavailablefrom).Format "02/01/2006"}}
+ Modifier +
+
+
+ +
+ +
+
+
+
+
Sera à nouveau disponible le
+
+
+
{{(timeFrom .ViewState.booking.Unavailableto).Format "02/01/2006"}}
+ Modifier +
+
+
+ +
+ +
+
+
+

Documents

+ {{if eq (len .ViewState.documents) 0}} +

Aucun document

+ {{end}} + + + {{if gt (len .ViewState.documents) 0}} + +
+ + + + + + + + + + + {{range .ViewState.documents}} + + + + + + + {{end}} + + + + +
Type + Actions +
+
+ {{index $.ViewState.file_types_map .Metadata.Type}} +
+
+

{{.Metadata.Name}}

+
{{.LastModified.Format "02/01/2006"}} + + + +
+
+ + {{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

+
+
+
+
+ + +
+
+ {{template "vehicle_type_select" .}} +
+
+ + +
+
+
+
+
+
+
+
+

Informations pratiques

+

Informations pratiques pour la réservation

+
+
+ {{ $fieldName := "address" }} + {{ template "address_autocomplete" dict "FieldName" $fieldName }} + +
+ +
+ +
+
+
+
+
+ +
+

Certains champs de sont pas valides.

+ + + + +
+ +
+{{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}} + + {{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

+
+
+
+
+ + +
+
+ {{template "vehicle_type_select" .}} +
+
+ + +
+
+
+
+
+
+
+
+

Informations pratiques

+

Informations pratiques pour la réservation

+
+
+ {{ $fieldName := "address" }} + {{ template "address_autocomplete" (dict "FieldName" $fieldName "Address" .ViewState.vehicle.Data.address) }} + +
+ +
+ +
+
+
+
+
+ +
+

Certains champs de sont pas valides.

+ + + + +
+
+
+{{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

+ + + +
+ +{{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 `