basic design

This commit is contained in:
Evert Prants 2022-03-09 23:10:08 +02:00
parent f1fe2af224
commit 169c76eefc
Signed by: evert
GPG Key ID: 1688DA83D222D0B5
32 changed files with 1600 additions and 83 deletions

BIN
public/image/avatar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,117 @@
<?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"
id="svg8"
version="1.1"
viewBox="0 0 29.898235 29.898235"
height="29.898235mm"
width="29.898235mm">
<defs
id="defs2">
<marker
style="overflow:visible;"
id="Arrow1Send"
refX="0.0"
refY="0.0"
orient="auto">
<path
transform="scale(0.2) rotate(180) translate(6,0)"
style="fill-rule:evenodd;stroke:#03a9f4;stroke-width:1pt;stroke-opacity:1;fill:#03a9f4;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path856" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Mend"
refX="0.0"
refY="0.0"
orient="auto">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#03a9f4;stroke-width:1pt;stroke-opacity:1;fill:#03a9f4;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path850" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#03a9f4;stroke-width:1pt;stroke-opacity:1;fill:#03a9f4;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path844" />
</marker>
</defs>
<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
transform="translate(-1.2029979e-7,-0.00176382)"
id="layer1">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#00a1b5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal"
id="rect1083"
width="24.856066"
height="24.856066"
x="1.5723678"
y="3.4147503"
transform="rotate(-3.5293181)" />
<rect
transform="rotate(-8.5307657)"
y="4.5749965"
x="0.13787289"
height="24.856066"
width="24.856066"
id="rect815"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#00e1fd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#6fefff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect817"
width="24.856066"
height="24.856066"
x="2.5211489"
y="2.5227857"
transform="rotate(2.4309033e-4)" />
<path
clip-path="none"
id="path827"
d="m 10.375347,9.502362 8.447685,9.454613 4.277499,-12.1369222"
style="fill:none;fill-opacity:1;stroke:#03a9f4;stroke-width:1.876;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send)" />
<path
id="path831"
d="M 10.375347,9.502362 6.5886091,23.968708"
style="fill:none;fill-opacity:1;stroke:#03a9f4;stroke-width:1.87612462;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<circle
r="2.1394424"
cy="9.6658792"
cx="10.358132"
id="path833"
style="fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:0.92037439;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path833-3"
d="m 20.970232,18.802922 a 2.1394424,2.1394424 0 0 1 -2.139443,2.139442 2.1394424,2.1394424 0 0 1 -2.139442,-2.139442 2.1394424,2.1394424 0 0 1 2.139442,-2.139443 2.1394424,2.1394424 0 0 1 2.139443,2.139443 z"
style="opacity:1;vector-effect:none;fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:0.92037439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="2.1394424"
cy="23.691137"
cx="6.5025473"
id="path833-6"
style="fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:0.92037439;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -0,0 +1,134 @@
<?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="29.898235mm"
height="29.898235mm"
viewBox="0 0 29.898235 29.898235"
version="1.1"
id="svg8"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="icynet-icon-git.svg"
inkscape:export-filename="/home/diamond/IcyNetwork/IcyNet.eu/static/image/icynet-icon-large.png"
inkscape:export-xdpi="460.05008"
inkscape:export-ydpi="460.05008">
<defs
id="defs2">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath877">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#6fefff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect879"
width="24.856066"
height="24.856066"
x="2.5211489"
y="2.5227857"
transform="rotate(2.4309033e-4)" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.3312427"
inkscape:cx="28.418921"
inkscape:cy="80.641272"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1021"
inkscape:window-x="0"
inkscape:window-y="31"
inkscape:window-maximized="1"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-smooth-nodes="false"
inkscape:object-nodes="true" />
<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="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-1.2029979e-7,-0.00176382)">
<rect
transform="rotate(-3.5293181)"
y="3.4147503"
x="1.5723678"
height="24.856066"
width="24.856066"
id="rect1083"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#00a1b5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#00e1fd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal"
id="rect815"
width="24.856066"
height="24.856066"
x="0.13787289"
y="4.5749965"
transform="rotate(-8.5307657)" />
<rect
transform="rotate(2.4309033e-4)"
y="2.5227857"
x="2.5211489"
height="24.856066"
width="24.856066"
id="rect817"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#6fefff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
style="fill:none;fill-opacity:1;stroke:#03a9f4;stroke-width:2.63730979;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 5.0038362,0.64767494 6.6339828,6.39015866 8.36023,8.3602304"
id="path827"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc"
clip-path="url(#clipPath877)" />
<path
style="fill:none;fill-opacity:1;stroke:#03a9f4;stroke-width:2.63730979;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 11.637819,7.0378336 V 22.098787"
id="path831"
inkscape:connector-curvature="0" />
<circle
style="fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:1.29379058;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path833"
cx="11.637817"
cy="7.0378332"
r="3.0074615" />
<path
style="opacity:1;vector-effect:none;fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:1.29379058;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 24.135889,16.54294 a 3.0074614,3.0074614 0 0 1 -3.007462,3.007461 3.0074614,3.0074614 0 0 1 -3.007461,-3.007461 3.0074614,3.0074614 0 0 1 3.007461,-3.007462 3.0074614,3.0074614 0 0 1 3.007462,3.007462 z"
id="path833-3"
inkscape:connector-curvature="0" />
<circle
style="fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:1.29379058;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path833-6"
cx="11.637819"
cy="22.204615"
r="3.0074615" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@ -0,0 +1,103 @@
<?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"
width="29.898235mm"
height="29.898235mm"
viewBox="0 0 29.898235 29.898235"
version="1.1"
id="svg8">
<defs
id="defs2">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath877">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#6fefff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect879"
width="24.856066"
height="24.856066"
x="2.5211489"
y="2.5227857"
transform="rotate(2.4309033e-4)" />
</clipPath>
</defs>
<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
id="layer1"
transform="translate(-1.2029979e-7,-0.00176382)">
<rect
transform="rotate(-3.5293181)"
y="3.4147503"
x="1.5723678"
height="24.856066"
width="24.856066"
id="rect1083"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#00a1b5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#00e1fd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal"
id="rect815"
width="24.856066"
height="24.856066"
x="0.13787289"
y="4.5749965"
transform="rotate(-8.5307657)" />
<rect
transform="rotate(2.4309033e-4)"
y="2.5227857"
x="2.5211489"
height="24.856066"
width="24.856066"
id="rect817"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#6fefff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<g
transform="matrix(0.06114614,0,0,0.06114614,-0.73486692,-0.70252952)"
id="g4612"
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:4.88991;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1">
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:4.88991;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="M 235,89 V 423 H 152 V 115 l 26,-26 z"
id="path4495" />
<circle
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:4.88991;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
id="path4497"
cy="115"
cx="178"
r="26" />
<circle
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:4.88991;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
id="path4497-0"
cy="230"
cx="335"
r="26" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:4.88991;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="M 277,256 V 89 l 84,3e-6 L 361.00002,230 335,256 Z"
id="path4516" />
<circle
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:4.88991;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
id="path4497-0-6"
cy="397"
cx="335"
r="26" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:4.88991;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="m 277,423 v -83 h 84 l 2e-5,57 L 335,423 Z"
id="path4516-5" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,134 @@
<?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="29.898235mm"
height="29.898235mm"
viewBox="0 0 29.898235 29.898235"
version="1.1"
id="svg8"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="icynet-icon.svg"
inkscape:export-filename="/home/diamond/IcyNetwork/IcyNet.eu/static/image/icynet-icon-large.png"
inkscape:export-xdpi="460.05008"
inkscape:export-ydpi="460.05008">
<defs
id="defs2">
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter1378"
x="-0.024088247"
width="1.0481765"
y="-0.023912397"
height="1.0478248">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.19860895"
id="feGaussianBlur1380" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568543"
inkscape:cx="38.38993"
inkscape:cy="45.763944"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1011"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<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="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-1.2029979e-7,-0.00176382)">
<rect
transform="rotate(-3.5293181)"
y="3.4147503"
x="1.5723678"
height="24.856066"
width="24.856066"
id="rect1083"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#00a1b5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#00e1fd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal"
id="rect815"
width="24.856066"
height="24.856066"
x="0.13787289"
y="4.5749965"
transform="rotate(-8.5307657)" />
<rect
transform="rotate(2.4309033e-4)"
y="2.5227857"
x="2.5211489"
height="24.856066"
width="24.856066"
id="rect817"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#6fefff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:52.66549683px;line-height:0;font-family:'Open Sans';-inkscape-font-specification:'Open Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.61717373px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter1378)"
x="14.788064"
y="14.919127"
id="text1264"><tspan
id="tspan1260"
sodipodi:role="line"
x="14.788064"
y="14.919127"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.16637421px;line-height:0;font-family:'Open Sans';-inkscape-font-specification:'Open Sans Bold';text-align:center;text-anchor:middle;fill:#0059a0;fill-opacity:1;stroke-width:0.61717373px">ICY</tspan><tspan
id="tspan1262"
sodipodi:role="line"
x="14.788064"
y="25.230335"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:9.05188179px;line-height:0;font-family:'Open Sans';-inkscape-font-specification:'Open Sans Bold';text-align:center;text-anchor:middle;fill:#007104;fill-opacity:1;stroke-width:0.61717373px">net</tspan></text>
<text
id="text839"
y="14.615795"
x="14.558904"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:52.66549683px;line-height:0;font-family:'Open Sans';-inkscape-font-specification:'Open Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.61717373px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.16637421px;line-height:0;font-family:'Open Sans';-inkscape-font-specification:'Open Sans Bold';text-align:center;text-anchor:middle;fill:#03a9f4;fill-opacity:1;stroke-width:0.61717373px"
y="14.615795"
x="14.558904"
sodipodi:role="line"
id="tspan1252">ICY</tspan><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:9.05188179px;line-height:0;font-family:'Open Sans';-inkscape-font-specification:'Open Sans Bold';text-align:center;text-anchor:middle;fill:#00b300;fill-opacity:1;stroke-width:0.61717373px"
y="24.927004"
x="14.558904"
sodipodi:role="line"
id="tspan1258">net</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
public/image/icynet.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

152
public/image/icynet.svg Normal file
View File

@ -0,0 +1,152 @@
<?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"
width="303.82721"
height="35.330757"
version="1.1"
viewBox="0 0 80.387615 9.3479292"
id="svg3874">
<metadata
id="metadata3880">
<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>
<defs
id="defs3878">
<filter
style="color-interpolation-filters:sRGB"
id="filter5033"
x="0"
y="0"
width="1.04"
height="1.0599999">
<feFlood
flood-opacity="1"
flood-color="rgb(0,89,160)"
result="flood"
id="feFlood5023" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite5025" />
<feOffset
dx="0.4"
dy="0.4"
result="offset"
id="feOffset5029" />
<feGaussianBlur
in="offset"
stdDeviation="0.3"
result="blur"
id="feGaussianBlur5027" />
<feComposite
in="SourceGraphic"
in2="blur"
operator="over"
result="composite2"
id="feComposite5031" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
id="filter5045"
x="0"
y="0"
width="1.01"
height="1.0599999">
<feFlood
flood-opacity="1"
flood-color="rgb(0,113,4)"
result="flood"
id="feFlood5035" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite5037" />
<feOffset
dx="0.4"
dy="0.4"
result="offset"
id="feOffset5041" />
<feGaussianBlur
in="offset"
stdDeviation="0.3"
result="blur"
id="feGaussianBlur5039" />
<feComposite
in="SourceGraphic"
in2="blur"
operator="over"
result="composite2"
id="feComposite5043" />
</filter>
</defs>
<!--style>
text {
font-family: "Open Sans";
font-weight: bold;
text-transform: uppercase;
text-align: center;
text-shadow: 2px 2px 1px #007104;
color: #00b300;
user-select: none;
cursor: default;
}
#ts1 {
color: #03a9f4;
text-shadow: 2px 2px 1px #0059a0;
}
</style-->
<g
transform="translate(-50.340659,-159.82899)"
id="g3872"
style="filter:url(#filter5045)">
<text
x="69.641945"
y="168.53017"
xml:space="preserve"
id="text3870"><tspan
id="ts2"
x="69.641945"
y="168.53017"
style="color:#00b300;font-weight:bold;font-family:'Open Sans';text-align:center;text-transform:uppercase;fill:#00b300;fill-opacity:1">NETWORK</tspan></text>
</g>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.11109924px;line-height:1.25;font-family:P052;-inkscape-font-specification:P052;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="16.607485"
y="2.4248574"
id="text4974"><tspan
id="tspan4972"
x="16.607485"
y="122.5104"
style="stroke-width:0.26458332" /></text>
<g
transform="translate(-82.121269,-160.8011)"
id="g3872-7">
<text
x="81.043144"
y="169.50345"
xml:space="preserve"
id="text3870-0"
style="fill:#03a9f4;fill-opacity:1;filter:url(#filter5033)"><tspan
id="ts2-3"
x="81.043144"
y="169.50345"
style="color:#00b300;font-weight:bold;font-family:'Open Sans';text-align:center;text-transform:uppercase;fill:#03a9f4;fill-opacity:1">ICY</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

703
public/image/squeebot.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 158 KiB

View File

@ -2,7 +2,6 @@ import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller'; import { AppController } from './app.controller';
import { AppService } from './app.service'; import { AppService } from './app.service';
import { CSRFMiddleware } from './middleware/csrf.middleware'; import { CSRFMiddleware } from './middleware/csrf.middleware';
import { FlashMiddleware } from './middleware/flash.middleware';
import { LoginModule } from './modules/features/login/login.module'; import { LoginModule } from './modules/features/login/login.module';
import { OAuth2Module } from './modules/features/oauth2/oauth2.module'; import { OAuth2Module } from './modules/features/oauth2/oauth2.module';
import { RegisterModule } from './modules/features/register/register.module'; import { RegisterModule } from './modules/features/register/register.module';
@ -33,8 +32,5 @@ import { UtilityModule } from './modules/utility/utility.module';
export class AppModule implements NestModule { export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) { configure(consumer: MiddlewareConsumer) {
consumer.apply(CSRFMiddleware).forRoutes('*'); consumer.apply(CSRFMiddleware).forRoutes('*');
consumer
.apply(FlashMiddleware)
.forRoutes('login', 'register', 'login/verify', 'two-factor');
} }
} }

View File

@ -25,7 +25,7 @@ export class LoginController {
) {} ) {}
@Get() @Get()
@Render('login') @Render('login/login')
public loginView( public loginView(
@Session() session: SessionData, @Session() session: SessionData,
@Req() req: Request, @Req() req: Request,
@ -92,7 +92,10 @@ export class LoginController {
return; return;
} }
res.render('totp-verify', this.formUtil.populateTemplate(req, session)); res.render(
'login/totp-verify',
this.formUtil.populateTemplate(req, session),
);
} }
@Post('verify') @Post('verify')

View File

@ -4,6 +4,7 @@ import {
NestModule, NestModule,
RequestMethod, RequestMethod,
} from '@nestjs/common'; } from '@nestjs/common';
import { FlashMiddleware } from 'src/middleware/flash.middleware';
import { ValidateCSRFMiddleware } from 'src/middleware/validate-csrf.middleware'; import { ValidateCSRFMiddleware } from 'src/middleware/validate-csrf.middleware';
import { UserModule } from 'src/modules/objects/user/user.module'; import { UserModule } from 'src/modules/objects/user/user.module';
import { LoginController } from './login.controller'; import { LoginController } from './login.controller';
@ -17,5 +18,7 @@ export class LoginModule implements NestModule {
consumer consumer
.apply(ValidateCSRFMiddleware) .apply(ValidateCSRFMiddleware)
.forRoutes({ path: '*', method: RequestMethod.POST }); .forRoutes({ path: '*', method: RequestMethod.POST });
consumer.apply(FlashMiddleware).forRoutes('*');
} }
} }

View File

@ -4,6 +4,7 @@ import {
NestModule, NestModule,
RequestMethod, RequestMethod,
} from '@nestjs/common'; } from '@nestjs/common';
import { FlashMiddleware } from 'src/middleware/flash.middleware';
import { ValidateCSRFMiddleware } from 'src/middleware/validate-csrf.middleware'; import { ValidateCSRFMiddleware } from 'src/middleware/validate-csrf.middleware';
import { UserModule } from 'src/modules/objects/user/user.module'; import { UserModule } from 'src/modules/objects/user/user.module';
import { RegisterController } from './register.controller'; import { RegisterController } from './register.controller';
@ -17,5 +18,7 @@ export class RegisterModule implements NestModule {
consumer consumer
.apply(ValidateCSRFMiddleware) .apply(ValidateCSRFMiddleware)
.forRoutes({ path: '*', method: RequestMethod.POST }); .forRoutes({ path: '*', method: RequestMethod.POST });
consumer.apply(FlashMiddleware).forRoutes('*');
} }
} }

View File

@ -1,5 +1,6 @@
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AuthMiddleware } from 'src/middleware/auth.middleware'; import { AuthMiddleware } from 'src/middleware/auth.middleware';
import { FlashMiddleware } from 'src/middleware/flash.middleware';
import { UserModule } from 'src/modules/objects/user/user.module'; import { UserModule } from 'src/modules/objects/user/user.module';
import { TwoFactorController } from './twofactor.controller'; import { TwoFactorController } from './twofactor.controller';
@ -10,5 +11,6 @@ import { TwoFactorController } from './twofactor.controller';
export class TwoFactorModule implements NestModule { export class TwoFactorModule implements NestModule {
configure(consumer: MiddlewareConsumer) { configure(consumer: MiddlewareConsumer) {
consumer.apply(AuthMiddleware).forRoutes('two-factor'); consumer.apply(AuthMiddleware).forRoutes('two-factor');
consumer.apply(FlashMiddleware).forRoutes('*');
} }
} }

12
src/scss/_alert.scss Normal file
View File

@ -0,0 +1,12 @@
.alert {
padding: 16px;
border-radius: 4px;
&-danger {
background-color: #ff292999;
}
&-success {
background-color: #12930099;
}
}

29
src/scss/_block.scss Normal file
View File

@ -0,0 +1,29 @@
.wrapper {
}
.container {
max-width: 1200px;
margin: auto;
}
.center-box {
max-width: 800px;
background-color: #2e6b81;
color: #fff;
margin: 2rem auto;
padding: 4rem;
box-shadow: 0px 6px 62px -14px rgba(0, 0, 0, 0.45);
-webkit-box-shadow: 0px 6px 62px -14px rgba(0, 0, 0, 0.45);
-moz-box-shadow: 0px 6px 62px -14px rgba(0, 0, 0, 0.45);
h1:first-of-type {
margin-top: 0;
text-align: center;
}
}
.logo-container {
text-align: center;
margin-top: 2rem;
}

37
src/scss/_button.scss Normal file
View File

@ -0,0 +1,37 @@
.btn {
padding: 12px 24px;
font-size: 1rem;
appearance: none;
border: none;
border-radius: 4px;
cursor: pointer;
outline: 0px solid #00c0ff8a;
min-width: 120px;
transition: background-color 0.35s linear, outline 0.15s linear;
&-link {
font-size: 1rem;
color: #fff;
padding: 12px;
}
background-color: var(--btn-background);
color: var(--btn-color);
&:hover {
background-color: var(--btn-background-hover);
}
&:focus {
outline: 4px solid #00c0ff8a;
}
&-primary {
--btn-background: #00c4ff;
--btn-background-hover: #3ed2ff;
--btn-color: #002d34;
text-transform: uppercase;
font-weight: 500;
}
}

18
src/scss/_flex.scss Normal file
View File

@ -0,0 +1,18 @@
.align-self-end {
align-self: end;
}
.align-self-start {
align-self: start;
}
.align-self-center {
align-self: center;
}
.d-flex {
display: flex;
}
.flex-column {
flex-direction: column;
}
.flex-row {
flex-direction: row;
}

33
src/scss/_form.scss Normal file
View File

@ -0,0 +1,33 @@
.form-container {
display: flex;
flex-direction: column;
.btn {
margin-top: 1rem;
}
}
.form-label {
margin-top: 1rem;
text-transform: uppercase;
font-weight: 600;
margin-bottom: 0.25rem;
}
input.form-control {
padding: 8px;
font-size: 1rem;
border-radius: 4px;
border: 1px solid #707070;
transition: outline 0.15s linear;
&:focus {
outline: 4px solid #00c0ff8a;
}
&:hover,
&:focus {
border: 1px solid #5c5c5c;
}
}

View File

@ -1,3 +1,9 @@
@import 'block';
@import 'form';
@import 'button';
@import 'flex';
@import 'alert';
*, *,
*::before, *::before,
*::after { *::after {
@ -6,8 +12,6 @@
html, html,
body { body {
width: 100%;
height: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
@ -15,4 +19,5 @@ body {
body { body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
background-color: #314550;
} }

View File

@ -4,6 +4,9 @@ block title
|Icy Network |Icy Network
block body block body
h1 Hello world! include partials/logo.pug
if user div.container
h2 Logged in as #{ user.display_name } div.center-box
h1 Hello, #{ user.display_name }!
p No pending authorization requests found.
p Have a good day!

View File

@ -1,20 +0,0 @@
extends partials/layout.pug
block title
|Icy Network | Log in
block body
h1 Log in
if message.text
if message.error
.alert.alert-danger
span #{message.text}
else
.alert.alert-success
span #{message.text}
form(method="post")
input#csrf(type="hidden", name="csrf", value=csrf)
input#username(type="text", name="username", placeholder="Username", value=form.username)
input#password(type="password", name="password", placeholder="Password")
button(type="submit") Log in

27
views/login/login.pug Normal file
View File

@ -0,0 +1,27 @@
extends ../partials/layout.pug
block title
|Icy Network | Log in
block body
include ../partials/logo.pug
div.container
div.center-box
h1 Log in
if message.text
if message.error
.alert.alert-danger
span #{message.text}
else
.alert.alert-success
span #{message.text}
form(method="post")
div.form-container
input#csrf(type="hidden", name="csrf", value=csrf)
label.form-label(for="username") Username
input.form-control#username(type="text", name="username", placeholder="Username", value=form.username)
label.form-label(for="password") Password
input.form-control#password(type="password", name="password", placeholder="Password")
button.btn.btn-primary(type="submit") Log in
a.btn.btn-link.align-self-end(type="button" href="/register") Create a new account

View File

@ -0,0 +1,24 @@
extends ../partials/layout.pug
block title
|Icy Network | Veify two-factor
block body
include ../partials/logo.pug
div.container
div.center-box
h1 Verify two-factor authentication
if message.text
if message.error
.alert.alert-danger
span #{message.text}
else
.alert.alert-success
span #{message.text}
form(method="post")
div.form-container
input#csrf(type="hidden", name="csrf", value=csrf)
label.form-label(for="totp") Code
input.form-control#totp(type="text", name="totp", placeholder="xxxxxx")
button.btn.btn-primary(type="submit") Log in

View File

@ -17,4 +17,5 @@ html(lang="en")
title title
block title block title
body body
main.wrapper
block body block body

2
views/partials/logo.pug Normal file
View File

@ -0,0 +1,2 @@
div.logo-container
img(src="/public/image/icynet-icon.svg", alt="Icy Network")

View File

@ -4,6 +4,9 @@ block title
|Icy Network | Register |Icy Network | Register
block body block body
include partials/logo.pug
div.container
div.center-box
h1 Register h1 Register
if message.text if message.text
if message.error if message.error
@ -14,11 +17,17 @@ block body
span #{message.text} span #{message.text}
form(method="post") form(method="post")
div.form-container
input#csrf(type="hidden", name="csrf", value=csrf) input#csrf(type="hidden", name="csrf", value=csrf)
input#username(type="text", name="username", placeholder="Username", value=form.username) label.form-label(for="username") Username
input#display_name(type="text", name="display_name", placeholder="Display name", value=form.display_name) input.form-control#username(type="text", name="username", placeholder="Username", value=form.username)
input#email(type="email", name="email", placeholder="Email address", value=form.email) label.form-label(for="display_name") Display name
input#password(type="password", name="password", placeholder="Password", value=form.password) input.form-control#display_name(type="text", name="display_name", placeholder="Display name", value=form.display_name)
input#password_repeat(type="password", name="password_repeat", placeholder="Confirm password") label.form-label(for="email") Email address
button(type="submit") Create a new account input.form-control#email(type="email", name="email", placeholder="Email address", value=form.email)
a(type="button" href="/login") Log in label.form-label(for="password") Password
input.form-control#password(type="password", name="password", placeholder="Password", value=form.password)
label.form-label(for="password_repeat") Confirm password
input.form-control#password_repeat(type="password", name="password_repeat", placeholder="Confirm password")
button.btn.btn-primary(type="submit") Create a new account
a.btn.btn-link.align-self-end(type="button" href="/login") Log in instead

View File

@ -1,19 +0,0 @@
extends partials/layout.pug
block title
|Icy Network | Veify two-factor
block body
h1 Verify two-factor authentication
if message.text
if message.error
.alert.alert-danger
span #{message.text}
else
.alert.alert-success
span #{message.text}
form(method="post")
input#csrf(type="hidden", name="csrf", value=csrf)
input#totp(type="text", name="totp", placeholder="Code")
button(type="submit") Log in

View File

@ -4,6 +4,9 @@ block title
|Icy Network | Two-factor authentication |Icy Network | Two-factor authentication
block body block body
include ../partials/logo.pug
div.container
div.center-box
h1 Activate two-factor authentication h1 Activate two-factor authentication
if message.text if message.text
if message.error if message.error
@ -13,9 +16,12 @@ block body
.alert.alert-success .alert.alert-success
span #{message.text} span #{message.text}
div.qr-preview
img(src=qrcode) img(src=qrcode)
form(method="post") form(method="post")
div.form-container
input#csrf(type="hidden", name="csrf", value=csrf) input#csrf(type="hidden", name="csrf", value=csrf)
input#code(type="text", name="code", placeholder="Code from app") label.form-label(for="code") Code from authenticator app
button(type="submit") Activate input.form-control#code(type="text", name="code", placeholder="xxxxxx")
button.btn.btn-primary(type="submit") Activate