Move files to follow webpack structure

This commit is contained in:
2023-10-20 20:47:26 +02:00
parent b3cd217e28
commit 842e02f4bb
106 changed files with 73 additions and 1016 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/images/icons/mstile-150x150.png?v=GvmqYyKwbb"/>
<TileColor>#00a300</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M5041 5784 c366 -384 572 -817 630 -1323 17 -156 7 -495 -20 -641
-78 -415 -250 -717 -1091 -1915 -108 -154 -338 -482 -510 -730 -172 -247 -328
-469 -346 -492 -21 -25 -56 -52 -91 -68 -48 -23 -66 -27 -127 -23 -46 2 -86
11 -113 24 l-42 21 36 -44 c47 -58 122 -116 191 -150 50 -25 68 -28 152 -28
88 0 100 2 163 34 80 40 167 121 254 236 102 137 967 1375 1158 1660 429 639
578 959 636 1365 20 140 17 485 -5 630 -37 237 -101 440 -205 655 -162 331
-404 620 -696 830 -33 24 -28 16 26 -41z"/>
<path d="M2750 5673 c-63 -22 -143 -75 -197 -131 -192 -196 -318 -616 -298
-990 9 -174 36 -314 118 -607 l34 -120 316 -3 317 -2 0 62 c1 81 22 199 49
265 11 29 42 87 69 130 143 230 186 366 185 588 -1 420 -140 736 -356 809 -60
20 -177 20 -237 -1z"/>
<path d="M4017 5056 c-174 -62 -301 -280 -348 -591 -19 -129 -17 -337 4 -425
32 -136 85 -257 159 -368 81 -119 127 -268 128 -410 l0 -62 317 2 316 3 34
120 c106 374 136 590 115 816 -22 225 -66 391 -153 566 -48 97 -74 138 -131
198 -39 42 -90 87 -115 102 -99 58 -241 79 -326 49z"/>
<path d="M2412 3548 c3 -109 7 -129 30 -173 120 -232 445 -231 559 0 28 58 32
76 37 180 l5 115 -318 0 -317 0 4 -122z"/>
<path d="M3960 2962 c0 -234 106 -368 300 -380 98 -5 168 20 233 83 75 75 91
119 95 263 l4 122 -316 0 -316 0 0 -88z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,22 @@
{
"name": "Spotty",
"short_name": "Spotty",
"icons": [
{
"src": "/images/icons/android-chrome-192x192.png?v=GvmqYyKwbb",
"sizes": "192x192",
"type": "image/png",
"purpose": "any maskable"
},
{
"src": "/images/icons/android-chrome-512x512.png?v=GvmqYyKwbb",
"sizes": "512x512",
"type": "image/png",
"purpose": "any maskable"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "browser",
"orientation": "portrait"
}

BIN
src/images/logo_black.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
src/images/ogp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

View File

@@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
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"
viewBox="0 0 32 64"
version="1.1"
id="svg4"
sodipodi:docname="footprint_mapbox.svg"
width="32"
height="64"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
inkscape:export-filename="C:\Users\francois\Downloads\footprint_mapbox.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<metadata
id="metadata10">
<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="defs8">
<linearGradient
id="linearGradient4520"
osb:paint="solid">
<stop
style="stop-color:#6dff58;stop-opacity:1;"
offset="0"
id="stop4518" />
</linearGradient>
<filter
style="color-interpolation-filters:sRGB"
inkscape:label="Drop Shadow"
id="filter4696">
<feFlood
flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood4686" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite4688" />
<feGaussianBlur
in="composite1"
stdDeviation="3"
result="blur"
id="feGaussianBlur4690" />
<feOffset
dx="3"
dy="3"
result="offset"
id="feOffset4692" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite4694" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter5223">
<feFlood
flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood5213" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite5215" />
<feGaussianBlur
in="composite1"
stdDeviation="1.2"
result="blur"
id="feGaussianBlur5217" />
<feOffset
dx="1.2"
dy="1.2"
result="offset"
id="feOffset5219" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite5221" />
</filter>
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview6"
showgrid="false"
inkscape:snap-grids="true"
inkscape:zoom="7.375"
inkscape:cx="2.1125062"
inkscape:cy="47.406997"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4"
units="px" />
<path
id="path4698"
d="M 14.766749,31.354369 C 5.685625,18.189432 4,16.838309 4,11.999995 4,5.3725591 9.372562,1.6977696e-7 15.999999,1.6977696e-7 22.627436,1.6977696e-7 27.999997,5.3725591 27.999997,11.999995 c 0,4.838314 -1.685625,6.189437 -10.766748,19.354374 -0.595937,0.860873 -1.870625,0.860809 -2.4665,0 z"
inkscape:connector-curvature="0"
style="fill:#6dff58;fill-opacity:1;stroke:none;stroke-width:0.06249999;stroke-opacity:1;filter:url(#filter5223)"
inkscape:label="marker" />
<path
id="shoes"
d="M 13.374927,15.750008 V 14.875009 H 9.874933 v 0.874999 c 0,0.9666 0.783398,1.749997 1.749997,1.749997 0.9666,0 1.749997,-0.783397 1.749997,-1.749997 z M 20.374916,21 c 0.966601,0 1.749997,-0.783397 1.749997,-1.749998 V 18.375004 H 18.62492 v 0.874998 C 18.62492,20.216603 19.408317,21 20.374916,21 Z m -3.499995,-9.227407 c 0,0.954568 0.358751,2.082497 0.875,2.863705 0.447889,0.677851 0.874999,1.217341 0.874999,2.863707 h 3.499993 l 0.43668,-1.573084 c 0.199061,-0.71668 0.358748,-1.449489 0.411523,-2.195972 0.06316,-0.893867 0.01832,-1.793749 -0.16953,-2.6682 C 22.160461,8.0691608 20.7364,7.0000212 19.499917,7.0000212 c -1.749996,0 -2.624996,2.301792 -2.624996,4.7725718 z M 9.1965372,7.5627551 C 9.0086846,8.4372073 8.9635689,9.3370882 9.0270036,10.230954 c 0.052768,0.746483 0.2124626,1.479295 0.41125,2.195973 l 0.4366794,1.573082 h 3.499994 c 0,-1.646091 0.42711,-2.185857 0.874999,-2.863704 0.516249,-0.781212 0.874999,-1.9091372 0.874999,-2.863708 0,-2.4707766 -0.874999,-4.7725699 -2.624996,-4.7725699 -1.236482,0 -2.6605428,1.0691392 -3.3033918,4.062728 z"
inkscape:connector-curvature="0"
style="fill:#326526;fill-opacity:1;stroke-width:0.0273437" />
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
src/images/source/ogp.xcf Normal file

Binary file not shown.

142
src/images/source/spot.svg Normal file
View File

@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
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"
viewBox="0 0 512 512"
version="1.1"
id="svg4"
sodipodi:docname="spot.svg"
width="512"
height="512"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
inkscape:export-filename="C:\Users\francois\Downloads\footprint_mapbox.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<metadata
id="metadata10">
<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="defs8">
<linearGradient
id="linearGradient4520"
osb:paint="solid">
<stop
style="stop-color:#6dff58;stop-opacity:1;"
offset="0"
id="stop4518" />
</linearGradient>
<filter
style="color-interpolation-filters:sRGB"
inkscape:label="Drop Shadow"
id="filter4696">
<feFlood
flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood4686" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite4688" />
<feGaussianBlur
in="composite1"
stdDeviation="3"
result="blur"
id="feGaussianBlur4690" />
<feOffset
dx="3"
dy="3"
result="offset"
id="feOffset4692" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite4694" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
inkscape:label="Drop Shadow"
id="filter5223">
<feFlood
flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood5213" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite5215" />
<feGaussianBlur
in="composite1"
stdDeviation="1.2"
result="blur"
id="feGaussianBlur5217" />
<feOffset
dx="1.2"
dy="1.2"
result="offset"
id="feOffset5219" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite5221" />
</filter>
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview6"
showgrid="false"
inkscape:snap-grids="true"
inkscape:zoom="1.3037281"
inkscape:cx="248.69883"
inkscape:cy="256.06919"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4"
units="px" />
<path
id="path4698"
d="M 14.766749,479.35437 C 5.685625,466.18943 4,464.83831 4,460 c 0,-6.62744 5.372562,-12 11.999999,-12 6.627437,0 11.999998,5.37256 11.999998,12 0,4.83831 -1.685625,6.18943 -10.766748,19.35437 -0.595937,0.86087 -1.870625,0.86081 -2.4665,0 z"
inkscape:connector-curvature="0"
style="fill:#6dff58;fill-opacity:1;stroke:none;stroke-width:0.06249999;stroke-opacity:1;filter:url(#filter5223)"
inkscape:label="marker"
transform="matrix(13.333333,0,0,13.333333,42.666662,-5930.6664)" />
<path
id="shoes"
d="m 221.87402,255.01429 v -11.375 h -45.49995 v 11.375 c 0,12.56578 10.18419,22.74983 22.74997,22.74983 12.56579,0 22.74998,-10.18405 22.74998,-22.74983 z m 90.99975,68.24979 c 12.56579,0 22.74982,-10.18419 22.74982,-22.74998 v -11.37499 h -45.4998 v 11.37499 c 0,12.56579 10.18419,22.74998 22.74998,22.74998 z M 267.37383,203.30789 c 0,12.40941 4.66373,27.07248 11.37498,37.22819 5.82257,8.81203 11.37498,15.8254 11.37498,37.22804 h 45.4998 l 5.67685,-20.45001 c 2.58791,-9.31681 4.66375,-18.84333 5.34988,-28.54756 0.8216,-11.6203 0.23791,-23.31873 -2.20387,-34.68656 -8.36069,-38.91663 -26.87344,-52.81544 -42.94766,-52.81544 -22.74998,0 -34.12496,29.92325 -34.12496,62.04334 z m -99.81881,-54.72772 c -2.44205,11.36784 -3.02861,23.06626 -2.20402,34.68644 0.68639,9.70437 2.7621,19.23086 5.34624,28.54769 l 5.67683,20.45002 h 45.49995 c 0,-21.39914 5.55243,-28.41615 11.37498,-37.22818 6.71124,-10.15572 11.37499,-24.81865 11.37499,-37.22807 0,-32.12008 -11.37499,-62.043305 -34.12495,-62.043305 -16.07422,0 -34.58699,13.898815 -42.94402,52.815405 z"
inkscape:connector-curvature="0"
style="fill:#326526;fill-opacity:1;stroke-width:0.35546762" />
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg width="406" height="469" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 406 469" style="enable-background:new 0 0 406 469;">
<style type="text/css">.st0{fill:#F18A00;}</style>
<g id="Layer_3"/>
<g id="Layer_8"/>
<g id="Layer_9"/>
<g id="Layer_7"/>
<g id="Layer_6"/>
<g id="Layer_4"/>
<g>
<g>
<path class="st0" d="m85.80618,195.80013c-1,-0.8 -1.3,-2.3 -0.6,-3.4c11.1,-18.2 56.5,-85.8 117.3,-85.8c49.6,0 90.4,33.4 110.3,53.3c1.2,1.2 2.9,1.9 4.6,1.9c1.7,0 3.4,-0.7 4.6,-1.9l16.4,-16.3c1,-1 1.1,-2.5 0.2,-3.5c-5.1,-6.1 -15.3,-17.2 -29.8,-28.2c-31.7,-24.1 -67.5,-36.3 -106.3,-36.3c-79.4,0 -129.8,75.4 -142.3,96.5c-0.8,1.4 -2.6,1.7 -3.8,0.7l-55.4,-43.6c-1,-0.8 -1.3,-2.2 -0.7,-3.3c5.9,-10.8 23,-39.4 48.5,-63.7c42.8,-40.7 95.1,-62.2 151.4,-62.2c56,0 109.2,18.9 153.9,54.8c27.3,21.9 45.5,43.2 51.3,50.4c0.8,1 0.7,2.5 -0.2,3.5l-12.3,12.2c-1.1,1.1 -2.9,1 -3.8,-0.2c-7.3,-8.9 -26.2,-30.5 -49.7,-49.2c-41.1,-32.7 -88,-49.2 -139.2,-49.2c-50.9,0 -96.5,18.6 -135.4,55.4c-20.9,19.7 -30.4,34.1 -35.6,42.3c-0.7,1.1 -0.5,2.6 0.6,3.5l16.7,13.2c1.2,0.9 2.6,1.4 4.1,1.4c2.2,0 4.2,-1.1 5.4,-2.9c7.4,-10.7 15.9,-20.6 26.8,-31.1c34.3,-33.1 75.7,-50.6 119.9,-50.6c92,0 151.2,70.7 165.3,89.4c0.8,1.1 0.7,2.5 -0.3,3.4l-49.8,49.3c-1.1,1.1 -2.8,1 -3.8,-0.1c-15.9,-18.1 -63,-66.5 -111.4,-66.5c-23.6,0 -46.6,11.3 -68.4,33.5c-7.2,7.3 -13.9,15.6 -19.9,24.4c-0.8,1.1 -0.5,2.7 0.6,3.6l93.1,73.2c1.1,0.9 1.3,2.5 0.4,3.7l-10.5,13.3c-0.9,1.1 -2.5,1.3 -3.7,0.4l-108.5,-85.3z" />
<path class="st0" d="m205.90618,468.90013c-56,0 -109.2,-18.9 -153.9,-54.8c-27.3,-21.9 -45.5,-43.2 -51.3,-50.4c-0.8,-1 -0.7,-2.5 0.2,-3.5l12.3,-12.2c1.1,-1.1 2.9,-1 3.8,0.2c7.3,8.9 26.2,30.5 49.7,49.2c41.1,32.7 88,49.2 139.2,49.2c50.9,0 96.5,-18.6 135.4,-55.4c20.9,-19.7 30.4,-34.1 35.6,-42.3c0.7,-1.1 0.5,-2.6 -0.6,-3.5l-16.7,-13.2c-1.2,-0.9 -2.6,-1.4 -4.1,-1.4c-2.2,0 -4.2,1.1 -5.4,2.9c-7.4,10.7 -15.9,20.6 -26.8,31.1c-34.3,33.1 -75.7,50.6 -119.8,50.6c-92,0 -151.2,-70.7 -165.3,-89.4c-0.8,-1.1 -0.7,-2.5 0.3,-3.4l49.8,-49.3c1.1,-1.1 2.8,-1 3.8,0.1c15.9,18.1 63,66.5 111.4,66.5c23.6,0 46.6,-11.3 68.4,-33.5c7.2,-7.3 13.9,-15.6 19.9,-24.4c0.8,-1.1 0.5,-2.7 -0.6,-3.6l-93.1,-73.2c-1.1,-0.9 -1.3,-2.5 -0.4,-3.7l10.5,-13.3c0.9,-1.1 2.5,-1.3 3.7,-0.4l108.3,85.2c1,0.8 1.3,2.3 0.6,3.4c-11.1,18.2 -56.5,85.8 -117.3,85.8c-49.6,0 -90.4,-33.4 -110.3,-53.3c-1.2,-1.2 -2.9,-1.9 -4.6,-1.9s-3.4,0.7 -4.6,1.9l-16.4,16.3c-1,1 -1.1,2.5 -0.2,3.5c5.1,6.1 15.3,17.2 29.8,28.2c31.7,24.1 67.5,36.3 106.3,36.3c79.4,0 129.8,-75.4 142.3,-96.5c0.8,-1.4 2.6,-1.7 3.8,-0.7l55.4,43.6c1,0.8 1.3,2.2 0.7,3.3c-5.9,10.8 -23,39.4 -48.5,63.7c-42.6,40.8 -95,62.3 -151.3,62.3z" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

48
src/images/spot-logo.svg Normal file
View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1466.5 481.4" style="enable-background:new 0 0 1466.5 481.4;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F18A00;}
.st1{fill:#FFFFFF;}
</style>
<g id="Layer_3">
</g>
<g id="Layer_8">
</g>
<g id="Layer_9">
</g>
<g id="Layer_7">
</g>
<g id="Layer_6">
</g>
<g id="Layer_4">
</g>
<g>
<g>
<path class="st0" d="M99.7,202.1c-1-0.8-1.3-2.3-0.6-3.4c11.1-18.2,56.5-85.8,117.3-85.8c49.6,0,90.4,33.4,110.3,53.3 c1.2,1.2,2.9,1.9,4.6,1.9c1.7,0,3.4-0.7,4.6-1.9l16.4-16.3c1-1,1.1-2.5,0.2-3.5c-5.1-6.1-15.3-17.2-29.8-28.2 C291,94.1,255.2,81.9,216.4,81.9c-79.4,0-129.8,75.4-142.3,96.5c-0.8,1.4-2.6,1.7-3.8,0.7l-55.4-43.6c-1-0.8-1.3-2.2-0.7-3.3 c5.9-10.8,23-39.4,48.5-63.7c42.8-40.7,95.1-62.2,151.4-62.2c56,0,109.2,18.9,153.9,54.8c27.3,21.9,45.5,43.2,51.3,50.4 c0.8,1,0.7,2.5-0.2,3.5l-12.3,12.2c-1.1,1.1-2.9,1-3.8-0.2c-7.3-8.9-26.2-30.5-49.7-49.2c-41.1-32.7-88-49.2-139.2-49.2 c-50.9,0-96.5,18.6-135.4,55.4c-20.9,19.7-30.4,34.1-35.6,42.3c-0.7,1.1-0.5,2.6,0.6,3.5L60.4,143c1.2,0.9,2.6,1.4,4.1,1.4 c2.2,0,4.2-1.1,5.4-2.9c7.4-10.7,15.9-20.6,26.8-31.1c34.3-33.1,75.7-50.6,119.9-50.6c92,0,151.2,70.7,165.3,89.4 c0.8,1.1,0.7,2.5-0.3,3.4l-49.8,49.3c-1.1,1.1-2.8,1-3.8-0.1c-15.9-18.1-63-66.5-111.4-66.5c-23.6,0-46.6,11.3-68.4,33.5 c-7.2,7.3-13.9,15.6-19.9,24.4c-0.8,1.1-0.5,2.7,0.6,3.6L222,270c1.1,0.9,1.3,2.5,0.4,3.7L211.9,287c-0.9,1.1-2.5,1.3-3.7,0.4 L99.7,202.1z"/>
<path class="st0" d="M219.8,475.2c-56,0-109.2-18.9-153.9-54.8c-27.3-21.9-45.5-43.2-51.3-50.4c-0.8-1-0.7-2.5,0.2-3.5l12.3-12.2 c1.1-1.1,2.9-1,3.8,0.2c7.3,8.9,26.2,30.5,49.7,49.2c41.1,32.7,88,49.2,139.2,49.2c50.9,0,96.5-18.6,135.4-55.4 c20.9-19.7,30.4-34.1,35.6-42.3c0.7-1.1,0.5-2.6-0.6-3.5l-16.7-13.2c-1.2-0.9-2.6-1.4-4.1-1.4c-2.2,0-4.2,1.1-5.4,2.9 c-7.4,10.7-15.9,20.6-26.8,31.1c-34.3,33.1-75.7,50.6-119.8,50.6c-92,0-151.2-70.7-165.3-89.4c-0.8-1.1-0.7-2.5,0.3-3.4l49.8-49.3 c1.1-1.1,2.8-1,3.8,0.1c15.9,18.1,63,66.5,111.4,66.5c23.6,0,46.6-11.3,68.4-33.5c7.2-7.3,13.9-15.6,19.9-24.4 c0.8-1.1,0.5-2.7-0.6-3.6L212,211.5c-1.1-0.9-1.3-2.5-0.4-3.7l10.5-13.3c0.9-1.1,2.5-1.3,3.7-0.4l108.3,85.2 c1,0.8,1.3,2.3,0.6,3.4c-11.1,18.2-56.5,85.8-117.3,85.8c-49.6,0-90.4-33.4-110.3-53.3c-1.2-1.2-2.9-1.9-4.6-1.9s-3.4,0.7-4.6,1.9 l-16.4,16.3c-1,1-1.1,2.5-0.2,3.5c5.1,6.1,15.3,17.2,29.8,28.2c31.7,24.1,67.5,36.3,106.3,36.3c79.4,0,129.8-75.4,142.3-96.5 c0.8-1.4,2.6-1.7,3.8-0.7l55.4,43.6c1,0.8,1.3,2.2,0.7,3.3c-5.9,10.8-23,39.4-48.5,63.7C328.5,453.7,276.1,475.2,219.8,475.2z"/>
</g>
<g>
<g>
<g>
<path class="st1" d="M543.5,95.1c-1.3-4.8-3.7-8.6-8.4-8.6c-3.6,0-5.9,2.1-5.9,5.4c0,13.9,31.3,12,31.3,38.3 c0,14.2-10,22.3-25.4,22.3c-15,0-22.4-6.7-25-21.3L527,128c0.8,6.1,3.3,9.9,8.9,9.9c4.1,0,7.1-2.1,7.1-6.4 c0-14.6-31.4-12.6-31.4-39c0-12.3,8.9-20.6,23.2-20.6c14.9,0,21.5,7.6,24.4,19.9L543.5,95.1z"/>
<path class="st1" d="M620,151.5l-3-17h-14.9l-2.7,17h-18.6l16.9-78.6h23.9l17.3,78.6H620z M604.7,119h9.7l-4.8-28.2h-0.3 L604.7,119z"/>
<path class="st1" d="M674.5,151.5l-18.1-78.6h19.8l8.8,52h0.2l9.6-52h19.6l-18.5,78.6H674.5z"/>
<path class="st1" d="M741.3,151.5V72.9h44.1v15.9h-25.8v14.7H779v15.4h-19.4v16.8h26.8v15.9L741.3,151.5L741.3,151.5z"/>
<path class="st1" d="M816.3,151.5V72.9h21.8c21.2,0,32.1,10.3,32.1,38.2c0,25.3-8.5,40.4-31.8,40.4H816.3z M839.4,135 c8.6,0,12-7.9,12-23.5c0-17.2-4.4-22-12.1-22H835V135H839.4z"/>
<path class="st1" d="M944.8,151.5V72.9h22.6c19.1,0,27.4,6.2,27.4,20.8c0,7.9-3.5,13.6-10.2,16.5v0.2c7.7,2.6,11.8,8.1,11.8,18 c0,18.8-12.9,23.1-28.9,23.1H944.8z M968.3,104.1c4.9,0,7.8-2.4,7.8-8.3c0-5.6-3.2-7.2-7.8-7.2h-5.6v15.5H968.3z M968.8,135.8 c6.7,0,9-2.7,9-8.9c0-6.7-3.6-8.9-8.9-8.9h-6.1v17.7L968.8,135.8L968.8,135.8z"/>
<path class="st1" d="M1036.6,151.5v-30.4l-19.5-48.2h19.3l9.3,27.9h0.2l9.9-27.9h19.1l-19.8,48.2v30.4H1036.6z"/>
</g>
<g>
<path class="st1" d="M492.2,363.3h121.3c15,0,15.6-9.7,15.6-15c0-7.5-3.7-13.8-16.9-17.8l-85.6-25.6 c-28.4-8.4-36.9-30.6-36.9-61.3c0-32.8,14.4-55.3,50.6-55.3h135v43.8H562.2c-8.1,0-15.3,3.1-15.3,14.4c0,8.4,4.4,14.4,17.5,18.4 l76.9,22.5c32.5,9.4,45.3,25.6,45.3,61.6c0,34.7-12.8,58.1-50,58.1H492.2V363.3z"/>
<path class="st1" d="M706.9,407.1v-185c0-23.4,12.8-33.8,33.1-33.8h116.3c48.4,0,59.1,30.3,59.1,74.1s-10.6,74.7-59.1,74.7 h-93.1v70H706.9z M827.3,293.3c23.4,0,30.6-9.1,30.6-30.9s-7.2-30.3-30.6-30.3h-49.4c-10.9,0-14.7,3.8-14.7,14.7v46.6 L827.3,293.3L827.3,293.3z"/>
<path class="st1" d="M1162.1,297.7c0,91.3-30.3,111.9-116.3,111.9S929.5,389,929.5,297.7c0-91,30.3-111.9,116.3-111.9 C1131.7,185.8,1162.1,206.7,1162.1,297.7z M1045.8,365.8c45.6,0,58.8-16.6,58.8-68.1s-13.1-68.1-58.8-68.1 c-45.6,0-58.8,16.6-58.8,68.1S1000.2,365.8,1045.8,365.8z"/>
<path class="st1" d="M1248,407.1v-175h-81.3v-43.8h218.8v43.8h-81.3v175H1248z"/>
</g>
</g>
<g>
<path class="st1" d="M1410.9,214.7v-21.5h-6.9v-4.9h19.7v4.9h-6.9v21.5H1410.9z M1448.6,214.7v-18.9h-0.1l-5.2,18.9h-5l-5.5-18.9 h-0.1v18.9h-5.5v-26.4h8.3l5.2,18.4h0.1l5.4-18.4h8v26.4H1448.6z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

177
src/languages/en.lang Normal file
View File

@@ -0,0 +1,177 @@
locale = en_NZ
page_og_desc = Keep contact with François when he is off hiking
error_commit_db = Issue committing to DB
unknown_field = Field "$0" is unknown
nav_back = Back
admin = Admin Panel
admin_config = Config
admin_upload = Upload
save = Save
admin_save_success = Saved
track_main = Main track
track_off-track = Off-track
track_hitchhiking = Hitchhiking
track_download = Download GPX Track
upload_title = Picture & Video Uploads
upload_mode_archived= Project "$0" is archived. No upload allowed
upload_success = $0 uploaded successfully
upload_media_exist = Picture $0 already exists
post_message = Message
post_name = Name
post_new_message = New message
and = and
counter = #$0
send = Send
maps = Base Maps
map_satellite = Satellite
map_otm = Open Topo Map
map_ign_france = IGN (France)
map_ign_spain = IGN (Spain)
map_linz = LINZ
map_usgs = USGS
map_natgeo = National Geographic
map_outdoors = Mapbox Outdoors
image = Picture
images = Pictures
image_taken = taken on $0
video = Video
video_taken = shot on $0
add_on = added on $0
click_watch = Click to watch video
click_zoom = Click to zoom
media_count = Media $0 / $1
media_no_id = Missing Media ID in request
media_comment_update= Comment of media "$0" updated
see_on_google = See on Google Maps
copy_to_clipboard = Copy direct link to clipboard
link_copied = Link copied!
city_time = $0 Time
local_time = $0 Local Time
your_time = $0 Your Time
date_time = $0 at $1
time_zone = Time Zone
id_project = Project ID
project = Project
projects = Projects
new_project = New Project
update_project = Update Project
hikes = Hikes
mode = Mode
mode_previz = Project in preparation
mode_blog = Active Project
mode_histo = Archived Project
code_name = Code name
start = Start
end = End
feeds = Feeds
id_feed = Feed ID
ref_feed_id = Ref. Feed ID
id_spot = Spot ID
name = Name
status = Status
last_update = Last Spot Check
ref_spot_id = Ref. Spot ID
model = Model
delete = Delete
id_user = User ID
user_name = User Name
active_users = Active Users
language = Language
clearance = Clearance
toolbox = Toolbox
unit_day = day
unit_days = days
unit_hour = h
newsletter = Keep in touch!
nl_email_placeholder= my@email.com
nl_invalid_email = It doesn't look like an email
nl_subscribed_desc = You're all set. We'll send you updates as soon as we get them
nl_unsubscribed_desc= Write down your email address and we'll send you François' position as soon as we get it :)
nl_email_exists = This email is already subscribed. You can unsubscribe by clicking on the button above.
nl_subscribe = Subscribe
nl_subscribed = Thanks! You'll receive a confirmation email shortly
nl_unsubscribe = Unsubscribe
nl_unsubscribed = Done. No more junk mail from us
nl_unknown_email = Unknown email address
email_unsubscribe = PS: Changed your mind?
email_unsub_btn = Unsubscribe
email_conf_subject = Successful Registration
conf_preheader = Thanks for keeping in touch!
conf_thanks_sub = You're all set!
conf_body_para_1 = Thank you for checking in on my wanderings :). I'll make sure to keep you posted on my progress along the trail.
conf_body_para_2 = I usually check-in once a day, plus sometimes on special events, like successful peak ascents. I am using a GPS-based device (PLB) which does not require phone reception to work. Thus the messages should be pretty frequent, but, being awestruck by the beauty of nature, I could also just forget to send a signal once in a while. So do not worry if you don't receive anything for a couple of days.
conf_body_para_3 = If I've posted some pictures recently, you should also get them in the same email.
conf_body_conclusion= See you down the road!
conf_signature = --François
email_update_subject= Spotted!
update_preheader = New position received
update_title = Message
update_latest_news = Latest news:
distance = Distance
elevation = Elevation
segment_length = Segment length
type = Track Type
legend = Legend
credits_project = Spotty Project
credits_git = Git Repository
credits_license = under GPLv3 license
weather_type_1 = Blowing Or Drifting Snow
weather_type_2 = Drizzle
weather_type_3 = Heavy Drizzle
weather_type_4 = Light Drizzle
weather_type_5 = Heavy Drizzle/Rain
weather_type_6 = Light Drizzle/Rain
weather_type_7 = Duststorm
weather_type_8 = Fog
weather_type_9 = Freezing Drizzle/Freezing Rain
weather_type_10 = Heavy Freezing Drizzle/Freezing Rain
weather_type_11 = Light Freezing Drizzle/Freezing Rain
weather_type_12 = Freezing Fog
weather_type_13 = Heavy Freezing Rain
weather_type_14 = Light Freezing Rain
weather_type_15 = Funnel Cloud/Tornado
weather_type_16 = Hail Showers
weather_type_17 = Ice
weather_type_18 = Lightning Without Thunder
weather_type_19 = Mist
weather_type_20 = Precipitation In Vicinity
weather_type_21 = Rain
weather_type_22 = Heavy Rain And Snow
weather_type_23 = Light Rain And Snow
weather_type_24 = Rain Showers
weather_type_25 = Heavy Rain
weather_type_26 = Light Rain
weather_type_27 = Sky Coverage Decreasing
weather_type_28 = Sky Coverage Increasing
weather_type_29 = Sky Unchanged
weather_type_30 = Smoke Or Haze
weather_type_31 = Snow
weather_type_32 = Snow And Rain Showers
weather_type_33 = Snow Showers
weather_type_34 = Heavy Snow
weather_type_35 = Light Snow
weather_type_36 = Squalls
weather_type_37 = Thunderstorm
weather_type_38 = Thunderstorm Without Precipitation
weather_type_39 = Diamond Dust
weather_type_40 = Hail
weather_type_41 = Overcast
weather_type_42 = Partially cloudy
weather_type_43 = Clear

177
src/languages/es.lang Normal file
View File

@@ -0,0 +1,177 @@
locale = es_ES
page_og_desc = Mantente en contacto con François durante sus aventuras a la montaña
error_commit_db = Error SQL
unknown_field = Campo "$0" desconocido
nav_back = Atrás
admin = Administración
admin_config = Configuración
admin_upload = Cargar
save = Guardar
admin_save_success = Guardado
track_main = Camino principal
track_off-track = Variante
track_hitchhiking = Autostop
track_download = Descarga la ruta GPX
upload_title = Cargar fotos y videos
upload_mode_archived= El proyecto "$0" esta archivado. No se puede cargar
upload_success = $0 ha sido subido
upload_media_exist = La imagen $0 ya existe
post_message = Mensaje
post_name = Nombre
post_new_message = Mensaje nuevo
and = y
counter = No. $0
send = Enviar
maps = Mapas de base
map_satellite = Satélite
map_otm = Open Topo Map
map_ign_france = IGN (Francia)
map_ign_spain = IGN (España)
map_linz = LINZ
map_usgs = USGS
map_natgeo = National Geographic
map_outdoors = Mapbox Topo
image = Foto
images = Fotos
image_taken = Foto tomada el $0
video = Video
video_taken = Video filmado el $0
add_on = Agregado el $0
click_watch = Haz clic para ver el video
click_zoom = Haz clic para ampliar
media_count = Media $0 de $1
media_no_id = Falta el ID del sujeto
media_comment_update= Comentario "$0" actualizado
see_on_google = Ver la posición en Google Maps
copy_to_clipboard = Copiar el enlace
link_copied = ¡Enlace copiado!
city_time = Hora de $0
local_time = $0 hora local
your_time = $0 en tu zona horaria
date_time = $0 a la $1
time_zone = Huso horario
id_project = Proyecto ID
project = Proyecto
projects = Proyectos
new_project = Nuevo proyecto
update_project = Actualizar el proyecto
hikes = Senderos
mode = Modo
mode_previz = Proyecto en preparación
mode_blog = Proyecto activo
mode_histo = Proyecto archivado
code_name = Nombre clave
start = Inicio
end = Fin
feeds = Feeds
id_feed = ID Feed
ref_feed_id = ID Feed ref.
id_spot = ID Spot
name = Descripción
status = Estado
last_update = Última actualización de Spot
ref_spot_id = ID Spot ref.
model = Modelo
delete = Borrar
id_user = ID del usuario
user_name = Nombre
active_users = Usuarios activos
language = Idioma
clearance = Nivel de autorización
toolbox = Herramientas
unit_day = Día
unit_days = Días
unit_hour = h
newsletter = Mantenerse en contacto
nl_email_placeholder= nombre@email.com
nl_invalid_email = Esto no parece una dirección de correo electrónico
nl_subscribed_desc = Todo esta listo. Te enviaremos noticias frescas en cuanto las recibamos. Prometido...
nl_unsubscribed_desc= Anade tu dirección de correo electrónico y te enviaremos la posicion actualizada de François tan pronto como la recibamos :)
nl_email_exists = Esta dirección de correo electrónico ya está registrada. Puedes darte de baja haciendo clic en el botón de arriba.
nl_subscribe = Suscribir
nl_subscribed = ¡Gracias! Recibirás un correo electrónico de confirmación
nl_unsubscribe = Desinscribirse
nl_unsubscribed = Está hecho. ¡No más spam!
nl_unknown_email = Dirección de email desconocida
email_unsubscribe = PD: ¿Demasiados correos electrónicos?
email_unsub_btn = Desinscribirse
email_conf_subject = Confirmación
conf_preheader = ¡Gracias por mantenerte en contacto!
conf_thanks_sub = ¡Hecho!
conf_body_para_1 = Os agradezco mucho que sigais mi proyecto, y os intereseis de la evolucion. Os prometo que os mantendré informados sobre mi progreso.
conf_body_para_2 = Normalmente envío un mensaje una vez al día. Cuando voy a lugares guays, envío uno extra (cimas, ese tipo de cosas). Estoy usando una dispositivo GPS para enviar la señal, por lo que no necesito una red telefónica para que funcione. Sin embargo, puede haber ocasiones en las que presione el botón. Por lo tanto, no se preocupe si no recibe mensajes durante uno o dos días.
conf_body_para_3 = Cuando añada fotos en la página, también deberás encontrarlas en este correo electrónico.
conf_body_conclusion= ¡Nos vemos en el camino!
conf_signature = --François
email_update_subject= Nueva posición recibida
update_preheader = ¡Nueva posición!
update_title = Mensaje
update_latest_news = Últimas noticias:
distance = Distancia
elevation = Elevación
segment_length = Tamaño del segmento
type = Tipo de sendero
legend = Leyenda
credits_project = Proyecto Spotty
credits_git = Repositorio de Git
credits_license = bajo licencia GPLv3
weather_type_1 Nieve que sopla o a la deriva
weather_type_2 Llovizna
weather_type_3 Llovizna fuerte
weather_type_4 Llovizna ligera
weather_type_5 Fuerte llovizna / lluvia
weather_type_6 Llovizna ligera / Lluvia
weather_type_7 Tormenta de arena
weather_type_8 Niebla
weather_type_9 Llovizna helada / Lluvia helada
weather_type_10 Fuerte llovizna helada / lluvia helada
weather_type_11 Llovizna helada ligera / lluvia helada
weather_type_12 Niebla helada
weather_type_13 Lluvia helada intensa
weather_type_14 Lluvia helada ligera
weather_type_15 Nube de embudo / Tornado
weather_type_16 Lluvias de granizo
weather_type_17 Hielo
weather_type_18 Rayo sin trueno
weather_type_19 Niebla
weather_type_20 Precipitación en las proximidades
weather_type_21 Lluvia
weather_type_22 Fuertes lluvias y nieve
weather_type_23 Lluvia ligera y nieve
weather_type_24 Lluvias
weather_type_25 Lluvia Pesada
weather_type_26 Lluvia ligera
weather_type_27 Disminución de la cobertura del cielo
weather_type_28 Aumento de la cobertura del cielo
weather_type_29 Cielo sin cambios
weather_type_30 Humo o neblina
weather_type_31 Nieve
weather_type_32 Lluvias y nieve
weather_type_33 Duchas de nieve
weather_type_34 Fuertes nevadas
weather_type_35 Nieve ligera
weather_type_36 Chubascos
weather_type_37 Tormenta
weather_type_38 Tormenta sin precipitaciones
weather_type_39 Polvo de diamante
weather_type_40 Granizo
weather_type_41 Nublado
weather_type_42 Parcialmente nublado
weather_type_43 Claro

177
src/languages/fr.lang Normal file
View File

@@ -0,0 +1,177 @@
locale = fr_CH
page_og_desc = Gardez le contact avec François lorsqu'il part sur les chemins
error_commit_db = Error lors de la requête SQL
unknown_field = Champ "$0" inconnu
nav_back = Retour
admin = Administration
admin_config = Paramètres
admin_upload = Uploader
save = Sauvegarder
admin_save_success = Sauvegardé
track_main = Trajet principal
track_off-track = Variante
track_hitchhiking = Hors rando
track_download = Télécharger la trace GPX
upload_title = Uploader photos & vidéos
upload_mode_archived= Le projet "$0" a été archivé. Aucun upload possible
upload_success = $0 a été uploadé
upload_media_exist = l'image $0 existe déjà
post_message = Message
post_name = Nom
post_new_message = Nouveau message
and = et
counter = N°$0
send = Envoyer
maps = Fonds de carte
map_satellite = Satellite
map_otm = Open Topo Map
map_ign_france = IGN (France)
map_ign_spain = IGN (Espagne)
map_linz = LINZ
map_usgs = USGS
map_natgeo = National Geographic
map_outdoors = Mapbox Topo
image = Photo
images = Photos
image_taken = prise le $0
video = Vidéo
video_taken = filmée le $0
add_on = ajoutée le $0
click_watch = Click pour voir la vidéo
click_zoom = Click pour zoomer
media_count = Média $0 sur $1
media_no_id = ID du média manquant
media_comment_update= Commentaire du media "$0" mis-à-jour
see_on_google = Voir la position sur Google Maps
copy_to_clipboard = Copie le lien dans le presse-papier
link_copied = Lien copié !
city_time = heure de $0
local_time = $0 heure locale
your_time = $0 dans votre fuseau horaire
date_time = $0 à $1
time_zone = Fuseau horaire
id_project = ID projet
project = Projet
projects = Projets
new_project = Nouveau projet
update_project = Mettre à jour le projet
hikes = Randonnées
mode = Mode
mode_previz = Projet en cours de préparation
mode_blog = Projet actif
mode_histo = Projet archivé
code_name = Nom de code
start = Départ
end = Arrivée
feeds = Feeds
id_feed = ID Feed
ref_feed_id = ID Feed ref.
id_spot = ID Spot
name = Description
status = Statut
last_update = Dernière vérification Spot
ref_spot_id = ID Spot ref.
model = Modèle
delete = Supprimer
id_user = ID Utilisateur
user_name = Nom
active_users = Utilisateurs actifs
language = Langue
clearance = Niveau d'autorisation
toolbox = Boite à outils
unit_day = jour
unit_days = jours
unit_hour = h
newsletter = Rester en contact
nl_email_placeholder= mon@email.com
nl_invalid_email = Ceci ne ressemble pas à une adresse email
nl_subscribed_desc = C'est tout bon. On t'envoie des nouvelles fraiches dès qu'on les reçoit. Parole de scout.
nl_unsubscribed_desc= Ajoute ton adresse email et on t'enverra la nouvelle position de François dès qu'on la reçoit :)
nl_email_exists = Cette adresse email est déjà enregistrée. Vous pouvez vous désinscrire en cliquant sur le bouton ci-dessus.
nl_subscribe = S'abonner
nl_subscribed = Merci ! Tu vas recevoir un email de confirmation très bientôt
nl_unsubscribe = Se désinscrire
nl_unsubscribed = C'est fait. Fini le spam!
nl_unknown_email = Adresse email inconnue
email_unsubscribe = PS: Trop d'emails ?
email_unsub_btn = Se désinscrire
email_conf_subject = Confirmation
conf_preheader = Merci de rester en contact !
conf_thanks_sub = C'est tout bon !
conf_body_para_1 = C'est gentil de venir voir où j'en suis. Promis, je vous tiendrais au courant de mon avancée.
conf_body_para_2 = En général, j'envoie un message une fois par jour. Lorsque je passe à des endroits sympas, j'en envoie un supplémentaire (ascension de sommets, ce genre de choses). J'utilise une balise GPS pour envoyer le signal, je n'ai donc pas besoin de réseau téléphonique pour que cela fonctionne. Cependant, il peut m'arriver d'appuyer sur le bouton. Donc pas de raison de s'inquiéter si vous ne recevez pas de messages pendant une journée ou deux.
conf_body_para_3 = Si j'ai ajouté des photos sur le site récemment, vous devriez aussi les retrouver dans cet email.
conf_body_conclusion= A bientôt sur les chemins !
conf_signature = --François
email_update_subject= Nouvelle position reçue
update_preheader = Nouvelle position !
update_title = Message
update_latest_news = Dernières nouvelles :
distance = Distance
elevation = Dénivelé
segment_length = Taille du segment
type = Type de rando
legend = Légende
credits_project = Projet Spotty
credits_git = Dépôt Git
credits_license = sous licence GPLv3
weather_type_1 = Poudrerie ou neige à la dérive
weather_type_2 = Bruine
weather_type_3 = Bruine lourde
weather_type_4 = Bruine légère
weather_type_5 = Forte bruine / pluie
weather_type_6 = Légère bruine / pluie
weather_type_7 = Tempête de poussière
weather_type_8 = Brouillard
weather_type_9 = Bruine verglaçante / Pluie verglaçante
weather_type_10 = Forte bruine verglaçante / pluie verglaçante
weather_type_11 = Légère bruine verglaçante / pluie verglaçante
weather_type_12 = Brouillard verglaçant
weather_type_13 = Forte pluie verglaçante
weather_type_14 = Légère pluie verglaçante
weather_type_15 = Nuage d'entonnoir / Tornade
weather_type_16 = Douches de grêle
weather_type_17 = La glace
weather_type_18 = Foudre sans tonnerre
weather_type_19 = Brouillard
weather_type_20 = Précipitations à proximité
weather_type_21 = Pluie
weather_type_22 = Forte pluie et neige
weather_type_23 = Légère pluie et neige
weather_type_24 = Averses de pluie
weather_type_25 = Forte pluie
weather_type_26 = Pluie légère
weather_type_27 = Couverture du ciel en baisse
weather_type_28 = Augmentation de la couverture du ciel
weather_type_29 = Ciel inchangé
weather_type_30 = Fumée ou brume
weather_type_31 = Neige
weather_type_32 = Averses de neige et de pluie
weather_type_33 = Douches de neige
weather_type_34 = Beaucoup de neige
weather_type_35 = Neige légère
weather_type_36 = Grains
weather_type_37 = Orage
weather_type_38 = Orage sans précipitations
weather_type_39 = La poussière de diamant
weather_type_40 = Saluer
weather_type_41 = Couvert
weather_type_42 = Partiellement nuageux
weather_type_43 = Clair

2
src/scripts/d3.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
/* Autosize - Jun 30, 2021 - https://github.com/jackmoore/autosize/blob/master/dist/autosize.min.js - MIT license */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e||self).autosize=t()}(this,function(){var e,t,n="function"==typeof Map?new Map:(e=[],t=[],{has:function(t){return e.indexOf(t)>-1},get:function(n){return t[e.indexOf(n)]},set:function(n,o){-1===e.indexOf(n)&&(e.push(n),t.push(o))},delete:function(n){var o=e.indexOf(n);o>-1&&(e.splice(o,1),t.splice(o,1))}}),o=function(e){return new Event(e,{bubbles:!0})};try{new Event("test")}catch(e){o=function(e){var t=document.createEvent("Event");return t.initEvent(e,!0,!1),t}}function r(e){var t=n.get(e);t&&t.destroy()}function i(e){var t=n.get(e);t&&t.update()}var l=null;return"undefined"==typeof window||"function"!=typeof window.getComputedStyle?((l=function(e){return e}).destroy=function(e){return e},l.update=function(e){return e}):((l=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],function(e){return function(e){if(e&&e.nodeName&&"TEXTAREA"===e.nodeName&&!n.has(e)){var t,r=null,i=null,l=null,d=function(){e.clientWidth!==i&&c()},u=function(t){window.removeEventListener("resize",d,!1),e.removeEventListener("input",c,!1),e.removeEventListener("keyup",c,!1),e.removeEventListener("autosize:destroy",u,!1),e.removeEventListener("autosize:update",c,!1),Object.keys(t).forEach(function(n){e.style[n]=t[n]}),n.delete(e)}.bind(e,{height:e.style.height,resize:e.style.resize,overflowY:e.style.overflowY,overflowX:e.style.overflowX,wordWrap:e.style.wordWrap});e.addEventListener("autosize:destroy",u,!1),"onpropertychange"in e&&"oninput"in e&&e.addEventListener("keyup",c,!1),window.addEventListener("resize",d,!1),e.addEventListener("input",c,!1),e.addEventListener("autosize:update",c,!1),e.style.overflowX="hidden",e.style.wordWrap="break-word",n.set(e,{destroy:u,update:c}),"vertical"===(t=window.getComputedStyle(e,null)).resize?e.style.resize="none":"both"===t.resize&&(e.style.resize="horizontal"),r="content-box"===t.boxSizing?-(parseFloat(t.paddingTop)+parseFloat(t.paddingBottom)):parseFloat(t.borderTopWidth)+parseFloat(t.borderBottomWidth),isNaN(r)&&(r=0),c()}function a(t){var n=e.style.width;e.style.width="0px",e.style.width=n,e.style.overflowY=t}function s(){if(0!==e.scrollHeight){var t=function(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push({node:e.parentNode,scrollTop:e.parentNode.scrollTop}),e=e.parentNode;return t}(e),n=document.documentElement&&document.documentElement.scrollTop;e.style.height="",e.style.height=e.scrollHeight+r+"px",i=e.clientWidth,t.forEach(function(e){e.node.scrollTop=e.scrollTop}),n&&(document.documentElement.scrollTop=n)}}function c(){s();var t=Math.round(parseFloat(e.style.height)),n=window.getComputedStyle(e,null),r="content-box"===n.boxSizing?Math.round(parseFloat(n.height)):e.offsetHeight;if(r<t?"hidden"===n.overflowY&&(a("scroll"),s(),r="content-box"===n.boxSizing?Math.round(parseFloat(window.getComputedStyle(e,null).height)):e.offsetHeight):"hidden"!==n.overflowY&&(a("hidden"),s(),r="content-box"===n.boxSizing?Math.round(parseFloat(window.getComputedStyle(e,null).height)):e.offsetHeight),l!==r){l=r;var i=o("autosize:resized");try{e.dispatchEvent(i)}catch(e){}}}}(e)}),e}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],r),e},l.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],i),e}),l});

View File

@@ -0,0 +1,2 @@
/* jQuery Iframe Transport Plugin - https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js */
!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?e(require("jquery")):e(window.jQuery)}(function(e){"use strict";var t=0,r=e,n="parseJSON";"JSON"in window&&"parse"in JSON&&(r=JSON,n="parse"),e.ajaxTransport("iframe",function(r){if(r.async){var n,a,o,i=r.initialIframeSrc||"javascript:false;";return{send:function(p,f){(n=e('<form style="display:none;"></form>')).attr("accept-charset",r.formAcceptCharset),o=/\?/.test(r.url)?"&":"?","DELETE"===r.type?(r.url=r.url+o+"_method=DELETE",r.type="POST"):"PUT"===r.type?(r.url=r.url+o+"_method=PUT",r.type="POST"):"PATCH"===r.type&&(r.url=r.url+o+"_method=PATCH",r.type="POST"),a=e('<iframe src="'+i+'" name="iframe-transport-'+(t+=1)+'"></iframe>').on("load",function(){var t,o=e.isArray(r.paramName)?r.paramName:[r.paramName];a.off("load").on("load",function(){var t;try{if(!(t=a.contents()).length||!t[0].firstChild)throw new Error}catch(e){t=void 0}f(200,"success",{iframe:t}),e('<iframe src="'+i+'"></iframe>').appendTo(n),window.setTimeout(function(){n.remove()},0)}),n.prop("target",a.prop("name")).prop("action",r.url).prop("method",r.type),r.formData&&e.each(r.formData,function(t,r){e('<input type="hidden"/>').prop("name",r.name).val(r.value).appendTo(n)}),r.fileInput&&r.fileInput.length&&"POST"===r.type&&(t=r.fileInput.clone(),r.fileInput.after(function(e){return t[e]}),r.paramName&&r.fileInput.each(function(t){e(this).prop("name",o[t]||r.paramName)}),n.append(r.fileInput).prop("enctype","multipart/form-data").prop("encoding","multipart/form-data"),r.fileInput.removeAttr("form")),window.setTimeout(function(){n.submit(),t&&t.length&&r.fileInput.each(function(r,n){var a=e(t[r]);e(n).prop("name",a.prop("name")).attr("form",a.attr("form")),a.replaceWith(n)})},0)}),n.append(a).appendTo(document.body)},abort:function(){a&&a.off("load").prop("src",i),n&&n.remove()}}}}),e.ajaxSetup({converters:{"iframe text":function(t){return t&&e(t[0].body).text()},"iframe json":function(t){return t&&r[n](e(t[0].body).text())},"iframe html":function(t){return t&&e(t[0].body).html()},"iframe xml":function(t){var r=t&&t[0];return r&&e.isXMLDoc(r)?r:e.parseXML(r.XMLDocument&&r.XMLDocument.xml||e(r.body).html())},"iframe script":function(t){return t&&e.globalEval(e(t[0].body).text())}}})});

2
src/scripts/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
/* Mousewheel - v3.1.13 - https://github.com/jquery/jquery-mousewheel/blob/master/jquery.mousewheel.min.js - Copyright OpenJS Foundation and other contributors */
!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?module.exports=e:e(jQuery)}(function(u){var f,d,e=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],t="onwheel"in window.document||9<=window.document.documentMode?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],w=Array.prototype.slice;if(u.event.fixHooks)for(var i=e.length;i;)u.event.fixHooks[e[--i]]=u.event.mouseHooks;var c=u.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var e=t.length;e;)this.addEventListener(t[--e],n,!1);else this.onmousewheel=n;u.data(this,"mousewheel-line-height",c.getLineHeight(this)),u.data(this,"mousewheel-page-height",c.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var e=t.length;e;)this.removeEventListener(t[--e],n,!1);else this.onmousewheel=null;u.removeData(this,"mousewheel-line-height"),u.removeData(this,"mousewheel-page-height")},getLineHeight:function(e){var t=u(e),i=t["offsetParent"in u.fn?"offsetParent":"parent"]();return i.length||(i=u("body")),parseInt(i.css("fontSize"),10)||parseInt(t.css("fontSize"),10)||16},getPageHeight:function(e){return u(e).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};function n(e){var t,i=e||window.event,n=w.call(arguments,1),o=0,l=0,s=0;if((e=u.event.fix(i)).type="mousewheel","detail"in i&&(s=-1*i.detail),"wheelDelta"in i&&(s=i.wheelDelta),"wheelDeltaY"in i&&(s=i.wheelDeltaY),"wheelDeltaX"in i&&(l=-1*i.wheelDeltaX),"axis"in i&&i.axis===i.HORIZONTAL_AXIS&&(l=-1*s,s=0),o=0===s?l:s,"deltaY"in i&&(o=s=-1*i.deltaY),"deltaX"in i&&(l=i.deltaX,0===s&&(o=-1*l)),0!==s||0!==l){if(1===i.deltaMode){var a=u.data(this,"mousewheel-line-height");o*=a,s*=a,l*=a}else if(2===i.deltaMode){var h=u.data(this,"mousewheel-page-height");o*=h,s*=h,l*=h}if(t=Math.max(Math.abs(s),Math.abs(l)),(!d||t<d)&&g(i,d=t)&&(d/=40),g(i,t)&&(o/=40,l/=40,s/=40),o=Math[1<=o?"floor":"ceil"](o/d),l=Math[1<=l?"floor":"ceil"](l/d),s=Math[1<=s?"floor":"ceil"](s/d),c.settings.normalizeOffset&&this.getBoundingClientRect){var r=this.getBoundingClientRect();e.offsetX=e.clientX-r.left,e.offsetY=e.clientY-r.top}return e.deltaX=l,e.deltaY=s,e.deltaFactor=d,e.deltaMode=0,n.unshift(e,o,l,s),f&&window.clearTimeout(f),f=window.setTimeout(m,200),(u.event.dispatch||u.event.handle).apply(this,n)}}function m(){d=null}function g(e,t){return c.settings.adjustOldDeltas&&"mousewheel"===e.type&&t%120==0}u.fn.extend({mousewheel:function(e){return e?this.on("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.off("mousewheel",e)}})});

File diff suppressed because one or more lines are too long

2
src/scripts/jquery.ui.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
/* waitForImages - v2.4.0 - https://github.com/alexanderdickson/waitForImages/blob/master/dist/jquery.waitforimages.min.js - MIT license */
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){var b="waitForImages",c=function(a){return a.srcset&&a.sizes}(new Image);a.waitForImages={hasImageProperties:["backgroundImage","listStyleImage","borderImage","borderCornerImage","cursor"],hasImageAttributes:["srcset"]},a.expr.pseudos["has-src"]=function(b){return a(b).is('img[src][src!=""]')},a.expr.pseudos.uncached=function(b){return!!a(b).is(":has-src")&&!b.complete},a.fn.waitForImages=function(){var d,e,f,g=0,h=0,i=a.Deferred(),j=this,k=[],l=a.waitForImages.hasImageProperties||[],m=a.waitForImages.hasImageAttributes||[],n=/url\(\s*(['"]?)(.*?)\1\s*\)/g;if(a.isPlainObject(arguments[0])?(f=arguments[0].waitForAll,e=arguments[0].each,d=arguments[0].finished):1===arguments.length&&"boolean"===a.type(arguments[0])?f=arguments[0]:(d=arguments[0],e=arguments[1],f=arguments[2]),d=d||a.noop,e=e||a.noop,f=!!f,!a.isFunction(d)||!a.isFunction(e))throw new TypeError("An invalid callback was supplied.");return this.each(function(){var b=a(this);f?b.find("*").addBack().each(function(){var b=a(this);b.is("img:has-src")&&!b.is("[srcset]")&&k.push({src:b.attr("src"),element:b[0]}),a.each(l,function(a,c){var d,e=b.css(c);if(!e)return!0;for(;d=n.exec(e);)k.push({src:d[2],element:b[0]})}),a.each(m,function(a,c){var d=b.attr(c);return!d||void k.push({src:b.attr("src"),srcset:b.attr("srcset"),element:b[0]})})}):b.find("img:has-src").each(function(){k.push({src:this.src,element:this})})}),g=k.length,h=0,0===g&&(d.call(j),i.resolveWith(j)),a.each(k,function(f,k){var l=new Image,m="load."+b+" error."+b;a(l).one(m,function b(c){var f=[h,g,"load"==c.type];if(h++,e.apply(k.element,f),i.notifyWith(k.element,f),a(this).off(m,b),h==g)return d.call(j[0]),i.resolveWith(j[0]),!1}),c&&k.srcset&&(l.srcset=k.srcset,l.sizes=k.sizes),l.src=k.src}),i.promise()}});

23
src/scripts/leaflet.min.js vendored Normal file

File diff suppressed because one or more lines are too long

738
src/scripts/lightbox.js Normal file
View File

@@ -0,0 +1,738 @@
/*!
* Lightbox v2.11.4
* by Lokesh Dhakar
*
* More info:
* http://lokeshdhakar.com/projects/lightbox2/
*
* Copyright Lokesh Dhakar
* Released under the MIT license
* https://github.com/lokesh/lightbox2/blob/master/LICENSE
*
* @preserve
*/
// Uses Node, AMD or browser globals to create a module.
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require('jquery'));
} else {
// Browser globals (root is window)
root.lightbox = factory(root.jQuery);
}
}(this, function ($) {
function Lightbox(options) {
this.album = [];
this.currentImageIndex = void 0;
this.init();
// options
this.options = $.extend({}, this.constructor.defaults);
this.option(options);
}
// Descriptions of all options available on the demo site:
// http://lokeshdhakar.com/projects/lightbox2/index.html#options
Lightbox.defaults = {
albumLabel: 'Image %1 of %2',
alwaysShowNavOnTouchDevices: false,
fadeDuration: 600,
fitImagesInViewport: true,
imageFadeDuration: 600,
positionFromTop: 50,
resizeDuration: 700,
showImageNumberLabel: true,
wrapAround: false,
disableScrolling: false,
/*
Sanitize Title
If the caption data is trusted, for example you are hardcoding it in, then leave this to false.
This will free you to add html tags, such as links, in the caption.
If the caption data is user submitted or from some other untrusted source, then set this to true
to prevent xss and other injection attacks.
*/
sanitizeTitle: false
, hasVideo: true
, onMediaChange: (oMedia) => {}
};
Lightbox.prototype.option = function(options) {
$.extend(this.options, options);
};
Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) {
return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages);
};
Lightbox.prototype.init = function() {
var self = this;
// Both enable and build methods require the body tag to be in the DOM.
$(document).ready(function() {
self.enable();
self.build();
});
};
// Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes
// that contain 'lightbox'. When these are clicked, start lightbox.
Lightbox.prototype.enable = function() {
var self = this;
$('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) {
self.start($(event.currentTarget));
return false;
});
};
// Build html for the lightbox and the overlay.
// Attach event handlers to the new DOM elements. click click click
Lightbox.prototype.build = function() {
if ($('#lightbox').length > 0) {
return;
}
var self = this;
// The two root notes generated, #lightboxOverlay and #lightbox are given
// tabindex attrs so they are focusable. We attach our keyboard event
// listeners to these two elements, and not the document. Clicking anywhere
// while Lightbox is opened will keep the focus on or inside one of these
// two elements.
//
// We do this so we can prevent propogation of the Esc keypress when
// Lightbox is open. This prevents it from intefering with other components
// on the page below.
//
// Github issue: https://github.com/lokesh/lightbox2/issues/663
$('\
<div id="lightboxOverlay" tabindex="-1" class="lightboxOverlay"></div>\
<div id="lightbox" tabindex="-1" class="lightbox">\
<div class="lb-outerContainer">\
<div class="lb-container">\
<img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt="" />\
<div class="lb-nav">\
<div class="lb-prev-area">\
<a class="lb-prev" aria-label="Previous image" href="" role="button"></a>\
</div>\
<div class="lb-next-area">\
<a class="lb-next" aria-label="Next image" href="" role="button"></a>\
</div>\
</div>\
<div class="lb-loader">\
<a class="lb-cancel" href="#"></a>\
</div>\
</div>\
</div>\
<div class="lb-dataContainer desktop">\
<div class="lb-data">\
<div class="lb-details">\
<span class="lb-caption"></span>\
<span class="lb-number"></span>\
</div>\
<div class="lb-closeContainer">\
<a class="lb-close" role="button"></a>\
</div>\
</div>\
</div>\
').appendTo($('body'));
// Cache jQuery objects
this.$lightbox = $('#lightbox');
this.$overlay = $('#lightboxOverlay');
this.$outerContainer = this.$lightbox.find('.lb-outerContainer');
this.$container = this.$lightbox.find('.lb-container');
this.$image = this.$lightbox.find('.lb-image');
this.$nav = this.$lightbox.find('.lb-nav');
if(self.options.hasVideo) {
this.$video = $('<video class="lb-video" controls autoplay></video>');
this.$image.after(this.$video);
this.videoBorderWidth = {
top: parseInt(this.$video.css('border-top-width'), 10),
right: parseInt(this.$video.css('border-right-width'), 10),
bottom: parseInt(this.$video.css('border-bottom-width'), 10),
left: parseInt(this.$video.css('border-left-width'), 10)
};
}
// Store css values for future lookup
this.containerPadding = {
top: parseInt(this.$container.css('padding-top'), 10),
right: parseInt(this.$container.css('padding-right'), 10),
bottom: parseInt(this.$container.css('padding-bottom'), 10),
left: parseInt(this.$container.css('padding-left'), 10)
};
this.imageBorderWidth = {
top: parseInt(this.$image.css('border-top-width'), 10),
right: parseInt(this.$image.css('border-right-width'), 10),
bottom: parseInt(this.$image.css('border-bottom-width'), 10),
left: parseInt(this.$image.css('border-left-width'), 10)
};
// Attach event handlers to the newly minted DOM elements
this.$overlay.hide().add(this.$lightbox.find('.lb-dataContainer')).on('click', function() {
self.end();
return false;
});
this.$lightbox.hide().on('click', function(event) {
if ($(event.target).attr('id') === 'lightbox') {
self.end();
}
});
this.$outerContainer.on('click', function(event) {
if ($(event.target).attr('id') === 'lightbox') {
self.end();
}
return false;
});
this.$lightbox.find('.lb-prev').on('click', function() {
if (self.currentImageIndex === 0) {
self.changeImage(self.album.length - 1);
} else {
self.changeImage(self.currentImageIndex - 1);
}
return false;
});
this.$lightbox.find('.lb-next').on('click', function() {
if (self.currentImageIndex === self.album.length - 1) {
self.changeImage(0);
} else {
self.changeImage(self.currentImageIndex + 1);
}
return false;
});
/*
Show context menu for image on right-click
There is a div containing the navigation that spans the entire image and lives above of it. If
you right-click, you are right clicking this div and not the image. This prevents users from
saving the image or using other context menu actions with the image.
To fix this, when we detect the right mouse button is pressed down, but not yet clicked, we
set pointer-events to none on the nav div. This is so that the upcoming right-click event on
the next mouseup will bubble down to the image. Once the right-click/contextmenu event occurs
we set the pointer events back to auto for the nav div so it can capture hover and left-click
events as usual.
*/
this.$nav.on('mousedown', function(event) {
if (event.which === 3) {
self.$nav.css('pointer-events', 'none');
self.$lightbox.one('contextmenu', function() {
setTimeout(function() {
this.$nav.css('pointer-events', 'auto');
}.bind(self), 0);
});
}
});
this.$lightbox.find('.lb-loader, .lb-close').on('click keyup', function(e) {
// If mouse click OR 'enter' or 'space' keypress, close LB
if (
e.type === 'click' || (e.type === 'keyup' && (e.which === 13 || e.which === 32))) {
self.end();
return false;
}
});
};
// Show overlay and lightbox. If the image is part of a set, add siblings to album array.
Lightbox.prototype.start = function($link) {
var self = this;
var $window = $(window);
$window.on('resize', $.proxy(this.sizeOverlay, this));
this.sizeOverlay();
//Manage Zoom Event
this.$nav.mousewheel((e) => {
var asImg = self.album[this.currentImageIndex];
if(!asImg.type != 'video') {
asTransform = this.$image.css('transform').replace(/[^0-9\-.,]/g, '').split(',');
var fOldZoom = parseFloat(asTransform[0] || 1);
var fOldTranslateX = parseFloat(asTransform[4] || 0);
var fOldTranslateY = parseFloat(asTransform[5] || 0);
var fOldZoom = parseFloat(asTransform[0] || 1);
var fNewZoom = Math.min(Math.max(fOldZoom + e.deltaY / 10, 1), Math.max(asImg.width/this.$image.width(), asImg.height/this.$image.height()));
var fTransX = fOldTranslateX + (fNewZoom - fOldZoom) * (this.$image.width()/2 - e.offsetX);
var fTransY = fOldTranslateY + (fNewZoom - fOldZoom) * (this.$image.height()/2 - e.offsetY);
var fTransMaxX = (fNewZoom - 1) * this.$image.width() / 2;
var fTransMaxY = (fNewZoom - 1) * this.$image.height() / 2;
fTransX = Math.max(Math.min(fTransX, fTransMaxX), fTransMaxX * -1);
fTransY = Math.max(Math.min(fTransY, fTransMaxY), fTransMaxY * -1);
this.$image.css('--scale', fNewZoom);
this.$container.toggleClass('moveable', (fNewZoom > 1));
this.$image.css('--translate-x', fTransX+'px');
this.$image.css('--translate-y', fTransY+'px');
}
});
//Manage Repositioning Event
this.$nav.on('mousedown', (e) => {
if(this.$image.css('--scale') > 1) {
//The following block gets the X/Y offset (the difference between where it starts and where it was clicked)
this.gMouseDownOffsetX = e.clientX - parseFloat(this.$image.css('--translate-x') || 0);
this.gMouseDownOffsetY = e.clientY - parseFloat(this.$image.css('--translate-y') || 0);
//Change cursor
this.$container.addClass('moving');
$window.on('mousemove', divMove);
}
});
$window.on('mouseup', () => {
$window.off('mousemove', divMove);
this.$container.removeClass('moving');
});
function divMove(e){
let iZoom = self.$image.css('--scale');
let fTransX = e.clientX - self.gMouseDownOffsetX;
let fTransY = e.clientY - self.gMouseDownOffsetY;
let fTransMaxX = (iZoom - 1) * self.$image.width() / 2;
let fTransMaxY = (iZoom - 1) * self.$image.height() / 2;
fTransX = Math.max(Math.min(fTransX, fTransMaxX), fTransMaxX * -1);
fTransY = Math.max(Math.min(fTransY, fTransMaxY), fTransMaxY * -1);
self.$image.css('--translate-x', fTransX + 'px');
self.$image.css('--translate-y', fTransY + 'px');
}
this.album = [];
var imageNumber = 0;
// Support both data-lightbox attribute and rel attribute implementations
var dataLightboxValue = $link.attr('data-lightbox');
var $links;
if (dataLightboxValue) {
$links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]');
for (var i = 0; i < $links.length; i = ++i) {
this.addToAlbum($($links[i]));
if ($links[i] === $link[0]) {
imageNumber = i;
}
}
} else {
if ($link.attr('rel') === 'lightbox') {
// If image is not part of a set
this.addToAlbum($link);
} else {
// If image is part of a set
$links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]');
for (var j = 0; j < $links.length; j = ++j) {
this.addToAlbum($($links[j]));
if ($links[j] === $link[0]) {
imageNumber = j;
}
}
}
}
// Position Lightbox
this.$lightbox.fadeIn(this.options.fadeDuration);
// Disable scrolling of the page while open
if (this.options.disableScrolling) {
$('body').addClass('lb-disable-scrolling');
}
this.changeImage(imageNumber);
};
Lightbox.prototype.addToAlbum = function($link) {
this.album.push({
alt: $link.attr('data-alt'),
link: $link.attr('href'),
title: $link.attr('data-title') || $link.attr('title'),
orientation: $link.attr('data-orientation'),
type: $link.attr('data-type'),
id: $link.attr('data-id'),
$Media: $link.attr('data-type')=='video'?this.$video:this.$image,
width: $link.find('img').attr('width'),
height: $link.find('img').attr('height'),
set: $link.attr('data-lightbox') || $link.attr('rel')
});
}
Lightbox.prototype.getMaxSizes = function(iMediaWidth, iMediaHeight, sMediaType) {
var iWindowWidth = $(window).width();
var iWindowHeight = $(window).height();
var oBorder = (sMediaType=='image')?this.imageBorderWidth:this.videoBorderWidth;
var iMaxMediaWidth = iWindowWidth - this.containerPadding.left - this.containerPadding.right - oBorder.left - oBorder.right;
var iMaxMediaHeight = iWindowHeight - this.containerPadding.top - this.containerPadding.bottom - oBorder.top - oBorder.bottom - this.options.positionFromTop;
var iDataMaxWidth = this.$lightbox.find('.lb-dataContainer').width(), iDataMaxHeight = this.$lightbox.find('.lb-dataContainer').height();
var iImageRatio = iMediaWidth / iMediaHeight;
//Case horizontal
var iHeightH = Math.min(iMaxMediaHeight, iMediaHeight);
var iWidthH = Math.min(iHeightH * iImageRatio, iMaxMediaWidth - iDataMaxWidth);
var iSurfaceH = Math.min(iHeightH, iWidthH / iImageRatio) * iWidthH;
//Case vertical
var iWidthV = Math.min(iMaxMediaWidth, iMediaWidth);
var iHeightV = Math.min(iWidthV / iImageRatio, iMaxMediaHeight - iDataMaxHeight);
var iSurfaceV = Math.min(iWidthV, iHeightV * iImageRatio) * iHeightV;
var sDirection = (iSurfaceV > iSurfaceH)?'vertical':'horizontal';
if(sDirection == 'vertical') iMaxMediaHeight -= iDataMaxHeight;
else iMaxMediaWidth -= iDataMaxWidth;
return {maxWidth: iMaxMediaWidth, maxHeight: iMaxMediaHeight, direction: sDirection};
};
Lightbox.prototype.updateSize = function(iMediaNumber) {
var oMedia = this.album[iMediaNumber];
var sFileType = oMedia.link.split('.').slice(-1)[0];
var oMaxSizes = this.getMaxSizes(oMedia.width, oMedia.height, oMedia.type);
var iMaxMediaWidth = oMaxSizes.maxWidth;
var iMaxMediaHeight = oMaxSizes.maxHeight;
this.$lightbox.removeClass('vertical horizontal').addClass(oMaxSizes.direction);
/*
Since many SVGs have small intrinsic dimensions, but they support scaling
up without quality loss because of their vector format, max out their
size.
*/
if(sFileType === 'svg') {
oMedia.$Media.width(iMaxMediaWidth);
oMedia.$Media.height(iMaxMediaHeight);
}
if(this.options.fitImagesInViewport) {
//Check if image size is larger than maxWidth|maxHeight in settings
if(this.options.maxWidth && this.options.maxWidth < iMaxMediaWidth) iMaxMediaWidth = this.options.maxWidth;
if(this.options.maxHeight && this.options.maxHeight < iMaxMediaHeight) iMaxMediaHeight = this.options.maxHeight;
}
else {
iMaxMediaWidth = this.options.maxWidth || oMedia.width || iMaxMediaWidth;
iMaxMediaHeight = this.options.maxHeight || oMedia.height || iMaxMediaHeight;
}
//Is the current image's width or height is greater than the maxImageWidth or maxImageHeight
//option than we need to size down while maintaining the aspect ratio.
var iMediaFinalWidth, iMediaFinalHeight;
if((oMedia.width > iMaxMediaWidth) || (oMedia.height > iMaxMediaHeight)) {
if ((oMedia.width / iMaxMediaWidth) > (oMedia.height / iMaxMediaHeight)) {
iMediaFinalWidth = iMaxMediaWidth;
iMediaFinalHeight = Math.round(oMedia.height / (oMedia.width / iMaxMediaWidth));
} else {
iMediaFinalWidth = Math.round(oMedia.width / (oMedia.height / iMaxMediaHeight));
iMediaFinalHeight = iMaxMediaHeight;
}
}
else {
iMediaFinalWidth = oMedia.width;
iMediaFinalHeight = oMedia.height;
}
oMedia.$Media.width(iMediaFinalWidth);
oMedia.$Media.height(iMediaFinalHeight);
this.sizeContainer(iMediaFinalWidth, iMediaFinalHeight, oMedia.type);
};
// Hide most UI elements in preparation for the animated resizing of the lightbox.
Lightbox.prototype.changeImage = function(imageNumber) {
var self = this;
var filename = this.album[imageNumber].link;
// Disable keyboard nav during transitions
this.disableKeyboardNav();
// Show loading state
this.$overlay.fadeIn(this.options.fadeDuration);
$('.lb-loader').fadeIn('slow');
this.$lightbox.find('.lb-image, .lb-video, .lb-nav, .lb-prev, .lb-next, .lb-number, .lb-caption, .lb-close').hide();
this.$image.css({'--scale': '1', '--translate-x': '0', '--translate-y': '0'});
self.$lightbox.find('.lb-dataContainer').css({width:'200px', height:'30px'});
this.$outerContainer.addClass('animating');
this.$container.removeClass('moveable moving');
this.options.onMediaChange(self.album[imageNumber]);
var $hasVideoNav = this.$container.hasClass('lb-video-nav');
switch(self.album[imageNumber].type) {
case 'video':
this.$video.on('loadedmetadata', function(){
self.album[imageNumber].width = this.videoWidth;
self.album[imageNumber].height = this.videoHeight;
self.updateSize(imageNumber);
$(this).off('loadedmetadata');
});
this.$video.attr('src', filename);
if(!$hasVideoNav) this.$container.addClass('lb-video-nav');
break;
case 'image':
this.$video.attr('src', '');
if($hasVideoNav) this.$container.removeClass('lb-video-nav');
// When image to show is preloaded, we send the width and height to sizeContainer()
var preloader = new Image();
preloader.onload = function(){
self.$image.attr({
'alt': self.album[imageNumber].alt,
'src': filename
});
//Orientation management
if(Math.abs(self.album[imageNumber].orientation) == 90 && preloader.width > preloader.height) {
var sWidth = preloader.width;
preloader.width = preloader.height;
preloader.height = sWidth;
}
self.album[imageNumber].width = preloader.width;
self.album[imageNumber].height = preloader.height;
self.updateSize(imageNumber);
};
// Preload image before showing
preloader.src = this.album[imageNumber].link;
break;
}
this.currentImageIndex = imageNumber;
};
// Stretch overlay to fit the viewport
Lightbox.prototype.sizeOverlay = function(e) {
/*
We use a setTimeout 0 to pause JS execution and let the rendering catch-up.
Why do this? If the `disableScrolling` option is set to true, a class is added to the body
tag that disables scrolling and hides the scrollbar. We want to make sure the scrollbar is
hidden before we measure the document width, as the presence of the scrollbar will affect the
number.
*/
if(e) {
if(typeof oResizeTimer != 'undefined') clearTimeout(oResizeTimer);
oResizeTimer = setTimeout(
() => {
switch(this.album[this.currentImageIndex].type) {
case 'image':
this.changeImage(this.currentImageIndex);
break;
case 'video':
this.updateSize(this.currentImageIndex);
break;
}
},
200
);
}
};
// Animate the size of the lightbox to fit the image we are showing
// This method also shows the the image.
//ADDED-START
//Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) {
Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight, media) {
media = media || 'image';
//ADDED-END
var self = this;
var oldWidth = this.$outerContainer.outerWidth();
var oldHeight = this.$outerContainer.outerHeight();
//ADDED-START
//var newWidth = imageWidth + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right;
//var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom;
var mediaBorderWidth = (media=='image')?this.imageBorderWidth:this.videoBorderWidth;
var newWidth = imageWidth + this.containerPadding.left + this.containerPadding.right + mediaBorderWidth.left + mediaBorderWidth.right;
var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + mediaBorderWidth.top + mediaBorderWidth.bottom;
//ADDED-END
function postResize() {
if(self.$lightbox.hasClass('vertical')) self.$lightbox.find('.lb-dataContainer').width(newWidth);
else self.$lightbox.find('.lb-dataContainer').height(newHeight);
self.$lightbox.find('.lb-prevLink').height(newHeight);
self.$lightbox.find('.lb-nextLink').height(newHeight);
// Set focus on one of the two root nodes so keyboard events are captured.
self.$overlay.trigger('focus');
self.showImage();
}
if (oldWidth !== newWidth || oldHeight !== newHeight) {
this.$outerContainer.animate({
width: newWidth,
height: newHeight
}, this.options.resizeDuration, 'swing', function() {
postResize();
});
} else {
postResize();
}
};
// Display the image and its details and begin preload neighboring images.
Lightbox.prototype.showImage = function() {
this.$lightbox.find('.lb-loader').stop(true).hide();
if(this.options.hasVideo && this.album[this.currentImageIndex].type == 'video') this.$lightbox.find('.lb-video').fadeIn(this.options.imageFadeDuration);
else this.$lightbox.find('.lb-image').fadeIn(this.options.imageFadeDuration);
this.updateNav();
this.updateDetails();
this.preloadNeighboringImages();
this.enableKeyboardNav();
};
// Display previous and next navigation if appropriate.
Lightbox.prototype.updateNav = function() {
// Check to see if the browser supports touch events. If so, we take the conservative approach
// and assume that mouse hover events are not supported and always show prev/next navigation
// arrows in image sets.
var alwaysShowNav = false;
try {
document.createEvent('TouchEvent');
alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;
} catch (e) {}
this.$lightbox.find('.lb-nav').show();
if (this.album.length > 1) {
if (this.options.wrapAround) {
if (alwaysShowNav) {
this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');
}
this.$lightbox.find('.lb-prev, .lb-next').show();
} else {
if (this.currentImageIndex > 0) {
this.$lightbox.find('.lb-prev').show();
if (alwaysShowNav) {
this.$lightbox.find('.lb-prev').css('opacity', '1');
}
}
if (this.currentImageIndex < this.album.length - 1) {
this.$lightbox.find('.lb-next').show();
if (alwaysShowNav) {
this.$lightbox.find('.lb-next').css('opacity', '1');
}
}
}
}
};
// Display caption, image number, and closing button.
Lightbox.prototype.updateDetails = function() {
var self = this;
// Enable anchor clicks in the injected caption html.
// Thanks Nate Wright for the fix. @https://github.com/NateWr
if (typeof this.album[this.currentImageIndex].title !== 'undefined' &&
this.album[this.currentImageIndex].title !== '') {
var $caption = this.$lightbox.find('.lb-caption');
if (this.options.sanitizeTitle) {
$caption.text(this.album[this.currentImageIndex].title);
} else {
$caption.html(this.album[this.currentImageIndex].title);
}
$caption.add(this.$lightbox.find('.lb-close')).fadeIn('fast');
}
this.$outerContainer.removeClass('animating');
this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {
return self.sizeOverlay();
});
};
// Preload previous and next images in set.
Lightbox.prototype.preloadNeighboringImages = function() {
if (this.album.length > this.currentImageIndex + 1 && this.album[this.currentImageIndex + 1].type == 'image') {
var preloadNext = new Image();
preloadNext.src = this.album[this.currentImageIndex + 1].link;
}
if (this.currentImageIndex > 0 && this.album[this.currentImageIndex - 1].type == 'image') {
var preloadPrev = new Image();
preloadPrev.src = this.album[this.currentImageIndex - 1].link;
}
};
Lightbox.prototype.enableKeyboardNav = function() {
this.disableKeyboardNav();
this.$lightbox.on('keyup.keyboard', $.proxy(this.keyboardAction, this));
this.$overlay.on('keyup.keyboard', $.proxy(this.keyboardAction, this));
};
Lightbox.prototype.disableKeyboardNav = function() {
this.$lightbox.off('.keyboard');
this.$overlay.off('.keyboard');
};
Lightbox.prototype.keyboardAction = function(event) {
var KEYCODE_ESC = 27;
var KEYCODE_LEFTARROW = 37;
var KEYCODE_RIGHTARROW = 39;
var keycode = event.keyCode;
if (keycode === KEYCODE_ESC) {
// Prevent bubbling so as to not affect other components on the page.
event.stopPropagation();
this.end();
} else if (keycode === KEYCODE_LEFTARROW) {
if (this.currentImageIndex !== 0) {
this.changeImage(this.currentImageIndex - 1);
} else if (this.options.wrapAround && this.album.length > 1) {
this.changeImage(this.album.length - 1);
}
} else if (keycode === KEYCODE_RIGHTARROW) {
if (this.currentImageIndex !== this.album.length - 1) {
this.changeImage(this.currentImageIndex + 1);
} else if (this.options.wrapAround && this.album.length > 1) {
this.changeImage(0);
}
}
};
// Closing time. :-(
Lightbox.prototype.end = function() {
this.disableKeyboardNav();
if(this.options.hasVideo) {
var $lbContainer = this.$lightbox.find('.lb-container');
var $hasVideoNav = $lbContainer.hasClass('lb-video-nav');
this.$video.attr('src', '');
if($hasVideoNav) $lbContainer.removeClass('lb-video-nav');
}
oSpot.flushHash();
$(window).off('resize', this.sizeOverlay);
this.$nav.off('mousewheel');
this.$lightbox.fadeOut(this.options.fadeDuration);
this.$overlay.fadeOut(this.options.fadeDuration);
if (this.options.disableScrolling) {
$('body').removeClass('lb-disable-scrolling');
}
};
return new Lightbox();
}));

468
src/scripts/spot.js Executable file
View File

@@ -0,0 +1,468 @@
function Spot(asGlobals)
{
self = this;
this.consts = asGlobals.consts;
this.consts.hash_sep = '-';
this.consts.title = 'Spotty';
this.consts.default_page = 'project';
this.consts.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone || this.consts.default_timezone;
/* Initialization */
this.init = function()
{
//Variables & constants from php
self.vars('tmp', 'object');
self.vars('page', 'string');
self.updateVars(asGlobals.vars);
//page elem
self.elem = {};
self.elem.container = $('#container');
self.elem.main = $('#main');
self.resetTmpFunctions();
//On Key down
$('html').on('keydown', function(oEvent){self.onKeydown(oEvent);});
//on window resize
$(window).on('resize', function(){self.onResize();});
//Setup menu
//self.initMenu();
//Hash management
$(window)
.bind('hashchange', self.onHashChange)
.trigger('hashchange');
};
this.updateVars = function(asVars)
{
$.each(asVars, function(sKey, oValue){self.vars(sKey, oValue)});
};
/* Variable Management */
this.vars = function(oVarName, oValue)
{
var asVarName = (typeof oVarName == 'object')?oVarName:[oVarName];
//Set, name & type / default value (init)
if(typeof oValue !== 'undefined') setElem(self.vars, copyArray(asVarName), oValue);
//Get, only name parameter
return getElem(self.vars, asVarName);
};
this.tmp = function(sVarName, oValue)
{
var asVarName = (typeof sVarName == 'object')?sVarName:[sVarName];
asVarName.unshift('tmp');
return self.vars(asVarName, oValue);
};
/* Interface with server */
this.get = function(sAction, fOnSuccess, oVars, fOnError, fonProgress)
{
if(!oVars) oVars = {};
fOnError = fOnError || function(sError) {console.log(sError);};
fonProgress = fonProgress || function(sState){};
fonProgress('start');
oVars['a'] = sAction;
oVars['t'] = self.consts.timezone;
return $.ajax(
{
url: self.consts.process_page,
data: oVars,
dataType: 'json'
})
.done(function(oData)
{
fonProgress('done');
if(oData.desc.substr(0, self.consts.lang_prefix.length)==self.consts.lang_prefix) oData.desc = self.lang(oData.desc.substr(5));
if(oData.result==self.consts.error) fOnError(oData.desc);
else fOnSuccess(oData.data, oData.desc);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
fonProgress('fail');
fOnError(textStatus+' '+errorThrown);
});
};
this.lang = function(sKey, asParams) {
var sParamType = $.type(asParams);
if(sParamType == 'undefined') asParams = [];
else if($.type(asParams) != 'array') asParams = [asParams];
var sLang = '';
if(sKey in self.consts.lang) {
sLang = self.consts.lang[sKey];
for(i in asParams) sLang = sLang.replace('$'+i, asParams[i]);
}
else {
console.log('missing translation: '+sKey);
sLang = sKey;
}
return sLang;
};
/* Page Switch - Trigger & Event catching */
this.onHashChange = function()
{
var asHash = self.getHash();
if(asHash.hash !='' && asHash.page != '') self.switchPage(asHash); //page switching
else if(self.vars('page')=='') self.setHash(self.consts.default_page); //first page
};
this.getHash = function()
{
var sHash = self.hash();
var asHash = sHash.split(self.consts.hash_sep);
var sPage = asHash.shift() || '';
return {hash:sHash, page:sPage, items:asHash};
};
this.setHash = function(sPage, asItems, bReboot)
{
bReboot = bReboot || false;
sPage = sPage || '';
asItems = asItems || [];
if(typeof asItems == 'string') asItems = [asItems];
if(sPage != '')
{
var sItems = (asItems.length > 0)?self.consts.hash_sep+asItems.join(self.consts.hash_sep):'';
self.hash(sPage+sItems, bReboot);
}
};
this.hash = function(hash, bReboot)
{
bReboot = bReboot || false;
if(!hash) return window.location.hash.slice(1);
else window.location.hash = '#'+hash;
if(bReboot) location.reload();
};
this.updateHash = function(sType, iId) {
sType = sType || '';
iId = iId || 0;
var asHash = self.getHash();
if(iId) self.setHash(asHash.page, [asHash.items[0], sType, iId]);
};
this.flushHash = function(asTypes) {
asTypes = asTypes || [];
var asHash = self.getHash();
if(asHash.items.length > 1 && (asTypes.length == 0 || asTypes.indexOf(asHash.items[1]) != -1)) self.setHash(asHash.page, [asHash.items[0]]);
};
/* Page Switch - DOM Replacement */
this.getActionLink = function(sAction, oVars)
{
if(!oVars) oVars = {};
sVars = '';
for(i in oVars)
{
sVars += '&'+i+'='+oVars[i];
}
return self.consts.process_page+'?a='+sAction+sVars;
};
this.resetTmpFunctions = function()
{
self.pageInit = function(asHash){console.log('no init for the page: '+asHash.page)};
self.onSamePageMove = function(asHash){return false};
self.onQuitPage = function(){return true};
self.onResize = function(){};
self.onFeedback = function(sType, sMsg){};
self.onKeydown = function(oEvent){};
};
this.switchPage = function(asHash)
{
var sPageName = asHash.page;
var bSamePage = (self.vars('page') == sPageName);
var bFirstPage = (self.vars('page') == '');
if(!self.consts.pages[sPageName]) { //Page does not exist
if(bFirstPage) self.setHash(self.consts.default_page);
else self.setHash(self.vars('page'), self.vars(['hash', 'items']));
}
else if(self.onQuitPage(bSamePage) && !bSamePage || self.onSamePageMove(asHash))
{
//Delete tmp variables
self.vars('tmp', {});
//disable tmp functions
self.resetTmpFunctions();
//Officially a new page
self.vars('page', sPageName);
self.vars('hash', asHash);
//Update Page Title
this.setPageTitle(sPageName+' '+(asHash.items[0] || ''));
//Replacing DOM
var $Dom = $(self.consts.pages[sPageName]);
if(bFirstPage)
{
self.splash($Dom, asHash, bFirstPage); //first page
}
else
{
self.elem.main.stop().fadeTo('fast', 0, function(){self.splash($Dom, asHash, bFirstPage);}); //Switching page
}
}
else if(bSamePage) self.vars('hash', asHash);
};
this.setPageTitle = function(sTitle) {
document.title = self.consts.title+' - '+sTitle;
};
this.splash = function($Dom, asHash, bFirstPage)
{
//Switch main content
self.elem.main.empty().html($Dom);
//Page Bootstrap
self.pageInit(asHash, bFirstPage);
//Show main
var $FadeInElem = bFirstPage?self.elem.container:self.elem.main;
$FadeInElem.hide().fadeTo('slow', 1);
};
this.getNaturalDuration = function(iHours) {
var iTimeMinutes = 0, iTimeHours = 0, iTimeDays = Math.floor(iHours/8); //8 hours a day
if(iTimeDays > 1) iTimeDays = Math.round(iTimeDays * 2) / 2; //Round down to the closest half day
else {
iTimeDays = 0;
iTimeHours = Math.floor(iHours);
iHours -= iTimeHours;
iTimeMinutes = Math.floor(iHours * 4) * 15; //Round down to the closest 15 minutes
}
return '~ '
+(iTimeDays>0?(iTimeDays+(iTimeDays%2==0?'':'½')+' '+self.lang(iTimeDays>1?'unit_days':'unit_day')):'') //Days
+((iTimeHours>0 || iTimeDays==0)?iTimeHours+self.lang('unit_hour'):'') //Hours
+((iTimeDays>0 || iTimeMinutes==0)?'':iTimeMinutes) //Minutes
};
this.checkClearance = function(sClearance) {
return (self.vars(['user', 'clearance']) >= sClearance);
};
}
/* Common Functions */
function copyArray(asArray)
{
return asArray.slice(0); //trick to copy array
}
function getElem(aoAnchor, asPath)
{
return (typeof asPath == 'object' && asPath.length > 1)?getElem(aoAnchor[asPath.shift()], asPath):aoAnchor[(typeof asPath == 'object')?asPath.shift():asPath];
}
function setElem(aoAnchor, asPath, oValue)
{
var asTypes = {boolean:false, string:'', integer:0, int:0, array:[], object:{}};
if(typeof asPath == 'object' && asPath.length > 1)
{
var nextlevel = asPath.shift();
if(!(nextlevel in aoAnchor)) aoAnchor[nextlevel] = {}; //Creating a new level
if(typeof aoAnchor[nextlevel] !== 'object') debug('Error - setElem() : Already existing path at level "'+nextlevel+'". Cancelling setElem() action');
return setElem(aoAnchor[nextlevel], asPath, oValue);
}
else
{
var sKey = (typeof asPath == 'object')?asPath.shift():asPath;
return aoAnchor[sKey] = (!(sKey in aoAnchor) && (oValue in asTypes))?asTypes[oValue]:oValue;
}
}
$.prototype.addInput = function(sType, sName, sValue, aoEvents)
{
aoEvents = aoEvents || [];
var $Input = $('<input>', {type: sType, name: sName, value: sValue}).data('old_value', sValue);
$.each(aoEvents, function(iIndex, aoEvent) {
$Input.on(aoEvent.on, aoEvent.callback);
});
return $(this).append($Input);
};
$.prototype.addButton = function(sIcon, sText, sName, fOnClick, sClass)
{
sText = sText || '';
sClass = sClass || '';
var $Btn = $('<button>', {name: sName, 'class':sClass})
.addIcon('fa-'+sIcon, (sText != ''))
.append(sText)
.click(fOnClick);
return $(this).append($Btn);
};
$.prototype.addIcon = function(sIcon, bMargin, sStyle)
{
bMargin = bMargin || false;
sStyle = sStyle || '';
return $(this).append($('<i>', {'class':'fa'+sStyle+' '+sIcon+(bMargin?' push':'')}));
};
$.prototype.defaultVal = function(sDefaultValue)
{
$(this)
.data('default_value', sDefaultValue)
.val(sDefaultValue)
.addClass('defaultText')
.focus(function()
{
var $This = $(this);
if($This.val() == $This.data('default_value')) $This.val('').removeClass('defaultText');
})
.blur(function()
{
var $This = $(this);
if($This.val() == '') $This.val($This.data('default_value')).addClass('defaultText');
});
};
$.prototype.checkForm = function(sSelector)
{
sSelector = sSelector || 'input[type="text"], textarea';
var $This = $(this);
var bOk = true;
$This.find(sSelector).each(function()
{
$This = $(this);
bOk = bOk && $This.val()!='' && $This.val()!=$This.data('default_value');
});
return bOk;
};
$.prototype.cascadingDown = function(sDuration)
{
return $(this).slideDown(sDuration, function(){$(this).next().cascadingDown(sDuration);});
};
$.prototype.hoverSwap = function(sDefault, sHover)
{
return $(this)
.data('default', sDefault)
.data('hover', sHover)
.hover(function(){
var $This = $(this),
sHover = $This.data('hover');
sDefault = $This.data('default');
if(sDefault!='' && sHover != '') {
$This.fadeOut('fast', function() {
var $This = $(this);
$This.text((sDefault==$This.text())?sHover:sDefault).fadeIn('fast');
});
}
})
.text(sDefault);
};
$.prototype.onSwipe = function(fOnStart, fOnMove, fOnEnd){
return $(this)
.on('dragstart', (e) => {
e.preventDefault();
})
.on('mousedown touchstart', (e) => {
var $This = $(this);
var oPos = getDragPosition(e);
$This.data('x-start', oPos.x);
$This.data('y-start', oPos.y);
$This.data('x-move', oPos.x);
$This.data('y-move', oPos.y);
$This.data('moving', true).addClass('moving');
fOnStart({
xStart: $This.data('x-start'),
yStart: $This.data('y-start')
});
})
.on('touchmove mousemove', (e) => {
var $This = $(this);
if($This.data('moving')) {
var oPos = getDragPosition(e);
$This.data('x-move', oPos.x);
$This.data('y-move', oPos.y);
fOnMove({
xStart: $This.data('x-start'),
yStart: $This.data('y-start'),
xMove: $This.data('x-move'),
yMove: $This.data('y-move')
});
}
})
.on('mouseup mouseleave touchend', (e) => {
var $This = $(this);
if($This.data('moving')) {
$This.data('moving', false).removeClass('moving');
fOnEnd({
xStart: $This.data('x-start'),
yStart: $This.data('y-start'),
xEnd: $This.data('x-move'),
yEnd: $This.data('y-move')
});
}
});
};
function getDragPosition(oEvent) {
let bMouse = oEvent.type.includes('mouse');
return {
x: bMouse?oEvent.pageX:oEvent.touches[0].clientX,
y: bMouse?oEvent.pageY:oEvent.touches[0].clientY
};
}
function copyTextToClipboard(text) {
if(!navigator.clipboard) {
var textArea = document.createElement('textarea');
textArea.value = text;
// Avoid scrolling to bottom
textArea.style.top = '0';
textArea.style.left = '0';
textArea.style.position = 'fixed';
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
var successful = document.execCommand('copy');
if(!successful) console.error('Fallback: Oops, unable to copy', text);
} catch (err) {
console.error('Fallback: Oops, unable to copy', err);
}
document.body.removeChild(textArea);
return;
}
navigator.clipboard.writeText(text).then(
function() {},
function(err) {
console.error('Async: Could not copy text: ', err);
}
);
}

141
src/styles/_common.scss Normal file
View File

@@ -0,0 +1,141 @@
/* Animations */
@-webkit-keyframes fadeIn {
from { opacity: 0.3; }
}
@-moz-keyframes fadeIn {
from { opacity: 0.3; }
}
@-ms-keyframes fadeIn {
from { opacity: 0.3; }
}
@-o-keyframes fadeIn {
from { opacity: 0.3; }
}
@keyframes fadeIn {
from { opacity: 0.3; }
}
@mixin animate($anim) {
-webkit-animation: $anim;
-moz-animation: $anim;
-ms-animation: $anim;
-o-animation: $anim;
animation: $anim;
}
.flicker {
@include animate(fadeIn 0.5s infinite alternate);
}
@mixin rounded($radius) {
-webkit-border-radius: $radius;
-moz-border-radius: $radius;
-ms-border-radius: $radius;
-o-border-radius: $radius;
border-radius: $radius;
}
@mixin drop-shadow($opacity) {
filter: drop-shadow(1px 0px 0px rgba(0, 0, 0, $opacity));
-webkit-filter: drop-shadow(1px 0px 0px rgba(0, 0, 0, $opacity));
}
@mixin no-text-overflow() {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
@keyframes spotlogo {
0% {
transform: scale(1);
}
1.25% {
transform: scale(1.2);
}
2.5% {
transform: scale(1);
transform:rotate(0deg);
}
5% {
transform:rotate(360deg);
}
100% {
transform:rotate(360deg);
}
}
/* Common objects */
*:focus {
outline: 0px none transparent;
}
[title]:not(a):not(.clickable) {
cursor: inherit;
}
.clickable {
cursor: pointer;
}
textarea:focus, input:focus {
outline: 1px solid #CCC;
}
body, textarea, input, button, a.button {
font-size: 14px;
font-family: 'Ubuntu', sans-serif;
margin: 0;
}
textarea {
resize: none;
}
a.button {
text-decoration: none;
display: inline-block;
}
button, a.button {
@extend .clickable;
font-weight: bold;
color: #000;
background: #eee;
&:hover {
color: #eee;
background: #000;
}
}
input, textarea, button, a.button {
border: none;
padding: 0.5em 1em;
border-radius: 3px;
}
h1 {
font-size: 2em;
font-weight: bold;
margin: 1em 0 0.5em;
}
/* Feedback */
.feedback {
p {
margin: 0 0 1em 0;
&.error {
color: red;
}
&.warning {
color: orange;
}
&.success {
color: green;
}
}
}

130
src/styles/_fa.scss Normal file
View File

@@ -0,0 +1,130 @@
$fa-font-path: "fa/fonts";
$fa-css-prefix: fa;
@import 'fa/solid';
@import 'fa/mixins';
@import 'fa/core';
@import 'fa/sizing';
@import 'fa/fixed-width';
@import 'fa/list';
@import 'fa/bordered-pulled';
@import 'fa/animated';
@import 'fa/rotated-flipped';
@import 'fa/stacked';
.fa {
&.push {
margin-right: 0.5rem;
}
&.push-left {
margin-left: 0.5rem;
}
}
.control-icon {
@extend .fa;
font-size: 28px;
text-align: center;
line-height: 44px;
text-decoration: none;
color: #CCC;
background: none;
text-shadow: 0px 1px 1px rgba(0,0,0,0.8);
&:hover {
color: white;
}
&:before {
display: block;
width: 44px;
height: 44px;
}
}
/* Navigation */
.#{$fa-css-prefix}-menu:before { content: fa-content($fa-var-bars); }
.#{$fa-css-prefix}-error:before { content: fa-content($fa-var-square-exclamation); }
.#{$fa-css-prefix}-warning:before { content: fa-content($fa-var-exclamation-triangle); }
.#{$fa-css-prefix}-success:before { content: fa-content($fa-var-check-circle); }
.#{$fa-css-prefix}-new:before { content: fa-content($fa-var-plus); }
.#{$fa-css-prefix}-refresh:before { content: fa-content($fa-var-sync); }
.#{$fa-css-prefix}-refresh:before { content: fa-content($fa-var-sync); }
.#{$fa-css-prefix}-cancel:before { content: fa-content($fa-var-image); }
.#{$fa-css-prefix}-prev:before,
.#{$fa-css-prefix}-back:before { content: fa-content($fa-var-chevron-left); }
.#{$fa-css-prefix}-next:before { content: fa-content($fa-var-chevron-right); }
.#{$fa-css-prefix}-close:before { content: fa-content($fa-var-times-circle); }
/* Map */
.#{$fa-css-prefix}-map:before { content: fa-content($fa-var-map-marked); }
.#{$fa-css-prefix}-track-off-track:before { content: fa-content($fa-var-hiking); }
.#{$fa-css-prefix}-track-main:before { content: fa-content($fa-var-hiking); }
.#{$fa-css-prefix}-track-hitchhiking:before { content: fa-content($fa-var-car-side); }
.#{$fa-css-prefix}-track-start:before { content: fa-content($fa-var-hiking);}
.#{$fa-css-prefix}-track-end:before { content: fa-content($fa-var-hiking);}
.#{$fa-css-prefix}-layers:before { content: fa-content($fa-var-layer-group); }
.#{$fa-css-prefix}-elev-chart:before { content: fa-content($fa-var-chart-area); }
.#{$fa-css-prefix}-distance:before { content: fa-content($fa-var-arrow-circle-right); }
.#{$fa-css-prefix}-elev-drop:before { content: fa-content($fa-var-arrow-circle-down); }
.#{$fa-css-prefix}-elev-gain:before { content: fa-content($fa-var-arrow-circle-up); }
.#{$fa-css-prefix}-download:before { content: fa-content($fa-var-file-download); }
/* Admin */
.#{$fa-css-prefix}-newsletter:before { content: fa-content($fa-var-wifi); }
.#{$fa-css-prefix}-project:before { content: fa-content($fa-var-hiking); }
.#{$fa-css-prefix}-unsubscribe:before { content: fa-content($fa-var-times); }
.#{$fa-css-prefix}-credits:before { content: fa-content($fa-var-paw); }
.#{$fa-css-prefix}-admin:before { content: fa-content($fa-var-tools); }
.#{$fa-css-prefix}-config:before { content: fa-content($fa-var-cogs); }
.#{$fa-css-prefix}-upload:before { content: fa-content($fa-var-cloud-upload); }
/* Feed */
.#{$fa-css-prefix}-post:before { content: fa-content($fa-var-comment); }
.#{$fa-css-prefix}-media:before { content: fa-content($fa-var-photo-video); }
.#{$fa-css-prefix}-video:before { content: fa-content($fa-var-film); }
.#{$fa-css-prefix}-image:before { content: fa-content($fa-var-image); }
.#{$fa-css-prefix}-message:before { content: fa-content($fa-var-map-marker); }
.#{$fa-css-prefix}-message-in:before { content: fa-content($fa-var-shoe-prints); }
.#{$fa-css-prefix}-time:before { content: fa-content($fa-var-clock); }
.#{$fa-css-prefix}-coords:before { content: fa-content($fa-var-compass); }
.#{$fa-css-prefix}-altitude:before { content: fa-content($fa-var-mountain); }
.#{$fa-css-prefix}-drill-video:before { content: fa-content($fa-var-play-circle); }
.#{$fa-css-prefix}-drill-image:before { content: fa-content($fa-var-search); }
.#{$fa-css-prefix}-drill-message:before { content: fa-content($fa-var-search-location); }
.#{$fa-css-prefix}-video-shot:before { content: fa-content($fa-var-camcorder); }
.#{$fa-css-prefix}-image-shot:before { content: fa-content($fa-var-camera-alt); }
.#{$fa-css-prefix}-link:before { content: fa-content($fa-var-link); }
.#{$fa-css-prefix}-link.copied:before { content: fa-content($fa-var-check); }
/* Feed - Poster */
.#{$fa-css-prefix}-poster:before { content: fa-content($fa-var-comment-edit); }
.#{$fa-css-prefix}-send:before { content: fa-content($fa-var-paper-plane); }
/* Lightbox */
.#{$fa-css-prefix}-timezone:before { content: fa-content($fa-var-globe); }
/* Weather */
.#{$fa-css-prefix}-temperature:before { content: fa-content($fa-var-thermometer-three-quarters); }
.#{$fa-css-prefix}-clear-day:before { content: fa-content($fa-var-sun); }
.#{$fa-css-prefix}-clear-night:before { content: fa-content($fa-var-moon-stars); }
.#{$fa-css-prefix}-cloudy:before { content: fa-content($fa-var-clouds); }
.#{$fa-css-prefix}-fog:before { content: fa-content($fa-var-fog); }
.#{$fa-css-prefix}-hail:before { content: fa-content($fa-var-cloud-hail); }
.#{$fa-css-prefix}-partly-cloudy-day:before { content: fa-content($fa-var-cloud-sun); }
.#{$fa-css-prefix}-partly-cloudy-night:before { content: fa-content($fa-var-cloud-moon); }
.#{$fa-css-prefix}-rain-snow-showers-day:before { content: fa-content($fa-var-cloud-sun-rain); }
.#{$fa-css-prefix}-rain-snow-showers-night:before { content: fa-content($fa-var-cloud-moon-rain); }
.#{$fa-css-prefix}-rain-snow:before { content: fa-content($fa-var-cloud-sleet); }
.#{$fa-css-prefix}-rain:before { content: fa-content($fa-var-cloud-rain); }
.#{$fa-css-prefix}-showers-day:before { content: fa-content($fa-var-cloud-sun-rain); }
.#{$fa-css-prefix}-showers-night:before { content: fa-content($fa-var-cloud-moon-rain); }
.#{$fa-css-prefix}-sleet:before { content: fa-content($fa-var-cloud-sleet); }
.#{$fa-css-prefix}-snow-showers-day:before { content: fa-content($fa-var-cloud-snow); }
.#{$fa-css-prefix}-snow-showers-night:before { content: fa-content($fa-var-cloud-snow); }
.#{$fa-css-prefix}-snow:before { content: fa-content($fa-var-cloud-snow); }
.#{$fa-css-prefix}-thunder-rain:before { content: fa-content($fa-var-thunderstorm); }
.#{$fa-css-prefix}-thunder-showers-day:before { content: fa-content($fa-var-thunderstorm-sun); }
.#{$fa-css-prefix}-thunder-showers-night:before { content: fa-content($fa-var-thunderstorm-moon); }
.#{$fa-css-prefix}-thunder:before { content: fa-content($fa-var-thunderstorm); }
.#{$fa-css-prefix}-wind:before { content: fa-content($fa-var-wind); }

110
src/styles/_fonts.scss Normal file
View File

@@ -0,0 +1,110 @@
/* Google Fonts - Ubuntu v15 - https://fonts.googleapis.com/css?family=Ubuntu:400,700&subset=latin-ext&display=swap */
/* cyrillic-ext */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCs6KVjbNBYlgoKcg72j00.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCs6KVjbNBYlgoKew72j00.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCs6KVjbNBYlgoKcw72j00.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCs6KVjbNBYlgoKfA72j00.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* latin-ext */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCs6KVjbNBYlgoKcQ72j00.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(fonts/4iCs6KVjbNBYlgoKfw72.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCv6KVjbNBYlgoCxCvjvWyNL4U.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCv6KVjbNBYlgoCxCvjtGyNL4U.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCv6KVjbNBYlgoCxCvjvGyNL4U.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCv6KVjbNBYlgoCxCvjs2yNL4U.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* latin-ext */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCv6KVjbNBYlgoCxCvjvmyNL4U.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url(fonts/4iCv6KVjbNBYlgoCxCvjsGyN.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

114
src/styles/_leaflet.scss Normal file
View File

@@ -0,0 +1,114 @@
$theme : "spot-theme";
$base-color : #CCC;
$highlight-color : #FFF;
$background : rgba($base-color, 0.2);
$drag-color : rgba($highlight-color, 0.2);
$axis-color : darken($base-color,20%);
$stroke-color : darken($base-color,40%);
$stroke-width-mouse-focus : 1;
$stroke-width-height-focus: 2;
$stroke-width-axis : 2;
@import '../../node_modules/leaflet/dist/leaflet';
@import 'leaflet/leaflet_heightgraph';
/* Leaflet fixes */
.leaflet-container {
background: none;
}
.leaflet-popup {
.leaflet-popup-content-wrapper {
border-radius: 5px;
padding: 0;
.leaflet-popup-content {
margin: 0;
padding: 1rem;
box-sizing: border-box;
}
}
}
.leaflet-control.spot-control, .leaflet-control.heightgraph .heightgraph-toggle {
@extend .clickable;
width: 44px;
height: 44px;
text-align: center;
box-shadow: none;
.fa {
@extend .control-icon;
width: 100%;
}
}
/* Leaflet Heightgraph fixes */
.legend-text, .tick, .tick text, .focusbox, .height-focus.circle, .height-focus.label, .lineSelection, .horizontalLineText {
fill: #333 !important;
}
.axis path, .focusbox rect, .focusLine line, .height-focus.label rect, .height-focus.line, .horizontalLine {
stroke: #333 !important;
}
.focusbox rect, .height-focus.label rect {
stroke-width: 0;
}
.focusLine line, .focusbox rect, .height-focus.label rect {
-webkit-filter: drop-shadow(1px 0px 2px rgba(0, 0, 0, 0.6));
filter: drop-shadow(1px 0px 2px rgba(0, 0, 0, 0.6));
}
.height-focus.label rect, .focusbox rect {
fill: rgba(255,255,255,.6);
}
.heightgraph.leaflet-control {
svg.heightgraph-container {
background: none;
border-radius: 0;
.area {
@include drop-shadow(0.6);
}
}
.horizontalLine {
stroke-width: 2px;
}
.heightgraph-toggle {
background: none;
.heightgraph-toggle-icon {
@extend .control-icon;
@extend .fa-elev-chart;
height: 44px;
position: static;
background: none;
}
}
.heightgraph-close-icon {
@extend .control-icon;
@extend .fa-unsubscribe;
background: none;
font-size: 20px;
line-height: 26px;
width: 26px;
text-align: center;
display: none;
&:before {
width: 26px;
height: 26px;
}
}
}
.leaflet-default-icon-path {
background-image: none;
}

227
src/styles/_lightbox.scss Normal file
View File

@@ -0,0 +1,227 @@
@import '../../node_modules/lightbox2/dist/css/lightbox.css';
@mixin lightbox-icon($icon) {
background: none;
font-size: 2em;
@extend .fa;
@extend .#{$fa-css-prefix}-#{$icon};
}
.lightboxOverlay {
bottom: 0;
right: 0;
outline: none;
}
.lightbox {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
overflow: hidden;
&.vertical {
flex-direction: column;
.lb-dataContainer {
width: 100%;
height: 30px;
.lb-data {
flex-direction: row;
.lb-details {
width: calc(100% - 1.25rem);
.lb-caption {
.lb-caption-line {
padding-right: 1em;
line-height: 1.33333333333em; //icon height
overflow: hidden;
&.comment {
max-width: 50%;
@include no-text-overflow();
}
}
}
}
.lb-closeContainer {
.lb-close {
text-align: right;
}
}
}
}
}
&.horizontal {
flex-direction: row;
.lb-dataContainer {
width: 200px;
height: 100%;
.lb-data {
flex-direction: column;
.lb-caption-line {
display: block;
margin-top: 1em;
line-height: 1.33333333em;
&.comment {
.fa {
vertical-align: text-bottom;
}
.comment-text {
display: inline-block;
width: calc(100% - 1.25em*1.33333333333 - 0.5rem);
vertical-align: top;
}
}
}
.lb-closeContainer .lb-close {
margin-top: calc(1em/1.33333333);
float: none;
}
}
}
}
/* Image */
.lb-outerContainer {
margin: 0;
border-radius:0;
background-color: rgba(255, 255, 255, 0.5);
.lb-container {
overflow: hidden;
&.moveable {
cursor: grab;
}
&.moving {
cursor: grabbing;
}
.lb-image {
image-orientation: from-image;
border-radius: 0;
border: none;
--translate-x: 0;
--translate-y: 0;
--scale: 1;
transform:
translateX(var(--translate-x, 0))
translateY(var(--translate-y, 0))
scale(var(--scale, 1));
}
.lb-video {
box-sizing: content-box;
}
&.lb-video-nav .lb-nav {
top: 100px;
height: calc(100% - 200px); //Leave space for video progress bar
}
.lb-nav {
.lb-prev-area, .lb-next-area {
position: absolute;
top: 0;
height: 100%;
width: 50%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
&.lb-next-area {
right: 0;
}
&:hover a.lb-prev, &:hover a.lb-next {
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
opacity: 1;
}
}
a.lb-prev, a.lb-next {
color: white;
text-decoration: none;
text-shadow: 0px 1px 1px rgba(0,0,0,0.8);
width: 150px;
height: 150px;
position: absolute;
top: 50%;
transform: translateY(-50%);
-webkit-transition: opacity 0.4s;
-moz-transition: opacity 0.4s;
-o-transition: opacity 0.4s;
transition: opacity 0.4s;
&:before {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
}
a.lb-prev {
@include lightbox-icon(prev);
left: 0;
}
a.lb-next {
@include lightbox-icon(next);
right: 0;
}
}
}
}
/* Titles */
.lb-dataContainer {
margin: 0;
padding: 0;
flex: 0 0 auto;
overflow: hidden;
.lb-data {
text-align: left;
padding: 0.5rem 0.5rem 0 0.5rem;
display: flex;
.lb-details {
float: none;
.lb-caption-line:first-child {
margin-top: 0;
}
}
.lb-closeContainer .lb-close {
@include lightbox-icon(close);
@extend .fa-lg;
@extend .fa-fw;
height: auto;
font-size: 1.3333333333em;
line-height: 1em;
color: white;
}
}
}
.lb-cancel {
@include lightbox-icon(cancel);
@extend .flicker;
color: #CCC;
text-decoration: none;
}
}

View File

@@ -0,0 +1,37 @@
#admin {
margin: 1em;
table {
margin-bottom: 1em;
border-collapse: collapse;
tr {
th {
background: #AAA;
color: white;
padding: 0.2rem 0.5rem;
}
td {
background: #EEE;
text-align: center;
padding: 0.2rem 0.5rem;
input {
&[type="number"] {
width: 50px;
}
&[name="ref_feed_id"] {
width: 300px;
}
}
button {
color: #AAA;
background: none;
&:hover {
color: #666;
}
}
}
}
}
}

View File

@@ -0,0 +1,842 @@
//Feed width
$elem-spacing: 0.5rem;
$block-spacing: 1rem;
$block-radius: 3px;
$block-shadow: 3px;
$panel-width: 30vw;
$panel-width-max: "400px + 3 * #{$block-spacing}";
$button-width: 44px;
//Feed colors
$post-input-bg: #ffffff; //#d9deff;
$post-color: #333; //#323268;
$post-color-hover: darken($post-color, 10%);
$post-bg: rgba(255,255,255,.8); //#B4BDFF;
$message-color: #326526;
$message-color-hover: darken($message-color, 10%);
$message-bg: #6DFF58;
$media-color: #333; //#635C28;
$media-bg: rgba(255,255,255,.8); //#F3EC9F;
//Settings colors
$title-color: $post-color;
$subtitle-color: #999;
//Legend colors
$track-main-color: #00ff78;
$track-off-track-color: #0000ff;
$track-hitchhiking-color: #FF7814;
$legend-color: $post-color;
#projects {
overflow: hidden;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
/* Panels movements */
&.with-feed {
#submap {
width: calc(100% - min(#{$panel-width}, #{$panel-width-max}));
}
#feed {
right: 0;
}
.leaflet-right {
right: min(#{$panel-width}, #{$panel-width-max});
}
#feed-button {
.fa {
@extend .fa-next;
}
}
#title {
max-width: calc(100vw - max(#{$panel-width}, #{$panel-width-max}) - (#{$button-width} + #{$block-spacing} * 2) * 2);
}
}
&.with-settings {
#submap {
width: calc(100% - min(#{$panel-width}, #{$panel-width-max}));
left: min(#{$panel-width}, #{$panel-width-max});
}
#settings {
left: 0;
}
.leaflet-left {
left: min(#{$panel-width}, #{$panel-width-max});
}
#settings-button {
.fa {
@extend .fa-prev;
}
}
#title {
max-width: calc(100vw - #{$block-spacing} * 2 - min(#{$panel-width}, #{$panel-width-max}) - (#{$button-width} + #{$block-spacing} * 2) * 2);
}
}
&.with-feed.with-settings {
#submap {
left: 0;
width: 100%;
}
#title {
max-width: calc(100vw - #{$block-spacing} * 2 - min(#{$panel-width}, #{$panel-width-max}) * 2 - (#{$button-width} + #{$block-spacing} * 2) * 2);
}
}
#background {
background: #666;
position: absolute;
left: 0;
top: 0;
bottom: 0;
right: 0;
}
#submap {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 100%;
transition: width 0.5s, left 0.5s;
.loader {
position: absolute;
font-size: 3em;
top: calc(50% - 0.5em);
left: calc(50% - 1.25em/2);
color: #CCC;
}
}
#map {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 100%;
/* Leaflet Popup */
.leaflet-popup-content {
h1 {
font-size: 1.4em;
margin: 0;
font-weight: bold;
}
.separator {
border-top: 1px solid #CCC;
margin: $elem-spacing 0 $block-spacing 0;
}
/* Marker Popup */
.info-window {
h1 .message-type {
color: #CCC;
font-weight: normal;
font-size: calc(1em / 1.4);
margin-left: 0.5em;
vertical-align: text-bottom;
}
p {
font-size: 1.0em;
margin: $elem-spacing 0 0 0;
a {
color: $post-color;
}
}
.medias {
line-height: 0;
a {
display: inline-block;
margin: $block-spacing $block-spacing 0 0;
&:last-child {
margin-right: 0;
}
&.drill {
font-size: 2em;
.fa-drill-image {
color: transparent;
}
.fa-drill-video {
color: rgba(255, 255, 255, 0.5);
}
&:hover {
.fa-drill-video, .fa-drill-image {
color: rgba(255, 255, 255, 0.75);
}
}
}
img {
width: auto;
height: auto;
max-width: 200px;
max-height: 100px;
border-radius: $block-radius;
image-orientation: from-image;
transition: All 0.2s;
}
}
}
}
/* Track Popup */
.track_tooltip {
p {
margin: 0;
&.description {
font-size: 1.15em;
}
}
h1, .description {
@include no-text-overflow();
}
.body {
padding-left: calc(1.25em*1.4 + #{$elem-spacing} );
.details {
margin-top: -$block-spacing;
p.detail {
margin-top: $block-spacing;
width: 50%;
display: inline-block;
}
}
}
}
}
}
/* Leaflet patches */
.leaflet-control {
background-color: rgba(255, 255, 255, 0.6);
font-family: Roboto, Arial, sans-serif;
border-radius: $block-radius;
border: none;
margin: $block-spacing;
box-shadow: 0 1px 7px rgba(0, 0, 0, .4);
&+ .leaflet-control:not(.leaflet-control-inline) {
margin-top: 0;
}
&+ .leaflet-control.leaflet-control-inline {
margin-left: 0;
}
&.leaflet-control-scale {
padding: 0.5em;
.leaflet-control-scale-line {
background: none;
}
}
&.leaflet-control-inline {
clear: none;
}
}
/* Pull right/left controls by $panel-width */
.leaflet-right, .leaflet-left {
transition: left 0.5s, right 0.5s;
}
/* Hide default layer control */
.leaflet-top.leaflet-left .leaflet-control-layers .leaflet-control-layers-toggle {
display: none;
}
#legend {
.track {
white-space: nowrap;
.line {
width: 2em;
height: 4px;
display: inline-block;
border-radius: 2px;
vertical-align: middle;
&.main {
background-color: $track-main-color;
}
&.off-track {
background-color: $track-off-track-color;
}
&.hitchhiking {
background-color: $track-hitchhiking-color;
}
}
.desc {
font-size: 1em;
margin-left: 0.5em;
color: $legend-color;
}
}
}
#title {
@include no-text-overflow();
line-height: $button-width;
height: $button-width;
padding: 0 $block-spacing;
margin-bottom: 0;
span#project_name {
font-size: 1.3em;
}
}
#feed-button .fa {
@extend .fa-post;
}
#settings-button .fa {
@extend .fa-menu;
}
/* Drill & Map icons */
a.drill {
position: relative;
overflow: hidden;
text-decoration: none;
display: inline-block;
.drill-icon {
position: absolute;
display: inline-block;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
i {
transition: color 0.3s;
}
}
}
.fa-stack {
.fa-message {
font-size: 32px;
text-shadow: rgba(0, 0, 0, 0.5) 3px 3px 3px;
color: $message-bg;
}
.fa-message-in {
font-size: 13px;
color: $message-color;
top: 1px;
}
.fa-track-start, .fa-track-end {
color: $message-color;
font-size: 14px;
top: 1px;
}
.fa-track-end {
color: $track-hitchhiking-color;
}
}
/* Feed/Settings Panel */
#feed, #settings {
position: absolute;
top: 0;
bottom: 0;
overflow: hidden;
z-index: 999;
cursor: grab;
user-select: none;
&.moving {
cursor: grabbing;
transition: none;
}
input, textarea {
background-color: $post-input-bg;
color: $post-color;
outline: none;
}
button, a.button {
background-color: $post-color;
color: $post-bg;
&:hover, &:hover a, &:hover a:visited {
background-color: $post-input-bg;
color: $post-color;
}
a, a:visited {
background-color: $post-color;
color: $post-bg;
text-decoration: none;
}
&+ button, &+ a.button {
margin-left: $elem-spacing;
}
}
#feed-panel, #settings-panel {
position: absolute;
top: 0;
bottom: 0;
left: 0;
}
}
#feed {
right: calc(min(#{$panel-width}, #{$panel-width-max}) * -1);
transition: right 0.5s;
width: #{$panel-width};
max-width: calc(#{$panel-width-max});
#feed-panel {
width: 100%;
padding-top: $block-spacing;
#posts_list {
position: relative;
}
#poster {
&.histo-mode .poster, &:not(.histo-mode) .archived {
display: none;
}
.poster {
textarea#post {
margin-bottom: 1em;
width: calc(100% - 2em);
}
input#name {
width: calc(100% - 6em);
}
button#submit {
margin-left: 1em;
margin-bottom: 0.5em;
}
}
.archived {
background: #EEE;
}
}
.body-box {
position:relative;
display: flex;
flex-direction: column;
}
.post-item {
margin-bottom: $block-spacing;
background: $post-bg;
color: $post-color;
border-radius: $block-radius;
width: calc(100% - #{$block-spacing});
box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.5);
a {
color: $post-color;
&:hover {
color: $post-color-hover;
}
}
.message {
margin: 0;
}
.signature {
margin: $elem-spacing 0 0 0;
text-align: right;
font-style: italic;
img {
vertical-align: baseline;
margin: 0 0.2em calc((1em - 24px)/2) 0;
position: relative;
}
}
.header {
padding: 0 $block-spacing;
position: relative;
span {
display: inline-block;
font-size: 0.8em;
padding: $elem-spacing 0px;
&.index {
width: 25%;
.link, .link:visited, .link_copied {
margin-left: $elem-spacing;
padding: 0;
line-height: 1;
}
}
&.time {
width: 75%;
text-align: right;
font-style: italic;
}
}
}
.body {
clear: both;
padding: 0em $block-spacing $block-spacing;
}
&.headerless {
.header {
display: none;
}
.body {
padding-top: $block-spacing;
text-align: center;
p {
margin: 0;
.fa {
display: inline-block;
font-size: 2em;
margin: $elem-spacing 0;
}
}
}
}
&.message {
background: $message-bg;
color: $message-color;
p {
font-size: 0.9em;
margin: 0 0 $elem-spacing 0;
display: inline-block;
width: 100%;
}
a {
color: $message-color;
&:hover {
color: $message-color-hover;
}
}
a.drill {
line-height: 0;
.drill-icon {
transform: translate(-16px, -32px);
.fa-message-in {
top: -1px;
left: -1px;
}
}
&:hover {
.fa-message {
@extend .#{$fa-css-prefix}-drill-message;
top: 13px;
left: 3px;
}
.fa-message-in {
display: none;
}
}
}
.weather {
position: absolute;
top: $block-spacing;
right: $block-spacing;
.fa {
font-size: 1.3em;
vertical-align: middle;
line-height: 1rem;
background: $message-color;
color: $message-bg;
border-radius: $block-radius 0 0 $block-radius;
padding: $elem-spacing;
}
span {
vertical-align: middle;
padding: $elem-spacing;
background: $message-bg;
color: $message-color;
border-radius: 0 $block-radius $block-radius 0;
}
}
.staticmap {
width: 100%;
border-radius: $block-radius;
}
}
&.post {
.body {
padding: 0em 1em 0.5em;
}
}
&.media {
background: $media-bg;
color: $media-color;
.body {
a {
display: inline-block;
width: 100%;
margin: 0;
color: $media-color;
position: relative;
line-height: 0;
&.drill {
&:hover {
.drill-icon .fa-drill-image, .drill-icon .fa-drill-video {
color: rgba($media-bg, 0.75);
}
.comment {
opacity: 0;
}
}
.drill-icon {
font-size: 3em;
.fa-drill-image {
color: transparent;
}
.fa-drill-video {
color: rgba(255, 255, 255, 0.5);
}
}
}
img {
width: 100%;
height: auto;
image-orientation: from-image;
outline: none;
border-radius: $block-radius;
}
.comment {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
line-height: normal;
box-sizing: border-box;
margin: 0;
padding: 0.5em;
text-align: justify;
background: rgba(255, 255, 255, 0.6);
border-radius: 0 0 $block-radius $block-radius;
transition: opacity 0.3s;
opacity: 1;
}
}
}
}
}
}
}
#settings {
left: calc(min(#{$panel-width} + #{$block-shadow}, #{$panel-width-max} + #{$block-shadow}) * -1);
transition: left 0.5s;
width: calc(#{$panel-width} + #{$block-shadow}); //Add box-shadow
max-width: calc(#{$panel-width-max} + #{$block-shadow}); //Add box-shadow
#settings-panel {
width: calc(100% - #{$block-spacing} - #{$block-shadow}); //Remove box-shadow
margin: $block-spacing;
border-radius: $block-radius;
box-shadow: 2px 2px $block-shadow 0px rgba(0, 0, 0, .5);
color: $post-color;
background: rgba(255, 255, 255, 0.8);
display: flex;
flex-direction: column;
flex-wrap: nowrap;
.settings-header {
text-align: center;
flex: 0 1 auto;
.logo {
background: rgba(255, 255, 255, .4);
padding: 2rem 1rem;
border-radius: $block-radius $block-radius 0 0;
img {
width: 100%;
height: auto;
max-width: 180px;
transform: translateX(-10%); //Center Text, not logo. logo width (40px) / image width (200px) = 20%. And centering: 20% / 2 = 10%
}
}
#last_update {
position: absolute;
margin-top: -2em;
padding: 0 1rem;
width: calc(100% - 2rem);
p {
text-align: center;
font-size: 0.8em;
margin: 0;
color: $subtitle-color;
transform: translateX(calc(-0.5 * (12px + 0.5em))); //icon width + margin right
span {
margin-right: 0.5em;
img {
width: 12px;
vertical-align: middle;
animation: spotlogo 20s infinite;
}
}
abbr {
text-decoration: none;
vertical-align: middle;
}
}
}
}
.settings-footer {
flex: 0 1 auto;
background: rgba(255, 255, 255, .4);
border-radius: 0 0 3px 3px;
font-size: 0.7em;
padding: 0.3rem;
text-align: center;
color: #888;
a {
color: #777;
text-decoration: none;
}
}
.settings-sections {
flex: 1 1 auto;
overflow: auto;
#settings-sections-scrollbox {
height: 100%;
width: 100%;
}
.settings-section {
display: inline-block;
margin: 1.5rem 1rem 0 1rem;
width: calc(100% - 2 * #{$block-spacing});
&:last-child {
margin-bottom: 1.5rem;
}
h1 {
margin: 0 0 $block-spacing;
color: $title-color;
font-size: 1.5em;
}
label {
margin-bottom: .3em;
display: block;
@extend .clickable;
& > div {
@include no-text-overflow();
}
}
&.newsletter {
input#email {
width: calc(100% - 6em);
&:disabled {
color: #999;
background: rgba(255,255,255,0.2);
}
}
button#nl_btn {
margin-left: 1em;
margin-bottom: 1em;
&.subscribe .fa {
@extend .fa-send;
}
&.unsubscribe .fa {
@extend .fa-unsubscribe;
}
&.loading {
background-color: $message-color;
color: white;
span {
@extend .flicker;
}
}
}
}
#settings-projects {
a.fa-download {
color: $legend-color;
&:hover {
color: #0078A8;
}
}
}
}
}
}
}
}
#elems {
display: none;
}

View File

@@ -0,0 +1,36 @@
#upload {
padding: 1em;
.bar {
height: 18px;
background: green;
}
.comment {
margin-top: 1em;
.thumb {
width: 30%;
max-width: 100px;
}
form {
display: inline-block;
width: calc(70% - 1em);
min-width: calc(100% - 100px - 1em);
margin-left: 1em;
vertical-align: top;
.content {
width: 100%;
box-sizing: border-box;
padding: 0.5em;
border: 1px solid #333;
}
.save {
margin-top: 1em;
padding: 0.5em;
}
}
}
}

91
src/styles/_mobile.scss Normal file
View File

@@ -0,0 +1,91 @@
@media only screen and (max-width: 800px) {
$panel-width: "100vw - #{$button-width} - 2 * #{$block-spacing}";
.desktop {
display: none !important;
}
#projects {
#feed, #settings {
width: calc(#{$panel-width});
max-width: calc(#{$panel-width});
}
#feed {
right: calc((#{$panel-width}) * -1);
}
#settings {
left: calc((#{$panel-width}) * -1);
}
#title {
width: calc(#{$panel-width} - #{$button-width} - 4 * #{$block-spacing});
max-width: calc(#{$panel-width} - #{$button-width} - 4 * #{$block-spacing});
text-align: center;
}
.leaflet-right, .leaflet-left {
width: 100%;
}
&.with-feed, &.with-settings {
#submap {
width: 100%;
}
.leaflet-control-container .leaflet-top.leaflet-right {
display: none;
}
#title {
width: calc(#{$panel-width} - #{$button-width} - 4 * #{$block-spacing});
max-width: calc(#{$panel-width} - #{$button-width} - 4 * #{$block-spacing});
}
}
&.with-feed {
.leaflet-right {
right: calc(#{$panel-width});
}
.leaflet-left {
left: calc((#{$panel-width}) * -1);
}
}
&.with-settings {
.leaflet-right {
right: calc((#{$panel-width}) * -1);
}
.leaflet-left {
left: calc(#{$panel-width});
}
}
.leaflet-control-container .leaflet-top.leaflet-left {
display: none;
}
}
.lightbox .lb-outerContainer .lb-container .lb-nav {
a.lb-prev, a.lb-next {
height: 100%;
width: 100%;
}
a.lb-prev::before {
left: 1em;
}
a.lb-next::before {
right: 1em;
}
}
}
@media only screen and (min-width: 801px) {
.mobile {
display: none !important;
}
}

211
src/styles/_simplebar.scss Normal file
View File

@@ -0,0 +1,211 @@
[data-simplebar] {
position: relative;
flex-direction: column;
flex-wrap: wrap;
justify-content: flex-start;
align-content: flex-start;
align-items: flex-start;
}
.simplebar-wrapper {
overflow: hidden;
width: inherit;
height: inherit;
max-width: inherit;
max-height: inherit;
}
.simplebar-mask {
direction: inherit;
position: absolute;
overflow: hidden;
padding: 0;
margin: 0;
left: 0;
top: 0;
bottom: 0;
right: 0;
width: auto !important;
height: auto !important;
z-index: 0;
}
.simplebar-offset {
direction: inherit !important;
box-sizing: inherit !important;
resize: none !important;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
padding: 0;
margin: 0;
-webkit-overflow-scrolling: touch;
}
.simplebar-content-wrapper {
direction: inherit;
box-sizing: border-box !important;
position: relative;
display: block;
height: 100%; /* Required for horizontal native scrollbar to not appear if parent is taller than natural height */
width: auto;
max-width: 100%; /* Not required for horizontal scroll to trigger */
max-height: 100%; /* Needed for vertical scroll to trigger */
scrollbar-width: none;
-ms-overflow-style: none;
}
.simplebar-content-wrapper::-webkit-scrollbar,
.simplebar-hide-scrollbar::-webkit-scrollbar {
width: 0;
height: 0;
}
.simplebar-content:before,
.simplebar-content:after {
content: ' ';
display: table;
}
.simplebar-placeholder {
max-height: 100%;
max-width: 100%;
width: 100%;
pointer-events: none;
}
.simplebar-height-auto-observer-wrapper {
box-sizing: inherit !important;
height: 100%;
width: 100%;
max-width: 1px;
position: relative;
float: left;
max-height: 1px;
overflow: hidden;
z-index: -1;
padding: 0;
margin: 0;
pointer-events: none;
flex-grow: inherit;
flex-shrink: 0;
flex-basis: 0;
}
.simplebar-height-auto-observer {
box-sizing: inherit;
display: block;
opacity: 0;
position: absolute;
top: 0;
left: 0;
height: 1000%;
width: 1000%;
min-height: 1px;
min-width: 1px;
overflow: hidden;
pointer-events: none;
z-index: -1;
}
.simplebar-track {
z-index: 1;
position: absolute;
right: 0;
bottom: 0;
pointer-events: none;
overflow: hidden;
}
[data-simplebar].simplebar-dragging .simplebar-content {
pointer-events: none;
user-select: none;
-webkit-user-select: none;
}
[data-simplebar].simplebar-dragging .simplebar-track {
pointer-events: all;
}
.simplebar-scrollbar {
position: absolute;
left: 0;
right: 0;
min-height: 10px;
}
.simplebar-scrollbar:before {
position: absolute;
content: '';
background: black;
border-radius: 7px;
left: 2px;
right: 2px;
opacity: 0;
transition: opacity 0.2s linear;
}
.simplebar-scrollbar.simplebar-visible:before {
/* When hovered, remove all transitions from drag handle */
opacity: 0.5;
transition: opacity 0s linear;
}
.simplebar-track.simplebar-vertical {
top: 0;
width: 11px;
}
.simplebar-track.simplebar-vertical .simplebar-scrollbar:before {
top: 2px;
bottom: 2px;
}
.simplebar-track.simplebar-horizontal {
left: 0;
height: 11px;
}
.simplebar-track.simplebar-horizontal .simplebar-scrollbar:before {
height: 100%;
left: 2px;
right: 2px;
}
.simplebar-track.simplebar-horizontal .simplebar-scrollbar {
right: auto;
left: 0;
top: 2px;
height: 7px;
min-height: 0;
min-width: 10px;
width: auto;
}
/* Rtl support */
[data-simplebar-direction='rtl'] .simplebar-track.simplebar-vertical {
right: auto;
left: 0;
}
.hs-dummy-scrollbar-size {
direction: rtl;
position: fixed;
opacity: 0;
visibility: hidden;
height: 500px;
width: 500px;
overflow-y: hidden;
overflow-x: scroll;
}
.simplebar-hide-scrollbar {
position: fixed;
left: 0;
visibility: hidden;
overflow-y: scroll;
scrollbar-width: none;
-ms-overflow-style: none;
}

View File

@@ -0,0 +1,153 @@
// animating icons
// --------------------------
.#{$fa-css-prefix}-beat {
animation-name: #{$fa-css-prefix}-beat;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, ease-in-out);
}
.#{$fa-css-prefix}-bounce {
animation-name: #{$fa-css-prefix}-bounce;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, cubic-bezier(0.280, 0.840, 0.420, 1));
}
.#{$fa-css-prefix}-fade {
animation-name: #{$fa-css-prefix}-fade;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, cubic-bezier(.4,0,.6,1));
}
.#{$fa-css-prefix}-beat-fade {
animation-name: #{$fa-css-prefix}-beat-fade;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, cubic-bezier(.4,0,.6,1));
}
.#{$fa-css-prefix}-flip {
animation-name: #{$fa-css-prefix}-flip;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, ease-in-out);
}
.#{$fa-css-prefix}-shake {
animation-name: #{$fa-css-prefix}-shake;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, linear);
}
.#{$fa-css-prefix}-spin {
animation-name: #{$fa-css-prefix}-spin;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 2s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, linear);
}
.#{$fa-css-prefix}-spin-reverse {
--#{$fa-css-prefix}-animation-direction: reverse;
}
.#{$fa-css-prefix}-pulse,
.#{$fa-css-prefix}-spin-pulse {
animation-name: #{$fa-css-prefix}-spin;
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, steps(8));
}
// if agent or operating system prefers reduced motion, disable animations
// see: https://www.smashingmagazine.com/2020/09/design-reduced-motion-sensitivities/
// see: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion
@media (prefers-reduced-motion: reduce) {
.#{$fa-css-prefix}-beat,
.#{$fa-css-prefix}-bounce,
.#{$fa-css-prefix}-fade,
.#{$fa-css-prefix}-beat-fade,
.#{$fa-css-prefix}-flip,
.#{$fa-css-prefix}-pulse,
.#{$fa-css-prefix}-shake,
.#{$fa-css-prefix}-spin,
.#{$fa-css-prefix}-spin-pulse {
animation-delay: -1ms;
animation-duration: 1ms;
animation-iteration-count: 1;
transition-delay: 0s;
transition-duration: 0s;
}
}
@keyframes #{$fa-css-prefix}-beat {
0%, 90% { transform: scale(1); }
45% { transform: scale(var(--#{$fa-css-prefix}-beat-scale, 1.25)); }
}
@keyframes #{$fa-css-prefix}-bounce {
0% { transform: scale(1,1) translateY(0); }
10% { transform: scale(var(--#{$fa-css-prefix}-bounce-start-scale-x, 1.1),var(--#{$fa-css-prefix}-bounce-start-scale-y, 0.9)) translateY(0); }
30% { transform: scale(var(--#{$fa-css-prefix}-bounce-jump-scale-x, 0.9),var(--#{$fa-css-prefix}-bounce-jump-scale-y, 1.1)) translateY(var(--#{$fa-css-prefix}-bounce-height, -0.5em)); }
50% { transform: scale(var(--#{$fa-css-prefix}-bounce-land-scale-x, 1.05),var(--#{$fa-css-prefix}-bounce-land-scale-y, 0.95)) translateY(0); }
57% { transform: scale(1,1) translateY(var(--#{$fa-css-prefix}-bounce-rebound, -0.125em)); }
64% { transform: scale(1,1) translateY(0); }
100% { transform: scale(1,1) translateY(0); }
}
@keyframes #{$fa-css-prefix}-fade {
50% { opacity: var(--#{$fa-css-prefix}-fade-opacity, 0.4); }
}
@keyframes #{$fa-css-prefix}-beat-fade {
0%, 100% {
opacity: var(--#{$fa-css-prefix}-beat-fade-opacity, 0.4);
transform: scale(1);
}
50% {
opacity: 1;
transform: scale(var(--#{$fa-css-prefix}-beat-fade-scale, 1.125));
}
}
@keyframes #{$fa-css-prefix}-flip {
50% {
transform: rotate3d(var(--#{$fa-css-prefix}-flip-x, 0), var(--#{$fa-css-prefix}-flip-y, 1), var(--#{$fa-css-prefix}-flip-z, 0), var(--#{$fa-css-prefix}-flip-angle, -180deg));
}
}
@keyframes #{$fa-css-prefix}-shake {
0% { transform: rotate(-15deg); }
4% { transform: rotate(15deg); }
8%, 24% { transform: rotate(-18deg); }
12%, 28% { transform: rotate(18deg); }
16% { transform: rotate(-22deg); }
20% { transform: rotate(22deg); }
32% { transform: rotate(-12deg); }
36% { transform: rotate(12deg); }
40%, 100% { transform: rotate(0deg); }
}
@keyframes #{$fa-css-prefix}-spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}

View File

@@ -0,0 +1,20 @@
// bordered + pulled icons
// -------------------------
.#{$fa-css-prefix}-border {
border-color: var(--#{$fa-css-prefix}-border-color, #{$fa-border-color});
border-radius: var(--#{$fa-css-prefix}-border-radius, #{$fa-border-radius});
border-style: var(--#{$fa-css-prefix}-border-style, #{$fa-border-style});
border-width: var(--#{$fa-css-prefix}-border-width, #{$fa-border-width});
padding: var(--#{$fa-css-prefix}-border-padding, #{$fa-border-padding});
}
.#{$fa-css-prefix}-pull-left {
float: left;
margin-right: var(--#{$fa-css-prefix}-pull-margin, #{$fa-pull-margin});
}
.#{$fa-css-prefix}-pull-right {
float: right;
margin-left: var(--#{$fa-css-prefix}-pull-margin, #{$fa-pull-margin});
}

66
src/styles/fa/_core.scss Normal file
View File

@@ -0,0 +1,66 @@
// base icon class definition
// -------------------------
.#{$fa-css-prefix} {
font-family: var(--#{$fa-css-prefix}-style-family, '#{$fa-style-family}');
font-weight: var(--#{$fa-css-prefix}-style, #{$fa-style});
}
.#{$fa-css-prefix},
.#{$fa-css-prefix}-classic,
.#{$fa-css-prefix}-sharp,
.fas,
.#{$fa-css-prefix}-solid,
.far,
.#{$fa-css-prefix}-regular,
.fal,
.#{$fa-css-prefix}-light,
.fat,
.#{$fa-css-prefix}-thin,
.fad,
.#{$fa-css-prefix}-duotone,
.fass,
.#{$fa-css-prefix}-sharp-solid,
.fab,
.#{$fa-css-prefix}-brands {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: var(--#{$fa-css-prefix}-display, #{$fa-display});
font-style: normal;
font-variant: normal;
line-height: 1;
text-rendering: auto;
}
.fas,
.#{$fa-css-prefix}-classic,
.#{$fa-css-prefix}-solid,
.far,
.#{$fa-css-prefix}-regular,
.fal,
.#{$fa-css-prefix}-light,
.fat,
.#{$fa-css-prefix}-thin {
font-family: 'Font Awesome 6 Pro';
}
.fab,
.#{$fa-css-prefix}-brands {
font-family: 'Font Awesome 6 Brands';
}
.fad,
.#{$fa-css-prefix}-classic.#{$fa-css-prefix}-duotone,
.#{$fa-css-prefix}-duotone {
font-family: 'Font Awesome 6 Duotone';
}
.fass,
.#{$fa-css-prefix}-sharp {
font-family: 'Font Awesome 6 Sharp';
font-weight: 900;
}
%fa-icon {
@include fa-icon;
}

View File

@@ -0,0 +1,10 @@
// specific duotone icon class definition
// -------------------------
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */
@each $name, $icon in $fa-icons {
.fad.#{$fa-css-prefix}-#{$name}::after, .#{$fa-css-prefix}-duotone.#{$fa-css-prefix}-#{$name}::after {
content: unquote("\"#{ $icon }#{ $icon }\"");
}
}

View File

@@ -0,0 +1,7 @@
// fixed-width icons
// -------------------------
.#{$fa-css-prefix}-fw {
text-align: center;
width: $fa-fw-width;
}

View File

@@ -0,0 +1,57 @@
// functions
// --------------------------
// fa-content: convenience function used to set content property
@function fa-content($fa-var) {
@return unquote("\"#{ $fa-var }\"");
}
// fa-divide: Originally obtained from the Bootstrap https://github.com/twbs/bootstrap
//
// Licensed under: The MIT License (MIT)
//
// Copyright (c) 2011-2021 Twitter, Inc.
// Copyright (c) 2011-2021 The Bootstrap Authors
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
@function fa-divide($dividend, $divisor, $precision: 10) {
$sign: if($dividend > 0 and $divisor > 0, 1, -1);
$dividend: abs($dividend);
$divisor: abs($divisor);
$quotient: 0;
$remainder: $dividend;
@if $dividend == 0 {
@return 0;
}
@if $divisor == 0 {
@error "Cannot divide by 0";
}
@if $divisor == 1 {
@return $dividend;
}
@while $remainder >= $divisor {
$quotient: $quotient + 1;
$remainder: $remainder - $divisor;
}
@if $remainder > 0 and $precision > 0 {
$remainder: fa-divide($remainder * 10, $divisor, $precision - 1) * .1;
}
@return ($quotient + $remainder) * $sign;
}

View File

@@ -0,0 +1,9 @@
// specific icon class definition
// -------------------------
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
@each $name, $icon in $fa-icons {
.#{$fa-css-prefix}-#{$name}::before { content: unquote("\"#{ $icon }\""); }
}

18
src/styles/fa/_list.scss Normal file
View File

@@ -0,0 +1,18 @@
// icons in a list
// -------------------------
.#{$fa-css-prefix}-ul {
list-style-type: none;
margin-left: var(--#{$fa-css-prefix}-li-margin, #{$fa-li-margin});
padding-left: 0;
> li { position: relative; }
}
.#{$fa-css-prefix}-li {
left: calc(var(--#{$fa-css-prefix}-li-width, #{$fa-li-width}) * -1);
position: absolute;
text-align: center;
width: var(--#{$fa-css-prefix}-li-width, #{$fa-li-width});
line-height: inherit;
}

121
src/styles/fa/_mixins.scss Normal file
View File

@@ -0,0 +1,121 @@
// mixins
// --------------------------
// base rendering for an icon
@mixin fa-icon {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
display: inline-block;
font-style: normal;
font-variant: normal;
font-weight: normal;
line-height: 1;
}
// sets relative font-sizing and alignment (in _sizing)
@mixin fa-size ($font-size) {
font-size: fa-divide($font-size, $fa-size-scale-base) * 1em; // converts step in sizing scale into an em-based value that's relative to the scale's base
line-height: fa-divide(1, $font-size) * 1em; // sets the line-height of the icon back to that of it's parent
vertical-align: (fa-divide(6, $font-size) - fa-divide(3, 8)) * 1em; // vertically centers the icon taking into account the surrounding text's descender
}
// only display content to screen readers
// see: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/
// see: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
@mixin fa-sr-only() {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
// use in conjunction with .sr-only to only display content when it's focused
@mixin fa-sr-only-focusable() {
&:not(:focus) {
@include fa-sr-only();
}
}
// sets a specific icon family to use alongside style + icon mixins
@mixin fa-family-classic() {
font-family: 'Font Awesome 6 Pro';
}
@mixin fa-family-sharp() {
font-family: 'Font Awesome 6 Sharp';
}
// convenience mixins for declaring pseudo-elements by CSS variable,
// including all style-specific font properties, and both the ::before
// and ::after elements in the duotone case.
@mixin fa-icon-solid($fa-var) {
@extend %fa-icon;
@extend .fa-solid;
&::before {
content: unquote("\"#{ $fa-var }\"");
}
}
@mixin fa-icon-regular($fa-var) {
@extend %fa-icon;
@extend .fa-regular;
&::before {
content: unquote("\"#{ $fa-var }\"");
}
}
@mixin fa-icon-light($fa-var) {
@extend %fa-icon;
@extend .fa-light;
&::before {
content: unquote("\"#{ $fa-var }\"");
}
}
@mixin fa-icon-thin($fa-var) {
@extend %fa-icon;
@extend .fa-thin;
&::before {
content: unquote("\"#{ $fa-var }\"");
}
}
@mixin fa-icon-duotone($fa-var) {
@extend %fa-icon;
@extend .fa-duotone;
&::before {
content: unquote("\"#{ $fa-var }\"");
}
&::after {
content: unquote("\"#{ $fa-var }#{ $fa-var }\"");
}
}
@mixin fa-icon-sharp-solid($fa-var) {
@extend %fa-icon;
@extend .fa-sharp-solid;
&::before {
content: unquote("\"#{ $fa-var }\"");
}
}
@mixin fa-icon-brands($fa-var) {
@extend %fa-icon;
@extend .fa-brands;
&::before {
content: unquote("\"#{ $fa-var }\"");
}
}

View File

@@ -0,0 +1,31 @@
// rotating + flipping icons
// -------------------------
.#{$fa-css-prefix}-rotate-90 {
transform: rotate(90deg);
}
.#{$fa-css-prefix}-rotate-180 {
transform: rotate(180deg);
}
.#{$fa-css-prefix}-rotate-270 {
transform: rotate(270deg);
}
.#{$fa-css-prefix}-flip-horizontal {
transform: scale(-1, 1);
}
.#{$fa-css-prefix}-flip-vertical {
transform: scale(1, -1);
}
.#{$fa-css-prefix}-flip-both,
.#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical {
transform: scale(-1, -1);
}
.#{$fa-css-prefix}-rotate-by {
transform: rotate(var(--#{$fa-css-prefix}-rotate-angle, none));
}

View File

@@ -0,0 +1,14 @@
// screen-reader utilities
// -------------------------
// only display content to screen readers
.sr-only,
.#{$fa-css-prefix}-sr-only {
@include fa-sr-only;
}
// use in conjunction with .sr-only to only display content when it's focused
.sr-only-focusable,
.#{$fa-css-prefix}-sr-only-focusable {
@include fa-sr-only-focusable;
}

2042
src/styles/fa/_shims.scss Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,16 @@
// sizing icons
// -------------------------
// literal magnification scale
@for $i from 1 through 10 {
.#{$fa-css-prefix}-#{$i}x {
font-size: $i * 1em;
}
}
// step-based scale (with alignment)
@each $size, $value in $fa-sizes {
.#{$fa-css-prefix}-#{$size} {
@include fa-size($value);
}
}

View File

@@ -0,0 +1,32 @@
// stacking icons
// -------------------------
.#{$fa-css-prefix}-stack {
display: inline-block;
height: 2em;
line-height: 2em;
position: relative;
vertical-align: $fa-stack-vertical-align;
width: $fa-stack-width;
}
.#{$fa-css-prefix}-stack-1x,
.#{$fa-css-prefix}-stack-2x {
left: 0;
position: absolute;
text-align: center;
width: 100%;
z-index: var(--#{$fa-css-prefix}-stack-z-index, #{$fa-stack-z-index});
}
.#{$fa-css-prefix}-stack-1x {
line-height: inherit;
}
.#{$fa-css-prefix}-stack-2x {
font-size: 2em;
}
.#{$fa-css-prefix}-inverse {
color: var(--#{$fa-css-prefix}-inverse, #{$fa-inverse});
}

File diff suppressed because it is too large Load Diff

30
src/styles/fa/brands.scss Normal file
View File

@@ -0,0 +1,30 @@
/*!
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
* Copyright 2022 Fonticons, Inc.
*/
@import 'functions';
@import 'variables';
:root, :host {
--#{$fa-css-prefix}-style-family-brands: 'Font Awesome 6 Brands';
--#{$fa-css-prefix}-font-brands: normal 400 1em/1 'Font Awesome 6 Brands';
}
@font-face {
font-family: 'Font Awesome 6 Brands';
font-style: normal;
font-weight: 400;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'),
url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype');
}
.fab,
.#{$fa-css-prefix}-brands {
font-weight: 400;
}
@each $name, $icon in $fa-brand-icons {
.#{$fa-css-prefix}-#{$name}:before { content: unquote("\"#{ $icon }\""); }
}

View File

@@ -0,0 +1,65 @@
/*!
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
* Copyright 2022 Fonticons, Inc.
*/
@import 'functions';
@import 'variables';
:root, :host {
--#{$fa-css-prefix}-style-family-duotone: 'Font Awesome 6 Duotone';
--#{$fa-css-prefix}-font-duotone: normal 900 1em/1 'Font Awesome 6 Duotone';
}
@font-face {
font-family: 'Font Awesome 6 Duotone';
font-style: normal;
font-weight: 900;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-duotone-900.woff2') format('woff2'),
url('#{$fa-font-path}/fa-duotone-900.ttf') format('truetype');
}
.fad,
.#{$fa-css-prefix}-duotone {
position: relative;
font-weight: 900;
letter-spacing: normal;
}
.fad::before,
.#{$fa-css-prefix}-duotone::before {
position: absolute;
color: var(--#{$fa-css-prefix}-primary-color, inherit);
opacity: var(--#{$fa-css-prefix}-primary-opacity, #{$fa-primary-opacity});
}
.fad::after,
.#{$fa-css-prefix}-duotone::after {
color: var(--#{$fa-css-prefix}-secondary-color, inherit);
opacity: var(--#{$fa-css-prefix}-secondary-opacity, #{$fa-secondary-opacity});
}
.#{$fa-css-prefix}-swap-opacity .fad::before,
.#{$fa-css-prefix}-swap-opacity .fa-duotone::before,
.fad.#{$fa-css-prefix}-swap-opacity::before,
.fa-duotone.#{$fa-css-prefix}-swap-opacity::before {
opacity: var(--#{$fa-css-prefix}-secondary-opacity, #{$fa-secondary-opacity});
}
.#{$fa-css-prefix}-swap-opacity .fad::after,
.#{$fa-css-prefix}-swap-opacity .fa-duotone::after,
.fad.#{$fa-css-prefix}-swap-opacity::after,
.fa-duotone.#{$fa-css-prefix}-swap-opacity::after {
opacity: var(--#{$fa-css-prefix}-primary-opacity, #{$fa-primary-opacity});
}
.fad.#{$fa-css-prefix}-inverse,
.#{$fa-css-prefix}-duotone.#{$fa-css-prefix}-inverse {
color: var(--#{$fa-css-prefix}-inverse, $fa-inverse);
}
.fad.#{$fa-css-prefix}-stack-1x, .fad.#{$fa-css-prefix}-stack-2x,
.#{$fa-css-prefix}-duotone.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-duotone.#{$fa-css-prefix}-stack-2x {
position: absolute;
}

21
src/styles/fa/fontawesome.scss vendored Normal file
View File

@@ -0,0 +1,21 @@
/*!
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
* Copyright 2022 Fonticons, Inc.
*/
// Font Awesome core compile (Web Fonts-based)
// -------------------------
@import 'functions';
@import 'variables';
@import 'mixins';
@import 'core';
@import 'sizing';
@import 'fixed-width';
@import 'list';
@import 'bordered-pulled';
@import 'animated';
@import 'rotated-flipped';
@import 'stacked';
@import 'icons';
@import 'screen-reader';

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

26
src/styles/fa/light.scss Normal file
View File

@@ -0,0 +1,26 @@
/*!
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
* Copyright 2022 Fonticons, Inc.
*/
@import 'functions';
@import 'variables';
:root, :host {
--#{$fa-css-prefix}-style-family-classic: '#{ $fa-style-family }';
--#{$fa-css-prefix}-font-light: normal 300 1em/1 '#{ $fa-style-family }';
}
@font-face {
font-family: 'Font Awesome 6 Pro';
font-style: normal;
font-weight: 300;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-light-300.woff2') format('woff2'),
url('#{$fa-font-path}/fa-light-300.ttf') format('truetype');
}
.fal,
.#{$fa-css-prefix}-light {
font-weight: 300;
}

View File

@@ -0,0 +1,26 @@
/*!
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
* Copyright 2022 Fonticons, Inc.
*/
@import 'functions';
@import 'variables';
:root, :host {
--#{$fa-css-prefix}-style-family-classic: '#{ $fa-style-family }';
--#{$fa-css-prefix}-font-regular: normal 400 1em/1 '#{ $fa-style-family }';
}
@font-face {
font-family: 'Font Awesome 6 Pro';
font-style: normal;
font-weight: 400;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype');
}
.far,
.#{$fa-css-prefix}-regular {
font-weight: 400;
}

View File

@@ -0,0 +1,26 @@
/*!
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
* Copyright 2022 Fonticons, Inc.
*/
@import 'functions';
@import 'variables';
:root, :host {
--#{$fa-css-prefix}-style-family-sharp: 'Font Awesome 6 Sharp';
--#{$fa-css-prefix}-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp';
}
@font-face {
font-family: 'Font Awesome 6 Sharp';
font-style: normal;
font-weight: 900;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-sharp-solid-900.woff2') format('woff2'),
url('#{$fa-font-path}/fa-sharp-solid-900.ttf') format('truetype');
}
.fass,
.#{$fa-css-prefix}-sharp-solid {
font-weight: 900;
}

26
src/styles/fa/solid.scss Normal file
View File

@@ -0,0 +1,26 @@
/*!
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
* Copyright 2022 Fonticons, Inc.
*/
@import 'functions';
@import 'variables';
:root, :host {
--#{$fa-css-prefix}-style-family-classic: '#{ $fa-style-family }';
--#{$fa-css-prefix}-font-solid: normal 900 1em/1 '#{ $fa-style-family }';
}
@font-face {
font-family: 'Font Awesome 6 Pro';
font-style: normal;
font-weight: 900;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype');
}
.fas,
.#{$fa-css-prefix}-solid {
font-weight: 900;
}

26
src/styles/fa/thin.scss Normal file
View File

@@ -0,0 +1,26 @@
/*!
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
* Copyright 2022 Fonticons, Inc.
*/
@import 'functions';
@import 'variables';
:root, :host {
--#{$fa-css-prefix}-style-family-classic: '#{ $fa-style-family }';
--#{$fa-css-prefix}-font-thin: normal 100 1em/1 '#{ $fa-style-family }';
}
@font-face {
font-family: 'Font Awesome 6 Pro';
font-style: normal;
font-weight: 100;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-thin-100.woff2') format('woff2'),
url('#{$fa-font-path}/fa-thin-100.ttf') format('truetype');
}
.fat,
.#{$fa-css-prefix}-thin {
font-weight: 100;
}

View File

@@ -0,0 +1,11 @@
/*!
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
* Copyright 2022 Fonticons, Inc.
*/
// V4 shims compile (Web Fonts-based)
// -------------------------
@import 'functions';
@import 'variables';
@import 'shims';

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,148 @@
.heightgraph-container {
background-color: rgba(250,250,250,.8);
border-radius: 10px;
display: none;
cursor: default;
user-select: none;
}
.heightgraph-toggle {
cursor: pointer;
box-shadow: 0 1px 7px rgba(0, 0, 0, .4);
border-radius: 5px;
width: 28px;
height: 28px;
background: #f8f8f9;
display: block;
}
.heightgraph-toggle-icon {
background: url(img/area-chart.svg) no-repeat center center;
background-size: 14px 14px;
width: 26px;
height: 26px;
position: absolute;
}
.heightgraph-close-icon {
background: url(img/remove.svg) no-repeat center center;
background-size: 14px 14px;
width: 26px;
height: 26px;
position: absolute;
right: 0;
display: none;
cursor: pointer;
}
.border-top {
fill: none;
}
.legend-hover {
cursor: pointer;
}
.legend-text {
fill: #000;
font-size: 10px;
cursor: pointer;
}
.tick, .tick text {
fill: #000;
pointer-events: none;
}
.axis .tick line {
visibility: hidden;
pointer-events: none;
}
.axis path {
stroke: black;
fill: none;
stroke-width: 2px;
shape-rendering: crispEdges;
pointer-events: none;
}
.focusbox {
display: none;
font-size: 10px;
fill: #000;
pointer-events: none;
}
.focusbox rect {
fill: rgba(255, 255, 255, 0.8);
stroke-width: 1px;
stroke: #888;
pointer-events: none;
}
.focusbox text {
font-size: 12px;
}
.focusLine line {
stroke-width: 1px;
stroke: rgb(20, 20, 20);
display: none;
cursor: default;
shape-rendering: crispEdges;
}
.height-focus.label rect {
fill: rgba(255, 255, 255, 0.5);
stroke-width: 1px;
stroke: #888;
pointer-events: none;
shape-rendering: crispEdges;
}
.height-focus.line {
stroke: rgb(20, 20, 20);
stroke-width: 1px;
shape-rendering: crispEdges;
}
.height-focus.circle {
stroke: #FFF;
stroke-width: 1px;
}
.mouse-height-box-text{
font-size: 12px;
}
.grid .tick {
pointer-events: none;
}
.grid .tick line {
stroke: #EEE;
stroke-width: 1px;
shape-rendering: crispEdges;
}
.grid path {
stroke-width: 0;
pointer-events: none;
}
.tspan {
font-weight: bold;
}
.select-symbol {
cursor: pointer;
}
.select-info {
cursor: default;
}
.lineSelection {
cursor: move;
}

16
src/styles/spot.scss Executable file
View File

@@ -0,0 +1,16 @@
/* Site Global CSS */
@import 'fonts';
@import 'common';
/* Modules */
@import 'fa';
@import 'lightbox';
@import 'simplebar';
@import 'leaflet';
/* Pages Specific CSS (masks) */
@import 'mask_project';
@import 'mask_upload';
@import 'mask_admin';
@import 'mobile';