This commit is contained in:
Charles Maxime Sassot 2022-05-11 21:38:20 +02:00
commit 809b06baf6
35 changed files with 6458 additions and 0 deletions

1
public/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/dist

532
public/admin.js Normal file

File diff suppressed because one or more lines are too long

123
public/assets/arcad.svg Normal file
View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="92.751663mm"
height="70.574348mm"
viewBox="0 0 92.751663 70.574348"
version="1.1"
id="svg8"
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
sodipodi:docname="logo.svg">
<defs
id="defs2">
<rect
x="89.107559"
y="134.69023"
width="76.529793"
height="18.381531"
id="rect869" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.32178649"
inkscape:cx="-16.148464"
inkscape:cy="319.14316"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-72.968875,-87.539164)">
<g
id="g865"
style="stroke-width:2.8;stroke-miterlimit:4;stroke-dasharray:none"
transform="matrix(0.71172991,0,0,1,34.056585,0)">
<path
style="fill:#353535;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 155.52235,118.30427 14.21721,-27.215688 3.32913,1.132263 -11.78422,27.307675 z"
id="path28"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#353535;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 79.153543,119.42185 5.930164,-1.01464 -14.743541,-27.278941 -3.4643,1.294591 z"
id="path30"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#353535;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 58.75248,131.51676 4.84814,-4.15117 2.85536,-10.4048 -2.338348,-28.434637 -5.900108,0.0317 z"
id="path32"
sodipodi:nodetypes="cccccc" />
<path
style="fill:#353535;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 176.65606,127.20796 -3.1244,-10.19624 2.27559,-28.722602 6.38968,0.07061 -0.59264,43.379042 z"
id="path34"
sodipodi:nodetypes="cccccc" />
<path
style="fill:#5072bb;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="m 55.484386,136.85668 16.213503,-13.85764 29.416441,-5.52866 37.34222,-0.0359 29.5254,5.12489 15.85072,13.83865"
id="path26" />
<path
style="fill:#5072bb;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="m 55.484384,136.85668 33.623173,-2.16645 59.887443,0.004 34.83767,1.70384 0.40896,19.05772 -15.56701,1.91332 -3.03727,-4.29735 -15.91711,2.26501 -58.691031,0.14144 -17.098856,-2.29692 -2.560731,4.06074 -15.946794,-1.98645 0.06156,-18.3989"
id="path24"
sodipodi:nodetypes="ccccccccccccc" />
</g>
<text
xml:space="preserve"
id="text867"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect869);fill:#0b0b0b;fill-opacity:1;stroke:#000000;stroke-width:0.119752;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;"
transform="matrix(1.5400685,0,0,1.5400685,-42.710151,-71.702595)"><tspan
x="89.107422"
y="144.3746"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Comfortaa;-inkscape-font-specification:Comfortaa;fill:#0b0b0b;fill-opacity:1;stroke:#000000;stroke-width:0.119752;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">arcad</tspan></tspan></text>
<g
id="g920"
transform="matrix(1.6121033,0,0,1.6121033,-74.005216,-72.298611)">
<path
style="fill:none;stroke:#000000;stroke-width:1.56269;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 116.24913,113.58862 c 3.01768,-2.95857 4.75438,-3.06268 7.3334,-0.009"
id="path875"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:1.56269;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 113.49656,111.29019 c 3.6676,-4.76647 9.82221,-4.15075 13.03202,0.006"
id="path875-4"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:1.56269;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 111.42138,108.6224 c 3.82869,-4.7202 12.15921,-5.82482 17.03011,-0.0193"
id="path875-4-8"
sodipodi:nodetypes="cc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

120
public/assets/logo.svg Normal file
View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="195.79131"
height="40.452461"
id="svg3780"
version="1.1"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="logo.svg">
<defs
id="defs3782" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="4.2416268"
inkscape:cx="45.753768"
inkscape:cy="19.200676"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1366"
inkscape:window-height="744"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid3015"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
originx="-8.39956px"
originy="-37.93714px" />
</sodipodi:namedview>
<metadata
id="metadata3785">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-335.39956,-499.83558)">
<path
style="fill:#078eb5;fill-opacity:1;stroke:none;display:inline;enable-background:new"
d="m 356.56825,499.83558 c -13.23043,0 -21.16869,13.23042 -21.16869,23.81477 l 2.64609,0 0,10.58433 c 5.29217,7.93824 32.07212,8.20297 37.04519,0 l 0,-10.58433 2.64607,0 c 0,-4.29058 -1.30219,-9.01755 -3.73483,-13.12018 l -2.99063,3.03198 0,7.12513 1.61247,2.21885 -2.39802,2.31533 -2.43937,-2.31533 1.72272,-2.14993 -0.0688,-7.71776 3.87264,-3.6108 c -0.97461,-1.47147 -2.10693,-2.84403 -3.37655,-4.0656 l -4.87871,5.18192 0,7.13891 1.61245,2.21886 -2.41179,2.31532 -2.43936,-2.31532 1.73648,-2.16374 -0.0826,-7.71774 5.37486,-5.63672 c -1.29755,-1.09094 -2.7222,-2.03518 -4.27232,-2.77012 l -5.59538,5.93992 0,7.12513 1.62625,2.23264 -2.4118,2.31532 -2.43936,-2.31532 1.73649,-2.16373 -0.0826,-7.71774 5.88478,-5.95371 c -2.05509,-0.79293 -4.29761,-1.24034 -6.72546,-1.24034 z m 6.72545,1.24034 1.2817,0.53749 z m 5.55403,3.30761 1.08875,0.97851 z m 4.46526,5.04411 0.68909,1.10253 z M 352,526.57486 l 8.85806,-0.11137 0.0557,10.43027 -8.91375,0.1018 z"
id="path3773"
inkscape:connector-curvature="0"
sodipodi:nodetypes="scccccccccccccccccccccccccccccccccscccccccccccccc" />
<g
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;line-height:0%;letter-spacing:0px;word-spacing:0px;fill:#777777;fill-opacity:1;stroke:none;font-family:Liberation Sans Narrow;-inkscape-font-specification:Liberation Sans Narrow Bold Condensed"
id="text2983"
transform="translate(42.28018,-8.4690297)">
<path
d="m 374.16131,539.65491 1.40625,0.95703 c -1.35419,1.86198 -3.07294,3.33333 -5.15625,4.41406 -2.08335,1.06771 -4.32945,1.60156 -6.73828,1.60156 -2.00522,0 -3.91928,-0.39062 -5.74219,-1.17187 -1.82292,-0.78125 -3.39193,-1.83594 -4.70703,-3.16406 -1.31511,-1.32812 -2.36328,-2.91015 -3.14453,-4.7461 -0.78125,-1.83592 -1.17188,-3.76301 -1.17188,-5.78125 0,-2.01821 0.39063,-3.94529 1.17188,-5.78125 0.78125,-1.83591 1.82942,-3.41794 3.14453,-4.74609 1.3151,-1.3281 2.88411,-2.38279 4.70703,-3.16406 1.82291,-0.78122 3.73697,-1.17185 5.74219,-1.17188 2.39581,3e-5 4.63539,0.5469 6.71875,1.64063 2.08331,1.08075 3.80857,2.55862 5.17578,4.43359 l -1.40625,1.03516 c -1.21096,-1.62758 -2.7344,-2.91013 -4.57031,-3.84766 -1.82294,-0.95049 -3.79559,-1.42575 -5.91797,-1.42578 -2.36981,3e-5 -4.5573,0.58596 -6.5625,1.75781 -1.9922,1.1719 -3.56772,2.76695 -4.72656,4.78516 -1.15886,2.00522 -1.73829,4.19923 -1.73828,6.58203 -10e-6,1.77084 0.33853,3.46355 1.01562,5.07812 0.6901,1.61459 1.61458,3.00782 2.77344,4.17969 1.15884,1.17188 2.54556,2.10938 4.16015,2.8125 1.61457,0.69011 3.30728,1.03516 5.07813,1.03516 2.12238,0 4.09503,-0.47526 5.91797,-1.42578 1.83591,-0.95052 3.35935,-2.24609 4.57031,-3.88672"
style="font-weight:normal;font-stretch:normal;fill:#777777;fill-opacity:1;font-family:Sawasdee;-inkscape-font-specification:Sawasdee"
id="path2997"
inkscape:connector-curvature="0" />
<path
d="m 435.4735,526.29553 c 1.36717,2e-5 2.67576,0.26695 3.92578,0.80078 1.24998,0.53388 2.33071,1.25653 3.24218,2.16797 0.91144,0.91148 1.6341,1.99872 2.16797,3.26172 0.53383,1.26303 0.80076,2.58465 0.80078,3.96484 -2e-5,1.39324 -0.26695,2.72137 -0.80078,3.98438 -0.53387,1.26303 -1.25653,2.35026 -2.16797,3.26172 -0.91147,0.89844 -1.9922,1.62109 -3.24218,2.16797 -1.25002,0.53385 -2.55861,0.80078 -3.92578,0.80078 -2.79949,0 -5.18881,-0.99609 -7.16797,-2.98828 -1.97917,-1.99219 -2.96876,-4.40104 -2.96875,-7.22657 -10e-6,-1.84894 0.44921,-3.55467 1.34765,-5.11718 0.91146,-1.57551 2.14192,-2.81248 3.69141,-3.71094 1.56249,-0.91144 3.26171,-1.36717 5.09766,-1.36719 m -8.39844,10.19531 c -1e-5,2.33074 0.82031,4.32944 2.46094,5.9961 1.65363,1.65365 3.64582,2.48047 5.97656,2.48047 2.33071,0 4.31639,-0.82682 5.95703,-2.48047 1.65362,-1.66666 2.48045,-3.66536 2.48047,-5.9961 -2e-5,-2.31769 -0.82685,-4.30337 -2.48047,-5.95703 -1.64064,-1.65362 -3.62632,-2.48045 -5.95703,-2.48047 -2.33074,2e-5 -4.32293,0.82685 -5.97656,2.48047 -1.64063,1.65366 -2.46095,3.63934 -2.46094,5.95703"
style="font-weight:normal;font-stretch:normal;fill:#777777;fill-opacity:1;font-family:Sawasdee;-inkscape-font-specification:Sawasdee"
id="path3003"
inkscape:connector-curvature="0" />
<path
d="m 451.22209,546.41272 -1.75781,0 0,-29.18754 1.75781,0 0,29.18754"
style="font-weight:normal;font-stretch:normal;fill:#777777;fill-opacity:1;font-family:Sawasdee;-inkscape-font-specification:Sawasdee"
id="path3005"
inkscape:connector-curvature="0" />
<path
d="m 456.99022,534.83069 14.39453,0 c -0.3646,-1.96613 -1.22398,-3.58723 -2.57812,-4.86328 -1.35419,-1.27603 -2.90366,-1.91405 -4.64844,-1.91407 -1.73178,2e-5 -3.27475,0.63804 -4.62891,1.91407 -1.34115,1.27605 -2.1875,2.89715 -2.53906,4.86328 m 16.30859,1.66015 -16.58203,0 c 0,2.33074 0.72916,4.30991 2.1875,5.9375 1.45833,1.62761 3.18359,2.44141 5.17578,2.44141 1.31509,0 2.60416,-0.35156 3.86719,-1.05469 1.263,-0.70312 2.22655,-1.64713 2.89063,-2.83203 l 1.54296,0.87891 c -0.79429,1.41927 -1.96616,2.58464 -3.51562,3.49609 -1.54949,0.89844 -3.14455,1.34766 -4.78516,1.34766 -1.65365,0 -3.17709,-0.46224 -4.57031,-1.38672 -1.38021,-0.92448 -2.46745,-2.16797 -3.26172,-3.73047 -0.78125,-1.57551 -1.17188,-3.27473 -1.17187,-5.09766 -1e-5,-1.80988 0.39713,-3.49608 1.1914,-5.05859 0.80729,-1.56248 1.90755,-2.80597 3.30078,-3.73047 1.40625,-0.93748 2.93619,-1.40623 4.58985,-1.40625 1.56248,2e-5 3.01431,0.4232 4.35547,1.26953 1.35415,0.83335 2.44789,1.95966 3.28125,3.37891 0.83331,1.41928 1.32159,2.97527 1.46484,4.66797 l 0.0391,0.8789"
style="font-weight:normal;font-stretch:normal;fill:#777777;fill-opacity:1;font-family:Sawasdee;-inkscape-font-specification:Sawasdee"
id="path3007"
inkscape:connector-curvature="0" />
<path
d="m 487.66068,530.10413 -1.62109,0.5664 c -0.27345,-0.87238 -0.73569,-1.53644 -1.38672,-1.99219 -0.65105,-0.46873 -1.34767,-0.7031 -2.08984,-0.70312 -0.85939,2e-5 -1.59506,0.27346 -2.20703,0.82031 -0.59897,0.54689 -0.89845,1.28908 -0.89844,2.22656 -10e-6,0.49481 0.13671,0.94403 0.41015,1.34766 0.27344,0.40366 0.63151,0.73569 1.07422,0.99609 0.4427,0.26043 0.94401,0.52736 1.50391,0.80079 0.57291,0.27345 1.15233,0.52735 1.73828,0.76171 0.58593,0.23439 1.15884,0.52736 1.71875,0.87891 0.5729,0.35157 1.08072,0.72918 1.52344,1.13281 0.44269,0.40366 0.80076,0.92449 1.07422,1.5625 0.27342,0.63803 0.41014,1.35418 0.41015,2.14844 -1e-5,1.8099 -0.64454,3.28125 -1.93359,4.41406 -1.28908,1.1198 -2.78647,1.67969 -4.49219,1.67969 -0.74219,0 -1.45183,-0.11719 -2.1289,-0.35156 -0.67709,-0.2474 -1.30209,-0.60547 -1.875,-1.07422 -0.57293,-0.46875 -1.06121,-1.09375 -1.46485,-1.875 -0.40365,-0.78125 -0.66406,-1.67317 -0.78125,-2.67578 l 1.73828,-0.25391 c 0.18229,1.48438 0.69661,2.60417 1.54297,3.35938 0.85937,0.75521 1.86197,1.13281 3.00781,1.13281 1.21093,0 2.28515,-0.40364 3.22266,-1.21094 0.93749,-0.82031 1.40624,-1.86848 1.40625,-3.14453 -1e-5,-0.70312 -0.17579,-1.32161 -0.52734,-1.85547 -0.35158,-0.54686 -0.80731,-0.98957 -1.36719,-1.32812 -0.54689,-0.33854 -1.15887,-0.65755 -1.83594,-0.95703 -0.67709,-0.29947 -1.35417,-0.60546 -2.03125,-0.91797 -0.67709,-0.31249 -1.29558,-0.65103 -1.85547,-1.01563 -0.54688,-0.37759 -0.9961,-0.86587 -1.34765,-1.46484 -0.35157,-0.61197 -0.52735,-1.30858 -0.52735,-2.08985 0,-1.45831 0.48177,-2.61716 1.44532,-3.47656 0.97655,-0.85935 2.12889,-1.28904 3.45703,-1.28906 1.09374,2e-5 2.11587,0.33205 3.0664,0.99609 0.95051,0.65106 1.62759,1.60158 2.03125,2.85157"
style="font-weight:normal;font-stretch:normal;fill:#777777;fill-opacity:1;font-family:Sawasdee;-inkscape-font-specification:Sawasdee"
id="path3009"
inkscape:connector-curvature="0" />
<g
style="font-weight:normal;fill:#777777;fill-opacity:1;font-family:Sans"
id="text3011">
<path
d="m 377.53329,536.50769 c 0,-2.8203 0.99577,-5.22622 2.98731,-7.21777 1.99153,-1.99152 4.39127,-2.98729 7.19922,-2.98731 2.8203,2e-5 5.22622,0.99579 7.21777,2.98731 0.38344,0.39585 0.73598,0.81023 1.05762,1.24316 l 0,-2.5791 1.66992,0 0,18.2207 -1.66992,0 0,-3.71093 c -0.32164,0.43294 -0.67418,0.84733 -1.05762,1.24316 -1.99155,1.99154 -4.39747,2.9873 -7.21777,2.9873 -2.80795,0 -5.20769,-0.99576 -7.19922,-2.9873 -1.99154,-1.99153 -2.98731,-4.39127 -2.98731,-7.19922 m 1.7627,0 c 0,2.32553 0.82259,4.31088 2.46777,5.95606 1.64518,1.63281 3.63053,2.44922 5.95606,2.44921 2.3255,10e-6 4.31085,-0.82259 5.95605,-2.46777 1.23696,-1.23697 2.01007,-2.66568 2.31934,-4.28613 l 0,-3.30274 c -0.30927,-1.6328 -1.08238,-3.06769 -2.31934,-4.30468 -1.6452,-1.64517 -3.63055,-2.46776 -5.95605,-2.46778 -2.32553,2e-5 -4.31088,0.82261 -5.95606,2.46778 -1.64518,1.64519 -2.46777,3.63054 -2.46777,5.95605"
style="font-size:38px;font-variant:normal;font-stretch:normal;letter-spacing:-1.11000001000000004px;fill:#777777;fill-opacity:1;font-family:Caviar Dreams;-inkscape-font-specification:Caviar Dreams"
id="path3018"
inkscape:connector-curvature="0" />
<path
d="m 401.65767,536.50769 c 0,-2.8203 0.99576,-5.22622 2.9873,-7.21777 1.99153,-1.99152 4.39127,-2.98729 7.19922,-2.98731 2.8203,2e-5 5.22622,0.99579 7.21778,2.98731 0.38344,0.39585 0.73598,0.81023 1.05761,1.24316 l 0,-14.0459 1.66993,0 0,29.6875 -1.66993,0 0,-3.71093 c -0.32163,0.43294 -0.67417,0.84733 -1.05761,1.24316 -1.99156,1.99154 -4.39748,2.9873 -7.21778,2.9873 -2.80795,0 -5.20769,-0.99576 -7.19922,-2.9873 -1.99154,-1.99153 -2.9873,-4.39127 -2.9873,-7.19922 m 1.76269,0 c 0,2.32553 0.82259,4.31088 2.46778,5.95606 1.64517,1.63281 3.63052,2.44922 5.95605,2.44921 2.32551,10e-6 4.31086,-0.82259 5.95606,-2.46777 1.23696,-1.23697 2.01007,-2.66568 2.31933,-4.28613 l 0,-3.30274 c -0.30926,-1.6328 -1.08237,-3.06769 -2.31933,-4.30468 -1.6452,-1.64517 -3.63055,-2.46776 -5.95606,-2.46778 -2.32553,2e-5 -4.31088,0.82261 -5.95605,2.46778 -1.64519,1.64519 -2.46778,3.63054 -2.46778,5.95605"
style="font-size:38px;font-variant:normal;font-stretch:normal;letter-spacing:-1.11000001000000004px;fill:#777777;fill-opacity:1;font-family:Caviar Dreams;-inkscape-font-specification:Caviar Dreams"
id="path3020"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

96
public/assets/poney.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 164 KiB

944
public/client.js Normal file

File diff suppressed because one or more lines are too long

4
public/css/custom.css Normal file
View File

@ -0,0 +1,4 @@
.mt-2 {
margin-top: 2rem;
}

130
public/css/form.css Normal file
View File

@ -0,0 +1,130 @@
/** 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%);
}

301
public/css/server.css Normal file
View File

@ -0,0 +1,301 @@
a {
text-decoration: none;
}
/** NAVBAR */
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Lato', sans-serif;
font-family: 'Oswald', sans-serif;
}
.wrapper{
position: fixed;
top: 0;
right: -100%;
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;
z-index: 19;
}
#active:checked ~ .wrapper{
/*left: 0;*/
right:0;
}
.menu-btn{
position: absolute;
z-index: 20;
right: 20px;
/*left: 20px; */
top: 20px;
height: 50px;
width: 50px;
text-align: center;
line-height: 50px;
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;
}
.menu-btn span,
.menu-btn:before,
.menu-btn:after{
content: "";
position: absolute;
top: calc(50% - 1px);
left: 30%;
width: 40%;
border-bottom: 2px solid #000;
transition: transform .6s cubic-bezier(0.215, 0.61, 0.355, 1);
}
.menu-btn:before{
transform: translateY(-8px);
}
.menu-btn:after{
transform: translateY(8px);
}
.close {
z-index: 20;
width: 100%;
height: 100%;
pointer-events: none;
transition: background .6s;
}
/* closing animation */
#active:checked + .menu-btn span {
transform: scaleX(0);
}
#active:checked + .menu-btn:before {
transform: rotate(45deg);
border-color: #fff;
}
#active:checked + .menu-btn:after {
transform: rotate(-45deg);
border-color: #fff;
}
.wrapper ul{
position: absolute;
top: 60%;
left: 50%;
height: 90%;
transform: translate(-50%, -50%);
list-style: none;
text-align: center;
}
.wrapper ul li{
height: 10%;
margin: 15px 0;
}
.wrapper ul li a {
text-decoration: none;
font-size: 30px;
font-weight: 500;
padding: 5px 30px;
color: #fff;
border-radius: 50px;
position: absolute;
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);
}
.wrapper ul li a:after{
position: absolute;
content: "";
background: #fff;
/*background: linear-gradient(#14ffe9, #ffeb3b, #ff00e0);*/
/*background: linear-gradient(375deg, #1cc7d0, #2ede98);*/
width: 100%;
height: 100%;
left: 0;
top: 0;
border-radius: 50px;
transform: scaleY(0);
z-index: -1;
transition: transform 0.3s ease;
}
.wrapper ul li a:hover:after{
transform: scaleY(1);
}
.wrapper ul li a:hover{
color: rgb(7, 142, 181)
}
input[type="checkbox"]{
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);
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;
transform: translateX(-20vh);
}
/** endNavbar */
#main
{
max-width:1280px;
min-height:100%;
margin:0 auto;
position:relative;
}
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;
}
#logo img {
margin: 1rem 1rem;
}
@media screen and (min-width: 769px) {
aside {
left: 0;
position: absolute;
}
}
aside {
margin-left: 1rem;
}
.side-menu {
display: block;
font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif !important;
list-style-position: outside;
list-style-type: none;
margin: 0;
padding: 0.77778rem 0;
}
.side-menu li {
margin-top: 0.8rem;
padding: 0;
}
.side-menu li a{
color: #008CBA;
display: block;
margin: 0;
}
footer a {
color: #008CBA;
}
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 {
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;
}
body 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;
}
#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);
}
.light {
display: inline-block;
text-shadow: #111 0 0 1px, rgba(255,255,255,0.1) 0 1px 3px;
}
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;
} */

Binary file not shown.

2230
public/server.js Normal file

File diff suppressed because one or more lines are too long

872
public/sock.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,13 @@
{{define "admin_menu"}}
<aside class="asideAdmin mt-2">
<h4>
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>
</ul>
</aside>
{{end}}

View File

@ -0,0 +1,53 @@
{{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>
</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

@ -0,0 +1,24 @@
{{define "base"}}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<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>
{{end}}
</head>
<body>
{{- block "body" . -}}{{- end -}}
{{- block "body_script" . -}}{{end}}
</body>
{{template "footer" .}}
</html>
{{end}}

View File

@ -0,0 +1,23 @@
{{define "flash"}}
<div class="flash has-margin-top-small has-margin-bottom-small">
{{- range .Flashes -}}
{{- if eq .Type "error" -}}
{{template "flash_message" map "Title" "Erreur" "MessageClass" "is-danger" "Message" .Message }}
{{- else if eq .Type "warn" -}}
{{template "flash_message" map "Title" "Attention" "MessageClass" "is-warning" "Message" .Message }}
{{- else if eq .Type "success" -}}
{{template "flash_message" map "Title" "Succès" "MessageClass" "is-success" "Message" .Message }}
{{- else -}}
{{template "flash_message" map "Title" "Information" "MessageClass" "is-info" "Message" .Message }}
{{- end -}}
{{- end -}}
</div>
{{end}}
{{define "flash_message" -}}
<div class="message {{.MessageClass}}">
<div class="message-body">
<span class="has-text-weight-bold">{{.Title}}</span> {{.Message}}
</div>
</div>
{{- end}}

View File

@ -0,0 +1,15 @@
{{define "footer"}}
<footer>
<p>
<a href="/admin">Accéder au panneau d'administration</a>
</p>
<p>
Propulsé par <a href="https://gitlab.com/arcadbox/arcad">Arcad</a> et publié sous licence <a class="has-text-primary" href="https://gitlab.com/arcadbox/arcad/-/blob/{{ .BuildInfo.GitRef }}/LICENSE">AGPL-3.0</a>.
</p>
<p>
Version: {{ .BuildInfo.ProjectVersion }} -
Réf.: {{ .BuildInfo.GitRef }} -
Date de construction: {{ .BuildInfo.BuildDate }}
</p>
</footer>
{{end}}

View File

@ -0,0 +1,27 @@
{{define "header"}}
<header>
<a id="logo" href="/"><img src="/assets/logo.svg"></a>
<input type="checkbox" id="active">
<label for="active" class="menu-btn"><span></span></label>
<label for="active" class="close"></label>
<div class="wrapper">
<ul>
<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>
</li>
{{end}}
<li>
<a id="flash" href="/profile">Profile</a>
</li>
<li><a class="ligth" href="/admin">Admin</a></li>
<li><a href="#">Feedback</a></li>
</ul>
</div>
</header>
{{end}}

View File

@ -0,0 +1,3 @@
{{define "js_config"}}
<script type="text/javascript">(function() { window.__CONFIG__ = JSON.parse({{toJSON .JSConfig}}) }())</script>
{{end}}

View File

@ -0,0 +1,118 @@
{{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">
{{template "admin_menu" ""}}
</div>
<div class="column is-10">
{{template "flash" .}}
<div class="level">
<div class="level-left">
<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>
</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>
</div>
</div>
<div class="field">
<label class="label">Titre</label>
<div class="control">
<input class="input" 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"
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"
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">
<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">
+
</a>
</div>
</div>
<div class="tags" data-target="tags-editor.tagsContainer"></div>
<input class="input is-hidden" 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>
</div>
</div>
</div>
</form>
</div>
</div>
{{template "footer" .}}
</div>
</section>
{{end}}
{{define "body_script"}}
<script defer src="/admin.js"></script>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,69 @@
{{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">
{{template "admin_menu" "apps"}}
</div>
<div class="column is-10">
{{template "flash" .}}
<h4 class="is-size-4">Liste des applications installées</h4>
<div class="has-text-right">
<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>
{{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>
{{else}}
<tr class="has-text-centered is-italic">
<td colspan="7">
Aucune application installée.
</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</div>
</div>
{{template "footer" .}}
</div>
</section>
{{end}}
{{define "body_script"}}
<script defer src="/admin.js"></script>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,22 @@
{{define "title"}}Login - Administration - Arcad{{end}}
{{define "body"}}
{{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>
{{template "footer" .}}
</div>
</section>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,46 @@
{{define "title"}}Installer une application - Administration - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section class="home is-fullheight section" data-controller="app-install">
<div class="container">
<div class="columns">
<div class="column is-2">
{{template "admin_menu" "market"}}
</div>
<div class="column is-10">
{{template "flash" .}}
{{if .App}}
<article class="message is-info">
<div class="message-header">
<p>Installation d'une application</p>
</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>
{{else}}
<article class="message is-danger">
<div class="message-body">
Impossible de trouver l'application correspondant à la demande d'installation.
<div class="buttons is-right">
<a href="/admin/market" class="button is-outlined is-danger">Retour</a>
</div>
</div>
</article>
{{end}}
</div>
</div>
{{template "footer" .}}
</div>
</section>
{{end}}
{{define "body_script"}}
<script defer src="/admin.js"></script>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,74 @@
{{define "title"}}Place de marché - 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" "market"}}
</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>
</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>
</div>
{{template "footer" .}}
</div>
</section>
{{end}}
{{define "body_script"}}
<script defer src="/admin.js"></script>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,40 @@
{{define "title"}}Création du mot de passe - Administration - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section class="login is-fullheight section">
<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>
<form method="POST">
<div class="field">
<div class="control">
<input class="input is-normal"
name="adminPassword" type="password"
autocomplete="new-password"
placeholder="Mot de passe">
</div>
</div>
<div class="field">
<div class="control">
<input class="input is-normal"
name="adminPassword-confirm" type="password"
autocomplete="new-password"
placeholder="Confirmation du mot de passe">
</div>
</div>
{{ .csrfField }}
<input type="submit"
value="Enregister"
class="button is-block is-primary is-normal is-fullwidth">
</form>
</div>
</div>
</div>
{{template "footer" .}}
</div>
</section>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,72 @@
{{define "title"}}Configuration - Administration - Arcad{{end}}
{{define "body"}}
{{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>
</div>
{{template "footer" .}}
</div>
</section>
{{end}}
{{define "body_script"}}
<script defer src="/admin.js"></script>
{{end}}
{{template "base" .}}
{{define "password_setting"}}
<div class="field">
<label class="label">{{ .Meta.Label }}</label>
<div class="control">
<input class="input" name="{{ .ID }}"
autocomplete="new-password"
type="password">
</div>
</div>
<div class="field">
<label class="label">{{ .Meta.Label }} (confirmation)</label>
<div class="control">
<input class="input" name="{{ .ID }}-confirm"
autocomplete="new-password"
type="password">
</div>
</div>
{{end}}
{{define "markdown_setting"}}
<div class="field">
<label class="label">{{ .Meta.Label }}</label>
<div class="field">
<div class="control">
<textarea class="textarea" placeholder="{{ .Meta.DefaultValue }}" name="{{ .ID }}">{{- if .Setting}}{{ .Setting.Value }}{{end -}}</textarea>
</div>
</div>
</div>
{{end}}

View File

@ -0,0 +1,41 @@
{{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">
{{template "admin_menu" ""}}
</div>
<div class="column is-10">
{{template "flash" .}}
<form class="has-margin-top-small" action="/admin/users/{{ .User.ID }}/delete" method="post">
{{ .csrfField }}
<div class="message is-warning">
<div class="message-body">
Êtes vous sûr de vouloir supprimer le compte de l'utilisateur "{{ .User.Nickname }}" ({{ .User.ID }}) ?
</div>
</div>
<div class="field is-grouped is-grouped-right">
<p class="control">
<a href="/admin/users/{{.User.ID}}" class="button is-light">
Annuler
</a>
</p>
<p class="control">
<input type="submit" class="button is-danger" value="Supprimer">
</p>
</div>
</form>
</div>
</div>
{{template "footer" .}}
</div>
</section>
{{end}}
{{define "body_script"}}
<script defer src="/admin.js"></script>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,102 @@
{{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">
{{template "admin_menu" ""}}
</div>
<div class="column is-10">
{{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"
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>
</div>
<div class="field">
<label class="label">Date de création</label>
<div class="control">
<p class="input" 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>
{{ 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>
</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>
</div>
<div class="field">
<label class="label">Dernier type de terminal utilisé</label>
<div class="control">
<p class="input" readonly>
{{ .DeviceType.StringTrimPrefix }}
</p>
</div>
</div>
{{end}}
</div>
<div class="column is-6">
<h5 class="is-size-5">Carte de membre</h5>
<div class="box has-margin-top-small">
<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" />
</a>
</figure>
</div>
</div>
</div>
</form>
</div>
</div>
{{template "footer" .}}
</div>
</section>
{{end}}
{{define "body_script"}}
<script defer src="/admin.js"></script>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,58 @@
{{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"}}
</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>
<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>
{{template "footer" .}}
</div>
</section>
{{end}}
{{define "body_script"}}
<script defer src="/admin.js"></script>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,31 @@
{{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="app-header">
<div class="level is-marginless is-mobile">
<div class="level-left">
<a href="../" class="level-item button is-link is-small">
<svg class="icon">
<use xlink:href="#home"></use>
</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>
{{end}}
</div>
</div>
</div>
<iframe class="app-frame" data-target="app.frame"
scrolling="no" seamless="seamless"
data-action="beforeunload->app#onFrameBeforeUnload load->app#onFrameLoad">
</iframe>
</div>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,15 @@
{{define "title"}}Borne non disponible - Arcad{{end}}
{{define "body"}}
<section class="is-fullheight section">
<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">
<h1 class="is-size-4">Arcad</h1>
<p>Désolé mais aucune borne correspondant à ce domaine n'est actuellement en ligne.</p>
<p>Veuillez réessayer plus tard et/ou vous assurer que la borne est correctement connectée à internet.</p>
</div>
</div>
</div>
</section>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,29 @@
{{define "title"}}Chargement en cours - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
{{ $redirectUrl := "/captive?escape=1" }}
{{ if .IsAndroid }}
{{ $redirectUrl := "intent://arcadbox.local/captive?escape=1#Intent;scheme=http;end" }}
{{ end }}
<section class="home is-fullheight section">
<div class="container">
<div class="message is-info">
<div class="message-body">
<div class="content">
<p>Un instant s'il vous plaît, nous préparons votre espace...</p>
<p>Si la page ne se recharge pas automatiquement, <a id="homepage-link" href="{{ $redirectUrl }}" target="_blank">cliquez ici.</a></p>
</div>
</div>
</div>
{{template "footer" .}}
</div>
</section>
{{end}}
{{define "head_style"}}
{{ $redirectUrl := "/captive?escape=1" }}
{{ if .IsAndroid }}
{{ $redirectUrl := "intent://arcadbox.local/captive?escape=1#Intent;scheme=http;end" }}
{{ end }}
<meta http-equiv="refresh" content="1;URL={{ $redirectUrl }}">
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,121 @@
{{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 }}">
<span>Ouvrir</span>
<svg class="icon">
<use xlink:href="#chevron-right"></use>
</svg>
</a>
</div>
</div>
<div class="columns">
<div class="column">
{{template "podium" .}}
</div>
<div class="column">
{{template "highscores" .}}
</div>
</div>
{{template "footer" .}}
</div>
</section>
{{end}}
{{template "base" .}}
{{define "podium"}}
<div class="podium-container">
<div class="podium">
<div class="pod second">
{{ if gt (len .Highscores) 1 }}
{{ $secondPlayerHighscore := index .Highscores 1 }}
{{if $secondPlayerHighscore}}
<div class="pod-player">
{{ $secondPlayer := (index .Users $secondPlayerHighscore.UserID) }}
<span class="player-nickname">{{with $secondPlayer}}{{ .Nickname }}{{else}}???{{end}}</span>
<span class="player-score">{{ $secondPlayerHighscore.Score }}</span>
</div>
{{end}}
{{end}}
<div class="pod-stair">
<span class="pod-position">2</span>
</div>
</div>
<div class="pod first">
{{ if gt (len .Highscores) 0 }}
{{ $firstPlayerHighscore := index .Highscores 0 }}
{{if $firstPlayerHighscore}}
<div class="pod-player">
{{ $firstPlayer := (index .Users $firstPlayerHighscore.UserID) }}
<svg class="icon player-crown">
<use xlink:href="#crown"></use>
</svg>
<span class="player-nickname">{{with $firstPlayer}}{{ .Nickname }}{{else}}???{{end}}</span>
<span class="player-score">{{ $firstPlayerHighscore.Score }}</span>
</div>
{{end}}
{{end}}
<div class="pod-stair">
<span class="pod-position">1</span>
</div>
</div>
<div class="pod third">
{{ if gt (len .Highscores) 2 }}
{{ $thirdPlayerHighscore := index .Highscores 2 }}
{{if $thirdPlayerHighscore}}
<div class="pod-player">
{{ $thirdPlayer := (index .Users $thirdPlayerHighscore.UserID) }}
<span class="player-nickname">{{with $thirdPlayer}}{{ .Nickname }}{{else}}???{{end}}</span>
<span class="player-score">{{ $thirdPlayerHighscore.Score }}</span>
</div>
{{end}}
{{end}}
<div class="pod-stair">
<div class="pod-position">3</div>
</div>
</div>
</div>
</div>
{{end}}
{{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) }}
<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>
</tr>
{{else}}
<tr>
<td colspan="4" class="has-text-centered is-italic">Aucun score pour l'instant.</td>
</tr>
{{end}}
</tbody>
</table>
</div>
{{end}}

View File

@ -0,0 +1,24 @@
{{define "title"}}Accueil - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section class="home is-fullheight section">
<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">
{{markdown .WelcomeMessage.Value}}
</div>
</div>
</div>
{{end}}
<div class="tile is-ancestor is-wrap tile-container">
{{range .Apps}}
{{- template "app_tile" . -}}
{{end}}
</div>
</div>
</section>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,85 @@
{{define "title"}}Profil - Arcad{{end}}
{{define "body"}}
{{template "header" .}}
<section>
<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>
</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>
</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>
</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">
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">
<a href="/profile/card" rel="Member card" download="ArcadBox-Member-{{ .User.Nickname }}">
<img src="/profile/card" />
</a>
</figure>
</div>
</section>
{{end}}
{{define "body_script"}}
<script>
const fileInput = document.querySelector('#memberCard input[type=file]');
fileInput.onchange = () => {
fileInput.form.submit();
}
</script>
{{end}}
{{template "base" .}}