From 7512f2e5ee714f8bf0f3acdbe4e437456b8c4e3c Mon Sep 17 00:00:00 2001 From: Arnaud Delcasse Date: Sun, 6 Nov 2022 18:19:13 +0100 Subject: [PATCH] Initial commit --- README.md | 26 + config.yaml | 208 ++ emails/auth/retrieve-password.html | 5 + emails/layout.html | 62 + emails/onboarding/existing-administrator.html | 4 + emails/onboarding/existing-member.html | 4 + emails/onboarding/new-administrator.html | 5 + emails/onboarding/new-member.html | 5 + emails/onboarding/support_emailing.html | 4 + web/assets/css/main.css | 19 + web/assets/js/main.js | 6 + web/fonts/bitter.ttf | Bin 0 -> 90628 bytes .../_partials/address_autocomplete.html | 48 + web/layouts/_partials/files_list.html | 31 + web/layouts/_partials/mainmenu.html | 19 + .../_partials/group_members.html | 47 + .../_partials/groups_admins.html | 49 + web/layouts/administration/create_group.html | 142 + web/layouts/administration/display_group.html | 140 + web/layouts/administration/home.html | 124 + web/layouts/agenda/create-event.html | 217 ++ web/layouts/agenda/display-event.html | 140 + web/layouts/agenda/home.html | 114 + web/layouts/auth/groups.html | 40 + web/layouts/auth/lost-password-init.html | 40 + .../auth/lost-password-recover-ko.html | 26 + web/layouts/auth/lost-password-recover.html | 41 + web/layouts/auth/onboarding-ko.html | 26 + web/layouts/auth/onboarding.html | 54 + .../_partials/beneficiary-events.html | 4 + .../_partials/beneficiary-files.html | 135 + .../_partials/beneficiary-journeys.html | 38 + .../_partials/beneficiary-notes.html | 108 + .../_partials/beneficiary-vehicles.html | 39 + web/layouts/beneficiaries/create.html | 184 + web/layouts/beneficiaries/display.html | 152 + web/layouts/beneficiaries/list.html | 166 + web/layouts/beneficiaries/update.html | 184 + .../dashboard/_partials/agenda-widget.html | 29 + .../_partials/beneficiaries-widget.html | 31 + web/layouts/dashboard/dashboard.html | 77 + web/layouts/directory/home.html | 23 + web/layouts/group/settings.html | 129 + .../journeys/_partials/journeys-all.html | 105 + .../journeys/_partials/journeys-carpool.html | 56 + .../journeys/_partials/journeys-others.html | 38 + .../_partials/journeys-public-transit.html | 81 + web/layouts/journeys/search.html | 120 + web/layouts/layout.html | 178 + web/layouts/support/support.html | 27 + web/layouts/vehicles/booking-display.html | 201 ++ web/layouts/vehicles/bookings-list.html | 68 + web/layouts/vehicles/search.html | 237 ++ .../_partials/bookings-list.html | 77 + .../_partials/calendar.html | 259 ++ .../_partials/vehicle-type-select.html | 105 + .../_partials/vehicles-list.html | 56 + .../vehicles_management/booking-display.html | 276 ++ .../vehicles_management/bookings-list.html | 25 + .../vehicles_management/fleet-add.html | 106 + .../vehicles_management/fleet-display.html | 90 + .../vehicles_management/fleet-update.html | 106 + web/layouts/vehicles_management/overview.html | 45 + web/public/css/main.css | 2889 ++++++++++++++++ web/public/images/main_logo.svg | 1 + .../images/parcoursmob_logo_bluered.svg | 1 + .../images/parcoursmob_logo_whitered.svg | 1 + web/public/js/main.js | 2995 +++++++++++++++++ web/tailwind.config.js | 23 + 69 files changed, 11111 insertions(+) create mode 100644 README.md create mode 100644 config.yaml create mode 100644 emails/auth/retrieve-password.html create mode 100644 emails/layout.html create mode 100644 emails/onboarding/existing-administrator.html create mode 100644 emails/onboarding/existing-member.html create mode 100644 emails/onboarding/new-administrator.html create mode 100644 emails/onboarding/new-member.html create mode 100644 emails/onboarding/support_emailing.html create mode 100644 web/assets/css/main.css create mode 100644 web/assets/js/main.js create mode 100644 web/fonts/bitter.ttf create mode 100644 web/layouts/_partials/address_autocomplete.html create mode 100644 web/layouts/_partials/files_list.html create mode 100644 web/layouts/_partials/mainmenu.html create mode 100644 web/layouts/administration/_partials/group_members.html create mode 100644 web/layouts/administration/_partials/groups_admins.html create mode 100644 web/layouts/administration/create_group.html create mode 100644 web/layouts/administration/display_group.html create mode 100644 web/layouts/administration/home.html create mode 100644 web/layouts/agenda/create-event.html create mode 100644 web/layouts/agenda/display-event.html create mode 100644 web/layouts/agenda/home.html create mode 100644 web/layouts/auth/groups.html create mode 100644 web/layouts/auth/lost-password-init.html create mode 100644 web/layouts/auth/lost-password-recover-ko.html create mode 100644 web/layouts/auth/lost-password-recover.html create mode 100644 web/layouts/auth/onboarding-ko.html create mode 100644 web/layouts/auth/onboarding.html create mode 100644 web/layouts/beneficiaries/_partials/beneficiary-events.html create mode 100644 web/layouts/beneficiaries/_partials/beneficiary-files.html create mode 100644 web/layouts/beneficiaries/_partials/beneficiary-journeys.html create mode 100644 web/layouts/beneficiaries/_partials/beneficiary-notes.html create mode 100644 web/layouts/beneficiaries/_partials/beneficiary-vehicles.html create mode 100644 web/layouts/beneficiaries/create.html create mode 100644 web/layouts/beneficiaries/display.html create mode 100644 web/layouts/beneficiaries/list.html create mode 100644 web/layouts/beneficiaries/update.html create mode 100644 web/layouts/dashboard/_partials/agenda-widget.html create mode 100644 web/layouts/dashboard/_partials/beneficiaries-widget.html create mode 100644 web/layouts/dashboard/dashboard.html create mode 100644 web/layouts/directory/home.html create mode 100644 web/layouts/group/settings.html create mode 100644 web/layouts/journeys/_partials/journeys-all.html create mode 100644 web/layouts/journeys/_partials/journeys-carpool.html create mode 100644 web/layouts/journeys/_partials/journeys-others.html create mode 100644 web/layouts/journeys/_partials/journeys-public-transit.html create mode 100644 web/layouts/journeys/search.html create mode 100644 web/layouts/layout.html create mode 100644 web/layouts/support/support.html create mode 100644 web/layouts/vehicles/booking-display.html create mode 100644 web/layouts/vehicles/bookings-list.html create mode 100644 web/layouts/vehicles/search.html create mode 100644 web/layouts/vehicles_management/_partials/bookings-list.html create mode 100644 web/layouts/vehicles_management/_partials/calendar.html create mode 100644 web/layouts/vehicles_management/_partials/vehicle-type-select.html create mode 100644 web/layouts/vehicles_management/_partials/vehicles-list.html create mode 100644 web/layouts/vehicles_management/booking-display.html create mode 100644 web/layouts/vehicles_management/bookings-list.html create mode 100644 web/layouts/vehicles_management/fleet-add.html create mode 100644 web/layouts/vehicles_management/fleet-display.html create mode 100644 web/layouts/vehicles_management/fleet-update.html create mode 100644 web/layouts/vehicles_management/overview.html create mode 100644 web/public/css/main.css create mode 100644 web/public/images/main_logo.svg create mode 100644 web/public/images/parcoursmob_logo_bluered.svg create mode 100644 web/public/images/parcoursmob_logo_whitered.svg create mode 100644 web/public/js/main.js create mode 100644 web/tailwind.config.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..a1e283a --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# PARCOURSMOB default theme + +This is the default theme for PARCOURSMOB inclusive mobility platform. + +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 inside the web/ directory : + +``` +npx esbuild assets/js/main.js --bundle --outfile=public/js/main.js +``` \ No newline at end of file diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..4481431 --- /dev/null +++ b/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/emails/auth/retrieve-password.html b/emails/auth/retrieve-password.html new file mode 100644 index 0000000..0bc2260 --- /dev/null +++ b/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/emails/layout.html b/emails/layout.html new file mode 100644 index 0000000..6ac319a --- /dev/null +++ b/emails/layout.html @@ -0,0 +1,62 @@ +{{define "main"}} + + + + + +
+ PARCOURSMOB +
+
+ {{template "content" .}} +
+ + +{{end}} \ No newline at end of file diff --git a/emails/onboarding/existing-administrator.html b/emails/onboarding/existing-administrator.html new file mode 100644 index 0000000..ba0fe56 --- /dev/null +++ b/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/emails/onboarding/existing-member.html b/emails/onboarding/existing-member.html new file mode 100644 index 0000000..f90cd72 --- /dev/null +++ b/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/emails/onboarding/new-administrator.html b/emails/onboarding/new-administrator.html new file mode 100644 index 0000000..53687a3 --- /dev/null +++ b/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/emails/onboarding/new-member.html b/emails/onboarding/new-member.html new file mode 100644 index 0000000..3c230aa --- /dev/null +++ b/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/emails/onboarding/support_emailing.html b/emails/onboarding/support_emailing.html new file mode 100644 index 0000000..40ea8c7 --- /dev/null +++ b/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/web/assets/css/main.css b/web/assets/css/main.css new file mode 100644 index 0000000..15ab027 --- /dev/null +++ b/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/web/assets/js/main.js b/web/assets/js/main.js new file mode 100644 index 0000000..0b0b059 --- /dev/null +++ b/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/web/fonts/bitter.ttf b/web/fonts/bitter.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3b66905adfd60bb56d8abf34c21d6324f5b01222 GIT binary patch literal 90628 zcmeFad3;>Ol{Q>;Tdh`WYqh#ttzE5d?fc%AEnAWoc@egRZP}8IkqutiY%mzJ1&7T* zNWc@~gpe6Lc|#JCnZc8g1RDmJAp=Qf5*)H83^J%FR(y!Go=e0}JW7nE-K z2!3abt!wW(oVl<|DQ7#L+PY!s>d9Y!{Chb{Z&;yJ&dG}}-?ndb-N!D*^)I5r=Po{Q zbxiN^{fAP%dvJez=e}K+XHI=2iQmUj-~L_O_U}_ZRi%`_2G?_UU3T5h!{Z&l!tV~H z3$EV1{qlo9_=mdtm2N$zRKq8C@7T8e5AS|*xzZ&c!~K1`QQ-SV#!CEt3BPN0Uw-w$ zo@I@nQo0mBGt{L!uDT*)X-0+8mH4e*yln5q+aB6{;m`5=n`onR`L=`mJS7>Ml#YED z*JD>~yL`v9AG&@Ye*YeAjP2XI|LSjjwEcRZq8RsoX5Upi_8tDa&wNhlrhi5Izov-0 zY*ndRl)h}+)mNx2ycB=4vvNiA{V2n&a%3n+&RO{VHMuj0CofXF)fMV$b-g;I?ojur zzfd1iA61`Jf2ST(C)G15Pu0wRSJlq`Z&inL)9f!*GvL>^xXV#qRio&@N7Vv z`B#o#fbAS*z;M(+2dk34LvmzP6*Uo#;uo>QTMuaZ=4guji`;YCtVii_{=` zFsv4wDGv)V=CHbp(|Aes#b4fI6x^ z2pWDseONuHKBE3o{grx19aDb|s{UWeK3P)Zc>AA63WI->c84 z&w}PZr#`Q~pdMEzK>bgsC)Gcwr_|HngMU;RdLMc+32b^XLhr(R|4PkjuP)J@da+)o zx9NlWUHUJa=beA^-0ykB^Q7mQSU6T1tBl2Cb+L}v{Mgdi)v>>+j#t;kop@$E5HF0E z#w+8^@fGo{@g22a`J)5QC9SaLV{XmEdad4ynr}kQ&pF>s)f|cy$I4?dsk#50nuBv{ z-j15}?Ck81Knv}&|1|p#v!9xM|LkqE*UavjT{k;6J22xv`-ihj&bGh##MzS5&!7I{ z>1R*>)9I&AfBy8}oqqWAfzyMpeC3tTy!?xozy9(oFTecqcV7PH%U^o=Z(jbu%YX5M zHt+9UdPlSWU;q36@%{fTzM+R92{u7W>;zA)$9QJXma4Fmrvi|4*&YWn3yh&!Mju!H z@yWl}`h8Q6>)G2MS4%5SK%#l3FKm4rx;hqHwrA;ay%j&478Ep91M;-QMvi-GN7haz zreb%;?q0e5?$}6d_qOfFGiv3G3p?(fYL6XP>n8W$-}RH#$A_lMQs9oMsrjfUgZ1DM z+f?v*zPs#h^uzuAxO(Po z1zNqmV8|^1CQt`3vFveuXdIQ{l&CIaL83ZQjdo5g#k>72qw6M@p{3PRtz;|*IwK#_ zApmF^dhdtMuc1!@3Pa&(KY<&(uLCN0T=`DnXn$Pgy);Z6mEt+~yFuHxEGYLIdrQiFwDrz70Kynu;y@ijSM7c*51q=Hh zS7oS7p;Fa;67903MJSEnbs4zVi_S*mUX~WJi72HmE|k(jlm=0ng;GCo9YpC#=w|~x zu5xib=M)aSAun~EdOJ&=FTnKxt_N^E1YPcv=c&d5{F9=S7$JBx8=G43pNOHV@6 zoA#ZA#<$N@rs}D3+X;kb*b$5nsS%Fg+}?R{ndr^HTP!Jf0sB$Lb2<8$i$2=7JgzE8 zEVx>Mt6^L%02~2ah;ta{D9*fAigP*6Wf-(jZ+EiWCr2dV>&B5t%Hfu8x;8Q%If7&F z!O&GV6pa@h!Ex!;q4Cg>kiK#FLHrFL8U7UhhL0RMLVId>_GDH3iOgB;!Sb&b{39j{! zX;4Q}wZoEYCrUgp3cC%Wd;p?2oGl8)eYg(%dE`a`{PxCD08MhEH_;n!bJ}%pceJRx zYmw92)0P1lknHV_6jgye>+2Hn%t*L010unv7mP+)8{;|Ak#KE)Wp{m1$MSW{JEliR zM+b|%10`*}y@Ty5)~;yZw&tE&yjlJX|FH|gxzTtu(NI~|w50F6jX76enHkMGx+&b1 zNHkWJHx6};ZOtdYd*M_3&iTFb9QZegv8z|@dN*YU$nPZ?2>4OJS1rZ}&XKAWj3``o zfGy2i?gb%9FX`d%UIl!4c;yf(WdWs50Jrl@Vh`Y4j57(m3Flgz+fs5XmtzVWopMVC zS+hXTDJW$@sTp;-!@~jyL_R{9k%3Bch1NWvwG2Rz1At0#E&kF8Sn}rA3E1+U*UiZ0 zKrWTxz{q+bjQl``-~8~xTZrJ0D_$@`1c&^{fdrwyAV0D}Fr_3KRzTkcdwslTH02!abjYNuDAk!XRmyF2{qdY#{B@sy;1e)GBdcs{RJ3j8P0JF zbO>;ga#1N6|3Z<+h4PCU0hA%-WuS}7Q;=f7cwAVPw9tUjP$+?yh%xX1>I7uflq*rw z!<|-=Cqa%zEI+R5p>N@EqXGp%nujYb@=6NL3cMhKYGZPp!`%aj!|H*{;5FUZa1K{) zhTo=zV@u3UUWkWwIAJb(uZMT1w`ee6!i>kDZu5wqu5>JmfWHs55zlubVX$(a zQ+LaOYxbAcH3jm6jWxyB?+vxKHsqCiha!zbH-&53%XHskhs(R_qpOA&kLXng_w2uX zYrMZT=FiHA*7PJcPi6XZGP3U(59}&#tPBnuxhb6JtQ=Ulg!04)ht%d;bl_5i;flG>O4qEmpJ3xxerHmaR z+?LIPY~^1x1)bEL4+K>@(F9Sm$a!tkiuI9(`8885gAJij!=T66JNvGII}g9Bd*OlW zZ(TKd)7ASGy`oYzD{Wa0+XQW4JJ=p73BElS=S;LKIEPSNF(5sZcI2=fIi?++?n+N2 zobUJ&i_nfby-D8RIM_T@)880b?{NnAUvtx{mA77h?ZWPN9lmqmU2yrJtMo(qQs))$ zcCmWA1g~x{PPc*TnQftJ=D83m0PNcjT3LxhIGcpi$RE^!zk~Du=kS(H+#;gHqrL}L zca;DD-bY(UO8OuN1o(pm`p^(Vl0~Rht{t$z=j~%fauX^#AV8>HCwL( zrd=f?pcBUV<~xNzEF^c1J2pA!KMfq7vnbl{gEdCc?nPl13VkU;bg4sRaSn!*dV&Tj zRWt9FDu7C8I_NrBF_A=X*Y_vB_q~Z9j{lJVqYVwSI}yLQ1>>?F57HpuXz_iyG_VJu z9>#D?tBM$=usQlR#DDgM0_-&I@(Yx6*TAzKWH>j7*i}GK$gPTIjT0TSvxwZt{U{{ zo|(^4&sZI@5;`PXMRbq`F*?u;1}Fd+!vP-gATZ@p@{k1rmXco(073`N$Ps7C3kXlA z8suUjtsT;1YAig{hmb4py%6aR!flRu^+ur@G^h{UIAS=G?3o4j%rdvEK;wna`Ylig zsxmy-V;=WNg>qA>!g;7{#XD5US7qZ>*{EH2RXUM^>UgjqQ~_M&k1d;CP&V`C z>=j4XEEzt3e3|oH^TyjIXWplG>)kUSn)%gT@4M&L+c8LCjOTwa0-)aW1pa}9RvFEZ z%U~nYGF=U_m2o$KW_l}n%SrSrLuErXS~|+2l+2oAJ-K5H!lGEGM$G_Ql8G~62U2-Zm6e@B;d+=S;7>myjAiPdaeNEMPjF=LbwvQ=y$39Cy8*l~A<7Vw zDKk`ZF-uW3-B{zcSo8*o-ryYcROJZX{GhlCqOVXEs3eFt=V5$GQ8(RWW8JKj`|!Yg3ru17rPe#3=>d2V_6;Gl8!{c) z0lJdQMHV<<0iOZ9i1UUK%MF_cb_zadxAx%`BRGVqH<;JZn$3Xn!XyV@wF9rY#=hz> z0BOKAsOxr99|Q4WU_Dj2+nS>&(ObHEMR_OU0Vh$9a0u9kD!n?=y5sh-*owiIu?ec=mVjZJ$#u8unro z=BQY=9n`cWy>SbiB0yRwu)wQyK3VdD0rH@5;-IcLh&K-6jUzH1huafZnY=3iK&ouF zz?cR0THsLvV9r9kBaYF7H31DltBba5Tt%fU4^lfDt!+t_w7}2~<2S=4c-00$6Mz~5 zpvNfaqhXG?43PK&bEvVL1?8khn)m@#E-#{bpxFnB0n(y7Momp+KogsO^kT!cezywgyJ2Qv;r zChT0qJaLBwHVVh1yOXxEg93!CG61Jw3^QchiFn6Pxa+&Y$X^zpkgmmy@5F zJKnl@U|Wflx6SCIW^r(WZPn2q}XH>6}6rx~#Jd95{hPy0@M< zXRnr7U{Y9vtTTd}HrN}d?DbU^*d#Ye zojeIU(v_$MG%2q{8x;Wlkj{*oQjRh%vsWD!D4;ClFd{cVM$f?&BNQ1ki~~dUGJ5%> z#3YbUO<0WLHWXXEdyZk4*1JZM!50I*8Da`SZRP_*)U7OGB!bsMfRJ(E1`4h*!iHk1 zNdA+4++j;sV%Vl|Na+;iBs;ZA00#Yh_Qq=g9L6CxPI9n$BOgaBp)2ZZ(+Cx01oR@$ z+_9qX350L? zRreIuRhRpn=d#BgPia$kPir9G9}M^_l4D(6>jvU2=kHs(<$=owW_DIyymiIk;mn*| zjFpB>r}R(2uUYDQ4BNWWY$ZTx@H7FAl56tPR^lZiBq)xILkByN4zTr#J$z&n3glT@ zk5bzO7MO1VJ|vfZW&snaG1e&k?aV*Tl<5$W9cu?#i=Ck9$}(fEhN>evp{sofuRcBV z+x^-<^LlvHd2;mZz0O6`kPKa*>2lC?6)0k!ev`&?p^;n10ZQ|f0qD zq@|fQBFK-)Hf?6*JUw;o8o_vSr^of<81!-qOX^x9!>ei*U)bM2HBeRA-WKRzcVe)I)(Ax`chxn*l^qGc~up?D_iRpHkbR#SIpmh;l(ps zYX%~rp7s5U7U|5E^V|CR+DdB6OEB1u#OFz)m~7BnIZ;w>|qf)yB% zX%r)T|2t88u7o{j%+nDGI$-}Z>3XNN>8>*XLj^?`L03**2S7&UZVPO%l5@EQysFmR z6Ey&}Vhf1A1)`QZk~QBY3Ku;uHuZQB{3t@&iu;;WUB$L8zXetZ!A9ft$x4m+n2bT4 z@1YVk!Fl6}gp3Q17=2M+^0BtKw;&PjT{ABc@oR0w^Vt0Ay2Tqi2d9Us+cq8kxQOT4 zkx({db4FQnZ*QBC&1Jo7y1Um6#9GF$TzbI+R}AQfDz{#^V(=DSoFijCia60%_482g z#cK7Rj1=JlPu^;C!#bpo*^c|u{#(j*wEsEqxPdX>!?{Py)=LPG_%4#wDoQf^! zjp0}#A+yhh9(PLH3NbF1LJQ!HJ`KqK&&%UJq*3WmYf11{TSC? z=QwN`&VhNS#2u=^xd+Em9A0wUG5{c1pQLPT$B(OVNJ#KjbH#(?DBeP&584b}((Evk z0Wx5bFjdjaO>-1evuXFy!gQaZv7bq!@*$Cah_-tpwY{~GWBR@sN6%>giHTo~oS{zv zIgwO{oofAIXf+?*J06l3fXW%);Y)m?QE@>+|Ga<~c!666DQj^g_0MOD^v@5Ek3Ty; z{uccFHEy;wqBiyj&Wab=X+cF zk!ywkk+GzB3-H50E|H~7nAu>Eljua62GYDx7p8BH!41t4^r2PvdL!O0;AWqmnQ_KX zJT`G=gxPbBnm{bznDaC6Q;YhvQA(a>#*ZpQ`Iz|-+B6)TcZkViZWz>DB&v~qbBj@p zscGo6WHfDOpe79dpjPDE@(GG)SSXE9nVgI^!J9g(xEP%<`s!^(b7Q_qpG*`c$p&?q z0X-)`lCPuBy6o%UAY7@uHs{+zVCV^Do z7W0eg4b2Q2C=f#d4u%b?ft3hyDx2{Dr}ioY;?$mrL3EKCG0+1zSL3_{148?Kxq0Jq z;>ZToDC|)+05FPqE;()IPcrY+fHE!K!|KtBiaQ^1J6|9Orr`Tg-%59 z+x%+8Q;2=gp-&O2?Km?Qo5Y#IY|uR~#+k_kOL69FSAxBmIB*b*c_*Dw z68ne6YXpEWB-_IX2cx&RZxXiQZXCFeE?+LP!g4Xu!-)>u76l;p7lD%G{tW#WKX2Iu&^H%&q^FqIQHO>!an39jNsUSV5EpP{7j#4s-bXNg(Ak&d#>_hDu>R3Y^yWGv*%RQwA@FIU`8UQDI8m&T_3Lvu_|}Qcu?1iVuN)# zsGa7K>4!evz2%m%v70A5Hm|8&nB%XguFmi4|7hRRcz3XH)#5`XMfI(<%PwBD@ZyoW z+Ya=11ll?}8+*bnIXRULU-;zuySDapZoXxF>*cX{Zc#9&Ke@L9(XIZf{hy6QS1lge zwX&gp)g?;~e;}0k>(bKhNN%pkNbrPn3jSa~73!@|fG(k)Fynx+-)qLqgM?gn6cOCP za6(*yz#ZeIQwZbUr!7J6wLnY&qcXfy8S@||R^Z?)R5lERlVC)=NrXZUN(zJ(X+GpZ z%rYG;Ps&arJYFCom2uPpndHD58^o!yg2D9+(~e47G;_|2MyvM}ga{g*g)_wsBd$nF zN~JcSiI1Y-X&h`Klo}o)i!)kA#aF-{kD>+A;|mPngDNXPYIFh8pV1%UqDih8SwGLB zu20a>-J1+0Ls3koB>ywKs0FrKAVz?icq?v~djbSlGH!t( zd#ONxlNbtAErXE_S;_$ki3ThK!g6u74A)S>dh#LzK-~bA;BeqnQcD_rnGJ~1I6Fd_ z^c*wigs9ya6qztFBgC115E#au2|1kYfU$_6CH!fjhcefD=IjXK;20i00T0;?<=kfD zh(|53!A8m`E~WqLWpEg|$+V&-YJpAmZVHt-gN#uN*7qhQS4VusgeSsuojN&-W7se; zabo{P*W9vZ_3ZXNM>bB5j*g5Ebq|D{@^I2Sx$)iAh3gl7NiX~D{uT3e{Y(9Q$v)bl z4bZn2!N;r7V<%Mt#)6FJF@W;+eFosXY69N73Bo5pi4rds|Bu6dFRcs$gBEyI0OQ(m z$_)BU=od8HZpY&sH!q#yXw)x_aR$veA|}rUxl00xF+g3)wG^NgSYb@LX~f7&J9bOZ z0VO3CxXuDO7VvZ2sQ9ul*u^+RzBdA(D)B;<6hW1U|K`Q5Mc^venacqnugNr3cvP)C zg@>5Q#i>2a!Mb^LaNQR)7CMKS`Y1K97H@9!NesuiKyY7DX+525)YTbDA+O@Y`*iHT+{(FJ{u=+LU9*}lT zc_{M=#Lyut1|G8f3_W7nbVvYZ592WrG$F`3xPcxlWih@-9uSf#f{)V)8F;`iH_{)X z6l%P3>9{tn=elxW~ zsP7Jmt=IBLtqA6{;xQbGyZtF1aCbV4#N`YEHpE+^Id8i`DXHGDcNGUa; zonWG|;JOt+Gj5QXCh}hvez>9RVsbl&)Gq*KE^ll!H+!JxUE4gv-e^p69fAGoCPuo# z)Fv%M*beI6dPFLm8+3eldf+Vrb+~fT%AJ=T*tu{ZG@&ze*0)2^!Z{-K;VZ&_ap&RN zLzy3g#sp&n>q4);0lk)~Uy@Z}nUcQ;#gqbIj7}P7CvXdC5R;f*%)W7DjVrEB0XS`b zFlh@S2_lm-K*jPvu3=&(J6k3`Cvhh2bW+fA2pCO=-wDVIqR$~pg>rM~FmEMi;3f1D zX*x2)hPi}!IMXquDOrXymnDR7(8MglnG(R*GEBB1Q`bg(faDw$(nhF8FPr%h@@^`o z_1Lton3$OP(e%vU4_Lw;2*30a(HB1ZV-ovouch#)7XXhr>d+JT$K({Dsb&@vC~HR< z(JI+FF0->V2c=MBWQe^YG5?21GO{fjy<@L)kp4HPZ$Z6a=2z%TXkt$L&;A&BqQ9KI zL=U39`D*PGP%xCe;*mURwaufpF-%yOz-Kyx&E|(OuEV5b4wNxaUgo;Fx8VIdriT1onydAE0T+F3^?c4_cQw53#k>j{jH!JYB(nYGG(6`q2Z zT?eV!hhqfC1{~s0M*s+uJthF{=R!M?^N8UqZ_3kWtV9TfH2H}15WvqYu-O2dN6CXf z@4EiKvzHkRpzH~vk#5?^=kWt?=M-fS?F*uPLF1yFF<0n#%PkCR5->52sA+&Zg|y0= zY@036Z-L)gV5b0_9ZtRc5&V#@r)F*@ZOKjn{x3=Ct^8)#i?MLB8?i?=qDUkra@@5g z93)C%vLD%vk!Y5czLg*&-JxUz0cPW$CDOch!QVc7@rS+!UYq!vi{{YkOS+x}GxNi_ zyq185$O66OsiP*VPGr_J?Jc7~UEon$!U;xVopg8G3bAA-rjwAoM_`QcZ?BQs^>Lg%uxKi>bWt05_XMgDqL zllGm*IJWsl{%+;)QTIIr;87f|MwC(?glsXyZ!zQ`{26w+0D#y9)>%-@5CEd+i|0eYbM=K$cL>k=p_S7qvs(dYU@DO&9K|mlHpxYl@083a*hoaO z+8qLzE16UhUxBsteH_yEOKE!XwoMjzg8&=8Y9uVpq_;vOy&+h@2k$VY z9;6$}WzH`ZBCJ#h#wvuBEb_poz6ju(IDU)+xbb0ybs<(!7hyC4l9cLK;zpbKL2-%%hw#1YwLu$?!o5Cw$@jQ-ARdmskS)qXD=;J_|9!EQGnU zU|MG(l9*-U_*(#=F$~{lA$*^Om`4_xi%JMcGe2yBy95ByK{L`R$Q8}VWdG19)X;Q z4ne^t-a^L@5qVf+3gTWt+$#_QLh+=CF9DEBn2T0~0~AOtq7W~3&C@|^yxnYprv;!! z1g6j&v6SwBggi|*^ORWW@Rybd&wOw8oz?n=Hq~mq;KdcUCtWJU*KZ7)qKEpynD8S7le#4ZK zTjVks*ag0C02;K|-2%r-93qacGgqi$c`t*3HY3u(>*)NXm!kl&5%5JV4&ie~8zS)yckiLw4VI;(Y>7`3tSf=>0!=Y|`PdN26jVS^= z`*r<_G3oB-=!)O+1^6w{^ZF!%b#4Yv6##t|Ui|_Awm}jTSt6G>j<4EF9khyAvXy{& z3ILyy5)#xnF7bzuXbb=!qBN!l6PBnFV|*oZLJ#h!ria<}{bZPlX7C2Yj|mc5s|?cH zycr_J09dAHfD!}vAV_G$_&{o$WJco{yeq;X$ey&wc4tRCn00ae{04Dp(Jj9PO0C6{ zV*z8Am}D+#3ae+{lRHaMZ(89^wZLT;*Tv!nBMc!5o{(@41?SpkS@xX=4ZuKFfrN*h zEg@O_=SDr^bsDP$7!xTNXx(t_%9U52-_)`3`c?1$OFi_}XSZLWH>|&NTX*LLx14|e z;cdy!>wlj4)y%K%xkp1gijTw?2;#!pLwazd!ebV#Pg~#=F3J!O5fEiVg+RZFeh3GX zp3}WVR5y^GPanwD;-o?7AXl#i@De^@h=8su1i5RPug3tPZ4_gE zh%winHmQ*une{-hwEchuc9|zQ*77Kq-7*DpZm>49Sx2G~PtXKw5u<%-&)#d_`|jb1 ziQ$KrE^XN9fx%t3gkc4_RBC}N3V#ZdEX$cC7GN^CT&lA`)G`M`{vg1hK^^6;+*f3Q zI_qrsEYM3sU&4?KbKq_=m=6r*X4a-Onmd_D9p{Q~F6Dh|Gkms$&5%n`3l!TXG}t$D zC9m95Du6eNdB1keyfG7Dmh}r<;GNW5&CLX|-U3gsVMky6=I8IauXFN-RjaNZYlxZ0#Ledpb7Xa{ki&7Yr2)HrozD*lRhG{1|-SpHImt1>Gan0EBqZ5hl&en;E z(UogQlCDhKy8itgk!24R44fEkg?H*)_S)jUPo(2t%JNhS8{3zSsk zSP@wSPT7)i+~r;ZK*1Gb2~C7k08Zl&Vb@{qKEv|%IVMlwV6)E*dxHY83^nQ86atoyHUSaR9le?2qNl`>>nuPDk5RJ9JZcdhD(%F^^tUFy#Yl*WQh9r4Q674v(> zlNBiUW=?@ss!0bmvZ#9~Q0V2mR|yzbpNo?6Qeh8w zx*$yi=f-2H3C-k*Ow8c%Tu>908zV!E^aN6o9&Uew$&&g+P=9vjh3&VL3_I1sCAXNc z&i2P1+l~k%`Gj+`zeayb)E7BF0OOPvzz{%A1PH~S0w9fl+H(9D0VsUNa+t+njAiU) zkP?ONj8M8ab934myFvwcjDcf1w+!YmybYCvQcevS7njTO3P6JHs;U*%>+BbR7Sp7$ zS{Xnf-Zev>$Vzct4x^Ifhx5RV?|=XG3@M+tdGiVcm0=0}{rm5~>t21K_#HDJy<%d^ zHF`|K^0I!w`2z5guYPI98MBx4fceJ(q}bM{I3CD0_hAKMK9)t~V__kpMtC5FCv6PijuxCUgTXXc!WOx`9!I`7g0)(*%GCNmmS&F`cymYAna@2MJ zSL3)1$Ne}yhQo{IlW6F5l4$4#GJ2l};;HsX9KKA;$)oGPwOSW%{>x8n(fMm$b}l1w zLNlfMCuvs=Gz3|gkqKNy^eToU>8V)+L6edGqhg!`V;EyIQ%~=T1cQslpfwmW+bMA- zun>r)O&T#_UN3G70jo4Qjio8kohd_-+@^q8O>|GpRX<<5LDV2Ehe9{cg6m8RfP2gi zq-gbjj&d);U8$u_e;Ua|E~8QmMsRX~t9B)J3z*l)wMPA$z#Ae*TysMeh2`jWBoNFo zgONat=Z#OS(Zw4teR%q#H*VJXW5=)fK-FP0Ea902PJ#FAX?@Ba8)x2?GYqO|bl=S1 zm+9|wd^{$Wa|tn-rC0le6)At+Ud^8wFGUd=J|!(z%tQ%v>@8$&8KqifC* z#pHq)+gb_t8;h1RQF!sgu)~ehVJl((2E=3NB&jz@QWu#wSV}QTSl~h(__z0%>3uTJx3=70=iiH zgBlT}*@&&V2B5#Dtln8!{xCBeWG4tN)kJei!^cIy z0k~O24uCNWv=iVx0)Ta>ygkH9k7X*xV5Bd*E$|@=AP{6O)mmVQ1=b2+I!JxM;ByAf z>~J>gPvNS`;_5sLY_Y%s3zS&kgBI8&09SCEnFnYHydfvW9xgYe*(1Gq1(||E)}(=8 z8)Xh2jZ+8Kq61xx=nYZwfJNJ+0CTCI!^j;QU_=|v;U)tTK=8pR@WUwZi+tyF0y!`j z`4L|A4S|UwHWJuaPzXQ&>Pxj-37e_Qyt?y6qwtH(}49PVCd;<0=%c z^x(n)uZuxnYRi|odk@WBh>RVA$OzUZqss|F2nWq8v3FlkcYfzP2agSVJwNph=e$Yt zO2Zpa`bE$YWCR{Ywu74$wF|(tI3&DATOlex_yV*In|g81%o+)9i_(}++loK})&w3- z?PG#h;g5En*^@~6%GDE$juUU`&1-D!?l7izB60^B{k3UwmOZg<1+2swhuQBOJoue6 z=%;5S2SQHXIiQF13>uKB4wc|#+F!39ZKlZyC$9*d1|9G2@bz;<~H03 z+$hY$zdm~$V^WWn05^OY6}0AyahAzRUXYa~AhZZm6kb0%G9u4UBM)SihkS|YOO4yy zO>%&Thj0TO2Qj2)c{hEk7XZ9sN^>M^-HsoFIL2^HauX5+1J}%e zrML~*a&%r2IB;e%2SeI(vt3=f%Sm~zbCaHgSLV*wS^tF-N{%~Y#=X{Po|*YG@(@BV zRIGSo30EgnN%YH1FqLs~^cX^T$8kJ^;}i}KHK&E+!h4(+(I#PU~M9ps4mS4>em~Vub+7V>Sttp&58%dH|1oE z9;t7vZ_F)>_>ryQfL^h#7jmmm#dJ9rg~-@bXqZgZ7z=A|G>R%y@Tp zj43;jlH`W8mRpos5gPwA0<^C(>s+JkCwM3-x4r>k5?L(Q6;J5{jTOdY&j9Fky?i0Xl6e;e~ zm>my}675%xhY#an?g@eugQ>*BDh7+HRC*|)EQp%u5!dQaXmOF2v8NbEgyn>)xM^$w zWy>(PbM(U;k@*M)l!~FEi;d8_L@ZR?vI!f@olOF8SW;_{_n0Smt(Z5_ zTdKfJX$2nDbCT#JW7+q%lx6+(;Xr-&iZyFjMjC4?{lP>|Zc}%E+4YBNmu_7UZfd}q z4}JMW_66Iv?as<8$O;Vjvr8g@Bkx+YYh`0*7Q!^HY+NJ!QK=WxhlHnKM#qi*jiF3h zzs~}%S>PD~OpJ~ym!cIn8{>0~m}9S%0LIfaQDhTt#-$kkbMGPWCppMnVxAthxe*c( zopa4821n@mvpGI@l?XP%ako54GZ(XY;nZMssiGM}UVGK&ER#;$@1y*6$O^oh( zQ{=jmPzpf8|X>w;N_y@6ltXX^&{8IvS{ntsH+?@%=07ye` zCO|gXCnZz>#t4E67{~ovaqPo!2!|x09RnawQhE#Ui~!7}Ds(fXxZxkYaPB+Ijdz(& zX-CLqoAiLBXLTvkqVC#1>URoO!%fV};EucuY=BjTtIW)j!TW9sJ;MT3U;%EhL0;J- z#kF2y&?N4sb4??)-DWGbpU-?^Y;jRbeJm%Oi1)8UMKI3y2rUZ~X9iCPWZhm+glWu_9%@5~`j9tYD zD9sLp%7D4_dKbp14K^7Z45Mk>AeyS3K0k6BlV<0FDvbyyD6v9!`x0)#L1JXn)~Tk^ zg5XG?q2XlP45An5n^4@;3LcV0L>*^+?rR5W=cY zVzSgiHSUX1$L~1FNzwH!0ZwB25IIWH6dF&+j73v8*8OgyPQY+XGe;$LO643S6K6qu zPCpWq;a9nxHxPH);rdoChc+d6#eYfP!Lg{KOK7eV5VqAo-zh@}02w-?VJGeM z+c}Mc5`97?f3V_(dnilG|6tX%toC7FiaAwBZ2K+nrUl5B@)VV>07s=&xcN7#-aG|I zgqPTedWiFSS8Al%vd6aNE(=_5f#2KKF$Z3%|DAnvrhRkNmi$(fH{R?ez=r?9HodB)4WM85W!Nnw~<-1-@^ z4zqeXzop9i;6*!cJM`L;f}*nO`aFMCcG$*%7T4cCm>ljO zJO~+B0wr@9Y=A1=$;fiKu>kg(o_mpUSq?8uwzj5+%}M~ z1P+Q1uEu7NnMSoSv`Nuv^V;mVOXZVtk7~(B>{rS?>XQ=JY=%Hhz`3U~%69^^0{FAO z7fFN@<4 zIK9O=3n3m>PnryUB#hEB+h@6KNB|S-w6Oy0$jeP}v)~qckZoS1OVj#kBMtE+2&F|)|18iRw`@6HyeZvzL+pZf9>KuZRC zEI3Gs#(hTqk=)$*bb}s)6&nm;V1$ziOk5~37%BpWihv=66AiUOhtdF*HD46Tt{ay| zjB9gBWC!%?ib2Nh1W~S){E*nhf*-eJZpKeO18;VvK_6${xB;EIb(L?sPoi@Q6Fl&Lm7C2=A z_E?@eW$lL-EHG$+Sqtp7z&;BMS>RqFo44(mAoog&3sCYX9+F;i?@9so zT44Mw04j)~0_Yi3kcG3^#j=2Ly;)0ndo6I>0^1qS0gF8W_lJ3}3HjBHegQ=w(+;4% z7Do&R-4zPuL;<8O&UD9NhT$%z88!;UVWP=NL(>Z@%ZFd?%EdXK;^22y+zf(x0l0FJ zdBJ_=W-b?#>&zg`2V%H{1n4kNg`(VlQT|~>@*ULpIa>Xz{``iH-qIa)g&p0U;Rm7L z>zX6=@zSh<;WKFvs@^GFo>x&E*icwiocEY0{1Tm??3$zS-~RI|(S2qP?FP_YTxXH> ztBg(dGyox@F#$}h3Mx!H?`3inHWC#2D1$}Lt$O|> z5u7vT>HRg$m~%Hxv((f?3na>e5#^3O%v#}iLK(Um6Kvo*4iV8JXt3FLf%X>WuS|=P z(M4cxhP4?e2^+t|Al3JN)t_C{xgd7_7{;TiIntOY^9L!^FbG-Yr6Jei!T`L*;?l&p z#8~h>$#P(&SpST~>*mm>3=9;QmT}HOkoph-Du!7LR1sk6{42KPW(y1wAkp1tfguaT zEHGs8k=jA>lr0%2z?$U}feu@8+}^X#0%rLb?qQA+^#s`nb^-=~SxB_j?O?m{h_tRs z@8)R24bXjfjJ(P1H4GoFfN4F6LzrlTmBY&|u*(2%N&H}LoLLGY4^0|=WN^o2%vHer zCLD6vT@8rQ=Pu(L?5md9iuul+IOOJ3Zr!9c0asdJw|x!M{sjA*EU-)BttRCjE|{!e z4#DvfzpJ5k>6Ur>Zmb#J(tp)WZydR2swAg?|o0OOzx;&3pEAtm`41~;#}z`9mSTr2c`AAmzR zXcW-Tnmf&Kj`MR4o4TPTnR=aT>$|er&O77*TW0q;29*q-nrs_0=Ej&W6*{29lwMN4 z4D2dhJ79s07Wj?*umsc;{v9zgU&&-d;Cr(tYIy$ttZi!PkZ}EE$F~pbuP&k#KJnA8*IMsIJj7cNLp64k5dyL!ZpHBpG9?%cj|^@}yjcP`$x z7&AW=tLx|06w1ucnPm81=Ie~%OV4Wxc+UdQ&L^|6ooP#I-UlM@dEh#%KEnkJ$fh!0 z3R9DS*Qae9W{d#rAJQK^e{w~xwRMdxXpCZi3Z3T=`#J28_G4KcwuOU|GK1oyX^mGQ zl#gM0tKVuQrPzg}z$$)zEzZ?}h5*0nU$wfiF2_3@*sx$bSKT{>E7#?Ej*PCE`OX~I z6)$X?{jGikeaClFPQsa&Sx0(ka81~EPCp93`A1R^gX7&8hAqxHLIjk8Q~C);E;Jii#5R+D6A5?a$3RyvF0t%r6a9R2LT| z`dXTXnj;=>rY93!Mt}Leh-;mPK(`;H?e&(iGYItxhl@u&C^i1bW%`Bhd1AK#9c7jsHWD=68wU>q5 zaWBSzU`~@^)qMaC@dw72a}CVF;mlgG%`zK8Me;nq!Q@ut0{d)<4aT!)v_CB|x=flT z#@LLCC=hyv z@0NiW-F0R2rPNH{ICiaO5QRSXG0j(s_PA;f4`Hk57 zPADlG9q{7@r1zvyc8=srXA=NBDJ(D`$RtQ4&v7FPIy>f@EwrXE2k1qbvj=I;wBks6 zOe^B^CP2!B9>368DgiKoe84j!*B)GUI{B$9KGx+F4rJp?MVAK+d;;SKP3hLXsb>=H`=}7itj_SXoHx@Rs>g(3Uk=0jh$>&Xp7wM5% zSibEp|7CVN8cHdZ1&xSO{@_AUF3FM%>7M|QPPyI^Cn2&BAu(z3S?D|Q3lUG0hJn&B zP>N>or9THC&wkAUn+fn8*8{j4hrHu+_Hs-Bl5W_QS42KJjxXXMa6kzAapqv~ItL*S zK0+Y%6z`xd$g7N*6uK~DDMcxDa}NE?6%ia&3Q-!7M#=DD^LZ3VD6j-yh$Z_1Wl{Ty zEMi38SWIk|$*)FpQCkR21Y$({2^B;KHTF#5gfsTE#M+uc3oV2$dT;X0%riSGpg_7ynMur|8ul} zNz|z&px?J8pSHjO3!JgQZ!KU}keaxuD|DF}D5iWyN-7fKcs){428WtAttRR!xRW%S0GSL zx=VYFuZJcWM}ZVfQh|ivHX9ynv%z)K6bz;b=gNFkg~u6jHWphGgzkJC;%bWo-XeT1 zA!SddFOwgD>*`BFJN$O!;1wgk8h&3_@#uA!$mm>I`&o=2w8KaBlu;8`-`f0c?HyTr zzW%bP3ykwH2K(C>=RAEk?Q~gF$V4u)qtJfvX7c=723J5Wp~$7}MA% z(o}=#VFQ5V32;|Q2cD69C6Fs)97((uad9Vpe8^m(`g9-U7X_t7>jj_Q`RGe7v( z{1N1b*F2d&;uMa~+&2E;sJ?OZD0*HwTcy`~e8?MkA95nlBxcYtBSXH4bh9W+*6Ww|Y}wMYymj+fQ*Uq6*k+G! zxOL#uyAz4s-xz2eUcKcTU40{cU7y~v+Q_5r$O(VU`3(>k1L;UVslRQD-Mz-Zf1FWB z1RooBe)DF%=X)Z{8i1n9`1ZwhYVnyMqkS;~WjH5QqwyBpK?nx6+iw)yY&GJ+9 z_&B)_p;Ss7PLCMLXuK4&eJbuDqtQlU<7EQZP3hp2wg-DRf21OT4@@NL$^#Ptr>?d- zR>yC#p3Ty)duNb9EZ@P@uOPR-R-K`^s5ZK+9e@au0t?({tx8NznoIjE&>;X9NLRZd zAuf++>y%$bxd*%rigi&4+8;OtTRh)#6+&7f453-yLxzq_x<*J&z9-fqY3P*{c`S zjD|x9q*V8ejvNiuR+nWJ)aN&}wuMHwUcBQ%=gAA4qHO;y6WQmje@wnXmdq`V1f0EB z=HGJh_S*`!60cZnguPy$Qym%~QZA+hpg&7zRq*SgXCtokcUCRpnMFo4 zb4x77N{mRa0SDJgIh#>~N+~D#je$~Np3xQV!+~#4doU<&6s=AG*+X#=Hk+uchtXxy zi@2+?Y!o2rr%^-mDhXBzGmZx=IIxJrcANOpA|)NgukD^`6Sj=ONk z2R54kh}QlBhW~jS(5zng0A6fE#TYXX^C5|O4znWj>Fp_;_uydo^DZ1xQ8NHk#Jha5 zD1Qp)JvgqzaTgA`>k$A#N?*3Xhb=($BbS;j@EsfMC>9<-yB+{9J%U5p^<^>^8%XmS zfEPdr{*${eOtH26FxI>rf-O>p)|H`kW$;AH(7H0Tt_-a!L(OHVxlH+4;gKA?rZM?AGQG4%rxc; zBC*iCgh90jJKYJ+nb2WA!EC2-4&e74IF91*u}AJA?L6G+!wiD?;Nec358${1hm6iA z07$*_Fz^Yzrv2-Ts;hA@FPCL&VX_>DS6C@aVFwU!Fd(2vCi|m z77ezo>0DD*wYGCz=itJ&H8Vfx?(6H`vqzsfuYJ*?uCbo+>dMtUYg!i$wy*738?RXX z+Wg_+`PT#G4w%TSIW1I`df*9IL>U-rejS=ppVpNmG~rAY%rZ(GhvXoFi|ZP)P~u04 z`SL99krk0P$%F-xn8O?##;3T!ySbN7TP;KTC7tJd&Q4Kf^jOMFoL&i6)Ey*PT-3(kNnU)8B!@1qw;(WtxHf z!geST?1nAbePSGc`f`2WAK$=Nog6iaHF!Tk&iZ_{#_>{|v{LiEeN7X(D4%bjXY`tp zIV^#(hB2Jar(_7`J!<13M=mg7=d@^0;2{+U(e-@D!OV+(cA&VRBEO}xVPIsSVMTd)_ef*i%7Q}g zP^2UgsxHoN7+8+-vI>?X{Cz=betA^v5k2z5s?#tXBCF0x3!M-PvA_P{0!oV37o)-br+ z0%jK)yfY=-HwfRNBBsdtkUM8lE_D$BYNS4RMNLJ`|hM zqqcM&B-aWYa_>hZSb*y0K}&F@9!j~Nb~Ws-YV%_r)^4njZMbmd0RWGfA0F5b^G#by zAw-%)rs4HD00f1_@)ay8S%ebK!%qSoyK%V2f@>>HSX+rv9(gpiDVf=^0d=Id$(Xd} z<#oWsT{zqphtOg%CW(z=U_<)NALaPrcK2h{h3sJ;fDzl>dFbkjckJ$m(A7`At-Bue zucqJ3jb+Esx*`Ew`GW7Mn2Z{a$QD=rVCvQ@E083~2Cn_vmowgbQF7ZIV{7i%HgEop zyT<;i@w|qWyM~4?S>4>c=90mib=JK6it6d@#l3+*S;$)&uM190mv$^`$*-y`@fS{Q z|HzsEw^Tysibjf*5O{*^%L4`v{coqMtweg^aA5c4sl>GTf}*AlZinen$ETF6b^xDL}t=sh7!e> zkZi^Vlt`77bJD0Dck|nJWIXb2LyA}3yam~wfO`U)z{CkC8-{N%eKzM?BurYs^bXxd z)Kkij>J6gNTmeh*MeU2|5$%97wAZYu;+7BeV-a+~bM$cQu|Wd-RySC7y|E1Vowxv0 zNkCnI<1!qWBlKgKgHSy|Xw4wfOR%L0h?t9CGZ0D6KqNT>n-BLtjp<-qcsM``#9qXq0;yBjvhI;BcD z@WsZ2<9M18!)v%_$si7yP(>}gNI#z81;RNvGvH2`kw2_gF<}vJl z63XN&I9ND{!XX--Bi6*55WrL@+Wi#RMFxrTB*-?O0^6|7U~$qQJyAn8HRfs!3b^vp zYVSHy(km!<6$jti03xWvn_GDQX}e+JklnCw+?0^|T0ng*@=PP1X~8p#a9#rApc7wk zTV#-Nt&0Oe>Z!+74-QtJWXGOIPuV^`Yd&%5PX%or0F^LmAQIxB5F?(rlTwvjl~VlY z>iYvmoPZRKzUQ~ZMDcqdRNRcpU66)S&+|sBaaVE}?yPwabd~^LvA{anFcFuow!jVp z@XL>F*u%dKSfGkNi1yxzL!<>eAoZkD9B==B(D=J-<6Y_cPQBP;d$H44AdHWQZuVfl z#|2W|*=>6p@x�dk|cH2cdcz(yKi`S-`cj$4OcC`wPK)Z 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 EAF(mv_W%F@ literal 0 HcmV?d00001 diff --git a/web/layouts/_partials/address_autocomplete.html b/web/layouts/_partials/address_autocomplete.html new file mode 100644 index 0000000..3ffd1b2 --- /dev/null +++ b/web/layouts/_partials/address_autocomplete.html @@ -0,0 +1,48 @@ +{{ define "address_autocomplete" }} + + +
+ + + + +
    + +
+
+{{ end }} \ No newline at end of file diff --git a/web/layouts/_partials/files_list.html b/web/layouts/_partials/files_list.html new file mode 100644 index 0000000..0f10791 --- /dev/null +++ b/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/web/layouts/_partials/mainmenu.html b/web/layouts/_partials/mainmenu.html new file mode 100644 index 0000000..94d2108 --- /dev/null +++ b/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/web/layouts/administration/_partials/group_members.html b/web/layouts/administration/_partials/group_members.html new file mode 100644 index 0000000..6e03022 --- /dev/null +++ b/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/web/layouts/administration/_partials/groups_admins.html b/web/layouts/administration/_partials/groups_admins.html new file mode 100644 index 0000000..3495123 --- /dev/null +++ b/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/web/layouts/administration/create_group.html b/web/layouts/administration/create_group.html new file mode 100644 index 0000000..c5485ab --- /dev/null +++ b/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/web/layouts/administration/display_group.html b/web/layouts/administration/display_group.html new file mode 100644 index 0000000..eece157 --- /dev/null +++ b/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/web/layouts/administration/home.html b/web/layouts/administration/home.html new file mode 100644 index 0000000..372307d --- /dev/null +++ b/web/layouts/administration/home.html @@ -0,0 +1,124 @@ +{{define "content"}} +
+

Administration

+
+ +
+

Statistiques

+
    +
  • +
    + {{.IconSet.Icon "hero:outline/user-group" "h-6 w-6"}} +
    +
    +
    + Bénéficiaires +

    {{len (index .ViewState.groups 0).Members}} bénéficiaires

    +
    +
    +
  • + +
  • +
    + {{.IconSet.Icon "hero:outline/office-building" "h-6 w-6"}} +
    +
    +
    + Organisations +

    {{len .ViewState.groups}} organisations

    +
    +
    +
  • + +
  • +
    + {{.IconSet.Icon "hero:outline/briefcase" "h-6 w-6"}} +
    +
    +
    + Référents +

    1 membres

    +
    +
    +
  • + +
  • +
    + {{.IconSet.Icon "hero:outline/shield-check" "h-6 w-6"}} +
    +
    +
    + Accompagnement +

    0 actions réalisées

    +
    +
    +
  • +
+
+ + +{{end}} \ No newline at end of file diff --git a/web/layouts/agenda/create-event.html b/web/layouts/agenda/create-event.html new file mode 100644 index 0000000..c3af0c4 --- /dev/null +++ b/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/web/layouts/agenda/display-event.html b/web/layouts/agenda/display-event.html new file mode 100644 index 0000000..fcc31a7 --- /dev/null +++ b/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/web/layouts/agenda/home.html b/web/layouts/agenda/home.html new file mode 100644 index 0000000..864f81c --- /dev/null +++ b/web/layouts/agenda/home.html @@ -0,0 +1,114 @@ +{{define "content"}} + + +
+
+
+
+
+ + + + + + + + + + + + + + {{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/web/layouts/auth/groups.html b/web/layouts/auth/groups.html new file mode 100644 index 0000000..e2aad30 --- /dev/null +++ b/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/web/layouts/auth/lost-password-init.html b/web/layouts/auth/lost-password-init.html new file mode 100644 index 0000000..996fcbd --- /dev/null +++ b/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/web/layouts/auth/lost-password-recover-ko.html b/web/layouts/auth/lost-password-recover-ko.html new file mode 100644 index 0000000..90b6928 --- /dev/null +++ b/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/web/layouts/auth/lost-password-recover.html b/web/layouts/auth/lost-password-recover.html new file mode 100644 index 0000000..4286fd5 --- /dev/null +++ b/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/web/layouts/auth/onboarding-ko.html b/web/layouts/auth/onboarding-ko.html new file mode 100644 index 0000000..12d3972 --- /dev/null +++ b/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/web/layouts/auth/onboarding.html b/web/layouts/auth/onboarding.html new file mode 100644 index 0000000..3d18e6c --- /dev/null +++ b/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/web/layouts/beneficiaries/_partials/beneficiary-events.html b/web/layouts/beneficiaries/_partials/beneficiary-events.html new file mode 100644 index 0000000..684622f --- /dev/null +++ b/web/layouts/beneficiaries/_partials/beneficiary-events.html @@ -0,0 +1,4 @@ +{{define "beneficiary_events"}} +
+
+{{end}} \ No newline at end of file diff --git a/web/layouts/beneficiaries/_partials/beneficiary-files.html b/web/layouts/beneficiaries/_partials/beneficiary-files.html new file mode 100644 index 0000000..b4a3de4 --- /dev/null +++ b/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/web/layouts/beneficiaries/_partials/beneficiary-journeys.html b/web/layouts/beneficiaries/_partials/beneficiary-journeys.html new file mode 100644 index 0000000..160a179 --- /dev/null +++ b/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/web/layouts/beneficiaries/_partials/beneficiary-notes.html b/web/layouts/beneficiaries/_partials/beneficiary-notes.html new file mode 100644 index 0000000..a793a17 --- /dev/null +++ b/web/layouts/beneficiaries/_partials/beneficiary-notes.html @@ -0,0 +1,108 @@ +{{define "beneficiary_notes"}} +
+
    + +
+
+ +{{end}} \ No newline at end of file diff --git a/web/layouts/beneficiaries/_partials/beneficiary-vehicles.html b/web/layouts/beneficiaries/_partials/beneficiary-vehicles.html new file mode 100644 index 0000000..897ade0 --- /dev/null +++ b/web/layouts/beneficiaries/_partials/beneficiary-vehicles.html @@ -0,0 +1,39 @@ +{{define "beneficiary_vehicles"}} +
+ {{if .ViewState.bookings}} +

Mises à disposition réalisées

+
    + {{range .ViewState.bookings}} +
  • Du {{(timeFrom .Startdate).Format "02/01/2006"}} au {{(timeFrom .Enddate).Format "02/01/2006"}}
  • + {{end}} +
+ {{end}} +

Réserver un véhicule

+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ {{template "vehicle_type_select" .}} + + +
+
+{{end}} \ No newline at end of file diff --git a/web/layouts/beneficiaries/create.html b/web/layouts/beneficiaries/create.html new file mode 100644 index 0000000..36ba876 --- /dev/null +++ b/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/web/layouts/beneficiaries/display.html b/web/layouts/beneficiaries/display.html new file mode 100644 index 0000000..6829e5a --- /dev/null +++ b/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/web/layouts/beneficiaries/list.html b/web/layouts/beneficiaries/list.html new file mode 100644 index 0000000..da8bbad --- /dev/null +++ b/web/layouts/beneficiaries/list.html @@ -0,0 +1,166 @@ +{{define "content"}} + +
+
+
+
+
+ + + + + + + + + + + + + + + +
+ Nom + + Téléphone + + Adresse + + Labels + + Modifier +
+
+ + +
+
+
+ +
+
+
+{{end}} \ No newline at end of file diff --git a/web/layouts/beneficiaries/update.html b/web/layouts/beneficiaries/update.html new file mode 100644 index 0000000..da1b4c9 --- /dev/null +++ b/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/web/layouts/dashboard/_partials/agenda-widget.html b/web/layouts/dashboard/_partials/agenda-widget.html new file mode 100644 index 0000000..c63ce4b --- /dev/null +++ b/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/web/layouts/dashboard/_partials/beneficiaries-widget.html b/web/layouts/dashboard/_partials/beneficiaries-widget.html new file mode 100644 index 0000000..dcf45cc --- /dev/null +++ b/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/web/layouts/dashboard/dashboard.html b/web/layouts/dashboard/dashboard.html new file mode 100644 index 0000000..10c1e7f --- /dev/null +++ b/web/layouts/dashboard/dashboard.html @@ -0,0 +1,77 @@ +{{define "content"}} + +
+

Tableau de bord

+
+
+

Statistiques de votre organisation

+
    +
  • +
    + {{.IconSet.Icon "hero:outline/user-group" "h-6 w-6"}} +
    +
    +
    + Bénéficiaires +

    {{.ViewState.beneficiaries.count}} bénéficiaires

    +
    +
    +
  • + +
  • +
    + {{.IconSet.Icon "hero:outline/shield-check" "h-6 w-6"}} +
    +
    +
    + Accompagnement +

    0 actions réalisées

    +
    +
    +
  • + +
  • +
    + {{.IconSet.Icon "hero:outline/office-building" "h-6 w-6"}} +
    +
    +
    + Groupes +

    0 groupes créés

    +
    +
    +
  • + +
  • +
    + {{.IconSet.Icon "hero:outline/briefcase" "h-6 w-6"}} +
    +
    +
    + Référents +

    {{.ViewState.count_members}} membres

    +
    +
    +
  • +
+
+ +
+
+ + + {{template "beneficiaries_widget" .ViewState.beneficiaries}} + {{template "agenda_widget" .ViewState.events}} + + +
+
+{{end}} \ No newline at end of file diff --git a/web/layouts/directory/home.html b/web/layouts/directory/home.html new file mode 100644 index 0000000..da927c1 --- /dev/null +++ b/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/web/layouts/group/settings.html b/web/layouts/group/settings.html new file mode 100644 index 0000000..c693377 --- /dev/null +++ b/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/web/layouts/journeys/_partials/journeys-all.html b/web/layouts/journeys/_partials/journeys-all.html new file mode 100644 index 0000000..c340373 --- /dev/null +++ b/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/web/layouts/journeys/_partials/journeys-carpool.html b/web/layouts/journeys/_partials/journeys-carpool.html new file mode 100644 index 0000000..1a0a198 --- /dev/null +++ b/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/web/layouts/journeys/_partials/journeys-others.html b/web/layouts/journeys/_partials/journeys-others.html new file mode 100644 index 0000000..39f2176 --- /dev/null +++ b/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/web/layouts/journeys/_partials/journeys-public-transit.html b/web/layouts/journeys/_partials/journeys-public-transit.html new file mode 100644 index 0000000..59bbfab --- /dev/null +++ b/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/web/layouts/journeys/search.html b/web/layouts/journeys/search.html new file mode 100644 index 0000000..bbe6f8f --- /dev/null +++ b/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/web/layouts/layout.html b/web/layouts/layout.html new file mode 100644 index 0000000..980f5c5 --- /dev/null +++ b/web/layouts/layout.html @@ -0,0 +1,178 @@ +{{define "main"}} + + + + + PARCOURSMOB + + + + + + + + + + + +
+
+ + +
+ +
+
+ {{ template "content" . }} +
+
+
+
+ + + +{{end}} \ No newline at end of file diff --git a/web/layouts/support/support.html b/web/layouts/support/support.html new file mode 100644 index 0000000..224bd63 --- /dev/null +++ b/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/web/layouts/vehicles/booking-display.html b/web/layouts/vehicles/booking-display.html new file mode 100644 index 0000000..21d19c3 --- /dev/null +++ b/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/web/layouts/vehicles/bookings-list.html b/web/layouts/vehicles/bookings-list.html new file mode 100644 index 0000000..5cc979c --- /dev/null +++ b/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/web/layouts/vehicles/search.html b/web/layouts/vehicles/search.html new file mode 100644 index 0000000..b9d4845 --- /dev/null +++ b/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/web/layouts/vehicles_management/_partials/bookings-list.html b/web/layouts/vehicles_management/_partials/bookings-list.html new file mode 100644 index 0000000..77a477d --- /dev/null +++ b/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/web/layouts/vehicles_management/_partials/calendar.html b/web/layouts/vehicles_management/_partials/calendar.html new file mode 100644 index 0000000..5a6dbb5 --- /dev/null +++ b/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/web/layouts/vehicles_management/_partials/vehicle-type-select.html b/web/layouts/vehicles_management/_partials/vehicle-type-select.html new file mode 100644 index 0000000..eaadfa0 --- /dev/null +++ b/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/web/layouts/vehicles_management/_partials/vehicles-list.html b/web/layouts/vehicles_management/_partials/vehicles-list.html new file mode 100644 index 0000000..c8840ae --- /dev/null +++ b/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/web/layouts/vehicles_management/booking-display.html b/web/layouts/vehicles_management/booking-display.html new file mode 100644 index 0000000..2a767fd --- /dev/null +++ b/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/web/layouts/vehicles_management/bookings-list.html b/web/layouts/vehicles_management/bookings-list.html new file mode 100644 index 0000000..6bd90c0 --- /dev/null +++ b/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/web/layouts/vehicles_management/fleet-add.html b/web/layouts/vehicles_management/fleet-add.html new file mode 100644 index 0000000..55ae759 --- /dev/null +++ b/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/web/layouts/vehicles_management/fleet-display.html b/web/layouts/vehicles_management/fleet-display.html new file mode 100644 index 0000000..d786100 --- /dev/null +++ b/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/web/layouts/vehicles_management/fleet-update.html b/web/layouts/vehicles_management/fleet-update.html new file mode 100644 index 0000000..88b6770 --- /dev/null +++ b/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/web/layouts/vehicles_management/overview.html b/web/layouts/vehicles_management/overview.html new file mode 100644 index 0000000..60fd3ab --- /dev/null +++ b/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/web/public/css/main.css b/web/public/css/main.css new file mode 100644 index 0000000..868f308 --- /dev/null +++ b/web/public/css/main.css @@ -0,0 +1,2889 @@ +/* +! 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-2 { + margin: 0.5rem; +} + +.m-4 { + margin: 1rem; +} + +.-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-8 { + height: 2rem; +} + +.h-0 { + height: 0px; +} + +.h-16 { + height: 4rem; +} + +.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; +} + +.w-20 { + width: 5rem; +} + +.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; +} + +.max-w-sm { + max-width: 24rem; +} + +.max-w-full { + max-width: 100%; +} + +.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(255 19 0 / 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(36 56 135 / 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(36 56 135 / 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(255 19 0 / 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; +} + +.pt-5 { + padding-top: 1.25rem; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.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(36 56 135 / var(--tw-text-opacity)); +} + +.text-co-red { + --tw-text-opacity: 1; + color: rgb(255 19 0 / 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(36 56 135 / 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(36 56 135 / 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(36 56 135 / 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(36 56 135 / 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(36 56 135 / 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(255 19 0 / 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/web/public/images/main_logo.svg b/web/public/images/main_logo.svg new file mode 100644 index 0000000..d267bdd --- /dev/null +++ b/web/public/images/main_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/images/parcoursmob_logo_bluered.svg b/web/public/images/parcoursmob_logo_bluered.svg new file mode 100644 index 0000000..092d2ef --- /dev/null +++ b/web/public/images/parcoursmob_logo_bluered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/images/parcoursmob_logo_whitered.svg b/web/public/images/parcoursmob_logo_whitered.svg new file mode 100644 index 0000000..d267bdd --- /dev/null +++ b/web/public/images/parcoursmob_logo_whitered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/js/main.js b/web/public/js/main.js new file mode 100644 index 0000000..c1c927c --- /dev/null +++ b/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 `