added whole content
1
.gitignore
vendored
|
@ -11,4 +11,3 @@ dist
|
|||
content/.obsidian
|
||||
.DS_Store
|
||||
.obsidian
|
||||
content/**/*
|
||||
|
|
12
assets/svg/arch-logo.svg
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="65" height="65">
|
||||
<defs>
|
||||
<linearGradient id="a" x1="54.638%" x2="28.129%" y1="26.924%" y2="79.519%">
|
||||
<stop offset="0" stop-color="#fff" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#fff" stop-opacity=".27451"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path fill="#1793D1" d="M32.253.20991c-2.849 6.9843-4.579 11.559-7.75 18.336 1.944 2.061 4.334 4.453 8.211 7.164-4.168-1.715-7.009-3.432-9.133-5.219-4.059 8.47-10.423 20.531-23.328 43.719 10.14-5.854 18.002-9.466 25.328-10.844-.314-1.351-.481-2.819-.469-4.344l.008-.32c.161-6.498 3.542-11.495 7.547-11.156 4.004.339 7.122 5.884 6.961 12.383-.031 1.224-.173 2.4-.414 3.492 7.247 1.418 15.034 5.013 25.039 10.789-1.973-3.632-3.74-6.905-5.422-10.024-2.649-2.053-5.411-4.724-11.047-7.617 3.874 1.007 6.65 2.171 8.812 3.469-17.098-31.835-18.48-36.068-24.343-49.828V.20982z"/>
|
||||
<path fill="#fff" fill-opacity=".16568" d="M50.266 38.249C36.394 19.422 33.179 4.247 32.364.624c7.4 17.067 7.349 17.277 17.902 37.625z"/>
|
||||
<path fill="url(#a)" d="M32.378.45992c-.36.88448-.7 1.7468-1.032 2.5625-.364.8946-.718 1.7565-1.062 2.5938s-.693 1.6309-1.031 2.4375c-.339.8065-.654 1.6039-1 2.4063-.346.802-.726 1.613-1.094 2.437-.368.825-.752 1.658-1.156 2.532-.404.873-.828 1.801-1.282 2.75-.061.128-.124.276-.187.406 1.939 2.054 4.33 4.427 8.187 7.125-4.167-1.715-7-3.432-9.125-5.219-.11.226-.198.425-.312.656-.42.871-.871 1.733-1.344 2.688-.113.224-.196.427-.312.656-.501 1.004-1.026 2.043-1.594 3.156-.113.22-.228.402-.344.625-.343.667-1.44 2.77-2.562 4.907-.655 1.248-1.169 2.27-1.907 3.656-.209.398-.639 1.195-.75 1.406 8.125-4.573 16.891-11.216 32.813-5.531-.797-1.51-1.562-2.919-2.25-4.25-.688-1.332-1.312-2.571-1.906-3.75s-1.143-2.291-1.657-3.344c-.513-1.053-.989-2.047-1.437-3s-.885-1.87-1.281-2.75c-.397-.879-.766-1.73-1.125-2.562-.359-.833-.695-1.658-1.032-2.469-.336-.8115-.672-1.5896-1-2.4063-.142-.3554-.263-.7338-.406-1.0938-.888-2.0849-1.759-4.1515-2.812-6.625v.00002z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2 KiB |
883
assets/svg/desk.svg
Normal file
|
@ -0,0 +1,883 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="400"
|
||||
height="400"
|
||||
viewBox="0 0 105.83333 105.83333"
|
||||
version="1.1"
|
||||
id="svg377"
|
||||
inkscape:version="1.2 (dc2aeda, 2022-05-15)"
|
||||
sodipodi:docname="desk.svg"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview379"
|
||||
pagecolor="#1a1c23"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#505050"
|
||||
inkscape:document-units="px"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.969098"
|
||||
inkscape:cx="179.77775"
|
||||
inkscape:cy="208.47109"
|
||||
inkscape:window-width="1440"
|
||||
inkscape:window-height="847"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="g24030"><inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid8255"
|
||||
originx="0"
|
||||
originy="0" /></sodipodi:namedview><defs
|
||||
id="defs374"><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect2648"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.172605"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect16627"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.172605"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect16569"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.172605"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect16507"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.172605"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="skeletal"
|
||||
id="path-effect16503"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
pattern="M 0,4.9921384 C 0,2.236478 2.236478,0 4.9921384,0 c 2.7556604,0 4.9921384,2.236478 4.9921384,4.9921384 0,2.7556604 -2.236478,4.9921384 -4.9921384,4.9921384 C 2.236478,9.9842768 0,7.7477988 0,4.9921384 Z"
|
||||
copytype="single_stretched"
|
||||
prop_scale="0.003"
|
||||
scale_y_rel="false"
|
||||
spacing="0"
|
||||
normal_offset="0"
|
||||
tang_offset="0"
|
||||
prop_units="false"
|
||||
vertical_pattern="false"
|
||||
hide_knot="false"
|
||||
fuse_tolerance="0" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect15134"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="3.1251169e-15,1.172605"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect15072"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.5"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect14444"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,2"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect11193"
|
||||
is_visible="true"
|
||||
lpeversion="1" /><inkscape:path-effect
|
||||
effect="simplify"
|
||||
id="path-effect11191"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
steps="1"
|
||||
threshold="0.00159091"
|
||||
smooth_angles="360"
|
||||
helper_size="0"
|
||||
simplify_individual_paths="false"
|
||||
simplify_just_coalesce="false" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient27067"><stop
|
||||
style="stop-color:#272141;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop27063" /><stop
|
||||
style="stop-color:#272141;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop27065" /></linearGradient><linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient26828"><stop
|
||||
style="stop-color:#7664c7;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop26824" /><stop
|
||||
style="stop-color:#aa9ddd;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop26826" /></linearGradient><linearGradient
|
||||
id="a"
|
||||
x1="82.849998"
|
||||
y1="30.41"
|
||||
x2="51.259998"
|
||||
y2="105.9"
|
||||
gradientTransform="matrix(1,0,0,-1,-22.41,110.97)"
|
||||
gradientUnits="userSpaceOnUse"><stop
|
||||
offset="0"
|
||||
stop-color="#6c56cc"
|
||||
id="stop132" /><stop
|
||||
offset="1"
|
||||
stop-color="#9785e5"
|
||||
id="stop134" /></linearGradient><linearGradient
|
||||
id="a-1"
|
||||
x1="82.849998"
|
||||
y1="30.41"
|
||||
x2="51.259998"
|
||||
y2="105.9"
|
||||
gradientTransform="matrix(1,0,0,-1,-22.41,110.97)"
|
||||
gradientUnits="userSpaceOnUse"><stop
|
||||
offset="0"
|
||||
stop-color="#6c56cc"
|
||||
id="stop4693" /><stop
|
||||
offset="1"
|
||||
stop-color="#9785e5"
|
||||
id="stop4695" /></linearGradient><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient26828"
|
||||
id="linearGradient26830"
|
||||
x1="90.990067"
|
||||
y1="57.084557"
|
||||
x2="147.45816"
|
||||
y2="57.084557"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-21.166667)" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient27067"
|
||||
id="linearGradient27069"
|
||||
x1="82.112991"
|
||||
y1="49.686993"
|
||||
x2="83.345909"
|
||||
y2="85.441895"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.76986299,0,0,1,18.585121,0)" /><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="bsplinespiro"
|
||||
linkedpaths="#path14442,0,1"
|
||||
id="path-effect14446"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect14444-4"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.5"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="bsplinespiro"
|
||||
linkedpaths="#path15070,0,1"
|
||||
id="path-effect15074"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="bsplinespiro"
|
||||
linkedpaths="#path16505,0,1"
|
||||
id="path-effect16509"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="bsplinespiro"
|
||||
linkedpaths="#path16625,0,1"
|
||||
id="path-effect16629"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /><inkscape:path-effect
|
||||
effect="skeletal"
|
||||
id="path-effect16503-6"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
pattern="M 0,4.9921384 C 0,2.236478 2.236478,0 4.9921384,0 c 2.7556604,0 4.9921384,2.236478 4.9921384,4.9921384 0,2.7556604 -2.236478,4.9921384 -4.9921384,4.9921384 C 2.236478,9.9842768 0,7.7477988 0,4.9921384 Z"
|
||||
copytype="single_stretched"
|
||||
prop_scale="0.003"
|
||||
scale_y_rel="false"
|
||||
spacing="0"
|
||||
normal_offset="0"
|
||||
tang_offset="0"
|
||||
prop_units="false"
|
||||
vertical_pattern="false"
|
||||
hide_knot="false"
|
||||
fuse_tolerance="0" /><inkscape:path-effect
|
||||
effect="skeletal"
|
||||
id="path-effect16503-6-4"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
pattern="M 0,4.9921384 C 0,2.236478 2.236478,0 4.9921384,0 c 2.7556604,0 4.9921384,2.236478 4.9921384,4.9921384 0,2.7556604 -2.236478,4.9921384 -4.9921384,4.9921384 C 2.236478,9.9842768 0,7.7477988 0,4.9921384 Z"
|
||||
copytype="single_stretched"
|
||||
prop_scale="0.003"
|
||||
scale_y_rel="false"
|
||||
spacing="0"
|
||||
normal_offset="0"
|
||||
tang_offset="0"
|
||||
prop_units="false"
|
||||
vertical_pattern="false"
|
||||
hide_knot="false"
|
||||
fuse_tolerance="0" /><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="bsplinespiro"
|
||||
linkedpaths="#path2646,0,1"
|
||||
id="path-effect2650"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /></defs><g
|
||||
inkscape:label="Слой 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-33.042465,-7.8564459)"><ellipse
|
||||
style="opacity:0.0829146;fill:#fff6d5;stroke:#ffffff;stroke-width:0.264583;stroke-linecap:round"
|
||||
id="path6345"
|
||||
cx="84.323875"
|
||||
cy="53.136574"
|
||||
rx="44.874298"
|
||||
ry="43.739216" /><g
|
||||
id="g24030"
|
||||
transform="translate(0,29.299653)"><path
|
||||
style="fill:#005544;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 43.077494,67.886538 c 0,0 -10.563188,-26.407972 2.28869,-26.584026 12.85188,-0.176051 18.133474,8.2745 18.133474,8.2745 L 50.471726,80.914468 Z"
|
||||
id="path10040" /><path
|
||||
style="fill:#008066;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 35.507209,74.048395 c 0,0 2.288691,-12.323717 10.035029,-13.027929 7.746338,-0.704215 11.619507,1.760529 11.619507,1.760529 0,0 -20.422164,4.049223 -21.654536,11.2674 z"
|
||||
id="path10096" /><path
|
||||
style="fill:#002b22;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 47.302769,22.992987 c 0,0 7.218179,0.528159 7.218179,4.929487 0,4.401329 1.936584,4.753436 1.936584,4.753436 l 10.915295,-6.337914 c 0,0 2.464744,-14.084251 -20.070058,-3.345009 z"
|
||||
id="path12007" /><path
|
||||
style="fill:#008066;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 78.505547,15.586562 c 0,0 -9.322089,-2.497547 -10.673689,-5.097299 -1.351601,-2.599752 -1.351601,-2.599752 -1.351601,-2.599752 0,0 -1.978876,15.502334 2.604536,18.126752 4.583412,2.624418 9.420754,-10.429701 9.420754,-10.429701 z"
|
||||
id="path12063" /><path
|
||||
style="fill:#3d8d5c;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 48.998553,11.859954 c 0,0 16.725049,6.513966 20.24611,22.534802 3.521065,16.020836 8.802659,13.203984 8.802659,13.203984 0,0 -6.16186,-41.0203804 -29.048769,-35.738786 z"
|
||||
id="path10098" /><path
|
||||
style="fill:#008066;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 36.387475,49.224905 c 0,0 4.577382,-26.760078 16.548995,-21.302431 11.971614,5.457648 8.978709,12.147668 8.978709,12.147668 0,0 -25.527704,4.577381 -25.527704,9.154763 z"
|
||||
id="path9984" /><path
|
||||
style="fill:#aa9ddd;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 51.536383,38.220761 8.630493,-17.260988 16.274648,0.739756 z"
|
||||
id="path23885"
|
||||
sodipodi:nodetypes="cccc" /><path
|
||||
style="fill:#7462c7;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="M 77.674451,20.959773 102.08642,34.521978 88.524216,84.332261 H 54.248822 L 47.344427,37.974177 Z"
|
||||
id="path24086" /><path
|
||||
style="fill:#4a3d79;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="M 38.587699,84.676327 56.737787,69.598614 68.177941,85.662669 Z"
|
||||
id="path17377"
|
||||
sodipodi:nodetypes="cccc" /><path
|
||||
style="fill:#7d69d6;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="M 62.080026,84.825431 50.490504,59.180533 70.217349,26.877825 97.095173,49.810283 86.491997,84.578845 Z"
|
||||
id="path21660"
|
||||
sodipodi:nodetypes="cccccc" /><path
|
||||
style="fill:#005544;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 112.97059,34.084335 c 0,0 14.78846,1.760532 17.60531,10.915295 2.81685,9.154763 4.40133,15.140569 4.40133,15.140569 0,0 -12.85188,-4.753435 -14.78846,-6.16186 -1.93659,-1.408424 -7.21818,-19.894004 -7.21818,-19.894004 z"
|
||||
id="path11038" /><path
|
||||
style="fill:#367d52;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 71.372354,32.473566 c 0,0 9.481367,-25.4392983 20.227015,-17.847428 10.745641,7.591876 6.5591,13.6074 6.5591,13.6074 0,0 -25.933574,-0.25726 -26.786115,4.240028 z"
|
||||
id="path429" /><path
|
||||
style="fill:#005544;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 97.131114,35.715805 c 0,0 -0.528159,-12.323719 5.457646,-13.027932 5.98581,-0.704212 10.21109,-1.056318 12.14767,-2.28869 1.93658,-1.232372 -8.2745,7.922391 -8.09845,12.147666 0.17606,4.225275 -0.3521,5.809754 -0.3521,5.809754 z"
|
||||
id="path11195" /><path
|
||||
style="fill:#367d52;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 103.11161,31.61959 c 0,0 18.83769,-19.541898 24.99955,-3.521062 6.16186,16.020836 8.2745,16.725048 8.2745,16.725048 0,0 -8.2745,-6.16186 -10.56319,-2.464744 -2.28869,3.697115 -5.10554,4.929489 -5.10554,4.929489 z"
|
||||
id="path11036" /><path
|
||||
style="fill:#a49ec7;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 79.440242,34.768565 26.138058,-9.863424 6.65781,4.191956 z"
|
||||
id="path24211" /><path
|
||||
style="fill:#4a3d79;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 105.79187,83.617993 18.1501,-15.077713 11.44016,16.064055 z"
|
||||
id="path17239"
|
||||
sodipodi:nodetypes="cccc" /><path
|
||||
style="fill:url(#linearGradient26830);fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="M 111.49635,28.110754 126.29148,51.536382 93.495606,84.578845 69.823402,83.099332 78.947072,34.028808 Z"
|
||||
id="path25779"
|
||||
sodipodi:nodetypes="cccccc" /><path
|
||||
style="fill:#7664c7;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 80.426582,84.332261 8.630497,-25.891484 27.864151,-7.150981 13.0477,21.640087 -3.75445,11.461946 z"
|
||||
id="path26955"
|
||||
sodipodi:nodetypes="cccccc" /><path
|
||||
style="fill:#008066;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 51.486319,69.258877 c -0.160029,-0.293916 0.727734,-1.11526 2.183984,-2.111028 0.728753,-0.701097 1.686772,-1.734046 1.960785,-2.782358 0.06435,-0.246209 0.09112,-0.489178 0.07755,-0.730654 0.02634,-1.997605 0.934283,-3.516324 1.87998,-4.346575 v 0 c 0.466059,-0.402933 0.915701,-0.631886 1.251562,-0.735632 v 0 c 0.177516,-0.05485 0.326035,-0.07627 0.438578,-0.07009 v 0 h 10e-7 c 0.05919,0.0025 0.107608,0.01228 0.14539,0.02912 v 0 0 c 0.06322,0.07321 0.08121,0.07804 0.08431,0.078 4.02e-4,-6e-6 3.17e-4,3.4e-5 3.17e-4,3.3e-5 0,-10e-7 8.4e-5,-4.2e-5 -1.71e-4,2.64e-4 -0.002,0.0024 -0.0095,0.01944 0.01128,0.114657 v 0 0 c -0.006,0.03901 -0.01986,0.08312 -0.04042,0.130516 v 0 0 c -0.04246,0.09304 -0.114849,0.207852 -0.206544,0.339288 v 0 c -0.180233,0.258685 -0.42238,0.574407 -0.678745,0.996279 v 0 c -0.510224,0.830196 -0.935758,1.991266 -0.909354,3.464137 -0.01356,0.42817 -0.07953,0.849674 -0.194956,1.259336 -0.512573,1.819116 -1.860299,3.011899 -2.953713,3.626081 -1.711031,0.727661 -2.889362,1.033355 -3.049834,0.738623 z"
|
||||
id="path16501"
|
||||
class="UnoptimicedTransforms"
|
||||
transform="translate(-2.4676395,1.8512626)" /><path
|
||||
sodipodi:type="star"
|
||||
style="fill:#ffde00;fill-opacity:1;stroke:#e9afaf;stroke-width:0.265429;stroke-linecap:round;stroke-dasharray:none"
|
||||
id="path21868"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="5"
|
||||
sodipodi:cx="115.60865"
|
||||
sodipodi:cy="43.149708"
|
||||
sodipodi:r1="33.4692"
|
||||
sodipodi:r2="22.417078"
|
||||
sodipodi:arg1="0.85425465"
|
||||
sodipodi:arg2="1.5049747"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="M 137.59058,68.388216 117.08311,65.518242 98.398192,71.85489 94.790544,51.464263 82.990076,35.651978 101.26789,25.919851 112.65972,9.810674 l 14.90396,14.375841 18.84101,5.856266 -9.06666,18.616886 z"
|
||||
transform="matrix(0.09437718,-0.03209576,0.0320931,0.09436935,42.287363,66.122681)"
|
||||
inkscape:transform-center-x="0.21725074"
|
||||
inkscape:transform-center-y="0.1048688" /><rect
|
||||
style="fill:url(#linearGradient27069);fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect27009"
|
||||
width="69.290535"
|
||||
height="30.823196"
|
||||
x="46.1115"
|
||||
y="53.262482"
|
||||
rx="1.7278203"
|
||||
ry="2.6945567" /><path
|
||||
style="fill:#4a3d79;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="M 93.309992,84.723982 105.63927,70.175436 122.90026,85.710324 Z"
|
||||
id="path27125" /><path
|
||||
style="fill:#005544;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="M 92.372372,29.3309 102.58345,12.253745"
|
||||
id="path11189"
|
||||
inkscape:path-effect="#path-effect11191;#path-effect11193"
|
||||
inkscape:original-d="M 92.372372,29.3309 102.58345,12.253745" /><path
|
||||
style="fill:#009879;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 51.486319,69.258877 c -0.160029,-0.293916 0.727734,-1.11526 2.183984,-2.111028 0.728753,-0.701097 1.686772,-1.734046 1.960785,-2.782358 0.06435,-0.246209 0.09112,-0.489178 0.07755,-0.730654 0.02634,-1.997605 0.934283,-3.516324 1.87998,-4.346575 v 0 c 0.466059,-0.402933 0.915701,-0.631886 1.251562,-0.735632 v 0 c 0.177516,-0.05485 0.326035,-0.07627 0.438578,-0.07009 v 0 h 10e-7 c 0.05919,0.0025 0.107608,0.01228 0.14539,0.02912 v 0 0 c 0.06322,0.07321 0.08121,0.07804 0.08431,0.078 4.02e-4,-6e-6 3.17e-4,3.4e-5 3.17e-4,3.3e-5 0,-10e-7 8.4e-5,-4.2e-5 -1.71e-4,2.64e-4 -0.002,0.0024 -0.0095,0.01944 0.01128,0.114657 v 0 0 c -0.006,0.03901 -0.01986,0.08312 -0.04042,0.130516 v 0 0 c -0.04246,0.09304 -0.114849,0.207852 -0.206544,0.339288 v 0 c -0.180233,0.258685 -0.42238,0.574407 -0.678745,0.996279 v 0 c -0.510224,0.830196 -0.935758,1.991266 -0.909354,3.464137 -0.01356,0.42817 -0.07953,0.849674 -0.194956,1.259336 -0.512573,1.819116 -1.860299,3.011899 -2.953713,3.626081 -1.711031,0.727661 -2.889362,1.033355 -3.049834,0.738623 z"
|
||||
id="path16501-2"
|
||||
class="UnoptimicedTransforms"
|
||||
transform="rotate(23.290684,198.12544,165.62467)" /><path
|
||||
style="fill:#009879;fill-opacity:1;stroke:none;stroke-width:0.120931;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 51.486319,69.258877 c -0.160029,-0.293916 0.727734,-1.11526 2.183984,-2.111028 0.728753,-0.701097 1.686772,-1.734046 1.960785,-2.782358 0.06435,-0.246209 0.09112,-0.489178 0.07755,-0.730654 0.02634,-1.997605 0.934283,-3.516324 1.87998,-4.346575 v 0 c 0.466059,-0.402933 0.915701,-0.631886 1.251562,-0.735632 v 0 c 0.177516,-0.05485 0.326035,-0.07627 0.438578,-0.07009 v 0 h 10e-7 c 0.05919,0.0025 0.107608,0.01228 0.14539,0.02912 v 0 0 c 0.06322,0.07321 0.08121,0.07804 0.08431,0.078 4.02e-4,-6e-6 3.17e-4,3.4e-5 3.17e-4,3.3e-5 0,-10e-7 8.4e-5,-4.2e-5 -1.71e-4,2.64e-4 -0.002,0.0024 -0.0095,0.01944 0.01128,0.114657 v 0 0 c -0.006,0.03901 -0.01986,0.08312 -0.04042,0.130516 v 0 0 c -0.04246,0.09304 -0.114849,0.207852 -0.206544,0.339288 v 0 c -0.180233,0.258685 -0.42238,0.574407 -0.678745,0.996279 v 0 c -0.510224,0.830196 -0.935758,1.991266 -0.909354,3.464137 -0.01356,0.42817 -0.07953,0.849674 -0.194956,1.259336 -0.512573,1.819116 -1.860299,3.011899 -2.953713,3.626081 -1.711031,0.727661 -2.889362,1.033355 -3.049834,0.738623 z"
|
||||
id="path19371"
|
||||
class="UnoptimicedTransforms"
|
||||
transform="matrix(0.75953362,0.32696046,-0.32696046,0.75953362,30.315147,-45.43001)" /><path
|
||||
style="fill:#009879;fill-opacity:1;stroke:none;stroke-width:0.120931;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 51.486319,69.258877 c -0.160029,-0.293916 0.727734,-1.11526 2.183984,-2.111028 0.728753,-0.701097 1.686772,-1.734046 1.960785,-2.782358 0.06435,-0.246209 0.09112,-0.489178 0.07755,-0.730654 0.02634,-1.997605 0.934283,-3.516324 1.87998,-4.346575 v 0 c 0.466059,-0.402933 0.915701,-0.631886 1.251562,-0.735632 v 0 c 0.177516,-0.05485 0.326035,-0.07627 0.438578,-0.07009 v 0 h 10e-7 c 0.05919,0.0025 0.107608,0.01228 0.14539,0.02912 v 0 0 c 0.06322,0.07321 0.08121,0.07804 0.08431,0.078 4.02e-4,-6e-6 3.17e-4,3.4e-5 3.17e-4,3.3e-5 0,-10e-7 8.4e-5,-4.2e-5 -1.71e-4,2.64e-4 -0.002,0.0024 -0.0095,0.01944 0.01128,0.114657 v 0 0 c -0.006,0.03901 -0.01986,0.08312 -0.04042,0.130516 v 0 0 c -0.04246,0.09304 -0.114849,0.207852 -0.206544,0.339288 v 0 c -0.180233,0.258685 -0.42238,0.574407 -0.678745,0.996279 v 0 c -0.510224,0.830196 -0.935758,1.991266 -0.909354,3.464137 -0.01356,0.42817 -0.07953,0.849674 -0.194956,1.259336 -0.512573,1.819116 -1.860299,3.011899 -2.953713,3.626081 -1.711031,0.727661 -2.889362,1.033355 -3.049834,0.738623 z"
|
||||
id="path20202"
|
||||
class="UnoptimicedTransforms"
|
||||
transform="matrix(0.75953362,0.32696046,-0.32696046,0.75953362,105.92381,4.1141304)" /><path
|
||||
sodipodi:type="star"
|
||||
style="fill:#ffde00;fill-opacity:1;stroke:#e9afaf;stroke-width:0.20046;stroke-linecap:round;stroke-dasharray:none"
|
||||
id="path21812"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="5"
|
||||
sodipodi:cx="115.60865"
|
||||
sodipodi:cy="43.149708"
|
||||
sodipodi:r1="33.4692"
|
||||
sodipodi:r2="22.417078"
|
||||
sodipodi:arg1="0.85425465"
|
||||
sodipodi:arg2="1.5049747"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="M 137.59058,68.388216 117.08311,65.518242 98.398192,71.85489 94.790544,51.464263 82.990076,35.651978 101.26789,25.919851 112.65972,9.810674 l 14.90396,14.375841 18.84101,5.856266 -9.06666,18.616886 z"
|
||||
transform="matrix(0.13199147,0,0,0.13198483,30.491985,24.169802)"
|
||||
inkscape:transform-center-x="0.1202799"
|
||||
inkscape:transform-center-y="-0.30579944" /><path
|
||||
sodipodi:type="star"
|
||||
style="fill:#ffde00;fill-opacity:1;stroke:#e9afaf;stroke-width:0.265429;stroke-linecap:round;stroke-dasharray:none"
|
||||
id="path21866"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="5"
|
||||
sodipodi:cx="115.60865"
|
||||
sodipodi:cy="43.149708"
|
||||
sodipodi:r1="33.4692"
|
||||
sodipodi:r2="22.417078"
|
||||
sodipodi:arg1="0.85425465"
|
||||
sodipodi:arg2="1.5049747"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="M 137.59058,68.388216 117.08311,65.518242 98.398192,71.85489 94.790544,51.464263 82.990076,35.651978 101.26789,25.919851 112.65972,9.810674 l 14.90396,14.375841 18.84101,5.856266 -9.06666,18.616886 z"
|
||||
transform="matrix(0.09437718,-0.03209576,0.0320931,0.09436935,97.163409,16.962346)"
|
||||
inkscape:transform-center-x="0.21725074"
|
||||
inkscape:transform-center-y="0.1048688" /></g><rect
|
||||
style="fill:#1e949d;fill-opacity:1;stroke-width:0.529169;stroke-linecap:round"
|
||||
id="rect3427"
|
||||
width="4.068573"
|
||||
height="37.379955"
|
||||
x="44.403294"
|
||||
y="76.342461" /><rect
|
||||
style="fill:#1e949d;fill-opacity:1;stroke-width:0.529169;stroke-linecap:round"
|
||||
id="rect3429"
|
||||
width="4.068573"
|
||||
height="37.379955"
|
||||
x="114.36745"
|
||||
y="76.342461" /><g
|
||||
id="g3613"
|
||||
transform="translate(-1.5875,29.299653)"><rect
|
||||
style="fill:#2e3436;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect3591"
|
||||
width="14.87463"
|
||||
height="5.6824427"
|
||||
x="77.019463"
|
||||
y="58.74715"
|
||||
rx="2.7971394"
|
||||
ry="2.7971394" /><rect
|
||||
style="fill:#2e3436;stroke-width:0.529166;stroke-linecap:round"
|
||||
id="rect3593"
|
||||
width="4.8467894"
|
||||
height="20.389942"
|
||||
x="82.033386"
|
||||
y="61.922153"
|
||||
rx="0.91142744"
|
||||
ry="10.036795" /><rect
|
||||
style="fill:#555753;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect3485"
|
||||
width="30.151196"
|
||||
height="6.1028495"
|
||||
x="69.220016"
|
||||
y="54.547783"
|
||||
rx="2.2259271"
|
||||
ry="2.7971394" /><rect
|
||||
style="fill:#555753;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect3595"
|
||||
width="14.87463"
|
||||
height="4.8467894"
|
||||
x="77.019463"
|
||||
y="78.468094"
|
||||
rx="2.7971394"
|
||||
ry="2.3857954" /><rect
|
||||
style="fill:#555753;stroke-width:0.529169;stroke-linecap:round"
|
||||
id="rect3597"
|
||||
width="3.8440056"
|
||||
height="4.8467894"
|
||||
x="74.679634"
|
||||
y="79.972267"
|
||||
rx="0.72285628"
|
||||
ry="2.3857954" /><rect
|
||||
style="fill:#555753;stroke-width:0.529169;stroke-linecap:round"
|
||||
id="rect3599"
|
||||
width="3.8440056"
|
||||
height="4.8467894"
|
||||
x="74.679634"
|
||||
y="79.4431"
|
||||
rx="0.72285628"
|
||||
ry="2.3857954" /><rect
|
||||
style="fill:#555753;stroke-width:0.529169;stroke-linecap:round"
|
||||
id="rect3601"
|
||||
width="3.8440056"
|
||||
height="4.8467894"
|
||||
x="90.025459"
|
||||
y="79.4431"
|
||||
rx="0.72285628"
|
||||
ry="2.3857954" /><rect
|
||||
style="fill:#555753;stroke-width:0.529169;stroke-linecap:round"
|
||||
id="rect3603"
|
||||
width="3.8440056"
|
||||
height="4.8467894"
|
||||
x="83.675461"
|
||||
y="79.4431"
|
||||
rx="0.72285628"
|
||||
ry="2.3857954" /><rect
|
||||
style="fill:#555753;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect3615"
|
||||
width="24.066816"
|
||||
height="31.754827"
|
||||
x="72.450905"
|
||||
y="24.568209"
|
||||
rx="2.7971394"
|
||||
ry="2.7971394" /></g><g
|
||||
id="g4098"
|
||||
transform="translate(0,29.299653)"><rect
|
||||
style="fill:#e25563;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round"
|
||||
id="rect515"
|
||||
width="15.294061"
|
||||
height="5.6006417"
|
||||
x="73.97023"
|
||||
y="17.821413"
|
||||
ry="2.8003209"
|
||||
rx="2.9080255" /><rect
|
||||
style="fill:#e25563;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round"
|
||||
id="rect2120"
|
||||
width="18.74061"
|
||||
height="5.6006417"
|
||||
x="72.246956"
|
||||
y="20.996416"
|
||||
ry="2.8003209"
|
||||
rx="3.5633552" /><path
|
||||
style="fill:#e25563;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 62.51675,45.129037 c 0,0 5.209438,-20.688776 6.945916,-21.460544 1.736481,-0.771769 22.188352,-2.701191 23.92483,-1.543537 1.73648,1.157653 11.769474,21.074658 11.383594,23.582907 -0.38589,2.508248 -9.647114,1.543537 -9.647114,1.543537 0,0 -35.694302,2.894132 -32.607226,-2.122363 z"
|
||||
id="path4167"
|
||||
sodipodi:nodetypes="cssscc" /><g
|
||||
id="g409"
|
||||
transform="matrix(-0.9990455,-0.04368162,-0.04368162,0.9990455,164.07193,1.4394407)"><rect
|
||||
style="fill:#483737;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect5342"
|
||||
width="2.496511"
|
||||
height="5.6171494"
|
||||
x="85.26133"
|
||||
y="12.498936"
|
||||
rx="1.0096776"
|
||||
ry="1.3883067" /><path
|
||||
id="path4221"
|
||||
style="fill:#f4e3d7;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 87.020409,17.890897 c 0,4.057806 -1.531886,6.775182 -5.402381,6.775182 -3.673419,0 -5.40238,-2.717377 -5.40238,-6.775182 0,-4.057804 1.040213,-7.244753 5.40238,-7.347307 4.560261,-0.107211 5.402381,3.289502 5.402381,7.347307 z"
|
||||
sodipodi:nodetypes="sssss" /><path
|
||||
id="rect647"
|
||||
style="fill:#483737;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="M 78.822398,8.6980178 C 81.716613,8.8657134 85.50922,7.5880839 87.505044,7.9081342 89.500869,8.2281846 87.907,12.79493 85.955674,12.910731 h -7.133276 c -1.259442,0 -2.273361,-0.891153 -2.273361,-1.998102 v -0.21651 c 0,-1.1069482 1.016489,-2.0709263 2.273361,-1.9981012 z"
|
||||
sodipodi:nodetypes="szcssss" /><rect
|
||||
style="fill:#483737;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect5214"
|
||||
width="2.496511"
|
||||
height="6.3973093"
|
||||
x="75.615196"
|
||||
y="11.818504"
|
||||
rx="1.0096776"
|
||||
ry="1.581127" /><rect
|
||||
style="fill:#f4e3d7;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect5345"
|
||||
width="2.028415"
|
||||
height="4.3688941"
|
||||
x="75.303131"
|
||||
y="15.092828"
|
||||
rx="2.4805279"
|
||||
ry="3.9196229" /><circle
|
||||
style="fill:#241c1c;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="path5520"
|
||||
cx="81.595558"
|
||||
cy="17.351255"
|
||||
r="0.3905766" /><path
|
||||
style="fill:#483737;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 76.61722,21.044801 c 0,0 1.263398,-1.329893 2.194323,-1.130409 0.930923,0.199485 1.455267,2.12402 1.987224,2.12402 0.531958,0 1.220962,-1.411154 1.795355,-1.196903 0.598451,0.223225 3.735119,0.172485 3.868111,0.203292 0.471601,0.109244 0.398965,1.196903 0.398965,1.196903 0,0 -1.134215,2.859269 -1.666173,3.258236 -0.531956,0.398968 -3.495404,0.388445 -3.995919,0.465463 -0.827164,0.127281 -5.342272,-4.480806 -4.581886,-4.920602 z"
|
||||
id="path7933"
|
||||
sodipodi:nodetypes="cszsscssc" /><rect
|
||||
style="fill:#634b4b;fill-opacity:1;stroke-width:0.529248;stroke-linecap:round"
|
||||
id="rect14429"
|
||||
width="2.134635"
|
||||
height="0.5133366"
|
||||
x="83.503838"
|
||||
y="22.479269"
|
||||
rx="0.2134635"
|
||||
ry="0.2566683"
|
||||
transform="matrix(0.99678408,-0.0801342,0.05533343,0.99846793,0,0)" /><path
|
||||
style="fill:#f4e3d7;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 82.114688,23.179529 c 0,0 0.243735,-2.004867 0.937567,-1.884874 0.654302,0.113157 2.42341,0.08723 2.804297,0.251817 0.602405,0.260316 -0.229263,1.948862 -0.570285,1.993976 -0.341023,0.04511 -0.852554,0.406035 -0.895183,0.04511 -0.04262,-0.360919 0.383651,-0.279564 0.08526,-0.369793 -0.298395,-0.09023 -1.125446,-0.574277 -1.125446,-0.168248 0,0.406034 0.341023,-0.03624 -0.170512,0.189335 -0.511532,0.225574 -1.150949,0.270689 -1.150949,0 0,-0.27069 0.08526,-0.05733 0.08526,-0.05733 z"
|
||||
id="path14435"
|
||||
sodipodi:nodetypes="csssssssscc" /><path
|
||||
style="opacity:1;fill:#ffbcbc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 85.642718,21.837124 -0.122436,0.330478 -1.265187,0.354644 -1.448841,-0.487634 0.16973,-0.311345 0.646347,0.09101 0.653172,-0.03859 0.721455,0.113778 z"
|
||||
id="path17981"
|
||||
sodipodi:nodetypes="ccccccccc" /><path
|
||||
id="path24683"
|
||||
style="fill:#e9c6af;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 84.235436,17.045652 1.160238,2.448221 -0.106183,0.310884 0.02947,2.55e-4 -0.0414,0.03595 -0.01777,0.05147 -0.03868,-0.0027 -0.198337,0.170816 -0.695423,-0.0066 -0.330095,0.06109 -0.310354,-0.165644 0.377309,-0.277305 0.399206,0.132803 0.396209,2.54e-4 0.177438,-0.260699 -0.906095,-2.262792 z" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#rect14429"
|
||||
id="use35559"
|
||||
transform="matrix(-1,0,0,1,166.72851,-0.07252989)" /><rect
|
||||
style="opacity:1;fill:#483737;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:round;stroke-dasharray:none"
|
||||
id="rect42602"
|
||||
width="2.7775736"
|
||||
height="2.5557561"
|
||||
x="-78.872025"
|
||||
y="11.783834"
|
||||
transform="scale(-1,1)"
|
||||
rx="1.0531088"
|
||||
ry="0.95542276" /><circle
|
||||
style="fill:#241c1c;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="circle1224"
|
||||
cx="85.780228"
|
||||
cy="17.384306"
|
||||
r="0.3905766" /></g><path
|
||||
style="fill:#e25563;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 62.714417,46.851257 c 0,0 -0.906801,-4.931711 1.251862,-6.904397 2.158664,-1.972683 4.74906,-3.698782 8.634653,-1.232927 3.885596,2.465856 23.097699,0.986341 26.119826,0.246584 3.022132,-0.739756 5.287922,4.979187 6.346392,6.904397 3.03401,5.51839 -42.350293,0.988665 -42.352733,0.986343 z"
|
||||
id="path19142"
|
||||
sodipodi:nodetypes="cssssc" /><ellipse
|
||||
style="fill:#f4e3d7;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="ellipse20742"
|
||||
cx="96.488617"
|
||||
cy="44.385399"
|
||||
rx="3.3289051"
|
||||
ry="2.3425627" /><ellipse
|
||||
style="fill:#f4e3d7;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="path20405"
|
||||
cx="70.030296"
|
||||
cy="44.385399"
|
||||
rx="3.3289051"
|
||||
ry="2.3425627" /><ellipse
|
||||
style="fill:#f4e3d7;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="ellipse20740"
|
||||
cx="70.030296"
|
||||
cy="44.385399"
|
||||
rx="3.3289051"
|
||||
ry="2.3425627" /><rect
|
||||
style="fill:#f4e3d7;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round"
|
||||
id="rect2174"
|
||||
width="1.0770465"
|
||||
height="7.754735"
|
||||
x="79.228043"
|
||||
y="24.79397"
|
||||
ry="0.53852326" /><rect
|
||||
style="fill:#f4e3d7;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round"
|
||||
id="rect2176"
|
||||
width="1.0770465"
|
||||
height="7.754735"
|
||||
x="83.516907"
|
||||
y="24.383343"
|
||||
ry="0.53852326" /><g
|
||||
id="g16832"
|
||||
transform="matrix(-1,0,0,1,166.83728,0)"><path
|
||||
id="path3942"
|
||||
style="fill:#535d6c;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 72.516082,55.483368 c -1.013754,-0.01451 -2.017183,0.172841 -2.964573,0.659938 -0.886971,0.515156 -0.870822,4.049349 -1.27289,5.052774 1.951668,6.700094 3.037245,10.781477 5.528791,17.273688 0.53932,1.782537 2.531788,1.927559 3.991924,1.977236 1.862443,0.595434 1.067526,-1.954974 1.411109,-3.169666 0.303907,-2.64372 0.154484,-5.303955 -0.140512,-7.939388 -0.439835,-4.196779 -1.026012,-8.373275 -1.615659,-12.547605 -1.530829,-0.697065 -3.248599,-1.282819 -4.93819,-1.306977 z"
|
||||
sodipodi:nodetypes="scccccccs" /><path
|
||||
style="fill:#373e48;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 68.328663,61.170347 0.582517,-13.09155 27.54171,0.246586 2.181333,10.356593 -7.642976,2.716223 c 0,0 -4.837973,-3.769939 -7.284934,-3.877159 -2.446961,-0.10722 -5.930996,2.518132 -5.930996,2.518132 0,0 -2.511496,-3.677671 -4.080309,-3.924506 -1.568813,-0.246835 -2.539451,0.812374 -3.475891,1.695447 -0.93644,0.883073 -1.890454,3.360234 -1.890454,3.360234 z"
|
||||
id="path16207"
|
||||
sodipodi:nodetypes="ccccczczzc" /><path
|
||||
style="fill:#535d6c;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 100.84061,57.454434 c -0.14605,2.345918 0.4899,4.866083 -0.71283,7.036617 -2.146149,5.21642 -4.292304,10.432838 -6.438459,15.649256 -1.397318,0.739756 -2.794636,1.479513 -4.191954,2.219269 -0.222389,-2.940301 -0.677265,-5.896118 -0.245477,-8.840835 0.32841,-3.875255 0.656821,-7.750511 0.985231,-11.625767 1.206074,-1.848161 2.332057,-3.758953 3.588289,-5.567891 1.58109,-1.591253 4.338306,-1.406095 5.895152,0.127081 0.395258,0.308597 0.764838,0.648719 1.120048,1.00227 z"
|
||||
id="path16645"
|
||||
sodipodi:nodetypes="cccccccc" /><g
|
||||
id="use2717"
|
||||
transform="matrix(-1,0,0,1,168.53609,0)"><path
|
||||
style="fill:#1c1f24;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round"
|
||||
d="m 68.050869,82.758267 c -0.192329,-0.46941 0.412534,-1.768357 0.818582,-2.394317 0.406048,-0.625961 0.614247,-1.01366 1.42502,-1.325762 0.810773,-0.312103 2.569686,-0.04374 3.265917,0.04706 0.696231,0.09081 -0.31934,-0.879311 0.556033,-0.736358 0.875368,0.142957 3.957381,1.834996 4.723921,1.310266 0.76654,-0.52473 -0.515026,-1.146623 0.344347,-1.147816 0.859373,-0.0012 1.505578,2.860097 1.147816,3.787794 -0.357762,0.927697 -0.772397,0.770087 -1.721726,1.033036 -0.949329,0.262949 -2.218167,0.04675 -3.902575,0 -1.684408,-0.04675 -5.115555,-0.05683 -6.198209,-0.344344 -1.082654,-0.287514 -0.266797,0.239847 -0.459126,-0.229563 z"
|
||||
id="path2719"
|
||||
sodipodi:nodetypes="zzzzzzzzzzzzz" /><path
|
||||
style="fill:#373e48;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round"
|
||||
d="m 68.050869,83.676519 c 0.171205,-0.519664 1.128684,-2.620848 1.951286,-2.639978 0.822602,-0.01913 1.467176,0.433517 2.289778,0.414385 0.822602,-0.01913 1.949984,1.577354 2.365674,1.536904 0.41569,-0.04045 4.229432,-0.08892 4.630714,-0.176962 0.401282,-0.08804 0.93463,-0.960656 1.044184,-0.626512 0.109554,0.334144 1.014458,1.463126 0.691104,2.000655 -0.323354,0.537529 -1.652986,0.369058 -1.936873,0.394318 -0.283887,0.02526 -10.768048,-0.09934 -10.806308,-0.214118 -0.03826,-0.114781 -0.191304,-0.573912 -0.229559,-0.688689 -0.03825,-0.114778 -0.171205,0.519661 0,-3e-6 z"
|
||||
id="path2721"
|
||||
sodipodi:nodetypes="zzzzzzzzzzz" /></g><g
|
||||
id="g2729"
|
||||
transform="matrix(-0.81460179,0,0,1,138.33577,0)"
|
||||
style="stroke-width:1.10797"><path
|
||||
style="fill:#1c1f24;fill-opacity:1;stroke:none;stroke-width:0.110797;stroke-linecap:round"
|
||||
d="m 68.050869,82.758267 c -0.192329,-0.46941 0.412534,-1.768357 0.818582,-2.394317 0.406048,-0.625961 0.614247,-1.01366 1.42502,-1.325762 0.810773,-0.312103 2.273247,-0.707811 2.969478,-0.617011 0.696231,0.09081 0.339319,0.750681 1.214692,0.893634 0.875368,0.142957 2.631732,0.748335 3.398272,0.223605 0.76654,-0.52473 0.448403,-1.025883 1.307776,-1.027076 0.859373,-0.0012 1.505578,2.860097 1.147816,3.787794 -0.357762,0.927697 -0.772397,0.770087 -1.721726,1.033036 -0.949329,0.262949 -2.218167,0.04675 -3.902575,0 -1.684408,-0.04675 -5.115555,-0.05683 -6.198209,-0.344344 -1.082654,-0.287514 -0.266797,0.239847 -0.459126,-0.229563 z"
|
||||
id="path2725"
|
||||
sodipodi:nodetypes="zzzzzzzzzzzzz" /><path
|
||||
style="fill:#373e48;fill-opacity:1;stroke:none;stroke-width:0.110797;stroke-linecap:round"
|
||||
d="m 68.050869,83.676519 c 0.171205,-0.519664 1.128684,-2.620848 1.951286,-2.639978 0.822602,-0.01913 1.467176,0.433517 2.289778,0.414385 0.822602,-0.01913 1.949984,1.577354 2.365674,1.536904 0.41569,-0.04045 4.229432,-0.08892 4.630714,-0.176962 0.401282,-0.08804 0.93463,-0.960656 1.044184,-0.626512 0.109554,0.334144 1.014458,1.463126 0.691104,2.000655 -0.323354,0.537529 -1.457212,0.251594 -1.741099,0.276854 -0.283887,0.02526 -10.963822,0.01813 -11.002082,-0.09665 -0.03826,-0.114781 -0.191304,-0.573912 -0.229559,-0.688689 -0.03825,-0.114778 -0.171205,0.519661 0,-3e-6 z"
|
||||
id="path2727"
|
||||
sodipodi:nodetypes="zzzzzzzzzzz" /></g></g></g><rect
|
||||
style="fill:#1c8890;fill-opacity:1;stroke-width:0.529168;stroke-linecap:round"
|
||||
id="rect3431"
|
||||
width="74.922058"
|
||||
height="7.6285639"
|
||||
x="43.925968"
|
||||
y="76.342461" /><rect
|
||||
style="fill:#25b2bc;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect3373"
|
||||
width="80.500328"
|
||||
height="2.5428538"
|
||||
x="40.90934"
|
||||
y="75.833878" /><rect
|
||||
style="fill:#c8b7b7;stroke-width:0.529168;stroke-linecap:round"
|
||||
id="rect3674"
|
||||
width="26.685802"
|
||||
height="17.388142"
|
||||
x="70.221443"
|
||||
y="57.606728"
|
||||
rx="2.2443218"
|
||||
ry="2.6945567" /><g
|
||||
id="g3786"
|
||||
transform="matrix(0.80236328,0,0,0.88680883,15.240642,34.781923)"
|
||||
style="stroke-width:1.1855"><rect
|
||||
style="fill:#808080;stroke-width:0.627325;stroke-linecap:round"
|
||||
id="rect3782"
|
||||
width="33.259003"
|
||||
height="1.8384364"
|
||||
x="68.523575"
|
||||
y="-46.462337"
|
||||
rx="2.7971394"
|
||||
ry="0.28489366"
|
||||
transform="scale(1,-1)" /></g><rect
|
||||
style="fill:#f4e3d7;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect17995"
|
||||
width="4.2518339"
|
||||
height="2.7057123"
|
||||
x="81.331169"
|
||||
y="64.931122"
|
||||
rx="0.72285628"
|
||||
ry="2.3857954" /><g
|
||||
id="g525"
|
||||
transform="translate(-5.2916665,27.182988)"><path
|
||||
id="rect359"
|
||||
style="fill:#f4d0b7;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 59.12809,41.651751 c 0.478999,0 0.901456,0.43762 1.161253,1.111906 -0.16255,-0.126131 -0.347397,-0.197395 -0.543638,-0.197395 H 59.05354 c -0.654691,0 -1.181897,0.792329 -1.181897,1.775925 0,0.983596 0.527206,1.7753 1.181897,1.7753 h 0.692165 c 0.196241,0 0.381088,-0.07126 0.543638,-0.197394 -0.259786,0.674475 -0.682174,1.111905 -1.161253,1.111905 h -0.839543 c -0.793565,0 -1.432499,-1.199514 -1.432499,-2.689811 0,-1.490297 0.638934,-2.690436 1.432499,-2.690436 z" /><rect
|
||||
style="fill:#c5b7ae;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect357"
|
||||
width="5.8621311"
|
||||
height="8.0988045"
|
||||
x="58.553463"
|
||||
y="40.729858"
|
||||
rx="0.80216056"
|
||||
ry="0.88546026" /><rect
|
||||
style="fill:#f4e3d7;stroke-width:0.529167;stroke-linecap:round"
|
||||
id="rect7505"
|
||||
width="5.8621311"
|
||||
height="8.0988045"
|
||||
x="58.553463"
|
||||
y="40.200691"
|
||||
rx="0.80216056"
|
||||
ry="0.88546026" /><path
|
||||
id="path6701"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.529167;stroke-linecap:round"
|
||||
d="m 63.203415,42.409375 a 1.7887508,1.9420388 0 0 0 -1.789038,1.942001 1.7887508,1.9420388 0 0 0 1.789038,1.942 1.7887508,1.9420388 0 0 0 1.212329,-0.514697 v -2.855123 a 1.7887508,1.9420388 0 0 0 -1.212329,-0.514181 z" /></g><g
|
||||
id="g8395"
|
||||
transform="matrix(0.66402074,0,0,0.66402074,27.503662,7.6942807)"
|
||||
style="stroke-width:1.50598"><path
|
||||
id="path7348"
|
||||
style="opacity:1;fill:#ffe680;stroke:none;stroke-width:0.398456;stroke-linecap:round"
|
||||
d="m 81.861189,20.684603 c -1.836849,-1.8e-5 -3.325913,1.489046 -3.325895,3.325895 6.99e-4,1.254974 0.738868,2.685237 1.299145,2.967778 0.560278,0.282541 0.529167,1.002006 0.529167,1.002006 0,0.394863 0.317754,0.713134 0.712618,0.713134 h 1.56993 c 0.394864,0 0.713135,-0.318271 0.713135,-0.713134 0,0 -0.03101,-0.719393 0.529167,-1.002006 0.560177,-0.282613 1.298028,-1.712918 1.298628,-2.967778 1.8e-5,-1.836849 -1.489046,-3.325913 -3.325895,-3.325895 z"
|
||||
sodipodi:nodetypes="cczsssszcc" /><rect
|
||||
style="opacity:1;fill:#d38d5f;stroke:none;stroke-width:0.398456;stroke-linecap:round"
|
||||
id="rect8390"
|
||||
width="1.0866122"
|
||||
height="0.94605625"
|
||||
x="81.318062"
|
||||
y="30.720861"
|
||||
ry="0.21865827" /><path
|
||||
style="fill:none;stroke:#deaa87;stroke-width:0.398456;stroke-linecap:round"
|
||||
d="m 80.848682,24.07172 0.648192,4.044711 h 0.855609 l 0.544482,-4.044712"
|
||||
id="path8451"
|
||||
sodipodi:nodetypes="cccc" /><rect
|
||||
style="opacity:1;fill:#deaa87;stroke:#d38d5f;stroke-width:0.398456;stroke-linecap:round"
|
||||
id="rect7506"
|
||||
width="2.9953804"
|
||||
height="2.9564743"
|
||||
x="80.363678"
|
||||
y="28.052021"
|
||||
ry="0.68331832" /><path
|
||||
style="opacity:1;fill:none;stroke:#ffb380;stroke-width:0.600067;stroke-linecap:round"
|
||||
d="m 80.523862,24.344684 0.803759,-0.777829 0.440768,0.700046 0.725976,-0.700046 0.907464,0.881539"
|
||||
id="path8672" /><path
|
||||
style="opacity:1;fill:#d38d5f;stroke:#d38d5f;stroke-width:0.600067;stroke-linecap:round"
|
||||
d="m 80.141318,29.284197 3.278598,-1.022832"
|
||||
id="path8836" /><path
|
||||
style="opacity:1;fill:#d38d5f;stroke:#d38d5f;stroke-width:0.600067;stroke-linecap:round"
|
||||
d="m 80.141318,30.563635 3.278598,-1.022832"
|
||||
id="path8892" /><path
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffeeaa;stroke-width:0.398456;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 89.173244,20.118732 4.584025,-2.455726"
|
||||
id="path9590"
|
||||
inkscape:transform-center-x="-7.3922951"
|
||||
inkscape:transform-center-y="-4.7832498"
|
||||
sodipodi:nodetypes="cc" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path9590"
|
||||
inkscape:transform-center-x="-4.0770147"
|
||||
inkscape:transform-center-y="7.8040659"
|
||||
id="use9592"
|
||||
transform="rotate(95.321691,81.584573,24.33792)" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path9590"
|
||||
inkscape:transform-center-x="8.2298936"
|
||||
inkscape:transform-center-y="3.1295904"
|
||||
id="use9594"
|
||||
transform="rotate(-167.91512,81.822479,24.11971)" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path9590"
|
||||
inkscape:transform-center-x="6.5335307"
|
||||
inkscape:transform-center-y="-5.9024128"
|
||||
id="use9596"
|
||||
transform="rotate(-105,82.013106,24.353662)" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path9590"
|
||||
inkscape:transform-center-x="-0.63674987"
|
||||
inkscape:transform-center-y="-8.781802"
|
||||
id="use9598"
|
||||
transform="rotate(-52.947623,82.013107,24.353662)" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path9590"
|
||||
inkscape:transform-center-x="-8.5255871"
|
||||
inkscape:transform-center-y="2.1999694"
|
||||
id="use9600"
|
||||
transform="rotate(47.374391,82.013106,24.353662)" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path9590"
|
||||
inkscape:transform-center-x="5.2833963"
|
||||
inkscape:transform-center-y="7.0435225"
|
||||
id="use12522"
|
||||
transform="rotate(159.77907,82.334229,24.747767)" /></g></g></svg>
|
After Width: | Height: | Size: 47 KiB |
42
assets/svg/docker-logo.svg
Normal file
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg version="1.1" width="255.05853" height="144.81953" id="svg2" sodipodi:docname="docker-logo.svg" inkscape:version="1.2 (dc2aeda, 2022-05-15)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 255 144">
|
||||
<namedview id="namedview26616" pagecolor="#505050" bordercolor="#eeeeee" borderopacity="1" inkscape:showpageshadow="0" inkscape:pageopacity="0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#505050" showgrid="false" inkscape:zoom="1.1065085" inkscape:cx="188.43054" inkscape:cy="60.098949" inkscape:window-width="1440" inkscape:window-height="847" inkscape:window-x="0" inkscape:window-y="25" inkscape:window-maximized="1" inkscape:current-layer="svg2" />
|
||||
<metadata id="metadata4">
|
||||
<RDF>
|
||||
<Work rdf:about="">
|
||||
<format>
|
||||
image/svg+xml
|
||||
</format>
|
||||
<type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</Work>
|
||||
</RDF>
|
||||
</metadata>
|
||||
<defs id="defs6">
|
||||
<clipPath id="clipPath8">
|
||||
<path d="M 76,2 V 48 H 54 V 71 H 35.580737 c -0.07818,0.665694 -0.141485,1.332869 -0.205737,2 -1.151162,12.530963 1.036422,24.087546 6.0625,33.96875 L 43.125,110 c 1.011403,1.81678 2.191241,3.52297 3.4375,5.1875 1.244725,1.66248 1.685716,2.58262 2.46875,3.6875 C 62.319911,133.81083 82.129473,141 105,141 155.64836,141 198.63299,118.56201 217.65625,68.15625 231.15302,69.54122 244.09968,66.080358 250,54.5625 240.60137,49.138835 228.52163,50.877226 221.5625,54.375 L 240,2 168,48 H 145 V 2 Z" id="path10" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<path d="m 147.4876,45.731535 h 22.866 v 23.37473 h 11.56177 c 5.33905,0 10.83073,-0.95117 15.887,-2.66444 2.48448,-0.84244 5.27317,-2.01479 7.72392,-3.4892 -3.22785,-4.21436 -4.87579,-9.53574 -5.36101,-14.78106 -0.65874,-7.13426 0.78032,-16.42042 5.60897,-22.004216 l 2.40362,-2.780117 2.8642,2.302393 c 7.21138,5.79374 13.27612,13.88934 14.3451,23.11819 8.68312,-2.55411 18.87759,-1.95 26.53135,2.46735 l 3.14002,1.81182 -1.65276,3.2257 c -6.47289,12.633374 -20.00501,16.546746 -33.23507,15.854261 -19.79715,49.308394 -62.89781,72.652584 -115.15715,72.652584 -26.998899,0 -51.769845,-10.09272 -65.875552,-34.04693 -0.827018,-1.48798 -1.535233,-3.0439 -2.286326,-4.57212 C 32.083548,95.656282 30.499883,84.105222 31.574226,72.563802 l 0.32241,-3.457072 H 51.449573 V 45.732 h 22.866 V 22.866 H 120.04757 V 0 h 27.43967 v 45.732" id="path14" style="fill:#394d54" />
|
||||
<g clip-path="url(#clipPath8)" id="g16" transform="translate(0,-4.65e-4)">
|
||||
<g id="g18">
|
||||
<g transform="translate(0,-22.866)" id="g20">
|
||||
<path d="m 123.85901,3.8110794 h 19.81751 V 23.62805 h -19.81751 z" id="path22" style="fill:#00acd3" />
|
||||
<path d="m 123.85901,26.676485 h 19.81751 v 19.818043 h -19.81751 z" id="path24" style="fill:#20c2ef" />
|
||||
<path d="M 126.29235,21.976904 V 5.4611548 M 129.2642,21.976904 V 5.4611548 m 3.00184,16.5157492 V 5.4611548 m 3.00344,16.5157492 V 5.4611548 M 138.2724,21.976904 V 5.4611548 m 2.97131,16.5157492 V 5.4611548" id="path26" style="stroke:#394d54;stroke-width:1.56" />
|
||||
<use transform="translate(0,22.866)" id="use28" xlink:href="#path26" />
|
||||
</g>
|
||||
<use transform="matrix(1,0,0,-1,22.866,4.572651)" id="use30" xlink:href="#g20" />
|
||||
</g>
|
||||
<use transform="translate(-91.464,45.732)" id="use32" xlink:href="#g18" />
|
||||
<use transform="translate(-45.732,45.732)" id="use34" xlink:href="#g18" />
|
||||
<use transform="translate(0,45.732)" id="use36" xlink:href="#g18" />
|
||||
</g>
|
||||
<path d="m 221.57014,54.379649 c 1.53332,-11.915247 -7.38383,-21.274779 -12.91407,-25.71836 -6.37269,7.367765 -7.36295,26.677556 2.63498,34.807431 -5.57952,4.956117 -17.33731,9.448435 -29.37574,9.448435 L 34,72.917155 C 32.829255,85.484184 34,146 34,146 h 217 l -0.98657,-91.424 c -9.39863,-5.423665 -21.48419,-3.694326 -28.44332,-0.196552" clip-path="url(#clipPath8)" id="path38" style="fill:#17b5eb" transform="translate(0,-4.65e-4)" />
|
||||
<path d="m 34,89 v 57 H 251 V 89" clip-path="url(#clipPath8)" id="path40" style="fill-opacity:0.17" transform="translate(0,-4.65e-4)" />
|
||||
<path d="M 111.23736,140.88997 C 97.697741,134.4648 90.265707,125.73081 86.130611,116.19562 L 45,118 l 21,28 45.23736,-5.11003" clip-path="url(#clipPath8)" id="path42" style="fill:#d4edf1" transform="translate(0,-4.65e-4)" />
|
||||
<path d="m 222.5,53.9375 v 0.03125 c -20.86119,26.889144 -50.78312,50.37872 -82.90625,62.71875 -28.65478,11.00767 -53.638381,11.06039 -70.875,2.21875 -1.85607,-1.04832 -3.675701,-2.21152 -5.5,-3.3125 C 50.582097,106.76175 43.464274,92.152308 44.0625,72.90625 H 34 V 146 H 251 V 50 h -25 z" clip-path="url(#clipPath8)" id="path44" style="fill-opacity:0.085" transform="translate(0,-4.65e-4)" />
|
||||
<path d="m 45.625,117.03078 c 14.165153,0.77532 29.28245,0.91434 42.46875,-3.21875" id="path46" style="fill:none;stroke:#394d54;stroke-width:3.4;stroke-linecap:round" />
|
||||
<path d="m 102.17024,106.95879 c 0,3.01898 -2.447529,5.46651 -5.466508,5.46651 -3.019514,0 -5.467581,-2.44753 -5.467581,-5.46651 0,-3.01896 2.448067,-5.46758 5.467581,-5.46758 3.018979,0 5.466508,2.44862 5.466508,5.46758 z" id="path48" style="fill:#d4edf1" />
|
||||
<path d="m 98.121372,103.30731 c -0.477188,0.27582 -0.800133,0.79264 -0.800133,1.3839 0,0.88261 0.715514,1.59706 1.598125,1.59706 0.604653,0 1.130046,-0.3358 1.401576,-0.83174 0.19173,0.4622 0.29831,0.96991 0.29831,1.50226 0,2.16208 -1.752907,3.91498 -3.915518,3.91498 -2.162075,0 -3.91605,-1.7529 -3.91605,-3.91498 0,-2.16314 1.753975,-3.91657 3.91605,-3.91657 0.500218,0 0.977406,0.0943 1.41764,0.26509 z" id="path50" style="fill:#394d54" />
|
||||
<path d="m 0,90.161878 h 254.32743 c -5.53774,-1.404786 -17.521,-3.302293 -15.54477,-10.559732 -10.06915,11.651749 -34.35274,8.174326 -40.4812,2.428786 -6.82471,9.89831 -46.55451,6.135967 -49.32553,-1.575096 -8.55565,10.04077 -35.06718,10.04077 -43.62336,0 -2.77209,7.711063 -42.501357,11.473406 -49.326595,1.575096 -6.128469,5.74554 -30.409908,9.222963 -40.480134,-2.428786 C 17.522075,86.859585 5.5388117,88.757092 0,90.161878" id="path52" style="fill:#394d54" />
|
||||
</svg>
|
After Width: | Height: | Size: 6.2 KiB |
42
assets/svg/golang-logo.svg
Normal file
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.0.1, 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 205.4 76.7" style="enable-background:new 0 0 205.4 76.7;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#00ACD7;}
|
||||
</style>
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st0" d="M15.5,23.2c-0.4,0-0.5-0.2-0.3-0.5l2.1-2.7c0.2-0.3,0.7-0.5,1.1-0.5h35.7c0.4,0,0.5,0.3,0.3,0.6l-1.7,2.6 c-0.2,0.3-0.7,0.6-1,0.6L15.5,23.2z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st0" d="M0.4,32.4c-0.4,0-0.5-0.2-0.3-0.5l2.1-2.7c0.2-0.3,0.7-0.5,1.1-0.5h45.6c0.4,0,0.6,0.3,0.5,0.6l-0.8,2.4 c-0.1,0.4-0.5,0.6-0.9,0.6L0.4,32.4z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st0" d="M24.6,41.6c-0.4,0-0.5-0.3-0.3-0.6l1.4-2.5c0.2-0.3,0.6-0.6,1-0.6h20c0.4,0,0.6,0.3,0.6,0.7L47.1,41 c0,0.4-0.4,0.7-0.7,0.7L24.6,41.6z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g id="CXHf1q_3_">
|
||||
<g>
|
||||
<g>
|
||||
<path class="st0" d="M128.4,21.4c-6.3,1.6-10.6,2.8-16.8,4.4c-1.5,0.4-1.6,0.5-2.9-1c-1.5-1.7-2.6-2.8-4.7-3.8 c-6.3-3.1-12.4-2.2-18.1,1.5c-6.8,4.4-10.3,10.9-10.2,19c0.1,8,5.6,14.6,13.5,15.7c6.8,0.9,12.5-1.5,17-6.6 c0.9-1.1,1.7-2.3,2.7-3.7c-3.6,0-8.1,0-19.3,0c-2.1,0-2.6-1.3-1.9-3c1.3-3.1,3.7-8.3,5.1-10.9c0.3-0.6,1-1.6,2.5-1.6 c5.1,0,23.9,0,36.4,0c-0.2,2.7-0.2,5.4-0.6,8.1c-1.1,7.2-3.8,13.8-8.2,19.6c-7.2,9.5-16.6,15.4-28.5,17 c-9.8,1.3-18.9-0.6-26.9-6.6c-7.4-5.6-11.6-13-12.7-22.2c-1.3-10.9,1.9-20.7,8.5-29.3c7.1-9.3,16.5-15.2,28-17.3 c9.4-1.7,18.4-0.6,26.5,4.9c5.3,3.5,9.1,8.3,11.6,14.1C130,20.6,129.6,21.1,128.4,21.4z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st0" d="M161.5,76.7c-9.1-0.2-17.4-2.8-24.4-8.8c-5.9-5.1-9.6-11.6-10.8-19.3c-1.8-11.3,1.3-21.3,8.1-30.2 c7.3-9.6,16.1-14.6,28-16.7c10.2-1.8,19.8-0.8,28.5,5.1c7.9,5.4,12.8,12.7,14.1,22.3c1.7,13.5-2.2,24.5-11.5,33.9 c-6.6,6.7-14.7,10.9-24,12.8C166.8,76.3,164.1,76.4,161.5,76.7z M185.3,36.3c-0.1-1.3-0.1-2.3-0.3-3.3 c-1.8-9.9-10.9-15.5-20.4-13.3c-9.3,2.1-15.3,8-17.5,17.4c-1.8,7.8,2,15.7,9.2,18.9c5.5,2.4,11,2.1,16.3-0.6 C180.5,51.3,184.8,44.9,185.3,36.3z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
64
assets/svg/gql-logo.svg
Normal file
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="GraphQL_Logo" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 400 400" enable-background="new 0 0 400 400" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
|
||||
<rect x="122" y="-0.4" transform="matrix(-0.866 -0.5 0.5 -0.866 163.3196 363.3136)" fill="#E535AB" width="16.6" height="320.3"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<rect x="39.8" y="272.2" fill="#E535AB" width="320.3" height="16.6"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
|
||||
<rect x="37.9" y="312.2" transform="matrix(-0.866 -0.5 0.5 -0.866 83.0693 663.3409)" fill="#E535AB" width="185" height="16.6"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
|
||||
<rect x="177.1" y="71.1" transform="matrix(-0.866 -0.5 0.5 -0.866 463.3409 283.0693)" fill="#E535AB" width="185" height="16.6"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
|
||||
<rect x="122.1" y="-13" transform="matrix(-0.5 -0.866 0.866 -0.5 126.7903 232.1221)" fill="#E535AB" width="16.6" height="185"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
|
||||
<rect x="109.6" y="151.6" transform="matrix(-0.5 -0.866 0.866 -0.5 266.0828 473.3766)" fill="#E535AB" width="320.3" height="16.6"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<rect x="52.5" y="107.5" fill="#E535AB" width="16.6" height="185"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<rect x="330.9" y="107.5" fill="#E535AB" width="16.6" height="185"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
|
||||
<rect x="262.4" y="240.1" transform="matrix(-0.5 -0.866 0.866 -0.5 126.7953 714.2875)" fill="#E535AB" width="14.5" height="160.9"/>
|
||||
</g>
|
||||
</g>
|
||||
<path fill="#E535AB" d="M369.5,297.9c-9.6,16.7-31,22.4-47.7,12.8c-16.7-9.6-22.4-31-12.8-47.7c9.6-16.7,31-22.4,47.7-12.8 C373.5,259.9,379.2,281.2,369.5,297.9"/>
|
||||
<path fill="#E535AB" d="M90.9,137c-9.6,16.7-31,22.4-47.7,12.8c-16.7-9.6-22.4-31-12.8-47.7c9.6-16.7,31-22.4,47.7-12.8 C94.8,99,100.5,120.3,90.9,137"/>
|
||||
<path fill="#E535AB" d="M30.5,297.9c-9.6-16.7-3.9-38,12.8-47.7c16.7-9.6,38-3.9,47.7,12.8c9.6,16.7,3.9,38-12.8,47.7 C61.4,320.3,40.1,314.6,30.5,297.9"/>
|
||||
<path fill="#E535AB" d="M309.1,137c-9.6-16.7-3.9-38,12.8-47.7c16.7-9.6,38-3.9,47.7,12.8c9.6,16.7,3.9,38-12.8,47.7 C340.1,159.4,318.7,153.7,309.1,137"/>
|
||||
<path fill="#E535AB" d="M200,395.8c-19.3,0-34.9-15.6-34.9-34.9c0-19.3,15.6-34.9,34.9-34.9c19.3,0,34.9,15.6,34.9,34.9 C234.9,380.1,219.3,395.8,200,395.8"/>
|
||||
<path fill="#E535AB" d="M200,74c-19.3,0-34.9-15.6-34.9-34.9c0-19.3,15.6-34.9,34.9-34.9c19.3,0,34.9,15.6,34.9,34.9 C234.9,58.4,219.3,74,200,74"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.6 KiB |
297
assets/svg/howdy.svg
Normal file
|
@ -0,0 +1,297 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="400"
|
||||
height="400"
|
||||
viewBox="0 0 105.83333 105.83333"
|
||||
version="1.1"
|
||||
id="svg523"
|
||||
inkscape:version="1.2 (dc2aeda, 2022-05-15)"
|
||||
sodipodi:docname="howdy.svg"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview525"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#505050"
|
||||
inkscape:document-units="px"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.3975124"
|
||||
inkscape:cx="385.68531"
|
||||
inkscape:cy="174.23817"
|
||||
inkscape:window-width="1440"
|
||||
inkscape:window-height="847"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" /><defs
|
||||
id="defs520" /><g
|
||||
inkscape:label="Слой 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"><g
|
||||
id="g4098"
|
||||
transform="matrix(0.90821066,0,0,0.91196035,12.590479,26.557309)"
|
||||
style="stroke-width:1.0988"><rect
|
||||
style="fill:#e25563;fill-opacity:1;stroke:none;stroke-width:0.10988;stroke-linecap:round"
|
||||
id="rect515"
|
||||
width="15.294061"
|
||||
height="5.6006417"
|
||||
x="-48.288601"
|
||||
y="-11.392169"
|
||||
ry="2.8003209"
|
||||
rx="2.9080255"
|
||||
transform="scale(-1,1)" /><rect
|
||||
style="fill:#e25563;fill-opacity:1;stroke:none;stroke-width:0.10988;stroke-linecap:round"
|
||||
id="rect2120"
|
||||
width="18.74061"
|
||||
height="5.6006417"
|
||||
x="-50.011875"
|
||||
y="-8.2171659"
|
||||
ry="2.8003209"
|
||||
rx="3.5633552"
|
||||
transform="scale(-1,1)" /><ellipse
|
||||
style="mix-blend-mode:normal;fill:#000000;fill-opacity:0.072093;stroke-width:2.90724;stroke-linecap:round"
|
||||
id="path7853"
|
||||
cx="43.254681"
|
||||
cy="83.761459"
|
||||
rx="19.67112"
|
||||
ry="2.2014" /><path
|
||||
id="path3942"
|
||||
style="fill:#535d6c;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
d="m 34.584242,54.487389 c -0.999682,-0.168955 -2.019946,-0.136835 -3.030543,0.200069 -0.955164,0.373851 -0.905805,3.950599 -1.456208,4.880962 0.906961,6.919366 0.608865,9.152154 2.081092,15.948411 0.114087,0.805574 0.549947,4.01861 1.124349,4.392858 0.74039,0.482395 1.887032,-0.09799 2.695382,0.05506 1.74984,0.87253 1.221151,-3.873455 1.745975,-5.021535 0.703563,-2.56644 1.093672,-3.114172 1.204074,-5.763762 0.146096,-2.998024 1.184315,-6.197637 1.543586,-8.983797 0.145809,-1.13075 0.321775,-3.14054 0.337337,-4.357466 -1.406607,-0.922387 -4.578905,-1.069238 -6.245044,-1.350803 z"
|
||||
sodipodi:nodetypes="scccscccscs"
|
||||
inkscape:transform-center-y="-11.745543"
|
||||
inkscape:transform-center-x="-0.6753656" /><path
|
||||
style="fill:#535d6c;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
d="m 53.176113,55.386863 c 0.253695,2.29263 0.08829,3.465517 -0.330727,5.867247 -0.563736,4.043109 -1.106476,8.612848 -1.658613,12.946959 -0.0269,0.211119 -0.361937,0.465515 -0.38888,0.675428 -0.184217,1.435222 -0.06152,2.796352 -0.249269,4.142905 -1.16897,1.06454 -2.337941,2.12909 -3.506914,3.19362 -0.716921,-2.111861 -1.344767,-4.637548 -1.85189,-6.809814 -0.163371,-0.699798 -0.51146,-0.970045 -0.588316,-1.691136 L 43.242058,62.207411 c 0.707626,-2.090354 0.739437,-4.221412 1.505411,-6.286274 1.134821,-1.934972 6.004959,-4.231817 7.894672,-3.134828 0.459675,0.200399 0.101883,2.346641 0.533972,2.600554 z"
|
||||
id="path16645"
|
||||
sodipodi:nodetypes="ccssccsccccc"
|
||||
inkscape:transform-center-x="-0.71390547"
|
||||
inkscape:transform-center-y="-10.707193" /><g
|
||||
id="use2717"
|
||||
transform="matrix(-1,0,0,1,125.28256,-0.05468271)"
|
||||
style="stroke-width:1.0988"><path
|
||||
style="fill:#1c1f24;fill-opacity:1;stroke:none;stroke-width:0.10988;stroke-linecap:round"
|
||||
d="m 68.050869,82.758267 c -0.192329,-0.46941 0.412534,-1.768357 0.818582,-2.394317 0.406048,-0.625961 0.614247,-1.01366 1.42502,-1.325762 0.810773,-0.312103 2.569686,-0.04374 3.265917,0.04706 0.696231,0.09081 -0.31934,-0.879311 0.556033,-0.736358 0.875368,0.142957 3.957381,1.834996 4.723921,1.310266 0.76654,-0.52473 -0.515026,-1.146623 0.344347,-1.147816 0.859373,-0.0012 1.505578,2.860097 1.147816,3.787794 -0.357762,0.927697 -0.772397,0.770087 -1.721726,1.033036 -0.949329,0.262949 -2.218167,0.04675 -3.902575,0 -1.684408,-0.04675 -5.115555,-0.05683 -6.198209,-0.344344 -1.082654,-0.287514 -0.266797,0.239847 -0.459126,-0.229563 z"
|
||||
id="path2719"
|
||||
sodipodi:nodetypes="zzzzzzzzzzzzz" /><path
|
||||
style="fill:#373e48;fill-opacity:1;stroke:none;stroke-width:0.10988;stroke-linecap:round"
|
||||
d="m 68.050869,83.676519 c 0.171205,-0.519664 1.128684,-2.620848 1.951286,-2.639978 0.822602,-0.01913 1.467176,0.433517 2.289778,0.414385 0.822602,-0.01913 1.949984,1.577354 2.365674,1.536904 0.41569,-0.04045 4.229432,-0.08892 4.630714,-0.176962 0.401282,-0.08804 0.93463,-0.960656 1.044184,-0.626512 0.109554,0.334144 1.014458,1.463126 0.691104,2.000655 -0.323354,0.537529 -1.652986,0.369058 -1.936873,0.394318 -0.283887,0.02526 -10.768048,-0.09934 -10.806308,-0.214118 -0.03826,-0.114781 -0.191304,-0.573912 -0.229559,-0.688689 -0.03825,-0.114778 -0.171205,0.519661 0,-3e-6 z"
|
||||
id="path2721"
|
||||
sodipodi:nodetypes="zzzzzzzzzzz" /></g><g
|
||||
id="g2729"
|
||||
transform="matrix(-0.81460179,0,0,1,96.66975,-0.05468271)"
|
||||
style="stroke-width:1.21744"><path
|
||||
style="fill:#1c1f24;fill-opacity:1;stroke:none;stroke-width:0.121744;stroke-linecap:round"
|
||||
d="m 68.050869,82.758267 c -0.192329,-0.46941 0.412534,-1.768357 0.818582,-2.394317 0.406048,-0.625961 0.614247,-1.01366 1.42502,-1.325762 0.810773,-0.312103 2.273247,-0.707811 2.969478,-0.617011 0.696231,0.09081 0.339319,0.750681 1.214692,0.893634 0.875368,0.142957 2.631732,0.748335 3.398272,0.223605 0.76654,-0.52473 0.448403,-1.025883 1.307776,-1.027076 0.859373,-0.0012 1.505578,2.860097 1.147816,3.787794 -0.357762,0.927697 -0.772397,0.770087 -1.721726,1.033036 -0.949329,0.262949 -2.218167,0.04675 -3.902575,0 -1.684408,-0.04675 -5.115555,-0.05683 -6.198209,-0.344344 -1.082654,-0.287514 -0.266797,0.239847 -0.459126,-0.229563 z"
|
||||
id="path2725"
|
||||
sodipodi:nodetypes="zzzzzzzzzzzzz" /><path
|
||||
style="fill:#373e48;fill-opacity:1;stroke:none;stroke-width:0.121744;stroke-linecap:round"
|
||||
d="m 68.050869,83.676519 c 0.171205,-0.519664 1.128684,-2.620848 1.951286,-2.639978 0.822602,-0.01913 1.467176,0.433517 2.289778,0.414385 0.822602,-0.01913 1.949984,1.577354 2.365674,1.536904 0.41569,-0.04045 4.229432,-0.08892 4.630714,-0.176962 0.401282,-0.08804 0.93463,-0.960656 1.044184,-0.626512 0.109554,0.334144 1.014458,1.463126 0.691104,2.000655 -0.323354,0.537529 -1.457212,0.251594 -1.741099,0.276854 -0.283887,0.02526 -10.963822,0.01813 -11.002082,-0.09665 -0.03826,-0.114781 -0.191304,-0.573912 -0.229559,-0.688689 -0.03825,-0.114778 -0.171205,0.519661 0,-3e-6 z"
|
||||
id="path2727"
|
||||
sodipodi:nodetypes="zzzzzzzzzzz" /></g><path
|
||||
style="fill:#535d6c;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
d="m 51.362775,27.890363 c 0.796391,2.455061 2.229927,2.976763 1.533707,5.626108 0.145091,6.1037 0.736118,14.01284 0.06207,20.116547 -1.562709,1.25239 -7.016166,1.439114 -8.57888,2.691494 -1.542409,-2.933616 -1.355967,-4.705469 -2.022124,-7.875126 l -3.350433,-12.25917 c 0.837086,-2.32026 1.540171,-4.67634 2.461179,-6.974165 1.449168,-2.189779 5.228593,-2.975872 7.967002,-1.956118 0.661118,0.176272 1.301103,0.393929 1.927482,0.63043 z"
|
||||
id="path1109"
|
||||
sodipodi:nodetypes="ccccccccc"
|
||||
inkscape:transform-center-x="-2.2981378"
|
||||
inkscape:transform-center-y="-11.497387" /><path
|
||||
id="path1111"
|
||||
style="fill:#535d6c;fill-opacity:1;stroke-width:0.581448;stroke-linecap:round"
|
||||
d="m 34.04972,26.848823 c 1.51383,-0.202005 3.075674,-0.186096 4.647844,0.160874 1.490501,0.388116 2.57771,4.173044 3.495471,5.172855 -0.816207,7.528804 -0.01728,16.171798 -1.707477,23.577456 -0.247225,2.006711 -4.327363,-1.547384 -6.49872,-1.225636 -2.602301,0.979776 -2.369396,-0.217002 -3.265998,-1.453651 -1.286561,-2.773156 -1.743638,-7.326029 -2.130561,-10.20048 -0.660983,-4.571895 -1.096397,-9.149019 -1.525934,-13.724454 2.07366,-1.027526 4.462317,-1.970322 6.985374,-2.306968 z"
|
||||
sodipodi:nodetypes="scccccccss"
|
||||
inkscape:transform-center-y="-12.686856"
|
||||
inkscape:transform-center-x="-0.91349815" /><path
|
||||
style="fill:#e25563;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
d="m 52.934476,17.493578 c 0,0 1.604977,-22.0621767 -0.131501,-22.8339443 -0.29293,-0.1301908 -2.022444,-2.9107413 -3.183675,-3.1158785 -4.069428,-0.7188843 -11.527588,-1.0171953 -16.969005,-0.5638868 -2.210437,0.184145 -5.109898,2.2337515 -5.526904,2.5117565 -1.736479,1.1576546 0.910063,21.2719021 1.295943,23.7801511 0.38589,2.508248 -1.682355,14.509252 -1.682355,14.509252 0,0 18.91751,2.104999 26.728405,-1.142493 -0.462261,-3.927363 0.207566,-11.944938 -0.530908,-13.144957 z"
|
||||
id="path4167"
|
||||
sodipodi:nodetypes="csssssccc" /><path
|
||||
style="fill:#c64a57;fill-opacity:1;stroke:none;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 27.853945,1.3067191 4.011731,11.5014439 -1.21568,15.496683 -0.729405,3.389901 H 26.638262 L 28.34021,22.251453 27.002966,6.8758391 Z"
|
||||
id="path49464" /><g
|
||||
id="g42641"
|
||||
inkscape:transform-center-x="-2.6330023"
|
||||
inkscape:transform-center-y="18.787659"
|
||||
transform="matrix(0.98581387,-0.17138616,0.13497728,0.99092414,0.83049191,8.865888)"><path
|
||||
style="opacity:1;fill:#e25563;fill-opacity:1;stroke-width:2.90724;stroke-linecap:round"
|
||||
d="m 49.183939,-8.8398842 c 0,0 2.830533,1.0671273 4.329399,2.8602129 1.498866,1.7930855 2.138118,4.1169009 2.644928,7.4125006 0.50681,3.2955997 1.825992,12.5447937 1.825992,12.5447937 l -3.778082,1.033069 -3.32393,-4.885376 -1.8527,-12.5940791 z"
|
||||
id="path39693"
|
||||
sodipodi:nodetypes="czzccccc" /><g
|
||||
id="g41909"
|
||||
inkscape:transform-center-x="-2.0033297"
|
||||
inkscape:transform-center-y="-11.641923"
|
||||
transform="matrix(-0.95299767,-0.33010964,0.33403132,-0.93361513,106.69251,41.311375)"><path
|
||||
style="opacity:1;fill:#e25563;fill-opacity:1;stroke-width:2.90724;stroke-linecap:round"
|
||||
d="m 54.050861,9.7590032 c 0,0 -1.795011,4.9813338 -1.908248,8.4577418 -0.113237,3.476409 1.499979,11.616661 1.499979,11.616661 l 4.159581,-0.397469 1.511952,-9.451083 2.18826,-4.925173 -4.826866,-6.5307338 z"
|
||||
id="path40451"
|
||||
inkscape:transform-center-x="0.28044017"
|
||||
inkscape:transform-center-y="8.2729851"
|
||||
sodipodi:nodetypes="czcccccc" /><path
|
||||
style="fill:#ffd9bf;fill-opacity:1;stroke:none;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 57.454824,28.672624 0.498899,1.553838 c 0,0 1.219514,0.62124 1.799333,1.136011 0.57982,0.514772 1.58705,1.956169 1.58705,1.956169 l -0.232246,0.54998 -1.472584,-0.850361 -0.578524,-0.02803 c 0,0 -0.02393,0.471327 0.249467,1.565922 0.273396,1.094596 0.911502,4.405423 0.911502,4.405423 l -0.294992,0.420452 -0.531169,-0.329499 -1.057239,-3.754994 -0.188716,0.08407 0.679839,4.488616 -0.281523,0.373209 -0.475816,-0.292955 -0.811875,-3.415198 -0.201179,-0.61205 -0.311073,0.011 0.07758,4.010778 -0.380235,0.334062 -0.361742,-0.159864 -0.379772,-4.070662 -0.241864,-0.107541 -0.336983,2.869802 -0.583262,0.02062 -0.130378,-3.111449 c 0,0 -0.555442,-2.744517 -0.531213,-3.618877 0.02423,-0.874361 0.324205,-1.571997 0.324205,-1.571997 l -0.06201,-1.893994 1.856827,-0.72351 z"
|
||||
id="path65258"
|
||||
sodipodi:nodetypes="cczcccczccccccccccccccccccczcccc"
|
||||
inkscape:transform-center-x="-0.60373961"
|
||||
inkscape:transform-center-y="-4.401055" /></g><path
|
||||
id="path47162"
|
||||
style="opacity:1;fill:#e25563;stroke-width:0.290814;stroke-linecap:round"
|
||||
transform="matrix(0.98537054,0.17042564,-0.13565401,0.99075627,0,0)"
|
||||
d="m 59.90248,4.2085454 c -0.52855,1.1310164 -1.591173,1.9176824 -2.738986,1.9176822 -1.147812,-3e-7 -2.078298,-0.9168701 -2.078298,-2.0478861 0,-1.131016 0.930486,-2.0478858 2.078298,-2.0478861 1.147813,-2e-7 3.219081,1.1507614 2.738986,2.17809 z"
|
||||
sodipodi:nodetypes="sssss" /></g><path
|
||||
style="opacity:1;fill:#ffd9bf;fill-opacity:1;stroke-width:2.90724;stroke-linecap:round"
|
||||
d="m 36.553588,-12.966926 -0.192245,2.871794 2.30692,1.5316229 4.133233,0.4786323 1.345704,-0.7658112 -0.09612,-2.584615 z"
|
||||
id="path42736"
|
||||
sodipodi:nodetypes="ccccccc" /><g
|
||||
id="g409"
|
||||
transform="rotate(-2.5035691,-727.73021,934.84366)"
|
||||
style="stroke-width:1.0988"><rect
|
||||
style="fill:#483737;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
id="rect5342"
|
||||
width="2.496511"
|
||||
height="5.6171494"
|
||||
x="85.26133"
|
||||
y="12.498936"
|
||||
rx="1.0096776"
|
||||
ry="1.3883067" /><path
|
||||
id="path4221"
|
||||
style="fill:#ffd9bf;stroke-width:0.581449;stroke-linecap:round;fill-opacity:1"
|
||||
d="m 87.020409,17.890897 c 0,4.057806 -1.531886,6.775182 -5.402381,6.775182 -3.673419,0 -5.40238,-2.717377 -5.40238,-6.775182 0,-4.057804 1.040213,-7.244753 5.40238,-7.347307 4.560261,-0.107211 5.402381,3.289502 5.402381,7.347307 z"
|
||||
sodipodi:nodetypes="sssss" /><path
|
||||
id="rect647"
|
||||
style="fill:#483737;stroke-width:0.581449;stroke-linecap:round"
|
||||
d="M 78.822398,8.6980178 C 81.716613,8.8657134 85.50922,7.5880839 87.505044,7.9081342 89.500869,8.2281846 87.907,12.79493 85.955674,12.910731 h -7.133276 c -1.259442,0 -2.273361,-0.891153 -2.273361,-1.998102 v -0.21651 c 0,-1.1069482 1.016489,-2.0709263 2.273361,-1.9981012 z"
|
||||
sodipodi:nodetypes="szcssss" /><rect
|
||||
style="fill:#483737;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
id="rect5214"
|
||||
width="2.496511"
|
||||
height="6.3973093"
|
||||
x="75.615196"
|
||||
y="11.818504"
|
||||
rx="1.0096776"
|
||||
ry="1.581127" /><rect
|
||||
style="fill:#ffd9bf;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
id="rect5345"
|
||||
width="2.028415"
|
||||
height="4.3688941"
|
||||
x="75.303131"
|
||||
y="15.092828"
|
||||
rx="2.4805279"
|
||||
ry="3.9196229" /><circle
|
||||
style="fill:#241c1c;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
id="path5520"
|
||||
cx="81.595558"
|
||||
cy="17.351255"
|
||||
r="0.3905766" /><path
|
||||
style="fill:#483737;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
d="m 76.61722,21.044801 c 0,0 1.263398,-1.329893 2.194323,-1.130409 0.930923,0.199485 1.455267,2.12402 1.987224,2.12402 0.531958,0 1.220962,-1.411154 1.795355,-1.196903 0.598451,0.223225 3.735119,0.172485 3.868111,0.203292 0.471601,0.109244 0.398965,1.196903 0.398965,1.196903 0,0 -1.134215,2.859269 -1.666173,3.258236 -0.531956,0.398968 -3.495404,0.388445 -3.995919,0.465463 -0.827164,0.127281 -5.342272,-4.480806 -4.581886,-4.920602 z"
|
||||
id="path7933"
|
||||
sodipodi:nodetypes="cszsscssc" /><rect
|
||||
style="fill:#634b4b;fill-opacity:1;stroke-width:0.581538;stroke-linecap:round"
|
||||
id="rect14429"
|
||||
width="2.134635"
|
||||
height="0.5133366"
|
||||
x="83.503838"
|
||||
y="22.479269"
|
||||
rx="0.2134635"
|
||||
ry="0.2566683"
|
||||
transform="matrix(0.99678408,-0.0801342,0.05533343,0.99846793,0,0)" /><path
|
||||
style="fill:#ffd9bf;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
d="m 82.114688,23.179529 c 0,0 0.243735,-2.004867 0.937567,-1.884874 0.654302,0.113157 2.42341,0.08723 2.804297,0.251817 0.602405,0.260316 -0.229263,1.948862 -0.570285,1.993976 -0.341023,0.04511 -0.852554,0.406035 -0.895183,0.04511 -0.04262,-0.360919 0.383651,-0.279564 0.08526,-0.369793 -0.298395,-0.09023 -1.125446,-0.574277 -1.125446,-0.168248 0,0.406034 0.341023,-0.03624 -0.170512,0.189335 -0.511532,0.225574 -1.150949,0.270689 -1.150949,0 0,-0.27069 0.08526,-0.05733 0.08526,-0.05733 z"
|
||||
id="path14435"
|
||||
sodipodi:nodetypes="csssssssscc" /><path
|
||||
style="opacity:1;fill:#ffbcbc;fill-opacity:1;stroke:none;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 85.642718,21.837124 -0.122436,0.330478 -1.265187,0.354644 -1.448841,-0.487634 0.16973,-0.311345 0.646347,0.09101 0.653172,-0.03859 0.721455,0.113778 z"
|
||||
id="path17981"
|
||||
sodipodi:nodetypes="ccccccccc" /><path
|
||||
id="path24683"
|
||||
style="fill:#e9c6af;fill-opacity:1;stroke:none;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 84.235436,17.045652 1.160238,2.448221 -0.106183,0.310884 0.02947,2.55e-4 -0.0414,0.03595 -0.01777,0.05147 -0.03868,-0.0027 -0.198337,0.170816 -0.695423,-0.0066 -0.330095,0.06109 -0.310354,-0.165644 0.377309,-0.277305 0.399206,0.132803 0.396209,2.54e-4 0.177438,-0.260699 -0.906095,-2.262792 z" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#rect14429"
|
||||
id="use35559"
|
||||
transform="matrix(-1,0,0,1,166.72851,-0.07252989)"
|
||||
style="stroke-width:1.0988" /><rect
|
||||
style="opacity:1;fill:#483737;fill-opacity:1;stroke:none;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none"
|
||||
id="rect42602"
|
||||
width="2.7775736"
|
||||
height="2.5557561"
|
||||
x="-78.872025"
|
||||
y="11.783834"
|
||||
transform="scale(-1,1)"
|
||||
rx="1.0531088"
|
||||
ry="0.95542276" /><circle
|
||||
style="fill:#241c1c;fill-opacity:1;stroke-width:0.581449;stroke-linecap:round"
|
||||
id="circle1224"
|
||||
cx="85.780228"
|
||||
cy="17.384306"
|
||||
r="0.3905766" /></g><rect
|
||||
style="fill:#f4e3d7;fill-opacity:1;stroke:none;stroke-width:0.10988;stroke-linecap:round"
|
||||
id="rect2174"
|
||||
width="1.0770465"
|
||||
height="7.754735"
|
||||
x="-45.944035"
|
||||
y="-6.1603665"
|
||||
ry="0.53852326"
|
||||
transform="scale(-1,1)" /><rect
|
||||
style="fill:#f4e3d7;fill-opacity:1;stroke:none;stroke-width:0.10988;stroke-linecap:round"
|
||||
id="rect2176"
|
||||
width="1.0770465"
|
||||
height="7.754735"
|
||||
x="-41.65517"
|
||||
y="-5.9907422"
|
||||
ry="0.53852326"
|
||||
transform="scale(-1,1)" /><path
|
||||
style="opacity:1;fill:#4a5360;fill-opacity:1;stroke:none;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 29.738241,31.997418 0.97254,6.900866 2.552923,12.712125 -0.729405,2.663492 1.959226,25.289811 -1.930527,-1.328619 -0.508835,-2.893353 -0.933652,-4.919911 -0.955847,-10.639017 0.333123,-1.480368 -0.394844,-4.876018 -0.607838,-4.237375 -1.580379,-10.775037 -0.850974,-6.658732 z"
|
||||
id="path60295"
|
||||
sodipodi:nodetypes="ccccccccccccccc" /><g
|
||||
id="g42651"
|
||||
inkscape:transform-center-x="3.7551052"
|
||||
inkscape:transform-center-y="20.490455"
|
||||
transform="matrix(-0.9942466,-0.11319421,-0.07606706,0.99712651,80.120769,5.7152424)"><path
|
||||
style="opacity:1;fill:#e25563;fill-opacity:1;stroke-width:2.90724;stroke-linecap:round"
|
||||
d="m 49.183939,-8.8398842 6.638837,3.2596437 c 0,0 1.903706,4.2172663 2.470265,7.260115 0.566559,3.0428487 0.420623,10.8725495 0.420623,10.8725495 L 51.82132,15.34599 51.207747,10.89149 50.427307,7.1848288 49.02955,-2.4687631 Z"
|
||||
id="path42643"
|
||||
sodipodi:nodetypes="cczcccccc" /><g
|
||||
id="g42649"
|
||||
inkscape:transform-center-x="0.56927385"
|
||||
inkscape:transform-center-y="12.501237"
|
||||
transform="matrix(0.98988975,0.16142941,-0.16315094,0.98360715,2.4367661,-8.6661977)"><path
|
||||
style="opacity:1;fill:#e25563;fill-opacity:1;stroke-width:2.90724;stroke-linecap:round"
|
||||
d="m 52.889335,11.456011 c 0,0 -1.042744,3.75575 -1.002365,6.87743 0.04038,3.12168 1.542806,12.571042 1.542806,12.571042 l 1.929642,0.164724 2.111176,0.822208 1.748798,-12.132537 -0.463175,-8.764138 -3.242224,-0.768785 z"
|
||||
id="path42645"
|
||||
inkscape:transform-center-x="0.28044017"
|
||||
inkscape:transform-center-y="8.2729851"
|
||||
sodipodi:nodetypes="czccccccc" /><path
|
||||
style="opacity:1;fill:#ffd9bf;fill-opacity:1;stroke:none;stroke-width:1.1629;stroke-linecap:round;stroke-dasharray:none"
|
||||
d="m 57.24025,31.81161 -0.115414,3.042762 -1.163154,3.355051 -0.279258,0.08485 -1.055871,1.30924 -0.417855,0.139093 -0.752902,0.677498 -0.507867,-0.07005 -0.137597,-0.20681 0.342262,-0.728579 0.71453,-1.387442 0.234671,-0.865674 -0.91513,1.824354 -0.382628,0.540735 -0.330981,0.03992 -0.237975,-0.534081 0.758963,-1.698072 0.330672,-2.22284 -0.120099,-0.824581 -0.854277,0.61128 -0.955652,0.545055 0.0051,-0.759524 2.107525,-3.211462 0.04335,-0.595309 1.87631,0.145424 z"
|
||||
id="path9254" /></g></g><path
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#cb4c59;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 33.749975,23.764806 c 2.373599,-1.319992 4.661624,-2.782023 6.078383,-5.690191 l 8.023469,-0.484272 c 0.974017,1.566105 1.723685,3.087525 4.254868,4.963782 l -0.121566,6.295529 c -5.956817,1.471395 -11.913634,1.877978 -17.870451,1.089611 z"
|
||||
id="path56758"
|
||||
sodipodi:nodetypes="ccccccc" /><path
|
||||
style="opacity:1;fill:#4a5360;fill-opacity:1;stroke:none;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 42.436244,39.850244 2.791476,13.864122 -0.685975,3.877717 1.509171,6.402879 1.245531,15.887821 -1.240671,-0.381432 -0.945934,-4.183565 -0.571183,-0.519764 -1.471104,-12.660493 0.476476,-0.878468 -0.433343,-5.749395 -0.171521,-3.632035 -1.392209,-6.352174 z"
|
||||
id="path59311"
|
||||
sodipodi:nodetypes="cccccccccccccc" /><path
|
||||
style="opacity:1;fill:#4a5360;fill-opacity:1;stroke:none;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 29.85981,37.929742 2.796055,-1.69495 0.364703,-3.632035 0.476793,-0.251576 -0.549425,4.237374 -3.209695,1.878911 z"
|
||||
id="path61879"
|
||||
sodipodi:nodetypes="ccccccc" /><path
|
||||
style="opacity:1;fill:#4a5360;fill-opacity:1;stroke:none;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 44.75577,32.772568 v 3.270485 l -2.606143,1.352004 0.04485,-0.400072 2.156529,-1.199537 -0.03731,-3.337347 z"
|
||||
id="path62805"
|
||||
sodipodi:nodetypes="ccccccc" /><path
|
||||
style="opacity:1;fill:#4a5360;fill-opacity:1;stroke:none;stroke-width:0.290724;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 51.598772,31.424475 0.07774,4.335627 0.544193,0.387112 0.03887,-0.580667 -0.233225,-0.193554 -0.03887,-4.180784 z"
|
||||
id="path64393" /></g></g></svg>
|
After Width: | Height: | Size: 23 KiB |
7
assets/svg/html-logo.svg
Normal file
|
@ -0,0 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||
<title>HTML5 Logo Badge</title>
|
||||
<path fill="#E34F26" d="M71,460 L30,0 481,0 440,460 255,512"/>
|
||||
<path fill="#EF652A" d="M256,472 L405,431 440,37 256,37"/>
|
||||
<path fill="#EBEBEB" d="M256,208 L181,208 176,150 256,150 256,94 255,94 114,94 115,109 129,265 256,265zM256,355 L255,355 192,338 188,293 158,293 132,293 139,382 255,414 256,414z"/>
|
||||
<path fill="#FFF" d="M255,208 L255,265 325,265 318,338 255,355 255,414 371,382 372,372 385,223 387,208 371,208zM255,94 L255,129 255,150 255,150 392,150 392,150 392,150 393,138 396,109 397,94z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 609 B |
324
assets/svg/logo.svg
Normal file
|
@ -0,0 +1,324 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="320"
|
||||
height="120.2875"
|
||||
viewBox="0 0 84.666663 31.826067"
|
||||
version="1.1"
|
||||
id="svg377"
|
||||
inkscape:version="1.2 (dc2aeda, 2022-05-15)"
|
||||
sodipodi:docname="logo.svg"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview379"
|
||||
pagecolor="#1a1c23"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#505050"
|
||||
inkscape:document-units="px"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.9726866"
|
||||
inkscape:cx="137.12264"
|
||||
inkscape:cy="171.5934"
|
||||
inkscape:window-width="1440"
|
||||
inkscape:window-height="847"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="layer1"
|
||||
showguides="false"><inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid8255"
|
||||
originx="-16.541719"
|
||||
originy="-22.080149" /></sodipodi:namedview><defs
|
||||
id="defs374"><linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient7737"><stop
|
||||
style="stop-color:#6f65a1;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop7733" /><stop
|
||||
style="stop-color:#635a8d;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop7735" /></linearGradient><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect2648"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.172605"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect16627"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.172605"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect16569"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.172605"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect16507"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.172605"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="skeletal"
|
||||
id="path-effect16503"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
pattern="M 0,4.9921384 C 0,2.236478 2.236478,0 4.9921384,0 c 2.7556604,0 4.9921384,2.236478 4.9921384,4.9921384 0,2.7556604 -2.236478,4.9921384 -4.9921384,4.9921384 C 2.236478,9.9842768 0,7.7477988 0,4.9921384 Z"
|
||||
copytype="single_stretched"
|
||||
prop_scale="0.003"
|
||||
scale_y_rel="false"
|
||||
spacing="0"
|
||||
normal_offset="0"
|
||||
tang_offset="0"
|
||||
prop_units="false"
|
||||
vertical_pattern="false"
|
||||
hide_knot="false"
|
||||
fuse_tolerance="0" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect15134"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="3.1251169e-15,1.172605"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect15072"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.5"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect14444"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,2"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect11193"
|
||||
is_visible="true"
|
||||
lpeversion="1" /><inkscape:path-effect
|
||||
effect="simplify"
|
||||
id="path-effect11191"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
steps="1"
|
||||
threshold="0.00159091"
|
||||
smooth_angles="360"
|
||||
helper_size="0"
|
||||
simplify_individual_paths="false"
|
||||
simplify_just_coalesce="false" /><linearGradient
|
||||
id="a"
|
||||
x1="82.849998"
|
||||
y1="30.41"
|
||||
x2="51.259998"
|
||||
y2="105.9"
|
||||
gradientTransform="matrix(1,0,0,-1,-22.41,110.97)"
|
||||
gradientUnits="userSpaceOnUse"><stop
|
||||
offset="0"
|
||||
stop-color="#6c56cc"
|
||||
id="stop132" /><stop
|
||||
offset="1"
|
||||
stop-color="#9785e5"
|
||||
id="stop134" /></linearGradient><linearGradient
|
||||
id="a-1"
|
||||
x1="82.849998"
|
||||
y1="30.41"
|
||||
x2="51.259998"
|
||||
y2="105.9"
|
||||
gradientTransform="matrix(1,0,0,-1,-22.41,110.97)"
|
||||
gradientUnits="userSpaceOnUse"><stop
|
||||
offset="0"
|
||||
stop-color="#6c56cc"
|
||||
id="stop4693" /><stop
|
||||
offset="1"
|
||||
stop-color="#9785e5"
|
||||
id="stop4695" /></linearGradient><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="bsplinespiro"
|
||||
linkedpaths="#path14442,0,1"
|
||||
id="path-effect14446"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /><inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect14444-4"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
offset_points="0,1.5"
|
||||
not_jump="false"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="extrp_arc"
|
||||
miter_limit="4"
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth" /><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="bsplinespiro"
|
||||
linkedpaths="#path15070,0,1"
|
||||
id="path-effect15074"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="bsplinespiro"
|
||||
linkedpaths="#path16505,0,1"
|
||||
id="path-effect16509"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="bsplinespiro"
|
||||
linkedpaths="#path16625,0,1"
|
||||
id="path-effect16629"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /><inkscape:path-effect
|
||||
effect="skeletal"
|
||||
id="path-effect16503-6"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
pattern="M 0,4.9921384 C 0,2.236478 2.236478,0 4.9921384,0 c 2.7556604,0 4.9921384,2.236478 4.9921384,4.9921384 0,2.7556604 -2.236478,4.9921384 -4.9921384,4.9921384 C 2.236478,9.9842768 0,7.7477988 0,4.9921384 Z"
|
||||
copytype="single_stretched"
|
||||
prop_scale="0.003"
|
||||
scale_y_rel="false"
|
||||
spacing="0"
|
||||
normal_offset="0"
|
||||
tang_offset="0"
|
||||
prop_units="false"
|
||||
vertical_pattern="false"
|
||||
hide_knot="false"
|
||||
fuse_tolerance="0" /><inkscape:path-effect
|
||||
effect="skeletal"
|
||||
id="path-effect16503-6-4"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
pattern="M 0,4.9921384 C 0,2.236478 2.236478,0 4.9921384,0 c 2.7556604,0 4.9921384,2.236478 4.9921384,4.9921384 0,2.7556604 -2.236478,4.9921384 -4.9921384,4.9921384 C 2.236478,9.9842768 0,7.7477988 0,4.9921384 Z"
|
||||
copytype="single_stretched"
|
||||
prop_scale="0.003"
|
||||
scale_y_rel="false"
|
||||
spacing="0"
|
||||
normal_offset="0"
|
||||
tang_offset="0"
|
||||
prop_units="false"
|
||||
vertical_pattern="false"
|
||||
hide_knot="false"
|
||||
fuse_tolerance="0" /><inkscape:path-effect
|
||||
effect="fill_between_many"
|
||||
method="bsplinespiro"
|
||||
linkedpaths="#path2646,0,1"
|
||||
id="path-effect2650"
|
||||
is_visible="true"
|
||||
lpeversion="0"
|
||||
join="true"
|
||||
close="true"
|
||||
autoreverse="true" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient7737"
|
||||
id="linearGradient9260"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(0,0.17598448)"
|
||||
x1="87.472885"
|
||||
y1="56.816868"
|
||||
x2="87.472885"
|
||||
y2="44.941002" /></defs><g
|
||||
inkscape:label="Слой 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-49.584181,-29.936594)"><g
|
||||
id="g5455"><g
|
||||
id="g697"
|
||||
transform="matrix(0.97034993,0,0,0.88973193,17.342532,2.6749298)"
|
||||
style="fill:none;stroke:#9a8bdc;stroke-width:0.284753;stroke-dasharray:none;stroke-opacity:1"><path
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#9a8bdc;stroke-width:0.284753;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 74.197436,56.449064 89.072729,33.475003 99.981275,32.483317 101.30352,40.747369 85.601827,64.878395 75.023841,65.7048 Z"
|
||||
id="path693" /><path
|
||||
style="opacity:0.648294;fill:none;fill-opacity:1;stroke:#9a8bdc;stroke-width:0.284753;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 99.815995,32.483317 75.023841,65.7048 74.197436,56.449064 89.072729,33.475003 Z"
|
||||
id="path695" /></g><g
|
||||
id="g16678"
|
||||
transform="matrix(0.14013025,-0.74430561,0.6824677,0.12848804,31.271065,102.1617)"
|
||||
style="fill:none;stroke:#9a8bdc;stroke-width:0.364823;stroke-dasharray:none;stroke-opacity:1"><path
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#9a8bdc;stroke-width:0.364823;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 74.197436,56.449064 89.072729,33.475003 99.981275,32.483317 101.30352,40.747369 85.601827,64.878395 75.023841,65.7048 Z"
|
||||
id="path16674" /><path
|
||||
style="opacity:0.648294;fill:none;fill-opacity:1;stroke:#9a8bdc;stroke-width:0.364823;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 99.815995,32.483317 75.023841,65.7048 74.197436,56.449064 89.072729,33.475003 Z"
|
||||
id="path16676" /></g></g></g></svg>
|
After Width: | Height: | Size: 11 KiB |
20
assets/svg/obsidian.svg
Normal file
|
@ -0,0 +1,20 @@
|
|||
<svg viewBox="0 0 100 100" width="30" height="30" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<linearGradient id="a" x1="82.85" y1="30.41" x2="51.26" y2="105.9" gradientTransform="matrix(1, 0, 0, -1, -22.41, 110.97)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#6c56cc">
|
||||
</stop>
|
||||
<stop offset="1" stop-color="#9785e5">
|
||||
</stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<polygon points="44.61 0 12.91 17.52 0 45.45 19.57 90.47 47.35 100 52.44 89.8 63 26.39 44.61 0" fill="#34208c">
|
||||
</polygon>
|
||||
<polygon points="63 26.39 43.44 14.41 16.43 35.7 47.35 100 52.44 89.8 63 26.39" fill="url(#a)">
|
||||
</polygon>
|
||||
<polygon points="63 26.39 63 26.39 44.61 0 43.44 14.41 63 26.39" fill="#af9ff4">
|
||||
</polygon>
|
||||
<polygon points="43.44 14.41 44.61 0 12.91 17.52 16.43 35.7 43.44 14.41" fill="#4a37a0">
|
||||
</polygon>
|
||||
<polygon points="16.43 35.7 19.57 90.47 47.35 100 16.43 35.7" fill="#4a37a0">
|
||||
</polygon>
|
||||
</svg>
|
After Width: | Height: | Size: 957 B |
20
assets/svg/postgres-logo.svg
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="432.071pt" height="445.383pt" viewBox="0 0 432.071 445.383" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="orginal" style="fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
|
||||
</g>
|
||||
<g id="Layer_x0020_3" style="fill-rule:nonzero;clip-rule:nonzero;fill:none;stroke:#FFFFFF;stroke-width:12.4651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;">
|
||||
<path style="fill:#000000;stroke:#000000;stroke-width:37.3953;stroke-linecap:butt;stroke-linejoin:miter;" d="M323.205,324.227c2.833-23.601,1.984-27.062,19.563-23.239l4.463,0.392c13.517,0.615,31.199-2.174,41.587-7c22.362-10.376,35.622-27.7,13.572-23.148c-50.297,10.376-53.755-6.655-53.755-6.655c53.111-78.803,75.313-178.836,56.149-203.322 C352.514-5.534,262.036,26.049,260.522,26.869l-0.482,0.089c-9.938-2.062-21.06-3.294-33.554-3.496c-22.761-0.374-40.032,5.967-53.133,15.904c0,0-161.408-66.498-153.899,83.628c1.597,31.936,45.777,241.655,98.47,178.31 c19.259-23.163,37.871-42.748,37.871-42.748c9.242,6.14,20.307,9.272,31.912,8.147l0.897-0.765c-0.281,2.876-0.157,5.689,0.359,9.019c-13.572,15.167-9.584,17.83-36.723,23.416c-27.457,5.659-11.326,15.734-0.797,18.367c12.768,3.193,42.305,7.716,62.268-20.224 l-0.795,3.188c5.325,4.26,4.965,30.619,5.72,49.452c0.756,18.834,2.017,36.409,5.856,46.771c3.839,10.36,8.369,37.05,44.036,29.406c29.809-6.388,52.6-15.582,54.677-101.107"/>
|
||||
<path style="fill:#336791;stroke:none;" d="M402.395,271.23c-50.302,10.376-53.76-6.655-53.76-6.655c53.111-78.808,75.313-178.843,56.153-203.326c-52.27-66.785-142.752-35.2-144.262-34.38l-0.486,0.087c-9.938-2.063-21.06-3.292-33.56-3.496c-22.761-0.373-40.026,5.967-53.127,15.902 c0,0-161.411-66.495-153.904,83.63c1.597,31.938,45.776,241.657,98.471,178.312c19.26-23.163,37.869-42.748,37.869-42.748c9.243,6.14,20.308,9.272,31.908,8.147l0.901-0.765c-0.28,2.876-0.152,5.689,0.361,9.019c-13.575,15.167-9.586,17.83-36.723,23.416 c-27.459,5.659-11.328,15.734-0.796,18.367c12.768,3.193,42.307,7.716,62.266-20.224l-0.796,3.188c5.319,4.26,9.054,27.711,8.428,48.969c-0.626,21.259-1.044,35.854,3.147,47.254c4.191,11.4,8.368,37.05,44.042,29.406c29.809-6.388,45.256-22.942,47.405-50.555 c1.525-19.631,4.976-16.729,5.194-34.28l2.768-8.309c3.192-26.611,0.507-35.196,18.872-31.203l4.463,0.392c13.517,0.615,31.208-2.174,41.591-7c22.358-10.376,35.618-27.7,13.573-23.148z"/>
|
||||
<path d="M215.866,286.484c-1.385,49.516,0.348,99.377,5.193,111.495c4.848,12.118,15.223,35.688,50.9,28.045c29.806-6.39,40.651-18.756,45.357-46.051c3.466-20.082,10.148-75.854,11.005-87.281"/>
|
||||
<path d="M173.104,38.256c0,0-161.521-66.016-154.012,84.109c1.597,31.938,45.779,241.664,98.473,178.316c19.256-23.166,36.671-41.335,36.671-41.335"/>
|
||||
<path d="M260.349,26.207c-5.591,1.753,89.848-34.889,144.087,34.417c19.159,24.484-3.043,124.519-56.153,203.329"/>
|
||||
<path style="stroke-linejoin:bevel;" d="M348.282,263.953c0,0,3.461,17.036,53.764,6.653c22.04-4.552,8.776,12.774-13.577,23.155c-18.345,8.514-59.474,10.696-60.146-1.069c-1.729-30.355,21.647-21.133,19.96-28.739c-1.525-6.85-11.979-13.573-18.894-30.338 c-6.037-14.633-82.796-126.849,21.287-110.183c3.813-0.789-27.146-99.002-124.553-100.599c-97.385-1.597-94.19,119.762-94.19,119.762"/>
|
||||
<path d="M188.604,274.334c-13.577,15.166-9.584,17.829-36.723,23.417c-27.459,5.66-11.326,15.733-0.797,18.365c12.768,3.195,42.307,7.718,62.266-20.229c6.078-8.509-0.036-22.086-8.385-25.547c-4.034-1.671-9.428-3.765-16.361,3.994z"/>
|
||||
<path d="M187.715,274.069c-1.368-8.917,2.93-19.528,7.536-31.942c6.922-18.626,22.893-37.255,10.117-96.339c-9.523-44.029-73.396-9.163-73.436-3.193c-0.039,5.968,2.889,30.26-1.067,58.548c-5.162,36.913,23.488,68.132,56.479,64.938"/>
|
||||
<path style="fill:#FFFFFF;stroke-width:4.155;stroke-linecap:butt;stroke-linejoin:miter;" d="M172.517,141.7c-0.288,2.039,3.733,7.48,8.976,8.207c5.234,0.73,9.714-3.522,9.998-5.559c0.284-2.039-3.732-4.285-8.977-5.015c-5.237-0.731-9.719,0.333-9.996,2.367z"/>
|
||||
<path style="fill:#FFFFFF;stroke-width:2.0775;stroke-linecap:butt;stroke-linejoin:miter;" d="M331.941,137.543c0.284,2.039-3.732,7.48-8.976,8.207c-5.238,0.73-9.718-3.522-10.005-5.559c-0.277-2.039,3.74-4.285,8.979-5.015c5.239-0.73,9.718,0.333,10.002,2.368z"/>
|
||||
<path d="M350.676,123.432c0.863,15.994-3.445,26.888-3.988,43.914c-0.804,24.748,11.799,53.074-7.191,81.435"/>
|
||||
<path style="stroke-width:3;" d="M0,60.232"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
9
assets/svg/react-logo.svg
Normal file
|
@ -0,0 +1,9 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-11.5 -10.23174 23 20.46348">
|
||||
<title>React Logo</title>
|
||||
<circle cx="0" cy="0" r="2.05" fill="#61dafb"/>
|
||||
<g stroke="#61dafb" stroke-width="1" fill="none">
|
||||
<ellipse rx="11" ry="4.2"/>
|
||||
<ellipse rx="11" ry="4.2" transform="rotate(60)"/>
|
||||
<ellipse rx="11" ry="4.2" transform="rotate(120)"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 365 B |
11
assets/svg/react-native-logo.svg
Normal file
|
@ -0,0 +1,11 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-11.5 -10.23174 23 20.46348">
|
||||
<title>
|
||||
React Logo
|
||||
</title>
|
||||
<circle cx="0" cy="0" r="2.05" fill="#fb6677" />
|
||||
<g stroke="#fb6677" stroke-width="1" fill="none">
|
||||
<ellipse rx="11" ry="4.2" />
|
||||
<ellipse rx="11" ry="4.2" transform="rotate(60)" />
|
||||
<ellipse rx="11" ry="4.2" transform="rotate(120)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 365 B |
11
assets/svg/react-ssr-logo.svg
Normal file
|
@ -0,0 +1,11 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-11.5 -10.23174 23 20.46348">
|
||||
<title>
|
||||
React Logo
|
||||
</title>
|
||||
<circle cx="0" cy="0" r="2.05" fill="#66bb77" />
|
||||
<g stroke="#66bb77" stroke-width="1" fill="none">
|
||||
<ellipse rx="11" ry="4.2" />
|
||||
<ellipse rx="11" ry="4.2" transform="rotate(60)" />
|
||||
<ellipse rx="11" ry="4.2" transform="rotate(120)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 365 B |
56
assets/svg/svg-logo.svg
Normal file
|
@ -0,0 +1,56 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" viewBox="0 0 300 300">
|
||||
|
||||
<title>SVG Logo</title>
|
||||
<desc>Designed for the SVG Logo Contest in 2006 by Harvey Rayner, and adopted by W3C in 2009. It is available under the Creative Commons license for those who have an SVG product or who are using SVG on their site.</desc>
|
||||
|
||||
<metadata id="license">
|
||||
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/">
|
||||
<cc:Work rdf:about="">
|
||||
<dc:title>SVG Logo</dc:title>
|
||||
<dc:date>14-08-2009</dc:date>
|
||||
<dc:creator>
|
||||
<cc:Agent><dc:title>W3C</dc:title></cc:Agent>
|
||||
<cc:Agent><dc:title>Harvey Rayner, designer</dc:title></cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:description>See document description</dc:description>
|
||||
<cc:license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/2.5/"/>
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
</cc:Work>
|
||||
<cc:License rdf:about="http://creativecommons.org/licenses/by-nc-sa/2.5/">
|
||||
<cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
|
||||
<cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
|
||||
<cc:requires rdf:resource="http://web.resource.org/cc/Notice"/>
|
||||
<cc:requires rdf:resource="http://web.resource.org/cc/Attribution"/>
|
||||
<cc:prohibits rdf:resource="http://web.resource.org/cc/CommercialUse"/>
|
||||
<cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
|
||||
<cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike"/>
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
|
||||
|
||||
<defs>
|
||||
<g id="SVG" fill="#ffffff" transform="scale(2) translate(20,79)">
|
||||
<path id="S" d="M 5.482,31.319 C2.163,28.001 0.109,23.419 0.109,18.358 C0.109,8.232 8.322,0.024 18.443,0.024 C28.569,0.024 36.782,8.232 36.782,18.358 L26.042,18.358 C26.042,14.164 22.638,10.765 18.443,10.765 C14.249,10.765 10.850,14.164 10.850,18.358 C10.850,20.453 11.701,22.351 13.070,23.721 L13.075,23.721 C14.450,25.101 15.595,25.500 18.443,25.952 L18.443,25.952 C23.509,26.479 28.091,28.006 31.409,31.324 L31.409,31.324 C34.728,34.643 36.782,39.225 36.782,44.286 C36.782,54.412 28.569,62.625 18.443,62.625 C8.322,62.625 0.109,54.412 0.109,44.286 L10.850,44.286 C10.850,48.480 14.249,51.884 18.443,51.884 C22.638,51.884 26.042,48.480 26.042,44.286 C26.042,42.191 25.191,40.298 23.821,38.923 L23.816,38.923 C22.441,37.548 20.468,37.074 18.443,36.697 L18.443,36.692 C13.533,35.939 8.800,34.638 5.482,31.319 L5.482,31.319 L5.482,31.319 Z"/>
|
||||
|
||||
<path id="V" d="M 73.452,0.024 L60.482,62.625 L49.742,62.625 L36.782,0.024 L47.522,0.024 L55.122,36.687 L62.712,0.024 L73.452,0.024 Z"/>
|
||||
|
||||
<path id="G" d="M 91.792,25.952 L110.126,25.952 L110.126,44.286 L110.131,44.286 C110.131,54.413 101.918,62.626 91.792,62.626 C81.665,62.626 73.458,54.413 73.458,44.286 L73.458,44.286 L73.458,18.359 L73.453,18.359 C73.453,8.233 81.665,0.025 91.792,0.025 C101.913,0.025 110.126,8.233 110.126,18.359 L99.385,18.359 C99.385,14.169 95.981,10.765 91.792,10.765 C87.597,10.765 84.198,14.169 84.198,18.359 L84.198,44.286 L84.198,44.286 C84.198,48.481 87.597,51.880 91.792,51.880 C95.981,51.880 99.380,48.481 99.385,44.291 L99.385,44.286 L99.385,36.698 L91.792,36.698 L91.792,25.952 L91.792,25.952 Z"/>
|
||||
</g>
|
||||
</defs>
|
||||
|
||||
<path id="base" fill="#000" d="M8.5,150 H291.5 V250 C291.5,273.5 273.5,291.5 250,291.5 H50 C26.5,291.5 8.5,273.5 8.5,250 Z"/>
|
||||
<g stroke-width="38.0086" stroke="#000">
|
||||
<g id="svgstar" transform="translate(150, 150)">
|
||||
<path id="svgbar" fill="#ffb13b" d="M-84.1487,-15.8513 a22.4171,22.4171 0 1 0 0,31.7026 h168.2974 a22.4171,22.4171 0 1 0 0,-31.7026 Z"/>
|
||||
<use xlink:href="#svgbar" transform="rotate(45)"/>
|
||||
<use xlink:href="#svgbar" transform="rotate(90)"/>
|
||||
<use xlink:href="#svgbar" transform="rotate(135)"/>
|
||||
</g>
|
||||
</g>
|
||||
<use xlink:href="#svgstar"/>
|
||||
<use xlink:href="#base" opacity="0.85"/>
|
||||
<use xlink:href="#SVG"/>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 4.1 KiB |
96
assets/svg/swagger-logo.svg
Normal file
|
@ -0,0 +1,96 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="Layer_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 100.055 100.054"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="swagger-logo.svg"
|
||||
width="100.055"
|
||||
height="100.054"
|
||||
inkscape:version="1.2 (dc2aeda, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs4509" /><sodipodi:namedview
|
||||
id="namedview4507"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#505050"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.011291"
|
||||
inkscape:cx="305.0556"
|
||||
inkscape:cy="27.68738"
|
||||
inkscape:window-width="1440"
|
||||
inkscape:window-height="454"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="g4504" />
|
||||
<style
|
||||
type="text/css"
|
||||
id="style4380">
|
||||
.st0{fill:#FFFFFF;}
|
||||
.st1{fill:#2C282C;}
|
||||
.st2{fill:#173647;}
|
||||
.st3{fill:#50E4EA;}
|
||||
.st4{fill:#FCDC00;}
|
||||
.st5{fill:#85EA2D;}
|
||||
.st6{fill:#F4CF14;}
|
||||
.st7{fill:none;}
|
||||
.st8{fill:#04AADB;}
|
||||
.st9{fill:#07CED6;}
|
||||
.st10{fill:#63DB2A;}
|
||||
.st11{fill:#FF730B;}
|
||||
.st12{fill:#17D1FC;}
|
||||
.st13{fill:#00AADB;}
|
||||
.st14{fill:#758491;}
|
||||
</style>
|
||||
<g
|
||||
id="g4504"
|
||||
transform="translate(-0.301)">
|
||||
|
||||
<g
|
||||
id="g4414">
|
||||
<g
|
||||
id="g4410">
|
||||
<g
|
||||
id="g4408">
|
||||
<g
|
||||
id="g4406">
|
||||
<g
|
||||
id="g4398">
|
||||
<path
|
||||
class="st5"
|
||||
d="m 50.328,97.669 c -26.27,0 -47.643,-21.371 -47.643,-47.642 0,-26.271 21.373,-47.642 47.643,-47.642 26.27,0 47.643,21.373 47.643,47.643 0,26.27 -21.373,47.641 -47.643,47.641 z"
|
||||
id="path4396" />
|
||||
</g>
|
||||
<g
|
||||
id="g4404">
|
||||
<g
|
||||
id="g4402">
|
||||
<path
|
||||
class="st2"
|
||||
d="m 50.328,4.769 c 24.996,0 45.258,20.262 45.258,45.258 0,24.995 -20.262,45.258 -45.258,45.258 C 25.333,95.285 5.07,75.022 5.07,50.027 5.07,25.032 25.333,4.769 50.328,4.769 M 50.328,0 C 22.743,0 0.301,22.442 0.301,50.027 c 0,27.585 22.442,50.027 50.027,50.027 27.585,0 50.028,-22.442 50.028,-50.027 C 100.356,22.442 77.913,0 50.328,0 Z"
|
||||
id="path4400" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
class="st2"
|
||||
d="m 31.802,33.854 c -0.154,1.712 0.057,3.482 -0.057,5.213 -0.135,1.732 -0.347,3.444 -0.693,5.156 -0.481,2.443 -2.001,4.29 -4.097,5.829 4.079,2.655 4.54,6.771 4.809,10.946 0.135,2.251 0.077,4.521 0.308,6.752 0.173,1.731 0.846,2.174 2.636,2.231 0.731,0.019 1.48,0 2.328,0 v 5.348 c -5.29,0.904 -9.657,-0.596 -10.735,-5.078 -0.347,-1.635 -0.578,-3.309 -0.654,-5.002 -0.116,-1.789 0.076,-3.578 -0.058,-5.367 -0.385,-4.906 -1.02,-6.56 -5.713,-6.791 v -6.098 c 0.346,-0.077 0.673,-0.135 1.019,-0.173 2.578,-0.135 3.674,-0.924 4.232,-3.463 0.27,-1.423 0.424,-2.866 0.481,-4.328 0.193,-2.789 0.116,-5.636 0.596,-8.406 0.673,-3.982 3.136,-5.906 7.234,-6.137 1.154,-0.058 2.328,0 3.655,0 v 5.464 c -0.558,0.039 -1.039,0.115 -1.539,0.115 -3.328,-0.116 -3.502,1.019 -3.752,3.789 z m 6.406,12.658 h -0.077 c -1.924,-0.096 -3.578,1.404 -3.675,3.328 -0.096,1.943 1.404,3.598 3.328,3.693 h 0.231 c 1.905,0.116 3.539,-1.347 3.655,-3.251 V 50.09 c 0.039,-1.943 -1.519,-3.539 -3.462,-3.578 z m 12.062,0 c -1.866,-0.058 -3.425,1.404 -3.482,3.251 0,0.116 0,0.212 0.02,0.327 0,2.097 1.423,3.444 3.578,3.444 2.116,0 3.444,-1.385 3.444,-3.559 -0.02,-2.097 -1.425,-3.482 -3.56,-3.463 z m 12.351,0 c -1.962,-0.039 -3.598,1.52 -3.655,3.482 0,1.962 1.577,3.539 3.539,3.539 h 0.039 c 1.77,0.308 3.559,-1.404 3.675,-3.462 0.095,-1.905 -1.636,-3.559 -3.598,-3.559 z M 79.569,46.8 C 77.337,46.704 76.221,45.954 75.664,43.837 75.317,42.491 75.106,41.086 75.029,39.701 74.875,37.123 74.894,34.526 74.721,31.948 74.317,25.831 69.893,23.696 63.467,24.753 v 5.31 c 1.019,0 1.808,0 2.597,0.019 1.366,0.019 2.405,0.539 2.539,2.059 0.135,1.385 0.135,2.789 0.27,4.194 0.27,2.79 0.423,5.617 0.904,8.368 0.424,2.27 1.982,3.963 3.924,5.348 -3.404,2.289 -4.405,5.559 -4.578,9.234 -0.096,2.52 -0.154,5.059 -0.288,7.599 -0.116,2.308 -0.923,3.058 -3.251,3.116 -0.654,0.019 -1.289,0.077 -2.02,0.116 v 5.444 c 1.366,0 2.616,0.077 3.866,0 3.886,-0.231 6.233,-2.116 7.003,-5.887 0.327,-2.078 0.519,-4.174 0.577,-6.271 0.134,-1.924 0.116,-3.867 0.308,-5.771 0.288,-2.982 1.654,-4.213 4.636,-4.405 0.289,-0.039 0.558,-0.096 0.828,-0.192 V 46.935 C 80.281,46.877 79.934,46.82 79.569,46.8 Z"
|
||||
id="path4412" />
|
||||
</g>
|
||||
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.5 KiB |
6
assets/svg/ts-logo.svg
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="512" height="512" fill="none" version="1.1" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
<title>TypeScript logo</title>
|
||||
<rect width="512" height="512" rx="50" fill="#3178c6"/>
|
||||
<path d="m317 407v50c8.1 4.2 18 7.3 29 9.4s23 3.1 35 3.1c12 0 23-1.1 34-3.4 11-2.3 20-6.1 28-11 8.1-5.3 15-12 19-21s7.1-19 7.1-32c0-9.1-1.4-17-4.1-24s-6.6-13-12-18c-5.1-5.3-11-10-18-14s-15-8.2-24-12c-6.6-2.7-12-5.3-18-7.9-5.2-2.6-9.7-5.2-13-7.8-3.7-2.7-6.5-5.5-8.5-8.4-2-3-3-6.3-3-10 0-3.4 0.89-6.5 2.7-9.3s4.3-5.1 7.5-7.1c3.2-2 7.2-3.5 12-4.6 4.7-1.1 9.9-1.6 16-1.6 4.2 0 8.6 0.31 13 0.94 4.6 0.63 9.3 1.6 14 2.9 4.7 1.3 9.3 2.9 14 4.9 4.4 2 8.5 4.3 12 6.9v-47c-7.6-2.9-16-5.1-25-6.5s-19-2.1-31-2.1c-12 0-23 1.3-34 3.8s-20 6.5-28 12c-8.1 5.4-14 12-19 21-4.7 8.4-7 18-7 30 0 15 4.3 28 13 38 8.6 11 22 19 39 27 6.9 2.8 13 5.6 19 8.3s11 5.5 15 8.4c4.3 2.9 7.7 6.1 10 9.5 2.5 3.4 3.8 7.4 3.8 12 0 3.2-0.78 6.2-2.3 9s-3.9 5.2-7.1 7.2-7.1 3.6-12 4.8c-4.7 1.1-10 1.7-17 1.7-11 0-22-1.9-32-5.7-11-3.8-21-9.5-30-17zm-84-123h64v-41h-179v41h64v183h51z" clip-rule="evenodd" fill="#fff" fill-rule="evenodd" style="fill:#fff"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
2
assets/svg/vue-logo.svg
Normal file
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" viewBox="0 0 261.76 226.69" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(1.3333 0 0 -1.3333 -76.311 313.34)"><g transform="translate(178.06 235.01)"><path d="m0 0-22.669-39.264-22.669 39.264h-75.491l98.16-170.02 98.16 170.02z" fill="#41b883"/></g><g transform="translate(178.06 235.01)"><path d="m0 0-22.669-39.264-22.669 39.264h-36.227l58.896-102.01 58.896 102.01z" fill="#34495e"/></g></g></svg>
|
After Width: | Height: | Size: 466 B |
44
components/bio/BioHeading.vue
Normal file
|
@ -0,0 +1,44 @@
|
|||
<template>
|
||||
<section :class="$style.grid">
|
||||
<div>
|
||||
<img src="~/assets/svg/howdy.svg" />
|
||||
</div>
|
||||
|
||||
<div :class="$style.text">
|
||||
<h1>Howdy!</h1>
|
||||
|
||||
<p>
|
||||
My name is <b>Fedor Katurov</b>, I'm a fullstack developer from Siberia.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
I develop frontend applications with <b>React</b>, <b>Vue</b> and
|
||||
numerous other frameworks for the most of my time, but I'm also capable
|
||||
of doing <b>Typescript</b> and <b>Golang</b> backend.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
I've started coding more than 15 years ago as a hobby and still love
|
||||
doing that on my work and free time.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup></script>
|
||||
|
||||
<style lang="scss" module>
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 2fr;
|
||||
grid-column-gap: 40px;
|
||||
}
|
||||
|
||||
.text {
|
||||
color: var(--color-text-secondary);
|
||||
|
||||
b {
|
||||
color: var(--color-text);
|
||||
}
|
||||
}
|
||||
</style>
|
20
components/bio/BioProjects.vue
Normal file
|
@ -0,0 +1,20 @@
|
|||
<template>
|
||||
<section :class="$style.projects">
|
||||
<h2>My Projects</h2>
|
||||
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quaerat natus
|
||||
perspiciatis ad voluptatum nisi saepe, molestiae autem dolores est modi
|
||||
quod inventore similique omnis asperiores. Qui beatae magnam ab
|
||||
consequatur.
|
||||
</p>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup></script>
|
||||
|
||||
<style lang="scss" module>
|
||||
.projects {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
30
components/bio/BioSkills.vue
Normal file
|
@ -0,0 +1,30 @@
|
|||
<template>
|
||||
<div>
|
||||
<h1>Skills</h1>
|
||||
|
||||
<div :class="$style.list">
|
||||
<SkillsCard
|
||||
:title="skill.title"
|
||||
:level="skill.level"
|
||||
:description="skill.description ?? ''"
|
||||
:key="skill.title"
|
||||
v-for="skill in skills"
|
||||
>
|
||||
<img :src="skill.icon" width="48" height="48" />
|
||||
</SkillsCard>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { skills } from "~~/constants/skills";
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
.list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
|
||||
row-gap: 20px;
|
||||
column-gap: 20px;
|
||||
}
|
||||
</style>
|
110
components/home/HomeHeader.vue
Normal file
|
@ -0,0 +1,110 @@
|
|||
<template>
|
||||
<section>
|
||||
<div :class="$style.grid">
|
||||
<div :class="$style.text">
|
||||
<h1 :class="$style.title">Welcome to my Obsidian Garden</h1>
|
||||
|
||||
<p :class="$style.subtitle">
|
||||
<img src="~/assets/svg/obsidian.svg" alt="" width="14" height="14" />
|
||||
<NuxtLink to="https://obsidian.md" target="_blank">Obsidian</NuxtLink>
|
||||
is a note-taking app, that I use to store chunks of code and technical
|
||||
documentation.
|
||||
</p>
|
||||
|
||||
<div :class="$style.buttons">
|
||||
<UiActionButton
|
||||
href="https://github.com/muerwre"
|
||||
target="_blank"
|
||||
variant="outline"
|
||||
>
|
||||
Visit my Github
|
||||
<template v-slot:suffix>
|
||||
<IconsArrowRight width="22" height="22" fill="currentColor" />
|
||||
</template>
|
||||
</UiActionButton>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div :class="$style.image">
|
||||
<img
|
||||
src="~/assets/svg/desk.svg"
|
||||
:class="$style.desk"
|
||||
alt="It's me, muerwre"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<style lang="scss" module>
|
||||
@import "~~/assets/css/mixins";
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: 14fr 10fr;
|
||||
column-gap: 50px;
|
||||
border-bottom: 2px solid var(--color-line);
|
||||
|
||||
@include desktop {
|
||||
// grid-template-columns: 1fr 1fr;
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-rows: auto auto;
|
||||
column-gap: 20px;
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
|
||||
.image {
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
|
||||
@include desktop {
|
||||
border-bottom: 2px solid var(--color-line);
|
||||
justify-content: center;
|
||||
|
||||
.desk {
|
||||
max-width: 400px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 3rem;
|
||||
line-height: 3.4rem;
|
||||
margin: 0.8rem 0;
|
||||
|
||||
@include phone {
|
||||
font-size: 2.5rem;
|
||||
line-height: 3rem;
|
||||
}
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
color: var(--color-text-secondary);
|
||||
max-width: 360px;
|
||||
|
||||
@include desktop {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.text {
|
||||
padding-bottom: 60px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
|
||||
@include tablet {
|
||||
text-align: center;
|
||||
padding-top: 0;
|
||||
padding-bottom: 40px;
|
||||
}
|
||||
}
|
||||
.desk {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.buttons {
|
||||
margin-top: 50px;
|
||||
}
|
||||
</style>
|
10
components/icons/ArrowRight.vue
Normal file
|
@ -0,0 +1,10 @@
|
|||
<template>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
height="48"
|
||||
width="48"
|
||||
viewBox="0 0 48 48"
|
||||
>
|
||||
<path d="m24 40-2.1-2.15L34.25 25.5H8v-3h26.25L21.9 10.15 24 8l16 16Z" />
|
||||
</svg>
|
||||
</template>
|
12
components/icons/IconStar.vue
Normal file
|
@ -0,0 +1,12 @@
|
|||
<template>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
height="48"
|
||||
width="48"
|
||||
viewBox="0 0 48 48"
|
||||
>
|
||||
<path
|
||||
d="m11.65 44 3.25-14.05L4 20.5l14.4-1.25L24 6l5.6 13.25L44 20.5l-10.9 9.45L36.35 44 24 36.55Z"
|
||||
/>
|
||||
</svg>
|
||||
</template>
|
|
@ -1,6 +1,13 @@
|
|||
<template>
|
||||
<nav>
|
||||
<div :class="$style.section_title">Reference</div>
|
||||
<div :class="$style.logo">
|
||||
<NuxtLink to="/">
|
||||
<div :class="$style.title">Obsidian Garden</div>
|
||||
<div :class="$style.subtitle">by muerwre</div>
|
||||
</NuxtLink>
|
||||
</div>
|
||||
|
||||
<div :class="$style.section_title">Cheatsheet</div>
|
||||
|
||||
<div v-for="item in parentItems" key="item._path" :class="$style.row">
|
||||
<LayoutMainMenuRow
|
||||
|
@ -30,7 +37,37 @@ const parentItems = navigation.value.filter(
|
|||
font-size: 1.6rem;
|
||||
}
|
||||
|
||||
.logo {
|
||||
display: flex;
|
||||
background: url("~~/assets/svg/logo.svg") no-repeat 50% 50%;
|
||||
background-size: contain;
|
||||
padding: 30px 0 15px;
|
||||
text-shadow: var(--color-menu-background) 3px 3px,
|
||||
var(--color-menu-background) -3px -3px;
|
||||
|
||||
a {
|
||||
width: 100%;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
.logo_image {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.row {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-family: var(--family-roboto-slab);
|
||||
font-weight: 700;
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
font-size: 0.8rem;
|
||||
color: var(--color-text-secondary);
|
||||
}
|
||||
</style>
|
||||
|
|
77
components/skills/SkillsCard.vue
Normal file
|
@ -0,0 +1,77 @@
|
|||
<template>
|
||||
<div :class="$style.card">
|
||||
<div :class="$style.grid">
|
||||
<div :class="$style.icon">
|
||||
<slot />
|
||||
</div>
|
||||
|
||||
<div :class="$style.text">
|
||||
<h3 :class="$style.title">{{ title }}</h3>
|
||||
<UiStars :count="level" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div :class="$style.description">
|
||||
{{ description }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
interface Props {
|
||||
title: string;
|
||||
description: string;
|
||||
level: number;
|
||||
}
|
||||
|
||||
defineProps<Props>();
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
.card {
|
||||
border-radius: 8px;
|
||||
border: 1px solid var(--color-line);
|
||||
transition: all 0.25s;
|
||||
|
||||
&:hover {
|
||||
background-color: var(--color-line);
|
||||
|
||||
&,
|
||||
& > .grid {
|
||||
border-color: var(--color-text-secondary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: 48px 1fr;
|
||||
grid-column-gap: 16px;
|
||||
align-items: center;
|
||||
border-bottom: 1px solid var(--color-line);
|
||||
padding: 10px;
|
||||
transition: all 0.25s;
|
||||
}
|
||||
|
||||
.title {
|
||||
margin: 0 0 4px 0;
|
||||
}
|
||||
|
||||
.icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.text {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
||||
.description {
|
||||
font-size: 0.9rem;
|
||||
line-height: 1.4rem;
|
||||
color: var(--color-text-secondary);
|
||||
padding: 10px;
|
||||
}
|
||||
</style>
|
115
components/ui/UiActionButton.vue
Normal file
|
@ -0,0 +1,115 @@
|
|||
<template>
|
||||
<NuxtLink
|
||||
:class="[
|
||||
$style.button,
|
||||
$attrs.style,
|
||||
$style[`variant-${variant}`],
|
||||
$style[`size-${size}`],
|
||||
{
|
||||
[$style.prefixed]: $slots.prefix,
|
||||
[$style.suffixed]: $slots.suffix,
|
||||
},
|
||||
]"
|
||||
:to="href"
|
||||
>
|
||||
<span v-if="$slots.prefix" :class="$style.prefix">
|
||||
<slot name="prefix" />
|
||||
</span>
|
||||
|
||||
<span :class="$style.title">
|
||||
<slot />
|
||||
</span>
|
||||
|
||||
<span v-if="$slots.suffix" :class="$style.suffix">
|
||||
<slot name="suffix" />
|
||||
</span>
|
||||
</NuxtLink>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
interface Props {
|
||||
href: string;
|
||||
size?: "md";
|
||||
variant?: "outline";
|
||||
}
|
||||
|
||||
withDefaults(defineProps<Props>(), {
|
||||
size: "md",
|
||||
variant: "outline",
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
.button {
|
||||
color: white;
|
||||
border-radius: 8px;
|
||||
text-decoration: none;
|
||||
|
||||
&.variant-outline {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-shadow: var(--color-text) 0 0 0 1px;
|
||||
color: var(--color-text);
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
transition: all 250ms;
|
||||
|
||||
&::after {
|
||||
content: " ";
|
||||
background: var(--color-primary);
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
transform: scale(0);
|
||||
opacity: 0;
|
||||
transition: all 250ms;
|
||||
z-index: 0;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: var(--color-background);
|
||||
box-shadow: var(--color-background) 0 0 0 1px;
|
||||
|
||||
&::after {
|
||||
transform: scale(1);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.size-md {
|
||||
height: 40px;
|
||||
padding: 0 30px;
|
||||
|
||||
&.prefixed,
|
||||
&.suffixed {
|
||||
padding: 0 10px 0 20px;
|
||||
}
|
||||
|
||||
&.suffixed {
|
||||
padding-right: 0 20px 0 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
z-index: 1;
|
||||
position: relative;
|
||||
|
||||
.size-md.prefixed & {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.size-md.suffixed & {
|
||||
padding-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.prefix,
|
||||
.suffix {
|
||||
display: inline-flex;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
</style>
|
51
components/ui/UiStars.vue
Normal file
|
@ -0,0 +1,51 @@
|
|||
<template>
|
||||
<div :class="$style.rating">
|
||||
<IconsIconStar
|
||||
v-for="i in 5"
|
||||
:width="22"
|
||||
height="22"
|
||||
:class="[$style.star, { [$style.filled]: i > count }]"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
interface Props {
|
||||
count: number;
|
||||
}
|
||||
|
||||
defineProps<Props>();
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
@import "~~/assets/css/mixins";
|
||||
|
||||
.rating {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-left: -3px;
|
||||
|
||||
& > img {
|
||||
margin-right: 2px;
|
||||
}
|
||||
}
|
||||
|
||||
.star {
|
||||
stroke: none;
|
||||
fill: currentColor;
|
||||
|
||||
@include color_per_child(
|
||||
(
|
||||
var(--color-rating-1),
|
||||
var(--color-rating-2),
|
||||
var(--color-rating-3),
|
||||
var(--color-rating-4),
|
||||
var(--color-rating-5)
|
||||
)
|
||||
);
|
||||
|
||||
&.filled {
|
||||
fill: var(--color-line);
|
||||
}
|
||||
}
|
||||
</style>
|
100
constants/skills.ts
Normal file
|
@ -0,0 +1,100 @@
|
|||
import ReactLogo from "@/assets/svg/react-logo.svg";
|
||||
import ReactNativeLogo from "@/assets/svg/react-native-logo.svg";
|
||||
import ReactSSR from "@/assets/svg/react-ssr-logo.svg";
|
||||
import TsLogo from "@/assets/svg/ts-logo.svg";
|
||||
import GoLangLogo from "@/assets/svg/golang-logo.svg";
|
||||
import HTMLLogo from "@/assets/svg/html-logo.svg";
|
||||
import SVGLogo from "@/assets/svg/svg-logo.svg";
|
||||
import ArchLogo from "@/assets/svg/arch-logo.svg";
|
||||
import GQLLogo from "@/assets/svg/gql-logo.svg";
|
||||
import SwaggerLogo from "@/assets/svg/swagger-logo.svg";
|
||||
import VueLogo from "@/assets/svg/vue-logo.svg";
|
||||
import PostgresLogo from "@/assets/svg/postgres-logo.svg";
|
||||
import DockerLogo from "@/assets/svg/docker-logo.svg";
|
||||
|
||||
interface Skill {
|
||||
title: string;
|
||||
description?: string;
|
||||
icon: string;
|
||||
level: number;
|
||||
}
|
||||
|
||||
export const skills: Skill[] = [
|
||||
{
|
||||
title: "React",
|
||||
description: "Classes and FC-s, hooks, context, redux, redux-saga, mobx",
|
||||
level: 5,
|
||||
icon: ReactLogo,
|
||||
},
|
||||
{
|
||||
title: "Typescript",
|
||||
description:
|
||||
"For both frontend and backend development: generics, guards, infers",
|
||||
level: 4,
|
||||
icon: TsLogo,
|
||||
},
|
||||
{
|
||||
title: "SSR (Next, Gatsby)",
|
||||
description: `Automated generation, incremental, static, and dynamic rendering`,
|
||||
level: 4,
|
||||
icon: ReactSSR,
|
||||
},
|
||||
{
|
||||
title: "Vue.js & Nuxt",
|
||||
description: `Common SPA-s and SSR blogs like this one, with composition API, and Vuex`,
|
||||
level: 3,
|
||||
icon: VueLogo,
|
||||
},
|
||||
{
|
||||
title: "React Native",
|
||||
description: `Basic developing and releasing experience without native modules`,
|
||||
level: 3,
|
||||
icon: ReactNativeLogo,
|
||||
},
|
||||
{
|
||||
title: "Golang",
|
||||
description: "Monolith and microservice apps with REST, GraphQL, and GRPC",
|
||||
level: 2,
|
||||
icon: GoLangLogo,
|
||||
},
|
||||
{
|
||||
title: "Docker",
|
||||
description:
|
||||
"Docker, docker-compose, private registries, gitlab-ci, and drone-ci",
|
||||
level: 4,
|
||||
icon: DockerLogo as string,
|
||||
},
|
||||
{
|
||||
title: "HTML, CSS, SVG",
|
||||
description:
|
||||
"Adaptive markup, all modern techniques, preprocessors, and CSS-in-JS",
|
||||
level: 5,
|
||||
icon: HTMLLogo,
|
||||
},
|
||||
{
|
||||
title: "Linux Shell",
|
||||
description:
|
||||
"Linux user since 2003, can write scripts to automate my work. BTW, I use Arch!",
|
||||
level: 4,
|
||||
icon: ArchLogo as string,
|
||||
},
|
||||
{
|
||||
title: "GraphQL",
|
||||
description:
|
||||
"Both server- and client-side. Queries, mutations, cache manipulation",
|
||||
level: 4,
|
||||
icon: GQLLogo as string,
|
||||
},
|
||||
{
|
||||
title: "REST API",
|
||||
description: "With Axios, fetch, express, gorilla-mux, and gin-gonic",
|
||||
level: 4,
|
||||
icon: SwaggerLogo as string,
|
||||
},
|
||||
{
|
||||
title: "SQL",
|
||||
description: "Base queries, JOIN-s, indexes and simpl query optimizations",
|
||||
level: 2,
|
||||
icon: PostgresLogo as string,
|
||||
},
|
||||
];
|
192
content/Blockchain/Common typescript examples.md
Normal file
|
@ -0,0 +1,192 @@
|
|||
- Simple #dapp example for tests: [https://metamask.github.io/test-dapp/](https://metamask.github.io/test-dapp/)
|
||||
- Interaction with smart contracts described in [Smart contracts](Smart%20contracts.md)
|
||||
|
||||
## Connecting to node
|
||||
|
||||
If #Metamask extension installed, `Web3.givenProvider` is available in global window. You can use [Infura](https://infura.io) or your node instead:
|
||||
|
||||
```typescript
|
||||
import Web3 from 'web3';
|
||||
|
||||
// URL of your node
|
||||
const PROVIDER_URL = 'https://...';
|
||||
|
||||
export const web3 = new Web3(Web3.givenProvider || PROVIDER_URL);
|
||||
```
|
||||
|
||||
## Getting wallet balance
|
||||
|
||||
```typescript
|
||||
const getBalance = async (address: string) => {
|
||||
return await web3.eth.getBalance(address);
|
||||
}
|
||||
```
|
||||
|
||||
## Getting wallet address
|
||||
|
||||
```typescript
|
||||
// first we need to authorize
|
||||
const authorize = async () => {
|
||||
await web3.currentProvider.request({ method: 'eth_requestAccounts' });
|
||||
}
|
||||
|
||||
// then we can get wallet address
|
||||
const getCurrentAddressUser = () => {
|
||||
return web3.currentProvider.selectedAddress;
|
||||
}
|
||||
```
|
||||
|
||||
## Sending transaction
|
||||
|
||||
Sending `value` tokens with `memo` as value:
|
||||
|
||||
```typescript
|
||||
|
||||
const transfer = async ({
|
||||
from,
|
||||
to,
|
||||
value,
|
||||
memo,
|
||||
privateKey,
|
||||
gasLimit = 44000
|
||||
}) => {
|
||||
const nonce = await web3.eth.getTransactionCount(from);
|
||||
const gasPrice = await web3.eth.getGasPrice();
|
||||
|
||||
const rawTx = {
|
||||
from,
|
||||
to,
|
||||
value: web3.utils.toHex(Web3.utils.toWei(value, 'ether')),
|
||||
gasLimit: web3.utils.toHex(gasLimit),
|
||||
gasPrice: web3.utils.toHex(gasPrice),
|
||||
nonce: web3.utils.toHex(nonce),
|
||||
data: memo,
|
||||
};
|
||||
|
||||
const privateKeyBuffer = EthUtil.toBuffer(privateKey);
|
||||
|
||||
const tx = new Transaction(rawTx);
|
||||
|
||||
tx.sign(privateKeyBuffer);
|
||||
const serializedTx = tx.serialize();
|
||||
|
||||
return this.web3.eth.sendSignedTransaction(
|
||||
`0x${serializedTx.toString('hex')}`
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Estimating transaction FEE
|
||||
|
||||
Useful to get fixed amount of tokens from user with pre-estimated fee.
|
||||
|
||||
```typescript
|
||||
import { web3 } from '.';
|
||||
|
||||
const estimateFee = async ({
|
||||
from,
|
||||
to,
|
||||
value,
|
||||
memo,
|
||||
}) => {
|
||||
const gasPrice = await web3.eth.getGasPrice();
|
||||
const gasLimit = await web3.eth.estimateGas({
|
||||
from,
|
||||
to,
|
||||
value: web3.utils.toHex(web3.utils.toWei(value, 'ether')),
|
||||
data: web3.utils.asciiToHex(memo),
|
||||
}).call();
|
||||
|
||||
return web3.utils.fromWei(
|
||||
BigInt(gasPrice.toString())
|
||||
.multiply(BigInt(gasLimit.toString()))
|
||||
.toString()
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Subscribing to wallet address change
|
||||
|
||||
```typescript
|
||||
import { web3 } from '.';
|
||||
|
||||
web3.currentProvider.on('accountsChanged', callback);
|
||||
```
|
||||
|
||||
|
||||
## Watching network change
|
||||
|
||||
```typescript
|
||||
ethereum.on('chainChanged', handler: (chainId: string) => void);
|
||||
```
|
||||
|
||||
## Adding custom token to wallet
|
||||
|
||||
```typescript
|
||||
window.ethereum
|
||||
.request({
|
||||
method: 'wallet_watchAsset',
|
||||
params: {
|
||||
type: 'ERC20',
|
||||
options: {
|
||||
address: '0xb60e8dd61c5d32be8058bb8eb970870f07233155',
|
||||
symbol: 'FOO',
|
||||
decimals: 18,
|
||||
image: 'https://foo.io/token-image.svg',
|
||||
},
|
||||
},
|
||||
})
|
||||
.then((success) => {
|
||||
if (success) {
|
||||
console.log('FOO successfully added to wallet!')
|
||||
} else {
|
||||
throw new Error('Something went wrong.')
|
||||
}
|
||||
})
|
||||
.catch(console.error)
|
||||
```
|
||||
|
||||
## Changing network to custom
|
||||
|
||||
Checking current chainId:
|
||||
|
||||
```typescript
|
||||
const getChainID = async () => {
|
||||
return ethereum.request({ method: 'eth_chainId' })
|
||||
}
|
||||
```
|
||||
|
||||
Asking wallet to change current network:
|
||||
|
||||
```typescript
|
||||
try {
|
||||
await window.ethereum.request({
|
||||
method: 'wallet_switchEthereumChain',
|
||||
params: [{ chainId: '0x03' }], // ropsten chainID (3) in hex
|
||||
});
|
||||
} catch (switchError) {
|
||||
// This error code indicates that the chain has not been added to MetaMask.
|
||||
if (error.code === 4902) {
|
||||
try {
|
||||
await window.ethereum.request({
|
||||
method: 'wallet_addEthereumChain',
|
||||
params: [{
|
||||
chainId: '0x03', // ropsten chainID (3) in hex
|
||||
chainName: 'Ropsten Test Network',
|
||||
nativeCurrency: {
|
||||
name: 'ETH',
|
||||
symbol: 'ETH',
|
||||
decimals: 18
|
||||
},
|
||||
rpcUrls: ['https://ropsten.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161'],
|
||||
blockExplorerUrls: ['https://ropsten.etherscan.io']
|
||||
}] ,
|
||||
});
|
||||
} catch (addError) {
|
||||
// handle "add" error
|
||||
}
|
||||
}
|
||||
// handle other "switch" errors
|
||||
}
|
||||
```
|
||||
|
248
content/Blockchain/Smart contracts.md
Normal file
|
@ -0,0 +1,248 @@
|
|||
For common functions see [Common typescript examples](Common%20typescript%20examples.md).
|
||||
|
||||
## Getting smart contract instance
|
||||
|
||||
Useful for calling smart contract methods:
|
||||
|
||||
```typescript
|
||||
import { Contract } from 'web3-eth-contract';
|
||||
import { web3 } from '.';
|
||||
|
||||
const getContract = (abi: object, address?: string): Contract => {
|
||||
const abiFromJson = JSON.parse(JSON.stringify(abi));
|
||||
return new web3.eth.Contract(abiFromJson, address);
|
||||
};
|
||||
|
||||
export default getContract;
|
||||
```
|
||||
## Executing contract method
|
||||
|
||||
Contract has **read** and **write** methods. To get a list of methods, you can paste contract address on [https://etherscan.io/ ETH](https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#readContract) or any other service.
|
||||
|
||||
**Read** methods doesn't require spending **gas**. **Write** methods cost some amount of **gas**, hence they will be executed with confirmation from user.
|
||||
|
||||
### Example for #Metamask without private key
|
||||
|
||||
```typescript
|
||||
// see example below
|
||||
import { getContract } from '.';
|
||||
|
||||
// ABI of contract
|
||||
const CONTRACT_ABI = { /* ... */ };
|
||||
// address for contract
|
||||
const CONTRACT_ADDRESS = '0xdea164f67df4dbfe675d5271c9d404e0260f33bb';
|
||||
|
||||
export const executeContractMethod = async ({}) => {
|
||||
// getting contract
|
||||
const contract = getContract(CONTRACT_ABI, CONTRACT_ADDRESS);
|
||||
|
||||
// Calling write method
|
||||
try {
|
||||
// authorizing with Metamask
|
||||
await web3.currentProvider.request({ method: 'eth_requestAccounts' });
|
||||
// getting wallet address
|
||||
const addressUser = web3.currentProvider.selectedAddress;
|
||||
// calling "store" store method for contract
|
||||
// payload should include `from` address, that matches
|
||||
// current user's wallet
|
||||
await contract.methods.store(0, 'Parameter').send({
|
||||
from: addressUser,
|
||||
});
|
||||
} catch (e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
|
||||
// calling read method
|
||||
try {
|
||||
// this method can return data
|
||||
const result = await contract.methods.retrieve().call();
|
||||
} catch (e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Node.js and React Native example
|
||||
|
||||
```typescript
|
||||
// see example below
|
||||
import { getContract } from '.';
|
||||
|
||||
// ABI контракта
|
||||
const CONTRACT_ABI = { /* ... */ };
|
||||
// contract address
|
||||
const CONTRACT_ADDRESS = '0xdea164f67df4dbfe675d5271c9d404e0260f33bb';
|
||||
// getting contract
|
||||
const contract = getContract(CONTRACT_ABI, CONTRACT_ADDRESS);
|
||||
// account's private key
|
||||
const privateKey = '...';
|
||||
|
||||
// write-methods requires private key
|
||||
const executeContractMethod = async (val: number) => {
|
||||
const transaction = contract.methods.store(val);
|
||||
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
|
||||
const options = {
|
||||
to: CONTRACT_ADDRESS,
|
||||
data: transaction.encodeABI(),
|
||||
gas: await transaction.estimateGas({ from: account.address }),
|
||||
gasPrice: await web3.eth.getGasPrice(),
|
||||
};
|
||||
const signed = await web3.eth.accounts.signTransaction(
|
||||
options,
|
||||
privateKey,
|
||||
);
|
||||
await web3.eth.sendSignedTransaction(signed.rawTransaction!);
|
||||
};
|
||||
```
|
||||
|
||||
### Calling a batch of contract's methods
|
||||
|
||||
Function calls batch of requests, returning array of results. For example:
|
||||
|
||||
```typescript
|
||||
const requests = [
|
||||
contract.method.balanceOf().call,
|
||||
contract.method.getStaked().call
|
||||
]
|
||||
|
||||
const result = await makeBatchRequest(request);
|
||||
```
|
||||
|
||||
```typescript
|
||||
const web3 = new Web3(Web3.givenProvider || PROVIDER_URL);
|
||||
|
||||
const makeBatchRequest = (calls: any[]) => {
|
||||
try {
|
||||
const web3 = getWeb3NoAccount();
|
||||
const batch = new web3.BatchRequest();
|
||||
|
||||
const promises = calls.map((call) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
batch.add(
|
||||
call.request({}, (err, result) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve(result);
|
||||
}
|
||||
})
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
batch.execute();
|
||||
|
||||
return Promise.all(promises);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
export default makeBatchRequest;
|
||||
```
|
||||
|
||||
## Subscribing to smart contract events
|
||||
|
||||
There're different ways to subscribe for contract events. For all of them you will need following variables:
|
||||
|
||||
```typescript
|
||||
import Web3 from 'web3';
|
||||
const web3 = new Web3('YOUR_RPC_ENDPOINT_HERE');
|
||||
const ABI = 'YOUR ABI HERE';
|
||||
const CONTRACT_ADDRESS = 'YOUR CONTRACT ADDRESS HERE';
|
||||
const myContract = new Web3.Contract(ABI, CONTRACT_ADDRESS);
|
||||
```
|
||||
|
||||
### By accessing contract.events
|
||||
|
||||
```typescript
|
||||
referralProgramContract.events
|
||||
.RegisterUser()
|
||||
.on('connected', (subscriptionId: string) => {
|
||||
console.log(`| UserRegistered | events | ${subscriptionId}`);
|
||||
})
|
||||
.on(
|
||||
'data',
|
||||
async (event: {
|
||||
removed: boolean;
|
||||
returnValues: RegisterUserResponseInterface;
|
||||
}) => {
|
||||
try {
|
||||
if (event.removed) {
|
||||
return;
|
||||
}
|
||||
const { user, referrer } = event.returnValues;
|
||||
console.log(user, referrer);
|
||||
} catch (e) {
|
||||
console.log(`| ONCE | ${e}`);
|
||||
}
|
||||
},
|
||||
)
|
||||
.on('error', (error: ErrnoException) => {
|
||||
console.log(error);
|
||||
});
|
||||
```
|
||||
|
||||
### With filtering
|
||||
|
||||
We're listening to `Transfer` event here:
|
||||
|
||||
```typescript
|
||||
let options = {
|
||||
filter: {
|
||||
value: [],
|
||||
},
|
||||
fromBlock: 0
|
||||
};
|
||||
|
||||
myContract.events.Transfer(options)
|
||||
.on('data', event => console.log(event))
|
||||
.on('changed', changed => console.log(changed))
|
||||
.on('error', err => throw err)
|
||||
.on('connected', str => console.log(str))
|
||||
```
|
||||
|
||||
### Common Subscribe method
|
||||
|
||||
Filtering options can also be specified:
|
||||
|
||||
```typescript
|
||||
let options = {
|
||||
fromBlock: 0,
|
||||
address: ['address-1', 'address-2'], //Only get events from specific addresses
|
||||
topics: [] //What topics to subscribe to
|
||||
};
|
||||
|
||||
let subscription = ('logs', options, (err,event) => {
|
||||
if (!err)
|
||||
console.log(event)
|
||||
});
|
||||
|
||||
subscription.on('data', event => console.log(event))
|
||||
subscription.on('changed', changed => console.log(changed))
|
||||
subscription.on('error', err => { throw err })
|
||||
subscription.on('connected', nr => console.log(nr))
|
||||
```
|
||||
|
||||
### Getting event history
|
||||
|
||||
Getting history for `Transfer` events for specific values. More info can be found [here](https://web3js.readthedocs.io/en/v1.2.11/web3-eth-subscribe.html#)
|
||||
|
||||
```typescript
|
||||
//example options(optional)
|
||||
let options = {
|
||||
filter: {
|
||||
// only get events where transfer value was 1000 or 1337
|
||||
value: ['1000', '1337']
|
||||
},
|
||||
// number | "earliest" | "pending" | "latest"
|
||||
fromBlock: 0,
|
||||
toBlock: 'latest'
|
||||
};
|
||||
|
||||
myContract.getPastEvents('Transfer', options)
|
||||
.then(results => console.log(results))
|
||||
.catch(err => throw err);
|
||||
|
||||
```
|
||||
|
45
content/CSS/Automatic Grid like Masonry with pure CSS.md
Normal file
|
@ -0,0 +1,45 @@
|
|||
Grid, that places items by density. Pure #css solution. Can be used with items, that take different amount of rows/columns.
|
||||
|
||||
```scss
|
||||
$cell: 250px;
|
||||
$gap: 20px;
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax($cell, 1fr));
|
||||
grid-auto-rows: 256px;
|
||||
grid-auto-flow: row dense;
|
||||
grid-column-gap: $gap;
|
||||
grid-row-gap: $gap;
|
||||
}
|
||||
```
|
||||
|
||||
### Basic elements with double height or width
|
||||
|
||||
```scss
|
||||
.h-2 { // takes 2 columns
|
||||
grid-column-end: span 2;
|
||||
}
|
||||
|
||||
.v-2 { // takes 2 rows
|
||||
grid-row-end: span 2;
|
||||
}
|
||||
```
|
||||
|
||||
### Header, that fills all columns
|
||||
|
||||
```scss
|
||||
.full-width {
|
||||
grid-row: 1 / 2; // height: 1 row
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
```
|
||||
|
||||
### Stamp element, that takes 3 rows in the top right corner
|
||||
|
||||
```scss
|
||||
.top-right {
|
||||
grid-row: 1 / 3; // height here
|
||||
grid-column: -2 / -1; // width here
|
||||
}
|
||||
```
|
19
content/CSS/Sass nth-child iterate mixin.md
Normal file
|
@ -0,0 +1,19 @@
|
|||
Say, we need to color `n` items by specific colors, which depend on its position. #SCSS supports [iteration over lists](https://sass-lang.com/documentation/at-rules/control/each) for that purposes:
|
||||
|
||||
```scss
|
||||
@mixin color-per-child($colors) {
|
||||
@each $color in $colors {
|
||||
&:nth-child(#{index(($colors), ($color))}) {
|
||||
color: $color;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Usage is simple:
|
||||
|
||||
```scss
|
||||
.item {
|
||||
@include color_per_child((#ded187, #dbde87, #bade87, #9cde87, #87deaa));
|
||||
}
|
||||
```
|
20
content/CSS/Test if browser supports CSS rules.md
Normal file
|
@ -0,0 +1,20 @@
|
|||
To test if browser supports some #CSS rules, do following:
|
||||
|
||||
```css
|
||||
@supports (backdrop-filter: blur(5px)) {
|
||||
backdrop-filter: blur(5px);
|
||||
}
|
||||
```
|
||||
|
||||
This `@mixin` will only apply rule if browser support backdrop filtering:
|
||||
|
||||
```scss
|
||||
@mixin can_backdrop {
|
||||
@supports (
|
||||
(-webkit-backdrop-filter: blur(5px)) or
|
||||
(backdrop-filter: blur(5px))
|
||||
) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
```
|
15
content/Docker/Building static pages with Docker.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
Sample #Dockerfile for static Typescript builds such a #nextjs, #gatsby or #nuxt:
|
||||
|
||||
```Dockerfile
|
||||
FROM node:16-alpine as builder
|
||||
WORKDIR /app
|
||||
COPY package.json yarn.lock ./
|
||||
RUN yarn
|
||||
COPY . .
|
||||
|
||||
# your generate command here
|
||||
RUN yarn generate
|
||||
|
||||
FROM nginx
|
||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||
```
|
98
content/Docker/Drone-ci.md
Normal file
|
@ -0,0 +1,98 @@
|
|||
Can be used with [Private docker registry](Private%20docker%20registry.md) to deploy things using #docker.
|
||||
|
||||
## Pushing to private docker_registry
|
||||
|
||||
You should specify `global_docker_login`, `global_docker_password`, `global_docker_registry` organizations variables in your **drone**. And `docker_repo` variable for your repo as `docker.yourdomain.com/your-image`.
|
||||
|
||||
This is example of `.droneci` for [private docker registry](Private%20docker%20registry.md):
|
||||
|
||||
```yaml
|
||||
kind: pipeline
|
||||
name: build
|
||||
type: docker
|
||||
|
||||
platform:
|
||||
os: linux
|
||||
arch: amd64
|
||||
|
||||
steps:
|
||||
- name: build-master
|
||||
image: plugins/docker
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
settings:
|
||||
dockerfile: Dockerfile
|
||||
tag:
|
||||
- ${DRONE_BRANCH}
|
||||
username:
|
||||
from_secret: global_docker_login
|
||||
password:
|
||||
from_secret: global_docker_password
|
||||
registry:
|
||||
from_secret: global_docker_registry
|
||||
repo:
|
||||
from_secret: docker_repo
|
||||
```
|
||||
|
||||
## Docker-compose file for drone-ci
|
||||
|
||||
The `drone` service is ui itself and `drone-agent` is runner for builds, that can be started on different machine (or machines).
|
||||
|
||||
Change `secret_id`, `rpc_secret` and `drone.url` to something you like.
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
drone:
|
||||
container_name: drone
|
||||
image: drone/drone:latest
|
||||
environment:
|
||||
- DRONE_GITHUB_CLIENT_ID=secret_id
|
||||
- DRONE_GITHUB_CLIENT_SECRET=client_secret
|
||||
- DRONE_RPC_SECRET=rpc_secret
|
||||
- DRONE_SERVER_HOST=drone.url
|
||||
- DRONE_USER_CREATE="username:user,admin:true"
|
||||
- DRONE_SERVER_PROTO=https
|
||||
- DRONE_TLS_AUTOCERT=false
|
||||
- DRONE_GIT_ALWAYS_AUTH=false
|
||||
- DRONE_LOGS_DEBUG=true
|
||||
- DRONE_LOGS_TRACE=true
|
||||
restart: always
|
||||
volumes:
|
||||
- ./data:/data
|
||||
ports:
|
||||
- 8090:80
|
||||
drone-agent:
|
||||
container_name: drone__agent
|
||||
image: drone/agent:latest
|
||||
command: agent
|
||||
restart: always
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- DRONE_RPC_SERVER=https://drone.url
|
||||
- DRONE_RPC_SECRET=rpc_secret
|
||||
```
|
||||
|
||||
## Caching builds
|
||||
|
||||
Haven't checked that yet, but there's a [manual](https://laszlo.cloud/the-ultimate-droneci-caching-guide) from [Laszlo Fogas](https://laszlo.cloud/) about that.
|
||||
|
||||
## Get user info
|
||||
|
||||
```shell
|
||||
export DRONE_SERVER=https://drone.url
|
||||
export DRONE_TOKEN=password
|
||||
drone info
|
||||
```
|
||||
|
||||
## Mark user as trusted
|
||||
|
||||
Sometimes it won't help, then connect to drone database with sqlite and change user's trusted flag to `1`.
|
||||
|
||||
```shell
|
||||
drone repo update $1 --trusted=true && drone repo info $1
|
||||
```
|
||||
|
44
content/Docker/Github pages with drone-ci.md
Normal file
|
@ -0,0 +1,44 @@
|
|||
To deploy github pages with [Drone-ci](Drone-ci.md) you will need `.drone.yml` as specified below. You also should define secrets `github_username` and `github_token` (get it [here](https://github.com/settings/tokens)) in your drone's repository setup.
|
||||
|
||||
Github repository should be named as `yourname.github.io` and it could be accessed at https://yourname.github.io/. Otherwise it'll be available at https://yourname.github.io/repo-name/, what you might not like.
|
||||
|
||||
You should create branch named `gh-pages` in that repo and setup GH Pages at `https://github.com/<yourusername>/<yourusername>.github.io/settings/pages`.
|
||||
|
||||
This config will update `gh-pages` branch in your project, which will contain only generated content. I know, that's bad, but there's no better way to do that with generic drone plugins.
|
||||
|
||||
```yaml
|
||||
kind: pipeline
|
||||
name: build
|
||||
type: docker
|
||||
|
||||
platform:
|
||||
os: linux
|
||||
arch: amd64
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: node:16
|
||||
commands:
|
||||
- yarn
|
||||
- yarn generate
|
||||
- rm -rf ./docs
|
||||
- mv ./.output/public ./docs
|
||||
- touch ./docs/.nojekyll
|
||||
- name: publish
|
||||
image: plugins/gh-pages
|
||||
settings:
|
||||
target_branch: gh-pages
|
||||
username:
|
||||
from_secret: github_username
|
||||
password:
|
||||
from_secret: github_token
|
||||
```
|
||||
|
||||
Here we're moving `./.output/public` to `./docs`, because #nuxt creates symlink for `docs` and git can't work with that.
|
||||
|
||||
Also we create `.nojekyll` at the root of repo, so github's internal engine won't [ignore files that start with underscore](https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/).
|
||||
|
||||
## Additional reading
|
||||
|
||||
- [Drone Github Pages Documentation](https://plugins.drone.io/plugins/gh-pages)
|
||||
- [Bypassing Jekyll on GitHub Pages](https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/)
|
71
content/Docker/Private docker registry.md
Normal file
|
@ -0,0 +1,71 @@
|
|||
Suitable to work with [Drone-ci](Drone-ci.md) for hosting private #docker images.
|
||||
|
||||
## Sample docker-compose for custom docker registry
|
||||
|
||||
This one brings up private docker registry with ui. First you'll need to generate password for it:
|
||||
|
||||
```shell
|
||||
docker run \
|
||||
--entrypoint htpasswd registry:2 \
|
||||
-Bbn user mypassword > auth/registry.password
|
||||
```
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
services:
|
||||
registry:
|
||||
container_name: docker__registry
|
||||
image: registry:2
|
||||
ports:
|
||||
- 5000:5000
|
||||
restart: always
|
||||
environment:
|
||||
- REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data
|
||||
- REGISTRY_AUTH=htpasswd
|
||||
- REGISTRY_AUTH_HTPASSWD_REALM=Registry
|
||||
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.password
|
||||
- REGISTRY_HTTP_SECRET=password
|
||||
- REGISTRY_STORAGE_DELETE_ENABLED=true
|
||||
volumes:
|
||||
- ./registry/auth:/auth
|
||||
- ./registry/data:/data
|
||||
ui:
|
||||
container_name: docker__ui
|
||||
image: parabuzzle/craneoperator:latest
|
||||
ports:
|
||||
- 80:80
|
||||
restart: always
|
||||
environment:
|
||||
- REGISTRY_HOST=registry
|
||||
- REGISTRY_PORT=5000
|
||||
- REGISTRY_PROTOCOL=http
|
||||
- ALLOW_REGISTRY_LOGIN=true
|
||||
- REGISTRY_ALLOW_DELETE=true
|
||||
- USERNAME=registry
|
||||
- PASSWORD=password
|
||||
```
|
||||
|
||||
## Squash layers on registry
|
||||
|
||||
Sometimes you need to squash all layers in docker registry to free up disk space.
|
||||
|
||||
1. Run this command to mark oldest layers
|
||||
|
||||
```shell
|
||||
# Try this first
|
||||
docker run \
|
||||
--rm anoxis/registry-cli \
|
||||
-r https://registry.url \
|
||||
-l user:password \
|
||||
--delete \
|
||||
--num 2
|
||||
|
||||
# Then this
|
||||
docker run -it \
|
||||
-v /path/to/registry/data:/registry \
|
||||
-e REGISTRY_URL=https://registry.url \
|
||||
-e DRY_RUN="false" \
|
||||
-e REGISTRY_AUTH="user:password" \
|
||||
mortensrasmussen/docker-registry-manifest-cleanup
|
||||
```
|
||||
|
17
content/Docker/Refresh containers on pull.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
## Setting up watchtower
|
||||
|
||||
[Watchtower](https://containrrr.dev/watchtower/) will automatically pull updated #docker containers. Can be used with [Private docker registry](Private%20docker%20registry.md) and [Drone-ci](Drone-ci.md).
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
watchtower:
|
||||
container_name: docker__watchtower
|
||||
image: v2tec/watchtower
|
||||
restart: always
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- /home/user/.docker/config.json:/config.json
|
||||
command: --interval 60 image_1 image_2
|
||||
```
|
15
content/Docker/Seed dump inside docker.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
If you need to seed `.sql` dump in #docker container, just run this command. Also you can try to [rsync file with SSH](/linux/Rsync%20file%20with%20SSH) to get it from remote host.
|
||||
|
||||
```shell
|
||||
#####
|
||||
# usage: ./script.sh "/path/to/dump.sql"
|
||||
#####
|
||||
|
||||
DUMP_PATH=$1
|
||||
CONTAINER="db"
|
||||
USER=root
|
||||
PASSWORD=password
|
||||
DB=database
|
||||
|
||||
cat "$DUMP_PATH" | docker exec -i $CONTAINER mysql -u$USER -p$PASSWORD $DB
|
||||
```
|
29
content/Docker/Wait for mysql.md
Normal file
|
@ -0,0 +1,29 @@
|
|||
[wait-for-it.sh](https://github.com/vishnubob/wait-for-it) doing a great job of waiting for different services to become alive, but on #MacOs #docker is binding port on container start, seconds before #mysql is ready to accept connections
|
||||
|
||||
This script waits for first successful query from database or exits with non-zero status after timeout.
|
||||
|
||||
Don't forget to change `$query` for the actually working one.
|
||||
|
||||
```shell
|
||||
# Waits for mysql to become actually available
|
||||
wait_for_mysql() {
|
||||
query="SELECT count(*) FROM users"
|
||||
|
||||
timeout=180 # 3 minutes limit
|
||||
i=0
|
||||
|
||||
while ! docker exec -it "$1" mysql --user="$2" --password="$3" -e "$query" $4 >/dev/null 2>&1; do
|
||||
sleep 1;
|
||||
|
||||
i=$(($i+1))
|
||||
if [[ ${i} -ge ${timeout} ]]; then
|
||||
echo "[Error] can't properly query MySQL after ${i} secs"
|
||||
exit 1;
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# usage: wait_for_mysql miin-mysql-dev root password database
|
||||
```
|
||||
|
||||
[Wait for redis](Wait%20for%20redis.md)
|
24
content/Docker/Wait for redis.md
Normal file
|
@ -0,0 +1,24 @@
|
|||
[wait-for-it.sh](https://github.com/vishnubob/wait-for-it) doing a great job of waiting for different services to become alive, but on #MacOs #docker is binding port on container start, seconds before redis is ready to accept connections
|
||||
|
||||
This script waits for first successful ping or exits with non-zero status after 3 minutes.
|
||||
|
||||
```shell
|
||||
# Waits for redis to become actually available
|
||||
wait_for_redis() {
|
||||
timeout=180 # 3 minutes
|
||||
i=0
|
||||
while ! docker exec -it "$1" redis-cli -h localhost -p 6379 -a "$2" ping | grep "PONG" >/dev/null 2>&1; do
|
||||
sleep 1;
|
||||
|
||||
i=$(($i+1))
|
||||
if [[ ${i} -ge ${timeout} ]]; then
|
||||
echo "[Error] can't properly ping Redis container after ${i} secs"
|
||||
exit 1;
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# usage: wait_for_redis miin-redis-dev password
|
||||
```
|
||||
|
||||
[Wait for mysql](Wait%20for%20mysql.md)
|
48
content/Frontend/React Native/OAuth2 login.md
Normal file
|
@ -0,0 +1,48 @@
|
|||
Use #oauth2 login with React-Native
|
||||
|
||||
## Common OAuth2 providers
|
||||
|
||||
Can be handled by [react-native-app-auth](react-native-app-auth) by redirecting to url `com.yourapp://oauth2provider`.
|
||||
|
||||
### Example for #Google
|
||||
|
||||
```typescript
|
||||
import { authorize } from 'react-native-app-auth';
|
||||
|
||||
const GOOGLE_OAUTH_CLIENT = '...';
|
||||
|
||||
// ...
|
||||
const authState = await authorize({
|
||||
issuer: 'https://accounts.google.com',
|
||||
clientId: `${GOOGLE_OAUTH_CLIENT}.apps.googleusercontent.com`,
|
||||
redirectUrl: `com.yourapp:/oauth2redirect/google`,
|
||||
scopes: ['openid', 'profile'],
|
||||
dangerouslyAllowInsecureHttpRequests: true,
|
||||
});
|
||||
```
|
||||
|
||||
### Example for #Yandex
|
||||
|
||||
```typescript
|
||||
const YANDEX_OAUTH_CLIENT = '...';
|
||||
const YANDEX_OAUTH_SECRET = '...'; // better hide it somehow
|
||||
const APP_ID = 'com.yourapp';
|
||||
|
||||
const authState = await authorize({
|
||||
serviceConfiguration: {
|
||||
authorizationEndpoint: `https://oauth.yandex.ru/authorize?response_type=code&client_id=${YANDEX_OAUTH_CLIENT}&redirect_uri=${APP_ID}:/oauth2redirect`,
|
||||
// TODO: replace it with your own backend to secure client_secret:
|
||||
tokenEndpoint: `https://oauth.yandex.ru/token?grant_type=authorization_code&client_id=${YANDEX_OAUTH_CLIENT}&client_secret=${YANDEX_OAUTH_SECRET}`,
|
||||
},
|
||||
clientId: YANDEX_OAUTH_CLIENT,
|
||||
redirectUrl: `${APP_ID}:/oauth2redirect`,
|
||||
scopes: ['login:info', 'login:avatar'],
|
||||
dangerouslyAllowInsecureHttpRequests: true,
|
||||
});
|
||||
|
||||
callback(authState.accessToken);
|
||||
```
|
||||
|
||||
## Apple ID login
|
||||
|
||||
[react-native-apple-authentication](https://github.com/invertase/react-native-apple-authentication) has its own [documentation](https://github.com/invertase/react-native-apple-authentication/tree/main/docs) on setting up OAuth using Apple ID.
|
|
@ -0,0 +1,60 @@
|
|||
Sometimes you need to keep scroll position of `FlatList` in React Native after some user interactions.
|
||||
|
||||
```typescript
|
||||
// interact() is doing some stuff, that changes FlatList scroll size
|
||||
type Props = { interact: () => void; }
|
||||
|
||||
const SomeList: FC<Props> = ({ interact }) => {
|
||||
const scrollPosition = useRef(0);
|
||||
const scrollHeight = useRef(0);
|
||||
|
||||
// set it to `true` before interaction and back to `false` right after
|
||||
const shouldKeepScrollPosition = useRef(false);
|
||||
|
||||
const onScroll = useCallback(
|
||||
(event: NativeSyntheticEvent<NativeScrollEvent>) => {
|
||||
scrollPosition.current = event.nativeEvent.contentOffset.y;
|
||||
},
|
||||
[],
|
||||
);
|
||||
|
||||
const onContentSizeChange = useCallback((_: number, h: number) => {
|
||||
if (!shouldKeepScrollPosition.current) {
|
||||
scrollHeight.current = h;
|
||||
return;
|
||||
}
|
||||
|
||||
ref.current?.scrollToOffset({
|
||||
offset: scrollPosition.current + (h - scrollHeight.current),
|
||||
animated: false,
|
||||
});
|
||||
|
||||
scrollHeight.current = h;
|
||||
}, []);
|
||||
|
||||
// onInteraction wraps interaction to preserve scroll position
|
||||
const onInteraction = useCallback(
|
||||
() => {
|
||||
shouldKeepScrollPosition.current = true;
|
||||
|
||||
setTimeout(() => {
|
||||
interact();
|
||||
}, 0);
|
||||
|
||||
setTimeout(() => {
|
||||
shouldKeepScrollPosition.current = false;
|
||||
}, 500);
|
||||
},
|
||||
[setSelectedSubThemes],
|
||||
);
|
||||
|
||||
return (
|
||||
<FlatList
|
||||
// ...required FlatList options
|
||||
ref={ref}
|
||||
onContentSizeChange={onContentSizeChange}
|
||||
onRefresh={onRefresh}
|
||||
onScroll={onScroll}
|
||||
/>
|
||||
)
|
||||
}
|
65
content/Frontend/React Native/Useful comands.md
Normal file
|
@ -0,0 +1,65 @@
|
|||
## Show android logcat
|
||||
|
||||
```shell
|
||||
adb logcat com.application:I "*:S"
|
||||
```
|
||||
|
||||
## Get .apk's SHA-256
|
||||
|
||||
```bash
|
||||
keytool -printcert -jarfile "$1"
|
||||
```
|
||||
|
||||
## Assemble debug release on Android
|
||||
|
||||
Packages release with bundled resources.
|
||||
|
||||
```shell
|
||||
npx react-native bundle \
|
||||
--platform android \
|
||||
--dev false \
|
||||
--entry-file index.js \
|
||||
--bundle-output android/app/src/main/assets/index.android.bundle \
|
||||
--assets-dest android/app/src/main/res/
|
||||
|
||||
cd android && ./gradlew assembleDebug
|
||||
|
||||
# do your stuff
|
||||
|
||||
./gradlew clean
|
||||
```
|
||||
|
||||
## Send release to Android device
|
||||
|
||||
```shell
|
||||
cd ./android \
|
||||
&& ./gradlew assembleRelease \
|
||||
&& adb install ./app/build/outputs/apk/release/app-release.apk
|
||||
```
|
||||
|
||||
## Deep links
|
||||
|
||||
- https://zarah.dev/2022/02/08/android12-deeplinks.html
|
||||
- https://developer.android.com/training/app-links/verify-site-associations#invoke-domain-verification
|
||||
- https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://miin.ru&relation=delegate_permission/common.handle_all_urls
|
||||
|
||||
### Open deep links
|
||||
|
||||
```shell
|
||||
# ios
|
||||
xcrun simctl openurl booted $1
|
||||
|
||||
# android
|
||||
adb shell am start -W -a android.intent.action.VIEW -d $1 \
|
||||
com.application
|
||||
```
|
||||
|
||||
### Reverify links on Android
|
||||
|
||||
```shell
|
||||
PACKAGE="com.application"
|
||||
|
||||
adb shell pm set-app-links --package $PACKAGE 0 all && \
|
||||
adb shell pm verify-app-links --re-verify $PACKAGE
|
||||
```
|
||||
|
106
content/Frontend/React/Axios refresh token on React.md
Normal file
|
@ -0,0 +1,106 @@
|
|||
`<ApiProvider />` component, that will handle token refresh if needed. Refresh function should, probably, be passed through component props.
|
||||
|
||||
```typescript
|
||||
import axios from "axios";
|
||||
import React, {
|
||||
createContext,
|
||||
FC,
|
||||
PropsWithChildren,
|
||||
useCallback,
|
||||
useContext,
|
||||
useEffect,
|
||||
useRef,
|
||||
} from "react";
|
||||
|
||||
interface APIProviderProps extends PropsWithChildren {
|
||||
tokens: {
|
||||
access: string;
|
||||
refresh: string;
|
||||
};
|
||||
logout: () => void;
|
||||
}
|
||||
|
||||
const APIContext = createContext({
|
||||
client: axios.create({
|
||||
baseURL: process.env.NEXT_PUBLIC_API_ENDPOINT,
|
||||
}),
|
||||
});
|
||||
|
||||
const APIProvider: FC<APIProviderProps> = ({
|
||||
tokens,
|
||||
logout,
|
||||
children,
|
||||
}) => {
|
||||
const client = useRef(
|
||||
axios.create({
|
||||
baseURL: process.env.NEXT_PUBLIC_API_ENDPOINT,
|
||||
})
|
||||
).current;
|
||||
|
||||
const refreshTokens = useCallback<() => string>(() => {
|
||||
// TODO: implement me
|
||||
throw new Error("not implemented");
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (!tokens.access) {
|
||||
return;
|
||||
}
|
||||
|
||||
// append `access` token to all requests
|
||||
const req = client.interceptors.request.use(
|
||||
async (config) => {
|
||||
config.headers = {
|
||||
Authorization: `Bearer ${tokens.access}`,
|
||||
};
|
||||
return config;
|
||||
},
|
||||
(error) => {
|
||||
Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
// refreshing interceptor
|
||||
const resp = client.interceptors.response.use(
|
||||
(response) => {
|
||||
return response;
|
||||
},
|
||||
async function (error) {
|
||||
const originalRequest = error.config;
|
||||
|
||||
if (error.response.status === 401 && !originalRequest._retry) {
|
||||
originalRequest._retry = true;
|
||||
|
||||
const newToken = refreshTokens;
|
||||
|
||||
return axios({
|
||||
...originalRequest,
|
||||
headers: {
|
||||
...originalRequest.headers,
|
||||
Authorization: "Bearer " + newToken,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
logout();
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
return () => {
|
||||
axios.interceptors.request.eject(req);
|
||||
axios.interceptors.request.eject(resp);
|
||||
};
|
||||
}, [client, tokens.access, tokens.refresh, refreshTokens, logout]);
|
||||
|
||||
return (
|
||||
<APIContext.Provider value={{ client }}>
|
||||
{children}
|
||||
</APIContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
export const useAPI = () => useContext(APIContext).client;
|
||||
|
||||
export { APIProvider };
|
||||
```
|
32
content/Frontend/React/Axios with AbortController.md
Normal file
|
@ -0,0 +1,32 @@
|
|||
If you need to cancel some request, use [axios with AbortController](https://axios-http.com/docs/cancellation). Previously axios used cancellation token, but now it's deprecated.
|
||||
|
||||
`AbortController` can be used with a multiple requests to cancel them at once.
|
||||
|
||||
```typescript
|
||||
import { useCallback, useRef } from "react";
|
||||
import axios from 'axios';
|
||||
|
||||
const client = axios.create();
|
||||
|
||||
export const useGetUsers = () => {
|
||||
const controller = useRef(new AbortController());
|
||||
|
||||
const get = useCallback(async () => {
|
||||
const result = await client.get("/", {
|
||||
// params and props here
|
||||
signal: controller.current.signal,
|
||||
});
|
||||
|
||||
return result.data;
|
||||
}, []);
|
||||
|
||||
const cancel = useCallback(() => {
|
||||
controller.current.abort();
|
||||
|
||||
// controller should be rewritten or all requests will fail
|
||||
controller.current = new AbortController();
|
||||
}, [controller]);
|
||||
|
||||
return { get, cancel };
|
||||
};
|
||||
```
|
|
@ -0,0 +1,17 @@
|
|||
The topic's fully covered in the [official documentation](https://vuejs.org/guide/typescript/options-api.html#augmenting-global-properties) and in [Add global variable to window](Add%20global%20variable%20to%20window.md).
|
||||
|
||||
For example, you want to add global `$http` and `$translate` services to all of project's components:
|
||||
|
||||
```typescript
|
||||
// ~/index.d.ts or ~/custom.d.ts
|
||||
|
||||
import axios from 'axios'
|
||||
|
||||
declare module 'vue' {
|
||||
interface ComponentCustomProperties {
|
||||
$http: typeof axios
|
||||
$translate: (key: string) => string
|
||||
}
|
||||
}
|
||||
```
|
||||
|
16
content/Frontend/Vue/Make Nuxt handle Obsidian highlights.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
By default [Nuxt Content Plugin](https://content.nuxtjs.org) not handling `==highlight==` links. To fix that we will create `Nitro` plugin:
|
||||
|
||||
```typescript
|
||||
// ~/server/plugins/highlight.ts
|
||||
export default defineNitroPlugin((nitroApp) => {
|
||||
nitroApp.hooks.hook("content:file:beforeParse", (file) => {
|
||||
if (file._id.endsWith(".md")) {
|
||||
file.body = file.body.replace(
|
||||
/==([^=]+)==/gs,
|
||||
`<span class="highlight">$1</span>`
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
```
|
||||
|
8
content/Git/Force git to use HTTPS.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
Forces #git to use https even if remote url is #SSH. Useful for the networks with blocked #ssh protocol.
|
||||
|
||||
Put this inside your `~/.gitconfig`:
|
||||
|
||||
```c
|
||||
[url "https://github.com"]
|
||||
insteadOf = git://github.com
|
||||
```
|
30
content/Git/Git aliases and useful commands.md
Normal file
|
@ -0,0 +1,30 @@
|
|||
Shorthands for #git commands can be specified. Should be placed at `~/.gitconfig`.
|
||||
|
||||
```c
|
||||
[alias]
|
||||
flush = git clean-branches branch | grep -v master | xargs git branch -D
|
||||
lol = log --oneline --graph
|
||||
l = lol
|
||||
c = commit -am
|
||||
cv = commit --no-verify -am
|
||||
p = push
|
||||
pf = p --force-with-lease
|
||||
ignore-now = update-index --skip-worktree
|
||||
```
|
||||
|
||||
| **command** | **description** |
|
||||
|---|---|
|
||||
| `git flush` | drops all branches, except master |
|
||||
| `git lol` | shows log |
|
||||
|`git c` | commits with message |
|
||||
| `git cv` | commits without hooks |
|
||||
| `git p` | pushes |
|
||||
| `git pf` | push with --force and additional check |
|
||||
| `git ignore-now` | starts ignoring file from now on |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
79
content/GraphQL/Apollo Client pagination.md
Normal file
|
@ -0,0 +1,79 @@
|
|||
Say, we have `gql` response like this and we wan't to have pagination with it. Let's merge it as it specified in [official documentation](https://www.apollographql.com/docs/react/caching/cache-field-behavior/#the-merge-function)
|
||||
|
||||
```graphql
|
||||
query listItems(
|
||||
filter: Filter,
|
||||
sort: String,
|
||||
limit: Number,
|
||||
offset: Number,
|
||||
): ItemList!
|
||||
|
||||
input Filter {
|
||||
name: String!
|
||||
type: String!
|
||||
}
|
||||
|
||||
type ItemList {
|
||||
items: [Item!]!
|
||||
totalCount: Int!
|
||||
}
|
||||
```
|
||||
|
||||
We will setup `ApolloClient` with `typePolicies` to merge incoming data in cache:
|
||||
|
||||
```typescript
|
||||
import { ApolloClient, InMemoryCache } from '@apollo/client';
|
||||
|
||||
const client = new ApolloClient({
|
||||
// ...
|
||||
cache: new InMemoryCache({ typePolicies }),
|
||||
// ...
|
||||
});
|
||||
|
||||
export const typePolicies: TypePolicies = {
|
||||
Query: {
|
||||
fields: {
|
||||
// query name
|
||||
listItems: {
|
||||
// apollo will serialize and use keyArgs as unique
|
||||
// identifier in cache for every query
|
||||
// consider choosing the right fields,
|
||||
// i.e. limit and offset won't work here
|
||||
keyArgs: [
|
||||
'sort', // primitive type
|
||||
'filter', ['name', 'type'] // nested fields of `filter`
|
||||
],
|
||||
merge: mergeItemsWithTotalCount,
|
||||
},
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
We will need merge function `mergeItemsWithTotalCount`, which will join results of query and cached data for specific key:
|
||||
|
||||
```typescript
|
||||
/** merges all sources with { items: unknown[], totalCount: number } */
|
||||
const mergeItemsWithTotalCount = (existing, incoming, { args }) => {
|
||||
// no existing data
|
||||
if (!existing || !args?.offset || args.offset < existing.length) {
|
||||
return incoming || [];
|
||||
}
|
||||
|
||||
// If hook was called multiple times
|
||||
if (existing?.items?.length && args?.offset < existing.items.length) {
|
||||
return existing || [];
|
||||
}
|
||||
|
||||
// merge cache and incoming data
|
||||
const items = [...(existing?.items || []), ...(incoming?.items || [])];
|
||||
|
||||
// apply latest result for totalCount
|
||||
const totalCount = incoming?.totalCount || existing?.totalCount;
|
||||
|
||||
return {
|
||||
...(incoming || existing || {}),
|
||||
items,
|
||||
totalCount,
|
||||
};
|
||||
};
|
||||
```
|
157
content/GraphQL/Refresh token in Apollo client.md
Normal file
|
@ -0,0 +1,157 @@
|
|||
If your GraphQL api needs token refresh option, you can pass custom fetch function for Apollo Client.
|
||||
|
||||
```typescript
|
||||
export const createApolloClient = (
|
||||
url: string,
|
||||
logout: () => void,
|
||||
getAuthorizationData: () => { authorization: string },
|
||||
refreshToken: () => Promise<
|
||||
{ accessToken: string; refreshToken: string } | undefined
|
||||
>,
|
||||
) =>
|
||||
new ApolloClientBase({
|
||||
// ...other options
|
||||
link: ApolloLink.from([
|
||||
// ...other options
|
||||
setContext(async (_, { headers }) => {
|
||||
return {
|
||||
headers: {
|
||||
...headers,
|
||||
...getAuthorizationData(),
|
||||
},
|
||||
};
|
||||
}),
|
||||
new HttpLink({
|
||||
uri: url,
|
||||
fetch: fetchWithTokenRefresh(logout, refreshToken),
|
||||
}),
|
||||
]),
|
||||
});
|
||||
```
|
||||
|
||||
Custom fetch function for this request. You should tune `hasUnauthorizedError` and
|
||||
`isRefreshRequestOptions` to match your api.
|
||||
|
||||
```typescript
|
||||
/** Global singleton for refreshing promise */
|
||||
let refreshingPromise: Promise<string> | null = null;
|
||||
|
||||
/** Checks if GraphQl errors has unauthenticated error */
|
||||
const hasUnauthorizedError = (errors: Array<{ code?: ErrorCode }>): boolean =>
|
||||
Array.isArray(errors) &&
|
||||
errors.some(error => {
|
||||
return error.status === 401; // Distinguish unauthorized error here
|
||||
});
|
||||
|
||||
/** Detects if customFetch is sending refresh request */
|
||||
const isRefreshRequestOptions = (options: RequestInit) => {
|
||||
try {
|
||||
const body = JSON.parse(options?.body as string);
|
||||
return body.operationName === 'RefreshToken';
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/** fetchWithTokenRefresh is a custom fetch function with token refresh for apollo */
|
||||
export const fetchWithTokenRefresh =
|
||||
(
|
||||
logout: () => void,
|
||||
refreshToken: () => Promise<
|
||||
{ accessToken: string; refreshToken: string } | undefined
|
||||
>,
|
||||
) =>
|
||||
async (uri: string, options: RequestInit): Promise<Response> => {
|
||||
// already refreshing token, wait for it and then use refreshed token
|
||||
// or use empty authorization if refreshing failed
|
||||
if (
|
||||
!isRefreshRequestOptions(options) &&
|
||||
refreshingPromise &&
|
||||
(options.headers as Record<string, string>)?.authorization
|
||||
) {
|
||||
const newAccessToken = await refreshingPromise
|
||||
.catch(() => {
|
||||
// refreshing token from other request failed, retry without authorization
|
||||
return '';
|
||||
});
|
||||
|
||||
options.headers = {
|
||||
...(options.headers || {}),
|
||||
authorization: newAccessToken,
|
||||
};
|
||||
}
|
||||
|
||||
return fetch(uri, options).then(async response => {
|
||||
const text = await response.text();
|
||||
const json = JSON.parse(text);
|
||||
|
||||
// check for unauthorized errors, if not present, just return result
|
||||
if (
|
||||
isRefreshRequestOptions(options) ||
|
||||
!json?.errors ||
|
||||
!Array.isArray(json.errors) ||
|
||||
!hasUnauthorizedError(json.errors)
|
||||
) {
|
||||
return {
|
||||
...response,
|
||||
ok: true,
|
||||
json: async () =>
|
||||
new Promise<unknown>(resolve => {
|
||||
resolve(json);
|
||||
}),
|
||||
text: async () =>
|
||||
new Promise<string>(resolve => {
|
||||
resolve(text);
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
// If unauthorized, refresh token and try again
|
||||
if (!refreshingPromise) {
|
||||
refreshingPromise = refreshToken()
|
||||
.then(async (tokens): Promise<string> => {
|
||||
refreshingPromise = null;
|
||||
|
||||
if (!tokens?.accessToken) {
|
||||
throw new Error('Session expired');
|
||||
}
|
||||
|
||||
return tokens?.accessToken;
|
||||
})
|
||||
.catch(() => {
|
||||
refreshingPromise = null;
|
||||
|
||||
// can't refresh token. logging out
|
||||
logout();
|
||||
throw new Error('Session expired');
|
||||
});
|
||||
}
|
||||
|
||||
// success or any non-auth error
|
||||
return refreshingPromise
|
||||
.then(async (newAccessToken: string) => {
|
||||
// wait for other request's refreshing query to finish, when retry
|
||||
|
||||
return fetch(uri, {
|
||||
...options,
|
||||
headers: {
|
||||
...(options.headers || {}),
|
||||
authorization: newAccessToken,
|
||||
},
|
||||
});
|
||||
})
|
||||
.catch(async () => {
|
||||
// refreshing token from other request failed, retry without authorization
|
||||
|
||||
return fetch(uri, {
|
||||
...options,
|
||||
headers: {
|
||||
...(options.headers || {}),
|
||||
authorization: '',
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
```
|
29
content/Linux/Gitea for git hosting.md
Normal file
|
@ -0,0 +1,29 @@
|
|||
Self-hosted #git repositories with [gitea](https://gitea.io/ru-ru/) and #docker.
|
||||
|
||||
## Setting up with docker-compose
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
|
||||
networks:
|
||||
gitea:
|
||||
external: false
|
||||
services:
|
||||
server:
|
||||
image: gitea/gitea:latest
|
||||
container_name: gitea
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
restart: always
|
||||
networks:
|
||||
- gitea
|
||||
volumes:
|
||||
- ./var/lib/gitea:/data
|
||||
- ./etc/gitea:/etc/gitea
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
ports:
|
||||
- "3000:3000"
|
||||
- "222:22"
|
||||
```
|
70
content/Linux/Google photos alternative with Photoprism.md
Normal file
|
@ -0,0 +1,70 @@
|
|||
[Photo Prism](https://photoprism.app/) is a free alternative to Google photos, can be set up with #docker.
|
||||
|
||||
## Docker compose file to run it
|
||||
|
||||
Check out current [example](https://dl.photoprism.app/docker/docker-compose.yml) at photoprism's [documentation](https://docs.photoprism.app/getting-started/docker-compose/).
|
||||
|
||||
```yaml
|
||||
version: '3.5'
|
||||
|
||||
services:
|
||||
photoprism:
|
||||
container_name: photoprism__app
|
||||
image: photoprism/photoprism:latest
|
||||
depends_on:
|
||||
- mariadb
|
||||
restart: unless-stopped
|
||||
security_opt:
|
||||
- seccomp:unconfined
|
||||
- apparmor:unconfined
|
||||
ports:
|
||||
- 2342:2342 # HTTP port (host:container)
|
||||
environment:
|
||||
PHOTOPRISM_ADMIN_PASSWORD: "password"
|
||||
PHOTOPRISM_SITE_URL: "https://service.url/"
|
||||
PHOTOPRISM_ORIGINALS_LIMIT: 5000
|
||||
PHOTOPRISM_HTTP_COMPRESSION: "gzip"
|
||||
PHOTOPRISM_DEBUG: "false"
|
||||
PHOTOPRISM_PUBLIC: "false"
|
||||
PHOTOPRISM_READONLY: "false"
|
||||
PHOTOPRISM_EXPERIMENTAL: "false"
|
||||
PHOTOPRISM_DISABLE_CHOWN: "false"
|
||||
PHOTOPRISM_DISABLE_WEBDAV: "false"
|
||||
PHOTOPRISM_DISABLE_SETTINGS: "false"
|
||||
PHOTOPRISM_DISABLE_TENSORFLOW: "false"
|
||||
PHOTOPRISM_DISABLE_FACES: "false"
|
||||
PHOTOPRISM_DISABLE_CLASSIFICATION: "false"
|
||||
PHOTOPRISM_DARKTABLE_PRESETS: "false"
|
||||
PHOTOPRISM_DETECT_NSFW: "false"
|
||||
PHOTOPRISM_UPLOAD_NSFW: "true"
|
||||
PHOTOPRISM_DATABASE_DRIVER: "mysql"
|
||||
PHOTOPRISM_DATABASE_SERVER: "mariadb:3306"
|
||||
PHOTOPRISM_DATABASE_NAME: "photoprism"
|
||||
PHOTOPRISM_DATABASE_USER: "root"
|
||||
PHOTOPRISM_DATABASE_PASSWORD: "insecure"
|
||||
PHOTOPRISM_SITE_TITLE: "PhotoPrism"
|
||||
PHOTOPRISM_SITE_CAPTION: "Browse Your Life"
|
||||
PHOTOPRISM_SITE_DESCRIPTION: ""
|
||||
PHOTOPRISM_SITE_AUTHOR: ""
|
||||
HOME: "/photoprism"
|
||||
working_dir: "/photoprism"
|
||||
volumes:
|
||||
- "./data/originals:/photoprism/originals"
|
||||
- "./data/imports:/photoprism/import"
|
||||
- "./data/storage:/photoprism/storage"
|
||||
mariadb:
|
||||
container_name: photoprism__db
|
||||
restart: unless-stopped
|
||||
image: mariadb:10.6
|
||||
security_opt:
|
||||
- seccomp:unconfined
|
||||
- apparmor:unconfined
|
||||
command: mysqld --innodb-buffer-pool-size=128M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120
|
||||
volumes:
|
||||
- "./database:/var/lib/mysql" # Important, don't remove
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: insecure
|
||||
MYSQL_DATABASE: photoprism
|
||||
MYSQL_USER: photoprism
|
||||
MYSQL_PASSWORD: insecure
|
||||
```
|
5
content/Linux/Resume or start screen session.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
Running this script will enter currently running `screen` session or will start new one.
|
||||
|
||||
```shell
|
||||
( screen -r bash || ( screen -d bash && screen -r bash || screen -SAm bash bash ) )
|
||||
```
|
16
content/Linux/Rsync file with SSH.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
Downloads file from #SSH with rsync and puts it in current folder.
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
PORT=22
|
||||
USER=user
|
||||
HOST=example.com
|
||||
REMOTE_PATH=/tmp
|
||||
REMOTE_FILE=sample.text
|
||||
DEST_PATH=./
|
||||
|
||||
rsync -a -e "ssh -p $PORT" -P -v \
|
||||
"$USER@$HOST:$REMOTE_PATH/$REMOTE_FILE" \
|
||||
"$DEST_PATH"
|
||||
```
|
13
content/Linux/SSH.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
## Config aliases for #SSH hosts
|
||||
|
||||
#SSH config can be used to made aliases for different hosts. Should be put at `~/.ssh/config`. To simply call `ssh router` without parameters, use this:
|
||||
|
||||
```
|
||||
Host router
|
||||
HostName 192.168.0.1
|
||||
IdentityFile ~/.ssh/id_rsa
|
||||
User root
|
||||
Port 22522
|
||||
```
|
||||
|
||||
|
57
content/Linux/Setting up NGINX.md
Normal file
|
@ -0,0 +1,57 @@
|
|||
## Fallback url for SPA-s
|
||||
|
||||
```nginx
|
||||
server {
|
||||
# ...
|
||||
location / {
|
||||
# First attempt to serve request as file, then
|
||||
# as directory, then fall back to displaying a 404.
|
||||
try_files $uri $uri/ =404;
|
||||
}
|
||||
# ...
|
||||
}
|
||||
```
|
||||
|
||||
## Set up for uploads
|
||||
|
||||
```nginx
|
||||
server {
|
||||
# ...
|
||||
client_max_body_size 200M;
|
||||
# ...
|
||||
}
|
||||
```
|
||||
|
||||
## Reverse proxy for https
|
||||
|
||||
Given config forwards `https` traffic to `http` on port `8080` for https://next.vault48.org
|
||||
with http2 support if possible.
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name next.vault48.org;
|
||||
return 301 https://next.vault48.org$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
# managed by Certbot
|
||||
ssl_certificate /etc/letsencrypt/live/vault48.org/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/vault48.org/privkey.pem;
|
||||
ssl_trusted_certificate /etc/letsencrypt/live/vault48.org/chain.pem;
|
||||
|
||||
server_name next.vault48.org;
|
||||
|
||||
location / {
|
||||
proxy_redirect off;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
}
|
||||
}
|
||||
```
|
37
content/SQL/MySQL and MariaDB setup.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
## Install MariaDB on Ubuntu 20.04 LTS
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install mariadb-server
|
||||
sudo mysql_secure_installation
|
||||
```
|
||||
|
||||
## Access Database from outside
|
||||
|
||||
Open `/etc/mysql/mariadb.conf.d/50-server.cnf` and change the `bind-address` to:
|
||||
|
||||
```nginx
|
||||
...
|
||||
bind-address = 0.0.0.0
|
||||
...
|
||||
```
|
||||
|
||||
## Create Administrative User
|
||||
|
||||
1. Create a new user `newuser` for the host `localhost` with a new `password`:
|
||||
|
||||
```mysql
|
||||
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
|
||||
```
|
||||
|
||||
2. Grant all permissions to the new user
|
||||
|
||||
```mysql
|
||||
GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
|
||||
```
|
||||
|
||||
3. Update permissions
|
||||
|
||||
```mysql
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
105
content/SQL/Postgress setup.md
Normal file
|
@ -0,0 +1,105 @@
|
|||
## Install PostgreSQL 12 on Ubuntu 20.04 LTS
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y postgresql postgresql-contrib postgresql-client
|
||||
sudo systemctl status postgresql.service
|
||||
```
|
||||
|
||||
## Initial database connection
|
||||
|
||||
A local connection (from the database server) can be done by the following command:
|
||||
|
||||
```bash
|
||||
sudo -u postgres psql
|
||||
|
||||
psql (12.12 (Ubuntu 12.12-0ubuntu0.20.04.1))
|
||||
Type "help" for help.
|
||||
|
||||
postgres=#
|
||||
```
|
||||
|
||||
## Set password for postgres database user
|
||||
|
||||
The password for the `postgres` database user can be set the the quick command `\password`
|
||||
or by `alter user postgres password 'Supersecret'`. A connection using the `postgres` user
|
||||
is still not possible from the "outside" hence to the default settings in the `pg_hba.conf`.
|
||||
|
||||
### Update pg_hba.conf to allow postgres user connections with password
|
||||
|
||||
In order to allow connections of the `postgres` database user not using OS user
|
||||
authentication, you have to update the `pg_hba.conf` which can be found under
|
||||
`/etc/postgresql/12/main/pg_hba.conf`.
|
||||
|
||||
```shell
|
||||
sudo vi /etc/postgresql/12/main/pg_hba.conf
|
||||
|
||||
...
|
||||
local all postgres peer
|
||||
...
|
||||
```
|
||||
|
||||
Change the last section of the above line to `md5`.
|
||||
|
||||
```
|
||||
local all postgres md5
|
||||
```
|
||||
|
||||
A restart is required in order to apply the new configuration:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
Now a connection from outside the database host is possible e.g.
|
||||
|
||||
```bash
|
||||
psql -U postgres -d postgres -h databasehostname
|
||||
```
|
||||
|
||||
## Creation of additional database users
|
||||
|
||||
A database user can be created by the following command:
|
||||
|
||||
```sql
|
||||
create user myuser with encrypted password 'Supersecret';
|
||||
CREATE ROLE
|
||||
|
||||
postgres=# \du
|
||||
List of roles
|
||||
Role name | Attributes | Member of
|
||||
-----------+------------------------------------------------------------+-----------
|
||||
myuser | | {}
|
||||
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
|
||||
```
|
||||
|
||||
## Creation of additional databases
|
||||
|
||||
One can create new Postgres databases within an instance. Therefore you can use the `psql`
|
||||
command to login (see above).
|
||||
|
||||
```sql
|
||||
CREATE DATABASE dbname OWNER myuser;
|
||||
CREATE DATABASE
|
||||
|
||||
postgres=# \l
|
||||
List of databases
|
||||
Name | Owner | Encoding | Collate | Ctype | Access privileges
|
||||
-----------+----------+----------+-------------+-------------+-----------------------
|
||||
dbname | myuser | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
|
||||
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
|
||||
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
|
||||
| | | | | postgres=CTc/postgres
|
||||
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
|
||||
| | | | | postgres=CTc/postgres
|
||||
```
|
||||
|
||||
You can leave the `OWNER` section of the command, when doing so, the current user will become
|
||||
owner of the newly created database.
|
||||
|
||||
To change the owner of an existing database later, you can use the following command:
|
||||
|
||||
```sql
|
||||
postgres=# alter database dbname owner to myuser;
|
||||
ALTER DATABASE
|
||||
```
|
50
content/Typescript/Add global variable to window.md
Normal file
|
@ -0,0 +1,50 @@
|
|||
Sometimes you want to add global variable to your `window`. That thing's called [global module augmentation](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation).
|
||||
|
||||
Say you need to call `window.doFancyThings()`. For that you should augment global `window` interface in `*.d.ts` file:
|
||||
|
||||
```typescript
|
||||
declare global {
|
||||
interface Window {
|
||||
doFancyThings: () => void;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
This is useful for declaring global `window.ethereum` (or `window.web3`) in [blockchain](/blockchain/Common%20typescript%20examples) projects with typescript, which use wallet browser extensions.
|
||||
|
||||
## Augmenting existing interface
|
||||
|
||||
For example, you have class `Sample` without any functionality:
|
||||
|
||||
```typescript
|
||||
// Sample.ts
|
||||
|
||||
export class Sample {
|
||||
// nothing :-)
|
||||
}
|
||||
```
|
||||
|
||||
Then you want extend it with `doFancyThings()` method. That can be achieved with said [module augmentation](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation):
|
||||
|
||||
```typescript
|
||||
// fancyThings.ts
|
||||
import { Sample } from "./Sample";
|
||||
|
||||
declare module "./Sample" {
|
||||
interface Sample {
|
||||
doFancyThings: () => void;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Now you can call `sample.doFancyThings()` by importing both `.ts` files:
|
||||
|
||||
```typescript
|
||||
import { Sample } from "./sample";
|
||||
import "./fancyThings";
|
||||
|
||||
const sample = new Sample();
|
||||
sample.doFancyThings(); // ok
|
||||
```
|
||||
|
||||
This example is useful for [adding global properties to component](../Frontend/Vue/Adding%20global%20properties%20to%20component.md) in vue.js.
|
38
content/Typescript/Flatten object with periods.md
Normal file
|
@ -0,0 +1,38 @@
|
|||
This helper generates Typescript types for i18n dictionary json
|
||||
files by flattening it with period delimiter. Supports plural forms.
|
||||
|
||||
Used for typing [i18n.js](https://www.npmjs.com/package/i18n-js) dictionaries;
|
||||
|
||||
```typescript
|
||||
import en from './en.json';
|
||||
type TranslationPath = Flatten<typeof en>;
|
||||
|
||||
const t = (key: TranslationPath, options?: TranslateOptions) =>
|
||||
I18nLib.t(key, options);
|
||||
```
|
||||
|
||||
Flatten type defined here:
|
||||
|
||||
```typescript
|
||||
// This one based on answer from StackOverflow:
|
||||
// https://stackoverflow.com/questions/58434389/typescript-deep-keyof-of-a-nested-object
|
||||
|
||||
export type Flatten<T, D extends number = 5> = [D] extends [never]
|
||||
? never
|
||||
: T extends PluralForm // plural object
|
||||
? ''
|
||||
: T extends object
|
||||
? { [K in keyof T]-?: Join<K, Flatten<T[K], Prev[D]>> }[keyof T]
|
||||
: '';
|
||||
|
||||
// Fix it for you plural form
|
||||
type PluralForm = Record<'one' | 'few' | 'many', string>;
|
||||
|
||||
type Join<K, P> = K extends string | number
|
||||
? P extends string | number
|
||||
? `${K}${'' extends P ? '' : '.'}${P}`
|
||||
: never
|
||||
: never;
|
||||
|
||||
type Prev = [never, 0, 1, 2, 3, 4, 5, ...Array<0>];
|
||||
```
|
20
content/Typescript/Type guards.md
Normal file
|
@ -0,0 +1,20 @@
|
|||
Useful for type checking at compile and run time:
|
||||
|
||||
```typescript
|
||||
function isFish(pet: Fish | Bird): pet is Fish {
|
||||
return (pet as Fish).swim !== undefined;
|
||||
}
|
||||
```
|
||||
|
||||
Usage:
|
||||
|
||||
```typescript
|
||||
const pet = getSmallPet();
|
||||
|
||||
if (isFish(pet)) {
|
||||
pet.swim();
|
||||
} else {
|
||||
pet.fly();
|
||||
}
|
||||
```
|
||||
|
3
custom.d.ts
vendored
|
@ -1,6 +1,3 @@
|
|||
import { decl } from "postcss";
|
||||
import { NitroAppPlugin, NitroApp } from "nitropack";
|
||||
|
||||
declare module "*.svg" {
|
||||
const content: string;
|
||||
export default content;
|
||||
|
|
|
@ -16,7 +16,7 @@ http {
|
|||
gzip_types text/plain application/xml application/javascript;
|
||||
|
||||
## All static files will be served directly.
|
||||
location ~* ^.+\.(?:cur|jpe?g|gif|htc|ico|png|xml|otf|ttf|eot|woff|woff2|svg)$ {
|
||||
location ~* ^.+\.(?:css|cur|js|jpe?g|gif|htc|ico|png|xml|otf|ttf|eot|woff|woff2|svg)$ {
|
||||
access_log off;
|
||||
expires 1d;
|
||||
add_header Cache-Control public;
|
||||
|
|
29
pages/bio.vue
Normal file
|
@ -0,0 +1,29 @@
|
|||
<template>
|
||||
<article :class="$style.content">
|
||||
<section :class="$style.section">
|
||||
<BioHeading />
|
||||
</section>
|
||||
|
||||
<section :class="$style.section">
|
||||
<BioSkills />
|
||||
</section>
|
||||
</article>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
definePageMeta({ layout: "content" });
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
.content {
|
||||
padding: 40px 0 0 0;
|
||||
}
|
||||
|
||||
.section {
|
||||
padding: 40px 0;
|
||||
|
||||
&:not(:last-child) {
|
||||
border-bottom: 2px solid var(--color-line);
|
||||
}
|
||||
}
|
||||
</style>
|
48
pages/index.vue
Normal file
|
@ -0,0 +1,48 @@
|
|||
<template>
|
||||
<NuxtLayout name="content">
|
||||
<main :class="$style.main">
|
||||
<HomeHeader />
|
||||
|
||||
<div :class="$style.reference">
|
||||
<h1>Cheatsheet</h1>
|
||||
|
||||
<div :class="$style.grid">
|
||||
<HomeContentList />
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</NuxtLayout>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
scrollToTop: true,
|
||||
head() {
|
||||
return {
|
||||
title: "Obsidian Garden",
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
definePageMeta({ layout: false });
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
@import "~~/assets/css/mixins";
|
||||
|
||||
.main {
|
||||
padding-top: 40px;
|
||||
|
||||
@include tablet {
|
||||
padding-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.reference {
|
||||
padding-top: 20px;
|
||||
}
|
||||
|
||||
.grid {
|
||||
margin: 40px 5px 0;
|
||||
}
|
||||
</style>
|
5
plugins/vue-mansonry-wall.ts
Normal file
|
@ -0,0 +1,5 @@
|
|||
import MasonryWall from "@yeger/vue-masonry-wall";
|
||||
|
||||
export default defineNuxtPlugin((nuxtApp) => {
|
||||
nuxtApp.vueApp.use(MasonryWall);
|
||||
});
|