This commit is contained in:
Charles Maxime Sassot 2022-06-01 17:31:21 +02:00
parent 770a51fa94
commit e7da9dda76
39 changed files with 722 additions and 741 deletions

View File

@ -0,0 +1,16 @@
@media screen and (min-width: 769px) {
form {
width: 50%!important;
}
}
@media screen and (min-width: 1200px) {
form {
/* width: 25%!important; */
padding: 8rem!important;
}
}
textarea {
height: 20vh!important;
}

View File

@ -1,130 +0,0 @@
/** FORM */
label {
display: block;
margin: 0;
font-size: .875rem;
font-weight: 400;
line-height: 1.8;
color: #0a0a0a;
}
input {
appearance: none;
background-color: rgb(254, 254, 254);
border-bottom-color: rgb(202, 202, 202);
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
border-bottom-style: solid;
border-bottom-width: 1px;
border-image-outset: 0;
border-image-repeat: stretch;
border-image-slice: 100%;
border-image-source: none;
border-image-width: 1;
border-left-color: rgb(202, 202, 202);
border-left-style: solid;
border-left-width: 1px;
border-right-color: rgb(202, 202, 202);
border-right-style: solid;
border-right-width: 1px;
border-top-color: rgb(202, 202, 202);
border-top-left-radius: 0px;
border-top-right-radius: 0px;
border-top-style: solid;
border-top-width: 1px;
box-shadow: rgba(10, 10, 10, 0.1) 0px 1px 2px 0px inset;
box-sizing: border-box;
color: rgb(10, 10, 10);
cursor: text;
display: block;
font-size: 16px;
font-stretch: 100%;
height: 2.3rem;
line-height: 1.5rem;
padding: 0.5rem;
width: 100%;
/* font-style normal
font-variant-caps normal
font-variant-east-asian normal
font-variant-ligatures normal
font-variant-numeric normal
font-weight 400
letter-spacing normal
margin-bottom 16px
margin-left 0px
margin-right 0px
margin-top 0px
overflow-x visible
overflow-y visible
padding-bottom 8px
padding-left 8px
padding-right 8px
padding-top 8px
text-align start
text-indent 0px
text-rendering auto
text-shadow none
text-size-adjust 100%
text-transform none
transition-delay 0s, 0s, 0s
transition-duration 0.5s, 0.25s, 0.5s
transition-property box-shadow, border-color, -webkit-box-shadow
transition-timing-function ease, ease-in-out, ease
width 468.5px */
}
.container {
display: flex;
justify-content: center;
align-items: center;
}
.loginForm {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}
.loginForm > form {
display: inline-flex;
}
button {
-webkit-appearance: none;
-moz-appearance: none;
border-radius: 0;
border-style: solid;
border-width: 0;
cursor: pointer;
font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif !important;
font-weight: normal;
line-height: normal;
margin: 0 0 1.11111rem;
position: relative;
text-align: center;
text-decoration: none;
display: inline-block;
padding: 0.6rem 1.25rem;
font-size: 0.88889rem;
background-color: rgb(7, 142, 181);
border-color: #007095;
color: #FFFFFF;
transition: background-color 300ms ease-out;
box-shadow: 5px 5px 15px -11px #007095;
}
button:hover {
}
#adminSettings {
padding: 1.5rem;
border-radius: 2px;
-webkit-box-shadow: 0px 2px 28px 5px #000000;
box-shadow: 0px 27px 34px 2px rgb(0 0 0 / 49%);
}

19
public/css/login_form.css Normal file
View File

@ -0,0 +1,19 @@
form > div {
display: block;
margin: 0 auto 2rem auto;
}
form > div:focus-within {
border-block-color: white!important;
-webkit-box-shadow:1px 16px 29px -5px rgba(255,255,255,0.26)!important;
box-shadow: 1px 16px 29px -5px rgba(255,255,255,0.26)!important;
}
form > button {
display: block;
margin: auto;
}
form input {
width: 80%!important;
}

View File

@ -1,3 +1,60 @@
ul li a span svg {
display: inline-block;
width: 1rem;
height: 1rem;
}
.memberCard label {
background-color:white;
color: #078eb5!important;
}
.memberCard {
width: 10rem!important;
}
.memberCard label:hover {
background-color:#078eb5!important;
color: white!important;
}
#profile {
display: flex;
}
.bg-blue-500 {
background-color:#078eb5!important;
}
.text-blue-500 {
color: #078eb5!important;
}
.bg-cadoles {
background-color: #078eb5!important;
}
#main img {
display: block;
margin: 2.5rem auto;
}
html,
body {
margin: 0;
height: 100%;
width: 100%;
}
main {
height: 100%;
width: 100%;
}
.arcadContent {
padding: 1rem;
}
a { a {
text-decoration: none; text-decoration: none;
} }
@ -7,8 +64,7 @@ a {
margin: 0; margin: 0;
padding: 0; padding: 0;
box-sizing: border-box; box-sizing: border-box;
font-family: 'Lato', sans-serif; font-family: 'Roboto', sans-serif;
font-family: 'Oswald', sans-serif;
} }
.wrapper{ .wrapper{
position: fixed; position: fixed;
@ -17,22 +73,17 @@ a {
height: 100%; height: 100%;
width: 100%; width: 100%;
background: rgb(36, 36, 36); background: rgb(36, 36, 36);
/*background: linear-gradient(90deg, #f92c78, #4114a1);*/ transition: all 0.2s ease-in-out;
/* background: linear-gradient(375deg, #1cc7d0, #2ede98); */
/* background: linear-gradient(-45deg, #e3eefe 0%, #efddfb 100%);*/
transition: all 0.6s ease-in-out;
z-index: 19; z-index: 19;
} }
#active:checked ~ .wrapper{ #active:checked ~ .wrapper{
/*left: 0;*/
right:0; right:0;
} }
.menu-btn{ .menu-btn{
position: absolute; position: absolute;
z-index: 20; z-index: 20;
right: 20px; right: 20px;
/*left: 20px; */ top: 2.5vh;
top: 20px;
height: 50px; height: 50px;
width: 50px; width: 50px;
text-align: center; text-align: center;
@ -40,11 +91,7 @@ a {
border-radius: 50%; border-radius: 50%;
font-size: 20px; font-size: 20px;
cursor: pointer; cursor: pointer;
/*color: #fff;*/ transition: all 0.2s ease-in-out;
/*background: linear-gradient(90deg, #f92c78, #4114a1);*/
/* background: linear-gradient(375deg, #1cc7d0, #2ede98); */
/* background: linear-gradient(-45deg, #e3eefe 0%, #efddfb 100%); */
transition: all 0.3s ease-in-out;
} }
.menu-btn span, .menu-btn span,
.menu-btn:before, .menu-btn:before,
@ -70,7 +117,7 @@ a {
width: 100%; width: 100%;
height: 100%; height: 100%;
pointer-events: none; pointer-events: none;
transition: background .6s; transition: background .2s;
} }
/* closing animation */ /* closing animation */
@ -99,6 +146,10 @@ a {
margin: 15px 0; margin: 15px 0;
} }
.wrapper ul li a { .wrapper ul li a {
transition-property: font-size;
transition-duration: 1s;
transition-delay: .1s;
text-decoration: none; text-decoration: none;
font-size: 30px; font-size: 30px;
font-weight: 500; font-weight: 500;
@ -109,21 +160,23 @@ a {
line-height: 50px; line-height: 50px;
margin: 5px 30px; margin: 5px 30px;
opacity: 0; opacity: 0;
transition: all 0.3s ease; /* transition: all 0.3s ease;
transition: transform .6s cubic-bezier(0.215, 0.61, 0.355, 1); transition: transform .2s cubic-bezier(0.215, 0.61, 0.355, 1); */
} }
.wrapper ul li a:after{ .wrapper ul li a:hover{
position: absolute; position: absolute;
content: ""; font-size: 36px;
background: #fff;
text-shadow: #bbb 0 0 1px, #fff 0 -1px 2px, #fff 0 -3px 2px, rgba(0,0,0,0.8) 0 30px 25px;
/* background: #fff; */
/*background: linear-gradient(#14ffe9, #ffeb3b, #ff00e0);*/ /*background: linear-gradient(#14ffe9, #ffeb3b, #ff00e0);*/
/*background: linear-gradient(375deg, #1cc7d0, #2ede98);*/ /*background: linear-gradient(375deg, #1cc7d0, #2ede98);*/
width: 100%; width: 100%;
height: 100%; /* height: 100%;
left: 0; left: 0;
top: 0; top: 0; */
border-radius: 50px; border-radius: 50px;
transform: scaleY(0); /* transform: scaleY(0); */
z-index: -1; z-index: -1;
transition: transform 0.3s ease; transition: transform 0.3s ease;
} }
@ -131,48 +184,32 @@ a {
transform: scaleY(1); transform: scaleY(1);
} }
.wrapper ul li a:hover{ .wrapper ul li a:hover{
color: rgb(7, 142, 181) /* color: rgb(7, 142, 181) */
} }
input[type="checkbox"]{
#active{
display: none; display: none;
} }
.content{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: -1;
text-align: center;
width: 100%;
color: #202020;
}
.content .title{
font-size: 40px;
font-weight: 700;
}
.content p{
font-size: 35px;
font-weight: 600;
}
#active:checked ~ .wrapper ul li a{ #active:checked ~ .wrapper ul li a{
opacity: 1; opacity: 1;
} }
.wrapper ul li a{ .wrapper ul li a{
transition: opacity 1.2s, transform 1.2s cubic-bezier(0.215, 0.61, 0.355, 1); transition: opacity 0.2s, transform 0.2s cubic-bezier(0.215, 0.61, 0.355, 1);
transform: translateX(100px); transform: translateX(100px);
} }
#active:checked ~ .wrapper ul li a{ #active:checked ~ .wrapper ul li a{
transform: none; transform: none;
transition-timing-function: ease, cubic-bezier(.1,1.3,.3,1); transition-timing-function: ease, cubic-bezier(.1,1.3,.3,1);
transition-delay: .6s; transition-delay: .2s;
transform: translateX(-20vh); transform: translateX(-20vh);
} }
/** endNavbar */ /** endNavbar */
#main #main
{ {
max-width:1280px; max-width:100%;
min-height:100%; min-height:100%;
margin:0 auto; margin:0 auto;
position:relative; position:relative;
@ -180,31 +217,29 @@ input[type="checkbox"]{
footer{ footer {
position:absolute; /* position:absolute;
bottom:0; bottom:0; */
width:100%; width:100%;
font-size: 14px; font-size: 14px;
font-family: Roboto,sans-serif; font-family: Roboto,sans-serif;
font-weight: 300; font-weight: 300;
color: rgb(74, 74, 74); color: rgb(74, 74, 74);
line-height: 18px; line-height: 18px;
padding: 1.2rem;
} }
#logo img { #logo img {
margin: 1rem 1rem; padding: 2.5vh;
display: inline-block;
} }
/* header {
height: 10vh;
} */
@media screen and (min-width: 769px) { @media screen and (min-width: 769px) {
aside {
left: 0;
position: absolute;
}
}
aside {
margin-left: 1rem;
} }
.side-menu { .side-menu {
@ -215,6 +250,29 @@ aside {
margin: 0; margin: 0;
padding: 0.77778rem 0; padding: 0.77778rem 0;
} }
.custom-icon {
filter: invert(48%) sepia(79%) saturate(2476%) hue-rotate(192deg) brightness(108%) contrast(60%);
width: 1.2rem;
height: 1.2rem;
}
.profile-icon {
width: 3.2rem!important;
height: 3.2rem;
}
.custom-icon-white {
filter: invert(48%) sepia(79%) saturate(2476%) hue-rotate(192deg) brightness(108%) contrast(60%);
width: 1.2rem;
height: 1.2rem;
}
.admin-links {
display: flex;
align-items: center;
justify-content: space-between;
}
.side-menu li { .side-menu li {
margin-top: 0.8rem; margin-top: 0.8rem;
@ -223,7 +281,6 @@ aside {
.side-menu li a{ .side-menu li a{
color: #008CBA; color: #008CBA;
display: block;
margin: 0; margin: 0;
} }
@ -235,67 +292,111 @@ footer a:hover {
color: #035d7a; color: #035d7a;
} }
/* footer a:after { footer a {
background: none repeat scroll 0 0 transparent;
bottom: 0;
content: "";
display: block;
height: 2px;
left: 50%;
position: absolute;
background: #fff;
transition: width 0.3s ease 0s, left 0.3s ease 0s;
width: 0;
}
footer a:hover:after {
width: 100%;
left: 0;
} */
/* footer a {
color: #008CBA;
text-decoration: underline 0.15em rgba(255, 255, 255, 0);
transition: text-decoration-color 300ms;
}
footer a:hover {
text-decoration-color:#035d7a;
} */
body a, footer a {
box-shadow: inset 0 0 0 0 #54b3d6; box-shadow: inset 0 0 0 0 #54b3d6;
color: #54b3d6; color: #54b3d6;
margin: 0 -.25rem; margin: 0 -.25rem;
padding: 0 .25rem; padding: 0 .25rem;
transition: color .3s ease-in-out, text-decoration .3s ease-in-out; transition: color .2s ease-in-out, text-decoration .3s ease-in-out;
} }
body a:hover { footer a:hover {
/* box-shadow: inset 100% 0 0 0 #54b3d6; */ /* box-shadow: inset 100% 0 0 0 #54b3d6; */
text-decoration: underline 0.15em rgba(255, 255, 255, 0); text-decoration: underline 0.15em rgba(255, 255, 255, 0);
color: #54b3d6; color: #54b3d6;
background-color: rgba(0, 0, 0, 0.11); background-color: rgba(0, 0, 0, 0.11);
} }
/* Profile card */
/* .flashlight { .profileCard {
color: hsla(0,0%,0%,0); max-width: 100%;
perspective: 80px;
outline: none;
} }
#flash { body {
display: inline-block; padding: 10px;
text-shadow: #bbb 0 0 1px, #fff 0 -1px 2px, #fff 0 -3px 2px, rgba(0,0,0,0.8) 0 30px 25px;
transition: margin-left 0.3s cubic-bezier(0, 1, 0, 1);
} }
.light { .app-wrapper {
display: inline-block; display:flex;
text-shadow: #111 0 0 1px, rgba(255,255,255,0.1) 0 1px 3px; height:100%;
width:100%;
flex-direction:column;
}
.app-header {
padding: 7px;
flex-grow: 0;
}
.app-frame {
background: #F7F7F7;
width: 100%;
border: none;
flex-grow: 1;
overflow: hidden;
}
.app-frame::-webkit-scrollbar {
display: none;
}
#arcadLogo {
max-width: 25%;
}
.podium-container {
display: flex;
justify-content: center;
margin-bottom: 20px; }
.podium-container .podium {
display: flex;
align-items: flex-end; }
.podium-container .podium .pod {
width: 120px;
overflow: hidden; }
.podium-container .podium .pod .pod-stair {
background-color: #3298dc;
border: 1px solid white;
justify-content: center;
align-items: center;
display: flex;
border-radius: 4px 4px 0 0; }
.podium-container .podium .pod.first .pod-stair {
height: 120px;
width: 120px; }
.podium-container .podium .pod.first .pod-stair .pod-position {
font-size: 200%; }
.podium-container .podium .pod.second .pod-stair {
height: 72px;
width: 120px; }
.podium-container .podium .pod.second .pod-stair .pod-position {
font-size: 150%; }
.podium-container .podium .pod.third .pod-stair {
height: 36px;
width: 120px; }
.podium-container .podium .pod .pod-position {
font-size: 100%;
font-weight: bolder;
color: #fff; }
.podium-container .podium .pod .pod-player {
text-align: center;
margin-bottom: 20px; }
.podium-container .podium .pod .pod-player .player-crown {
fill: #ffdd57;
height: 3rem !important;
width: 3rem; }
.podium-container .podium .pod .pod-player .player-nickname {
display: block;
font-weight: bolder;
font-size: 1.5rem;
width: 120px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
padding: 0 5px 0 5px; }
.podium-container .podium .pod .pod-player .player-score {
display: block;
font-weight: bolder;
font-size: 1rem;
} }
li:hover .light {
text-shadow: #fff 0 0 4px, #fcffbb 0 0 20px;
transform: rotateY(-60deg);
transition: transform 0.3s cubic-bezier(0, 0.75, 0, 1), text-shadow 0.1s ease-out;
} */

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M160 416H96c-17.67 0-32-14.33-32-32V128c0-17.67 14.33-32 32-32h64c17.67 0 32-14.33 32-32S177.7 32 160 32H96C42.98 32 0 74.98 0 128v256c0 53.02 42.98 96 96 96h64c17.67 0 32-14.33 32-32S177.7 416 160 416zM502.6 233.4l-128-128c-12.51-12.51-32.76-12.49-45.25 0c-12.5 12.5-12.5 32.75 0 45.25L402.8 224H192C174.3 224 160 238.3 160 256s14.31 32 32 32h210.8l-73.38 73.38c-12.5 12.5-12.5 32.75 0 45.25s32.75 12.5 45.25 0l128-128C515.1 266.1 515.1 245.9 502.6 233.4z"/></svg>

After

Width:  |  Height:  |  Size: 704 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z"/></svg>

After

Width:  |  Height:  |  Size: 465 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M144 480C64.47 480 0 415.5 0 336C0 273.2 40.17 219.8 96.2 200.1C96.07 197.4 96 194.7 96 192C96 103.6 167.6 32 256 32C315.3 32 367 64.25 394.7 112.2C409.9 101.1 428.3 96 448 96C501 96 544 138.1 544 192C544 204.2 541.7 215.8 537.6 226.6C596 238.4 640 290.1 640 352C640 422.7 582.7 480 512 480H144zM223 263C213.7 272.4 213.7 287.6 223 296.1C232.4 306.3 247.6 306.3 256.1 296.1L296 257.9V392C296 405.3 306.7 416 320 416C333.3 416 344 405.3 344 392V257.9L383 296.1C392.4 306.3 407.6 306.3 416.1 296.1C426.3 287.6 426.3 272.4 416.1 263L336.1 183C327.6 173.7 312.4 173.7 303 183L223 263z"/></svg>

After

Width:  |  Height:  |  Size: 828 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M192 64C192 46.33 206.3 32 224 32H288C305.7 32 320 46.33 320 64V128C320 145.7 305.7 160 288 160H224C206.3 160 192 145.7 192 128V64zM138.1 174.1C153.4 166.1 172.1 171.4 181.8 186.7L213.8 242.1C222.6 257.4 217.4 276.1 202.1 285.8L146.7 317.8C131.4 326.6 111.8 321.4 102.1 306.1L70.96 250.7C62.12 235.4 67.37 215.8 82.67 206.1L138.1 174.1zM352 192C369.7 192 384 206.3 384 224V288C384 305.7 369.7 320 352 320H288C270.3 320 256 305.7 256 288V224C256 206.3 270.3 192 288 192H352zM416 352C433.7 352 448 366.3 448 384V448C448 465.7 433.7 480 416 480H352C334.3 480 320 465.7 320 448V384C320 366.3 334.3 352 352 352H416zM160 384C160 366.3 174.3 352 192 352H256C273.7 352 288 366.3 288 384V448C288 465.7 273.7 480 256 480H192C174.3 480 160 465.7 160 448V384zM96 352C113.7 352 128 366.3 128 384V448C128 465.7 113.7 480 96 480H32C14.33 480 0 465.7 0 448V384C0 366.3 14.33 352 32 352H96z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M480 352h-133.5l-45.25 45.25C289.2 409.3 273.1 416 256 416s-33.16-6.656-45.25-18.75L165.5 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96C512 366.3 497.7 352 480 352zM432 456c-13.2 0-24-10.8-24-24c0-13.2 10.8-24 24-24s24 10.8 24 24C456 445.2 445.2 456 432 456zM233.4 374.6C239.6 380.9 247.8 384 256 384s16.38-3.125 22.62-9.375l128-128c12.49-12.5 12.49-32.75 0-45.25c-12.5-12.5-32.76-12.5-45.25 0L288 274.8V32c0-17.67-14.33-32-32-32C238.3 0 224 14.33 224 32v242.8L150.6 201.4c-12.49-12.5-32.75-12.5-45.25 0c-12.49 12.5-12.49 32.75 0 45.25L233.4 374.6z"/></svg>

After

Width:  |  Height:  |  Size: 838 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M495.9 166.6C499.2 175.2 496.4 184.9 489.6 191.2L446.3 230.6C447.4 238.9 448 247.4 448 256C448 264.6 447.4 273.1 446.3 281.4L489.6 320.8C496.4 327.1 499.2 336.8 495.9 345.4C491.5 357.3 486.2 368.8 480.2 379.7L475.5 387.8C468.9 398.8 461.5 409.2 453.4 419.1C447.4 426.2 437.7 428.7 428.9 425.9L373.2 408.1C359.8 418.4 344.1 427 329.2 433.6L316.7 490.7C314.7 499.7 307.7 506.1 298.5 508.5C284.7 510.8 270.5 512 255.1 512C241.5 512 227.3 510.8 213.5 508.5C204.3 506.1 197.3 499.7 195.3 490.7L182.8 433.6C167 427 152.2 418.4 138.8 408.1L83.14 425.9C74.3 428.7 64.55 426.2 58.63 419.1C50.52 409.2 43.12 398.8 36.52 387.8L31.84 379.7C25.77 368.8 20.49 357.3 16.06 345.4C12.82 336.8 15.55 327.1 22.41 320.8L65.67 281.4C64.57 273.1 64 264.6 64 256C64 247.4 64.57 238.9 65.67 230.6L22.41 191.2C15.55 184.9 12.82 175.3 16.06 166.6C20.49 154.7 25.78 143.2 31.84 132.3L36.51 124.2C43.12 113.2 50.52 102.8 58.63 92.95C64.55 85.8 74.3 83.32 83.14 86.14L138.8 103.9C152.2 93.56 167 84.96 182.8 78.43L195.3 21.33C197.3 12.25 204.3 5.04 213.5 3.51C227.3 1.201 241.5 0 256 0C270.5 0 284.7 1.201 298.5 3.51C307.7 5.04 314.7 12.25 316.7 21.33L329.2 78.43C344.1 84.96 359.8 93.56 373.2 103.9L428.9 86.14C437.7 83.32 447.4 85.8 453.4 92.95C461.5 102.8 468.9 113.2 475.5 124.2L480.2 132.3C486.2 143.2 491.5 154.7 495.9 166.6V166.6zM256 336C300.2 336 336 300.2 336 255.1C336 211.8 300.2 175.1 256 175.1C211.8 175.1 176 211.8 176 255.1C176 300.2 211.8 336 256 336z"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M575.8 255.5C575.8 273.5 560.8 287.6 543.8 287.6H511.8L512.5 447.7C512.5 450.5 512.3 453.1 512 455.8V472C512 494.1 494.1 512 472 512H456C454.9 512 453.8 511.1 452.7 511.9C451.3 511.1 449.9 512 448.5 512H392C369.9 512 352 494.1 352 472V384C352 366.3 337.7 352 320 352H256C238.3 352 224 366.3 224 384V472C224 494.1 206.1 512 184 512H128.1C126.6 512 125.1 511.9 123.6 511.8C122.4 511.9 121.2 512 120 512H104C81.91 512 64 494.1 64 472V360C64 359.1 64.03 358.1 64.09 357.2V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L564.8 231.5C572.8 238.5 576.9 246.5 575.8 255.5L575.8 255.5z"/></svg>

After

Width:  |  Height:  |  Size: 920 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M490.3 40.4C512.2 62.27 512.2 97.73 490.3 119.6L460.3 149.7L362.3 51.72L392.4 21.66C414.3-.2135 449.7-.2135 471.6 21.66L490.3 40.4zM172.4 241.7L339.7 74.34L437.7 172.3L270.3 339.6C264.2 345.8 256.7 350.4 248.4 353.2L159.6 382.8C150.1 385.6 141.5 383.4 135 376.1C128.6 370.5 126.4 361 129.2 352.4L158.8 263.6C161.6 255.3 166.2 247.8 172.4 241.7V241.7zM192 63.1C209.7 63.1 224 78.33 224 95.1C224 113.7 209.7 127.1 192 127.1H96C78.33 127.1 64 142.3 64 159.1V416C64 433.7 78.33 448 96 448H352C369.7 448 384 433.7 384 416V319.1C384 302.3 398.3 287.1 416 287.1C433.7 287.1 448 302.3 448 319.1V416C448 469 405 512 352 512H96C42.98 512 0 469 0 416V159.1C0 106.1 42.98 63.1 96 63.1H192z"/></svg>

After

Width:  |  Height:  |  Size: 925 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M204.3 32.01H96c-52.94 0-96 43.06-96 96c0 17.67 14.31 31.1 32 31.1s32-14.32 32-31.1c0-17.64 14.34-32 32-32h108.3C232.8 96.01 256 119.2 256 147.8c0 19.72-10.97 37.47-30.5 47.33L127.8 252.4C117.1 258.2 112 268.7 112 280v40c0 17.67 14.31 31.99 32 31.99s32-14.32 32-31.99V298.3L256 251.3c39.47-19.75 64-59.42 64-103.5C320 83.95 268.1 32.01 204.3 32.01zM144 400c-22.09 0-40 17.91-40 40s17.91 39.1 40 39.1s40-17.9 40-39.1S166.1 400 144 400z"/></svg>

After

Width:  |  Height:  |  Size: 682 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M495.5 223.2C491.6 223.7 487.6 224 483.4 224C457.4 224 434.2 212.6 418.3 195C402.4 212.6 379.2 224 353.1 224C327 224 303.8 212.6 287.9 195C272 212.6 248.9 224 222.7 224C196.7 224 173.5 212.6 157.6 195C141.7 212.6 118.5 224 92.36 224C88.3 224 84.21 223.7 80.24 223.2C24.92 215.8-1.255 150.6 28.33 103.8L85.66 13.13C90.76 4.979 99.87 0 109.6 0H466.4C476.1 0 485.2 4.978 490.3 13.13L547.6 103.8C577.3 150.7 551 215.8 495.5 223.2H495.5zM499.7 254.9C503.1 254.4 508 253.6 512 252.6V448C512 483.3 483.3 512 448 512H128C92.66 512 64 483.3 64 448V252.6C67.87 253.6 71.86 254.4 75.97 254.9L76.09 254.9C81.35 255.6 86.83 256 92.36 256C104.8 256 116.8 254.1 128 250.6V384H448V250.7C459.2 254.1 471.1 256 483.4 256C489 256 494.4 255.6 499.7 254.9L499.7 254.9z"/></svg>

After

Width:  |  Height:  |  Size: 995 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M572.1 82.38C569.5 71.59 559.8 64 548.7 64h-100.8c.2422-12.45 .1078-23.7-.1559-33.02C447.3 13.63 433.2 0 415.8 0H160.2C142.8 0 128.7 13.63 128.2 30.98C127.1 40.3 127.8 51.55 128.1 64H27.26C16.16 64 6.537 71.59 3.912 82.38C3.1 85.78-15.71 167.2 37.07 245.9c37.44 55.82 100.6 95.03 187.5 117.4c18.7 4.805 31.41 22.06 31.41 41.37C256 428.5 236.5 448 212.6 448H208c-26.51 0-47.99 21.49-47.99 48c0 8.836 7.163 16 15.1 16h223.1c8.836 0 15.1-7.164 15.1-16c0-26.51-21.48-48-47.99-48h-4.644c-23.86 0-43.36-19.5-43.36-43.35c0-19.31 12.71-36.57 31.41-41.37c86.96-22.34 150.1-61.55 187.5-117.4C591.7 167.2 572.9 85.78 572.1 82.38zM77.41 219.8C49.47 178.6 47.01 135.7 48.38 112h80.39c5.359 59.62 20.35 131.1 57.67 189.1C137.4 281.6 100.9 254.4 77.41 219.8zM498.6 219.8c-23.44 34.6-59.94 61.75-109 81.22C426.9 243.1 441.9 171.6 447.2 112h80.39C528.1 135.7 526.5 178.7 498.6 219.8z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M319.9 320c57.41 0 103.1-46.56 103.1-104c0-57.44-46.54-104-103.1-104c-57.41 0-103.1 46.56-103.1 104C215.9 273.4 262.5 320 319.9 320zM369.9 352H270.1C191.6 352 128 411.7 128 485.3C128 500.1 140.7 512 156.4 512h327.2C499.3 512 512 500.1 512 485.3C512 411.7 448.4 352 369.9 352zM512 160c44.18 0 80-35.82 80-80S556.2 0 512 0c-44.18 0-80 35.82-80 80S467.8 160 512 160zM183.9 216c0-5.449 .9824-10.63 1.609-15.91C174.6 194.1 162.6 192 149.9 192H88.08C39.44 192 0 233.8 0 285.3C0 295.6 7.887 304 17.62 304h199.5C196.7 280.2 183.9 249.7 183.9 216zM128 160c44.18 0 80-35.82 80-80S172.2 0 128 0C83.82 0 48 35.82 48 80S83.82 160 128 160zM551.9 192h-61.84c-12.8 0-24.88 3.037-35.86 8.24C454.8 205.5 455.8 210.6 455.8 216c0 33.71-12.78 64.21-33.16 88h199.7C632.1 304 640 295.6 640 285.3C640 233.8 600.6 192 551.9 192z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

File diff suppressed because one or more lines are too long

View File

@ -1,13 +1,13 @@
{{define "admin_menu"}} {{define "admin_menu"}}
<aside class="asideAdmin mt-2"> <aside class="md:lg:absolute m-6 mr-8">
<h4> <h4 class="text-2xl font-bold">
Administration Administration
</h4> </h4>
<ul class="side-menu"> <ul class="side-menu">
<li><a href="/admin/settings" {{if eq . "config"}}class="is-active"{{end}}>Réglages</a></li> <li><a class="admin-links" href="/admin/settings" {{if eq . "config"}}class="is-active"{{end}}><span>Réglages</span><img class="custom-icon" src="/icons/gear-solid.svg"/></a></li>
<li><a href="/admin/users" {{if eq . "users"}}class="is-active"{{end}}>Utilisateurs</a></li> <li><a class="admin-links" href="/admin/users" {{if eq . "users"}}class="is-active"{{end}}><span>Utilisateurs</span><img class="custom-icon" src="/icons/users-solid.svg"/></a></li>
<li><a href="/admin/apps" {{if eq . "apps"}}class="is-active"{{end}}>Applications</a></li> <li><a class="admin-links" href="/admin/apps" {{if eq . "apps"}}class="is-active"{{end}}><span>Applications</span><img class="custom-icon" src="/icons/cubes-stacked-solid.svg"/></a></li>
<li><a href="/admin/market" {{if eq . "market"}}class="is-active"{{end}}>Place de marché</a></li> <li><a class="admin-links" href="/admin/market" {{if eq . "market"}}class="is-active"{{end}}><span>Place de marché</span><img class="custom-icon" src="/icons/store-solid.svg"/></a></li>
</ul> </ul>
</aside> </aside>
{{end}} {{end}}

View File

@ -1,53 +1,25 @@
{{define "app_tile" }} {{define "app_tile" }}
<div class="tile is-parent is-4"> <div>
<article class="app-tile tile is-child" data-controller="app-tile"> <article data-controller="app-tile">
<div class="front notification"> <div class="m-4 sm:block md:lg:flex w-100">
<p class="title">{{ .Manifest.Title }}</p> <div class="flex flex-col md:flex-row md:max-w-xl rounded-lg bg-white shadow-lg">
<p class="subtitle">{{ index .Manifest.Tags 0 }}</p> <div class="p-6 flex flex-col justify-start">
<div class="level is-mobile"> <h5 class="text-gray-900 text-xl font-medium mb-2"><code>{{ .Manifest.Title }}</code></h5>
<div class="level-left"> <div class="flex justify-between">
<div class="level-item"> <div>
<div class="buttons"> <p class="text-gray-600 text-xs">{{ index .Manifest.Tags 0 }}</p>
{{if .Manifest.Options.HighscoresEnabled}} </div>
<a class="button is-outlined is-link is-medium" <div>
href="highscores/{{ .Manifest.ID }}"> <a class="flex"
<svg class="icon"> href="apps/{{ .Manifest.ID }}">
<use xlink:href="#trophy"></use> <span>Ouvrir</span>
</svg> <img class="custom-icon" width="50" height="50" src="/icons/chevron-right-solid.svg"/>
</a> </a>
{{end}} </div>
{{ if .Manifest.Description }} </div>
<button data-action="click->app-tile#flip"
class="button is-outlined is-info is-medium">
<svg class="icon">
<use xlink:href="#question"></use>
</svg>
</button>
{{ end }}
</div> </div>
</div> </div>
</div> </div>
<div class="level-right">
<div class="level-item">
<a class="button is-primary is-medium has-no-shadow"
href="apps/{{ .Manifest.ID }}">
<span>Ouvrir</span>
<svg class="icon">
<use xlink:href="#chevron-right"></use>
</svg>
</a>
</div>
</div>
</div>
</div>
{{ if .Manifest.Description }}
<div class="back notification" data-action="click->app-tile#flip">
<div class="content">
{{ markdown .Manifest.Description }}
</div>
</div>
{{ end }}
</article> </article>
</div> </div>
{{end}} {{end}}

View File

@ -6,14 +6,14 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{block "title" . -}}{{- end}}</title> <title>{{block "title" . -}}{{- end}}</title>
<link rel="stylesheet" href="/css/server.css"> <link rel="stylesheet" href="/css/server.css">
<link rel="stylesheet" href="/css/form.css">
<link rel="stylesheet" href="/css/custom.css"> <link rel="stylesheet" href="/css/custom.css">
{{- block "head_style" . -}}{{end}}
{{- block "head_script" . -}} {{- block "head_script" . -}}
{{template "js_config" .}} {{template "js_config" .}}
<script defer src="/server.js"></script> <script defer src="/server.js"></script>
<script defer src="/server.js"></script> <script defer src="/server.js"></script>
<script src="/js/tailwind-3.0.24.js"></script> <script src="/js/tailwind-3.0.24.js"></script>
<script src="/js/font-awesome-5.3.1.js"></script>
{{- block "head_style" . -}}{{end}}
{{end}} {{end}}
</head> </head>
<body> <body>

View File

@ -1,5 +1,5 @@
{{define "flash"}} {{define "flash"}}
<div class="flash has-margin-top-small has-margin-bottom-small"> <div class="mt-8">
{{- range .Flashes -}} {{- range .Flashes -}}
{{- if eq .Type "error" -}} {{- if eq .Type "error" -}}
{{template "flash_message" map "Title" "Erreur" "MessageClass" "is-danger" "Message" .Message }} {{template "flash_message" map "Title" "Erreur" "MessageClass" "is-danger" "Message" .Message }}
@ -15,9 +15,7 @@
{{end}} {{end}}
{{define "flash_message" -}} {{define "flash_message" -}}
<div class="message {{.MessageClass}}"> <div class="p-2 bg-cadoles items-center {{.MessageClass}} text-indigo-100 leading-none lg:rounded-full flex lg:inline-flex" role="alert">
<div class="message-body"> <span class="font-semibold mr-2 text-left flex-auto">{{ .Message }}</span>
<span class="has-text-weight-bold">{{.Title}}</span> {{.Message}}
</div>
</div> </div>
{{- end}} {{- end}}

View File

@ -9,18 +9,13 @@
<li class="flashlight"><a href="/"><img src="/assets/logo.svg"></a></li> <li class="flashlight"><a href="/"><img src="/assets/logo.svg"></a></li>
{{if .IsAdmin}} {{if .IsAdmin}}
<li> <li>
<a href="/admin/logout" class="button is-warning is-medium" style="font-size: 0.73em;"> <a href="/admin/logout" class="ligth">Logout</a>
<svg class="icon" width="50" height="50">
<use xlink:href="#sign-out-alt"></use>
</svg>
</a>
</li> </li>
{{end}} {{end}}
<li> <li>
<a id="flash" href="/profile">Profile</a> <a iclass="ligth" href="/profile">Profile</a>
</li> </li>
<li><a class="ligth" href="/admin">Admin</a></li> <li><a class="ligth" href="/admin">Admin</a></li>
<li><a href="#">Feedback</a></li>
</ul> </ul>
</div> </div>
</header> </header>

View File

@ -1,108 +1,83 @@
{{define "title"}}Modifier l'app - Administration - Arcad{{end}} {{define "title"}}Modifier l'app - Administration - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section class="is-fullheight section"> <section class="block">
<div class="container"> <div>
<div class="columns"> <div>
<div class="column is-2"> <div>
{{template "admin_menu" ""}} {{template "admin_menu" ""}}
</div> </div>
<div class="column is-10"> <div>
{{template "flash" .}} {{template "flash" .}}
<div class="level"> <div>
<div class="level-left"> <div>
<a class="button level-item" href="/admin/apps">← Retour</a> <a class="button level-item" href="/admin/apps">← Retour</a>
</div> </div>
<div class="level-right"></div> <div class="level-right"></div>
</div> </div>
<form class="has-margin-top-small" action="/admin/apps/{{ .App.ID }}" method="post"> <form action="/admin/apps/{{ .App.ID }}" method="post">
<div class="columns"> <div>
<div class="column is-12"> <div>
<div class="level"> <h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Informations de l'app</h5>
<div class="level-left"> <div class="field level-item">
<h5 class="is-size-5 level-item">Informations de l'app</h5> <input id="publishedSwitch" type="checkbox" name="published" class="" {{if .IsPublished}}checked="checked"{{end}} />
</div> <label for="publishedSwitch">Publiée ?</label>
<div class="level-right">
<div class="field level-item">
<input id="publishedSwitch" type="checkbox" name="published" class="switch" {{if .IsPublished}}checked="checked"{{end}} />
<label for="publishedSwitch">Publiée ?</label>
</div>
</div> </div>
</div> </div>
<div class="field"> <div class="field">
<label class="label">Identifiant</label> <label class="block text-gray-700 text-lg font-bold mb-2">Identifiant</label>
<div class="control"> <div>
<p class="input">{{ .App.ID }}</p> <p class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline">{{ .App.ID }}</p>
<p class="helper">Non modifiable</p>
</div> </div>
</div> </div>
<div class="field"> <div class="field">
<label class="label">Titre</label> <label class="block text-gray-700 text-lg font-bold mb-2">Titre</label>
<div class="control"> <div>
<input class="input" type="text" <input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" type="text"
name="title" name="title"
value="{{if .Form}}{{ .Form.Get "title" }}{{else}}{{ .App.Manifest.Title }}{{end}}"> value="{{if .Form}}{{ .Form.Get "title" }}{{else}}{{ .App.Manifest.Title }}{{end}}">
<label className="checkbox is-right">
<input type="checkbox" name="resetTitle" />
Réinitialiser la valeur par défaut ?
</label>
</div> </div>
</div> </div>
<div class="field"> <div class="field">
<label class="label">Description</label> <label class="block text-gray-700 text-lg font-bold mb-2">Description</label>
<div class="control"> <div>
<textarea class="textarea" <textarea class="h-64 focus:border-cyan-600 block w-full px-3 py-1.5 text-base font-normal text-gray-700 bg-white bg-clip-padding border border-solid border-gray-300 rounded transition ease-in-out m-0 focus:text-gray-700 focus:bg-white focus:outline-none"
name="description">{{if .Form}}{{ .Form.Get "description" }}{{else}}{{ .App.Manifest.Description }}{{end}}</textarea> name="description">{{if .Form}}{{ .Form.Get "description" }}{{else}}{{ .App.Manifest.Description }}{{end}}</textarea>
<label className="checkbox is-right">
<input type="checkbox" name="resetDescription" />
Réinitialiser la valeur par défaut ?
</label>
</div> </div>
</div> </div>
<div class="field"> <div class="field">
<label class="label">Ordre d'affichage</label> <label class="block text-gray-700 text-lg font-bold mb-2">Ordre d'affichage</label>
<div class="control"> <div>
<input class="input" type="number" <input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" type="number"
step="1" step="1"
min="0" min="0"
name="order" name="order"
value="{{if .Form}}{{ .Form.Get "order" }}{{else}}{{ .App.Order }}{{end}}"> value="{{if .Form}}{{ .Form.Get "order" }}{{else}}{{ .App.Order }}{{end}}">
<label className="checkbox is-right">
<input type="checkbox" name="resetOrder" />
Réinitialiser la valeur par défaut ?
</label>
</div> </div>
</div> </div>
<div class="field" data-controller="tags-editor"> <div class="field" data-controller="tags-editor">
<label class="label">Tags</label> <label class="block text-gray-700 text-lg font-bold mb-2">Tags</label>
<div class="control"> <div>
<div class="field has-addons"> <div class="field has-addons">
<div class="control"> <div class="flex">
<input class="input is-small" type="text" placeholder="Nouveau tag" data-target="tags-editor.newTag"> <input class="w-5/6 shadow appearance-none border focus:border-cyan-600 rounded-l w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" type="text" placeholder="Nouveau tag" data-target="tags-editor.newTag">
</div> <a class="text-center w-1/6 text-white p-1 bg-cyan-600 text-bold rounded-r" data-action="click->tags-editor#onAddTag">
<div class="control">
<a class="button is-small is-info has-text-bold" data-action="click->tags-editor#onAddTag">
+ +
</a> </a>
</div> </div>
</div> </div>
<div class="tags" data-target="tags-editor.tagsContainer"></div> <div class="hidden" data-target="tags-editor.tagsContainer"></div>
<input class="input is-hidden" type="text" <input class="mt-4 shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" type="text"
data-target="tags-editor.tagsSource" data-target="tags-editor.tagsSource"
name="tags" name="tags"
value="{{if .Form}}{{ .Form.Get "tags" }}{{else}}{{range .App.Manifest.Tags}}{{.}},{{end}}{{end}}" /> value="{{if .Form}}{{ .Form.Get "tags" }}{{else}}{{range .App.Manifest.Tags}}{{.}},{{end}}{{end}}" />
<label className="checkbox is-right">
<input type="checkbox" name="resetOrder" />
Réinitialiser la valeur par défaut ?
</label>
</div> </div>
</div> </div>
{{ .csrfField }} {{ .csrfField }}
<div class="buttons" style="justify-content:flex-end"> <div class="buttons" style="justify-content:flex-end">
<button type="submit" class="button is-primary is-normal">Modifier</button> <button type="submit" class="block m-auto mt-8 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Modifier</button>
</div> </div>
</div> </div>
</div>
</form> </form>
</div> </div>
</div> </div>

View File

@ -1,52 +1,74 @@
{{define "title"}}Applications - Administration - Arcad{{end}} {{define "title"}}Applications - Administration - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section class="home is-fullheight section"> <section class="block">
<div class="container"> <div>
<div class="columns"> <div>
<div class="column is-2"> <div>
{{template "admin_menu" "apps"}} {{template "admin_menu" "apps"}}
</div> </div>
<div class="column is-10"> <div>
{{template "flash" .}} {{template "flash" .}}
<h4 class="is-size-4">Liste des applications installées</h4> <h4 class="text-xl text-center font-bold mb-2">Liste des applications installées</h4>
<div class="has-text-right"> <div class="text-right mb-2">
<b>Total</b> {{ .AppsCount }} <b>Total</b> {{ .AppsCount }}
</div> </div>
<div class="table-container"> <div class="relative overflow-x-auto shadow-md sm:rounded-lg">
<table class="table is-fullwidth is-striped"> <table class="w-full text-sm text-left text-gray-500 dark:text-gray-400">
<thead> <thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
<tr> <tr>
<th>ID</th> <th scope="col" class="px-6 py-3">
<th>Titre</th> ID
<th>Version</th> </th>
<th>Ordre d'affichage</th> <th scope="col" class="px-6 py-3">
<th>Publiée ?</th> Titre
<th>Tags</th> </th>
<th class="has-text-right">Actions</th> <th scope="col" class="px-6 py-3">
</tr> Version
</thead> </th>
<tbody> <th scope="col" class="px-6 py-3">
Ordre d'affichage
</th>
<th scope="col" class="px-6 py-3">
Publiée ?
</th>
<th scope="col" class="px-6 py-3">
Tags
</th>
<th scope="col" class="px-6 py-3">
Actions
</th>
</tr>
</thead>
<tbody>
{{range .Apps}} {{range .Apps}}
<tr> <tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
<td><code>{{ .ID }}</code></td> <th scope="row" class="px-6 py-4 font-medium text-gray-900 dark:text-white whitespace-nowrap">
<td>{{ .Manifest.Title }}</td> <code>{{ .ID }}</code>
<td>{{ if eq .Manifest.Version "" }}--{{else}}{{ .Manifest.Version }}{{end}}</td> </th>
<td>{{ .Order }}</td> <td class="px-6 py-4">
<td>{{ if .Published }}oui{{else}}non{{end}}</td> {{ .Manifest.Title }}
<td> </td>
{{range .Manifest.Tags}} <td class="px-6 py-4">
<span class="tag is-info">{{ . }}</span> {{ if eq .Manifest.Version "" }}--{{else}}{{ .Manifest.Version }}{{end}}
{{end}} </td>
</td> <td class="px-6 py-4">
<td> {{ .Order }}
<div class="buttons are-small is-right"> </td>
<a class="button is-link" href="/admin/apps/{{ .ID }}">Modifier</a> <td class="px-6 py-4">
</div> {{ if .Published }}oui{{else}}non{{end}}
</td> </td>
<td class="px-6 py-4">
{{range .Manifest.Tags}}
<span class="tag is-info">{{ . }}</span>
{{end}}
</td>
<td class="px-6 py-4 text-right">
<a class="font-medium block m-auto mt-8 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" href="/admin/apps/{{ .ID }}">Modifier</a>
</td>
</tr> </tr>
{{else}} {{else}}
<tr class="has-text-centered is-italic"> <tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
<td colspan="7"> <td colspan="7">
Aucune application installée. Aucune application installée.
</td> </td>

View File

@ -1,21 +1,28 @@
{{define "title"}}Login - Administration - Arcad{{end}} {{define "title"}}Login - Administration - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{- block "head_style" . -}}
<link rel="stylesheet" href="/css/login_form.css">
{{end}}
{{template "header" .}} {{template "header" .}}
<section class="login is-fullheight section"> <section class="flex flex-col space-y-10" style="min-height:80vh">
<div class="container"> <div>
{{template "flash" .}} {{template "flash" .}}
<div class="loginForm"> <div style="margin-top:20vh;">
<h4>Administration</h4> <h4 class="text-4xl font-medium text-center" style="color: #078eb5;">Administration</h4>
<form method="POST"> <form method="POST">
<input <div class="w-3/4 transform border-b-2 bg-transparent text-lg duration-300 focus-within:border-sky-600">
name="password" type="password" <input
autocomplete="current-password" class="border-none bg-transparent outline-none placeholder:italic focus:outline-none"
placeholder="Mot de passe"> name="password" type="password"
{{ .csrfField }} autocomplete="current-password"
<button>S'identifier</button> placeholder="Mot de passe">
</form> </div>
</div> {{ .csrfField }}
</div> <button class="p-20 transform rounded-sm color-white text-white py-2 font-bold duration-300 hover:bg-sky-600 shadow-lg shadow-blue-500/50" style="background-color: #078eb5;">S'identifier</button>
</section> </form>
</div>
</div>
</section>
{{end}} {{end}}
{{template "base" .}} {{template "base" .}}

View File

@ -1,27 +1,38 @@
{{define "title"}}Installer une application - Administration - Arcad{{end}} {{define "title"}}Installer une application - Administration - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section class="home is-fullheight section" data-controller="app-install"> <section class="block" data-controller="app-install">
<div class="container"> <div class="container">
<div class="columns"> <div class="">
<div class="column is-2">
{{template "admin_menu" "market"}} {{template "admin_menu" "market"}}
</div> </div>
<div class="column is-10"> <div class="">
{{template "flash" .}} {{template "flash" .}}
{{if .App}} {{if .App}}
<article class="message is-info"> <div class="w-full md:inset-0 md:h-full">
<div class="message-header"> <div class="relative p-4 w-full max-w-2xl h-full md:h-auto">
<p>Installation d'une application</p> <!-- Modal content -->
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
<!-- Modal header -->
<div class="flex justify-between items-start p-4 rounded-t border-b dark:border-gray-600">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white">
Installation d'une application - <code>{{ .App.Name }}</code>
</h3>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<p data-target="app-install.message" class="text-base leading-relaxed text-gray-500 dark:text-gray-400">
Êtes vous sûr de vouloir installer l'application <code>{{ .App.Name }}</code> en version <code>{{ .App.LatestRelease.Version }}</code> développée par <b>{{ .App.Owner.Username }}</b> ?
</p>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 rounded-b border-t border-gray-200 dark:border-gray-600">
<a data-target="app-install.cancelButton" href="/admin/market" class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4 focus:outline-none font-bold focus:ring-blue-300 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10 dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600">Annuler</a>
<button data-target="app-install.installButton" data-action="click->app-install#onInstallClick" class="text-white bg-blue-500 hover:bg-blue-700 font-bold focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center">Confirmer</a>
</div>
</div> </div>
<div class="message-body"> </div>
<p data-target="app-install.message">Êtes vous sûr de vouloir installer l'application <code>{{ .App.Name }}</code> en version <code>{{ .App.LatestRelease.Version }}</code> développée par <b>{{ .App.Owner.Username }}</b> ?</p> </div>
<div class="buttons is-right">
<a data-target="app-install.cancelButton" href="/admin/market" class="button is-outlined is-link">Annuler</a>
<button data-target="app-install.installButton" data-action="click->app-install#onInstallClick" class="button is-primary">Confirmer</a>
</div>
</div>
</article>
{{else}} {{else}}
<article class="message is-danger"> <article class="message is-danger">
<div class="message-body"> <div class="message-body">
@ -33,7 +44,6 @@
</article> </article>
{{end}} {{end}}
</div> </div>
</div>
</div> </div>
</section> </section>
{{end}} {{end}}

View File

@ -1,66 +1,51 @@
{{define "title"}}Place de marché - Administration - Arcad{{end}} {{define "title"}}Place de marché - Administration - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section class="home is-fullheight section"> <section class="block">
<div class="container"> <div class="container">
<div class="columns"> <div>
<div class="column is-2"> {{template "admin_menu" "market"}}
{{template "admin_menu" "market"}} </div>
<div>
{{template "flash" .}}
<form class="mb-4 pl-2 w-full" action="/admin/market" methode="GET">
<div class="flex">
<div class="w-2/3">
<input class="p-2 w-full border rounded-l" type="text" name="search" placeholder="Rechercher une application..." value="{{ .Search }}">
</div>
<div>
<button class="transform sm:w-1/3 rounded-r bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 font-bold duration-300">Rechercher</button>
</div>
</div>
</form>
<div class="mr-4 text-right">
<b>Total</b> {{ .ResultsCount }}
</div> </div>
<div class="column is-10"> {{range .Results}}
{{template "flash" .}} <div class="m-4 sm:block md:lg:flex w-100">
<form action="/admin/market" methode="GET"> <div class="flex flex-col md:flex-row md:max-w-xl rounded-lg bg-white shadow-lg">
<div class="field has-addons mt-5 mb-5"> <div class="p-6 flex flex-col justify-start">
<div class="control is-expanded"> <h5 class="text-gray-900 text-xl font-medium mb-2"><code>{{ .Name }}</code></h5>
<input class="input is-medium" type="text" name="search" placeholder="Rechercher une application..." value="{{ .Search }}"> <p class="md:max-w-xl break-all text-gray-700 text-base mb-4 max-width">
</div> {{ .LatestRelease.Description }}
<div class="control"> </p>
<button type="submit" class="button is-medium"> <div class="flex justify-between">
Rechercher <div>
</button> <p class="text-gray-600 text-xs">{{ localeTimeFormat .LatestRelease.CreatedAt.Time "02/01/2006 15:04" "fr_FR" }}</p>
<p class="text-gray-600 text-xs">{{ .Owner.Username }} - V{{ .LatestRelease.Version }} </p>
</div>
<div>
<a class="" href="/admin/market/{{ .ID }}/install"><img class="custom-icon" src="/icons/download-solid.svg"/></a>
</div>
</div>
</div> </div>
</div> </div>
</form>
<div class="has-text-right">
<b>Total</b> {{ .ResultsCount }}
</div> </div>
<div class="table-container"> {{else}}
<table class="table is-fullwidth is-striped"> <div>
<thead> Aucun résultat.
<tr> </div>
<th>ID</th> {{end}}
<th>Description</th>
<th>Développeur</th>
<th>Dernière version</th>
<th>Dernière mise à jour</th>
<th class="has-text-right">Actions</th>
</tr>
</thead>
<tbody>
{{range .Results}}
<tr>
<td><code>{{ .Name }}</code></td>
<td>{{ .LatestRelease.Description }}</td>
<td>{{ .Owner.Username }}</td>
<td>{{ .LatestRelease.Version }}</td>
<td>{{ localeTimeFormat .LatestRelease.CreatedAt.Time "02/01/2006 15:04" "fr_FR" }}</td>
<td>
<div class="buttons are-small is-right">
<a class="button is-link" href="/admin/market/{{ .ID }}/install">Installer</a>
</div>
</td>
</tr>
{{else}}
<tr class="has-text-centered is-italic">
<td colspan="6">
Aucun résultat.
</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</div>
</div> </div>
</div> </div>
</section> </section>

View File

@ -1,13 +1,13 @@
{{define "title"}}Création du mot de passe - Administration - Arcad{{end}} {{define "title"}}Création du mot de passe - Administration - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section class="login is-fullheight section"> <section class="block">
<div class="container"> <div class="container">
<div class="columns"> <div class="columns">
<div class="column is-offset-4 is-4"> <div class="column is-offset-4 is-4">
{{template "flash" .}} {{template "flash" .}}
<div class="box"> <div class="box">
<h4 class="title is-size-4">Création du mot de passe de l'administrateur</h4> <h4 class="text-xl text-center font-bold mb-8">Création du mot de passe de l'administrateur</h4>
<form method="POST"> <form method="POST">
<div class="field"> <div class="field">
<div class="control"> <div class="control">

View File

@ -1,34 +1,35 @@
{{define "title"}}Configuration - Administration - Arcad{{end}} {{define "title"}}Configuration - Administration - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{- block "head_style" . -}}
<link rel="stylesheet" href="/css/admin_settings.css">
{{end}}
{{template "header" .}} {{template "header" .}}
<section class="home is-fullheight section" data-controller="clock-sync"> <section class="block" data-controller="clock-sync">
<div class="container"> <div class="mt-6">
<div class="columns"> {{template "admin_menu" "config"}}
<div class="column is-2"> </div>
{{template "admin_menu" "config"}} <div class="content">
</div> {{template "flash" .}}
<div class="mt-2"> <div class="mt-6">
{{template "flash" .}} <h4 class="text-xl text-center font-bold mb-8">Réglages</h4>
<h4 class="is-size-4">Réglages</h4> <form id="adminSettings" class="rounded-md shadow-xl shadow-cyan-800/50 p-8 block m-auto w-4/5" method="post">
<form id="adminSettings" method="post"> {{ .csrfField }}
{{ .csrfField }} {{ $settings := .Settings }}
{{ $settings := .Settings }} {{range $id, $meta := .Metadatas}}
{{range $id, $meta := .Metadatas}} {{ $se := $settings.Get $id }}
{{ $se := $settings.Get $id }} {{ $data := createMap "ID" $id "Setting" $se "Meta" $meta }}
{{ $data := createMap "ID" $id "Setting" $se "Meta" $meta }} {{if eq $meta.ValueType "password"}}
{{if eq $meta.ValueType "password"}} {{template "password_setting" $data}}
{{template "password_setting" $data}} {{else if eq $meta.ValueType "markdown"}}
{{else if eq $meta.ValueType "markdown"}} {{template "markdown_setting" $data}}
{{template "markdown_setting" $data}} {{end}}
{{end}} {{end}}
{{end}} <div class="field is-grouped is-grouped-right">
<div class="field is-grouped is-grouped-right"> <p class="control">
<p class="control"> <input type="submit" class="block m-auto mt-8 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" value="Enregistrer">
<input type="submit" class="button is-success" value="Enregistrer"> </p>
</p> </div>
</div> </form>
</form>
</div>
</div> </div>
</div> </div>
</section> </section>
@ -41,30 +42,32 @@
{{template "base" .}} {{template "base" .}}
{{define "password_setting"}} {{define "password_setting"}}
<div class="field"> <div>
<label class="label">{{ .Meta.Label }}</label> <label for="password" class="block text-gray-700 text-lg font-bold mb-2">{{ .Meta.Label }}</label>
<div class="control"> <div class="control">
<input class="input" name="{{ .ID }}" <input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" name="{{ .ID }}"
autocomplete="new-password" autocomplete="new-password"
type="password"> type="password"
id="password">
</div> </div>
</div> </div>
<div class="field"> <div>
<label class="label">{{ .Meta.Label }} (confirmation)</label> <label for="confirmPassword" class="block text-gray-700 text-lg font-bold mb-2">{{ .Meta.Label }} (confirmation)</label>
<div class="control"> <div class="control">
<input class="input" name="{{ .ID }}-confirm" <input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" name="{{ .ID }}-confirm"
autocomplete="new-password" autocomplete="new-password"
type="password"> type="password"
id="confirmPassword">
</div> </div>
</div> </div>
{{end}} {{end}}
{{define "markdown_setting"}} {{define "markdown_setting"}}
<div class="field"> <div>
<label class="label">{{ .Meta.Label }}</label> <label for="homeMessage" class="block text-gray-700 text-lg font-bold mb-2">{{ .Meta.Label }}</label>
<div class="field"> <div>
<div class="control"> <div class="control">
<textarea class="textarea" placeholder="{{ .Meta.DefaultValue }}" name="{{ .ID }}">{{- if .Setting}}{{ .Setting.Value }}{{end -}}</textarea> <textarea id="homeMessage" class="focus:border-cyan-600 block w-full px-3 py-1.5 text-base font-normal text-gray-700 bg-white bg-clip-padding border border-solid border-gray-300 rounded transition ease-in-out m-0 focus:text-gray-700 focus:bg-white focus:outline-none" placeholder="{{ .Meta.DefaultValue }}" name="{{ .ID }}">{{- if .Setting}}{{ .Setting.Value }}{{end -}}</textarea>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,7 +1,7 @@
{{define "title"}}Informations de l'utilisateur - Administration - Arcad{{end}} {{define "title"}}Informations de l'utilisateur - Administration - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section class="home is-fullheight section"> <section class="block">
<div class="container"> <div class="container">
<div class="columns"> <div class="columns">
<div class="column is-2"> <div class="column is-2">

View File

@ -1,84 +1,84 @@
{{define "title"}}Informations de l'utilisateur - Administration - Arcad{{end}} {{define "title"}}Informations de l'utilisateur - Administration - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section class="home is-fullheight section"> <section class="block">
<div class="container"> <div>
<div class="columns"> <div>
<div class="column is-2"> <div>
{{template "admin_menu" ""}} {{template "admin_menu" ""}}
</div> </div>
<div class="column is-10"> <div>
{{template "flash" .}} {{template "flash" .}}
<div class="level"> <form action="/admin/users/{{ .User.ID }}" method="post">
<div class="level-left"> <div>
<a class="button level-item" href="/admin/users">← Retour</a> <div>
</div> <h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Informations de l'utilisateur</h5>
<div class="level-right"> <div class="w-5/6 block m-auto">
<a class="button level-item is-danger" href="/admin/users/{{ .User.ID }}/delete">Supprimer</a> <label class="block text-gray-700 text-lg font-bold mb-2">Pseudonyme</label>
</div> <div>
</div> <input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" type="text"
<form class="has-margin-top-small" action="/admin/users/{{ .User.ID }}" method="post">
<div class="columns">
<div class="column is-6">
<h5 class="is-size-5">Informations de l'utilisateur</h5>
<div class="field">
<label class="label">Pseudonyme</label>
<div class="control">
<input class="input" type="text"
name="nickname" name="nickname"
value="{{if .Form}}{{ .Form.Get "nickname" }}{{else}}{{ .User.Nickname }}{{end}}"> value="{{if .Form}}{{ .Form.Get "nickname" }}{{else}}{{ .User.Nickname }}{{end}}">
</div> </div>
</div> </div>
{{ .csrfField }} {{ .csrfField }}
<div class="buttons" style="justify-content:flex-end"> <div class="buttons" style="justify-content:flex-end">
<button type="submit" class="button is-primary is-normal">Modifier</button> <button type="submit" class="block m-auto mt-2 mb-2 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Modifier</button>
</div> </div>
<div class="field"> <div class="w-5/6 block m-auto">
<label class="label">Date de création</label> <label class="block text-gray-700 text-lg font-bold mb-2">Date de création</label>
<div class="control"> <div>
<p class="input" readonly> <p class="shadow appearance-none border focus:border-cyan-800 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" readonly>
{{ localeTimeFormat .User.CreationTime "02/01/2006 15:04" "fr_FR" }} {{ localeTimeFormat .User.CreationTime "02/01/2006 15:04" "fr_FR" }}
</p> </p>
</div> </div>
</div> </div>
<div class="field"> <div class="w-5/6 block m-auto">
<label class="label">Date de dernière connexion</label> <label class="block text-gray-700 text-lg font-bold mb-2">Date de dernière connexion</label>
<div class="control"> <div>
<p class="input" readonly> <p class="shadow appearance-none border focus:border-cyan-800 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" readonly>
{{ localeTimeFormat .User.LastSeenTime "02/01/2006 15:04" "fr_FR" }} {{ localeTimeFormat .User.LastSeenTime "02/01/2006 15:04" "fr_FR" }}
</p> </p>
</div> </div>
</div> </div>
{{with .User.LastUserAgent}} {{with .User.LastUserAgent}}
<div class="field"> <div class="w-5/6 block m-auto">
<label class="label">Dernier système d'exploitation utilisé</label> <label class="block text-gray-700 text-lg font-bold mb-2">Dernier système d'exploitation utilisé</label>
<div class="control"> <div>
<p class="input" readonly> <p class="shadow appearance-none border focus:border-cyan-800 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" readonly>
{{ .OS.Name.StringTrimPrefix }} {{ .OS.Version.Major }}.{{ .OS.Version.Minor }}.{{ .OS.Version.Patch }} {{ .OS.Name.StringTrimPrefix }} {{ .OS.Version.Major }}.{{ .OS.Version.Minor }}.{{ .OS.Version.Patch }}
</p> </p>
</div>
</div> </div>
</div> <div class="w-5/6 block m-auto">
<div class="field"> <label class="block text-gray-700 text-lg font-bold mb-2">Dernier navigateur utilisé</label>
<label class="label">Dernier navigateur utilisé</label> <div>
<div class="control"> <p class="shadow appearance-none border focus:border-cyan-800 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" readonly>
<p class="input" readonly> {{ .Browser.Name.StringTrimPrefix }} {{ .Browser.Version.Major }}.{{ .Browser.Version.Minor }}.{{ .Browser.Version.Patch }}
{{ .Browser.Name.StringTrimPrefix }} {{ .Browser.Version.Major }}.{{ .Browser.Version.Minor }}.{{ .Browser.Version.Patch }} </p>
</p> </div>
</div> </div>
</div> <div class="w-5/6 block m-auto">
<div class="field"> <label class="block text-gray-700 text-lg font-bold mb-2">Dernier type de terminal utilisé</label>
<label class="label">Dernier type de terminal utilisé</label> <div>
<div class="control"> <p class="shadow appearance-none border focus:border-cyan-800 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" readonly>
<p class="input" readonly> {{ .DeviceType.StringTrimPrefix }}
{{ .DeviceType.StringTrimPrefix }} </p>
</p> </div>
</div> </div>
</div>
{{end}} {{end}}
<div class="flex justify-around">
<div>
<a class="items-center py-2 px-4 text-sm font-medium text-center text-gray-900 bg-blue-500 rounded-lg border border-gray-300 hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-700 dark:focus:ring-gray-700" href="/admin/users">← Retour</a>
</div>
<div>
<a class="items-center py-2 px-4 text-sm font-medium text-center text-gray-900 bg-red-500 rounded-lg border border-gray-300 hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-700 dark:focus:ring-gray-700" href="/admin/users/{{ .User.ID }}/delete">Supprimer</a>
</div>
</div>
</div> </div>
<div class="column is-6"> <div>
<h5 class="is-size-5">Carte de membre</h5> <h5 class="text-gray-900 text-xl font-medium mb-2">Carte de membre</h5>
<div class="box has-margin-top-small"> <div class="max-width-full">
<figure class="image is-3by2"> <figure class="image is-3by2">
<a href="/admin/users/{{ .User.ID }}/card" rel="Member card" download="ArcadBox-Member-{{ .User.Nickname }}"> <a href="/admin/users/{{ .User.ID }}/card" rel="Member card" download="ArcadBox-Member-{{ .User.Nickname }}">
<img src="/admin/users/{{ .User.ID }}/card" /> <img src="/admin/users/{{ .User.ID }}/card" />

View File

@ -1,50 +1,36 @@
{{define "title"}}Utilisateurs - Administration - Arcad{{end}} {{define "title"}}Utilisateurs - Administration - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section class="home is-fullheight section"> <section class="block">
<div class="container"> <div class="mt-6">
<div class="columns"> {{template "admin_menu" "config"}}
<div class="column is-2"> </div>
{{template "admin_menu" "users"}} <div>
{{template "flash" .}}
<div class="mt-6">
<h4 class="text-xl text-center font-bold mb-8">Liste des utilisateurs</h4>
<div class="text-right mr-4">
<b>Total</b> {{ .UsersCount }}
</div> </div>
<div class="column is-10"> <div class="container ">
{{template "flash" .}} {{range .Users}}
<h4 class="is-size-4">Liste des utilisateurs</h4> <div class="mt-4 w-11/12 m-auto max-w-sm bg-white rounded-lg border border-gray-200 shadow-md dark:bg-gray-800 dark:border-gray-700">
<div class="has-text-right"> <div class="flex flex-col items-center pb-3">
<b>Total</b> {{ .UsersCount }} <img class="mb-3 mt-3 w-24 h-24 rounded-full shadow-lg" src="/assets/team-poney-alone.svg"/>
<h5 class="mb-1 text-xl font-medium text-gray-900 dark:text-white">{{ .Nickname}}</h5>
<span class="text-sm text-gray-500 dark:text-gray-400">{{ .Nickname }}</span>
<div class="flex mt-4 space-x-3 lg:mt-6">
<a href="/admin/users/{{ .ID }}" class="inline-flex items-center py-2 px-4 text-sm font-medium text-center text-white bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Voir</a>
<a href="/admin/users/{{ .ID }}/delete" class="inline-flex items-center py-2 px-4 text-sm font-medium text-center text-gray-900 bg-white rounded-lg border border-gray-300 hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-700 dark:focus:ring-gray-700">Supprimer</a>
</div>
<div class="flex mt-4 space-x-3 lg:mt-6">
<span>{{ localeTimeFormat .CreationTime "02/01/2006 15:04" "fr_FR" }}</span>
<span>{{ localeTimeFormat .LastSeenTime "02/01/2006 15:04" "fr_FR" }}</span>
</div>
</div>
</div>
{{end}}
</div> </div>
<div class="table-container">
<table class="table is-hovered is-fullwidth is-striped">
<thead>
<tr>
<th>Pseudonyme</th>
<th>Date d'enregistrement</th>
<th>Dernière connexion</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{{range .Users}}
<tr>
<td>{{ .Nickname }}</td>
<td>{{ localeTimeFormat .CreationTime "02/01/2006 15:04" "fr_FR" }}</td>
<td>{{ localeTimeFormat .LastSeenTime "02/01/2006 15:04" "fr_FR" }}</td>
<td>
<div class="field is-grouped">
<div class="control">
<a class="button is-danger is-small" href="/admin/users/{{ .ID }}/delete">Supprimer</a>
</div>
<div class="control">
<a class="button is-info is-small" href="/admin/users/{{ .ID }}">Voir</a>
</div>
</div>
</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</div>
</div> </div>
</div> </div>
</section> </section>

View File

@ -1,22 +1,18 @@
{{define "title"}}{{ .App.Manifest.Title }} - Arcad{{end}} {{define "title"}}{{ .App.Manifest.Title }} - Arcad{{end}}
{{define "body"}} {{define "body"}}
<div class="app-wrapper" data-controller="app" data-app-frame-src="./{{ .App.Manifest.ID }}/"> <div class="flex h-full w-full flex-col" data-controller="app" data-app-frame-src="./{{ .App.Manifest.ID }}/">
<div class="app-header"> <div class="app-header">
<div class="level is-marginless is-mobile"> <div class="flex justify-between">
<div class="level-left"> <div class="level-left">
<a href="../" class="level-item button is-link is-small"> <a href="../" class="level-item button is-link is-small">
<svg class="icon"> <img class="custom-icon" width="50" height="50" src="/icons/house-solid.svg"/>
<use xlink:href="#home"></use>
</svg>
</a> </a>
</div> </div>
<div class="level-right"> <div class="level-right">
{{if .App.Manifest.Options.HighscoresEnabled}} {{if .App.Manifest.Options.HighscoresEnabled}}
<a href="../highscores/{{ .App.Manifest.ID }}" class="level-item button is-link is-small"> <a class="flex" href="../highscores/{{ .App.Manifest.ID }}" class="level-item button is-link is-small">
<span>Classement</span> <span class="mr-1">Classement</span>
<svg class="icon"> <img class="custom-icon" width="50" height="50" src="/icons/trophy-solid.svg"/>
<use xlink:href="#trophy"></use>
</svg>
</a> </a>
{{end}} {{end}}
</div> </div>

View File

@ -1,6 +1,6 @@
{{define "title"}}Borne non disponible - Arcad{{end}} {{define "title"}}Borne non disponible - Arcad{{end}}
{{define "body"}} {{define "body"}}
<section class="is-fullheight section"> <section class="block">
<div class="is-flex is-justify-content-center is-align-content-center is-fullheight"> <div class="is-flex is-justify-content-center is-align-content-center is-fullheight">
<div class="message is-warning is-align-self-center"> <div class="message is-warning is-align-self-center">
<div class="message-body"> <div class="message-body">

View File

@ -5,7 +5,7 @@
{{ if .IsAndroid }} {{ if .IsAndroid }}
{{ $redirectUrl := "intent://arcadbox.local/captive?escape=1#Intent;scheme=http;end" }} {{ $redirectUrl := "intent://arcadbox.local/captive?escape=1#Intent;scheme=http;end" }}
{{ end }} {{ end }}
<section class="home is-fullheight section"> <section class="block">
<div class="container"> <div class="container">
<div class="message is-info"> <div class="message is-info">
<div class="message-body"> <div class="message-body">

View File

@ -1,27 +1,23 @@
{{define "title"}}{{.App.Manifest.Title}} - Tableau des scores - Arcad{{end}} {{define "title"}}{{.App.Manifest.Title}} - Tableau des scores - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section class="home is-fullheight section"> <section class="block">
<div class="container"> <div>
<div class="level"> <div class="flex">
<div class="level-left"> <h1 class="text-4xl mt-2 text-center">{{.App.Manifest.Title}}</h1>
<h1 class="title level-item">{{.App.Manifest.Title}}</h1> <a class="flex m-5"
<h2 class="subtitle level-item">Tableau des scores</h2> href="/apps/{{ .App.ID }}">
</div>
<div class="level-right">
<a class="level-item button is-primary is-large" href="/apps/{{ .App.ID }}">
<span>Ouvrir</span> <span>Ouvrir</span>
<svg class="icon"> <img class="custom-icon" width="50" height="50" src="/icons/chevron-right-solid.svg"/>
<use xlink:href="#chevron-right"></use>
</svg>
</a> </a>
</div> </div>
</div> <div>
<div class="columns"> <div>
<div class="column"> <h2 class="text-xl text-center">Podium</h2>
{{template "podium" .}} {{template "podium" .}}
</div> </div>
<div class="column"> <div class="mb-4">
<h2 class="text-xl">Tableau des scores</h2>
{{template "highscores" .}} {{template "highscores" .}}
</div> </div>
</div> </div>
@ -67,7 +63,6 @@
<span class="pod-position">1</span> <span class="pod-position">1</span>
</div> </div>
</div> </div>
<div class="pod third"> <div class="pod third">
{{ if gt (len .Highscores) 2 }} {{ if gt (len .Highscores) 2 }}
{{ $thirdPlayerHighscore := index .Highscores 2 }} {{ $thirdPlayerHighscore := index .Highscores 2 }}
@ -83,7 +78,6 @@
<div class="pod-position">3</div> <div class="pod-position">3</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{{end}} {{end}}
@ -91,30 +85,46 @@
{{define "highscores"}} {{define "highscores"}}
{{ $users := .Users }} {{ $users := .Users }}
<div class="table-container"> <table class="w-full text-sm text-left text-gray-500 dark:text-gray-400">
<table class="table is-fullwidth is-hoverable is-striped"> <thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
<thead>
<th>Position</th>
<th>Pseudonyme</th>
<th>Score</th>
<th>Date</th>
</thead>
<tbody>
{{range $i, $h := .Highscores}}
{{ $user := (index $users $h.UserID) }}
<tr> <tr>
{{ $position := addInt $i 1 }} <th scope="col" class="px-6 py-3">
<td>{{ $position }}</td> Position
<td>{{with $user}}{{ .Nickname }}{{else}}???{{end}}</td> </th>
<td>{{ $h.Score }}</td> <th scope="col" class="px-6 py-3">
<td>{{ localeTimeFormat $h.CreationTime "02/01/2006 15:04" "fr_FR" }}</td> Pseudonyme
</th>
<th scope="col" class="px-6 py-3">
Score
</th>
<th scope="col" class="px-6 py-3">
Date
</th>
</tr> </tr>
{{else}} </thead>
<tr> <tbody>
<td colspan="4" class="has-text-centered is-italic">Aucun score pour l'instant.</td> {{range $i, $h := .Highscores}}
</tr> {{ $user := (index $users $h.UserID) }}
{{end}} <tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
{{ $position := addInt $i 1 }}
<td scope="row" class="px-6 py-4 font-medium text-gray-900 dark:text-white whitespace-nowrap">
{{ $position }}
</td>
<td class="px-6 py-4">
{{with $user}}{{ .Nickname }}{{else}}???{{end}}
</td>
<td class="px-6 py-4">
{{ $h.Score }}
</td>
<td class="px-6 py-4">
{{ localeTimeFormat $h.CreationTime "02/01/2006 15:04" "fr_FR" }}
</td>
</tr>
{{else}}
<tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
<td colspan="4" class="has-text-centered is-italic">Aucun score pour l'instant.</td>
</tr>
{{end}}
</tbody> </tbody>
</table> </table>
</div>
{{end}} {{end}}

View File

@ -1,24 +1,38 @@
{{define "title"}}Accueil - Arcad{{end}} {{define "title"}}Accueil - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section class="home is-fullheight section"> <section class="block">
<div id="main" class="container"> <div id="main" class="container">
<img src="/assets/arcad.svg">
{{if and .WelcomeMessage .WelcomeMessage.Value}} {{if and .WelcomeMessage .WelcomeMessage.Value}}
<div class="message is-info is-small"> <div class="mt-4">
<div class="message-body">
<div class="content">
{{markdown .WelcomeMessage.Value}} {{markdown .WelcomeMessage.Value}}
</div> </div>
</div>
</div>
{{end}} {{end}}
<div class="tile is-ancestor is-wrap tile-container"> <div class="arcadContent">
{{range .Apps}} <h1 class="font-bold text-3xl mt-4 mb-4">Qu'est ce que c'est ?</h1>
{{- template "app_tile" . -}} <p>Arcad est une suite de logiciels libres, permettant de proposer des services numériques (applications web) de proximité i.e. hébergés sur des équipements réseaux du type borne WiFi (Linksys WRT1900AC par exemple) ou micro-serveur domestique (serveur NAS, Raspberry Pi).
{{end}}
</div> </div>
</div> </div>
</section> </section>
<section class="block">
<h2 class="font-bold text-3xl mt-4 mb-4 text-center">Pourquoi ?</h2>
<div class="arcadContent">
<p>
Un des objectifs du projet est d'offrir un système capable de fonctionner en autonomie: les terminaux numériques (ordinateur, smartphones, tablettes...) des utilisateurs ne doivent pas nécessiter de connexion Internet pour pouvoir accéder aux services.
</p>
<p>
De manière optionnelle, les services intégrés sur une instance Arcad peuvent être exposés sur Internet via un serveur relais disposant d'une adresse publique.
</p>
</div>
</section>
<section>
<h2 class="text-gray-900 text-3xl font-bold font-lg mb-2 mt-2 text-center">Applications</h2>
{{range .Apps}}
{{- template "app_tile" . -}}
{{end}}
</section>
{{end}} {{end}}
{{template "base" .}} {{template "base" .}}

View File

@ -1,74 +1,59 @@
{{define "title"}}Profil - Arcad{{end}} {{define "title"}}Profil - Arcad{{end}}
{{define "body"}} {{define "body"}}
{{template "header" .}} {{template "header" .}}
<section> <section class="block">
<div> <div>
{{template "flash" .}} {{template "flash" .}}
<form action="/login" method="POST" enctype="multipart/form-data"> <form action="/login" method="POST" enctype="multipart/form-data">
<div class="field" style="margin-bottom:0"> <div class="flex justify-around mb-8">
<div class="file is-medium is-success" id="memberCard"> <div class="memberCard">
<label class="file-label"> <label
<input class="file-input" type="file" name="memberCard"> class="m-auto h-44 flex flex-col items-center px-4 py-6 bg-white rounded-md shadow-md tracking-wide uppercase border border-blue cursor-pointer ease-linear transition-all duration-150">
<span class="file-cta"> <img class="custom-icon profile-icon" src="/icons/cloud-arrow-up-solid.svg"/>
<span class="file-icon"> <span class="mt-2 text-base leading-normal">Connexion</span>
<svg class="icon" width="50" height="50"> <input name="memberCard" type='file' class="hidden" />
<use xlink:href="#address-card"></use> </label>
</svg>
</span>
<span class="file-label">
Se connecter
</span>
</span>
</label>
</div>
</div> </div>
{{ .csrfField }} <div class="memberCard">
</form> <a href="/logout" class="button is-warning is-medium">
</div> <label
<div class="level-item"> class="m-auto h-44 flex flex-col items-center px-4 py-6 bg-white rounded-md shadow-md tracking-wide uppercase border border-blue cursor-pointer ease-linear transition-all duration-150">
<a href="/logout" class="button is-warning is-medium"> <img class="custom-icon profile-icon" src="/icons/arrow-right-from-bracket-solid.svg"/>
<svg class="icon" width="50" height="50"> <span class="mt-2 text-base leading-normal">Deconnexion</span>
<use xlink:href="#sign-out-alt"></use> </a>
</svg> </label>
</a> </a>
</div> </div>
</div> </div>
</div> {{ .csrfField }}
<div class="columns"> </form>
<div class="column is-6"> <h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Vos informations</h5>
<h5 class="is-size-5">Vos informations</h5> <form action="/profile" method="post">
<form class="has-margin-top-small" action="/profile" method="post"> <div>
<div class="field"> <label class="block text-gray-700 text-md font-bold mb-2">Pseudonyme</label>
<label class="label">Pseudonyme</label> <div>
<div class="control"> <input class="shadow appearance-none border focus:border-cyan-600 rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" type="text"
<input class="input is-medium" type="text" name="nickname"
name="nickname" value="{{if .Form}}{{ .Form.Get "nickname" }}{{else}}{{ .User.Nickname }}{{end}}">
value="{{if .Form}}{{ .Form.Get "nickname" }}{{else}}{{ .User.Nickname }}{{end}}">
</div> </div>
</div> </div>
{{ .csrfField }} {{ .csrfField }}
<div class="buttons" style="justify-content:flex-end"> <div class="buttons" style="justify-content:flex-end">
<button type="submit" class="button is-primary is-medium"> <button type="submit" class="block m-auto mt-8 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
<span>Modifier</span> <span>Modifier</span>
<span class="icon">
<svg class="icon" width="50" height="50">
<use xlink:href="#edit"></use>
</svg>
</span>
</button> </button>
</div> </div>
</form> </form>
</div> <div>
<div class="column is-6"> <h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Carte de membre</h5>
<h5 class="is-size-5">Carte de membre</h5> <article>
<article class="message is-info"> <div>
<div class="message-body">
Téléchargez et utilisez votre carte de membre afin de pouvoir vous authentifier la prochaine fois avec le même pseudonyme ! Téléchargez et utilisez votre carte de membre afin de pouvoir vous authentifier la prochaine fois avec le même pseudonyme !
</div> </div>
</article> </article>
<figure class="image is-3by2 has-margin-top-small"> <figure class="max-width-full p-2 block m-auto">
<a href="/profile/card" rel="Member card" download="ArcadBox-Member-{{ .User.Nickname }}"> <a href="/profile/card" rel="Member card" download="ArcadBox-Member-{{ .User.Nickname }}">
<img src="/profile/card" /> <img class="" src="/profile/card" />
</a> </a>
</figure> </figure>
</div> </div>