init
This commit is contained in:
commit
809b06baf6
1
public/.gitignore
vendored
Normal file
1
public/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/dist
|
532
public/admin.js
Normal file
532
public/admin.js
Normal file
File diff suppressed because one or more lines are too long
123
public/assets/arcad.svg
Normal file
123
public/assets/arcad.svg
Normal 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
120
public/assets/logo.svg
Normal 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
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
944
public/client.js
Normal file
File diff suppressed because one or more lines are too long
4
public/css/custom.css
Normal file
4
public/css/custom.css
Normal file
@ -0,0 +1,4 @@
|
||||
.mt-2 {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
130
public/css/form.css
Normal file
130
public/css/form.css
Normal 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
301
public/css/server.css
Normal 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;
|
||||
} */
|
BIN
public/fonts/Comfortaa-VariableFont_wght.ttf
Normal file
BIN
public/fonts/Comfortaa-VariableFont_wght.ttf
Normal file
Binary file not shown.
2230
public/server.js
Normal file
2230
public/server.js
Normal file
File diff suppressed because one or more lines are too long
872
public/sock.js
Normal file
872
public/sock.js
Normal file
File diff suppressed because one or more lines are too long
13
template/blocks/admin_menu.html.tmpl
Normal file
13
template/blocks/admin_menu.html.tmpl
Normal 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}}
|
53
template/blocks/app_tile.html.tmpl
Normal file
53
template/blocks/app_tile.html.tmpl
Normal 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}}
|
24
template/blocks/base.html.tmpl
Normal file
24
template/blocks/base.html.tmpl
Normal 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}}
|
23
template/blocks/flash.html.tmpl
Normal file
23
template/blocks/flash.html.tmpl
Normal 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}}
|
15
template/blocks/footer.html.tmpl
Normal file
15
template/blocks/footer.html.tmpl
Normal 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}}
|
27
template/blocks/header.html.tmpl
Normal file
27
template/blocks/header.html.tmpl
Normal 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}}
|
3
template/blocks/js_config.html.tmpl
Normal file
3
template/blocks/js_config.html.tmpl
Normal file
@ -0,0 +1,3 @@
|
||||
{{define "js_config"}}
|
||||
<script type="text/javascript">(function() { window.__CONFIG__ = JSON.parse({{toJSON .JSConfig}}) }())</script>
|
||||
{{end}}
|
118
template/layouts/admin_app_edit.html.tmpl
Normal file
118
template/layouts/admin_app_edit.html.tmpl
Normal 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" .}}
|
69
template/layouts/admin_apps_list.html.tmpl
Normal file
69
template/layouts/admin_apps_list.html.tmpl
Normal 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" .}}
|
22
template/layouts/admin_login.html.tmpl
Normal file
22
template/layouts/admin_login.html.tmpl
Normal 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" .}}
|
46
template/layouts/admin_market_app_install.html.tmpl
Normal file
46
template/layouts/admin_market_app_install.html.tmpl
Normal 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" .}}
|
74
template/layouts/admin_market_search.html.tmpl
Normal file
74
template/layouts/admin_market_search.html.tmpl
Normal 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" .}}
|
40
template/layouts/admin_register.html.tmpl
Normal file
40
template/layouts/admin_register.html.tmpl
Normal 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" .}}
|
72
template/layouts/admin_settings.html.tmpl
Normal file
72
template/layouts/admin_settings.html.tmpl
Normal 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}}
|
41
template/layouts/admin_user_delete.html.tmpl
Normal file
41
template/layouts/admin_user_delete.html.tmpl
Normal 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" .}}
|
102
template/layouts/admin_user_info.html.tmpl
Normal file
102
template/layouts/admin_user_info.html.tmpl
Normal 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" .}}
|
58
template/layouts/admin_users_list.html.tmpl
Normal file
58
template/layouts/admin_users_list.html.tmpl
Normal 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" .}}
|
31
template/layouts/app.html.tmpl
Normal file
31
template/layouts/app.html.tmpl
Normal 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" .}}
|
15
template/layouts/bad_gateway.html.tmpl
Normal file
15
template/layouts/bad_gateway.html.tmpl
Normal 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" .}}
|
29
template/layouts/captive_portal.html.tmpl
Normal file
29
template/layouts/captive_portal.html.tmpl
Normal 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" .}}
|
121
template/layouts/highscore.html.tmpl
Normal file
121
template/layouts/highscore.html.tmpl
Normal 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}}
|
24
template/layouts/home.html.tmpl
Normal file
24
template/layouts/home.html.tmpl
Normal 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" .}}
|
85
template/layouts/profile.html.tmpl
Normal file
85
template/layouts/profile.html.tmpl
Normal 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" .}}
|
Loading…
Reference in New Issue
Block a user