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 {
text-decoration: none;
}
@ -7,8 +64,7 @@ a {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Lato', sans-serif;
font-family: 'Oswald', sans-serif;
font-family: 'Roboto', sans-serif;
}
.wrapper{
position: fixed;
@ -17,22 +73,17 @@ a {
height: 100%;
width: 100%;
background: rgb(36, 36, 36);
/*background: linear-gradient(90deg, #f92c78, #4114a1);*/
/* background: linear-gradient(375deg, #1cc7d0, #2ede98); */
/* background: linear-gradient(-45deg, #e3eefe 0%, #efddfb 100%);*/
transition: all 0.6s ease-in-out;
transition: all 0.2s ease-in-out;
z-index: 19;
}
#active:checked ~ .wrapper{
/*left: 0;*/
right:0;
}
.menu-btn{
position: absolute;
z-index: 20;
right: 20px;
/*left: 20px; */
top: 20px;
top: 2.5vh;
height: 50px;
width: 50px;
text-align: center;
@ -40,11 +91,7 @@ a {
border-radius: 50%;
font-size: 20px;
cursor: pointer;
/*color: #fff;*/
/*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;
transition: all 0.2s ease-in-out;
}
.menu-btn span,
.menu-btn:before,
@ -70,7 +117,7 @@ a {
width: 100%;
height: 100%;
pointer-events: none;
transition: background .6s;
transition: background .2s;
}
/* closing animation */
@ -99,6 +146,10 @@ a {
margin: 15px 0;
}
.wrapper ul li a {
transition-property: font-size;
transition-duration: 1s;
transition-delay: .1s;
text-decoration: none;
font-size: 30px;
font-weight: 500;
@ -109,21 +160,23 @@ a {
line-height: 50px;
margin: 5px 30px;
opacity: 0;
transition: all 0.3s ease;
transition: transform .6s cubic-bezier(0.215, 0.61, 0.355, 1);
/* transition: all 0.3s ease;
transition: transform .2s cubic-bezier(0.215, 0.61, 0.355, 1); */
}
.wrapper ul li a:after{
.wrapper ul li a:hover{
position: absolute;
content: "";
background: #fff;
font-size: 36px;
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(375deg, #1cc7d0, #2ede98);*/
width: 100%;
height: 100%;
/* height: 100%;
left: 0;
top: 0;
top: 0; */
border-radius: 50px;
transform: scaleY(0);
/* transform: scaleY(0); */
z-index: -1;
transition: transform 0.3s ease;
}
@ -131,48 +184,32 @@ a {
transform: scaleY(1);
}
.wrapper ul li a:hover{
color: rgb(7, 142, 181)
/* color: rgb(7, 142, 181) */
}
input[type="checkbox"]{
#active{
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{
opacity: 1;
}
.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);
}
#active:checked ~ .wrapper ul li a{
transform: none;
transition-timing-function: ease, cubic-bezier(.1,1.3,.3,1);
transition-delay: .6s;
transition-delay: .2s;
transform: translateX(-20vh);
}
/** endNavbar */
#main
{
max-width:1280px;
max-width:100%;
min-height:100%;
margin:0 auto;
position:relative;
@ -180,31 +217,29 @@ input[type="checkbox"]{
footer{
position:absolute;
bottom:0;
footer {
/* position:absolute;
bottom:0; */
width:100%;
font-size: 14px;
font-family: Roboto,sans-serif;
font-weight: 300;
color: rgb(74, 74, 74);
line-height: 18px;
padding: 1.2rem;
}
#logo img {
margin: 1rem 1rem;
padding: 2.5vh;
display: inline-block;
}
/* header {
height: 10vh;
} */
@media screen and (min-width: 769px) {
aside {
left: 0;
position: absolute;
}
}
aside {
margin-left: 1rem;
}
.side-menu {
@ -215,6 +250,29 @@ aside {
margin: 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 {
margin-top: 0.8rem;
@ -223,7 +281,6 @@ aside {
.side-menu li a{
color: #008CBA;
display: block;
margin: 0;
}
@ -235,67 +292,111 @@ footer a:hover {
color: #035d7a;
}
/* footer a:after {
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 {
footer a {
box-shadow: inset 0 0 0 0 #54b3d6;
color: #54b3d6;
margin: 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; */
text-decoration: underline 0.15em rgba(255, 255, 255, 0);
color: #54b3d6;
background-color: rgba(0, 0, 0, 0.11);
}
/* .flashlight {
color: hsla(0,0%,0%,0);
perspective: 80px;
outline: none;
/* Profile card */
.profileCard {
max-width: 100%;
}
#flash {
display: inline-block;
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);
body {
padding: 10px;
}
.light {
display: inline-block;
text-shadow: #111 0 0 1px, rgba(255,255,255,0.1) 0 1px 3px;
.app-wrapper {
display:flex;
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"}}
<aside class="asideAdmin mt-2">
<h4>
<aside class="md:lg:absolute m-6 mr-8">
<h4 class="text-2xl font-bold">
Administration
</h4>
<ul class="side-menu">
<li><a href="/admin/settings" {{if eq . "config"}}class="is-active"{{end}}>Réglages</a></li>
<li><a href="/admin/users" {{if eq . "users"}}class="is-active"{{end}}>Utilisateurs</a></li>
<li><a href="/admin/apps" {{if eq . "apps"}}class="is-active"{{end}}>Applications</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/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 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 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 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>
</aside>
{{end}}

View File

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

View File

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

View File

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

View File

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

View File

@ -1,108 +1,83 @@
{{define "title"}}Modifier l'app - Administration - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section class="is-fullheight section">
<div class="container">
<div class="columns">
<div class="column is-2">
<section class="block">
<div>
<div>
<div>
{{template "admin_menu" ""}}
</div>
<div class="column is-10">
<div>
{{template "flash" .}}
<div class="level">
<div class="level-left">
<div>
<div>
<a class="button level-item" href="/admin/apps">← Retour</a>
</div>
<div class="level-right"></div>
</div>
<form class="has-margin-top-small" action="/admin/apps/{{ .App.ID }}" method="post">
<div class="columns">
<div class="column is-12">
<div class="level">
<div class="level-left">
<h5 class="is-size-5 level-item">Informations de l'app</h5>
</div>
<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>
<form action="/admin/apps/{{ .App.ID }}" method="post">
<div>
<div>
<h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Informations de l'app</h5>
<div class="field level-item">
<input id="publishedSwitch" type="checkbox" name="published" class="" {{if .IsPublished}}checked="checked"{{end}} />
<label for="publishedSwitch">Publiée ?</label>
</div>
</div>
<div class="field">
<label class="label">Identifiant</label>
<div class="control">
<p class="input">{{ .App.ID }}</p>
<p class="helper">Non modifiable</p>
<label class="block text-gray-700 text-lg font-bold mb-2">Identifiant</label>
<div>
<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>
</div>
</div>
<div class="field">
<label class="label">Titre</label>
<div class="control">
<input class="input" type="text"
<label class="block text-gray-700 text-lg font-bold mb-2">Titre</label>
<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"
name="title"
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 class="field">
<label class="label">Description</label>
<div class="control">
<textarea class="textarea"
<label class="block text-gray-700 text-lg font-bold mb-2">Description</label>
<div>
<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>
<label className="checkbox is-right">
<input type="checkbox" name="resetDescription" />
Réinitialiser la valeur par défaut ?
</label>
</div>
</div>
<div class="field">
<label class="label">Ordre d'affichage</label>
<div class="control">
<input class="input" type="number"
<label class="block text-gray-700 text-lg font-bold mb-2">Ordre d'affichage</label>
<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="number"
step="1"
min="0"
name="order"
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 class="field" data-controller="tags-editor">
<label class="label">Tags</label>
<div class="control">
<label class="block text-gray-700 text-lg font-bold mb-2">Tags</label>
<div>
<div class="field has-addons">
<div class="control">
<input class="input is-small" type="text" placeholder="Nouveau tag" data-target="tags-editor.newTag">
</div>
<div class="control">
<a class="button is-small is-info has-text-bold" data-action="click->tags-editor#onAddTag">
<div class="flex">
<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">
<a class="text-center w-1/6 text-white p-1 bg-cyan-600 text-bold rounded-r" data-action="click->tags-editor#onAddTag">
+
</a>
</div>
</div>
<div class="tags" data-target="tags-editor.tagsContainer"></div>
<input class="input is-hidden" type="text"
<div class="hidden" data-target="tags-editor.tagsContainer"></div>
<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"
name="tags"
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>
{{ .csrfField }}
<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>
</form>
</div>
</div>

View File

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

View File

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

View File

@ -1,27 +1,38 @@
{{define "title"}}Installer une application - Administration - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section class="home is-fullheight section" data-controller="app-install">
<section class="block" data-controller="app-install">
<div class="container">
<div class="columns">
<div class="column is-2">
<div class="">
{{template "admin_menu" "market"}}
</div>
<div class="column is-10">
<div class="">
{{template "flash" .}}
{{if .App}}
<article class="message is-info">
<div class="message-header">
<p>Installation d'une application</p>
<div class="w-full md:inset-0 md:h-full">
<div class="relative p-4 w-full max-w-2xl h-full md:h-auto">
<!-- 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 class="message-body">
<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 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>
</div>
</div>
{{else}}
<article class="message is-danger">
<div class="message-body">
@ -33,7 +44,6 @@
</article>
{{end}}
</div>
</div>
</div>
</section>
{{end}}

View File

@ -1,66 +1,51 @@
{{define "title"}}Place de marché - Administration - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section class="home is-fullheight section">
<section class="block">
<div class="container">
<div class="columns">
<div class="column is-2">
{{template "admin_menu" "market"}}
<div>
{{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 class="column is-10">
{{template "flash" .}}
<form action="/admin/market" methode="GET">
<div class="field has-addons mt-5 mb-5">
<div class="control is-expanded">
<input class="input is-medium" type="text" name="search" placeholder="Rechercher une application..." value="{{ .Search }}">
</div>
<div class="control">
<button type="submit" class="button is-medium">
Rechercher
</button>
{{range .Results}}
<div class="m-4 sm:block md:lg:flex w-100">
<div class="flex flex-col md:flex-row md:max-w-xl rounded-lg bg-white shadow-lg">
<div class="p-6 flex flex-col justify-start">
<h5 class="text-gray-900 text-xl font-medium mb-2"><code>{{ .Name }}</code></h5>
<p class="md:max-w-xl break-all text-gray-700 text-base mb-4 max-width">
{{ .LatestRelease.Description }}
</p>
<div class="flex justify-between">
<div>
<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>
</form>
<div class="has-text-right">
<b>Total</b> {{ .ResultsCount }}
</div>
<div class="table-container">
<table class="table is-fullwidth is-striped">
<thead>
<tr>
<th>ID</th>
<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>
{{else}}
<div>
Aucun résultat.
</div>
{{end}}
</div>
</div>
</section>

View File

@ -1,13 +1,13 @@
{{define "title"}}Création du mot de passe - Administration - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section class="login is-fullheight section">
<section class="block">
<div class="container">
<div class="columns">
<div class="column is-offset-4 is-4">
{{template "flash" .}}
<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">
<div class="field">
<div class="control">

View File

@ -1,34 +1,35 @@
{{define "title"}}Configuration - Administration - Arcad{{end}}
{{define "body"}}
{{- block "head_style" . -}}
<link rel="stylesheet" href="/css/admin_settings.css">
{{end}}
{{template "header" .}}
<section class="home is-fullheight section" data-controller="clock-sync">
<div class="container">
<div class="columns">
<div class="column is-2">
{{template "admin_menu" "config"}}
</div>
<div class="mt-2">
{{template "flash" .}}
<h4 class="is-size-4">Réglages</h4>
<form id="adminSettings" method="post">
{{ .csrfField }}
{{ $settings := .Settings }}
{{range $id, $meta := .Metadatas}}
{{ $se := $settings.Get $id }}
{{ $data := createMap "ID" $id "Setting" $se "Meta" $meta }}
{{if eq $meta.ValueType "password"}}
{{template "password_setting" $data}}
{{else if eq $meta.ValueType "markdown"}}
{{template "markdown_setting" $data}}
{{end}}
{{end}}
<div class="field is-grouped is-grouped-right">
<p class="control">
<input type="submit" class="button is-success" value="Enregistrer">
</p>
</div>
</form>
</div>
<section class="block" data-controller="clock-sync">
<div class="mt-6">
{{template "admin_menu" "config"}}
</div>
<div class="content">
{{template "flash" .}}
<div class="mt-6">
<h4 class="text-xl text-center font-bold mb-8">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">
{{ .csrfField }}
{{ $settings := .Settings }}
{{range $id, $meta := .Metadatas}}
{{ $se := $settings.Get $id }}
{{ $data := createMap "ID" $id "Setting" $se "Meta" $meta }}
{{if eq $meta.ValueType "password"}}
{{template "password_setting" $data}}
{{else if eq $meta.ValueType "markdown"}}
{{template "markdown_setting" $data}}
{{end}}
{{end}}
<div class="field is-grouped is-grouped-right">
<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">
</p>
</div>
</form>
</div>
</div>
</section>
@ -41,30 +42,32 @@
{{template "base" .}}
{{define "password_setting"}}
<div class="field">
<label class="label">{{ .Meta.Label }}</label>
<div>
<label for="password" class="block text-gray-700 text-lg font-bold mb-2">{{ .Meta.Label }}</label>
<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"
type="password">
type="password"
id="password">
</div>
</div>
<div class="field">
<label class="label">{{ .Meta.Label }} (confirmation)</label>
<div>
<label for="confirmPassword" class="block text-gray-700 text-lg font-bold mb-2">{{ .Meta.Label }} (confirmation)</label>
<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"
type="password">
type="password"
id="confirmPassword">
</div>
</div>
{{end}}
{{define "markdown_setting"}}
<div class="field">
<label class="label">{{ .Meta.Label }}</label>
<div class="field">
<div>
<label for="homeMessage" class="block text-gray-700 text-lg font-bold mb-2">{{ .Meta.Label }}</label>
<div>
<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>

View File

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

View File

@ -1,84 +1,84 @@
{{define "title"}}Informations de l'utilisateur - Administration - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section class="home is-fullheight section">
<div class="container">
<div class="columns">
<div class="column is-2">
<section class="block">
<div>
<div>
<div>
{{template "admin_menu" ""}}
</div>
<div class="column is-10">
<div>
{{template "flash" .}}
<div class="level">
<div class="level-left">
<a class="button level-item" href="/admin/users">← Retour</a>
</div>
<div class="level-right">
<a class="button level-item is-danger" href="/admin/users/{{ .User.ID }}/delete">Supprimer</a>
</div>
</div>
<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"
<form action="/admin/users/{{ .User.ID }}" method="post">
<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="w-5/6 block m-auto">
<label class="block text-gray-700 text-lg font-bold mb-2">Pseudonyme</label>
<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"
name="nickname"
value="{{if .Form}}{{ .Form.Get "nickname" }}{{else}}{{ .User.Nickname }}{{end}}">
</div>
</div>
{{ .csrfField }}
<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 class="field">
<label class="label">Date de création</label>
<div class="control">
<p class="input" readonly>
<div class="w-5/6 block m-auto">
<label class="block text-gray-700 text-lg font-bold mb-2">Date de création</label>
<div>
<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" }}
</p>
</div>
</div>
<div class="field">
<label class="label">Date de dernière connexion</label>
<div class="control">
<p class="input" readonly>
<div class="w-5/6 block m-auto">
<label class="block text-gray-700 text-lg font-bold mb-2">Date de dernière connexion</label>
<div>
<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" }}
</p>
</div>
</div>
{{with .User.LastUserAgent}}
<div class="field">
<label class="label">Dernier système d'exploitation utilisé</label>
<div class="control">
<p class="input" readonly>
{{ .OS.Name.StringTrimPrefix }} {{ .OS.Version.Major }}.{{ .OS.Version.Minor }}.{{ .OS.Version.Patch }}
</p>
<div class="w-5/6 block m-auto">
<label class="block text-gray-700 text-lg font-bold mb-2">Dernier système d'exploitation utilisé</label>
<div>
<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 }}
</p>
</div>
</div>
</div>
<div class="field">
<label class="label">Dernier navigateur utilisé</label>
<div class="control">
<p class="input" readonly>
{{ .Browser.Name.StringTrimPrefix }} {{ .Browser.Version.Major }}.{{ .Browser.Version.Minor }}.{{ .Browser.Version.Patch }}
</p>
<div class="w-5/6 block m-auto">
<label class="block text-gray-700 text-lg font-bold mb-2">Dernier navigateur utilisé</label>
<div>
<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>
{{ .Browser.Name.StringTrimPrefix }} {{ .Browser.Version.Major }}.{{ .Browser.Version.Minor }}.{{ .Browser.Version.Patch }}
</p>
</div>
</div>
</div>
<div class="field">
<label class="label">Dernier type de terminal utilisé</label>
<div class="control">
<p class="input" readonly>
{{ .DeviceType.StringTrimPrefix }}
</p>
<div class="w-5/6 block m-auto">
<label class="block text-gray-700 text-lg font-bold mb-2">Dernier type de terminal utilisé</label>
<div>
<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>
{{ .DeviceType.StringTrimPrefix }}
</p>
</div>
</div>
</div>
{{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 class="column is-6">
<h5 class="is-size-5">Carte de membre</h5>
<div class="box has-margin-top-small">
<div>
<h5 class="text-gray-900 text-xl font-medium mb-2">Carte de membre</h5>
<div class="max-width-full">
<figure class="image is-3by2">
<a href="/admin/users/{{ .User.ID }}/card" rel="Member card" download="ArcadBox-Member-{{ .User.Nickname }}">
<img src="/admin/users/{{ .User.ID }}/card" />

View File

@ -1,50 +1,36 @@
{{define "title"}}Utilisateurs - Administration - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section class="home is-fullheight section">
<div class="container">
<div class="columns">
<div class="column is-2">
{{template "admin_menu" "users"}}
<section class="block">
<div class="mt-6">
{{template "admin_menu" "config"}}
</div>
<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 class="column is-10">
{{template "flash" .}}
<h4 class="is-size-4">Liste des utilisateurs</h4>
<div class="has-text-right">
<b>Total</b> {{ .UsersCount }}
<div class="container ">
{{range .Users}}
<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="flex flex-col items-center pb-3">
<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 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>
</section>

View File

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

View File

@ -1,6 +1,6 @@
{{define "title"}}Borne non disponible - Arcad{{end}}
{{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="message is-warning is-align-self-center">
<div class="message-body">

View File

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

View File

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

View File

@ -1,24 +1,38 @@
{{define "title"}}Accueil - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section class="home is-fullheight section">
<section class="block">
<div id="main" class="container">
<img src="/assets/arcad.svg">
{{if and .WelcomeMessage .WelcomeMessage.Value}}
<div class="message is-info is-small">
<div class="message-body">
<div class="content">
<div class="mt-4">
{{markdown .WelcomeMessage.Value}}
</div>
</div>
</div>
{{end}}
<div class="tile is-ancestor is-wrap tile-container">
{{range .Apps}}
{{- template "app_tile" . -}}
{{end}}
<div class="arcadContent">
<h1 class="font-bold text-3xl mt-4 mb-4">Qu'est ce que c'est ?</h1>
<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).
</div>
</div>
</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}}
{{template "base" .}}

View File

@ -1,74 +1,59 @@
{{define "title"}}Profil - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section>
<section class="block">
<div>
{{template "flash" .}}
<form action="/login" method="POST" enctype="multipart/form-data">
<div class="field" style="margin-bottom:0">
<div class="file is-medium is-success" id="memberCard">
<label class="file-label">
<input class="file-input" type="file" name="memberCard">
<span class="file-cta">
<span class="file-icon">
<svg class="icon" width="50" height="50">
<use xlink:href="#address-card"></use>
</svg>
</span>
<span class="file-label">
Se connecter
</span>
</span>
</label>
</div>
<form action="/login" method="POST" enctype="multipart/form-data">
<div class="flex justify-around mb-8">
<div class="memberCard">
<label
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">
<img class="custom-icon profile-icon" src="/icons/cloud-arrow-up-solid.svg"/>
<span class="mt-2 text-base leading-normal">Connexion</span>
<input name="memberCard" type='file' class="hidden" />
</label>
</div>
{{ .csrfField }}
</form>
</div>
<div class="level-item">
<a href="/logout" class="button is-warning is-medium">
<svg class="icon" width="50" height="50">
<use xlink:href="#sign-out-alt"></use>
</svg>
</a>
</div>
</div>
</div>
<div class="columns">
<div class="column is-6">
<h5 class="is-size-5">Vos informations</h5>
<form class="has-margin-top-small" action="/profile" method="post">
<div class="field">
<label class="label">Pseudonyme</label>
<div class="control">
<input class="input is-medium" type="text"
name="nickname"
value="{{if .Form}}{{ .Form.Get "nickname" }}{{else}}{{ .User.Nickname }}{{end}}">
<div class="memberCard">
<a href="/logout" class="button is-warning is-medium">
<label
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">
<img class="custom-icon profile-icon" src="/icons/arrow-right-from-bracket-solid.svg"/>
<span class="mt-2 text-base leading-normal">Deconnexion</span>
</a>
</label>
</a>
</div>
</div>
{{ .csrfField }}
</form>
<h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Vos informations</h5>
<form action="/profile" method="post">
<div>
<label class="block text-gray-700 text-md font-bold mb-2">Pseudonyme</label>
<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"
name="nickname"
value="{{if .Form}}{{ .Form.Get "nickname" }}{{else}}{{ .User.Nickname }}{{end}}">
</div>
</div>
{{ .csrfField }}
<div class="buttons" style="justify-content:flex-end">
<button type="submit" class="button is-primary is-medium">
<span>Modifier</span>
<span class="icon">
<svg class="icon" width="50" height="50">
<use xlink:href="#edit"></use>
</svg>
</span>
<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>
</button>
</div>
</form>
</div>
<div class="column is-6">
<h5 class="is-size-5">Carte de membre</h5>
<article class="message is-info">
<div class="message-body">
<div>
<h5 class="text-center text-gray-900 mt-4 text-xl font-medium font-bold mb-2">Carte de membre</h5>
<article>
<div>
Téléchargez et utilisez votre carte de membre afin de pouvoir vous authentifier la prochaine fois avec le même pseudonyme !
</div>
</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 }}">
<img src="/profile/card" />
<img class="" src="/profile/card" />
</a>
</figure>
</div>